Full Code of crystal-lang/crystal for AI

master f4c2f0ab510c cached
2517 files
16.3 MB
4.1M tokens
494 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,187K chars total). Download the full file to get everything.
Repository: crystal-lang/crystal
Branch: master
Commit: f4c2f0ab510c
Files: 2517
Total size: 16.3 MB

Directory structure:
gitextract_6d0b5p8f/

├── .ameba.yml
├── .circleci/
│   └── config.yml
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   ├── config.yml
│   │   ├── discussion.md
│   │   └── feature-request.md
│   ├── PULL_REQUEST_TEMPLATE/
│   │   └── pull_request_template.md
│   ├── actionlint.yaml
│   ├── renovate.json
│   ├── workflows/
│   │   ├── aarch64.yml
│   │   ├── backport.yml
│   │   ├── docs.yml
│   │   ├── forward-compatibility.yml
│   │   ├── interpreter.yml
│   │   ├── lint.yml
│   │   ├── linux.yml
│   │   ├── llvm.yml
│   │   ├── macos.yml
│   │   ├── mingw-w64-steps.yml
│   │   ├── mingw-w64.yml
│   │   ├── openssl.yml
│   │   ├── regex-engine.yml
│   │   ├── smoke.yml
│   │   ├── update-devenv.yml
│   │   ├── wasm32.yml
│   │   ├── win.yml
│   │   ├── win_build_portable.yml
│   │   └── xml.yml
│   └── zizmor.yml
├── .gitignore
├── .mailmap
├── .markdownlint.yaml
├── .markdownlintignore
├── .well-known/
│   └── funding-manifest-urls
├── Brewfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│   ├── Apache-2.0.txt
│   ├── MIT.txt
│   └── Swift-exception.txt
├── Makefile
├── Makefile.win
├── NOTICE.md
├── README.md
├── REUSE.toml
├── SECURITY.md
├── UPGRADING.md
├── _typos.toml
├── bin/
│   ├── check-compiler-flag
│   ├── ci
│   ├── crystal
│   ├── crystal.bat
│   └── crystal.ps1
├── devenv.nix
├── devenv.yaml
├── doc/
│   ├── changelogs/
│   │   ├── README.md
│   │   ├── pre-1.0.md
│   │   ├── v1.0.md
│   │   ├── v1.1.md
│   │   ├── v1.10.md
│   │   ├── v1.11.md
│   │   ├── v1.12.md
│   │   ├── v1.13.md
│   │   ├── v1.14.md
│   │   ├── v1.15.md
│   │   ├── v1.16.md
│   │   ├── v1.17.md
│   │   ├── v1.18.md
│   │   ├── v1.19.md
│   │   ├── v1.2.md
│   │   ├── v1.3.md
│   │   ├── v1.4.md
│   │   ├── v1.5.md
│   │   ├── v1.6.md
│   │   ├── v1.7.md
│   │   ├── v1.8.md
│   │   └── v1.9.md
│   └── man/
│       ├── crystal-build.adoc
│       ├── crystal-docs.adoc
│       ├── crystal-env.adoc
│       ├── crystal-eval.adoc
│       ├── crystal-init.adoc
│       ├── crystal-play.adoc
│       ├── crystal-run.adoc
│       ├── crystal-spec.adoc
│       ├── crystal-tool-dependencies.adoc
│       ├── crystal-tool-format.adoc
│       ├── crystal-tool-macro_code_coverage.adoc
│       ├── crystal-tool-unreachable.adoc
│       └── crystal.adoc
├── etc/
│   ├── completion.bash
│   ├── completion.fish
│   ├── completion.zsh
│   ├── gdb/
│   │   └── crystal_formatters.py
│   ├── lldb/
│   │   └── crystal_formatters.py
│   ├── msvc/
│   │   └── crystal.natvis
│   └── win-ci/
│       ├── build-ffi.ps1
│       ├── build-gc.ps1
│       ├── build-iconv.ps1
│       ├── build-llvm.ps1
│       ├── build-mpir.ps1
│       ├── build-openssl.ps1
│       ├── build-pcre.ps1
│       ├── build-pcre2.ps1
│       ├── build-xml2.ps1
│       ├── build-yaml.ps1
│       ├── build-z.ps1
│       ├── crystal.iss
│       ├── cygwin-build-iconv.sh
│       └── setup.ps1
├── lib/
│   └── .shards.info
├── man/
│   └── crystal.1
├── samples/
│   ├── 2048.cr
│   ├── Makefile
│   ├── Makefile.win
│   ├── binary-trees.cr
│   ├── brainfuck.cr
│   ├── channel_primes.cr
│   ├── channel_select.cr
│   ├── compiler/
│   │   ├── formatter_example.cr
│   │   ├── transformer_example.cr
│   │   └── visitor_example.cr
│   ├── conway.cr
│   ├── degree_days.cr
│   ├── egrep.cr
│   ├── fannkuch-redux.cr
│   ├── fibonacci.cr
│   ├── havlak.cr
│   ├── http_server.cr
│   ├── impl.cr
│   ├── llvm/
│   │   └── brainfuck.cr
│   ├── mandelbrot.cr
│   ├── mandelbrot2.cr
│   ├── matmul.cr
│   ├── meteor.cr
│   ├── mt_gc_test.cr
│   ├── nbodies.cr
│   ├── neural_net.cr
│   ├── noise.cr
│   ├── pig.cr
│   ├── pretty_json.cr
│   ├── quine.cr
│   ├── red_black_tree.cr
│   ├── sdl/
│   │   ├── fire.cr
│   │   ├── fire.txt
│   │   ├── raytracer.cr
│   │   ├── sdl/
│   │   │   ├── lib_sdl.cr
│   │   │   ├── sdl.cr
│   │   │   └── surface.cr
│   │   ├── tv.cr
│   │   └── tv.txt
│   ├── sieve.cr
│   ├── spectral-norm.cr
│   ├── sudoku.cr
│   ├── tcp_client.cr
│   ├── tcp_server.cr
│   ├── text_raytracer.cr
│   ├── tree.cr
│   └── wordcount.cr
├── scripts/
│   ├── docs-versions.sh
│   ├── generate_data.mk
│   ├── generate_glob_specs.sh
│   ├── generate_grapheme_break_specs.cr
│   ├── generate_grapheme_properties.cr
│   ├── generate_html_entities.cr
│   ├── generate_llvm_version_info.cr
│   ├── generate_object_properties.cr
│   ├── generate_ssl_server_defaults.cr
│   ├── generate_unicode_data.cr
│   ├── generate_windows_zone_names.cr
│   ├── git/
│   │   └── pre-commit
│   ├── github-changelog.cr
│   ├── grapheme_properties.ecr
│   ├── html_entities.ecr
│   ├── print_regex_config.cr
│   ├── release-update.sh
│   ├── test_ssl_server.cr
│   ├── unicode_data.ecr
│   ├── update-changelog.sh
│   ├── update-distribution-scripts.sh
│   ├── update-shards.sh
│   └── windows_zone_names.ecr
├── shard.yml
├── shell.nix
├── spec/
│   ├── all_spec.cr
│   ├── compiler/
│   │   ├── codegen/
│   │   │   ├── abi/
│   │   │   │   ├── aarch64_spec.cr
│   │   │   │   ├── arm_spec.cr
│   │   │   │   ├── avr_spec.cr
│   │   │   │   ├── x86_64_spec.cr
│   │   │   │   └── x86_spec.cr
│   │   │   ├── alias_spec.cr
│   │   │   ├── and_spec.cr
│   │   │   ├── array_literal_spec.cr
│   │   │   ├── asm_spec.cr
│   │   │   ├── automatic_cast_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── c_abi/
│   │   │   │   ├── c_abi_spec.cr
│   │   │   │   └── c_abi_x86_64_spec.cr
│   │   │   ├── c_enum_spec.cr
│   │   │   ├── c_struct_spec.cr
│   │   │   ├── c_union_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── cast_spec.cr
│   │   │   ├── class_spec.cr
│   │   │   ├── class_var_spec.cr
│   │   │   ├── closure_spec.cr
│   │   │   ├── const_spec.cr
│   │   │   ├── debug_spec.cr
│   │   │   ├── def_default_value_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── double_splat_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exception_spec.cr
│   │   │   ├── experimental_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── fun_spec.cr
│   │   │   ├── generic_class_spec.cr
│   │   │   ├── hash_literal_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── if_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── macro_spec.cr
│   │   │   ├── magic_constants_spec.cr
│   │   │   ├── method_missing_spec.cr
│   │   │   ├── module_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── named_args_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── new_spec.cr
│   │   │   ├── next_spec.cr
│   │   │   ├── nilable_cast_spec.cr
│   │   │   ├── no_return_spec.cr
│   │   │   ├── not_spec.cr
│   │   │   ├── offsetof_spec.cr
│   │   │   ├── op_assign_spec.cr
│   │   │   ├── or_spec.cr
│   │   │   ├── pointer_spec.cr
│   │   │   ├── previous_def_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── private_spec.cr
│   │   │   ├── proc_spec.cr
│   │   │   ├── regex_literal_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── return_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── splat_spec.cr
│   │   │   ├── ssa_spec.cr
│   │   │   ├── struct_spec.cr
│   │   │   ├── super_spec.cr
│   │   │   ├── target_spec.cr
│   │   │   ├── thread_local_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── type_declaration_spec.cr
│   │   │   ├── uninitialized_spec.cr
│   │   │   ├── union_type_spec.cr
│   │   │   ├── until_spec.cr
│   │   │   ├── var_spec.cr
│   │   │   ├── virtual_spec.cr
│   │   │   ├── void_spec.cr
│   │   │   ├── while_spec.cr
│   │   │   └── yield_with_scope_spec.cr
│   │   ├── compiler_spec.cr
│   │   ├── config_spec.cr
│   │   ├── crystal/
│   │   │   ├── commands/
│   │   │   │   └── clear_cache_spec.cr
│   │   │   ├── tools/
│   │   │   │   ├── context_spec.cr
│   │   │   │   ├── doc/
│   │   │   │   │   ├── directives_spec.cr
│   │   │   │   │   ├── doc_renderer_spec.cr
│   │   │   │   │   ├── generator_spec.cr
│   │   │   │   │   ├── macro_spec.cr
│   │   │   │   │   ├── method_spec.cr
│   │   │   │   │   ├── project_info_spec.cr
│   │   │   │   │   └── type_spec.cr
│   │   │   │   ├── doc_spec.cr
│   │   │   │   ├── expand_spec.cr
│   │   │   │   ├── flags_spec.cr
│   │   │   │   ├── format_spec.cr
│   │   │   │   ├── hierarchy_spec.cr
│   │   │   │   ├── implementations_spec.cr
│   │   │   │   ├── init_spec.cr
│   │   │   │   ├── macro_code_coverage_spec.cr
│   │   │   │   ├── playground_spec.cr
│   │   │   │   ├── repl_spec.cr
│   │   │   │   ├── table_print_spec.cr
│   │   │   │   └── unreachable_spec.cr
│   │   │   └── types_spec.cr
│   │   ├── crystal_path/
│   │   │   └── crystal_path_spec.cr
│   │   ├── data/
│   │   │   ├── args_test
│   │   │   ├── build
│   │   │   ├── compiler_sample
│   │   │   ├── crystal_path/
│   │   │   │   ├── foo.cr/
│   │   │   │   │   └── foo.cr
│   │   │   │   ├── other_test_files/
│   │   │   │   │   └── other_test_files.cr
│   │   │   │   ├── simple.cr
│   │   │   │   └── test_files/
│   │   │   │       ├── file_one.cr
│   │   │   │       ├── file_two.cr
│   │   │   │       ├── src/
│   │   │   │       │   ├── file_three.cr
│   │   │   │       │   ├── test_files/
│   │   │   │       │   │   ├── another/
│   │   │   │       │   │   │   └── another.cr
│   │   │   │       │   │   └── file_four.cr
│   │   │   │       │   ├── test_files.cr
│   │   │   │       │   └── yet_another/
│   │   │   │       │       └── yet_another.cr
│   │   │   │       └── test_folder/
│   │   │   │           ├── file_three.cr
│   │   │   │           ├── not_a_crystal_file.txt
│   │   │   │           └── test_folder.cr
│   │   │   ├── ffi/
│   │   │   │   └── sum.c
│   │   │   ├── interpreter/
│   │   │   │   └── sum.c
│   │   │   ├── loader/
│   │   │   │   ├── bar.c
│   │   │   │   ├── foo.c
│   │   │   │   └── foo2.c
│   │   │   └── visibility.h
│   │   ├── ffi/
│   │   │   └── ffi_spec.cr
│   │   ├── formatter/
│   │   │   └── formatter_spec.cr
│   │   ├── interpreter/
│   │   │   ├── autocast_spec.cr
│   │   │   ├── blocks_spec.cr
│   │   │   ├── bugs_spec.cr
│   │   │   ├── calls_spec.cr
│   │   │   ├── casts_spec.cr
│   │   │   ├── class_vars_spec.cr
│   │   │   ├── classes_spec.cr
│   │   │   ├── closures_spec.cr
│   │   │   ├── constants_spec.cr
│   │   │   ├── control_flow_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exceptions_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── integration_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── multidispatch_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── pointers_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── procs_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── structs_spec.cr
│   │   │   ├── symbol_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── typeof_spec.cr
│   │   │   ├── types_spec.cr
│   │   │   └── unions_spec.cr
│   │   ├── interpreter_spec.cr
│   │   ├── lexer/
│   │   │   ├── lexer_comment_spec.cr
│   │   │   ├── lexer_doc_spec.cr
│   │   │   ├── lexer_macro_spec.cr
│   │   │   ├── lexer_objects/
│   │   │   │   └── strings.cr
│   │   │   ├── lexer_spec.cr
│   │   │   ├── lexer_string_array_spec.cr
│   │   │   ├── lexer_string_spec.cr
│   │   │   └── location_spec.cr
│   │   ├── loader/
│   │   │   ├── msvc_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── unix_spec.cr
│   │   ├── macro/
│   │   │   ├── macro_expander_spec.cr
│   │   │   └── macro_methods_spec.cr
│   │   ├── normalize/
│   │   │   ├── and_spec.cr
│   │   │   ├── array_literal_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── chained_comparisons_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── expressions_spec.cr
│   │   │   ├── hash_literal_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── op_assign_spec.cr
│   │   │   ├── or_spec.cr
│   │   │   ├── proc_pointer_spec.cr
│   │   │   ├── range_literal_spec.cr
│   │   │   ├── regex_spec.cr
│   │   │   ├── return_next_break_spec.cr
│   │   │   ├── select_spec.cr
│   │   │   ├── string_interpolation_spec.cr
│   │   │   ├── unless_spec.cr
│   │   │   └── until_spec.cr
│   │   ├── parser/
│   │   │   ├── parser_doc_spec.cr
│   │   │   ├── parser_spec.cr
│   │   │   ├── to_s_spec.cr
│   │   │   └── warnings_spec.cr
│   │   ├── semantic/
│   │   │   ├── abstract_def_spec.cr
│   │   │   ├── alias_spec.cr
│   │   │   ├── annotation_spec.cr
│   │   │   ├── array_spec.cr
│   │   │   ├── automatic_cast_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── c_enum_spec.cr
│   │   │   ├── c_struct_spec.cr
│   │   │   ├── c_type_spec.cr
│   │   │   ├── c_union_spec.cr
│   │   │   ├── call_error_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── cast_spec.cr
│   │   │   ├── class_spec.cr
│   │   │   ├── class_var_spec.cr
│   │   │   ├── cleanup_spec.cr
│   │   │   ├── closure_spec.cr
│   │   │   ├── concrete_types_spec.cr
│   │   │   ├── const_spec.cr
│   │   │   ├── def_overload_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── did_you_mean_spec.cr
│   │   │   ├── doc_spec.cr
│   │   │   ├── double_splat_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exception_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── external_internal_spec.cr
│   │   │   ├── fun_spec.cr
│   │   │   ├── generic_class_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── if_spec.cr
│   │   │   ├── initialize_spec.cr
│   │   │   ├── instance_var_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── macro_overload_spec.cr
│   │   │   ├── macro_spec.cr
│   │   │   ├── metaclass_spec.cr
│   │   │   ├── method_missing_spec.cr
│   │   │   ├── module_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── named_args_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── new_spec.cr
│   │   │   ├── nil_spec.cr
│   │   │   ├── nilable_cast_spec.cr
│   │   │   ├── nilable_instance_var_spec.cr
│   │   │   ├── no_return_spec.cr
│   │   │   ├── not_spec.cr
│   │   │   ├── offsetof_spec.cr
│   │   │   ├── pointer_spec.cr
│   │   │   ├── previous_def_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── private_spec.cr
│   │   │   ├── proc_spec.cr
│   │   │   ├── recursive_struct_check_spec.cr
│   │   │   ├── reference_storage_spec.cr
│   │   │   ├── require_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── restrictions_augmenter_spec.cr
│   │   │   ├── restrictions_spec.cr
│   │   │   ├── return_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── splat_spec.cr
│   │   │   ├── ssa_spec.cr
│   │   │   ├── static_array_spec.cr
│   │   │   ├── struct_spec.cr
│   │   │   ├── super_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── uninitialized_spec.cr
│   │   │   ├── union_spec.cr
│   │   │   ├── var_spec.cr
│   │   │   ├── virtual_metaclass_spec.cr
│   │   │   ├── virtual_spec.cr
│   │   │   ├── visibility_modifiers_spec.cr
│   │   │   ├── warnings_spec.cr
│   │   │   ├── while_spec.cr
│   │   │   └── yield_with_scope_spec.cr
│   │   ├── spec_helper.cr
│   │   └── util_spec.cr
│   ├── compiler_spec.cr
│   ├── debug/
│   │   ├── arrays.cr
│   │   ├── blocks.cr
│   │   ├── driver.cr
│   │   ├── extern_unions.cr
│   │   ├── large_enums.cr
│   │   ├── strings.cr
│   │   ├── test.sh
│   │   └── top_level.cr
│   ├── generate_wasm32_spec.sh
│   ├── llvm-ir/
│   │   ├── argless-initialize-debug-loc.cr
│   │   ├── assign-unions.cr
│   │   ├── cast-unions.cr
│   │   ├── class-var-read-debug-loc.cr
│   │   ├── const-read-debug-loc.cr
│   │   ├── memcpy.cr
│   │   ├── memset.cr
│   │   ├── pass-closure-to-c-debug-loc.cr
│   │   ├── proc-call-debug-loc.cr
│   │   ├── proc-pointer-debug-loc.cr
│   │   ├── test.sh
│   │   ├── virtual-class-var-read-debug-loc.cr
│   │   └── virtual-metaclass-var-read-debug-loc.cr
│   ├── manual/
│   │   ├── badssl_spec.cr
│   │   ├── digest_large_file_spec.cr
│   │   ├── find_executable_spec.cr
│   │   ├── gzip_large_file_spec.cr
│   │   ├── hash_large_spec.cr
│   │   ├── https_client_spec.cr
│   │   ├── string_normalize_spec.cr
│   │   ├── string_to_f32_spec.cr
│   │   └── string_to_f_supplemental_spec.cr
│   ├── primitives/
│   │   ├── external_command_spec.cr
│   │   ├── float_spec.cr
│   │   ├── int_spec.cr
│   │   ├── pointer_spec.cr
│   │   ├── reference_spec.cr
│   │   ├── slice_spec.cr
│   │   └── struct_spec.cr
│   ├── primitives_spec.cr
│   ├── spec_helper.cr
│   ├── std/
│   │   ├── array_spec.cr
│   │   ├── atomic_spec.cr
│   │   ├── base64_spec.cr
│   │   ├── benchmark_spec.cr
│   │   ├── big/
│   │   │   ├── big_decimal_spec.cr
│   │   │   ├── big_float_spec.cr
│   │   │   ├── big_int_spec.cr
│   │   │   ├── big_rational_spec.cr
│   │   │   └── number_spec.cr
│   │   ├── bit_array_spec.cr
│   │   ├── bool_spec.cr
│   │   ├── box_spec.cr
│   │   ├── channel_spec.cr
│   │   ├── char/
│   │   │   └── reader_spec.cr
│   │   ├── char_spec.cr
│   │   ├── class_spec.cr
│   │   ├── colorize_spec.cr
│   │   ├── comparable_spec.cr
│   │   ├── complex_spec.cr
│   │   ├── compress/
│   │   │   ├── deflate/
│   │   │   │   └── deflate_spec.cr
│   │   │   ├── gzip/
│   │   │   │   └── gzip_spec.cr
│   │   │   ├── zip/
│   │   │   │   ├── zip_file_spec.cr
│   │   │   │   └── zip_spec.cr
│   │   │   └── zlib/
│   │   │       ├── reader_spec.cr
│   │   │       ├── stress_spec.cr
│   │   │       └── writer_spec.cr
│   │   ├── concurrent/
│   │   │   └── select_spec.cr
│   │   ├── concurrent_spec.cr
│   │   ├── crypto/
│   │   │   ├── bcrypt/
│   │   │   │   ├── base64_spec.cr
│   │   │   │   └── password_spec.cr
│   │   │   ├── bcrypt_spec.cr
│   │   │   ├── blowfish_spec.cr
│   │   │   └── subtle_spec.cr
│   │   ├── crystal/
│   │   │   ├── compiler_rt/
│   │   │   │   ├── ashlti3_spec.cr
│   │   │   │   ├── ashrti3_spec.cr
│   │   │   │   ├── divmod128_spec.cr
│   │   │   │   ├── fixint_spec.cr
│   │   │   │   ├── float_spec.cr
│   │   │   │   ├── lshrti3_spec.cr
│   │   │   │   ├── mulodi4_spec.cr
│   │   │   │   ├── mulosi4_spec.cr
│   │   │   │   ├── muloti4_spec.cr
│   │   │   │   ├── multi3_spec.cr
│   │   │   │   ├── powidf2_spec.cr
│   │   │   │   ├── powisf2_spec.cr
│   │   │   │   └── spec_helper.cr
│   │   │   ├── digest/
│   │   │   │   ├── md5_spec.cr
│   │   │   │   └── sha1_spec.cr
│   │   │   ├── event_loop/
│   │   │   │   ├── polling/
│   │   │   │   │   ├── arena_spec.cr
│   │   │   │   │   ├── poll_descriptor_spec.cr
│   │   │   │   │   └── waiters_spec.cr
│   │   │   │   └── timers_spec.cr
│   │   │   ├── fd_lock_spec.cr
│   │   │   ├── hasher_spec.cr
│   │   │   ├── pointer_linked_list_spec.cr
│   │   │   ├── pointer_pairing_heap_spec.cr
│   │   │   ├── syntax_highlighter/
│   │   │   │   ├── colorize_spec.cr
│   │   │   │   └── html_spec.cr
│   │   │   ├── system/
│   │   │   │   └── cpucount_spec.cr
│   │   │   └── system_spec.cr
│   │   ├── csv/
│   │   │   ├── csv_build_spec.cr
│   │   │   ├── csv_lex_spec.cr
│   │   │   ├── csv_parse_spec.cr
│   │   │   └── csv_spec.cr
│   │   ├── data/
│   │   │   ├── android_tzdata
│   │   │   ├── argf_test_file_1.txt
│   │   │   ├── argf_test_file_2.txt
│   │   │   ├── argf_test_file_3.xml
│   │   │   ├── backtrace_sample
│   │   │   ├── blank_test_file.txt
│   │   │   ├── cipher_spec.ciphertext
│   │   │   ├── collect_within_ensure
│   │   │   ├── crash_backtrace_sample
│   │   │   ├── dir/
│   │   │   │   ├── dots/
│   │   │   │   │   ├── .dot.hidden
│   │   │   │   │   └── .hidden/
│   │   │   │   │       └── f1.txt
│   │   │   │   ├── f1.txt
│   │   │   │   ├── f2.txt
│   │   │   │   ├── f3.txx
│   │   │   │   ├── g2.txt
│   │   │   │   ├── subdir/
│   │   │   │   │   ├── f1.txt
│   │   │   │   │   └── subdir2/
│   │   │   │   │       └── f2.txt
│   │   │   │   └── subdir2/
│   │   │   │       └── .gitkeep
│   │   │   ├── exception_backtrace_sample
│   │   │   ├── io_data_incomplete_multibyte_sequence.txt
│   │   │   ├── io_data_incomplete_multibyte_sequence_2.txt
│   │   │   ├── large_single_line_string.txt
│   │   │   ├── mime.types
│   │   │   ├── openssl/
│   │   │   │   ├── openssl.crt
│   │   │   │   └── openssl.key
│   │   │   ├── static_file_handler/
│   │   │   │   ├── empty.txt
│   │   │   │   ├── foo/
│   │   │   │   │   └── bar.txt
│   │   │   │   ├── range.txt
│   │   │   │   └── test.txt
│   │   │   ├── test_file.ini
│   │   │   ├── test_file.txt
│   │   │   ├── test_template.ecr
│   │   │   ├── test_template2.ecr
│   │   │   ├── test_template3.ecr
│   │   │   ├── test_template4.ecr
│   │   │   ├── test_template5.ecr
│   │   │   ├── test_template6.ecr
│   │   │   ├── test_template7.ecr
│   │   │   └── zoneinfo/
│   │   │       └── Foo/
│   │   │           ├── Bar
│   │   │           └── invalid
│   │   ├── deque_spec.cr
│   │   ├── digest/
│   │   │   ├── adler32_spec.cr
│   │   │   ├── crc32_spec.cr
│   │   │   ├── io_digest_spec.cr
│   │   │   ├── md5_spec.cr
│   │   │   ├── sha1_spec.cr
│   │   │   ├── sha256_spec.cr
│   │   │   ├── sha512_spec.cr
│   │   │   └── spec_helper.cr
│   │   ├── dir_spec.cr
│   │   ├── double_spec.cr
│   │   ├── ecr/
│   │   │   ├── ecr_lexer_spec.cr
│   │   │   └── ecr_spec.cr
│   │   ├── enum_spec.cr
│   │   ├── enumerable_spec.cr
│   │   ├── env_spec.cr
│   │   ├── errno_spec.cr
│   │   ├── exception/
│   │   │   └── call_stack_spec.cr
│   │   ├── exception_spec.cr
│   │   ├── fiber/
│   │   │   ├── execution_context/
│   │   │   │   ├── global_queue_spec.cr
│   │   │   │   ├── parallel_spec.cr
│   │   │   │   ├── runnables_spec.cr
│   │   │   │   └── spec_helper.cr
│   │   │   └── list_spec.cr
│   │   ├── fiber_spec.cr
│   │   ├── file/
│   │   │   ├── match-fast-glob_spec.cr
│   │   │   ├── match_spec.cr
│   │   │   └── tempfile_spec.cr
│   │   ├── file_spec.cr
│   │   ├── file_utils_spec.cr
│   │   ├── float_printer/
│   │   │   ├── diy_fp_spec.cr
│   │   │   ├── grisu3_spec.cr
│   │   │   ├── hexfloat_spec.cr
│   │   │   ├── ieee_spec.cr
│   │   │   ├── ryu_printf_spec.cr
│   │   │   ├── ryu_printf_test_cases.cr
│   │   │   └── shortest_spec.cr
│   │   ├── float_spec.cr
│   │   ├── gc_spec.cr
│   │   ├── hash_spec.cr
│   │   ├── html_spec.cr
│   │   ├── http/
│   │   │   ├── chunked_content_spec.cr
│   │   │   ├── client/
│   │   │   │   ├── client_spec.cr
│   │   │   │   └── response_spec.cr
│   │   │   ├── cookie_spec.cr
│   │   │   ├── cookies_spec.cr
│   │   │   ├── formdata/
│   │   │   │   ├── builder_spec.cr
│   │   │   │   └── parser_spec.cr
│   │   │   ├── formdata_spec.cr
│   │   │   ├── headers_spec.cr
│   │   │   ├── http_spec.cr
│   │   │   ├── params_spec.cr
│   │   │   ├── request_spec.cr
│   │   │   ├── server/
│   │   │   │   ├── handlers/
│   │   │   │   │   ├── compress_handler_spec.cr
│   │   │   │   │   ├── error_handler_spec.cr
│   │   │   │   │   ├── handler_spec.cr
│   │   │   │   │   ├── log_handler_spec.cr
│   │   │   │   │   ├── static_file_handler_spec.cr
│   │   │   │   │   └── websocket_handler_spec.cr
│   │   │   │   ├── request_processor_spec.cr
│   │   │   │   ├── response_spec.cr
│   │   │   │   └── server_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── status_spec.cr
│   │   │   └── web_socket_spec.cr
│   │   ├── humanize_spec.cr
│   │   ├── indexable/
│   │   │   └── mutable_spec.cr
│   │   ├── indexable_spec.cr
│   │   ├── ini_spec.cr
│   │   ├── int_spec.cr
│   │   ├── io/
│   │   │   ├── argf_spec.cr
│   │   │   ├── buffered_spec.cr
│   │   │   ├── byte_format_spec.cr
│   │   │   ├── delimited_spec.cr
│   │   │   ├── file_descriptor_spec.cr
│   │   │   ├── hexdump_spec.cr
│   │   │   ├── io_spec.cr
│   │   │   ├── memory_spec.cr
│   │   │   ├── multi_writer_spec.cr
│   │   │   ├── sized_spec.cr
│   │   │   └── stapled_spec.cr
│   │   ├── iterator_spec.cr
│   │   ├── json/
│   │   │   ├── any_spec.cr
│   │   │   ├── builder_spec.cr
│   │   │   ├── lexer_spec.cr
│   │   │   ├── parser_spec.cr
│   │   │   ├── pull_parser_spec.cr
│   │   │   ├── serializable_spec.cr
│   │   │   └── serialization_spec.cr
│   │   ├── kernel_spec.cr
│   │   ├── levenshtein_spec.cr
│   │   ├── llvm/
│   │   │   ├── llvm_spec.cr
│   │   │   └── type_spec.cr
│   │   ├── log/
│   │   │   ├── broadcast_backend_spec.cr
│   │   │   ├── builder_spec.cr
│   │   │   ├── context_spec.cr
│   │   │   ├── dispatch_spec.cr
│   │   │   ├── env_config_spec.cr
│   │   │   ├── format_spec.cr
│   │   │   ├── io_backend_spec.cr
│   │   │   ├── log_spec.cr
│   │   │   ├── main_spec.cr
│   │   │   ├── metadata_spec.cr
│   │   │   └── spec_spec.cr
│   │   ├── math_spec.cr
│   │   ├── mime/
│   │   │   ├── media_type_spec.cr
│   │   │   ├── multipart/
│   │   │   │   ├── builder_spec.cr
│   │   │   │   └── parser_spec.cr
│   │   │   └── multipart_spec.cr
│   │   ├── mime_spec.cr
│   │   ├── mutex_spec.cr
│   │   ├── named_tuple_spec.cr
│   │   ├── number_spec.cr
│   │   ├── oauth/
│   │   │   ├── access_token_spec.cr
│   │   │   ├── authorization_header_spec.cr
│   │   │   ├── consumer_spec.cr
│   │   │   ├── request_token_spec.cr
│   │   │   └── signature_spec.cr
│   │   ├── oauth2/
│   │   │   ├── access_token_spec.cr
│   │   │   ├── client_spec.cr
│   │   │   └── session_spec.cr
│   │   ├── object_spec.cr
│   │   ├── openssl/
│   │   │   ├── cipher_spec.cr
│   │   │   ├── digest_spec.cr
│   │   │   ├── hmac_spec.cr
│   │   │   ├── pkcs5_spec.cr
│   │   │   ├── ssl/
│   │   │   │   ├── context_spec.cr
│   │   │   │   ├── hostname_validation_spec.cr
│   │   │   │   ├── server_spec.cr
│   │   │   │   └── socket_spec.cr
│   │   │   └── x509/
│   │   │       ├── certificate_spec.cr
│   │   │       └── name_spec.cr
│   │   ├── option_parser_spec.cr
│   │   ├── path_spec.cr
│   │   ├── pointer/
│   │   │   └── appender_spec.cr
│   │   ├── pointer_spec.cr
│   │   ├── pp_spec.cr
│   │   ├── pretty_print_spec.cr
│   │   ├── proc_spec.cr
│   │   ├── process/
│   │   │   ├── exit_reason_spec.cr
│   │   │   ├── find_executable_spec.cr
│   │   │   ├── status_spec.cr
│   │   │   └── utils_spec.cr
│   │   ├── process_spec.cr
│   │   ├── raise_spec.cr
│   │   ├── random/
│   │   │   ├── isaac_spec.cr
│   │   │   ├── pcg32_spec.cr
│   │   │   └── secure_spec.cr
│   │   ├── random_spec.cr
│   │   ├── range_spec.cr
│   │   ├── record_spec.cr
│   │   ├── reference_spec.cr
│   │   ├── regex/
│   │   │   └── match_data_spec.cr
│   │   ├── regex_spec.cr
│   │   ├── semantic_version_spec.cr
│   │   ├── set_spec.cr
│   │   ├── signal_spec.cr
│   │   ├── slice_spec.cr
│   │   ├── socket/
│   │   │   ├── address_spec.cr
│   │   │   ├── addrinfo_spec.cr
│   │   │   ├── socket_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── tcp_server_spec.cr
│   │   │   ├── tcp_socket_spec.cr
│   │   │   ├── udp_socket_spec.cr
│   │   │   ├── unix_server_spec.cr
│   │   │   └── unix_socket_spec.cr
│   │   ├── spec/
│   │   │   ├── context_spec.cr
│   │   │   ├── expectations_spec.cr
│   │   │   ├── filters_spec.cr
│   │   │   ├── helpers/
│   │   │   │   └── iterate_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── junit_formatter_spec.cr
│   │   │   ├── list_tags_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── tap_formatter_spec.cr
│   │   ├── spec_helper.cr
│   │   ├── spec_spec.cr
│   │   ├── sprintf_spec.cr
│   │   ├── static_array_spec.cr
│   │   ├── string/
│   │   │   ├── grapheme_break_spec.cr
│   │   │   ├── grapheme_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── utf16_spec.cr
│   │   ├── string_builder_spec.cr
│   │   ├── string_pool_spec.cr
│   │   ├── string_scanner_spec.cr
│   │   ├── string_spec.cr
│   │   ├── struct_spec.cr
│   │   ├── symbol_spec.cr
│   │   ├── sync/
│   │   │   ├── condition_variable_spec.cr
│   │   │   ├── exclusive_spec.cr
│   │   │   ├── mutex_spec.cr
│   │   │   ├── rw_lock_spec.cr
│   │   │   ├── shared_spec.cr
│   │   │   └── spec_helper.cr
│   │   ├── syscall_spec.cr
│   │   ├── system/
│   │   │   ├── group_spec.cr
│   │   │   └── user_spec.cr
│   │   ├── system_error_spec.cr
│   │   ├── system_spec.cr
│   │   ├── thread/
│   │   │   ├── condition_variable_spec.cr
│   │   │   └── mutex_spec.cr
│   │   ├── thread_spec.cr
│   │   ├── time/
│   │   │   ├── custom_formats_spec.cr
│   │   │   ├── format_spec.cr
│   │   │   ├── instant_spec.cr
│   │   │   ├── location_spec.cr
│   │   │   ├── span_spec.cr
│   │   │   └── time_spec.cr
│   │   ├── tuple_spec.cr
│   │   ├── uint_spec.cr
│   │   ├── uri/
│   │   │   ├── json_spec.cr
│   │   │   ├── params/
│   │   │   │   ├── from_www_form_spec.cr
│   │   │   │   ├── serializable_spec.cr
│   │   │   │   └── to_www_form_spec.cr
│   │   │   ├── params_spec.cr
│   │   │   └── punycode_spec.cr
│   │   ├── uri_spec.cr
│   │   ├── uuid/
│   │   │   ├── json_spec.cr
│   │   │   └── yaml_spec.cr
│   │   ├── uuid_spec.cr
│   │   ├── va_list_spec.cr
│   │   ├── wait_group_spec.cr
│   │   ├── weak_ref_spec.cr
│   │   ├── winerror_spec.cr
│   │   ├── xml/
│   │   │   ├── builder_spec.cr
│   │   │   ├── html_spec.cr
│   │   │   ├── reader_spec.cr
│   │   │   ├── xml_spec.cr
│   │   │   └── xpath_spec.cr
│   │   └── yaml/
│   │       ├── any_spec.cr
│   │       ├── builder_spec.cr
│   │       ├── nodes/
│   │       │   ├── builder_spec.cr
│   │       │   └── parser_spec.cr
│   │       ├── schema/
│   │       │   ├── core_spec.cr
│   │       │   └── fail_safe_spec.cr
│   │       ├── serializable_spec.cr
│   │       ├── serialization_spec.cr
│   │       ├── yaml_pull_parser_spec.cr
│   │       └── yaml_spec.cr
│   ├── std_spec.cr
│   ├── support/
│   │   ├── channel.cr
│   │   ├── env.cr
│   │   ├── fibers.cr
│   │   ├── finalize.cr
│   │   ├── interpreted.cr
│   │   ├── io.cr
│   │   ├── mt_abort_timeout.cr
│   │   ├── number.cr
│   │   ├── retry.cr
│   │   ├── ssl.cr
│   │   ├── string.cr
│   │   ├── syntax.cr
│   │   ├── tempfile.cr
│   │   ├── thread.cr
│   │   ├── time.cr
│   │   ├── wait_for.cr
│   │   ├── wasm32.cr
│   │   └── win32.cr
│   ├── syntax_spec.cr
│   └── wasm32_std_spec.cr
└── src/
    ├── VERSION
    ├── annotations.cr
    ├── array.cr
    ├── atomic.cr
    ├── base64.cr
    ├── benchmark/
    │   ├── bm.cr
    │   └── ips.cr
    ├── benchmark.cr
    ├── big/
    │   ├── big_decimal.cr
    │   ├── big_float.cr
    │   ├── big_int.cr
    │   ├── big_rational.cr
    │   ├── json.cr
    │   ├── lib_gmp.cr
    │   ├── number.cr
    │   └── yaml.cr
    ├── big.cr
    ├── bit_array.cr
    ├── bool.cr
    ├── box.cr
    ├── channel/
    │   ├── select/
    │   │   ├── select_action.cr
    │   │   └── timeout_action.cr
    │   └── select.cr
    ├── channel.cr
    ├── char/
    │   └── reader.cr
    ├── char.cr
    ├── class.cr
    ├── colorize.cr
    ├── comparable.cr
    ├── compiler/
    │   ├── crystal/
    │   │   ├── annotatable.cr
    │   │   ├── codegen/
    │   │   │   ├── abi/
    │   │   │   │   ├── aarch64.cr
    │   │   │   │   ├── arm.cr
    │   │   │   │   ├── avr.cr
    │   │   │   │   ├── wasm32.cr
    │   │   │   │   ├── x86.cr
    │   │   │   │   ├── x86_64.cr
    │   │   │   │   └── x86_win64.cr
    │   │   │   ├── abi.cr
    │   │   │   ├── asm.cr
    │   │   │   ├── ast.cr
    │   │   │   ├── cache_dir.cr
    │   │   │   ├── call.cr
    │   │   │   ├── cast.cr
    │   │   │   ├── class_var.cr
    │   │   │   ├── codegen.cr
    │   │   │   ├── cond.cr
    │   │   │   ├── const.cr
    │   │   │   ├── context.cr
    │   │   │   ├── crystal_llvm_builder.cr
    │   │   │   ├── debug.cr
    │   │   │   ├── dump_type_info.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── experimental.cr
    │   │   │   ├── fun.cr
    │   │   │   ├── link.cr
    │   │   │   ├── llvm_builder_helper.cr
    │   │   │   ├── llvm_id.cr
    │   │   │   ├── llvm_typer.cr
    │   │   │   ├── match.cr
    │   │   │   ├── once.cr
    │   │   │   ├── phi.cr
    │   │   │   ├── primitives.cr
    │   │   │   ├── target.cr
    │   │   │   ├── type_id.cr
    │   │   │   ├── types.cr
    │   │   │   └── unions.cr
    │   │   ├── command/
    │   │   │   ├── clear_cache.cr
    │   │   │   ├── cursor.cr
    │   │   │   ├── docs.cr
    │   │   │   ├── env.cr
    │   │   │   ├── eval.cr
    │   │   │   ├── format.cr
    │   │   │   ├── playground.cr
    │   │   │   ├── repl.cr
    │   │   │   └── spec.cr
    │   │   ├── command.cr
    │   │   ├── compiler.cr
    │   │   ├── config.cr
    │   │   ├── crystal_path.cr
    │   │   ├── error.cr
    │   │   ├── exception.cr
    │   │   ├── ffi/
    │   │   │   ├── call_interface.cr
    │   │   │   ├── closure.cr
    │   │   │   ├── ffi.cr
    │   │   │   ├── lib_ffi.cr
    │   │   │   └── type.cr
    │   │   ├── formatter.cr
    │   │   ├── interpreter/
    │   │   │   ├── c.cr
    │   │   │   ├── cast.cr
    │   │   │   ├── class_vars.cr
    │   │   │   ├── closure.cr
    │   │   │   ├── closure_context.cr
    │   │   │   ├── compiled_block.cr
    │   │   │   ├── compiled_def.cr
    │   │   │   ├── compiled_instructions.cr
    │   │   │   ├── compiler.cr
    │   │   │   ├── constants.cr
    │   │   │   ├── context.cr
    │   │   │   ├── debug.cr
    │   │   │   ├── disassembler.cr
    │   │   │   ├── escaping_exception.cr
    │   │   │   ├── ffi_closure_context.cr
    │   │   │   ├── instruction.cr
    │   │   │   ├── instructions.cr
    │   │   │   ├── interpreter.cr
    │   │   │   ├── lib_function.cr
    │   │   │   ├── local_vars.cr
    │   │   │   ├── local_vars_gatherer.cr
    │   │   │   ├── multidispatch.cr
    │   │   │   ├── op_code.cr
    │   │   │   ├── primitives.cr
    │   │   │   ├── pry_reader.cr
    │   │   │   ├── repl.cr
    │   │   │   ├── repl_reader.cr
    │   │   │   ├── to_bool.cr
    │   │   │   └── value.cr
    │   │   ├── interpreter.cr
    │   │   ├── loader/
    │   │   │   ├── mingw.cr
    │   │   │   ├── msvc.cr
    │   │   │   └── unix.cr
    │   │   ├── loader.cr
    │   │   ├── macros/
    │   │   │   ├── interpreter.cr
    │   │   │   ├── macros.cr
    │   │   │   ├── methods.cr
    │   │   │   └── types.cr
    │   │   ├── macros.cr
    │   │   ├── program.cr
    │   │   ├── progress_tracker.cr
    │   │   ├── semantic/
    │   │   │   ├── abstract_def_checker.cr
    │   │   │   ├── ast.cr
    │   │   │   ├── bindings.cr
    │   │   │   ├── call.cr
    │   │   │   ├── call_error.cr
    │   │   │   ├── class_vars_initializer_visitor.cr
    │   │   │   ├── cleanup_transformer.cr
    │   │   │   ├── conversions.cr
    │   │   │   ├── cover.cr
    │   │   │   ├── default_arguments.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── exhaustiveness_checker.cr
    │   │   │   ├── filters.cr
    │   │   │   ├── fix_missing_types.cr
    │   │   │   ├── flags.cr
    │   │   │   ├── hooks.cr
    │   │   │   ├── instance_vars_initializer_visitor.cr
    │   │   │   ├── lib.cr
    │   │   │   ├── literal_expander.cr
    │   │   │   ├── main_visitor.cr
    │   │   │   ├── match.cr
    │   │   │   ├── math_interpreter.cr
    │   │   │   ├── method_lookup.cr
    │   │   │   ├── method_missing.cr
    │   │   │   ├── new.cr
    │   │   │   ├── normalizer.cr
    │   │   │   ├── path_lookup.cr
    │   │   │   ├── recursive_struct_checker.cr
    │   │   │   ├── restrictions.cr
    │   │   │   ├── restrictions_augmenter.cr
    │   │   │   ├── semantic_visitor.cr
    │   │   │   ├── suggestions.cr
    │   │   │   ├── to_s.cr
    │   │   │   ├── top_level_visitor.cr
    │   │   │   ├── transformer.cr
    │   │   │   ├── type_declaration_processor.cr
    │   │   │   ├── type_declaration_visitor.cr
    │   │   │   ├── type_guess_visitor.cr
    │   │   │   ├── type_intersect.cr
    │   │   │   ├── type_lookup.cr
    │   │   │   ├── type_merge.cr
    │   │   │   ├── type_to_restriction.cr
    │   │   │   └── warnings.cr
    │   │   ├── semantic.cr
    │   │   ├── syntax/
    │   │   │   ├── ast.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── lexer.cr
    │   │   │   ├── location.cr
    │   │   │   ├── parser.cr
    │   │   │   ├── to_s.cr
    │   │   │   ├── token.cr
    │   │   │   ├── transformer.cr
    │   │   │   ├── virtual_file.cr
    │   │   │   └── visitor.cr
    │   │   ├── syntax.cr
    │   │   ├── tools/
    │   │   │   ├── context.cr
    │   │   │   ├── dependencies.cr
    │   │   │   ├── doc/
    │   │   │   │   ├── constant.cr
    │   │   │   │   ├── generator.cr
    │   │   │   │   ├── html/
    │   │   │   │   │   ├── 404.html
    │   │   │   │   │   ├── _head.html
    │   │   │   │   │   ├── _list_items.html
    │   │   │   │   │   ├── _macros_inherited.html
    │   │   │   │   │   ├── _method_detail.html
    │   │   │   │   │   ├── _method_summary.html
    │   │   │   │   │   ├── _methods_inherited.html
    │   │   │   │   │   ├── _other_types.html
    │   │   │   │   │   ├── _sidebar.html
    │   │   │   │   │   ├── css/
    │   │   │   │   │   │   └── style.css
    │   │   │   │   │   ├── js/
    │   │   │   │   │   │   ├── _navigator.js
    │   │   │   │   │   │   ├── _search.js
    │   │   │   │   │   │   ├── _usage-modal.js
    │   │   │   │   │   │   ├── _versions.js
    │   │   │   │   │   │   └── doc.js
    │   │   │   │   │   ├── main.html
    │   │   │   │   │   ├── sitemap.xml
    │   │   │   │   │   └── type.html
    │   │   │   │   ├── item.cr
    │   │   │   │   ├── macro.cr
    │   │   │   │   ├── main.cr
    │   │   │   │   ├── markd_doc_renderer.cr
    │   │   │   │   ├── method.cr
    │   │   │   │   ├── project_info.cr
    │   │   │   │   ├── relative_location.cr
    │   │   │   │   ├── templates.cr
    │   │   │   │   ├── to_json.cr
    │   │   │   │   └── type.cr
    │   │   │   ├── doc.cr
    │   │   │   ├── expand.cr
    │   │   │   ├── flags.cr
    │   │   │   ├── formatter.cr
    │   │   │   ├── git.cr
    │   │   │   ├── implementations.cr
    │   │   │   ├── init/
    │   │   │   │   └── template/
    │   │   │   │       ├── editorconfig.ecr
    │   │   │   │       ├── example.cr.ecr
    │   │   │   │       ├── example_spec.cr.ecr
    │   │   │   │       ├── gitignore.ecr
    │   │   │   │       ├── license.ecr
    │   │   │   │       ├── readme.md.ecr
    │   │   │   │       ├── shard.yml.ecr
    │   │   │   │       └── spec_helper.cr.ecr
    │   │   │   ├── init.cr
    │   │   │   ├── macro_code_coverage.cr
    │   │   │   ├── playground/
    │   │   │   │   ├── agent.cr
    │   │   │   │   ├── agent_instrumentor_transformer.cr
    │   │   │   │   ├── public/
    │   │   │   │   │   ├── application.css
    │   │   │   │   │   ├── application.js
    │   │   │   │   │   ├── session.js
    │   │   │   │   │   ├── settings.js
    │   │   │   │   │   └── vendor/
    │   │   │   │   │       ├── REUSE.toml
    │   │   │   │   │       ├── ansi_up-1.3.0/
    │   │   │   │   │       │   ├── ansi_up.js
    │   │   │   │   │       │   └── theme.css
    │   │   │   │   │       ├── codemirror-5.38.0/
    │   │   │   │   │       │   ├── addon/
    │   │   │   │   │       │   │   └── comment/
    │   │   │   │   │       │   │       └── comment.js
    │   │   │   │   │       │   ├── lib/
    │   │   │   │   │       │   │   ├── codemirror.css
    │   │   │   │   │       │   │   └── codemirror.js
    │   │   │   │   │       │   ├── mode/
    │   │   │   │   │       │   │   └── crystal/
    │   │   │   │   │       │   │       └── crystal.js
    │   │   │   │   │       │   └── theme/
    │   │   │   │   │       │       └── neat.css
    │   │   │   │   │       └── octicons-19.5.0/
    │   │   │   │   │           └── octicons.css
    │   │   │   │   ├── server.cr
    │   │   │   │   └── views/
    │   │   │   │       ├── _about.html
    │   │   │   │       ├── _index.html
    │   │   │   │       ├── _settings.html
    │   │   │   │       ├── _workbook.html.ecr
    │   │   │   │       └── layout.html.ecr
    │   │   │   ├── playground.cr
    │   │   │   ├── print_hierarchy.cr
    │   │   │   ├── print_types_visitor.cr
    │   │   │   ├── table_print.cr
    │   │   │   ├── typed_def_processor.cr
    │   │   │   └── unreachable.cr
    │   │   ├── types.cr
    │   │   ├── util.cr
    │   │   └── warnings.cr
    │   ├── crystal.cr
    │   └── requires.cr
    ├── complex.cr
    ├── compress/
    │   ├── deflate/
    │   │   ├── deflate.cr
    │   │   ├── reader.cr
    │   │   └── writer.cr
    │   ├── gzip/
    │   │   ├── gzip.cr
    │   │   ├── header.cr
    │   │   ├── reader.cr
    │   │   └── writer.cr
    │   ├── zip/
    │   │   ├── checksum_reader.cr
    │   │   ├── checksum_writer.cr
    │   │   ├── compression_method.cr
    │   │   ├── file.cr
    │   │   ├── file_info.cr
    │   │   ├── reader.cr
    │   │   ├── writer.cr
    │   │   └── zip.cr
    │   └── zlib/
    │       ├── reader.cr
    │       ├── writer.cr
    │       └── zlib.cr
    ├── concurrent.cr
    ├── crypto/
    │   ├── bcrypt/
    │   │   ├── base64.cr
    │   │   ├── blowfish.cr
    │   │   └── password.cr
    │   ├── bcrypt.cr
    │   ├── blowfish.cr
    │   └── subtle.cr
    ├── crystal/
    │   ├── at_exit_handlers.cr
    │   ├── atomic_semaphore.cr
    │   ├── compiler_rt/
    │   │   ├── divmod128.cr
    │   │   ├── fixint.cr
    │   │   ├── float.cr
    │   │   ├── mul.cr
    │   │   ├── multi3.cr
    │   │   ├── pow.cr
    │   │   └── shift.cr
    │   ├── compiler_rt.cr
    │   ├── datum.cr
    │   ├── digest/
    │   │   ├── md5.cr
    │   │   └── sha1.cr
    │   ├── dwarf/
    │   │   ├── abbrev.cr
    │   │   ├── info.cr
    │   │   ├── line_numbers.cr
    │   │   └── strings.cr
    │   ├── dwarf.cr
    │   ├── elf.cr
    │   ├── event_loop/
    │   │   ├── epoll.cr
    │   │   ├── file_descriptor.cr
    │   │   ├── iocp/
    │   │   │   ├── fiber_event.cr
    │   │   │   └── timer.cr
    │   │   ├── iocp.cr
    │   │   ├── kqueue.cr
    │   │   ├── libevent/
    │   │   │   ├── event.cr
    │   │   │   └── lib_event2.cr
    │   │   ├── libevent.cr
    │   │   ├── lock.cr
    │   │   ├── polling/
    │   │   │   ├── arena.cr
    │   │   │   ├── event.cr
    │   │   │   ├── fiber_event.cr
    │   │   │   ├── poll_descriptor.cr
    │   │   │   └── waiters.cr
    │   │   ├── polling.cr
    │   │   ├── socket.cr
    │   │   ├── timers.cr
    │   │   └── wasi.cr
    │   ├── event_loop.cr
    │   ├── fd_lock.cr
    │   ├── hasher.cr
    │   ├── iconv.cr
    │   ├── interpreter.cr
    │   ├── lib_iconv.cr
    │   ├── mach_o.cr
    │   ├── main.cr
    │   ├── once.cr
    │   ├── pe.cr
    │   ├── pointer_linked_list.cr
    │   ├── pointer_pairing_heap.cr
    │   ├── print_buffered.cr
    │   ├── rw_lock.cr
    │   ├── scheduler.cr
    │   ├── small_deque.cr
    │   ├── spin_lock.cr
    │   ├── syntax_highlighter/
    │   │   ├── colorize.cr
    │   │   └── html.cr
    │   ├── syntax_highlighter.cr
    │   ├── system/
    │   │   ├── addrinfo.cr
    │   │   ├── dir.cr
    │   │   ├── env.cr
    │   │   ├── fiber.cr
    │   │   ├── file.cr
    │   │   ├── file_descriptor.cr
    │   │   ├── file_info.cr
    │   │   ├── group.cr
    │   │   ├── mime.cr
    │   │   ├── panic.cr
    │   │   ├── path.cr
    │   │   ├── print_error.cr
    │   │   ├── process.cr
    │   │   ├── random.cr
    │   │   ├── signal.cr
    │   │   ├── socket.cr
    │   │   ├── thread.cr
    │   │   ├── thread_condition_variable.cr
    │   │   ├── thread_linked_list.cr
    │   │   ├── thread_mutex.cr
    │   │   ├── thread_wait_group.cr
    │   │   ├── time.cr
    │   │   ├── unix/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── arc4random.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── env.cr
    │   │   │   ├── epoll.cr
    │   │   │   ├── eventfd.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── file_info.cr
    │   │   │   ├── getrandom.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── kqueue.cr
    │   │   │   ├── linux_cpucount.cr
    │   │   │   ├── main.cr
    │   │   │   ├── mime.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── pthread.cr
    │   │   │   ├── pthread_condition_variable.cr
    │   │   │   ├── pthread_mutex.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── spawn.cr
    │   │   │   ├── syscall.cr
    │   │   │   ├── sysconf_cpucount.cr
    │   │   │   ├── sysctl_cpucount.cr
    │   │   │   ├── time.cr
    │   │   │   ├── timerfd.cr
    │   │   │   ├── urandom.cr
    │   │   │   └── user.cr
    │   │   ├── unix.cr
    │   │   ├── user.cr
    │   │   ├── wasi/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── cpucount.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── lib_wasi.cr
    │   │   │   ├── main.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── random.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── thread.cr
    │   │   │   ├── thread_condition_variable.cr
    │   │   │   ├── thread_mutex.cr
    │   │   │   ├── user.cr
    │   │   │   └── wasi.cr
    │   │   ├── win32/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── addrinfo_win7.cr
    │   │   │   ├── cpucount.cr
    │   │   │   ├── crypto.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── env.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── file_info.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── iocp.cr
    │   │   │   ├── library_archive.cr
    │   │   │   ├── mime.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── random.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── thread.cr
    │   │   │   ├── thread_condition_variable.cr
    │   │   │   ├── thread_mutex.cr
    │   │   │   ├── time.cr
    │   │   │   ├── user.cr
    │   │   │   ├── visual_studio.cr
    │   │   │   ├── waitable_timer.cr
    │   │   │   ├── windows_registry.cr
    │   │   │   ├── windows_sdk.cr
    │   │   │   ├── wmain.cr
    │   │   │   └── zone_names.cr
    │   │   └── windows.cr
    │   ├── system.cr
    │   ├── thread_local_value.cr
    │   ├── tracing.cr
    │   └── value_with_finalizer.cr
    ├── csv/
    │   ├── builder.cr
    │   ├── error.cr
    │   ├── lexer/
    │   │   ├── io_based.cr
    │   │   └── string_based.cr
    │   ├── lexer.cr
    │   ├── parser.cr
    │   └── token.cr
    ├── csv.cr
    ├── deque.cr
    ├── digest/
    │   ├── adler32.cr
    │   ├── crc32.cr
    │   ├── digest.cr
    │   ├── io_digest.cr
    │   ├── md5.cr
    │   ├── sha1.cr
    │   ├── sha256.cr
    │   └── sha512.cr
    ├── digest.cr
    ├── dir/
    │   └── glob.cr
    ├── dir.cr
    ├── docs_main.cr
    ├── docs_pseudo_methods.cr
    ├── ecr/
    │   ├── lexer.cr
    │   ├── macros.cr
    │   ├── process.cr
    │   └── processor.cr
    ├── ecr.cr
    ├── empty.cr
    ├── enum.cr
    ├── enumerable.cr
    ├── env.cr
    ├── errno.cr
    ├── exception/
    │   ├── call_stack/
    │   │   ├── dwarf.cr
    │   │   ├── elf.cr
    │   │   ├── interpreter.cr
    │   │   ├── libunwind.cr
    │   │   ├── mach_o.cr
    │   │   ├── null.cr
    │   │   └── stackwalk.cr
    │   ├── call_stack.cr
    │   └── lib_unwind.cr
    ├── exception.cr
    ├── fiber/
    │   ├── context/
    │   │   ├── aarch64-generic.cr
    │   │   ├── aarch64-microsoft.cr
    │   │   ├── arm.cr
    │   │   ├── i386.cr
    │   │   ├── interpreted.cr
    │   │   ├── wasm32.cr
    │   │   ├── x86_64-microsoft.cr
    │   │   └── x86_64-sysv.cr
    │   ├── context.cr
    │   ├── execution_context/
    │   │   ├── concurrent.cr
    │   │   ├── global_queue.cr
    │   │   ├── isolated.cr
    │   │   ├── monitor.cr
    │   │   ├── parallel/
    │   │   │   └── scheduler.cr
    │   │   ├── parallel.cr
    │   │   ├── runnables.cr
    │   │   ├── scheduler.cr
    │   │   └── thread_pool.cr
    │   ├── execution_context.cr
    │   ├── list.cr
    │   ├── pointer_linked_list_node.cr
    │   ├── stack.cr
    │   └── stack_pool.cr
    ├── fiber.cr
    ├── file/
    │   ├── error.cr
    │   ├── info.cr
    │   ├── match.cr
    │   ├── preader.cr
    │   └── tempfile.cr
    ├── file.cr
    ├── file_utils.cr
    ├── float/
    │   ├── fast_float/
    │   │   ├── ascii_number.cr
    │   │   ├── bigint.cr
    │   │   ├── decimal_to_binary.cr
    │   │   ├── digit_comparison.cr
    │   │   ├── fast_table.cr
    │   │   ├── fast_table_slice_literal.cr
    │   │   ├── float_common.cr
    │   │   └── parse_number.cr
    │   ├── fast_float.cr
    │   ├── printer/
    │   │   ├── cached_powers.cr
    │   │   ├── diy_fp.cr
    │   │   ├── dragonbox.cr
    │   │   ├── dragonbox_cache.cr
    │   │   ├── grisu3.cr
    │   │   ├── hexfloat.cr
    │   │   ├── ieee.cr
    │   │   ├── ryu_printf.cr
    │   │   └── ryu_printf_table.cr
    │   └── printer.cr
    ├── float.cr
    ├── gc/
    │   ├── boehm.cr
    │   └── none.cr
    ├── gc.cr
    ├── hash.cr
    ├── html/
    │   └── entities.cr
    ├── html.cr
    ├── http/
    │   ├── client/
    │   │   └── response.cr
    │   ├── client.cr
    │   ├── common.cr
    │   ├── content.cr
    │   ├── cookie.cr
    │   ├── cookies.cr
    │   ├── formdata/
    │   │   ├── builder.cr
    │   │   ├── parser.cr
    │   │   └── part.cr
    │   ├── formdata.cr
    │   ├── headers.cr
    │   ├── log.cr
    │   ├── params.cr
    │   ├── request.cr
    │   ├── server/
    │   │   ├── context.cr
    │   │   ├── handler.cr
    │   │   ├── handlers/
    │   │   │   ├── compress_handler.cr
    │   │   │   ├── error_handler.cr
    │   │   │   ├── log_handler.cr
    │   │   │   ├── static_file_handler.cr
    │   │   │   ├── static_file_handler.html
    │   │   │   └── websocket_handler.cr
    │   │   ├── request_processor.cr
    │   │   └── response.cr
    │   ├── server.cr
    │   ├── status.cr
    │   ├── web_socket/
    │   │   ├── close_code.cr
    │   │   └── protocol.cr
    │   └── web_socket.cr
    ├── http.cr
    ├── humanize.cr
    ├── indexable/
    │   └── mutable.cr
    ├── indexable.cr
    ├── ini.cr
    ├── int.cr
    ├── intrinsics.cr
    ├── io/
    │   ├── argf.cr
    │   ├── buffered.cr
    │   ├── byte_format.cr
    │   ├── console.cr
    │   ├── delimited.cr
    │   ├── encoding.cr
    │   ├── encoding_stubs.cr
    │   ├── error.cr
    │   ├── evented.cr
    │   ├── file_descriptor.cr
    │   ├── hexdump.cr
    │   ├── memory.cr
    │   ├── multi_writer.cr
    │   ├── sized.cr
    │   └── stapled.cr
    ├── io.cr
    ├── iterable.cr
    ├── iterator.cr
    ├── json/
    │   ├── any.cr
    │   ├── builder.cr
    │   ├── from_json.cr
    │   ├── lexer/
    │   │   ├── io_based.cr
    │   │   └── string_based.cr
    │   ├── lexer.cr
    │   ├── parser.cr
    │   ├── pull_parser.cr
    │   ├── serialization.cr
    │   ├── to_json.cr
    │   └── token.cr
    ├── json.cr
    ├── kernel.cr
    ├── levenshtein.cr
    ├── lib_c/
    │   ├── aarch64-darwin/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-android/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── ioctl.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── syscall.cr
    │   │       │   ├── system_properties.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── arm-linux-gnueabihf/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── i386-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── i386-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── linux/
    │   │   └── tls.cr
    │   ├── wasm32-wasi/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── iconv.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── sched.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── file.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── times.cr
    │   │       │   └── types.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-darwin/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-dragonfly/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-freebsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── cpuset.cr
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── ktls.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-netbsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-openbsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-solaris/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   └── x86_64-windows-msvc/
    │       └── c/
    │           ├── afunix.cr
    │           ├── basetsd.cr
    │           ├── combaseapi.cr
    │           ├── consoleapi.cr
    │           ├── consoleapi2.cr
    │           ├── corecrt.cr
    │           ├── dbghelp.cr
    │           ├── debugapi.cr
    │           ├── delayimp.cr
    │           ├── direct.cr
    │           ├── errhandlingapi.cr
    │           ├── errno.cr
    │           ├── fcntl.cr
    │           ├── fileapi.cr
    │           ├── guiddef.cr
    │           ├── handleapi.cr
    │           ├── heapapi.cr
    │           ├── in6addr.cr
    │           ├── inaddr.cr
    │           ├── int_safe.cr
    │           ├── io.cr
    │           ├── ioapiset.cr
    │           ├── jobapi2.cr
    │           ├── knownfolders.cr
    │           ├── libloaderapi.cr
    │           ├── lm.cr
    │           ├── malloc.cr
    │           ├── memoryapi.cr
    │           ├── minwinbase.cr
    │           ├── mswsock.cr
    │           ├── netioapi.cr
    │           ├── ntdef.cr
    │           ├── ntdll.cr
    │           ├── ntifs.cr
    │           ├── ntsecapi.cr
    │           ├── ntstatus.cr
    │           ├── process.cr
    │           ├── processenv.cr
    │           ├── processthreadsapi.cr
    │           ├── profileapi.cr
    │           ├── regapix.cr
    │           ├── sddl.cr
    │           ├── sdkddkver.cr
    │           ├── security.cr
    │           ├── shlobj_core.cr
    │           ├── signal.cr
    │           ├── stdarg.cr
    │           ├── stddef.cr
    │           ├── stdint.cr
    │           ├── stdio.cr
    │           ├── stdlib.cr
    │           ├── string.cr
    │           ├── stringapiset.cr
    │           ├── synchapi.cr
    │           ├── sys/
    │           │   ├── stat.cr
    │           │   ├── types.cr
    │           │   └── utime.cr
    │           ├── sysinfoapi.cr
    │           ├── timezoneapi.cr
    │           ├── tlhelp32.cr
    │           ├── userenv.cr
    │           ├── wdm.cr
    │           ├── win_def.cr
    │           ├── winbase.cr
    │           ├── wincrypt.cr
    │           ├── windows.cr
    │           ├── winioctl.cr
    │           ├── winnls.cr
    │           ├── winnt.cr
    │           ├── winreg.cr
    │           ├── winsock2.cr
    │           ├── winternl.cr
    │           ├── ws2def.cr
    │           ├── ws2ipdef.cr
    │           ├── ws2tcpip.cr
    │           └── wtypesbase.cr
    ├── lib_c.cr
    ├── lib_z/
    │   └── lib_z.cr
    ├── llvm/
    │   ├── abi/
    │   │   ├── aarch64.cr
    │   │   ├── arm.cr
    │   │   ├── avr.cr
    │   │   ├── wasm32.cr
    │   │   ├── x86.cr
    │   │   ├── x86_64.cr
    │   │   └── x86_win64.cr
    │   ├── abi.cr
    │   ├── basic_block.cr
    │   ├── basic_block_collection.cr
    │   ├── builder.cr
    │   ├── context.cr
    │   ├── di_builder.cr
    │   ├── enums/
    │   │   └── atomic.cr
    │   ├── enums.cr
    │   ├── ext/
    │   │   ├── find-llvm-config.sh
    │   │   ├── llvm-versions.txt
    │   │   └── llvm_ext.cc
    │   ├── function.cr
    │   ├── function_collection.cr
    │   ├── function_pass_manager.cr
    │   ├── generic_value.cr
    │   ├── global_collection.cr
    │   ├── instruction_collection.cr
    │   ├── jit_compiler.cr
    │   ├── lib_llvm/
    │   │   ├── analysis.cr
    │   │   ├── bit_reader.cr
    │   │   ├── bit_writer.cr
    │   │   ├── config.cr
    │   │   ├── core.cr
    │   │   ├── debug_info.cr
    │   │   ├── error.cr
    │   │   ├── execution_engine.cr
    │   │   ├── initialization.cr
    │   │   ├── ir_reader.cr
    │   │   ├── lljit.cr
    │   │   ├── orc.cr
    │   │   ├── support.cr
    │   │   ├── target.cr
    │   │   ├── target_machine.cr
    │   │   ├── transforms/
    │   │   │   ├── pass_builder.cr
    │   │   │   └── pass_manager_builder.cr
    │   │   └── types.cr
    │   ├── lib_llvm.cr
    │   ├── lib_llvm_ext.cr
    │   ├── memory_buffer.cr
    │   ├── module.cr
    │   ├── module_pass_manager.cr
    │   ├── operand_bundle_def.cr
    │   ├── orc/
    │   │   ├── jit_dylib.cr
    │   │   ├── lljit.cr
    │   │   ├── lljit_builder.cr
    │   │   ├── thread_safe_context.cr
    │   │   └── thread_safe_module.cr
    │   ├── parameter_collection.cr
    │   ├── pass_builder_options.cr
    │   ├── pass_manager_builder.cr
    │   ├── pass_registry.cr
    │   ├── phi_table.cr
    │   ├── target.cr
    │   ├── target_data.cr
    │   ├── target_machine.cr
    │   ├── type.cr
    │   ├── value.cr
    │   └── value_methods.cr
    ├── llvm.cr
    ├── log/
    │   ├── backend.cr
    │   ├── broadcast_backend.cr
    │   ├── builder.cr
    │   ├── dispatch.cr
    │   ├── entry.cr
    │   ├── format.cr
    │   ├── io_backend.cr
    │   ├── json.cr
    │   ├── log.cr
    │   ├── main.cr
    │   ├── memory_backend.cr
    │   ├── metadata.cr
    │   ├── setup.cr
    │   └── spec.cr
    ├── log.cr
    ├── macros.cr
    ├── math/
    │   ├── libm.cr
    │   └── math.cr
    ├── mime/
    │   ├── media_type.cr
    │   ├── multipart/
    │   │   ├── builder.cr
    │   │   ├── parser.cr
    │   │   └── state.cr
    │   └── multipart.cr
    ├── mime.cr
    ├── mutex.cr
    ├── named_tuple.cr
    ├── nil.cr
    ├── number.cr
    ├── oauth/
    │   ├── access_token.cr
    │   ├── authorization_header.cr
    │   ├── consumer.cr
    │   ├── error.cr
    │   ├── oauth.cr
    │   ├── request_token.cr
    │   └── signature.cr
    ├── oauth.cr
    ├── oauth2/
    │   ├── access_token/
    │   │   ├── access_token.cr
    │   │   ├── bearer.cr
    │   │   └── mac.cr
    │   ├── auth_scheme.cr
    │   ├── client.cr
    │   ├── error.cr
    │   ├── error_response.cr
    │   ├── oauth2.cr
    │   └── session.cr
    ├── oauth2.cr
    ├── object/
    │   └── properties.cr
    ├── object.cr
    ├── openssl/
    │   ├── algorithm.cr
    │   ├── bio.cr
    │   ├── cipher.cr
    │   ├── digest.cr
    │   ├── error.cr
    │   ├── hmac.cr
    │   ├── ktls.cr
    │   ├── lib_crypto.cr
    │   ├── lib_ssl.cr
    │   ├── md5.cr
    │   ├── pkcs5.cr
    │   ├── sha1.cr
    │   ├── ssl/
    │   │   ├── context.cr
    │   │   ├── defaults.cr
    │   │   ├── hostname_validation.cr
    │   │   ├── server.cr
    │   │   └── socket.cr
    │   └── x509/
    │       ├── certificate.cr
    │       ├── extension.cr
    │       ├── name.cr
    │       └── x509.cr
    ├── openssl.cr
    ├── option_parser.cr
    ├── path.cr
    ├── pointer.cr
    ├── prelude.cr
    ├── pretty_print.cr
    ├── primitives.cr
    ├── proc.cr
    ├── process/
    │   ├── executable_path.cr
    │   ├── shell.cr
    │   └── status.cr
    ├── process.cr
    ├── raise.cr
    ├── random/
    │   ├── isaac.cr
    │   ├── pcg32.cr
    │   └── secure.cr
    ├── random.cr
    ├── range/
    │   └── bsearch.cr
    ├── range.cr
    ├── reference.cr
    ├── reference_storage.cr
    ├── regex/
    │   ├── engine.cr
    │   ├── lib_pcre.cr
    │   ├── lib_pcre2.cr
    │   ├── match_data.cr
    │   ├── pcre.cr
    │   └── pcre2.cr
    ├── regex.cr
    ├── semantic_version.cr
    ├── set.cr
    ├── signal.cr
    ├── slice/
    │   └── sort.cr
    ├── slice.cr
    ├── socket/
    │   ├── address.cr
    │   ├── addrinfo.cr
    │   ├── common.cr
    │   ├── ip_socket.cr
    │   ├── server.cr
    │   ├── tcp_server.cr
    │   ├── tcp_socket.cr
    │   ├── udp_socket.cr
    │   ├── unix_server.cr
    │   └── unix_socket.cr
    ├── socket.cr
    ├── spec/
    │   ├── cli.cr
    │   ├── context.cr
    │   ├── dsl.cr
    │   ├── example/
    │   │   └── procsy.cr
    │   ├── example.cr
    │   ├── example_group/
    │   │   └── procsy.cr
    │   ├── expectations.cr
    │   ├── filters.cr
    │   ├── formatter.cr
    │   ├── helpers/
    │   │   ├── iterate.cr
    │   │   └── string.cr
    │   ├── item.cr
    │   ├── junit_formatter.cr
    │   ├── methods.cr
    │   ├── source.cr
    │   └── tap_formatter.cr
    ├── spec.cr
    ├── static_array.cr
    ├── steppable.cr
    ├── string/
    │   ├── builder.cr
    │   ├── formatter.cr
    │   ├── grapheme/
    │   │   ├── grapheme.cr
    │   │   └── properties.cr
    │   ├── grapheme.cr
    │   └── utf16.cr
    ├── string.cr
    ├── string_pool.cr
    ├── string_scanner.cr
    ├── struct.cr
    ├── symbol.cr
    ├── sync/
    │   ├── condition_variable.cr
    │   ├── cv.cr
    │   ├── errors.cr
    │   ├── exclusive.cr
    │   ├── lockable.cr
    │   ├── mu.cr
    │   ├── mutex.cr
    │   ├── rw_lock.cr
    │   ├── shared.cr
    │   ├── sync.cr
    │   ├── type.cr
    │   └── waiter.cr
    ├── syscall/
    │   ├── aarch64-linux.cr
    │   ├── arm-linux.cr
    │   ├── i386-linux.cr
    │   └── x86_64-linux.cr
    ├── syscall.cr
    ├── system/
    │   ├── group.cr
    │   └── user.cr
    ├── system.cr
    ├── system_error.cr
    ├── termios.cr
    ├── time/
    │   ├── format/
    │   │   ├── custom/
    │   │   │   ├── http_date.cr
    │   │   │   ├── iso_8601.cr
    │   │   │   ├── rfc_2822.cr
    │   │   │   ├── rfc_3339.cr
    │   │   │   └── yaml_date.cr
    │   │   ├── formatter.cr
    │   │   ├── parser.cr
    │   │   └── pattern.cr
    │   ├── format.cr
    │   ├── instant.cr
    │   ├── location/
    │   │   └── loader.cr
    │   ├── location.cr
    │   ├── span.cr
    │   └── tz.cr
    ├── time.cr
    ├── tuple.cr
    ├── unicode/
    │   ├── data.cr
    │   └── unicode.cr
    ├── union.cr
    ├── uri/
    │   ├── encoding.cr
    │   ├── json.cr
    │   ├── params/
    │   │   ├── from_www_form.cr
    │   │   ├── serializable.cr
    │   │   └── to_www_form.cr
    │   ├── params.cr
    │   ├── punycode.cr
    │   ├── uri_parser.cr
    │   └── yaml.cr
    ├── uri.cr
    ├── uuid/
    │   ├── json.cr
    │   └── yaml.cr
    ├── uuid.cr
    ├── va_list.cr
    ├── value.cr
    ├── wait_group.cr
    ├── wasi_error.cr
    ├── weak_ref.cr
    ├── winerror.cr
    ├── xml/
    │   ├── attribute_type.cr
    │   ├── attributes.cr
    │   ├── builder.cr
    │   ├── document.cr
    │   ├── error.cr
    │   ├── html_parser_options.cr
    │   ├── libxml2.cr
    │   ├── namespace.cr
    │   ├── node/
    │   │   └── type.cr
    │   ├── node.cr
    │   ├── node_set.cr
    │   ├── parser_options.cr
    │   ├── reader/
    │   │   └── type.cr
    │   ├── reader.cr
    │   ├── save_options.cr
    │   └── xpath_context.cr
    ├── xml.cr
    ├── yaml/
    │   ├── any.cr
    │   ├── builder.cr
    │   ├── enums.cr
    │   ├── from_yaml.cr
    │   ├── lib_yaml.cr
    │   ├── nodes/
    │   │   ├── builder.cr
    │   │   ├── nodes.cr
    │   │   └── parser.cr
    │   ├── nodes.cr
    │   ├── parse_context.cr
    │   ├── parser.cr
    │   ├── pull_parser.cr
    │   ├── schema/
    │   │   ├── core/
    │   │   │   └── parser.cr
    │   │   ├── core.cr
    │   │   └── fail_safe.cr
    │   ├── serialization.cr
    │   └── to_yaml.cr
    └── yaml.cr

================================================
FILE CONTENTS
================================================

================================================
FILE: .ameba.yml
================================================
# This configuration file was generated by `ameba --gen-config`
# on 2025-06-02 13:57:07 UTC using Ameba version 1.7.0-dev.
# The point is for the user to remove these configuration records
# one by one as the reported problems are removed from the code base.
#
# For more details on any individual rule, run `ameba --only RuleName`.

# Indicators for comment annotations:
#
# * `Disabled`: The rule is disabled because it does not seem useful for this repo (or in general).
# * `BUG`: A bug in ameba prevents using this rule either entirely or for specific files.
# * `FIXME`: The rule seems useful, but requires some effort to resolve. That's deferred for later.
# * `TODO`: The rule might be useful, but we need to investigate whether we want to use it or not.

Version: "1.7.0-dev"

# Documentation
# =========================

# Disabled: What's the point in alerting about existing TODOs in code?
Documentation/DocumentationAdmonition:
  Enabled: false

# Lint
# =========================

Lint/DebugCalls:
  Excluded:
  # Samples may legitimately use DebugCalls
  - samples/**/*
  # Explicit tests
  - spec/std/pp_spec.cr

Lint/DebuggerStatement:
  Excluded:
  # Explicit tests
  - spec/debug/**/*

# Disabled: `else nil` can be useful to explicitly show the consequence of the else branch
Lint/ElseNil:
  Enabled: false

# Disabled: We have an explicit CI job for testing the formatter (both latest
# and head). No reason to run it through ameba.
Lint/Formatting:
  Enabled: false

Lint/LiteralInCondition:
  Excluded:
  # Samples may legitimately use literals in conditions
  - samples/**/*

Lint/LiteralInInterpolation:
  Excluded:
  - spec/std/random_spec.cr # BUG: https://github.com/crystal-ameba/ameba/issues/611

Lint/LiteralsComparison:
  Excluded:
  # Explicit tests for case equality on literals
  - spec/std/{array,char,int,number,regex,string,symbol,tuple,uint}_spec.cr

# TODO: Investigate if some `not_nil!` calls can be avoided.
Lint/NotNil:
  Enabled: false

# BUG: https://github.com/crystal-ameba/ameba/issues/605
Lint/SpecFocus:
  Enabled: false

Lint/RandZero:
  Excluded:
  # Explicit tests
  - spec/std/random_spec.cr

# FIXME: Resolve shadowing.
Lint/ShadowingOuterLocalVar:
  Enabled: false

Lint/SpecFilename:
  Excluded:
  - spec/compiler/data/**/*
  - spec/compiler/lexer/lexer_objects/strings.cr
  - spec/debug/**/*
  - spec/llvm-ir/**/*
  - spec/std/float_printer/ryu_printf_test_cases.cr

# BUG: https://github.com/crystal-ameba/ameba/issues/612
Lint/TopLevelOperatorDefinition:
  Enabled: false

# Disabled: We have an explicit CI job for `typos`. No reason to run it through
# ameba.
Lint/Typos:
  Enabled: false

# TODO: Investigate unused arguments.
Lint/UnusedArgument:
  Enabled: false

# TODO: Investigate unused block arguments.
Lint/UnusedBlockArgument:
  Enabled: false

Lint/UselessAssign:
  # BUG: https://github.com/crystal-ameba/ameba/issues/447
  # This setting is to avoid false positives from the common use of type
  # declarations in macro arguments.
  ExcludeTypeDeclarations: true
  Excluded:
    - spec/debug/**/*
    - samples/mt_gc_test.cr
    # BUG: https://github.com/crystal-ameba/ameba/issues/624
    - spec/std/concurrent/select_spec.cr
    # Generators assign top-level variables to pass to ECR templates
    - scripts/generate_*
    # BUG: https://github.com/crystal-ameba/ameba/issues/623
    - scripts/github-changelog.cr

# Metrics
# =========================

# Disabled: Lot's of violations. Complexity is very individual.
Metrics/CyclomaticComplexity:
  Enabled: false

# Naming
# =========================
# All disabled. There are many violations and some of the rules are questionable.
# TODO: Consider enabling some of these rules.

Naming/AccessorMethodName:
  Enabled: false

Naming/BinaryOperatorParameterName:
  Enabled: false

Naming/BlockParameterName:
  Enabled: false

# Disabled: All violations follow the spelling of identifiers in upstream
# projects, e.g. for lib bindings.
Naming/ConstantNames:
  Enabled: false

Naming/MethodNames:
  Enabled: false

Naming/PredicateName:
  Enabled: false

Naming/QueryBoolMethods:
  Enabled: false

Naming/RescuedExceptionsVariableName:
  Enabled: false

Naming/TypeNames:
  Enabled: false

Naming/VariableNames:
  Enabled: false

# Performance
# =========================

Performance/AnyInsteadOfEmpty:
  Excluded:
  # These specs explicitly test `#any?` implementations
  - spec/std/bit_array_spec.cr
  - spec/std/enumerable_spec.cr
  - spec/std/hash_spec.cr

# Style
# =========================
# All disabled. There are many violations and some of the rules are questionable.
# TODO: Consider enabling some of these rules.

Style/HeredocEscape:
  Enabled: false

Style/HeredocIndent:
  Enabled: false

Style/MultilineCurlyBlock:
  Enabled: false

# Disabled: This rule seems too strict when any negation inside a complex condition is
# considered a violation. https://github.com/crystal-ameba/ameba/issues/621
Style/NegatedConditionsInUnless:
  Enabled: false

# BUG: https://github.com/crystal-ameba/ameba/issues/614
Style/ParenthesesAroundCondition:
  Enabled: false

Style/PercentLiteralDelimiters:
  Enabled: false

Style/RedundantNext:
  Enabled: false

Style/RedundantReturn:
  Enabled: false

Style/RedundantSelf:
  Enabled: false

Style/VerboseBlock:
  Enabled: false

Style/WhileTrue:
  Enabled: false


================================================
FILE: .circleci/config.yml
================================================
version: 2.1

parameters:
  distribution-scripts-repo:
    description: "Git url https://github.com/crystal-lang/distribution-scripts/"
    type: string
    default: "https://github.com/crystal-lang/distribution-scripts.git"
  distribution-scripts-version:
    description: "Git ref for version of https://github.com/crystal-lang/distribution-scripts/"
    type: string
    default: "4205934e01733848a559a2908a14dcb16be7f38f"
  previous_crystal_base_url:
    description: "Prefix for URLs to Crystal bootstrap compiler"
    type: string
    default: "https://github.com/crystal-lang/crystal/releases/download/1.19.1/crystal-1.19.1-1"

defaults:
  environment: &env
    TRAVIS_BRANCH: $CIRCLE_BRANCH
    TRAVIS_PULL_REQUEST: $CI_PULL_REQUEST || "false"
  steps: &ci_steps
    - checkout
    - run: bin/ci prepare_system
    - run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
    - run: bin/ci prepare_build
    - run:
        command: bin/ci build
        no_output_timeout: 30m
    - run:
        when: always
        command: |
          mkdir -p ~/test-results/spec
          cp .junit/*.xml ~/test-results/spec/
    - store_test_results:
        path: ~/test-results
    - store_artifacts:
        path: ~/test-results/spec

jobs:
  test_linux:
    machine:
      image: default
    environment:
      <<: *env
      TRAVIS_OS_NAME: linux
      ARCH: x86_64
      ARCH_CMD: linux64
    resource_class: large
    steps:
      - checkout
      - run: bin/ci prepare_system
      - run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
      - run: bin/ci prepare_build
      - run:
          command: bin/ci build
          no_output_timeout: 30m
      - run:
          when: always
          command: |
            mkdir -p ~/test-results/spec
            cp .junit/*.xml ~/test-results/spec/
      - store_test_results:
          path: ~/test-results
      - store_artifacts:
          path: ~/test-results/spec
      - persist_to_workspace:
          root: .
          paths:
            - docs

  test_alpine:
    machine:
      image: default
    environment:
      <<: *env
      TRAVIS_OS_NAME: linux
      ARCH: x86_64-musl
      ARCH_CMD: linux64
    resource_class: large
    steps: *ci_steps

  test_darwin:
    macos:
      xcode: 16.4.0
    environment:
      <<: *env
      TRAVIS_OS_NAME: osx
      LLVM_CONFIG: /usr/local/opt/llvm/bin/llvm-config
    steps:
      - restore_cache:
          keys:
            - brew-cache-v1
      - checkout
      - run: bin/ci prepare_system
      - run: echo 'export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/opt/openssl@1.1/lib/pkgconfig"' >> $BASH_ENV
      - run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
      - run: bin/ci prepare_build
      - run:
          command: bin/ci build
          no_output_timeout: 30m
      - run:
          when: always
          command: |
            mkdir -p ~/test-results/spec
            cp .junit/*.xml ~/test-results/spec/
      - store_test_results:
          path: ~/test-results
      - store_artifacts:
          path: ~/test-results/spec
      - save_cache:
          key: brew-cache-v1
          paths:
            - /usr/local/Homebrew
            - ~/Library/Caches/Homebrew/downloads

  test_preview_mt:
    machine:
      image: default
    resource_class: large
    environment:
      <<: *env
      TRAVIS_OS_NAME: linux
      ARCH: x86_64
      ARCH_CMD: linux64
    steps:
      - checkout
      - run: bin/ci prepare_system
      - run: echo 'export CURRENT_TAG="$CIRCLE_TAG"' >> $BASH_ENV
      - run: bin/ci prepare_build
      - run: bin/ci with_build_env 'make crystal'
      - run:
          command: bin/ci with_build_env 'CRYSTAL_WORKERS=4 make std_spec threads=1 FLAGS="-D preview_mt" junit_output=.junit/std_spec.xml'
          no_output_timeout: 30m
      - run:
          when: always
          command: |
            mkdir -p ~/test-results/spec
            cp .junit/*.xml ~/test-results/spec/
      - store_test_results:
          path: ~/test-results
      - store_artifacts:
          path: ~/test-results/spec

  prepare_common:
    docker:
      - image: docker:stable-git
    steps:
      # checkout specific distribution-scripts version to perform releases and nightly
      - run: |
          git clone << pipeline.parameters.distribution-scripts-repo >> ~/distribution-scripts
          cd ~/distribution-scripts
          git checkout << pipeline.parameters.distribution-scripts-version >>
      # persist relevant information for build process
      - run: |
          cd ~/distribution-scripts
          touch build.env
          echo "export DOCKER_REPOSITORY=crystallang/crystal" >> build.env

          # What to build
          echo "export CRYSTAL_SHA1=$CIRCLE_SHA1" >> build.env

          # Which previous version use
          echo "export PREVIOUS_CRYSTAL_RELEASE_DARWIN_TARGZ=<< pipeline.parameters.previous_crystal_base_url >>-darwin-universal.tar.gz" >> build.env

          cat build.env
      - persist_to_workspace:
          root: ../
          paths:
            - distribution-scripts

  # prepare build for tagged releases
  prepare_tagged:
    docker:
      - image: docker:stable-git
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run: |
          cd /tmp/workspace/distribution-scripts

          # How to brand it
          echo "export CRYSTAL_VERSION=$CIRCLE_TAG" >> build.env
          echo "export DOCKER_TAG=$CIRCLE_TAG" >> build.env

          # Snapcraft configuration
          echo "export SNAP_GRADE=stable" >> build.env
          echo "export SNAP_CHANNEL=edge" >> build.env

          cat build.env
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - distribution-scripts

  # prepare build for nightly releases
  prepare_nightly:
    docker:
      - image: docker:stable-git
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - checkout
      - run: |
          # We need CRYSTAL_VERSION in prepare_nightly to use src/VERSION so we publish them as x.y.z-dev in apt/rpm
          #
          # How to brand it
          echo "export CRYSTAL_VERSION=$(cat src/VERSION)" >> /tmp/workspace/distribution-scripts/build.env
          #
          # TODO: We might want to do that on docker images also to support updates on multiple development versions the same date.
      - run: |
          cd /tmp/workspace/distribution-scripts

          echo "export DOCKER_TAG=nightly" >> build.env

          # Build from working directory (needed for omnibus and when version does not match branch/tag)
          echo "export FORCE_GIT_TAGGED=0" >> build.env

          # Snapcraft configuration
          echo "export SNAP_GRADE=devel" >> build.env
          echo "export SNAP_CHANNEL=edge" >> build.env

          cat build.env
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - distribution-scripts

  # prepare build for manual triggered releases like ci branches, maintenance releases, etc.
  prepare_maintenance:
    docker:
      - image: docker:stable-git
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run: |
          cd /tmp/workspace/distribution-scripts

          # The version is based on the branch name.
          VERSION=$CIRCLE_BRANCH

          # We need to sanitize it because there are restrictions on some places
          # where the version is use (Mac pkg names, snap branch).
          VERSION=${VERSION/release\//}
          VERSION=${VERSION//_/-}
          VERSION=${VERSION//\//-}-dev

          export VERSION
          echo "export CRYSTAL_VERSION=$VERSION" >> build.env
          echo "export DOCKER_TAG=$VERSION" >> build.env

          # Build from working directory (needed for omnibus and when version does not match branch/tag)
          echo "export FORCE_GIT_TAGGED=0" >> build.env

          # Snapcraft configuration
          echo "export SNAP_GRADE=devel" >> build.env
          echo "export SNAP_CHANNEL=edge/$VERSION" >> build.env

          cat build.env
      - persist_to_workspace:
          root: /tmp/workspace
          paths:
            - distribution-scripts

  dist_linux:
    parameters:
      arch:
        type: string
    machine:
      image: default
    resource_class: << parameters.arch >>
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run:
          no_output_timeout: 20m
          command: |
            cd /tmp/workspace/distribution-scripts
            source build.env
            export PREVIOUS_CRYSTAL_RELEASE_LINUX64_TARGZ="<< pipeline.parameters.previous_crystal_base_url >>-linux-$(uname -m).tar.gz"
            cd linux
            make all64 release=true
      - store_artifacts:
          path: /tmp/workspace/distribution-scripts/linux/build
          destination: build
      - persist_to_workspace:
          root: /tmp/workspace/distribution-scripts/linux/
          paths:
            - build

  dist_darwin:
    macos:
      xcode: 16.4.0
    shell: /bin/bash --login -eo pipefail
    steps:
      - restore_cache:
          keys:
            - brew-cache-v1
      - run:
          name: Setup environment
          command: |
            brew unlink python@2 || true

            brew install ruby@3 libffi pkgconfig libtool automake

            sudo mkdir -p /opt/crystal
            sudo chown $(whoami) /opt/crystal/
            sudo mkdir -p /var/cache
            sudo chown $(whoami) /var/cache
      - attach_workspace:
          at: /tmp/workspace
      - run:
          no_output_timeout: 40m
          command: |
            cd /tmp/workspace/distribution-scripts
            source build.env
            cd omnibus
            ruby --version
            gem install bundler -v "$(grep -A 1 "BUNDLED WITH" Gemfile.lock | tail -n 1)"
            bundle check || bundle install --binstubs
            cd ../darwin
            make
      - store_artifacts:
          path: /tmp/workspace/distribution-scripts/darwin/build
          destination: build
      - persist_to_workspace:
          root: /tmp/workspace/distribution-scripts/darwin/
          paths:
            - build

  push_obs_nightly:
    docker:
      - image: crystallang/osc
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run:
          command: |
            cd /tmp/workspace/distribution-scripts
            source build.env

            packages/obs-setup.sh
            packages/obs-push.sh devel:languages:crystal:nightly ${CRYSTAL_VERSION%-*} $(date '+%Y%m%d') $CRYSTAL_SHA1 \
                /tmp/workspace/build/crystal-*-linux-x86_64.tar.gz \
                /tmp/workspace/build/crystal-*-docs.tar.gz

  dist_docker:
    machine:
      image: default
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run:
          name: Enable buildx for multiarch builds
          command: docker buildx create --use
      - run:
          name: Build and push multiarch images
          command: |
            cd /tmp/workspace/distribution-scripts
            source build.env
            cd docker
            docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}
            make all TARBALLS=/tmp/workspace/build/ VERSION=${CRYSTAL_VERSION} PUSH=1
      - run:
          name: Smoke tests
          command: |
            cd /tmp/workspace/distribution-scripts
            source build.env
            cd docker
            make smoke-all VERSION=${CRYSTAL_VERSION}

  dist_snap:
    machine:
      image: "ubuntu-2204:current"
    environment:
      SNAPCRAFT_BUILD_ENVIRONMENT: host
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run:
          command: |
            sudo apt-get update
            sudo apt-get install -y make snapd
            sudo snap install snapcraft --classic
            cd /tmp/workspace/distribution-scripts
            source build.env
            cd snapcraft/
            sudo -E make ARCH=amd64 CRYSTAL_TARBALL=/tmp/workspace/build/crystal-$CRYSTAL_VERSION-1-linux-x86_64.tar.gz  GRADE=$SNAP_GRADE
            sudo -E make ARCH=arm64 CRYSTAL_TARBALL=/tmp/workspace/build/crystal-$CRYSTAL_VERSION-1-linux-aarch64.tar.gz GRADE=$SNAP_GRADE
            sudo -E make push CHANNEL=$SNAP_CHANNEL

  dist_docs:
    machine:
      image: default
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run: |
          cd /tmp/workspace/distribution-scripts
          source build.env
          cd docs
          make CRYSTAL_DOCKER_IMAGE=${DOCKER_REPOSITORY}:${DOCKER_TAG}-build
      - store_artifacts:
          path: /tmp/workspace/distribution-scripts/docs/build
          destination: build
      - persist_to_workspace:
          root: /tmp/workspace/distribution-scripts/docs/
          paths:
            - build

  publish_nightly_artifacts:
    docker:
      - image: manastech/s3cmd:2.2-alpine
    environment:
      <<: *env
      AWS_ACCESS_KEY_ID: AKIA2EEIIRCJDEDGK6MQ
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - run: |
          mkdir -p /tmp/upload
          cd /tmp/workspace/build
          cp crystal-*-darwin-universal.tar.gz /tmp/upload/crystal-nightly-darwin-universal.tar.gz
          cp crystal-*-linux-x86_64.tar.gz /tmp/upload/crystal-nightly-linux-x86_64.tar.gz
          cp crystal-*-linux-aarch64.tar.gz /tmp/upload/crystal-nightly-linux-aarch64.tar.gz
      - run: s3cmd put --recursive /tmp/upload/* s3://artifacts.crystal-lang.org/dist/

  dist_artifacts:
    docker:
      - image: buildpack-deps:xenial
    steps:
      - attach_workspace:
          at: /tmp/workspace
      - store_artifacts:
          path: /tmp/workspace/build
          destination: dist_packages

workflows:
  version: 2
  release:
    jobs:
      - test_linux:
          filters: &release
            branches:
              only:
                - /release\/.+/
                - /.*\bci\b.*/
            tags:
              only: /.*/
      - test_alpine:
          filters: *release
      # - test_darwin: # See https://github.com/crystal-lang/crystal/pull/9763
      #     filters: *release
      - test_preview_mt:
          filters: *release
      - prepare_common:
          filters: *release
      - prepare_maintenance:
          filters: &maintenance
            branches:
              only:
                - /release\/.+/
                - /.*\bci\b.*/
          requires:
            - prepare_common
      - prepare_tagged:
          filters: &tagged
            branches:
              ignore: /.*/
            tags:
              only: /.*/
          requires:
            - prepare_common
      - dist_linux:
          matrix:
            parameters:
              arch: [large, arm.medium]
          filters: *release
          requires:
            - prepare_maintenance
            - prepare_tagged
      - dist_darwin:
          filters: *release
          requires:
            - prepare_maintenance
            - prepare_tagged
      - dist_docker:
          filters: *release
          requires:
            - dist_linux
      - dist_snap:
          filters: *release
          requires:
            - dist_linux
      - dist_docs:
          filters: *release
          requires:
            - dist_docker
      - dist_artifacts:
          filters: *release
          requires:
            - dist_linux
            - dist_darwin
            - dist_docs

  nightly_release:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - master
    jobs:
      - test_linux
      - test_alpine
      # - test_darwin # See https://github.com/crystal-lang/crystal/pull/9763
      - test_preview_mt
      - prepare_common
      - prepare_nightly:
          requires:
            - prepare_common
      - dist_linux:
          matrix:
            parameters:
              arch: [large, arm.medium]
          requires:
            - prepare_nightly
      - dist_darwin:
          requires:
            - prepare_nightly
      - push_obs_nightly:
          requires:
            - dist_linux
            - dist_docs
      - dist_docker:
          requires:
            - dist_linux
      - dist_snap:
          requires:
            - dist_linux
      - dist_docs:
          requires:
            - dist_docker
      - publish_nightly_artifacts:
          requires:
            - dist_linux
            - dist_darwin
      - dist_artifacts:
          requires:
            - dist_linux
            - dist_darwin
            - dist_docs


================================================
FILE: .editorconfig
================================================
root = true

[*.{cr,ecr}]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true


================================================
FILE: .gitattributes
================================================
## Sources

*.cr text eol=lf

## Sourced-in dependencies

lib/** linguist-vendored

## Generated files

# produced by scripts/generate_windows_zone_names.cr
src/crystal/system/win32/zone_names.cr linguist-generated
# produced by scripts/generate_object_properties.cr
src/object/properties.cr
# produced by scripts/generate_html_entities.cr
src/html/entities.cr linguist-generated
# produced by scripts/generate_ssl_server_defaults.cr
src/openssl/ssl/defaults.cr linguist-generated
# produced by scripts/generate_grapheme_properties.cr
src/string/grapheme/properties.cr linguist-generated
# produced by scripts/generate_unicode_data.cr
src/unicode/data.cr linguist-generated
# produced by scripts/generate_glob_specs.cr
spec/std/file/match-fast-glob_spec.cr
# produced by scripts/generate_grapheme_break_specs.cr
spec/std/string/grapheme_break_spec.cr linguist-generated
# produced by spec/generate_wasm32_spec.sh
spec/wasm32_std_spec.cr linguist-generated

# devenv
.devenv.flake.nix -merge linguist-generated
devenv.lock -merge linguist-generated

## Syntax highlighting

Makefile.win linguist-language=makefile


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: "\U0001F41B Bug Report"
about: I want to report a bug.
labels: kind:bug
type: Bug
---

# Bug Report

Make sure to review these points before submitting issues - thank you!

- Make sure a similar issue does not exist yet: use the search box, search engine and look at [Stack Overflow](https://stackoverflow.com/questions/tagged/crystal-lang).
- **Include reproducible code**: we should be able to paste it into an editor, compile and run it and get the same error as you. Otherwise it's impossible for us to reproduce the bug.
- Don't **only** use `play.crystal-lang.org` or `carc.in`: code might be lost and the issue will remain incomplete. Write code in the issue itself.
- Reduce code, if possible, to the minimum size that reproduces the bug.
- If all of the above is impossible due to a large project, create a branch that reproduces the bug and point us to it.
- Include Crystal compiler version (`crystal -v`) and OS. If possible, try to see if the bug still reproduces on master.

---

Add a :+1: [reaction] to [issues you find important].

[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]:
    https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: "\U00002753 Crystal Community Forum"
    url: https://forum.crystal-lang.org/c/help-support
    about: Questions about installing, using Crystal and any related issues.
  - name: "\U0001F4AC Crystal Community Chat"
    url: https://gitter.im/crystal-lang/crystal
    about: "Get in touch with the community, ask for help and talk about Crystal. (IRC: #crystal-lang on libera.chat)"


================================================
FILE: .github/ISSUE_TEMPLATE/discussion.md
================================================
---
name: "\U0001F914 Language Improvement Discussion"
about: I want to start a new discussion about improving the language.
labels: status:discussion
---

# Discussion

- What aspect of the language would you like to see improved?
- What are the reasons?
- Include practical examples to illustrate your points.
- Optionally add one (or more) proposals to improve the current situation.

---

Add a :+1: [reaction] to [issues you find important].

[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]:
    https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: "\U0001F680 Feature Request"
about: I want to propose a new language feature.
labels: kind:feature
type: Feature
---

# Feature Request

- Is your feature request related to a problem? Please describe clearly and concisely what is it.
- Describe the feature you would like, optionally illustrated by examples, and how it will solve the above problem.
- Describe considered alternative solutions, and the reasons why you have not proposed them as a solution here.
- Does it break backward compatibility, if yes then what's the migration path?

In case this proposal includes a substantial change to the language, we ask you to go through an [RFC process](https://github.com/crystal-lang/rfcs).

The best place to start an open discussion about potential changes is the [Crystal forum](https://forum.crystal-lang.org/c/crystal-contrib/6).

---

Add a :+1: [reaction] to [issues you find important].

[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[issues you find important]: https://github.com/crystal-lang/crystal/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc


================================================
FILE: .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
================================================
# Pull Request

We thank you for helping improve Crystal. In order to ease the reviewing process, we invite you to read the [guidelines](https://github.com/crystal-lang/crystal/blob/master/CONTRIBUTING.md#making-good-pull-requests) and ask you to consider the following points before submitting a PR:

1. We prefer to discuss the underlying issue _prior_ to discussing the code. Therefore, we kindly ask you to refer to an existing issue, or an existing discussion in a public space with members of the Core Team (forum, Gitter, Discord, ...). In few cases, we acknowledge that this might not be necessary, for instance when refactoring code or small bug fixes. In this case, the PR must include the same information an issue would have: a clear explanation of the issue, reproducible code, etc.

2. Focus the PR to the referred issue, and restraint from adding unrelated changes/additions. We do welcome another PR if you fixed another issue.

3. If your change is big, consider breaking it into several smaller PRs. In general, the smaller the change, the quicker we can review it.

4. ⚠️ Please do not amend previous commits and force push to the PR branch. This makes reviews much harder because reference to previous state is hidden.

---

Add a :+1: [reaction] to [pull requests you find important].

[reaction]: https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/
[pull requests you find important]:
    https://github.com/crystal-lang/crystal/pulls?q=is%3Aopen+sort%3Areactions-%2B1-desc


================================================
FILE: .github/actionlint.yaml
================================================
self-hosted-runner:
  # Labels of self-hosted runner in array of strings.
  labels:
    - runs-on
    - runner=*
    - family=*
    - ram=*
    - windows-11-arm # actionlint doesn't understand this label yet

# Configuration variables in array of strings defined in your repository or
# organization. `null` means disabling configuration variables check.
# Empty array means no configuration variable is allowed.
config-variables: null

# Configuration for file paths. The keys are glob patterns to match to file
# paths relative to the repository root. The values are the configurations for
# the file paths. Note that the path separator is always '/'.
# The following configurations are available.
#
# "ignore" is an array of regular expression patterns. Matched error messages
# are ignored. This is similar to the "-ignore" command line option.
paths:
#  .github/workflows/**/*.yml:
#    ignore: []


================================================
FILE: .github/renovate.json
================================================
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended"
  ],
  "separateMajorMinor": false,
  "packageRules": [
    {
      "matchDatasources": [
        "docker"
      ],
      "enabled": false
    },
    {
      "groupName": "GH Actions",
      "matchManagers": [
        "github-actions"
      ],
      "schedule": [
        "after 5am and before 8am on Wednesday"
      ]
    }
  ],
  "labels": [
    "topic:infrastructure/ci"
  ]
}


================================================
FILE: .github/workflows/aarch64.yml
================================================
name: AArch64 CI

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

jobs:
  aarch64-musl-build:
    runs-on: [runs-on, runner=2cpu-linux-arm64, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Build Crystal
        uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
        with:
          args: make crystal
      - name: Upload Crystal executable
        uses: actions/upload-artifact@v7
        with:
          name: crystal-aarch64-musl
          path: |
            .build/crystal
            src/llvm/ext/llvm_ext.o
  aarch64-musl-test-stdlib:
    needs: aarch64-musl-build
    runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal-aarch64-musl
      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal
      - name: Run stdlib specs
        uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
        with:
          args: make std_spec
  aarch64-musl-test-compiler:
    needs: aarch64-musl-build
    runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal-aarch64-musl
      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal
      - name: Run compiler specs
        uses: docker://crystallang/crystal:1.13.2-alpine-84codes-build
        with:
          args: make primitives_spec compiler_spec FLAGS=-Dwithout_ffi
  aarch64-gnu-build:
    runs-on: [runs-on, runner=2cpu-linux-arm64, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Build Crystal
        uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
        with:
          args: make crystal
      - name: Upload Crystal executable
        uses: actions/upload-artifact@v7
        with:
          name: crystal-aarch64-gnu
          path: |
            .build/crystal
            src/llvm/ext/llvm_ext.o
  aarch64-gnu-test-stdlib:
    needs: aarch64-gnu-build
    runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal-aarch64-gnu
      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal
      - name: Run stdlib specs
        uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
        with:
          args: make std_spec
  aarch64-gnu-test-compiler:
    needs: aarch64-gnu-build
    runs-on: [runs-on, runner=4cpu-linux-arm64, "family=m7g", ram=16, "run-id=${{ github.run_id }}"]
    if: github.repository == 'crystal-lang/crystal'
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal-aarch64-gnu
      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal
      - name: Run compiler specs
        uses: docker://crystallang/crystal:1.13.2-ubuntu-84codes-build
        with:
          args: make primitives_spec compiler_spec


================================================
FILE: .github/workflows/backport.yml
================================================
# WARNING:
# When extending this action, be aware that $GITHUB_TOKEN allows write access to
# the GitHub repository. This means that it should not evaluate user input in a
# way that allows code injection.

name: Backport

on:
  pull_request_target:
    types: [closed, labeled]
    branches: [master, release/*]

permissions:
  contents: write # so it can comment
  pull-requests: write # so it can create pull requests

jobs:
  backport:
    name: Backport Pull Request
    if: github.repository_owner == 'crystal-lang' && github.event.pull_request.merged == true && (github.event_name != 'labeled' || startsWith('backport', github.event.label.name))
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          token: ${{ secrets.BACKPORT_ACTION_GITHUB_PAT }}
          persist-credentials: false

      - name: Create backport PR
        uses: korthout/backport-action@4aaf0e03a94ff0a619c9a511b61aeb42adea5b02 # v4.2.0
        with:
          github_token: ${{ secrets.BACKPORT_ACTION_GITHUB_PAT }}
          # Config README: https://github.com/korthout/backport-action#backport-action
          copy_labels_pattern: '^(breaking-change|security|topic:.*|kind:.*|platform:.*)$'
          copy_milestone: true
          pull_description: |-
            Automated backport of #${pull_number} to `${target_branch}`, triggered by a label.


================================================
FILE: .github/workflows/docs.yml
================================================
name: Docs

on:
  push:
    branches:
      - master

permissions: {}

env:
  TRAVIS_OS_NAME: linux

jobs:
  deploy_api_docs:
    if: github.repository_owner == 'crystal-lang'
    env:
      ARCH: x86_64
      ARCH_CMD: linux64
    runs-on: ubuntu-latest
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Build docs
        run: bin/ci with_build_env 'make crystal docs threads=1'

      - name: Set revision
        run: echo "$GITHUB_SHA" > ./docs/revision.txt

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Deploy API docs to S3
        run: |
          aws s3 sync ./docs s3://crystal-api/api/master --delete


================================================
FILE: .github/workflows/forward-compatibility.yml
================================================
name: Forward Compatibility

on:
  push:
    paths:
      - .github/workflows/forward-compatibility.yml
  schedule:
  - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  TRAVIS_OS_NAME: linux
  SPEC_SPLIT_DOTS: 160

jobs:
  # Test against *each* supported Crystal version for forward compatibility.
  #
  # This workflow runs on a nightly schedule on `master`.
  # It can also be dispatched manually when necessary.
  #
  # We run a basic version of this test on every commit which covers only the earliest and latest supported versions in `linux.yml#x86_64-gnu-test`.
  x86_64-gnu-test-forward_compatibility:
    env:
      ARCH: x86_64
      ARCH_CMD: linux64
      CRYSTAL_BOOTSTRAP_VERSION: ${{ matrix.crystal_bootstrap_version }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        crystal_bootstrap_version: [1.7.3, 1.8.2, 1.9.2, 1.10.1, 1.11.2, 1.12.2, 1.13.3, 1.14.1, 1.15.1, 1.16.3, 1.17.1, 1.18.2]
        env: [{}]
        include:
          # libffi is only available starting from the 1.2.2 build images
          # pcre2 is only available starting from the 1.7.0 build images
          - crystal_bootstrap_version: 1.1.1
            env:
              FLAGS: -Dwithout_ffi
              USE_PCRE1: true
          - crystal_bootstrap_version: 1.2.2
            env:
              USE_PCRE1: true
          - crystal_bootstrap_version: 1.3.2
            env:
              USE_PCRE1: true
          - crystal_bootstrap_version: 1.4.1
            env:
              USE_PCRE1: true
          - crystal_bootstrap_version: 1.5.1
            env:
              USE_PCRE1: true
          - crystal_bootstrap_version: 1.6.2
            env:
              USE_PCRE1: true
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Test
        run: bin/ci build
        env: ${{ matrix.env }}


================================================
FILE: .github/workflows/interpreter.yml
================================================
name: Interpreter Test

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160

jobs:
  test-interpreter_spec:
    runs-on: ubuntu-24.04
    container:
      image: crystallang/crystal:1.19.1-build
    name: "Test Interpreter"
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Test interpreter_spec
        run: make interpreter_spec junit_output=.junit/interpreter_spec.xml

  build-interpreter:
    runs-on: ubuntu-24.04
    container:
      image: crystallang/crystal:1.19.1-build
    name: Build interpreter
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Build compiler
        run: make interpreter=1 release=1

      - name: Upload compiler artifact
        uses: actions/upload-artifact@v7
        with:
          name: crystal-interpreter
          path: |
            .build/crystal

  test-interpreter-std_spec:
    needs: build-interpreter
    runs-on: ubuntu-24.04
    container:
      image: crystallang/crystal:1.19.1-build
    strategy:
      fail-fast: false
      matrix:
        part: [0, 1, 2, 3]
    name: "Test std_spec with interpreter (${{ matrix.part }})"
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download compiler artifact
        uses: actions/download-artifact@v8
        with:
          name: crystal-interpreter
          path: .build/

      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal

      - name: Run std_spec with interpreter
        run: SPEC_SPLIT="${{ matrix.part }}%4" bin/crystal i spec/std_spec.cr -- --junit_output .junit/interpreter-std_spec.${{ matrix.part }}.xml

  test-interpreter-primitives_spec:
    needs: build-interpreter
    runs-on: ubuntu-24.04
    container:
      image: crystallang/crystal:1.19.1-build
    name: "Test primitives_spec with interpreter"
    steps:
      - uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download compiler artifact
        uses: actions/download-artifact@v8
        with:
          name: crystal-interpreter
          path: .build/

      - name: Mark downloaded compiler as executable
        run: chmod +x .build/crystal

      - name: Run primitives_spec with interpreter
        run: bin/crystal i spec/primitives_spec.cr -- --junit_output .junit/interpreter-primitives_spec.xml


================================================
FILE: .github/workflows/lint.yml
================================================
name: Lint
on:
  push:
  pull_request:
  workflow_dispatch:

permissions: {}

jobs:
  prek:
    runs-on: ubuntu-latest
    steps:
      - name: Download source
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          persist-credentials: false
          fetch-depth: 0
      - uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
        with:
          nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/e99215c1a21cab2a995a3d01fe20d5714addea27.tar.gz # nixpkgs-unstable@2026-03-06 (with devenv 2.0)
      - uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
        with:
          name: devenv
      - name: Install devenv.sh
        run: nix profile install nixpkgs#devenv
      - name: "Download target branch: ${{ github.base_ref || 'master' }}"
        run: git fetch origin "${TARGET_BRANCH}"
      - name: Check whether to run full test on all files
        id: test_full_run
        if: ${{ github.event_name != 'workflow_dispatch' }}
        run: |
          # Trigger full run if devenv.lock or this workflow file changed
          if git diff --quiet "origin/${TARGET_BRANCH}" HEAD -- devenv.lock .github/workflows/lint.yml; then
            echo "test_full_run=false" >> "$GITHUB_OUTPUT"
          else
            echo "test_full_run=true" >> "$GITHUB_OUTPUT"
          fi
      - name: Run prek on all files
        id: run_full
        run: prek run --all-files
        shell: devenv --profile lint shell bash -- -e {0}
        if: ${{ github.event_name == 'workflow_dispatch' || steps.test_full_run.outputs.test_full_run == 'true' }}
      - name: Run prek hooks for changes against target branch (${{ github.base_ref || 'master' }})
        run: prek run --from-ref "origin/${TARGET_BRANCH}" --to-ref HEAD
        shell: devenv --profile lint shell bash -- -e {0}
        if: "${{ steps.run_full.outcome == 'skipped' }}"
    env:
      TARGET_BRANCH: "${{ github.base_ref || 'master' }}"


================================================
FILE: .github/workflows/linux.yml
================================================
name: Linux CI

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  TRAVIS_OS_NAME: linux
  SPEC_SPLIT_DOTS: 160

jobs:
  # Test against latest release and the earliest supported Crystal version for forward compatibility.
  #
  # A more advanced test which runs against *each* supported version is available in `forward-compatibility.yml` and
  # runs regularly on a nightly schedule.
  test:
    env:
      ARCH: ${{ matrix.arch }}
      ARCH_CMD: linux64
    runs-on: ${{ case(startsWith(matrix.arch, 'aarch64'), 'ubuntu-24.04-arm', 'ubuntu-latest') }}
    strategy:
      fail-fast: false
      matrix:
        arch:
          - x86_64
          - x86_64-musl
          - aarch64
          - aarch64-musl
        env: [{}]
        include:
          - arch: x86_64
            env:
              CRYSTAL_BOOTSTRAP_VERSION: 1.0.0
              # libffi is only available starting from the 1.2.2 build images
              FLAGS: "-Dwithout_ffi"
              # pcre2 is only available starting from the 1.7.0 build images
              USE_PCRE1: true
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Test
        run: bin/ci build
        env: ${{ matrix.env }}

  test-std:
    env:
      ARCH: ${{ matrix.arch }}
      ARCH_CMD: linux64
    runs-on: ${{ case(startsWith(matrix.arch, 'aarch64'), 'ubuntu-24.04-arm', 'ubuntu-latest') }}
    strategy:
      fail-fast: false
      matrix:
        arch:
          - x86_64
          - aarch64
        opts:
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
            workers: 1
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
            workers: 4
        include:
          - arch: x86_64
            opts:
              flags: "-Devloop=libevent"
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: |
          bin/ci prepare_build
          bin/ci with_build_env crystal version

      - name: Test
        run: bin/ci with_build_env 'CRYSTAL_WORKERS=${{ matrix.opts.workers || 1 }} make std_spec threads=1 FLAGS="${{ matrix.opts.flags }}"'

  check_format:
    env:
      ARCH: x86_64
      ARCH_CMD: linux64
    runs-on: ubuntu-latest
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Check Format
        run: bin/ci format

  lint_spellcheck:
    name: Spell Check with Typos
    runs-on: ubuntu-latest
    steps:
    - name: Checkout Actions Repository
      uses: actions/checkout@v6
      with:
        persist-credentials: false

    - name: Spell Check Repo
      uses: crate-ci/typos@631208b7aac2daa8b707f55e7331f9112b0e062d # v1.44.0
      env:
        CLICOLOR: 1

  lint_ameba:
    runs-on: ubuntu-latest
    container: ghcr.io/crystal-ameba/ameba:sha-d861f4ed0f904e0ecdad11c26f98e968f7d95afa # 1.7.0-dev
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - run: ameba


================================================
FILE: .github/workflows/llvm.yml
================================================
name: LLVM CI

on:
  push:
    paths:
      - 'src/compiler/crystal/codegen/**'
      - 'src/llvm/**'
      - 'spec/std/llvm/**'
      - 'spec/llvm-ir/**'
      - 'spec/compiler/codegen/**'
      - '.github/workflows/llvm.yml'
  pull_request:
    paths:
      - 'src/compiler/crystal/codegen/**'
      - 'src/llvm/**'
      - 'spec/std/llvm/**'
      - 'spec/llvm-ir/**'
      - 'spec/compiler/codegen/**'
      - '.github/workflows/llvm.yml'
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160

jobs:
  llvm_test:
    runs-on: ${{ matrix.runs-on }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - {llvm_version: 13, runs-on: ubuntu-22.04, codename: jammy}
          - {llvm_version: 14, runs-on: ubuntu-22.04, codename: jammy}
          - {llvm_version: 15, runs-on: ubuntu-22.04, codename: jammy}
          - {llvm_version: 16, runs-on: ubuntu-22.04, codename: jammy}
          - {llvm_version: 17, runs-on: ubuntu-24.04, codename: noble}
          - {llvm_version: 18, runs-on: ubuntu-24.04, codename: noble}
          - {llvm_version: 19, runs-on: ubuntu-24.04, codename: noble}
          - {llvm_version: 20, runs-on: ubuntu-24.04, codename: noble}
          - {llvm_version: 21, runs-on: ubuntu-24.04, codename: noble}
          - {llvm_version: 22, runs-on: ubuntu-24.04, codename: noble}
          - {runs-on: ubuntu-24.04, codename: noble}
    name: "LLVM ${{ matrix.llvm_version || 'Nightly' }}"
    steps:
      - name: Checkout Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Install LLVM ${{ matrix.llvm_version || 'Nightly' }}
        run: |
          sudo apt remove 'llvm-*' 'libllvm*'
          wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
          sudo apt-add-repository -y \
            deb \
            http://apt.llvm.org/${{ matrix.codename }}/ \
            llvm-toolchain-${{ matrix.codename }}${{ matrix.llvm_version && format('-{0}', matrix.llvm_version) || '' }} \
            main
          sudo apt install -y llvm${{ matrix.llvm_version && format('-{0}', matrix.llvm_version) || '' }}-dev lld

      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1
        with:
          crystal: "1.19.1"

      - name: Build libllvm_ext
        run: make -B deps

      - name: Test compiler_spec
        run: make compiler_spec junit_output=.junit/compiler_spec.xml

      - name: Integration test
        run: make crystal std_spec threads=1 junit_output=.junit/std_spec.xml


================================================
FILE: .github/workflows/macos.yml
================================================
name: macOS CI

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160
  CI_NIX_SHELL: true

jobs:
  darwin-test:
    runs-on: ${{ matrix.runs-on }}
    name: "${{ matrix.runs-on }} (${{ matrix.arch }})"
    strategy:
      fail-fast: false
      matrix:
        include:
        - runs-on: macos-15-intel
          arch: x86_64-darwin
        - runs-on: macos-14
          arch: aarch64-darwin
        - runs-on: macos-15
          arch: aarch64-darwin
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
        with:
          extra_nix_config: |
            experimental-features = nix-command

      - uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
        with:
          name: crystal-ci
          signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Test
        run: bin/ci build

      - name: Test interpreter
        run: bin/ci with_build_env 'make interpreter_spec'

  test-std:
    runs-on: macos-15
    strategy:
      fail-fast: false
      matrix:
        opts:
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
            workers: 1
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
            workers: 4
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31
        with:
          extra_nix_config: |
            experimental-features = nix-command

      - uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
        with:
          name: crystal-ci
          signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'

      - name: Prepare System
        run: bin/ci prepare_system

      - name: Prepare Build
        run: bin/ci prepare_build

      - name: Test
        run: bin/ci with_build_env 'CRYSTAL_WORKERS=${{ matrix.opts.workers || 1 }} make std_spec threads=1 FLAGS="${{ matrix.opts.flags }}"'


================================================
FILE: .github/workflows/mingw-w64-steps.yml
================================================
name: MinGW-w64 CI / Build

on:
  workflow_call:
    inputs:
      arch:
        required: true
        type: string
      runs-on:
        required: true
        type: string
      msystem:
        required: true
        type: string
      mingw-package-prefix:
        required: true
        type: string

permissions: {}

jobs:
  build:
    runs-on: ${{ inputs.runs-on }}
    steps:
      - name: Setup MSYS2
        id: msys2
        uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
        with:
          msystem: ${{ inputs.msystem }}
          update: true
          install: >-
            git
            make
            ${{ inputs.mingw-package-prefix }}-pkgconf
            ${{ inputs.mingw-package-prefix }}-llvm
            ${{ inputs.mingw-package-prefix }}-crystal

      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Build Crystal
        shell: msys2 {0}
        run: make crystal interpreter=1 release=1

      - name: Package Crystal
        shell: msys2 {0}
        run: make install install_dlls deref_symlinks=1 PREFIX="$(pwd)/crystal"

      - name: Download shards release
        uses: actions/checkout@v6
        with:
          repository: crystal-lang/shards
          ref: v0.20.0
          path: shards
          persist-credentials: false

      - name: Build shards release
        shell: msys2 {0}
        working-directory: ./shards
        run: make CRYSTAL=$(pwd)/../crystal/bin/crystal SHARDS=false release=1

      - name: Package Shards
        shell: msys2 {0}
        working-directory: ./shards
        run: |
          make install PREFIX="$(pwd)/../crystal" SHARDS=false
          # FIXME: remove after crystal-lang/shards#668
          ldd bin/shards.exe | grep -iv ' => /c/windows/system32' | sed 's/.* => //; s/ (.*//' | xargs -t -i /usr/bin/install -m 0755 '{}' "$(pwd)/../crystal/bin/"

      - name: Upload Crystal executable
        uses: actions/upload-artifact@v7
        with:
          name: ${{ inputs.arch }}-mingw-w64-crystal
          path: crystal

  test-stdlib:
    runs-on: ${{ inputs.runs-on }}
    steps:
      - name: Setup MSYS2
        id: msys2
        uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
        with:
          msystem: ${{ inputs.msystem }}
          update: true
          install: >-
            git
            make
            ${{ inputs.mingw-package-prefix }}-pkgconf
            ${{ inputs.mingw-package-prefix }}-llvm
            ${{ inputs.mingw-package-prefix }}-crystal

      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Run stdlib specs
        shell: msys2 {0}
        run: |
          export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
          make std_spec

  test-compiler:
    runs-on: ${{ inputs.runs-on }}
    needs: [build]
    steps:
      - name: Setup MSYS2
        id: msys2
        uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
        with:
          msystem: ${{ inputs.msystem }}
          update: true
          install: >-
            git
            make
            ${{ inputs.mingw-package-prefix }}-pkgconf
            ${{ inputs.mingw-package-prefix }}-llvm
            ${{ inputs.mingw-package-prefix }}-crystal

      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: ${{ inputs.arch }}-mingw-w64-crystal
          path: crystal

      - name: Copy compiler build into place
        run: mkdir .build/ && cp crystal/bin/crystal.exe .build/

      - name: Run compiler specs
        shell: msys2 {0}
        run: |
          export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
          make compiler_spec

      - name: Run interpreter specs
        shell: msys2 {0}
        run: |
          export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
          make interpreter_spec

      - name: Run primitives specs
        shell: msys2 {0}
        run: |
          export CRYSTAL_SPEC_COMPILER_BIN="$(which crystal.exe)"
          make -o .build/crystal.exe primitives_spec # we know the compiler is fresh; do not rebuild it here
        env:
          SPEC_FLAGS: --tag=~external_commands # skip exec_external_command spec because it doesn't work with this setup


================================================
FILE: .github/workflows/mingw-w64.yml
================================================
name: MinGW-w64 CI

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160

jobs:
  x86_64-mingw-w64:
    name: UCRT64
    uses: ./.github/workflows/mingw-w64-steps.yml
    with:
      arch: x86_64
      runs-on: windows-2025
      msystem: UCRT64
      mingw-package-prefix: mingw-w64-ucrt-x86_64

  aarch64-mingw-w64:
    name: CLANGARM64
    uses: ./.github/workflows/mingw-w64-steps.yml
    with:
      arch: aarch64
      runs-on: windows-11-arm
      msystem: CLANGARM64
      mingw-package-prefix: mingw-w64-clang-aarch64


================================================
FILE: .github/workflows/openssl.yml
================================================
name: OpenSSL CI

on:
  push:
    paths:
      - 'src/openssl/**'
      - 'spec/std/digest/**'
      - 'spec/std/openssl/**'
      - '.github/workflows/openssl.yml'
  pull_request:
    paths:
      - 'src/openssl/**'
      - 'spec/std/digest/**'
      - 'spec/std/openssl/**'
      - '.github/workflows/openssl.yml'
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

jobs:
  libssl_test:
    runs-on: ubuntu-latest
    name: "${{ matrix.pkg }}"
    container: crystallang/crystal:1.19.1-alpine
    strategy:
      fail-fast: false
      matrix:
        include:
          - pkg: "openssl1.1-compat-dev=~1.1.1"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.18/community
          - pkg: "openssl-dev=~3.0"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.17/main
          - pkg: "openssl-dev=~3.3"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/main
          - pkg: "openssl-dev"
            repository: http://dl-cdn.alpinelinux.org/alpine/edge/main
          - pkg: "libressl-dev=~3.4"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.15/community
          - pkg: "libressl-dev=~3.5"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.16/community
          - pkg: "libressl-dev=~3.8"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/community
          - pkg: "libressl-dev"
            repository: http://dl-cdn.alpinelinux.org/alpine/edge/community
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Uninstall openssl and conflicts
        run: apk del openssl-dev openssl-libs-static libxml2-static
      - name: Install ${{ matrix.pkg }}
        run: apk add "${{ matrix.pkg }}" --repository=${{ matrix.repository }}
      - name: Print LibSSL version
        run: bin/crystal eval 'require "openssl"; p! LibSSL::OPENSSL_VERSION, LibSSL::LIBRESSL_VERSION'
      - name: Run OpenSSL specs
        run: bin/crystal spec --order=random spec/std/openssl/


================================================
FILE: .github/workflows/regex-engine.yml
================================================
name: Regex Engine CI

on:
  push:
    paths:
      - 'src/regex.cr'
      - 'src/regex/**'
      - 'spec/std/regex_spec.cr'
      - 'spec/std/regex/**'
      - '.github/workflows/regex-engine.yml'
  pull_request:
    paths:
      - 'src/regex.cr'
      - 'src/regex/**'
      - 'spec/std/regex_spec.cr'
      - 'spec/std/regex/**'
      - '.github/workflows/regex-engine.yml'
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

jobs:
  pcre:
    runs-on: ubuntu-latest
    name: "PCRE"
    container: crystallang/crystal:1.19.1-alpine
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Remove PCRE2
        run: apk del pcre2-dev
      - name: Assert using PCRE
        run: bin/crystal eval 'abort unless Regex::Engine == Regex::PCRE'
      - name: Show PCRE config
        run: bin/crystal scripts/print_regex_config.cr
      - name: Run Regex specs
        run: bin/crystal spec --order=random spec/std/regex*
  pcre2:
    runs-on: ubuntu-latest
    name: "PCRE2"
    container: crystallang/crystal:1.19.1-alpine
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Assert using PCRE2
        run: bin/crystal eval 'abort unless Regex::Engine == Regex::PCRE2'
      - name: Assert select PCRE
        run: bin/crystal eval -Duse_pcre 'abort unless Regex::Engine == Regex::PCRE'
      - name: Show PCRE2 config
        run: bin/crystal scripts/print_regex_config.cr
      - name: Run Regex specs
        run: bin/crystal spec --order=random spec/std/regex*


================================================
FILE: .github/workflows/smoke.yml
================================================
# These jobs are smoke tests for platforms where we don't run full tests.
# They ensure that std_spec, compiler_spec and the compiler itself at least
# compile for the target with --cross-compile. But the binaries are not linked
# and executed. So this does not validate correct behaviour.
#
# The list of supported platforms is extracted from the lib_c bindings:
#
# ```terminal-session
# $ find src/lib_c -maxdepth 1 -mindepth 1 -type d -printf '%P\n' | sort
# aarch64-android
# aarch64-darwin
# aarch64-linux-gnu
# aarch64-linux-musl
# arm-linux-gnueabihf
# i386-linux-gnu
# i386-linux-musl
# wasm32-wasi
# x86_64-darwin
# x86_64-dragonfly
# x86_64-freebsd
# x86_64-linux-gnu
# x86_64-linux-musl
# x86_64-netbsd
# x86_64-openbsd
# x86_64-solaris
# x86_64-windows-msvc
# ```
#
# Platforms for which we currently run full tests are excluded from this workflow.
name: Smoke tests

on:
  push:
    paths:
      - 'src/lib_c/**'
      - 'src/crystal/system/**'
      - '.github/workflows/smoke.yml'
  pull_request:
    paths:
      - 'src/lib_c/**'
      - 'src/crystal/system/**'
      - '.github/workflows/smoke.yml'
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  TRAVIS_OS_NAME: linux
  ARCH: x86_64
  ARCH_CMD: linux64

jobs:
  smoke-test:
    name: ${{ matrix.target }}
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      max-parallel: 2
      matrix:
        target:
          - aarch64-linux-android
          - arm-linux-gnueabihf
          - i386-linux-gnu
          - i386-linux-musl
          - x86_64-dragonfly
          - x86_64-freebsd
          - x86_64-netbsd
          - x86_64-openbsd
          - x86_64-solaris

    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Build fresh compiler
        run: bin/ci with_build_env make

      - name: Run smoke test
        run: bin/ci with_build_env make simple_smoke_test target=${{ matrix.target }}


================================================
FILE: .github/workflows/update-devenv.yml
================================================
name: Update devenv

on:
  schedule:
    - cron: "0 3 * * 2" # Weekly on Tuesdays
  push:
    branches:
      - master
    paths:
      - '.github/workflows/update-devenv.yml'
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  update-devenv:
    if: github.repository == 'crystal-lang/crystal'
    runs-on: ubuntu-latest

    steps:
      - name: Download source
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          ref: master
          persist-credentials: false

      - uses: cachix/install-nix-action@1ca7d21a94afc7c957383a2d217460d980de4934 # v31

      - uses: cachix/cachix-action@3ba601ff5bbb07c7220846facfa2cd81eeee15a1 # v16
        with:
          name: devenv

      - name: Install devenv.sh
        run: nix profile add nixpkgs#devenv

      - name: Update devenv.lock
        run: devenv update

      - name: Check for changes
        id: changes
        run: |
          git add devenv.lock
          if git diff --cached --quiet; then
            echo "changed=false" >>"$GITHUB_OUTPUT"
          else
            echo "changed=true" >>"$GITHUB_OUTPUT"
          fi

      - name: Create PR
        if: steps.changes.outputs.changed == 'true'
        uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8
        with:
          commit-message: "Update `devenv.lock`"
          title: "Update `devenv.lock`"
          body: ""
          labels: "topic:infrastructure"
          branch: infra/update-devenv
          delete-branch: true


================================================
FILE: .github/workflows/wasm32.yml
================================================
name: WebAssembly CI

on: [push, pull_request]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160

jobs:
  wasm32-test:
    runs-on: ubuntu-24.04
    container: crystallang/crystal:1.19.1-build
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Install wasmtime
        uses: mwilliamson/setup-wasmtime-action@bf814d7d8fc3c3a77dfe114bd9fb8a2c575f6ad6 #v2
        with:
          wasmtime-version: "2.0.0"

      - name: Install LLVM
        run: |
          apt-get update
          apt-get remove -y 'llvm-*' 'libllvm*'
          apt-get install -y curl software-properties-common
          wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
          apt-add-repository -y deb http://apt.llvm.org/noble/ llvm-toolchain-noble-18 main
          apt-get install -y llvm-18-dev lld-18
          ln -s "$(which wasm-ld-18)" /usr/bin/wasm-ld

      - name: Download wasm32 libs
        run: |
          mkdir wasm32-wasi-libs
          curl -LO https://github.com/lbguilherme/wasm-libs/releases/download/0.0.3/wasm32-wasi-libs.tar.gz
          echo "cd36f319f8f9f9cd08f723d10e6ec2b92f2e44d3ce3b20344b8041386d85c261  wasm32-wasi-libs.tar.gz" | sha256sum -c -
          tar -f wasm32-wasi-libs.tar.gz -C wasm32-wasi-libs -xz
          rm wasm32-wasi-libs.tar.gz

      - name: Build spec/wasm32_std_spec.cr
        run: bin/crystal build spec/wasm32_std_spec.cr -o wasm32_std_spec.wasm --target wasm32-wasi -Dwithout_iconv -Dwithout_openssl
        env:
          CRYSTAL_LIBRARY_PATH: ${{ github.workspace }}/wasm32-wasi-libs

      - name: Run wasm32_std_spec.wasm
        run: |
          wasmtime run wasm32_std_spec.wasm


================================================
FILE: .github/workflows/win.yml
================================================
name: Windows CI

on: [push, pull_request, workflow_dispatch]

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
  SPEC_SPLIT_DOTS: 160
  CI_LLVM_VERSION: "20.1.7"
  CI_LLVM_TARGETS: "X86,AArch64"
  CI_LLVM_LDFLAGS: "psapi.lib shell32.lib ole32.lib uuid.lib advapi32.lib ws2_32.lib ntdll.lib"

jobs:
  x86_64-windows-libs:
    runs-on: windows-2025
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Cache libraries
        id: cache-libs
        uses: actions/cache@v5
        with:
          path: | # openssl and llvm take much longer to build so they are cached separately
            libs/pcre.lib
            libs/pcre2-8.lib
            libs/iconv.lib
            libs/gc.lib
            libs/ffi.lib
            libs/z.lib
            libs/mpir.lib
            libs/yaml.lib
            libs/xml2.lib
            libs/libxml_VERSION
          key: win-libs-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
      - name: Set up Cygwin
        if: steps.cache-libs.outputs.cache-hit != 'true'
        uses: cygwin/cygwin-install-action@711d29f3da23c9f4a1798e369a6f01198c13b11a # v6
        with:
          packages: make
          install-dir: C:\cygwin64
          add-to-path: false
      - name: Build libgc
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-gc.ps1 -BuildTree deps\gc -Version 8.2.8 -AtomicOpsVersion 7.8.2
      - name: Build libpcre
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-pcre.ps1 -BuildTree deps\pcre -Version 8.45
      - name: Build libpcre2
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-pcre2.ps1 -BuildTree deps\pcre2 -Version 10.45
      - name: Build libiconv
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-iconv.ps1 -BuildTree deps\iconv -Version 1.18
      - name: Build libffi
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-ffi.ps1 -BuildTree deps\ffi -Version 3.5.1
      - name: Build zlib
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-z.ps1 -BuildTree deps\z -Version 1.3.1
      - name: Build mpir
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-mpir.ps1 -BuildTree deps\mpir
      - name: Build libyaml
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-yaml.ps1 -BuildTree deps\yaml -Version 0.2.5
      - name: Build libxml2
        if: steps.cache-libs.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-xml2.ps1 -BuildTree deps\xml2 -Version 2.13.8

      - name: Cache OpenSSL
        id: cache-openssl
        uses: actions/cache@v5
        with:
          path: |
            libs/crypto.lib
            libs/ssl.lib
            libs/openssl_VERSION
          key: win-openssl-libs-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
      - name: Set up NASM
        if: steps.cache-openssl.outputs.cache-hit != 'true'
        uses: ilammy/setup-nasm@72793074d3c8cdda771dba85f6deafe00623038b # v1.5.2
      - name: Build OpenSSL
        if: steps.cache-openssl.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-openssl.ps1 -BuildTree deps\openssl -Version 3.5.0

  x86_64-windows-dlls:
    runs-on: windows-2025
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Cache libraries
        id: cache-dlls
        uses: actions/cache@v5
        with:
          path: | # openssl and llvm take much longer to build so they are cached separately
            libs/pcre-dynamic.lib
            libs/pcre2-8-dynamic.lib
            libs/iconv-dynamic.lib
            libs/gc-dynamic.lib
            libs/ffi-dynamic.lib
            libs/z-dynamic.lib
            libs/mpir-dynamic.lib
            libs/yaml-dynamic.lib
            libs/xml2-dynamic.lib
            dlls/pcre.dll
            dlls/pcre2-8.dll
            dlls/iconv-2.dll
            dlls/gc.dll
            dlls/libffi.dll
            dlls/zlib1.dll
            dlls/mpir.dll
            dlls/yaml.dll
            dlls/libxml2.dll
          key: win-dlls-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
      - name: Set up Cygwin
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        uses: cygwin/cygwin-install-action@711d29f3da23c9f4a1798e369a6f01198c13b11a # v6
        with:
          packages: make
          install-dir: C:\cygwin64
          add-to-path: false
      - name: Build libgc
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-gc.ps1 -BuildTree deps\gc -Version 8.2.8 -AtomicOpsVersion 7.8.2 -Dynamic
      - name: Build libpcre
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-pcre.ps1 -BuildTree deps\pcre -Version 8.45 -Dynamic
      - name: Build libpcre2
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-pcre2.ps1 -BuildTree deps\pcre2 -Version 10.45 -Dynamic
      - name: Build libiconv
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-iconv.ps1 -BuildTree deps\iconv -Version 1.18 -Dynamic
      - name: Build libffi
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-ffi.ps1 -BuildTree deps\ffi -Version 3.4.7 -Dynamic
      - name: Build zlib
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-z.ps1 -BuildTree deps\z -Version 1.3.1 -Dynamic
      - name: Build mpir
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-mpir.ps1 -BuildTree deps\mpir -Dynamic
      - name: Build libyaml
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-yaml.ps1 -BuildTree deps\yaml -Version 0.2.5 -Dynamic
      - name: Build libxml2
        if: steps.cache-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-xml2.ps1 -BuildTree deps\xml2 -Version 2.13.6 -Dynamic

      - name: Cache OpenSSL
        id: cache-openssl-dlls
        uses: actions/cache@v5
        with:
          path: |
            libs/crypto-dynamic.lib
            libs/ssl-dynamic.lib
            dlls/libcrypto-3-x64.dll
            dlls/libssl-3-x64.dll
          key: win-openssl-dlls-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
      - name: Set up NASM
        if: steps.cache-openssl-dlls.outputs.cache-hit != 'true'
        uses: ilammy/setup-nasm@72793074d3c8cdda771dba85f6deafe00623038b # v1.5.2
      - name: Build OpenSSL
        if: steps.cache-openssl-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-openssl.ps1 -BuildTree deps\openssl -Version 3.4.1 -Dynamic

  x86_64-windows-llvm-dlls:
    runs-on: windows-2025
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Cache LLVM
        id: cache-llvm-dlls
        uses: actions/cache@v5
        with:
          path: |
            libs/llvm_VERSION
            libs/llvm-dynamic.lib
            dlls/LLVM-C.dll
          key: llvm-dlls-${{ env.CI_LLVM_VERSION }}-${{ hashFiles('etc/win-ci/build-llvm.ps1') }}-msvc
      - name: Build LLVM
        if: steps.cache-llvm-dlls.outputs.cache-hit != 'true'
        run: .\etc\win-ci\build-llvm.ps1 -BuildTree deps\llvm -Version ${{ env.CI_LLVM_VERSION }} -TargetsToBuild ${{ env.CI_LLVM_TARGETS }} -Dynamic

  x86_64-windows-release:
    needs: [x86_64-windows-libs, x86_64-windows-dlls, x86_64-windows-llvm-dlls]
    uses: ./.github/workflows/win_build_portable.yml
    with:
      release: true
      llvm_version: "20.1.7"
      llvm_targets: "X86,AArch64"
      llvm_ldflags: "psapi.lib shell32.lib ole32.lib uuid.lib advapi32.lib ws2_32.lib ntdll.lib"

  x86_64-windows-test:
    runs-on: windows-2025
    needs: [x86_64-windows-release]
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal
          path: build

      - name: Set up environment
        run: |
          Add-Content $env:GITHUB_PATH "$(pwd)\build"
          Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
          Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
          Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
          Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"

      - name: Run stdlib specs
        run: make -f Makefile.win std_spec

      - name: Run compiler specs
        run: make -f Makefile.win compiler_spec

      - name: Run interpreter specs
        run: make -f Makefile.win interpreter_spec

      - name: Run primitives specs
        run: make -f Makefile.win -o .build\crystal.exe primitives_spec # we know the compiler is fresh; do not rebuild it here

      - name: Build samples
        run: make -f Makefile.win samples

  test-std:
    runs-on: windows-2025
    needs: [x86_64-windows-release]
    strategy:
      fail-fast: false
      matrix:
        opts:
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: concurrent
            workers: 1
          - flags: "-Dexecution_context -Dpreview_mt" # execution_context: parallel
            workers: 4
    steps:
      - name: Disable CRLF line ending substitution
        run: git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal
          path: build

      - name: Set up environment
        run: |
          Add-Content $env:GITHUB_PATH "$(pwd)\build"
          Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
          Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
          Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
          Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"

      - name: Test
        run: make -f Makefile.win std_spec FLAGS="${{ matrix.opts.flags }}"
        env:
          CRYSTAL_WORKERS: ${{ matrix.opts.workers || 1 }}

  x86_64-windows-test-interpreter:
    runs-on: windows-2025
    needs: [x86_64-windows-release]
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal
          path: build

      - name: Set up environment
        run: |
          Add-Content $env:GITHUB_PATH "$(pwd)\build"
          Add-Content $env:GITHUB_ENV "CRYSTAL_SPEC_COMPILER_BIN=$(pwd)\build\crystal.exe"
          Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
          Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
          Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"

      - name: Run stdlib specs with interpreter
        run: bin\crystal i spec\std_spec.cr

      - name: Run primitives specs with interpreter
        run: bin\crystal i spec\primitives_spec.cr

  x86_64-windows-installer:
    if: github.repository_owner == 'crystal-lang' && (startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/ci/'))
    runs-on: windows-2025
    needs: [x86_64-windows-release]
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Download Crystal executable
        uses: actions/download-artifact@v8
        with:
          name: crystal
          path: etc/win-ci/portable

      - name: Set up Inno Setup
        run: |
          Invoke-WebRequest -Uri https://jrsoftware.org/download.php/is.exe -OutFile C:\is.exe
          C:\is.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART

      - name: Set up environment
        run: |
          Add-Content $env:GITHUB_PATH "$(pwd)\etc\win-ci\portable"
          Add-Content $env:GITHUB_ENV "LLVM_VERSION=${{ env.CI_LLVM_VERSION }}"
          Add-Content $env:GITHUB_ENV "LLVM_TARGETS=${{ env.CI_LLVM_TARGETS }}"
          Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=${{ env.CI_LLVM_LDFLAGS }}"

      - name: Build docs
        run: make -f Makefile.win install_docs prefix=etc\win-ci\portable

      - name: Build installer
        working-directory: ./etc/win-ci
        run: |
          & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" crystal.iss

      - name: Upload Crystal installer
        uses: actions/upload-artifact@v7
        with:
          name: crystal-installer
          path: etc/win-ci/Output/crystal-setup.exe


================================================
FILE: .github/workflows/win_build_portable.yml
================================================
name: Windows CI / Build Portable Package

on:
  workflow_call:
    inputs:
      release:
        required: true
        type: boolean
      llvm_version:
        required: true
        type: string
      llvm_targets:
        required: true
        type: string
      llvm_ldflags:
        required: true
        type: string

permissions: {}

jobs:
  build:
    runs-on: windows-2025
    steps:
      - name: Disable CRLF line ending substitution
        run: |
          git config --global core.autocrlf false

      - name: Enable Developer Command Prompt
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0

      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1
        id: install-crystal
        with:
          crystal: "1.19.1"

      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false

      - name: Restore libraries
        uses: actions/cache/restore@v5
        with:
          path: |
            libs/pcre.lib
            libs/pcre2-8.lib
            libs/iconv.lib
            libs/gc.lib
            libs/ffi.lib
            libs/z.lib
            libs/mpir.lib
            libs/yaml.lib
            libs/xml2.lib
            libs/libxml_VERSION
          key: win-libs-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
          fail-on-cache-miss: true
      - name: Restore OpenSSL
        uses: actions/cache/restore@v5
        with:
          path: |
            libs/crypto.lib
            libs/ssl.lib
            libs/openssl_VERSION
          key: win-openssl-libs-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
          fail-on-cache-miss: true
      - name: Restore DLLs
        uses: actions/cache/restore@v5
        with:
          path: |
            libs/pcre-dynamic.lib
            libs/pcre2-8-dynamic.lib
            libs/iconv-dynamic.lib
            libs/gc-dynamic.lib
            libs/ffi-dynamic.lib
            libs/z-dynamic.lib
            libs/mpir-dynamic.lib
            libs/yaml-dynamic.lib
            libs/xml2-dynamic.lib
            dlls/pcre.dll
            dlls/pcre2-8.dll
            dlls/iconv-2.dll
            dlls/gc.dll
            dlls/libffi.dll
            dlls/zlib1.dll
            dlls/mpir.dll
            dlls/yaml.dll
            dlls/libxml2.dll
          key: win-dlls-${{ hashFiles('.github/workflows/win.yml', 'etc/win-ci/*.ps1') }}-msvc
          fail-on-cache-miss: true
      - name: Restore OpenSSL DLLs
        uses: actions/cache/restore@v5
        with:
          path: |
            libs/crypto-dynamic.lib
            libs/ssl-dynamic.lib
            dlls/libcrypto-3-x64.dll
            dlls/libssl-3-x64.dll
          key: win-openssl-dlls-3.4.1-${{ hashFiles('etc/win-ci/build-openssl.ps1') }}-msvc
          fail-on-cache-miss: true
      - name: Restore LLVM DLLs
        uses: actions/cache/restore@v5
        with:
          path: |
            libs/llvm_VERSION
            libs/llvm-dynamic.lib
            dlls/LLVM-C.dll
          key: llvm-dlls-${{ inputs.llvm_version }}-${{ hashFiles('etc/win-ci/build-llvm.ps1') }}-msvc
          fail-on-cache-miss: true

      - name: Set up environment
        run: |
          Add-Content $env:GITHUB_ENV "CRYSTAL_LIBRARY_PATH=$(pwd)\libs"
          Add-Content $env:GITHUB_ENV "LLVM_VERSION=$env:INPUTS_LLVM_VERSION"
          Add-Content $env:GITHUB_ENV "LLVM_TARGETS=$env:INPUTS_LLVM_TARGETS"
          Add-Content $env:GITHUB_ENV "LLVM_LDFLAGS=$env:INPUTS_LLVM_LDFLAGS"
        env:
          INPUTS_LLVM_VERSION: ${{ inputs.llvm_version }}
          INPUTS_LLVM_TARGETS: ${{ inputs.llvm_targets }}
          INPUTS_LLVM_LDFLAGS: ${{ inputs.llvm_ldflags }}

      - name: Build LLVM extensions
        run: make -f Makefile.win deps

      - name: Build Crystal
        run: |
          bin/crystal.bat env
          make -f Makefile.win -B ${{ inputs.release && 'release=1' || '' }} interpreter=1

      - name: Download shards release
        uses: actions/checkout@v6
        with:
          repository: crystal-lang/shards
          ref: v0.20.0
          path: shards
          persist-credentials: false

      - name: Build shards release
        working-directory: ./shards
        run: make -f Makefile.win ${{ inputs.release && 'release=1' || '' }}

      - name: Gather Crystal binaries
        run: |
          make -f Makefile.win install prefix=crystal
          mkdir crystal/lib
          cp shards/bin/shards.exe crystal/
          cp shards/bin/shards.pdb crystal/
          cp libs/* crystal/lib/
          cp dlls/* crystal/
          cp README.md crystal/

      - name: Upload Crystal binaries
        uses: actions/upload-artifact@v7
        with:
          name: crystal
          path: crystal


================================================
FILE: .github/workflows/xml.yml
================================================
name: XML CI

on:
  push:
    paths:
      - 'spec/std/xml/**'
      - 'src/xml/**'
      - '.github/workflows/xml.yml'
  pull_request:
    paths:
      - 'spec/std/xml/**'
      - 'src/xml/**'
      - '.github/workflows/xml.yml'
  schedule:
    - cron: '0 3 * * *'
  workflow_dispatch:

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

jobs:
  libssl_test:
    runs-on: ubuntu-latest
    name: "${{ matrix.pkg }}"
    container: crystallang/crystal:1.19.1-alpine
    strategy:
      fail-fast: false
      matrix:
        include:
          - pkg: "libxml2-dev=~2.9"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.16/main
          - pkg: "libxml2-dev=~2.12"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.20/main
          - pkg: "libxml2-dev=~2.13"
            repository: http://dl-cdn.alpinelinux.org/alpine/v3.22/main
          - pkg: "libxml2-dev"
            repository: http://dl-cdn.alpinelinux.org/alpine/edge/main
    steps:
      - name: Download Crystal source
        uses: actions/checkout@v6
        with:
          persist-credentials: false
      - name: Uninstall libxml2 and conflicts
        run: apk del libxml2-dev
      - name: Install ${{ matrix.pkg }}
        run: apk add "${{ matrix.pkg }}" --repository=${{ matrix.repository }}
      - name: Print LibXML2 version
        run: bin/crystal eval 'require "xml"; p! XML.libxml2_version'
      - name: Run XML specs
        run: bin/crystal spec --order=random spec/std/xml/


================================================
FILE: .github/zizmor.yml
================================================
rules:
  dangerous-triggers:
    ignore:
      - backport.yml
  unpinned-uses:
    config:
      policies:
        actions/*: ref-pin
        crystal-lang/*: ref-pin


================================================
FILE: .gitignore
================================================
# Environment configuration
/Makefile.local
/Makefile.win.local
.env
.env.*
.envrc
.envrc.*

# Build artifacts
*.o
*.ll
*.s
*.obj
*.dwo
*.dwarf
*.pdb
*.exe
/.build/
/samples/.build/
/docs/
/man/*.gz

# CI
/coverage/
/tmp/
/.junit/

# Devenv
.devenv*
devenv.local.nix
devenv.local.yaml

# direnv
.direnv

# pre-commit
.pre-commit-config.yaml


================================================
FILE: .mailmap
================================================
Ary Borenszweig <asterite@gmail.com> <aborenszweig@manas.com.ar>
Ary Borenszweig <asterite@gmail.com> <ary@esperanto.org.ar>
Ary Borenszweig <asterite@gmail.com> <asterite@gmail.com>
Brian J. Cardiff <bcardiff@gmail.com> <bcardiff@manas.com.ar>
Brian J. Cardiff <bcardiff@gmail.com> <bcardiff@manas.tech>
George Dietrich <dev@dietrich.pub> <yomoejoe@gmail.com>
George Dietrich <dev@dietrich.pub> <george@dietrich.app>
Gustavo Giráldez <ggiraldez@manas.tech> <ggiraldez@manas.com.ar>
Johannes Müller <straightshoota@gmail.com> <johannes.mueller@smj-fulda.org>
Juan Wajnerman <juan.wajnerman@gmail.com> <jwajnerman@manas.com.ar>
Juan Wajnerman <juan.wajnerman@gmail.com> <waj@manas.com.ar>
Juan Wajnerman <juan.wajnerman@gmail.com> <waj@manas.tech>
Julien Reichardt <git@jrei.ch> <mi@jrei.ch>
Martin Verzilli <mverzilli@manas.tech> <mverzilli@manas.com.ar>
Matías García Isaía <mgarcia@manas.tech> <mgarcia@manas.com.ar>
Matías García Isaía <mgarcia@manas.tech> <mgarcia@manas.tech>
Stephanie Hobbs <steph@rx14.co.uk> <chris@rx14.co.uk>


================================================
FILE: .markdownlint.yaml
================================================
default: true

heading-style: "setext"

no-inline-html: false
line-length: false

ol-prefix:
  style: "ordered"
ul-style:
  style: "dash"
ul-indent:
  indent: 2

no-blanks-blockquote: false

emphasis-style:
  style: "underscore"
strong-style:
  style: "asterisk"

no-duplicate-heading:
  siblings_only: true
no-bare-urls: false

fenced-code-language: false
commands-show-output: false

first-line-h1:
  front_matter_title: "^\\s*(page_)?title\\s*[:=]"
  exclude:
    .github/PULL_REQUEST_TEMPLATE/pull_request_template.md

no-alt-text: false

hard_tab:
  code_blocks: false


================================================
FILE: .markdownlintignore
================================================
/lib/


================================================
FILE: .well-known/funding-manifest-urls
================================================
https://crystal-lang.org/funding.json


================================================
FILE: Brewfile
================================================
brew "gmp"
brew "libevent"
brew "pcre"
brew "pkg-config"
brew "openssl@1.1"
brew "llvm@11", link: true, conflicts_with: ["python@2"]


================================================
FILE: CHANGELOG.md
================================================
# Changelog

For information on prior releases, refer to the changelogs in [./doc/changelogs](./doc/changelogs/README.md)


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

- The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
  address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project maintainers in private or by sending an email to [crystal@manas.tech](mailto:crystal@manas.tech). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Crystal

So you've decided to contribute to Crystal. Excellent!

## Using the issue tracker

The [issue tracker](https://github.com/crystal-lang/crystal/issues) is the heart of Crystal's work. Use it for bugs, questions, proposals and feature requests.

Please always **open a new issue before sending a pull request** if you want to add a new feature to Crystal, unless it is a minor fix, and wait until someone from the core team approves it before you actually start working on it. Otherwise, you risk having the pull request rejected, and the effort implementing it goes to waste. And if you start working on an implementation for an issue, please **let everyone know in the comments** so someone else does not start working on the same thing.

Regardless of the kind of issue, please make sure to look for similar existing issues before posting; otherwise, your issue may be flagged as `duplicated` and closed in favour of the original one. Also, once you open a new issue, please make sure to honour the items listed in the issue template.

If you open a question, remember to close the issue once you are satisfied with the answer and you think
there's no more room for discussion. We'll anyway close the issue after some days.

If something is missing from the language it might be that it's not yet implemented or that it was purposely left out. If in doubt, just ask.

Substantial changes go through an [RFC process](https://github.com/crystal-lang/rfcs).

The best place to start an open discussion about potential changes is the [Crystal forum](https://forum.crystal-lang.org/c/crystal-contrib/6).

### What's needed right now

You can find a list of tasks that we consider suitable for a first time contribution with
the [good first issue label](https://github.com/crystal-lang/crystal/contribute).

As you feel more confident, you can keep an eye out for open issues with the following labels:

- [`community:to-research`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-research): Help needed on **researching and investigating** the issue at hand; could be from going through an RFC to figure out how something _should_ be working, to go through details on a C-library we'd like to bind.
- [`community:to-design`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-design): As an issue has been accepted, we are looking for **ideas on how it could be implemented**, this is, a high-level design for the feature at hand.
- [`community:to-implement`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-implement): After a design has been agreed upon, the remaining task is to actually **code** it and send a PR!
- [`community:to-document`](https://github.com/crystal-lang/crystal/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Acommunity%3Ato-document): Similar to the one above, but this one is for those awesome devs that are happy to **contribute with documentation** instead of just code.

Furthermore, these are the most important general topics in need right now, so if you are interested open an issue to start working on it:

- Documenting the language
- Documenting the standard library
- Adding missing bits of the standard library, and/or improving its performance

### Labels

Issue tracker labels are sorted by category: community, kind, pr, status and topic.

#### Community

These are the issues where help from the community is most welcome. See above for a description on `newcomer`, `to-research`, `to-design`, `to-implement` and `to-document`.

Label `in-progress` is used to signal that someone from the community is already working on the issue (since GitHub does not allow for a non-team member to be _assigned_ to an issue).

The label `shard-idea` refers to a feature proposal that, albeit good, is better suited as a separate shard rather than as part of the core library; so if you are looking for a shard of your own to start working on, these issues are good starting points.

#### Kind

The most basic category is the kind of the issue: `bug`, `feature` and `question` speak for themselves, while `refactor` is left for changes that do not actually introduce a new a feature, and are not fixing something that is broken, but rather clean up the code (or documentation!).

#### PR

Pull-request only labels, used to signal that a pull request `needs-review` by a core team member, or that is still `wip` (work in progress).

#### Topic

Topic encompasses the broad aspect of the language that the issue refers to: could be performance, the compiler, the type system, the code formatter, concurrency, and quite a large etc.

#### Status

Status labels attempt to capture the lifecycle of an issue:

- A detailed proposal on a feature is marked as `draft`, while a more general argument is usually labelled as `discussion` until a consensus is achieved.

- An issue is `accepted` when it describes a feature or bugfix that a core team member has agreed to have added to the language, so as soon as a design is discussed (if needed), it's safe to start working on a pull request.

- Bug reports are marked as `needs-more-info`, where the author is requested to provide the info required; note that the issue may be closed after some time if it is not supplied.

- Issues that are batched in an epic to be worked on as a group are typically marked as `deferred`, while low-prio issues or tasks far away in the roadmap are marked as `someday`.

- Closed issues are marked as `implemented`, `invalid`, `duplicate` or `wontfix`, depending on their resolution.

## Contributing

### The documentation

The language reference is available at <https://crystal-lang.org/reference/>.
See the repository at [crystal-lang/crystal-book](https://github.com/crystal-lang/crystal-book) for contributing to it.

The [standard library documentation](https://crystal-lang.org/api/) is on the code itself, in this repository.
The [`master` version](https://crystal-lang.org/api/master/) is updated with every push to the master branch.
It uses a subset of [Markdown](http://daringfireball.net/projects/markdown/). You can [use Ruby as a source
of inspiration](https://twitter.com/yukihiro_matz/status/549317901002342400) whenever applicable. To generate
the docs execute `make docs`. Please follow the guidelines described in our
[language documentation](https://crystal-lang.org/reference/conventions/documenting_code.html), like the use of the third person.

Additionally, all official documentation can be found on [the Crystal website](https://crystal-lang.org/docs/).

### The standard library

1. [Fork](https://github.com/crystal-lang/crystal/fork) and checkout the
   repository <https://github.com/crystal-lang/crystal/>

Once in the cloned directory, and once you [installed Crystal](https://crystal-lang.org/install/),
you can execute `bin/crystal` instead of `crystal`. This is a wrapper that will use the cloned repository
as the standard library. Otherwise the barebones `crystal` executable uses the standard library that comes in
your installation.

Next, make changes to the standard library, making sure you also provide corresponding specs. To run
the specs for the standard library, run `make std_spec`. To run a particular spec: `bin/crystal spec spec/std/array_spec.cr`.
You can use `make help` for a list of available make targets.

Note: at this point you might get long compile error that include "library not found for: ...". This means
you are [missing some libraries](https://github.com/crystal-lang/crystal/wiki/All-required-libraries).

Make sure that your changes follow the recommended [Coding Style](https://crystal-lang.org/reference/conventions/coding_style.html).
You can run `crystal tool format` to automate this.

Then push your changes and create a pull request.

### The compiler itself

If you want to add/change something in the compiler,
the first thing you will need to do is to [install the compiler](https://crystal-lang.org/install/).

Once you have a compiler up and running, check that executing `crystal` on the command line prints its usage.
Now you can setup your environment to compile Crystal itself, which is itself written in Crystal.

The compiler needs [LLVM](https://llvm.org) and some other libraries. See [list of all required libraries](https://github.com/crystal-lang/crystal/wiki/All-required-libraries).

Executing `make crystal` builds the compiler into `.build/compiler` and you can run it using the wrapper script at `bin/crystal`.
The script sets up the proper environment variables that the compiler can find the standard library source files in `src/`.

`make compiler_spec` runs the compiler specs. `make std_spec` runs the standard library specs.
`make primitives_spec` runs the specs for primitive methods with an up-to-date Crystal compiler.
You can use `make help` for a list of available make targets.

## This guide

If this guide is not clear and it needs improvements, please send pull requests against it. Thanks! :-)

## Making good pull requests

The commit history should consist of commits that transform the codebase from one state into another one, motivated by something that
should change, be it a bugfix, a new feature or some ground work to support a new feature, like changing an existing API or introducing
a new isolated class that is later used in the same pull request.

Review history should be preserved in a pull request. If you need to push a change to an open pull request (for example
because specs broke and required a fix, or for applying a review suggestion) these changes should be added as individual
fixup commits. Please do not amend previous commits and force push to the PR branch. This makes reviews much harder
because reference to previous state is hidden.

If changes introduced to `master` branch result in conflicts, it should be merged with a merge commit (`git fetch upstream/master; git merge upstream/master`).

### Minimum requirements

1. Describe reasons and result of the change in the pull request comment.
2. Do not force push to a pull request. The development history should be easily traceable.
3. Any change to a public API requires appropriate documentation: params (and particularly interesting combinations of them if the method is complex), results, interesting, self-contained examples.
4. Any change to behaviour needs to be reflected and validated with specs.
5. Any change affecting the compiler or performance-critical features in the standard library
   should be checked with benchmarks how it affects performance.

### Reviews

Reviews are conducted by community members to validate a contribution and ensure quality standards are met.
Approvals from Core Team members are required for accepting a pull requests. Other community members are encouraged to do reviews as well. Leave suggestions for improvements or approve a change when it looks good to you.

1. Make sure the [formal minimum requirements](#minimum-requirements) are met, for the change itself and the PR. Cross check with the referenced issue(s).
2. Check if CI is successful. If not, try to figure out what's wrong and add a comment about it. If a failure seems unrelated, maintainers can try to rerun the job.
3. Leave inline comments when you want to request changes or ask for clarification. Suggestions are often understood as requirements, so make it clear if a proposal is optional or you're just asking for feedback.

### Accepting a Pull Request

The process of accepting a pull request entails the following check list:

1. At least two approvals by Core Team members; one approval if the author is a Core Team member. Only approvals based on the most recent code version count (ignoring minor changes like fixing a typo).
2. There are no outstanding questions nor requested changes in the pull request and associated issues.
3. Title and description appropriately represent the final state of the change.
4. Proper labels are applied (usually at least a `topic:` and `kind:` label).
5. Change is based on a fairly recent commit of the `master` branch. When in doubt, merge `master` and wait for CI.
6. CI is green.

When these conditions are met, a Core Team member can mark the pull request as accepted by adding it to the current development milestone.
This signals that the PR is scheduled to be merged soon and gives another chance for final reviews.

The current [development milestone](https://github.com/crystal-lang/crystal/milestones) is typically the milestone for the next release.
During the freeze period of a release, feature enhancements are added to the milestone of the next release.
Freeze periods are announced on the community forums and usually span two weeks before the scheduled date of a minor release.

### Merge Queue

The current [development milestone](https://github.com/crystal-lang/crystal/milestones) serves as a merge queue. Open pull requests on that milestone
are eligible for being merged.

Pending pull requests should usually stay in the queue for at least one full business day, allowing other reviewers to take a final look at it.
This wait time can be extended, for example for big changes or when there was a lot of recent activity in the discussion.
Urgent bug and regression fixes can skip the line.

If reasonable objection or questions arise while waiting for merge, the pull request must be removed from the milestone until they are resolved.

It's good practice to have a single maintainer responsible for operating the merge queue.

### Merging

Before merging, make sure the pull request has been on the merge queue for some time (usually 1+ business days) and there has not been any
more recent discussion that questions the current state of the change.
If conditions are met, the pull request can finally be merged. Use squash merge to not pollute the version history of the main branch with
details of the pull request process. For non-trivial changes, the merge commit should contain a short description.

### For maintainers with push access

1. Do not directly commit to the `master` branch. Always create a feature branch and pull request.
2. Feature branches should typically be created in your fork. The main repo should only contain essential branches.
   - CI changes affecting circle CI only run for branches on the main repo. They should be prefixed `ci/` to trigger a maintenance release.
   - Long-running feature branches that accept contributions must be pushed to the main repo in order to allow PRs targeting that branch.

## Git pre-commit hook

Code submitted to this repository should be formatted according to `crystal tool format`.
A pre-commit hook can be installed into the local git repo to ensure the formatter validates every commit: <https://github.com/crystal-lang/crystal/blob/master/scripts/git/pre-commit>

Install the pre-commit hook:

```sh
ln -s scripts/git/pre-commit .git/hooks
```

## Code of Conduct

Please note that this project is released with a [Contributor Code of Conduct][ccoc].
By participating in this project you agree to abide by its terms.

[ccoc]: https://github.com/crystal-lang/crystal/blob/master/CODE_OF_CONDUCT.md


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

----------------------------------------------------------------------------

Runtime Library Exception to the Apache 2.0 License:

   As an exception, if you use this Software to compile your source code
   and portions of this Software are embedded into the binary product as a
   result, you may redistribute such product without providing attribution
   as would otherwise be required by Sections 4(a), 4(b) and 4(d) of the
   License.


================================================
FILE: LICENSES/Apache-2.0.txt
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

     (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and

     (b) You must cause any modified files to carry prominent notices stating that You changed the files; and

     (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

     (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

     You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


================================================
FILE: LICENSES/MIT.txt
================================================
MIT License

Copyright (c) <year> <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: LICENSES/Swift-exception.txt
================================================
### Runtime Library Exception to the Apache 2.0 License: ###

As an exception, if you use this Software to compile your source code and
portions of this Software are embedded into the binary product as a result,
you may redistribute such product without providing attribution as would
otherwise be required by Sections 4(a), 4(b) and 4(d) of the License.


================================================
FILE: Makefile
================================================
all:

-include Makefile.local # for optional local options e.g. threads

# Recipes for this Makefile

## Build the compiler
##   $ make
## Build the compiler with progress output
##   $ make progress=1
## Clean up built files then build the compiler
##   $ make clean crystal
## Build the compiler in release mode
##   $ make crystal release=1 interpreter=1
## Run tests
##   $ make test
## Run stdlib tests
##   $ make std_spec
## Run compiler tests
##   $ make compiler_spec
## Run generators (Unicode, SSL config, ...)
##   $ make -B generate_data

CRYSTAL ?= crystal## which previous crystal compiler use

release ?=        ## Compile in release mode
stats ?=          ## Enable statistics output
progress ?=       ## Enable progress output
threads ?=        ## Maximum number of threads to use
debug ?=          ## Add symbolic debug info
verbose ?=        ## Run specs in verbose mode
junit_output ?=   ## Path to output junit results
static ?=         ## Enable static linking
target ?=         ## Cross-compilation target
interpreter ?=    ## Enable interpreter feature
check ?=          ## Enable only check when running format
order ?=random    ## Enable order for spec execution (values: "default" | "random" | seed number)
deref_symlinks ?= ## Dereference symbolic links for `make install`
docs_sanitizer ?= ## Enable sanitization for documentation generation
sequential_codegen ?=$(if $(filter 0,$(supports_preview_mt)),true,)## Enforce sequential codegen in compiler builds. Base compiler before Crystal 1.8 cannot build with `-Dpreview_mt -Dexecution_context`

O := .build
SOURCES := $(shell find src -name '*.cr')
SPEC_SOURCES := $(shell find spec -name '*.cr')
MAN1PAGES := $(patsubst doc/man/%.adoc,man/%.1,$(wildcard doc/man/*.adoc))
override FLAGS += -D strict_multi_assign -D preview_overload_order $(if $(release),--release )$(if $(stats),--stats )$(if $(progress),--progress )$(if $(threads),--threads $(threads) )$(if $(debug),-d )$(if $(static),--static )$(if $(LDFLAGS),--link-flags="$(LDFLAGS)" )$(if $(target),--cross-compile --target $(target) )
# NOTE: USE_PCRE1 is only used for testing compatibility with legacy environments that don't provide libpcre2.
# Newly built compilers should never be distributed with libpcre to ensure syntax consistency.
override COMPILER_FLAGS += $(if $(interpreter),,-Dwithout_interpreter )$(if $(docs_sanitizer),,-Dwithout_libxml2 ) -Dwithout_openssl -Dwithout_zlib$(if $(sequential_codegen),, -Dpreview_mt -Dexecution_context) $(if $(USE_PCRE1),-Duse_pcre,-Duse_pcre2)
SPEC_WARNINGS_OFF := --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives --exclude-warnings src/float/printer --exclude-warnings src/random.cr
override SPEC_FLAGS += $(if $(verbose),-v )$(if $(junit_output),--junit_output $(junit_output) )$(if $(order),--order=$(order) )
CRYSTAL_CONFIG_LIBRARY_PATH := '$$ORIGIN/../lib/crystal'
ifndef CRYSTAL_CONFIG_BUILD_COMMIT
	CRYSTAL_CONFIG_BUILD_COMMIT := $(shell git rev-parse --short HEAD 2> /dev/null)
endif
CRYSTAL_CONFIG_PATH := '$$ORIGIN/../share/crystal/src'
ifndef BASE_CRYSTAL_VERSION
	BASE_CRYSTAL_VERSION := $(shell $(CRYSTAL) env CRYSTAL_VERSION)
endif
ifndef CRYSTAL_VERSION
	CRYSTAL_VERSION := $(shell cat src/VERSION)
endif
ifndef SOURCE_DATE_EPOCH
	SOURCE_DATE_EPOCH := $(shell (cat src/SOURCE_DATE_EPOCH || (git show -s --format=%ct HEAD || stat -c "%Y" Makefile ||stat -f "%m" Makefile)) 2> /dev/null)
endif
check_lld := command -v ld.lld >/dev/null && case "$$(uname -s)" in MINGW32*|MINGW64*|Linux) echo 1;; esac
ifeq ($(shell $(check_lld)),1)
  EXPORT_CC ?= CC="$(CC) -fuse-ld=lld"
endif
override EXPORTS += \
  CRYSTAL_CONFIG_BUILD_COMMIT="$(CRYSTAL_CONFIG_BUILD_COMMIT)" \
	CRYSTAL_CONFIG_PATH=$(CRYSTAL_CONFIG_PATH) \
	SOURCE_DATE_EPOCH="$(SOURCE_DATE_EPOCH)"
override EXPORTS_BUILD += \
	$(EXPORT_CC) \
	CRYSTAL_CONFIG_LIBRARY_PATH=$(CRYSTAL_CONFIG_LIBRARY_PATH)
SHELL = sh

ifeq ($(LLVM_VERSION),)
	ifndef LLVM_CONFIG
  	LLVM_CONFIG := $(shell src/llvm/ext/find-llvm-config.sh)
	endif
	LLVM_VERSION := $(if $(LLVM_CONFIG),$(shell "$(LLVM_CONFIG)" --version 2> /dev/null))
endif

# Crystal versions before 1.8 cannot build a functional compiler with `-Dpreview_mt` (https://github.com/crystal-lang/crystal/pull/16380)
supports_preview_mt := $(if $(filter 1.8.0,$(shell printf "%s\n%s" "1.8.0" "$(BASE_CRYSTAL_VERSION)" | sort -V | tail -n1)),0,1)

LLVM_EXT_DIR = src/llvm/ext
LLVM_EXT_OBJ = $(LLVM_EXT_DIR)/llvm_ext.o
CXXFLAGS += $(if $(debug),-g -O0)

# MSYS2 support (native Windows should use `Makefile.win` instead)
ifeq ($(OS),Windows_NT)
  EXE := .exe
  WINDOWS := 1
else
  EXE :=
  WINDOWS :=
endif
CRYSTAL_BIN := crystal$(EXE)

DESTDIR ?=
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
LIBDIR ?= $(PREFIX)/lib
DATADIR ?= $(PREFIX)/share
DOCDIR ?= $(DATADIR)/doc/crystal
MANDIR ?= $(DATADIR)/man
INSTALL ?= /usr/bin/install

ifeq ($(or $(TERM),$(TERM),dumb),dumb)
  colorize = $(shell printf "%s" "$1" >&2)
else
  colorize = $(shell printf "\033[33m%s\033[0m\n" "$1" >&2)
endif

DEPS = $(LLVM_EXT_OBJ)
ifneq ($(LLVM_VERSION),)
  ifeq ($(shell test $(firstword $(subst ., ,$(LLVM_VERSION))) -ge 18; echo $$?),0)
    DEPS =
  endif
endif

check_llvm_config = $(eval \
	check_llvm_config := $(if $(LLVM_VERSION),\
		$(call colorize,Using $(or $(LLVM_CONFIG),externally configured LLVM) [version=$(LLVM_VERSION)]),\
		$(error "Could not locate compatible llvm-config, make sure it is installed and in your PATH, or set LLVM_VERSION / LLVM_CONFIG. Compatible versions: $(shell cat src/llvm/ext/llvm-versions.txt)))\
	)

.PHONY: all
all: crystal ## Build all files (currently crystal only) [default]

.PHONY: test
test: spec ## Run tests

.PHONY: spec
spec: std_spec primitives_spec compiler_spec

.PHONY: std_spec
std_spec: $(O)/std_spec$(EXE) ## Run standard library specs
	$(O)/std_spec$(EXE) $(SPEC_FLAGS)

.PHONY: compiler_spec
compiler_spec: $(O)/compiler_spec$(EXE) ## Run compiler specs
	$(O)/compiler_spec$(EXE) $(SPEC_FLAGS)

.PHONY: primitives_spec
primitives_spec: $(O)/primitives_spec$(EXE) ## Run primitives specs
	$(O)/primitives_spec$(EXE) $(SPEC_FLAGS)

.PHONY: interpreter_spec
interpreter_spec: $(O)/interpreter_spec$(EXE) ## Run interpreter specs
	$(O)/interpreter_spec$(EXE) $(SPEC_FLAGS)

.PHONY: simple_smoke_test
simple_smoke_test: ## Build std specs as a smoke test
simple_smoke_test: $(O)/std_spec$(EXE)

.PHONY: smoke_test
smoke_test: ## Build std specs, compiler specs and compiler as a smoke test
smoke_test: $(O)/std_spec$(EXE) $(O)/compiler_spec$(EXE) $(O)/$(CRYSTAL_BIN)

SHELLCHECK_SOURCES := $(wildcard **/*.sh) $(wildcard **/*.bash) bin/crystal bin/ci bin/check-compiler-flag scripts/git/pre-commit

.PHONY: lint-shellcheck
lint-shellcheck:
	shellcheck --severity=warning $(SHELLCHECK_SOURCES)

.PHONY: all_spec
all_spec: $(O)/all_spec$(EXE) ## Run all specs (note: this builds a huge program; `test` recipe builds individual binaries and is recommended for reduced resource usage)
	$(O)/all_spec$(EXE) $(SPEC_FLAGS)

.PHONY: samples
samples: ## Build example programs
	$(MAKE) -C samples

.PHONY: docs
docs: ## Generate standard library documentation
	$(call check_llvm_config)
	./bin/crystal docs src/docs_main.cr $(DOCS_OPTIONS) --project-name=Crystal --project-version=$(CRYSTAL_VERSION) --source-refname=$(CRYSTAL_CONFIG_BUILD_COMMIT)
	cp -R -P -p doc/ docs/

.PHONY: crystal
crystal: $(O)/$(CRYSTAL_BIN) ## Build the compiler

.PHONY: deps llvm_ext
deps: $(DEPS) ## Build dependencies
llvm_ext: $(LLVM_EXT_OBJ)

.PHONY: format
format: ## Format sources
	./bin/crystal tool format$(if $(check), --check) src spec samples scripts

.PHONY: generate_data
generate_data: ## Run generator scripts for Unicode, SSL config, ...
	$(MAKE) -B -f scripts/generate_data.mk

.PHONY: install
install: $(O)/$(CRYSTAL_BIN) man/crystal.1.gz ## Install the compiler at DESTDIR
	$(INSTALL) -d -m 0755 "$(DESTDIR)$(BINDIR)/"
	$(INSTALL) -m 0755 "$(O)/$(CRYSTAL_BIN)" "$(DESTDIR)$(BINDIR)/$(CRYSTAL_BIN)"

	$(INSTALL) -d -m 0755 $(DESTDIR)$(DATADIR)/crystal
	cp -R -p $(if $(deref_symlinks),-L,-P) src "$(DESTDIR)$(DATADIR)/crystal/src"
	rm -rf "$(DESTDIR)$(DATADIR)/crystal/$(LLVM_EXT_OBJ)" # Don't install llvm_ext.o

	$(INSTALL) -d -m 0755 "$(DESTDIR)$(MANDIR)/man1/"
	$(INSTALL) -m 644 man/crystal.1.gz "$(DESTDIR)$(MANDIR)/man1/crystal.1.gz"
	$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/licenses/crystal/"
	$(INSTALL) -m 644 LICENSE "$(DESTDIR)$(DATADIR)/licenses/crystal/LICENSE"

	$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/bash-completion/completions/"
	$(INSTALL) -m 644 etc/completion.bash "$(DESTDIR)$(DATADIR)/bash-completion/completions/crystal"
	$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/zsh/site-functions/"
	$(INSTALL) -m 644 etc/completion.zsh "$(DESTDIR)$(DATADIR)/zsh/site-functions/_crystal"
	$(INSTALL) -d -m 0755 "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/"
	$(INSTALL) -m 644 etc/completion.fish "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/crystal.fish"

ifeq ($(WINDOWS),1)
.PHONY: install_dlls
install_dlls: $(O)/$(CRYSTAL_BIN) ## Install the compiler's dependent DLLs at DESTDIR (Windows only)
	$(INSTALL) -d -m 0755 "$(DESTDIR)$(BINDIR)/"
	@ldd $(O)/$(CRYSTAL_BIN) | grep -iv ' => /c/windows/system32' | sed 's/.* => //; s/ (.*//' | xargs -t -i $(INSTALL) -m 0755 '{}' "$(DESTDIR)$(BINDIR)/"
endif

.PHONY: uninstall
uninstall: ## Uninstall the compiler from DESTDIR
	rm -f "$(DESTDIR)$(BINDIR)/$(CRYSTAL_BIN)"

	rm -rf "$(DESTDIR)$(DATADIR)/crystal/src"

	rm -f "$(DESTDIR)$(MANDIR)/man1/crystal.1.gz"
	rm -f "$(DESTDIR)$(DATADIR)/licenses/crystal/LICENSE"

	rm -f "$(DESTDIR)$(DATADIR)/bash-completion/completions/crystal"
	rm -f "$(DESTDIR)$(DATADIR)/zsh/site-functions/_crystal"
	rm -f "$(DESTDIR)$(DATADIR)/fish/vendor_completions.d/crystal.fish"

.PHONY: install_docs
install_docs: docs ## Install docs at DESTDIR
	$(INSTALL) -d -m 0755 $(DESTDIR)$(DOCDIR)

	cp -R -P -p docs "$(DESTDIR)$(DOCDIR)/docs"
	cp -R -P -p samples "$(DESTDIR)$(DOCDIR)/examples"

.PHONY: uninstall_docs
uninstall_docs: ## Uninstall docs from DESTDIR
	rm -rf "$(DESTDIR)$(DOCDIR)/docs"
	rm -rf "$(DESTDIR)$(DOCDIR)/examples"

$(O)/all_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@mkdir -p $(O)
	$(EXPORT_CC) $(EXPORTS) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/all_spec.cr

$(O)/std_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@mkdir -p $(O)
	$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/std_spec.cr

$(O)/compiler_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@mkdir -p $(O)
	$(EXPORT_CC) $(EXPORTS) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/compiler_spec.cr --release

$(O)/primitives_spec$(EXE): $(O)/$(CRYSTAL_BIN) $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	@mkdir -p $(O)
	$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/primitives_spec.cr

$(O)/interpreter_spec$(EXE): $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(eval interpreter=1)
	@mkdir -p $(O)
	$(EXPORT_CC) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o $@ spec/compiler/interpreter_spec.cr

$(O)/$(CRYSTAL_BIN): $(DEPS) $(SOURCES)
	$(call check_llvm_config)
	@mkdir -p $(O)
	$(EXPORTS) $(EXPORTS_BUILD) ./bin/crystal build $(FLAGS) $(COMPILER_FLAGS) -o $(if $(WINDOWS),$(O)/crystal-next.exe,$@) src/compiler/crystal.cr
	@# NOTE: on MSYS2 it is not possible to overwrite a running program, so the compiler must be first built with
	@# a different filename and then moved to the final destination.
	$(if $(WINDOWS),mv $(O)/crystal-next.exe $@)

$(LLVM_EXT_OBJ): $(LLVM_EXT_DIR)/llvm_ext.cc
	$(call check_llvm_config)
	$(CXX) -c $(CXXFLAGS) -o $@ $< $(if $(LLVM_CONFIG),$(shell $(LLVM_CONFIG) --cxxflags))

man/: $(MAN1PAGES)

man/%.gz: man/%
	gzip -c -9 $< > $@

man/%.1: doc/man/%.adoc
	SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) asciidoctor -a crystal_version=$(CRYSTAL_VERSION) $< -b manpage -o $@

.PHONY: clean
clean: clean_crystal ## Clean up built directories and files
	rm -rf $(LLVM_EXT_OBJ)
	rm -rf man/*.gz

.PHONY: clean_crystal
clean_crystal: ## Clean up crystal built files
	rm -rf $(O)
	rm -rf ./docs

.PHONY: clean_cache
clean_cache: ## Clean up CRYSTAL_CACHE_DIR files
	rm -rf $(shell ./bin/crystal env CRYSTAL_CACHE_DIR)

.PHONY: help
help: ## Show this help
	@echo
	@printf '\033[34mtargets:\033[0m\n'
	@grep -hE '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) |\
		sort |\
		awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2}'
	@echo
	@printf '\033[34moptional variables:\033[0m\n'
	@grep -hE '^[a-zA-Z_-]+ \?=.*?## .*$$' $(MAKEFILE_LIST) |\
		sort |\
		awk 'BEGIN {FS = " \\?=.*?## "}; {printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2}'
	@echo
	@printf '\033[34mrecipes:\033[0m\n'
	@grep -hE '^##.*$$' $(MAKEFILE_LIST) |\
		awk 'BEGIN {FS = "## "}; /^## [a-zA-Z_-]/ {printf "  \033[36m%s\033[0m\n", $$2}; /^##  / {printf "  %s\n", $$2}'


================================================
FILE: Makefile.win
================================================
all:

-include Makefile.win.local # for optional local options e.g. threads

# Recipes for this Makefile

## Build the compiler
##   $ make -f Makefile.win
## Build the compiler with progress output
##   $ make -f Makefile.win progress=1
## Clean up built files then build the compiler
##   $ make -f Makefile.win clean crystal
## Build the compiler in release mode
##   $ make -f Makefile.win crystal release=1 interpreter=1
## Run tests
##   $ make -f Makefile.win test
## Run stdlib tests
##   $ make -f Makefile.win std_spec
## Run compiler tests
##   $ make -f Makefile.win compiler_spec
## Run generators (Unicode, SSL config, ...)
##   $ make -B generate_data

CRYSTAL ?= crystal ## which previous crystal compiler use

release ?=        ## Compile in release mode
stats ?=          ## Enable statistics output
progress ?=       ## Enable progress output
threads ?=        ## Maximum number of threads to use
debug ?=          ## Add symbolic debug info
verbose ?=        ## Run specs in verbose mode
junit_output ?=   ## Path to output junit results
static ?=         ## Enable static linking
target ?=         ## Cross-compilation target
interpreter ?=    ## Enable interpreter feature
check ?=          ## Enable only check when running format
order ?=random    ## Enable order for spec execution (values: "default" | "random" | seed number)
docs_sanitizer ?= ## Enable sanitization for documentation generation
sequential_codegen ?= ## Enforce sequential codegen in compiler builds. Base compiler before Crystal 1.8 cannot build with `-Dpreview_mt`

MAKEFLAGS += --no-builtin-rules
.SUFFIXES:

SHELL := cmd.exe
CXX := cl.exe
RC := rc.exe

GLOB = $(shell dir $1 /B /S)
MKDIR = if not exist $1 mkdir $1
CP = copy /B /Y $1 $2
CPDIR = robocopy /E /NJH /NJS /NS /NC /NP $1 $2 & if %%ERRORLEVEL%% GEQ 8 exit /B 1
INSTALL = copy /B /Y $1 $2
INSTALLDIR = robocopy /E /NJH /NJS /NS /NC /NP $1 $2 & if %%ERRORLEVEL%% GEQ 8 exit /B 1
MV = move /Y $1 $2
RM = if exist $1 del /F /Q $1
RMDIR = if exist $1 rd /S /Q $1

O := .build
SOURCES := $(call GLOB,src\\*.cr)
SPEC_SOURCES := $(call GLOB,spec\\*.cr)
override FLAGS += -D strict_multi_assign -D preview_overload_order $(if $(release),--release )$(if $(stats),--stats )$(if $(progress),--progress )$(if $(threads),--threads $(threads) )$(if $(debug),-d )$(if $(static),--static )$(if $(LDFLAGS),--link-flags="$(LDFLAGS)" )$(if $(target),--cross-compile --target $(target) )
# NOTE: USE_PCRE1 is only used for testing compatibility with legacy environments that don't provide libpcre2.
# Newly built compilers should never be distributed with libpcre to ensure syntax consistency.
override COMPILER_FLAGS += $(if $(interpreter),,-Dwithout_interpreter )$(if $(docs_sanitizer),,-Dwithout_libxml2 ) -Dwithout_openssl -Dwithout_zlib$(if $(sequential_codegen),, -Dpreview_mt -Dexecution_context) $(if $(USE_PCRE1),-Duse_pcre,-Duse_pcre2)
SPEC_WARNINGS_OFF := --exclude-warnings spec\std --exclude-warnings spec\compiler --exclude-warnings spec\primitives --exclude-warnings src\float\printer
SPEC_FLAGS := $(if $(verbose),-v )$(if $(junit_output),--junit_output $(junit_output) )$(if $(order),--order=$(order) )
CRYSTAL_CONFIG_LIBRARY_PATH := $$ORIGIN\lib
CRYSTAL_CONFIG_BUILD_COMMIT := $(shell git rev-parse --short HEAD)
CRYSTAL_CONFIG_PATH := $$ORIGIN\src
ifndef CRYSTAL_VERSION
	CRYSTAL_VERSION := $(shell type src\VERSION)
endif
ifndef SOURCE_DATE_EPOCH
	SOURCE_DATE_EPOCH := $(or $(shell type src\SOURCE_DATE_EPOCH 2>NUL),$(shell git show -s --format=%ct HEAD))
endif
export_vars = $(eval export CRYSTAL_CONFIG_BUILD_COMMIT CRYSTAL_CONFIG_PATH SOURCE_DATE_EPOCH)
export_build_vars = $(eval export CRYSTAL_CONFIG_LIBRARY_PATH)

ifeq ($(LLVM_VERSION),)
  LLVM_CONFIG ?=
  LLVM_VERSION := $(if $(LLVM_CONFIG),$(shell "$(LLVM_CONFIG)" --version))
endif

LLVM_EXT_DIR = src\llvm\ext
LLVM_EXT_OBJ = $(LLVM_EXT_DIR)\llvm_ext.obj
CXXFLAGS += $(if $(static),$(if $(debug),/MTd /Od ,/MT ),$(if $(debug),/MDd /Od ,/MD ))

prefix ?= $(or $(ProgramW6432),$(ProgramFiles))\crystal
BINDIR ?= $(prefix)
LIBDIR ?= $(prefix)\lib
SRCDIR ?= $(prefix)\src
DATADIR ?= $(prefix)

colorize = $(info $1)

DEPS = $(LLVM_EXT_OBJ)
ifneq ($(LLVM_VERSION),)
  ifeq ($(shell if $(firstword $(subst ., ,$(LLVM_VERSION))) GEQ 18 echo 0),0)
    DEPS =
  endif
endif

check_llvm_config = $(eval \
	check_llvm_config := $(if $(LLVM_VERSION),\
		$(call colorize,Using $(or $(LLVM_CONFIG),externally configured LLVM) [version=$(LLVM_VERSION)]),\
		$(error "Could not locate compatible llvm-config, make sure it is installed and in your PATH, or set LLVM_VERSION / LLVM_CONFIG. Compatible versions: $(shell type src\llvm\ext\llvm-versions.txt)))\
	)

.PHONY: all
all: crystal ## Build all files (currently crystal only) [default]

.PHONY: test
test: spec ## Run tests

.PHONY: spec
spec: std_spec primitives_spec compiler_spec

.PHONY: std_spec
std_spec: $(O)\std_spec.exe ## Run standard library specs
	$(O)\std_spec $(SPEC_FLAGS)

.PHONY: compiler_spec
compiler_spec: $(O)\compiler_spec.exe ## Run compiler specs
	$(O)\compiler_spec $(SPEC_FLAGS)

.PHONY: primitives_spec
primitives_spec: $(O)\primitives_spec.exe ## Run primitives specs
	$(O)\primitives_spec $(SPEC_FLAGS)

.PHONY: interpreter_spec
interpreter_spec: $(O)\interpreter_spec ## Run interpreter specs
	$(O)\interpreter_spec $(SPEC_FLAGS)

.PHONY: smoke_test
smoke_test: ## Build specs as a smoke test
smoke_test: $(O)\std_spec.exe $(O)\compiler_spec.exe $(O)\crystal.exe

.PHONY: all_spec
all_spec: $(O)\all_spec.exe ## Run all specs (note: this builds a huge program; `test` recipe builds individual binaries and is recommended for reduced resource usage)
	$(O)\all_spec $(SPEC_FLAGS)

.PHONY: samples
samples: ## Build example programs
	$(MAKE) -C samples -f $(MAKEFILE_LIST)

.PHONY: docs
docs: ## Generate standard library documentation
	$(call check_llvm_config)
	.\bin\crystal docs src\docs_main.cr $(DOCS_OPTIONS) --project-name=Crystal --project-version=$(CRYSTAL_VERSION) --source-refname=$(CRYSTAL_CONFIG_BUILD_COMMIT)

.PHONY: crystal
crystal: $(O)\crystal.exe ## Build the compiler

.PHONY: deps llvm_ext
deps: $(DEPS) ## Build dependencies
llvm_ext: $(LLVM_EXT_OBJ)

.PHONY: format
format: ## Format sources
	.\bin\crystal tool format$(if $(check), --check) src spec samples scripts

.PHONY: generate_data
generate_data: ## Run generator scripts for Unicode, SSL config, ...
	$(MAKE) -B -f scripts/generate_data.mk

.PHONY: install
install: $(O)\crystal.exe ## Install the compiler at prefix
	$(call MKDIR,"$(BINDIR)")
	$(call INSTALL,"$(O)\crystal.exe","$(BINDIR)\crystal.exe")
	$(call INSTALL,"$(O)\crystal.pdb","$(BINDIR)\crystal.pdb")

	$(call MKDIR,"$(DATADIR)")
	$(call INSTALLDIR,src,"$(DATADIR)\src")
	$(call RM,"$(DATADIR)\$(LLVM_EXT_OBJ)")

	$(call INSTALL,LICENSE,"$(DATADIR)\LICENSE.txt")

.PHONY: uninstall
uninstall: ## Uninstall the compiler from prefix
	$(call RM,"$(DATADIR)\LICENSE.txt")

	$(call RMDIR,"$(DATADIR)\src")

	$(call RM,"$(BINDIR)\crystal.exe")
	$(call RM,"$(BINDIR)\crystal.pdb")

.PHONY: install_docs
install_docs: docs ## Install docs at prefix
	$(call MKDIR,"$(DATADIR)")
	$(call INSTALLDIR,docs,"$(DATADIR)\docs")
	$(call INSTALLDIR,samples,"$(DATADIR)\examples")

.PHONY: uninstall_docs
uninstall_docs: ## Uninstall docs from prefix
	$(call RMDIR,"$(DATADIR)\docs")
	$(call RMDIR,"$(DATADIR)\examples")

$(O)\all_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@$(call MKDIR,"$(O)")
	$(call export_vars)
	.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\all_spec.cr

$(O)\std_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@$(call MKDIR,"$(O)")
	.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\std_spec.cr

$(O)\compiler_spec.exe: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(call check_llvm_config)
	@$(call MKDIR,"$(O)")
	$(call export_vars)
	.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\compiler_spec.cr --release

$(O)\primitives_spec.exe: $(O)\crystal.exe $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	@$(call MKDIR,"$(O)")
	.\bin\crystal build $(FLAGS) $(SPEC_WARNINGS_OFF) -o "$@" spec\primitives_spec.cr

$(O)\interpreter_spec: $(DEPS) $(SOURCES) $(SPEC_SOURCES)
	$(eval interpreter=1)
	@$(call MKDIR, "$(O)")
	.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS)  $(SPEC_WARNINGS_OFF) -o $@ spec\compiler\interpreter_spec.cr

$(O)\crystal.exe: $(DEPS) $(SOURCES) $(O)\crystal.res
	$(call check_llvm_config)
	@$(call MKDIR,"$(O)")
	$(call export_vars)
	$(call export_build_vars)
	.\bin\crystal build $(FLAGS) $(COMPILER_FLAGS)  -o "$(O)\crystal-next.exe" src\compiler\crystal.cr --link-flags=/PDBALTPATH:crystal.pdb "--link-flags=$(realpath $(O)\crystal.res)"
	$(call MV,"$(O)\crystal-next.exe","$@")
	$(call MV,"$(O)\crystal-next.pdb","$(O)\crystal.pdb")

$(O)\crystal.res: $(O)\crystal.rc
	@$(call MKDIR,"$(O)")
	$(RC) /nologo /Fo "$@" "$<"

$(O)\crystal.rc: $(MAKEFILE_LIST)
	@$(call MKDIR,"$(O)")
	$(MAKE) -s -f $(MAKEFILE_LIST) rc > "$@"

$(LLVM_EXT_OBJ): $(LLVM_EXT_DIR)\llvm_ext.cc
	$(call check_llvm_config)
	@rem Disable some harmless warnings:
	@rem - warning C4244: 'initializing': conversion from '_Ty' to '_Ty2', possible loss of data
	@rem - warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
	@rem - warning C4624: '...': destructor was implicitly defined as deleted
	$(CXX) /nologo /c $(CXXFLAGS) /WX /wd4244 /wd4624 /wd4530 "/Fo$@" "$<" $(if $(LLVM_CONFIG),$(shell $(LLVM_CONFIG) --cxxflags))

.PHONY: clean
clean: clean_crystal ## Clean up built directories and files
	$(call RM,"$(LLVM_EXT_OBJ)")

.PHONY: clean_crystal
clean_crystal: ## Clean up crystal built files
	$(call RMDIR,"$(O)")
	$(call RMDIR,docs)

.PHONY: clean_cache
clean_cache: ## Clean up CRYSTAL_CACHE_DIR files
	$(call RMDIR,"$(shell .\bin\crystal env CRYSTAL_CACHE_DIR)")

.PHONY: rc
rc: ## Write compiler resource script to standard output
	$(eval comma := ,)
	$(eval ver_comma := $(subst .,$(comma),$(subst -dev,,$(CRYSTAL_VERSION))))
	$(eval source_date := $(shell git show -s --format=%cs HEAD))
	$(eval source_year := $(firstword $(subst -, ,$(source_date))))
	$(eval ver_full := $(CRYSTAL_VERSION)$(if $(CRYSTAL_CONFIG_BUILD_COMMIT), [$(CRYSTAL_CONFIG_BUILD_COMMIT)])$(if $(source_date), ($(source_date))))
	@setlocal EnableDelayedExpansion &\
	echo #include ^<windows.h^>&\
	echo.&\
	set "_dir=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))" &\
	echo 1 ICON ^"!_dir:/=\\!src\\compiler\\crystal\\tools\\playground\\public\\favicon.ico^"&\
	echo.&\
	echo VS_VERSION_INFO VERSIONINFO&\
	echo     PRODUCTVERSION $(ver_comma),0&\
	echo     FILEVERSION    $(ver_comma),1&\
	echo     FILEFLAGSMASK  VS_FFI_FILEFLAGSMASK&\
	echo     FILEFLAGS      $(if $(findstring -dev,$(CRYSTAL_VERSION)),VS_FF_PRERELEASE,0)&\
	echo     FILEOS         VOS_NT_WINDOWS32&\
	echo     FILETYPE       VFT_APP&\
	echo     FILESUBTYPE    VFT2_UNKNOWN&\
	echo BEGIN&\
	echo     BLOCK "StringFileInfo"&\
	echo     BEGIN&\
	echo         BLOCK "040904B0"&\
	echo         BEGIN&\
	echo             VALUE "ProductName",      "Crystal"&\
	echo             VALUE "ProductVersion",   "$(ver_full)"&\
	echo             VALUE "FileVersion",      "$(ver_full)"&\
	echo             VALUE "FileDescription",  "Crystal$(if $(LLVM_CONFIG), $(shell $(LLVM_CONFIG) --host-target))"&\
	echo             VALUE "Comments",         "$(if $(LLVM_VERSION),LLVM $(LLVM_VERSION))"&\
	echo             VALUE "InternalName",     "crystal.exe"&\
	echo             VALUE "OriginalFilename", "crystal.exe"&\
	echo             VALUE "CompanyName",      "Manas Technology Solutions"&\
	echo             VALUE "LegalCopyright",   "Copyright 2012-$(source_year) Manas Technology Solutions"&\
	echo         END&\
	echo     END&\
	echo     BLOCK "VarFileInfo"&\
	echo     BEGIN&\
	echo         VALUE "Translation", 0x0409, 0x04B0&\
	echo     END&\
	echo END

.PHONY: help
help: ## Show this help
	@setlocal EnableDelayedExpansion &\
	echo. &\
	echo targets: &\
	(for /F "usebackq tokens=1* delims=:" %%g in ($(MAKEFILE_LIST)) do (\
		if not "%%h" == "" (\
			set "_line=%%g                " &\
			set "_rest=%%h" &\
			set "_comment=!_rest:* ## =!" &\
			if not "!_comment!" == "!_rest!"\
				if "!_line:_rest=!" == "!_line!"\
					echo   !_line:~0,16!!_comment!\
		)\
	)) &\
	echo. &\
	echo optional variables: &\
	(for /F "usebackq tokens=1,3 delims=?#" %%g in ($(MAKEFILE_LIST)) do (\
		if not "%%h" == "" (\
			set "_var=%%g              " &\
			echo   !_var:~0,14! %%h\
		)\
	)) &\
	echo. &\
	echo recipes: &\
	(for /F "usebackq tokens=* delims=" %%g in ($(MAKEFILE_LIST)) do (\
		set "_line=%%g" &\
		if "!_line:~0,7!" == "##   $$ " (\
			echo !_name! &\
			echo  !_line:~2!\
		) else if "!_line:~0,3!" == "## "\
			set "_name=  !_line:~3!"\
	))


================================================
FILE: NOTICE.md
================================================
# Crystal Programming Language

Copyright 2012-2026 Manas Technology Solutions.

This product includes software developed at Manas Technology Solutions (<https://manas.tech/>).

Apache License v2.0 with Swift exception applies to all works unless specified
otherwise:

Please see [REUSE.toml](REUSE.toml) and [LICENSE](LICENSE) for additional
copyright and licensing information.

- This repository includes vendored libraries (shards) in `/lib/` which have
  their own licenses. See [REUSE.toml](REUSE.toml) for details.
- Crystal playground includes vendored libraries with their own licenses. See
  [src/compiler/crystal/tools/playground/public/vendor/REUSE.toml](src/compiler/crystal/tools/playground/public/vendor/REUSE.toml)
  for details.

## External libraries information

Crystal compiler links the following libraries, which have their own license:

- [LLVM][] - [Apache-2.0 with LLVM exceptions][]
- [PCRE or PCRE2][] - [BSD-3][]
- [libevent2][] - [BSD-3][]
- [libiconv][] - [LGPLv3][]
- [bdwgc][] - [MIT][]

Crystal compiler calls the following tools as external process on compiling, which have their own license:

- [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/) - [GPLv3]

Crystal standard library uses the following libraries, which have their own licenses:

- [LLVM][] - [Apache-2.0 with LLVM exceptions][]
- [PCRE or PCRE2][] - [BSD-3][]
- [libevent2][] - [BSD-3][]
- [libiconv][] - [LGPLv3][]
- [bdwgc][] - [MIT][]
- [Zlib][] - [Zlib][Zlib-license]
- [OpenSSL][] - [Apache-2.0][]
- [Libxml2][] - [MIT][]
- [LibYAML][] - [MIT][]
- [readline][] - [GPLv3][]
- [GMP][] - [LGPLv3][]

<!-- licenses -->
[Apache-2.0]: https://www.openssl.org/source/apache-license-2.0.txt
[Apache-2.0 with LLVM exceptions]: https://raw.githubusercontent.com/llvm/llvm-project/main/llvm/LICENSE.TXT
[BSD-3]: https://opensource.org/licenses/BSD-3-Clause
[GPLv3]: https://www.gnu.org/licenses/gpl-3.0.en.html
[LGPLv3]: https://www.gnu.org/licenses/lgpl-3.0.en.html
[MIT]: https://opensource.org/licenses/MIT
[Zlib-license]: https://opensource.org/licenses/Zlib
<!-- libraries -->
[bdwgc]: http://www.hboehm.info/gc/
[GMP]: https://gmplib.org/
[libevent2]: http://libevent.org/
[libiconv]: https://www.gnu.org/software/libiconv/
[Libxml2]: http://xmlsoft.org/
[LibYAML]: http://pyyaml.org/wiki/LibYAML
[LLVM]: http://llvm.org/
[OpenSSL]: https://www.openssl.org/
[PCRE or PCRE2]: http://pcre.org/
[readline]: https://tiswww.case.edu/php/chet/readline/rltop.html
[Zlib]: http://www.zlib.net/


================================================
FILE: README.md
================================================
# Crystal

[![Linux CI Build Status](https://github.com/crystal-lang/crystal/workflows/Linux%20CI/badge.svg)](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22Linux+CI%22+event%3Apush+branch%3Amaster)
[![macOS CI Build Status](https://github.com/crystal-lang/crystal/workflows/macOS%20CI/badge.svg)](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22macOS+CI%22+event%3Apush+branch%3Amaster)
[![AArch64 CI Build Status](https://github.com/crystal-lang/crystal/workflows/AArch64%20CI/badge.svg)](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22AArch64+CI%22+event%3Apush+branch%3Amaster)
[![Windows CI Build Status](https://github.com/crystal-lang/crystal/workflows/Windows%20CI/badge.svg)](https://github.com/crystal-lang/crystal/actions?query=workflow%3A%22Windows+CI%22+event%3Apush+branch%3Amaster)
[![CircleCI Build Status](https://circleci.com/gh/crystal-lang/crystal/tree/master.svg?style=shield)](https://circleci.com/gh/crystal-lang/crystal)
[![Join the chat at https://gitter.im/crystal-lang/crystal](https://badges.gitter.im/crystal-lang/crystal.svg)](https://gitter.im/crystal-lang/crystal)
[![Code Triagers Badge](https://www.codetriage.com/crystal-lang/crystal/badges/users.svg)](https://www.codetriage.com/crystal-lang/crystal)

---

[![Crystal - Born and raised at Manas](doc/assets/crystal-born-and-raised.svg)](https://manas.tech/)

Crystal is a programming language with the following goals:

- Have a syntax similar to Ruby (but compatibility with it is not a goal)
- Statically type-checked but without having to specify the type of variables or method arguments.
- Be able to call C code by writing bindings to it in Crystal.
- Have compile-time evaluation and generation of code, to avoid boilerplate code.
- Compile to efficient native code.

## Why?

We love Ruby's efficiency for writing code.

We love C's efficiency for running code.

We want the best of both worlds.

We want the compiler to understand what we mean without having to specify types everywhere.

We want full OOP.

Oh, and we don't want to write C code to make the code run faster.

## Project Status

Within a major version, language features won't be removed or changed in any way that could prevent a Crystal program written with that version from compiling and working. The built-in standard library might be enriched, but it will always be done with backwards compatibility in mind.

Development of the Crystal language is possible thanks to the community's effort and the continued support of [84codes](https://www.84codes.com/) and every other [sponsor](https://crystal-lang.org/sponsors).

## Installing

[Follow these installation instructions](https://crystal-lang.org/install)

## Try it online

[play.crystal-lang.org](https://play.crystal-lang.org/)

## Documentation

- [Language Reference](http://crystal-lang.org/reference)
- [Standard library API](https://crystal-lang.org/api)
- [Roadmap](https://github.com/crystal-lang/crystal/wiki/Roadmap)

## Community

Have any questions or suggestions? Ask on the [Crystal Forum](https://forum.crystal-lang.org), on our [Gitter channel](https://gitter.im/crystal-lang/crystal) or IRC channel [#crystal-lang](https://web.libera.chat/#crystal-lang) at irc.libera.chat, or on Stack Overflow under the [crystal-lang](http://stackoverflow.com/questions/tagged/crystal-lang) tag. There is also an archived [Google Group](https://groups.google.com/forum/?fromgroups#!forum/crystal-lang).

## Contributing

The Crystal repository is hosted at [crystal-lang/crystal](https://github.com/crystal-lang/crystal) on GitHub.

Read the general [Contributing guide](https://github.com/crystal-lang/crystal/blob/master/CONTRIBUTING.md), and then:

1. Fork it (<https://github.com/crystal-lang/crystal/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request


================================================
FILE: REUSE.toml
================================================
version = 1

# All original code in this repository is licensed under Apache 2.0 with Swift
# exception.
[[annotations]]
path = ["**"]
SPDX-FileCopyrightText = "Copyright 2012-2026 Manas Technology Solutions."
SPDX-License-Identifier = "Apache-2.0 WITH Swift-exception"

# Unset license information for vendored libraries ("shards"). They either
# provide their own information or there's a specific section in this file.
[[annotations]]
path = ["lib/*/**"]

[[annotations]]
path = "lib/markd/**"
SPDX-FileCopyrightText = "Copyright (c) 2017-present icyleaf"
SPDX-License-Identifier = "MIT"

[[annotations]]
path = "lib/reply/**"
SPDX-FileCopyrightText = "Copyright (c) 2022 I3oris <boris31.resch@gmail.com>"
SPDX-License-Identifier = "MIT"

[[annotations]]
path = "lib/sanitize/**"
SPDX-FileCopyrightText = "Copyright (c) 2020 Johannes Müller <straightshoota@gmail.com>"
SPDX-License-Identifier = "Apache-2.0"


================================================
FILE: SECURITY.md
================================================
# Reporting a Vulnerability

Should you find any security-related issue, please _do not share them openly_ in
the issue tracker. We have a dedicated mailbox where we keep track of them:

<security@manas.tech>

You can encrypt your message via [Keybase](https://keybase.io/encrypt) (set
recipient `crystal`) or with our [PGP key](https://crystal-lang.org/community/crystal-pgp-key.txt)
(fingerprint `5995 C83C D754 BE44 8164 1929 0961 7FD3 7CC0 6B54`)
also available on [Keybase server](https://keybase.io/crystal/pgp_keys.asc).


================================================
FILE: UPGRADING.md
================================================
# Upgrading

This guide provides instructions for upgrading Crystal from one release to the next.
Upgrades must be run sequentially, meaning you should not skip minor/major releases while upgrading.

Crystal commits to a backwards-compatibility guarantee that code should continue
to work with all future minor releases of the same major release series.

Still, even bug fixes introduce changes that may break existing code in some edge cases.
We're only listing the most relevant changes here that could have a relevant impact.

The [changelogs](./doc/changelogs/README.md) contain more information about all changes in
a specific release.

## Crystal 1.13

- `CRYSTAL_LIBRARY_RPATH` and the `preview_win32_delay_load` feature flag have
  been removed. Individual DLLs can be explicitly delay-loaded with the MSVC
  toolchain by using `/DELAYLOAD` as a linker flag. Similarly RPATH can be added
  with GCC or Clang toolchains by adding `-Wl,-rpath`.

## Crystal 1.9

- The implementation of the comparison operator `#<=>` between `Big*` (`BigDecimal`,
  `BigFloat`, `BigInt`, `BigRational`) and `Float` (`Float32`, `Float64`) number types
  is now nilable. When invoking these comparisons, `Nil` values must be handled.


================================================
FILE: _typos.toml
================================================
[default.extend-words]
flate = "flate"

[default.extend-identifiers]
ACCES = "ACCES"
ba = "ba"
ba2 = "ba2"
bui = "bui"
category_Nd = "category_Nd"
DW_AT_endianity = "DW_AT_endianity"
EXTA = "EXTA"
GC_get_thr_restart_signal = "GC_get_thr_restart_signal"
get_thr_restart_signal = "get_thr_restart_signal"
IPPROTO_ND = "IPPROTO_ND"
IST = "IST"
iTolen = "iTolen"
iy = "iy"
larg = "larg"
Nd = "Nd"
numer = "numer"
OLT = "OLT"
pendings = "pendings"
RELA = "RELA"
RPC_S_CALL_FAILED_DNE = "RPC_S_CALL_FAILED_DNE"
SEH = "SEH"
setup_seh_handler = "setup_seh_handler"
usri4_parms = "usri4_parms"
msg_controllen = "msg_controllen"
__crystal_sigfault_handler = "__crystal_sigfault_handler"
TunkShif = "TunkShif"

[default]
extend-ignore-re = [
  # numeric literals
  '0x[0-9a-fA-F_\.\+]+([fiu](8|16|32|64|128))?',
  '\\u\{[0-9a-fA-F]+\}',
  # proper names
  'FLE Standard Time',
  'Universally Unique IDentifier',
  # constants
  'ERROR_\w+',
  'EVP_CIPH.*',
  # fixed test values
  'FOO|/Fo',
  'rCVZVOThsIa97pEDOxvGu',
  '\w*AAAAAAAA\w*',
  # several string specs
  '"(Fo-ur|thi|abd|alo|tro|tring|ue)"',
  '"(aGFo|hel|Hel|thr|noe|Noe|BaR|fo|FO)', '(hel|Hel|worl|Worl|fo)"',
  '/fo|/FO', "'fo", "/\\(fo",
  'tr‸ue|fo‸o',
  "\"[^\"]+\"\\.to_slice\\s*=> [\"']\\\\u", # src/html/entities.cr
  " ([a-zA-Z.]{8} ){4}->", # src/bit_array.cr
  "[A-z]+[0-9]+", # words including a number are likely some kind of identifier
  "sha256[:-][0-9A-z=]+", # shell.nix
]

[files]
extend-exclude = [
  ".git/**",
  "lib/**",
  "man/**",
  "spec/compiler/semantic/did_you_mean_spec.cr",
  "spec/std/string_scanner_spec.cr",
  "spec/std/data/**",
  "spec/std/string/grapheme_break_spec.cr",
  "src/compiler/crystal/tools/playground/public/vendor/",
]


================================================
FILE: bin/check-compiler-flag
================================================
#!/bin/sh

# Use `./bin/check-compiler-flag FLAG` to check the behaviour of the given compiler flag.
# This is useful if `crystal build` is affected when using `-DFLAG` option.
#
# This script will
#   * run the compiler_spec using the flag
#   * build the compiler to have the flag available (in case the flag is introduced in this version)
#   * run the std_spec and primitives_spec with and without the flag
#   * check the compiler_spec built with and without the flag (eg: the specs build with the flag can generate a compiler without the flag)
#   * build a 2nd generation of the compiler using the flag
#   * repeat the checks for the spec suites with and without the flag

set -eux

COMPILER_FLAG=$1

# test compiler_specs
make clean_cache clean_crystal
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec

# first gen compiler
make clean_cache clean_crystal crystal
./bin/crystal --version
md5 .build/crystal

# run specs
make clean_cache std_spec
make clean_cache std_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache primitives_spec
make clean_cache primitives_spec FLAGS="-D$COMPILER_FLAG"

# test compiler_specs
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec

# building 2nd gen compiler
make clean_crystal clean_cache crystal # first
md5 .build/crystal
touch src/compiler/crystal.cr
sleep 2
make clean_cache crystal FLAGS="-D$COMPILER_FLAG" # second
md5 .build/crystal

# run specs
make clean_cache std_spec
make clean_cache std_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache primitives_spec
make clean_cache primitives_spec FLAGS="-D$COMPILER_FLAG"

# run compiler specs
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) CRYSTAL_SPEC_COMPILER_FLAGS="$COMPILER_FLAG" make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec FLAGS="-D$COMPILER_FLAG"
make clean_cache
CRYSTAL_LIBRARY_PATH=$(./bin/crystal env CRYSTAL_LIBRARY_PATH) make compiler_spec


================================================
FILE: bin/ci
================================================
#!/bin/sh

fail() {
  echo "${*}" >&2
  exit 1
}

on_tag() {
  if [ -n "$CURRENT_TAG" ]; then
    echo "${*}"
    eval "${*}"
    return $?
  else
    return 0
  fi
}

fail_on_error() {
  "${@}"

  exit=$?
  if [ "$exit" -ne "0" ]; then
    fail "${*} exited with $exit"
  fi

  return 0
}

verify_environment() {
  if [ -z "$TRAVIS_OS_NAME" ]; then
    fail "\$TRAVIS_OS_NAME is not set or empty."
  fi
}

verify_linux_environment() {
  if [ -z "$ARCH" ]; then
    fail "\$ARCH is not set or empty."
  fi

  if [ -z "$ARCH_CMD" ]; then
    fail "\$ARCH_CMD is not set or empty."
  fi
}

on_os() {
  os="$1"
  shift

  if [ -z "$CI_NIX_SHELL" ]; then
    verify_environment

    if [ "$TRAVIS_OS_NAME" = "$os" ]; then
      echo "${*}"
      eval "${*}"
      return $?
    else
      return 0
    fi
  else
    return 0
  fi
}

on_linux() {
  fail_on_error on_os "linux" "${*}"
}

on_osx() {
  fail_on_error on_os "osx" "${*}"
}

on_nix_shell_eval() {
  if [ -n "$CI_NIX_SHELL" ]; then
    echo "${*}"
    eval "${*}"
    return $?
  else
    return 0
  fi
}

on_nix_shell() {
  fail_on_error on_nix_shell_eval "${*}"
}

on_github() {
  if [ "$GITHUB_ACTIONS" = "true" ]; then
    eval "${*}"
    return $?
  else
    return 0
  fi
}

prepare_system() {
  on_linux 'echo '"'"'{"ipv6":true, "fixed-cidr-v6":"2001:db8:1::/64"}'"'"' | sudo tee /etc/docker/daemon.json'
  on_linux sudo service docker restart
}

build() {
  with_build_env 'bin/crystal scripts/print_regex_config.cr'
  with_build_env 'make std_spec clean threads=1 junit_output=.junit/std_spec.xml'

  case $ARCH in
    i386)
      with_build_env 'make crystal threads=1'
      with_build_env 'SPEC_SPLIT="0%4" make std_spec threads=1 junit_output=.junit/std_spec.0.xml'
      with_build_env 'SPEC_SPLIT="1%4" make std_spec threads=1 junit_output=.junit/std_spec.1.xml'
      with_build_env 'SPEC_SPLIT="2%4" make std_spec threads=1 junit_output=.junit/std_spec.2.xml'
      with_build_env 'SPEC_SPLIT="3%4" make std_spec threads=1 junit_output=.junit/std_spec.3.xml'

      parts=16
      i=0
      while [ $i -lt $parts ]; do
        with_build_env "CRYSTAL_SPEC_COMPILER_THREADS=1 SPEC_SPLIT=\"$i%$parts\" make compiler_spec threads=1 junit_output=.junit/compiler_spec.$i.xml"
        i=$((i + 1))
      done

      with_build_env 'make primitives_spec threads=1 junit_output=.junit/primitives_spec.xml'
      with_build_env 'make docs threads=1'
      ;;
    *)
      with_build_env 'make crystal primitives_spec std_spec compiler_spec docs threads=1 junit_output=.junit/spec.xml DOCS_OPTIONS="--json-config-url=/api/versions.json --canonical-base-url=https://crystal-lang.org/api/latest/"'
      ;;
  esac

  with_build_env 'make samples'
  with_build_env 'CRYSTAL_OPTS=--debug make samples'
}

format() {
  with_build_env 'make clean crystal format threads=1 check=1'
}

prepare_build() {
  on_linux verify_linux_environment

  on_osx curl -L https://github.com/crystal-lang/crystal/releases/download/1.19.1/crystal-1.19.1-1-darwin-universal.tar.gz -o ~/crystal.tar.gz
  on_osx 'pushd ~;gunzip -c ~/crystal.tar.gz | tar xopf -;mv crystal-1.19.1-1 crystal;popd'

  # These commands may take a few minutes to run due to the large size of the repositories.
  # This restriction has been made on GitHub's request because updating shallow
  # clones is an extremely expensive operation due to the tree layout and
  # traffic of Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do
  # this for you automatically to avoid repeatedly performing an expensive
  # unshallow operation in CI systems (which should instead be fixed to not use
  # shallow clones). Sorry for the inconvenience!
  on_osx git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
  on_osx git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask fetch --unshallow

  on_osx brew update --preinstall
  on_osx brew bundle --no-lock

  # Install a recent bash version for nix-shell.
  # macos ships with an ancient one.
  if [ "$(uname)" = "Darwin" ]; then
    on_nix_shell "brew install bash"
  fi
  # initialize nix environment
  on_nix_shell nix-shell

  # Note: brew link --force might show:
  #   Warning: Refusing to link macOS-provided software: llvm
  #
  #   If you need to have llvm first in your PATH run:
  #     echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile
  #
  # This is added in the .circleci/config.yml

  on_tag verify_version
}

verify_version() {
  # If building a tag, check it matches with file
  FILE_VERSION=$(cat ./src/VERSION)

  if [ "$FILE_VERSION" != "$CURRENT_TAG" ]
  then
    fail "VERSION ($FILE_VERSION) does not match GIT TAG ($CURRENT_TAG)"
  fi
}

with_build_env() {
  command="$1"
  on_github "echo '::group::$1'"

  # Ensure non GMT timezone
  export TZ="America/New_York"

  on_linux verify_linux_environment

  export DOCKER_TEST_PREFIX="${DOCKER_TEST_PREFIX:="crystallang/crystal:${CRYSTAL_BOOTSTRAP_VERSION:-1.19.1}"}"

  case $ARCH in
    aarch64|x86_64)
      export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-build"
      ;;
    aarch64-musl|x86_64-musl)
      export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-alpine-build"
      ;;
    i386)
      export DOCKER_TEST_IMAGE="$DOCKER_TEST_PREFIX-i386-build"
      ;;
  esac

  on_linux docker run \
    --rm -t \
    -u "$(id -u)" \
    -v "$PWD":/mnt \
    -v /etc/passwd:/etc/passwd \
    -v /etc/group:/etc/group \
    -w /mnt \
    -e CRYSTAL_CACHE_DIR="/tmp/crystal" \
    -e SPEC_SPLIT_DOTS \
    -e USE_PCRE1 \
    "$DOCKER_TEST_IMAGE" \
    "$ARCH_CMD" /bin/sh -c "'$command'"

  on_osx sudo systemsetup -settimezone $TZ
  on_osx PATH="~/crystal/bin:\$PATH" \
    CRYSTAL_LIBRARY_PATH="~/crystal/embedded/lib" \
    CRYSTAL_CACHE_DIR="/tmp/crystal" \
    /bin/sh -c "'$command'"

  # shellcheck disable=SC2086
  on_nix_shell nix-shell --pure $CI_NIX_SHELL_ARGS --run "'TZ=$TZ $command'"

  on_github echo "::endgroup::"
}

usage() {
  cat <<EOF
bin/ci [-h|--help] command [parameter ...]

Helper script to prepare and run the testsuite on Travis CI.

Commands:
  prepare_system          setup any necessaries repositories etc.
  prepare_build           download and extract any dependencies needed for the build
  build                   run specs, build crystal, build samples, build the docs
  format                  build crystal, run format check
  with_build_env command  run command in the build environment
  help                    display this

EOF
}

command="$1"
shift
case $command in
  prepare_system)
    prepare_system
    ;;
  prepare_build)
    prepare_build
    ;;
  with_build_env)
    target_command="${*}"
    with_build_env "$target_command"
    ;;
  build)
    build
    ;;
  format)
    format
    ;;
  -h|--help|help)
    usage
    ;;
  *)
    if [ -n "$command" ]; then
      fail "Unknown command $command"
    else
      usage
      exit 1
    fi
    ;;
esac


================================================
FILE: bin/crystal
================================================
#!/bin/sh

################## https://github.com/mkropat/sh-realpath #####################
#
# The MIT License (MIT)
#
# Copyright (c) 2014 Michael Kropat
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

realpath() {
    canonicalize_path "$(resolve_symlinks "$1")"
}

resolve_symlinks() {
    _resolve_symlinks "$1"
}

_resolve_symlinks() (
    _assert_no_path_cycles "$@" || return

    if path=$(readlink -- "$1"); then
        dir_context=$(dirname -- "$1")
        _resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@"
    else
        printf '%s\n' "$1"
    fi
)

_prepend_dir_context_if_necessary() {
    if [ "$1" = . ]; then
        printf '%s\n' "$2"
    else
        _prepend_path_if_relative "$1" "$2"
    fi
}

_prepend_path_if_relative() {
    case "$2" in
        /* ) printf '%s\n' "$2" ;;
         * ) printf '%s\n' "$1/$2" ;;
    esac
}

_assert_no_path_cycles() (
    target=$1
    shift

    for path in "$@"; do
        if [ "$path" = "$target" ]; then
            return 1
        fi
    done
)

canonicalize_path() {
    if [ -d "$1" ]; then
        _canonicalize_dir_path "$1"
    else
        _canonicalize_file_path "$1"
    fi
}

_canonicalize_dir_path() {
    { cd "$1" 2>/dev/null && pwd -P; }
}

_canonicalize_file_path() (
    dir=$(dirname -- "$1")
    file=$(basename -- "$1")
    { cd "$dir" 2>/dev/null >/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file"; }
)

##############################################################################

# Based on http://stackoverflow.com/q/370047/641451
remove_path_item() (
  path="$1"

  printf "%s" "$path" | awk -v item="$2" -v RS=: -v ORS=: '$0 != item' | sed 's/:$//'
)

##############################################################################

__has_colors() (
  num_colors=$(tput colors 2>/dev/null)

  if [ -n "$num_colors" ] && [ "$num_colors" -gt 2 ]; then
    return 0
  else
    return 1
  fi
)
__error_msg() {
  if __has_colors; then
    # bold red coloring
    printf '%b\n' "\033[31;1m$*\033[0m" 1>&2
  else
    printf '%b\n' "$@" 1>&2
  fi
}
__warning_msg() {
  if __has_colors; then
    # brown coloring
    printf '%b\n' "\033[33m$*\033[0m" 1>&2
  else
    printf '%b\n' "$@" 1>&2
  fi
}


SCRIPT_PATH="$(realpath "$0")"
SCRIPT_ROOT="$(dirname "$SCRIPT_PATH")"
CRYSTAL_ROOT="$(dirname "$SCRIPT_ROOT")"
CRYSTAL_DIR="$CRYSTAL_ROOT/.build"

export CRYSTAL_PATH="${CRYSTAL_PATH:-./lib:$CRYSTAL_ROOT/src}"
if [ -n "${CRYSTAL_PATH##*"$CRYSTAL_ROOT"/src*}" ]; then
  __warning_msg "CRYSTAL_PATH env variable does not contain $CRYSTAL_ROOT/src"
fi

export CRYSTAL_HAS_WRAPPER=true
: "${CRYSTAL=crystal}"

PARENT_CRYSTAL="$CRYSTAL"

# check if the parent crystal command is a path that refers to this script
if [ -z "${PARENT_CRYSTAL##*/*}" ] && [ "$(realpath "$PARENT_CRYSTAL")" = "$SCRIPT_PATH" ]; then
  # ignore it and use `crystal` as parent compiler command
  PARENT_CRYSTAL="crystal"
fi

# check if the parent crystal command refers to this script
if [ "$(realpath "$(command -v "$PARENT_CRYSTAL" 2> /dev/null)" 2> /dev/null)" = "$SCRIPT_PATH" ]; then
  # remove the path to this script from PATH
  NEW_PATH="$(remove_path_item "$(remove_path_item "$PATH" "$SCRIPT_ROOT")" "bin")"
  # if the PATH did not change it will lead to an infinite recursion => display error
  if [ "$NEW_PATH" = "$PATH" ]; then
    __error_msg 'Could not remove the script bin/crystal from the PATH. Remove it by hand or set the CRYSTAL env variable'
    exit 1
  fi
  PARENT_CRYSTAL=$(PATH=$NEW_PATH command -v "$PARENT_CRYSTAL" 2> /dev/null)
  if [ "$(realpath "$PARENT_CRYSTAL" 2> /dev/null)" = "$SCRIPT_PATH" ]; then
    __error_msg 'Could not remove the script bin/crystal from the PATH. Remove it by hand or set the CRYSTAL env variable'
    exit 1
  fi
fi

command -v "$PARENT_CRYSTAL" > /dev/null 2> /dev/null
PARENT_CRYSTAL_EXISTS=$(test !$?)
if ($PARENT_CRYSTAL_EXISTS); then
  if [ -z "$CRYSTAL_CONFIG_LIBRARY_PATH" ] || [ -z "$CRYSTAL_LIBRARY_PATH" ]; then
    CRYSTAL_INSTALLED_LIBRARY_PATH="$($PARENT_CRYSTAL env CRYSTAL_LIBRARY_PATH 2> /dev/null || echo "")"
    export CRYSTAL_LIBRARY_PATH="${CRYSTAL_LIBRARY_PATH:-$CRYSTAL_INSTALLED_LIBRARY_PATH}"
    export CRYSTAL_CONFIG_LIBRARY_PATH="${CRYSTAL_CONFIG_LIBRARY_PATH:-$CRYSTAL_INSTALLED_LIBRARY_PATH}"
  fi
fi

# CRYSTAL_PATH has all symlinks resolved. In order to avoid issues with duplicate file
# paths when the working directory is a symlink, we cd into the current directory
# with symlinks resolved as well (see https://github.com/crystal-lang/crystal/issues/12969).
cd "$(realpath "$(pwd)")" || exit

case "$(uname -s)" in
  CYGWIN*|MSYS_NT*|MINGW32_NT*|MINGW64_NT*)
    CRYSTAL_BIN="crystal.exe"
    ;;
  *)
    CRYSTAL_BIN="crystal"
    ;;
esac

# CRYSTAL_EXEC_PATH determines the location of the `crystal` program for external
# compiler commands.
CRYSTAL_EXEC_PATH="$SCRIPT_ROOT"
export CRYSTAL_EXEC_PATH

if [ -x "$CRYSTAL_DIR/${CRYSTAL_BIN}" ]; then
  __warning_msg "Using compiled compiler at ${CRYSTAL_DIR#"$PWD/"}/${CRYSTAL_BIN}"
  exec "$CRYSTAL_DIR/${CRYSTAL_BIN}" "$@"
elif (! $PARENT_CRYSTAL_EXISTS); then
  __error_msg 'You need to have a crystal executable in your path! or set CRYSTAL env variable'
  exit 1
else
  exec "$PARENT_CRYSTAL" "$@"
fi


================================================
FILE: bin/crystal.bat
================================================
@echo off
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "%~dp0crystal.ps1" --%% %*


================================================
FILE: bin/crystal.ps1
================================================
param(
    [Parameter(Position = 0, ValueFromRemainingArguments)] [string[]] $CrystalArgs
)

# https://www.powershellgallery.com/packages/PowerGit/0.6.1/Content/Functions%5CResolve-RealPath.ps1
function Resolve-RealPath {
    <#
        .SYNOPSIS
        Implementation of Unix realpath().

        .PARAMETER Path
        Must exist
    #>
    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('FullName')]
        [string] $Path
    )

    if ($PSVersionTable.PSVersion.Major -lt 6 -or $IsWindows) {
        return [IO.Path]::GetFullPath($Path)
    }

    [string[]] $parts = ($Path.TrimStart([IO.Path]::DirectorySeparatorChar).Split([IO.Path]::DirectorySeparatorChar))
    [string] $realPath = ''
    foreach ($part in $parts) {
        $realPath += [string] ([IO.Path]::DirectorySeparatorChar + $part)
        $item = Get-Item $realPath
        if ($item.Target) {
            $realPath = $item.Target
        }
    }
    $realPath
}

# adopted from https://stackoverflow.com/a/15669365
function Write-StdErr {
<#
.SYNOPSIS
Writes text to stderr when running in a regular console window,
to the host''s error stream otherwise.

.DESCRIPTION
Writing to true stderr allows you to write a well-behaved CLI
as a PS script that can be invoked from a batch file, for instance.

Note that PS by default sends ALL its streams to *stdout* when invoked from
cmd.exe.
#>
    param(
        [Parameter(Mandatory)] [string] $Line,
        $ForegroundColor
    )
    if ($Host.Name -eq 'ConsoleHost') {
        if ($ForegroundColor) {
            [Console]::ForegroundColor = $ForegroundColor
        }
        [Console]::Error.WriteLine($Line)
        if ($ForegroundColor) {
            [Console]::ResetColor()
        }
    } else {
        [void] $host.ui.WriteErrorLine($Line)
    }
}

# https://stackoverflow.com/a/43030126
function Invoke-WithEnvironment {
<#
.SYNOPSIS
Invokes commands with a temporarily modified environment.

.DESCRIPTION
Modifies environment variables temporarily based on a hashtable of values,
invokes the specified script block, then restores the previous environment.

.PARAMETER Environment
A hashtable that defines the temporary environment-variable values.
Assign $null to (temporarily) remove an environment variable that is
currently set.

.PARAMETER ScriptBlock
The command(s) to execute with the temporarily modified environment.

.EXAMPLE
> Invoke-WithEnvironment @{ PORT=8080 } { node index.js }

Runs node with environment variable PORT temporarily set to 8080, with its
previous value, if any 
#>
    param(
        [Parameter(Mandatory)] [System.Collections.IDictionary] $Environment,
        [Parameter(Mandatory)] [scriptblock] $ScriptBlock
    )
    # Modify the environment based on the hashtable and save the original 
    # one for later restoration.
    $htOrgEnv = @{}
    foreach ($kv in $Environment.GetEnumerator()) {
        $htOrgEnv[$kv.Key] = (Get-Item -EA SilentlyContinue "env:$($kv.Key)").Value
        Set-Item "env:$($kv.Key)" $kv.Value
    }
    # Invoke the script block
    try {
        & $ScriptBlock
    } finally {
        # Restore the original environment.
        foreach ($kv in $Environment.GetEnumerator()) {
            # Note: setting an environment var. to $null or '' *removes* it.
            Set-Item "env:$($kv.Key)" $htOrgEnv[$kv.Key]
        }
    }
}

# Code ported from:
# https://source.dot.net/#System.Diagnostics.Process/System/Diagnostics/ProcessStartInfo.cs
# https://source.dot.net/#System.Diagnostics.Process/PasteArguments.cs
# Licensed to the .NET Foundation under one or more agreements.
# The .NET Foundation licenses this file to you under the MIT license.
function Append-Argument {
    param(
        [Parameter(Mandatory)] [Text.StringBuilder] $Builder,
        [Parameter(Mandatory)] [AllowEmptyString()] [string] $Arg
    )

    if (-not $Builder.Length -eq 0) {
        [void]$Builder.Append(' ')
    }

    # Parsing rules for non-argv[0] arguments:
    #   - Backslash is a normal character except followed by a quote.
    #   - 2N backslashes followed by a quote ==> N literal backslashes followed by unescaped quote
    #   - 2N+1 backslashes followed by a quote ==> N literal backslashes followed by a literal quote
    #   - Parsing stops at first whitespace outside of quoted region.
    #   - (post 2008 rule): A closing quote followed by another quote ==> literal quote, and parsing remains in quoting mode.
    if ((-not $Builder.Length -eq 0) -and (ContainsNoWhitespaceOrQuotes $Arg)) {
        # Simple case - no quoting or changes needed.
        [void]$Builder.Append($Arg)
    } else {
        [void]$Builder.Append('"')
        $idx = 0
        while ($idx -lt $Arg.Length) {
            $c = $Arg[$idx++]
            if ($c -eq '\') {
                $numBackSlash = 1
                while (($idx -lt $Arg.Length) -and ($Arg[$idx] -eq '\')) {
                    $idx++
                    $numBackslash++
                }

                if ($idx -eq $Arg.Length) {
                    # We'll emit an end quote after this so must double the number of backslashes.
                    [void]$Builder.Append('\', $numBackSlash * 2)
                } elseif ($Arg[$idx] -eq '"') {
                    # Backslashes will be followed by a quote. Must double the number of backslashes.
                    [void]$Builder.Append('\', $numBackSlash * 2 + 1)
                    [void]$Builder.Append('"')
                    $idx++
                } else {
                    # Backslash will not be followed by a quote, so emit as normal characters.
                    [void]$Builder.Append('\', $numBackSlash)
                }

                continue
            }

            if ($c -eq '"') {
                # Escape the quote so it appears as a literal. This also guarantees that we won't end up generating a closing quote followed
                # by another quote (which parses differently pre-2008 vs. post-2008.)
                [void]$Builder.Append('\')
                [void]$Builder.Append('"')
                continue
            }

            [void]$Builder.Append($c)
        }

        [void]$Builder.Append('"')
    }
}

function ContainsNoWhitespaceOrQuotes {
    param(
        [Parameter(Mandatory)] [AllowEmptyString()] [string] $s
    )

    for ($i = 0; $i -lt $s.Length; $i += 1) {
        $c = $s[$i]
        if ([char]::IsWhiteSpace($c) -or ($c -eq '"')) {
            return $False
        }
    }

    $True
}

function Build-Arguments {
    param(
        [Parameter(Mandatory)] [AllowEmptyString()] [AllowNull()] [string[]] $Args
    )

    if ($Args.count -eq 0) { return '' }

    $Builder = 
Download .txt
gitextract_6d0b5p8f/

├── .ameba.yml
├── .circleci/
│   └── config.yml
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   ├── config.yml
│   │   ├── discussion.md
│   │   └── feature-request.md
│   ├── PULL_REQUEST_TEMPLATE/
│   │   └── pull_request_template.md
│   ├── actionlint.yaml
│   ├── renovate.json
│   ├── workflows/
│   │   ├── aarch64.yml
│   │   ├── backport.yml
│   │   ├── docs.yml
│   │   ├── forward-compatibility.yml
│   │   ├── interpreter.yml
│   │   ├── lint.yml
│   │   ├── linux.yml
│   │   ├── llvm.yml
│   │   ├── macos.yml
│   │   ├── mingw-w64-steps.yml
│   │   ├── mingw-w64.yml
│   │   ├── openssl.yml
│   │   ├── regex-engine.yml
│   │   ├── smoke.yml
│   │   ├── update-devenv.yml
│   │   ├── wasm32.yml
│   │   ├── win.yml
│   │   ├── win_build_portable.yml
│   │   └── xml.yml
│   └── zizmor.yml
├── .gitignore
├── .mailmap
├── .markdownlint.yaml
├── .markdownlintignore
├── .well-known/
│   └── funding-manifest-urls
├── Brewfile
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── LICENSES/
│   ├── Apache-2.0.txt
│   ├── MIT.txt
│   └── Swift-exception.txt
├── Makefile
├── Makefile.win
├── NOTICE.md
├── README.md
├── REUSE.toml
├── SECURITY.md
├── UPGRADING.md
├── _typos.toml
├── bin/
│   ├── check-compiler-flag
│   ├── ci
│   ├── crystal
│   ├── crystal.bat
│   └── crystal.ps1
├── devenv.nix
├── devenv.yaml
├── doc/
│   ├── changelogs/
│   │   ├── README.md
│   │   ├── pre-1.0.md
│   │   ├── v1.0.md
│   │   ├── v1.1.md
│   │   ├── v1.10.md
│   │   ├── v1.11.md
│   │   ├── v1.12.md
│   │   ├── v1.13.md
│   │   ├── v1.14.md
│   │   ├── v1.15.md
│   │   ├── v1.16.md
│   │   ├── v1.17.md
│   │   ├── v1.18.md
│   │   ├── v1.19.md
│   │   ├── v1.2.md
│   │   ├── v1.3.md
│   │   ├── v1.4.md
│   │   ├── v1.5.md
│   │   ├── v1.6.md
│   │   ├── v1.7.md
│   │   ├── v1.8.md
│   │   └── v1.9.md
│   └── man/
│       ├── crystal-build.adoc
│       ├── crystal-docs.adoc
│       ├── crystal-env.adoc
│       ├── crystal-eval.adoc
│       ├── crystal-init.adoc
│       ├── crystal-play.adoc
│       ├── crystal-run.adoc
│       ├── crystal-spec.adoc
│       ├── crystal-tool-dependencies.adoc
│       ├── crystal-tool-format.adoc
│       ├── crystal-tool-macro_code_coverage.adoc
│       ├── crystal-tool-unreachable.adoc
│       └── crystal.adoc
├── etc/
│   ├── completion.bash
│   ├── completion.fish
│   ├── completion.zsh
│   ├── gdb/
│   │   └── crystal_formatters.py
│   ├── lldb/
│   │   └── crystal_formatters.py
│   ├── msvc/
│   │   └── crystal.natvis
│   └── win-ci/
│       ├── build-ffi.ps1
│       ├── build-gc.ps1
│       ├── build-iconv.ps1
│       ├── build-llvm.ps1
│       ├── build-mpir.ps1
│       ├── build-openssl.ps1
│       ├── build-pcre.ps1
│       ├── build-pcre2.ps1
│       ├── build-xml2.ps1
│       ├── build-yaml.ps1
│       ├── build-z.ps1
│       ├── crystal.iss
│       ├── cygwin-build-iconv.sh
│       └── setup.ps1
├── lib/
│   └── .shards.info
├── man/
│   └── crystal.1
├── samples/
│   ├── 2048.cr
│   ├── Makefile
│   ├── Makefile.win
│   ├── binary-trees.cr
│   ├── brainfuck.cr
│   ├── channel_primes.cr
│   ├── channel_select.cr
│   ├── compiler/
│   │   ├── formatter_example.cr
│   │   ├── transformer_example.cr
│   │   └── visitor_example.cr
│   ├── conway.cr
│   ├── degree_days.cr
│   ├── egrep.cr
│   ├── fannkuch-redux.cr
│   ├── fibonacci.cr
│   ├── havlak.cr
│   ├── http_server.cr
│   ├── impl.cr
│   ├── llvm/
│   │   └── brainfuck.cr
│   ├── mandelbrot.cr
│   ├── mandelbrot2.cr
│   ├── matmul.cr
│   ├── meteor.cr
│   ├── mt_gc_test.cr
│   ├── nbodies.cr
│   ├── neural_net.cr
│   ├── noise.cr
│   ├── pig.cr
│   ├── pretty_json.cr
│   ├── quine.cr
│   ├── red_black_tree.cr
│   ├── sdl/
│   │   ├── fire.cr
│   │   ├── fire.txt
│   │   ├── raytracer.cr
│   │   ├── sdl/
│   │   │   ├── lib_sdl.cr
│   │   │   ├── sdl.cr
│   │   │   └── surface.cr
│   │   ├── tv.cr
│   │   └── tv.txt
│   ├── sieve.cr
│   ├── spectral-norm.cr
│   ├── sudoku.cr
│   ├── tcp_client.cr
│   ├── tcp_server.cr
│   ├── text_raytracer.cr
│   ├── tree.cr
│   └── wordcount.cr
├── scripts/
│   ├── docs-versions.sh
│   ├── generate_data.mk
│   ├── generate_glob_specs.sh
│   ├── generate_grapheme_break_specs.cr
│   ├── generate_grapheme_properties.cr
│   ├── generate_html_entities.cr
│   ├── generate_llvm_version_info.cr
│   ├── generate_object_properties.cr
│   ├── generate_ssl_server_defaults.cr
│   ├── generate_unicode_data.cr
│   ├── generate_windows_zone_names.cr
│   ├── git/
│   │   └── pre-commit
│   ├── github-changelog.cr
│   ├── grapheme_properties.ecr
│   ├── html_entities.ecr
│   ├── print_regex_config.cr
│   ├── release-update.sh
│   ├── test_ssl_server.cr
│   ├── unicode_data.ecr
│   ├── update-changelog.sh
│   ├── update-distribution-scripts.sh
│   ├── update-shards.sh
│   └── windows_zone_names.ecr
├── shard.yml
├── shell.nix
├── spec/
│   ├── all_spec.cr
│   ├── compiler/
│   │   ├── codegen/
│   │   │   ├── abi/
│   │   │   │   ├── aarch64_spec.cr
│   │   │   │   ├── arm_spec.cr
│   │   │   │   ├── avr_spec.cr
│   │   │   │   ├── x86_64_spec.cr
│   │   │   │   └── x86_spec.cr
│   │   │   ├── alias_spec.cr
│   │   │   ├── and_spec.cr
│   │   │   ├── array_literal_spec.cr
│   │   │   ├── asm_spec.cr
│   │   │   ├── automatic_cast_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── c_abi/
│   │   │   │   ├── c_abi_spec.cr
│   │   │   │   └── c_abi_x86_64_spec.cr
│   │   │   ├── c_enum_spec.cr
│   │   │   ├── c_struct_spec.cr
│   │   │   ├── c_union_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── cast_spec.cr
│   │   │   ├── class_spec.cr
│   │   │   ├── class_var_spec.cr
│   │   │   ├── closure_spec.cr
│   │   │   ├── const_spec.cr
│   │   │   ├── debug_spec.cr
│   │   │   ├── def_default_value_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── double_splat_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exception_spec.cr
│   │   │   ├── experimental_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── fun_spec.cr
│   │   │   ├── generic_class_spec.cr
│   │   │   ├── hash_literal_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── if_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── macro_spec.cr
│   │   │   ├── magic_constants_spec.cr
│   │   │   ├── method_missing_spec.cr
│   │   │   ├── module_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── named_args_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── new_spec.cr
│   │   │   ├── next_spec.cr
│   │   │   ├── nilable_cast_spec.cr
│   │   │   ├── no_return_spec.cr
│   │   │   ├── not_spec.cr
│   │   │   ├── offsetof_spec.cr
│   │   │   ├── op_assign_spec.cr
│   │   │   ├── or_spec.cr
│   │   │   ├── pointer_spec.cr
│   │   │   ├── previous_def_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── private_spec.cr
│   │   │   ├── proc_spec.cr
│   │   │   ├── regex_literal_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── return_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── splat_spec.cr
│   │   │   ├── ssa_spec.cr
│   │   │   ├── struct_spec.cr
│   │   │   ├── super_spec.cr
│   │   │   ├── target_spec.cr
│   │   │   ├── thread_local_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── type_declaration_spec.cr
│   │   │   ├── uninitialized_spec.cr
│   │   │   ├── union_type_spec.cr
│   │   │   ├── until_spec.cr
│   │   │   ├── var_spec.cr
│   │   │   ├── virtual_spec.cr
│   │   │   ├── void_spec.cr
│   │   │   ├── while_spec.cr
│   │   │   └── yield_with_scope_spec.cr
│   │   ├── compiler_spec.cr
│   │   ├── config_spec.cr
│   │   ├── crystal/
│   │   │   ├── commands/
│   │   │   │   └── clear_cache_spec.cr
│   │   │   ├── tools/
│   │   │   │   ├── context_spec.cr
│   │   │   │   ├── doc/
│   │   │   │   │   ├── directives_spec.cr
│   │   │   │   │   ├── doc_renderer_spec.cr
│   │   │   │   │   ├── generator_spec.cr
│   │   │   │   │   ├── macro_spec.cr
│   │   │   │   │   ├── method_spec.cr
│   │   │   │   │   ├── project_info_spec.cr
│   │   │   │   │   └── type_spec.cr
│   │   │   │   ├── doc_spec.cr
│   │   │   │   ├── expand_spec.cr
│   │   │   │   ├── flags_spec.cr
│   │   │   │   ├── format_spec.cr
│   │   │   │   ├── hierarchy_spec.cr
│   │   │   │   ├── implementations_spec.cr
│   │   │   │   ├── init_spec.cr
│   │   │   │   ├── macro_code_coverage_spec.cr
│   │   │   │   ├── playground_spec.cr
│   │   │   │   ├── repl_spec.cr
│   │   │   │   ├── table_print_spec.cr
│   │   │   │   └── unreachable_spec.cr
│   │   │   └── types_spec.cr
│   │   ├── crystal_path/
│   │   │   └── crystal_path_spec.cr
│   │   ├── data/
│   │   │   ├── args_test
│   │   │   ├── build
│   │   │   ├── compiler_sample
│   │   │   ├── crystal_path/
│   │   │   │   ├── foo.cr/
│   │   │   │   │   └── foo.cr
│   │   │   │   ├── other_test_files/
│   │   │   │   │   └── other_test_files.cr
│   │   │   │   ├── simple.cr
│   │   │   │   └── test_files/
│   │   │   │       ├── file_one.cr
│   │   │   │       ├── file_two.cr
│   │   │   │       ├── src/
│   │   │   │       │   ├── file_three.cr
│   │   │   │       │   ├── test_files/
│   │   │   │       │   │   ├── another/
│   │   │   │       │   │   │   └── another.cr
│   │   │   │       │   │   └── file_four.cr
│   │   │   │       │   ├── test_files.cr
│   │   │   │       │   └── yet_another/
│   │   │   │       │       └── yet_another.cr
│   │   │   │       └── test_folder/
│   │   │   │           ├── file_three.cr
│   │   │   │           ├── not_a_crystal_file.txt
│   │   │   │           └── test_folder.cr
│   │   │   ├── ffi/
│   │   │   │   └── sum.c
│   │   │   ├── interpreter/
│   │   │   │   └── sum.c
│   │   │   ├── loader/
│   │   │   │   ├── bar.c
│   │   │   │   ├── foo.c
│   │   │   │   └── foo2.c
│   │   │   └── visibility.h
│   │   ├── ffi/
│   │   │   └── ffi_spec.cr
│   │   ├── formatter/
│   │   │   └── formatter_spec.cr
│   │   ├── interpreter/
│   │   │   ├── autocast_spec.cr
│   │   │   ├── blocks_spec.cr
│   │   │   ├── bugs_spec.cr
│   │   │   ├── calls_spec.cr
│   │   │   ├── casts_spec.cr
│   │   │   ├── class_vars_spec.cr
│   │   │   ├── classes_spec.cr
│   │   │   ├── closures_spec.cr
│   │   │   ├── constants_spec.cr
│   │   │   ├── control_flow_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exceptions_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── integration_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── multidispatch_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── pointers_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── procs_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── structs_spec.cr
│   │   │   ├── symbol_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── typeof_spec.cr
│   │   │   ├── types_spec.cr
│   │   │   └── unions_spec.cr
│   │   ├── interpreter_spec.cr
│   │   ├── lexer/
│   │   │   ├── lexer_comment_spec.cr
│   │   │   ├── lexer_doc_spec.cr
│   │   │   ├── lexer_macro_spec.cr
│   │   │   ├── lexer_objects/
│   │   │   │   └── strings.cr
│   │   │   ├── lexer_spec.cr
│   │   │   ├── lexer_string_array_spec.cr
│   │   │   ├── lexer_string_spec.cr
│   │   │   └── location_spec.cr
│   │   ├── loader/
│   │   │   ├── msvc_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── unix_spec.cr
│   │   ├── macro/
│   │   │   ├── macro_expander_spec.cr
│   │   │   └── macro_methods_spec.cr
│   │   ├── normalize/
│   │   │   ├── and_spec.cr
│   │   │   ├── array_literal_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── chained_comparisons_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── expressions_spec.cr
│   │   │   ├── hash_literal_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── op_assign_spec.cr
│   │   │   ├── or_spec.cr
│   │   │   ├── proc_pointer_spec.cr
│   │   │   ├── range_literal_spec.cr
│   │   │   ├── regex_spec.cr
│   │   │   ├── return_next_break_spec.cr
│   │   │   ├── select_spec.cr
│   │   │   ├── string_interpolation_spec.cr
│   │   │   ├── unless_spec.cr
│   │   │   └── until_spec.cr
│   │   ├── parser/
│   │   │   ├── parser_doc_spec.cr
│   │   │   ├── parser_spec.cr
│   │   │   ├── to_s_spec.cr
│   │   │   └── warnings_spec.cr
│   │   ├── semantic/
│   │   │   ├── abstract_def_spec.cr
│   │   │   ├── alias_spec.cr
│   │   │   ├── annotation_spec.cr
│   │   │   ├── array_spec.cr
│   │   │   ├── automatic_cast_spec.cr
│   │   │   ├── block_spec.cr
│   │   │   ├── c_enum_spec.cr
│   │   │   ├── c_struct_spec.cr
│   │   │   ├── c_type_spec.cr
│   │   │   ├── c_union_spec.cr
│   │   │   ├── call_error_spec.cr
│   │   │   ├── case_spec.cr
│   │   │   ├── cast_spec.cr
│   │   │   ├── class_spec.cr
│   │   │   ├── class_var_spec.cr
│   │   │   ├── cleanup_spec.cr
│   │   │   ├── closure_spec.cr
│   │   │   ├── concrete_types_spec.cr
│   │   │   ├── const_spec.cr
│   │   │   ├── def_overload_spec.cr
│   │   │   ├── def_spec.cr
│   │   │   ├── did_you_mean_spec.cr
│   │   │   ├── doc_spec.cr
│   │   │   ├── double_splat_spec.cr
│   │   │   ├── enum_spec.cr
│   │   │   ├── exception_spec.cr
│   │   │   ├── extern_spec.cr
│   │   │   ├── external_internal_spec.cr
│   │   │   ├── fun_spec.cr
│   │   │   ├── generic_class_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── if_spec.cr
│   │   │   ├── initialize_spec.cr
│   │   │   ├── instance_var_spec.cr
│   │   │   ├── is_a_spec.cr
│   │   │   ├── lib_spec.cr
│   │   │   ├── macro_overload_spec.cr
│   │   │   ├── macro_spec.cr
│   │   │   ├── metaclass_spec.cr
│   │   │   ├── method_missing_spec.cr
│   │   │   ├── module_spec.cr
│   │   │   ├── multi_assign_spec.cr
│   │   │   ├── named_args_spec.cr
│   │   │   ├── named_tuple_spec.cr
│   │   │   ├── new_spec.cr
│   │   │   ├── nil_spec.cr
│   │   │   ├── nilable_cast_spec.cr
│   │   │   ├── nilable_instance_var_spec.cr
│   │   │   ├── no_return_spec.cr
│   │   │   ├── not_spec.cr
│   │   │   ├── offsetof_spec.cr
│   │   │   ├── pointer_spec.cr
│   │   │   ├── previous_def_spec.cr
│   │   │   ├── primitives_spec.cr
│   │   │   ├── private_spec.cr
│   │   │   ├── proc_spec.cr
│   │   │   ├── recursive_struct_check_spec.cr
│   │   │   ├── reference_storage_spec.cr
│   │   │   ├── require_spec.cr
│   │   │   ├── responds_to_spec.cr
│   │   │   ├── restrictions_augmenter_spec.cr
│   │   │   ├── restrictions_spec.cr
│   │   │   ├── return_spec.cr
│   │   │   ├── sizeof_spec.cr
│   │   │   ├── special_vars_spec.cr
│   │   │   ├── splat_spec.cr
│   │   │   ├── ssa_spec.cr
│   │   │   ├── static_array_spec.cr
│   │   │   ├── struct_spec.cr
│   │   │   ├── super_spec.cr
│   │   │   ├── tuple_spec.cr
│   │   │   ├── uninitialized_spec.cr
│   │   │   ├── union_spec.cr
│   │   │   ├── var_spec.cr
│   │   │   ├── virtual_metaclass_spec.cr
│   │   │   ├── virtual_spec.cr
│   │   │   ├── visibility_modifiers_spec.cr
│   │   │   ├── warnings_spec.cr
│   │   │   ├── while_spec.cr
│   │   │   └── yield_with_scope_spec.cr
│   │   ├── spec_helper.cr
│   │   └── util_spec.cr
│   ├── compiler_spec.cr
│   ├── debug/
│   │   ├── arrays.cr
│   │   ├── blocks.cr
│   │   ├── driver.cr
│   │   ├── extern_unions.cr
│   │   ├── large_enums.cr
│   │   ├── strings.cr
│   │   ├── test.sh
│   │   └── top_level.cr
│   ├── generate_wasm32_spec.sh
│   ├── llvm-ir/
│   │   ├── argless-initialize-debug-loc.cr
│   │   ├── assign-unions.cr
│   │   ├── cast-unions.cr
│   │   ├── class-var-read-debug-loc.cr
│   │   ├── const-read-debug-loc.cr
│   │   ├── memcpy.cr
│   │   ├── memset.cr
│   │   ├── pass-closure-to-c-debug-loc.cr
│   │   ├── proc-call-debug-loc.cr
│   │   ├── proc-pointer-debug-loc.cr
│   │   ├── test.sh
│   │   ├── virtual-class-var-read-debug-loc.cr
│   │   └── virtual-metaclass-var-read-debug-loc.cr
│   ├── manual/
│   │   ├── badssl_spec.cr
│   │   ├── digest_large_file_spec.cr
│   │   ├── find_executable_spec.cr
│   │   ├── gzip_large_file_spec.cr
│   │   ├── hash_large_spec.cr
│   │   ├── https_client_spec.cr
│   │   ├── string_normalize_spec.cr
│   │   ├── string_to_f32_spec.cr
│   │   └── string_to_f_supplemental_spec.cr
│   ├── primitives/
│   │   ├── external_command_spec.cr
│   │   ├── float_spec.cr
│   │   ├── int_spec.cr
│   │   ├── pointer_spec.cr
│   │   ├── reference_spec.cr
│   │   ├── slice_spec.cr
│   │   └── struct_spec.cr
│   ├── primitives_spec.cr
│   ├── spec_helper.cr
│   ├── std/
│   │   ├── array_spec.cr
│   │   ├── atomic_spec.cr
│   │   ├── base64_spec.cr
│   │   ├── benchmark_spec.cr
│   │   ├── big/
│   │   │   ├── big_decimal_spec.cr
│   │   │   ├── big_float_spec.cr
│   │   │   ├── big_int_spec.cr
│   │   │   ├── big_rational_spec.cr
│   │   │   └── number_spec.cr
│   │   ├── bit_array_spec.cr
│   │   ├── bool_spec.cr
│   │   ├── box_spec.cr
│   │   ├── channel_spec.cr
│   │   ├── char/
│   │   │   └── reader_spec.cr
│   │   ├── char_spec.cr
│   │   ├── class_spec.cr
│   │   ├── colorize_spec.cr
│   │   ├── comparable_spec.cr
│   │   ├── complex_spec.cr
│   │   ├── compress/
│   │   │   ├── deflate/
│   │   │   │   └── deflate_spec.cr
│   │   │   ├── gzip/
│   │   │   │   └── gzip_spec.cr
│   │   │   ├── zip/
│   │   │   │   ├── zip_file_spec.cr
│   │   │   │   └── zip_spec.cr
│   │   │   └── zlib/
│   │   │       ├── reader_spec.cr
│   │   │       ├── stress_spec.cr
│   │   │       └── writer_spec.cr
│   │   ├── concurrent/
│   │   │   └── select_spec.cr
│   │   ├── concurrent_spec.cr
│   │   ├── crypto/
│   │   │   ├── bcrypt/
│   │   │   │   ├── base64_spec.cr
│   │   │   │   └── password_spec.cr
│   │   │   ├── bcrypt_spec.cr
│   │   │   ├── blowfish_spec.cr
│   │   │   └── subtle_spec.cr
│   │   ├── crystal/
│   │   │   ├── compiler_rt/
│   │   │   │   ├── ashlti3_spec.cr
│   │   │   │   ├── ashrti3_spec.cr
│   │   │   │   ├── divmod128_spec.cr
│   │   │   │   ├── fixint_spec.cr
│   │   │   │   ├── float_spec.cr
│   │   │   │   ├── lshrti3_spec.cr
│   │   │   │   ├── mulodi4_spec.cr
│   │   │   │   ├── mulosi4_spec.cr
│   │   │   │   ├── muloti4_spec.cr
│   │   │   │   ├── multi3_spec.cr
│   │   │   │   ├── powidf2_spec.cr
│   │   │   │   ├── powisf2_spec.cr
│   │   │   │   └── spec_helper.cr
│   │   │   ├── digest/
│   │   │   │   ├── md5_spec.cr
│   │   │   │   └── sha1_spec.cr
│   │   │   ├── event_loop/
│   │   │   │   ├── polling/
│   │   │   │   │   ├── arena_spec.cr
│   │   │   │   │   ├── poll_descriptor_spec.cr
│   │   │   │   │   └── waiters_spec.cr
│   │   │   │   └── timers_spec.cr
│   │   │   ├── fd_lock_spec.cr
│   │   │   ├── hasher_spec.cr
│   │   │   ├── pointer_linked_list_spec.cr
│   │   │   ├── pointer_pairing_heap_spec.cr
│   │   │   ├── syntax_highlighter/
│   │   │   │   ├── colorize_spec.cr
│   │   │   │   └── html_spec.cr
│   │   │   ├── system/
│   │   │   │   └── cpucount_spec.cr
│   │   │   └── system_spec.cr
│   │   ├── csv/
│   │   │   ├── csv_build_spec.cr
│   │   │   ├── csv_lex_spec.cr
│   │   │   ├── csv_parse_spec.cr
│   │   │   └── csv_spec.cr
│   │   ├── data/
│   │   │   ├── android_tzdata
│   │   │   ├── argf_test_file_1.txt
│   │   │   ├── argf_test_file_2.txt
│   │   │   ├── argf_test_file_3.xml
│   │   │   ├── backtrace_sample
│   │   │   ├── blank_test_file.txt
│   │   │   ├── cipher_spec.ciphertext
│   │   │   ├── collect_within_ensure
│   │   │   ├── crash_backtrace_sample
│   │   │   ├── dir/
│   │   │   │   ├── dots/
│   │   │   │   │   ├── .dot.hidden
│   │   │   │   │   └── .hidden/
│   │   │   │   │       └── f1.txt
│   │   │   │   ├── f1.txt
│   │   │   │   ├── f2.txt
│   │   │   │   ├── f3.txx
│   │   │   │   ├── g2.txt
│   │   │   │   ├── subdir/
│   │   │   │   │   ├── f1.txt
│   │   │   │   │   └── subdir2/
│   │   │   │   │       └── f2.txt
│   │   │   │   └── subdir2/
│   │   │   │       └── .gitkeep
│   │   │   ├── exception_backtrace_sample
│   │   │   ├── io_data_incomplete_multibyte_sequence.txt
│   │   │   ├── io_data_incomplete_multibyte_sequence_2.txt
│   │   │   ├── large_single_line_string.txt
│   │   │   ├── mime.types
│   │   │   ├── openssl/
│   │   │   │   ├── openssl.crt
│   │   │   │   └── openssl.key
│   │   │   ├── static_file_handler/
│   │   │   │   ├── empty.txt
│   │   │   │   ├── foo/
│   │   │   │   │   └── bar.txt
│   │   │   │   ├── range.txt
│   │   │   │   └── test.txt
│   │   │   ├── test_file.ini
│   │   │   ├── test_file.txt
│   │   │   ├── test_template.ecr
│   │   │   ├── test_template2.ecr
│   │   │   ├── test_template3.ecr
│   │   │   ├── test_template4.ecr
│   │   │   ├── test_template5.ecr
│   │   │   ├── test_template6.ecr
│   │   │   ├── test_template7.ecr
│   │   │   └── zoneinfo/
│   │   │       └── Foo/
│   │   │           ├── Bar
│   │   │           └── invalid
│   │   ├── deque_spec.cr
│   │   ├── digest/
│   │   │   ├── adler32_spec.cr
│   │   │   ├── crc32_spec.cr
│   │   │   ├── io_digest_spec.cr
│   │   │   ├── md5_spec.cr
│   │   │   ├── sha1_spec.cr
│   │   │   ├── sha256_spec.cr
│   │   │   ├── sha512_spec.cr
│   │   │   └── spec_helper.cr
│   │   ├── dir_spec.cr
│   │   ├── double_spec.cr
│   │   ├── ecr/
│   │   │   ├── ecr_lexer_spec.cr
│   │   │   └── ecr_spec.cr
│   │   ├── enum_spec.cr
│   │   ├── enumerable_spec.cr
│   │   ├── env_spec.cr
│   │   ├── errno_spec.cr
│   │   ├── exception/
│   │   │   └── call_stack_spec.cr
│   │   ├── exception_spec.cr
│   │   ├── fiber/
│   │   │   ├── execution_context/
│   │   │   │   ├── global_queue_spec.cr
│   │   │   │   ├── parallel_spec.cr
│   │   │   │   ├── runnables_spec.cr
│   │   │   │   └── spec_helper.cr
│   │   │   └── list_spec.cr
│   │   ├── fiber_spec.cr
│   │   ├── file/
│   │   │   ├── match-fast-glob_spec.cr
│   │   │   ├── match_spec.cr
│   │   │   └── tempfile_spec.cr
│   │   ├── file_spec.cr
│   │   ├── file_utils_spec.cr
│   │   ├── float_printer/
│   │   │   ├── diy_fp_spec.cr
│   │   │   ├── grisu3_spec.cr
│   │   │   ├── hexfloat_spec.cr
│   │   │   ├── ieee_spec.cr
│   │   │   ├── ryu_printf_spec.cr
│   │   │   ├── ryu_printf_test_cases.cr
│   │   │   └── shortest_spec.cr
│   │   ├── float_spec.cr
│   │   ├── gc_spec.cr
│   │   ├── hash_spec.cr
│   │   ├── html_spec.cr
│   │   ├── http/
│   │   │   ├── chunked_content_spec.cr
│   │   │   ├── client/
│   │   │   │   ├── client_spec.cr
│   │   │   │   └── response_spec.cr
│   │   │   ├── cookie_spec.cr
│   │   │   ├── cookies_spec.cr
│   │   │   ├── formdata/
│   │   │   │   ├── builder_spec.cr
│   │   │   │   └── parser_spec.cr
│   │   │   ├── formdata_spec.cr
│   │   │   ├── headers_spec.cr
│   │   │   ├── http_spec.cr
│   │   │   ├── params_spec.cr
│   │   │   ├── request_spec.cr
│   │   │   ├── server/
│   │   │   │   ├── handlers/
│   │   │   │   │   ├── compress_handler_spec.cr
│   │   │   │   │   ├── error_handler_spec.cr
│   │   │   │   │   ├── handler_spec.cr
│   │   │   │   │   ├── log_handler_spec.cr
│   │   │   │   │   ├── static_file_handler_spec.cr
│   │   │   │   │   └── websocket_handler_spec.cr
│   │   │   │   ├── request_processor_spec.cr
│   │   │   │   ├── response_spec.cr
│   │   │   │   └── server_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── status_spec.cr
│   │   │   └── web_socket_spec.cr
│   │   ├── humanize_spec.cr
│   │   ├── indexable/
│   │   │   └── mutable_spec.cr
│   │   ├── indexable_spec.cr
│   │   ├── ini_spec.cr
│   │   ├── int_spec.cr
│   │   ├── io/
│   │   │   ├── argf_spec.cr
│   │   │   ├── buffered_spec.cr
│   │   │   ├── byte_format_spec.cr
│   │   │   ├── delimited_spec.cr
│   │   │   ├── file_descriptor_spec.cr
│   │   │   ├── hexdump_spec.cr
│   │   │   ├── io_spec.cr
│   │   │   ├── memory_spec.cr
│   │   │   ├── multi_writer_spec.cr
│   │   │   ├── sized_spec.cr
│   │   │   └── stapled_spec.cr
│   │   ├── iterator_spec.cr
│   │   ├── json/
│   │   │   ├── any_spec.cr
│   │   │   ├── builder_spec.cr
│   │   │   ├── lexer_spec.cr
│   │   │   ├── parser_spec.cr
│   │   │   ├── pull_parser_spec.cr
│   │   │   ├── serializable_spec.cr
│   │   │   └── serialization_spec.cr
│   │   ├── kernel_spec.cr
│   │   ├── levenshtein_spec.cr
│   │   ├── llvm/
│   │   │   ├── llvm_spec.cr
│   │   │   └── type_spec.cr
│   │   ├── log/
│   │   │   ├── broadcast_backend_spec.cr
│   │   │   ├── builder_spec.cr
│   │   │   ├── context_spec.cr
│   │   │   ├── dispatch_spec.cr
│   │   │   ├── env_config_spec.cr
│   │   │   ├── format_spec.cr
│   │   │   ├── io_backend_spec.cr
│   │   │   ├── log_spec.cr
│   │   │   ├── main_spec.cr
│   │   │   ├── metadata_spec.cr
│   │   │   └── spec_spec.cr
│   │   ├── math_spec.cr
│   │   ├── mime/
│   │   │   ├── media_type_spec.cr
│   │   │   ├── multipart/
│   │   │   │   ├── builder_spec.cr
│   │   │   │   └── parser_spec.cr
│   │   │   └── multipart_spec.cr
│   │   ├── mime_spec.cr
│   │   ├── mutex_spec.cr
│   │   ├── named_tuple_spec.cr
│   │   ├── number_spec.cr
│   │   ├── oauth/
│   │   │   ├── access_token_spec.cr
│   │   │   ├── authorization_header_spec.cr
│   │   │   ├── consumer_spec.cr
│   │   │   ├── request_token_spec.cr
│   │   │   └── signature_spec.cr
│   │   ├── oauth2/
│   │   │   ├── access_token_spec.cr
│   │   │   ├── client_spec.cr
│   │   │   └── session_spec.cr
│   │   ├── object_spec.cr
│   │   ├── openssl/
│   │   │   ├── cipher_spec.cr
│   │   │   ├── digest_spec.cr
│   │   │   ├── hmac_spec.cr
│   │   │   ├── pkcs5_spec.cr
│   │   │   ├── ssl/
│   │   │   │   ├── context_spec.cr
│   │   │   │   ├── hostname_validation_spec.cr
│   │   │   │   ├── server_spec.cr
│   │   │   │   └── socket_spec.cr
│   │   │   └── x509/
│   │   │       ├── certificate_spec.cr
│   │   │       └── name_spec.cr
│   │   ├── option_parser_spec.cr
│   │   ├── path_spec.cr
│   │   ├── pointer/
│   │   │   └── appender_spec.cr
│   │   ├── pointer_spec.cr
│   │   ├── pp_spec.cr
│   │   ├── pretty_print_spec.cr
│   │   ├── proc_spec.cr
│   │   ├── process/
│   │   │   ├── exit_reason_spec.cr
│   │   │   ├── find_executable_spec.cr
│   │   │   ├── status_spec.cr
│   │   │   └── utils_spec.cr
│   │   ├── process_spec.cr
│   │   ├── raise_spec.cr
│   │   ├── random/
│   │   │   ├── isaac_spec.cr
│   │   │   ├── pcg32_spec.cr
│   │   │   └── secure_spec.cr
│   │   ├── random_spec.cr
│   │   ├── range_spec.cr
│   │   ├── record_spec.cr
│   │   ├── reference_spec.cr
│   │   ├── regex/
│   │   │   └── match_data_spec.cr
│   │   ├── regex_spec.cr
│   │   ├── semantic_version_spec.cr
│   │   ├── set_spec.cr
│   │   ├── signal_spec.cr
│   │   ├── slice_spec.cr
│   │   ├── socket/
│   │   │   ├── address_spec.cr
│   │   │   ├── addrinfo_spec.cr
│   │   │   ├── socket_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   ├── tcp_server_spec.cr
│   │   │   ├── tcp_socket_spec.cr
│   │   │   ├── udp_socket_spec.cr
│   │   │   ├── unix_server_spec.cr
│   │   │   └── unix_socket_spec.cr
│   │   ├── spec/
│   │   │   ├── context_spec.cr
│   │   │   ├── expectations_spec.cr
│   │   │   ├── filters_spec.cr
│   │   │   ├── helpers/
│   │   │   │   └── iterate_spec.cr
│   │   │   ├── hooks_spec.cr
│   │   │   ├── junit_formatter_spec.cr
│   │   │   ├── list_tags_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── tap_formatter_spec.cr
│   │   ├── spec_helper.cr
│   │   ├── spec_spec.cr
│   │   ├── sprintf_spec.cr
│   │   ├── static_array_spec.cr
│   │   ├── string/
│   │   │   ├── grapheme_break_spec.cr
│   │   │   ├── grapheme_spec.cr
│   │   │   ├── spec_helper.cr
│   │   │   └── utf16_spec.cr
│   │   ├── string_builder_spec.cr
│   │   ├── string_pool_spec.cr
│   │   ├── string_scanner_spec.cr
│   │   ├── string_spec.cr
│   │   ├── struct_spec.cr
│   │   ├── symbol_spec.cr
│   │   ├── sync/
│   │   │   ├── condition_variable_spec.cr
│   │   │   ├── exclusive_spec.cr
│   │   │   ├── mutex_spec.cr
│   │   │   ├── rw_lock_spec.cr
│   │   │   ├── shared_spec.cr
│   │   │   └── spec_helper.cr
│   │   ├── syscall_spec.cr
│   │   ├── system/
│   │   │   ├── group_spec.cr
│   │   │   └── user_spec.cr
│   │   ├── system_error_spec.cr
│   │   ├── system_spec.cr
│   │   ├── thread/
│   │   │   ├── condition_variable_spec.cr
│   │   │   └── mutex_spec.cr
│   │   ├── thread_spec.cr
│   │   ├── time/
│   │   │   ├── custom_formats_spec.cr
│   │   │   ├── format_spec.cr
│   │   │   ├── instant_spec.cr
│   │   │   ├── location_spec.cr
│   │   │   ├── span_spec.cr
│   │   │   └── time_spec.cr
│   │   ├── tuple_spec.cr
│   │   ├── uint_spec.cr
│   │   ├── uri/
│   │   │   ├── json_spec.cr
│   │   │   ├── params/
│   │   │   │   ├── from_www_form_spec.cr
│   │   │   │   ├── serializable_spec.cr
│   │   │   │   └── to_www_form_spec.cr
│   │   │   ├── params_spec.cr
│   │   │   └── punycode_spec.cr
│   │   ├── uri_spec.cr
│   │   ├── uuid/
│   │   │   ├── json_spec.cr
│   │   │   └── yaml_spec.cr
│   │   ├── uuid_spec.cr
│   │   ├── va_list_spec.cr
│   │   ├── wait_group_spec.cr
│   │   ├── weak_ref_spec.cr
│   │   ├── winerror_spec.cr
│   │   ├── xml/
│   │   │   ├── builder_spec.cr
│   │   │   ├── html_spec.cr
│   │   │   ├── reader_spec.cr
│   │   │   ├── xml_spec.cr
│   │   │   └── xpath_spec.cr
│   │   └── yaml/
│   │       ├── any_spec.cr
│   │       ├── builder_spec.cr
│   │       ├── nodes/
│   │       │   ├── builder_spec.cr
│   │       │   └── parser_spec.cr
│   │       ├── schema/
│   │       │   ├── core_spec.cr
│   │       │   └── fail_safe_spec.cr
│   │       ├── serializable_spec.cr
│   │       ├── serialization_spec.cr
│   │       ├── yaml_pull_parser_spec.cr
│   │       └── yaml_spec.cr
│   ├── std_spec.cr
│   ├── support/
│   │   ├── channel.cr
│   │   ├── env.cr
│   │   ├── fibers.cr
│   │   ├── finalize.cr
│   │   ├── interpreted.cr
│   │   ├── io.cr
│   │   ├── mt_abort_timeout.cr
│   │   ├── number.cr
│   │   ├── retry.cr
│   │   ├── ssl.cr
│   │   ├── string.cr
│   │   ├── syntax.cr
│   │   ├── tempfile.cr
│   │   ├── thread.cr
│   │   ├── time.cr
│   │   ├── wait_for.cr
│   │   ├── wasm32.cr
│   │   └── win32.cr
│   ├── syntax_spec.cr
│   └── wasm32_std_spec.cr
└── src/
    ├── VERSION
    ├── annotations.cr
    ├── array.cr
    ├── atomic.cr
    ├── base64.cr
    ├── benchmark/
    │   ├── bm.cr
    │   └── ips.cr
    ├── benchmark.cr
    ├── big/
    │   ├── big_decimal.cr
    │   ├── big_float.cr
    │   ├── big_int.cr
    │   ├── big_rational.cr
    │   ├── json.cr
    │   ├── lib_gmp.cr
    │   ├── number.cr
    │   └── yaml.cr
    ├── big.cr
    ├── bit_array.cr
    ├── bool.cr
    ├── box.cr
    ├── channel/
    │   ├── select/
    │   │   ├── select_action.cr
    │   │   └── timeout_action.cr
    │   └── select.cr
    ├── channel.cr
    ├── char/
    │   └── reader.cr
    ├── char.cr
    ├── class.cr
    ├── colorize.cr
    ├── comparable.cr
    ├── compiler/
    │   ├── crystal/
    │   │   ├── annotatable.cr
    │   │   ├── codegen/
    │   │   │   ├── abi/
    │   │   │   │   ├── aarch64.cr
    │   │   │   │   ├── arm.cr
    │   │   │   │   ├── avr.cr
    │   │   │   │   ├── wasm32.cr
    │   │   │   │   ├── x86.cr
    │   │   │   │   ├── x86_64.cr
    │   │   │   │   └── x86_win64.cr
    │   │   │   ├── abi.cr
    │   │   │   ├── asm.cr
    │   │   │   ├── ast.cr
    │   │   │   ├── cache_dir.cr
    │   │   │   ├── call.cr
    │   │   │   ├── cast.cr
    │   │   │   ├── class_var.cr
    │   │   │   ├── codegen.cr
    │   │   │   ├── cond.cr
    │   │   │   ├── const.cr
    │   │   │   ├── context.cr
    │   │   │   ├── crystal_llvm_builder.cr
    │   │   │   ├── debug.cr
    │   │   │   ├── dump_type_info.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── experimental.cr
    │   │   │   ├── fun.cr
    │   │   │   ├── link.cr
    │   │   │   ├── llvm_builder_helper.cr
    │   │   │   ├── llvm_id.cr
    │   │   │   ├── llvm_typer.cr
    │   │   │   ├── match.cr
    │   │   │   ├── once.cr
    │   │   │   ├── phi.cr
    │   │   │   ├── primitives.cr
    │   │   │   ├── target.cr
    │   │   │   ├── type_id.cr
    │   │   │   ├── types.cr
    │   │   │   └── unions.cr
    │   │   ├── command/
    │   │   │   ├── clear_cache.cr
    │   │   │   ├── cursor.cr
    │   │   │   ├── docs.cr
    │   │   │   ├── env.cr
    │   │   │   ├── eval.cr
    │   │   │   ├── format.cr
    │   │   │   ├── playground.cr
    │   │   │   ├── repl.cr
    │   │   │   └── spec.cr
    │   │   ├── command.cr
    │   │   ├── compiler.cr
    │   │   ├── config.cr
    │   │   ├── crystal_path.cr
    │   │   ├── error.cr
    │   │   ├── exception.cr
    │   │   ├── ffi/
    │   │   │   ├── call_interface.cr
    │   │   │   ├── closure.cr
    │   │   │   ├── ffi.cr
    │   │   │   ├── lib_ffi.cr
    │   │   │   └── type.cr
    │   │   ├── formatter.cr
    │   │   ├── interpreter/
    │   │   │   ├── c.cr
    │   │   │   ├── cast.cr
    │   │   │   ├── class_vars.cr
    │   │   │   ├── closure.cr
    │   │   │   ├── closure_context.cr
    │   │   │   ├── compiled_block.cr
    │   │   │   ├── compiled_def.cr
    │   │   │   ├── compiled_instructions.cr
    │   │   │   ├── compiler.cr
    │   │   │   ├── constants.cr
    │   │   │   ├── context.cr
    │   │   │   ├── debug.cr
    │   │   │   ├── disassembler.cr
    │   │   │   ├── escaping_exception.cr
    │   │   │   ├── ffi_closure_context.cr
    │   │   │   ├── instruction.cr
    │   │   │   ├── instructions.cr
    │   │   │   ├── interpreter.cr
    │   │   │   ├── lib_function.cr
    │   │   │   ├── local_vars.cr
    │   │   │   ├── local_vars_gatherer.cr
    │   │   │   ├── multidispatch.cr
    │   │   │   ├── op_code.cr
    │   │   │   ├── primitives.cr
    │   │   │   ├── pry_reader.cr
    │   │   │   ├── repl.cr
    │   │   │   ├── repl_reader.cr
    │   │   │   ├── to_bool.cr
    │   │   │   └── value.cr
    │   │   ├── interpreter.cr
    │   │   ├── loader/
    │   │   │   ├── mingw.cr
    │   │   │   ├── msvc.cr
    │   │   │   └── unix.cr
    │   │   ├── loader.cr
    │   │   ├── macros/
    │   │   │   ├── interpreter.cr
    │   │   │   ├── macros.cr
    │   │   │   ├── methods.cr
    │   │   │   └── types.cr
    │   │   ├── macros.cr
    │   │   ├── program.cr
    │   │   ├── progress_tracker.cr
    │   │   ├── semantic/
    │   │   │   ├── abstract_def_checker.cr
    │   │   │   ├── ast.cr
    │   │   │   ├── bindings.cr
    │   │   │   ├── call.cr
    │   │   │   ├── call_error.cr
    │   │   │   ├── class_vars_initializer_visitor.cr
    │   │   │   ├── cleanup_transformer.cr
    │   │   │   ├── conversions.cr
    │   │   │   ├── cover.cr
    │   │   │   ├── default_arguments.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── exhaustiveness_checker.cr
    │   │   │   ├── filters.cr
    │   │   │   ├── fix_missing_types.cr
    │   │   │   ├── flags.cr
    │   │   │   ├── hooks.cr
    │   │   │   ├── instance_vars_initializer_visitor.cr
    │   │   │   ├── lib.cr
    │   │   │   ├── literal_expander.cr
    │   │   │   ├── main_visitor.cr
    │   │   │   ├── match.cr
    │   │   │   ├── math_interpreter.cr
    │   │   │   ├── method_lookup.cr
    │   │   │   ├── method_missing.cr
    │   │   │   ├── new.cr
    │   │   │   ├── normalizer.cr
    │   │   │   ├── path_lookup.cr
    │   │   │   ├── recursive_struct_checker.cr
    │   │   │   ├── restrictions.cr
    │   │   │   ├── restrictions_augmenter.cr
    │   │   │   ├── semantic_visitor.cr
    │   │   │   ├── suggestions.cr
    │   │   │   ├── to_s.cr
    │   │   │   ├── top_level_visitor.cr
    │   │   │   ├── transformer.cr
    │   │   │   ├── type_declaration_processor.cr
    │   │   │   ├── type_declaration_visitor.cr
    │   │   │   ├── type_guess_visitor.cr
    │   │   │   ├── type_intersect.cr
    │   │   │   ├── type_lookup.cr
    │   │   │   ├── type_merge.cr
    │   │   │   ├── type_to_restriction.cr
    │   │   │   └── warnings.cr
    │   │   ├── semantic.cr
    │   │   ├── syntax/
    │   │   │   ├── ast.cr
    │   │   │   ├── exception.cr
    │   │   │   ├── lexer.cr
    │   │   │   ├── location.cr
    │   │   │   ├── parser.cr
    │   │   │   ├── to_s.cr
    │   │   │   ├── token.cr
    │   │   │   ├── transformer.cr
    │   │   │   ├── virtual_file.cr
    │   │   │   └── visitor.cr
    │   │   ├── syntax.cr
    │   │   ├── tools/
    │   │   │   ├── context.cr
    │   │   │   ├── dependencies.cr
    │   │   │   ├── doc/
    │   │   │   │   ├── constant.cr
    │   │   │   │   ├── generator.cr
    │   │   │   │   ├── html/
    │   │   │   │   │   ├── 404.html
    │   │   │   │   │   ├── _head.html
    │   │   │   │   │   ├── _list_items.html
    │   │   │   │   │   ├── _macros_inherited.html
    │   │   │   │   │   ├── _method_detail.html
    │   │   │   │   │   ├── _method_summary.html
    │   │   │   │   │   ├── _methods_inherited.html
    │   │   │   │   │   ├── _other_types.html
    │   │   │   │   │   ├── _sidebar.html
    │   │   │   │   │   ├── css/
    │   │   │   │   │   │   └── style.css
    │   │   │   │   │   ├── js/
    │   │   │   │   │   │   ├── _navigator.js
    │   │   │   │   │   │   ├── _search.js
    │   │   │   │   │   │   ├── _usage-modal.js
    │   │   │   │   │   │   ├── _versions.js
    │   │   │   │   │   │   └── doc.js
    │   │   │   │   │   ├── main.html
    │   │   │   │   │   ├── sitemap.xml
    │   │   │   │   │   └── type.html
    │   │   │   │   ├── item.cr
    │   │   │   │   ├── macro.cr
    │   │   │   │   ├── main.cr
    │   │   │   │   ├── markd_doc_renderer.cr
    │   │   │   │   ├── method.cr
    │   │   │   │   ├── project_info.cr
    │   │   │   │   ├── relative_location.cr
    │   │   │   │   ├── templates.cr
    │   │   │   │   ├── to_json.cr
    │   │   │   │   └── type.cr
    │   │   │   ├── doc.cr
    │   │   │   ├── expand.cr
    │   │   │   ├── flags.cr
    │   │   │   ├── formatter.cr
    │   │   │   ├── git.cr
    │   │   │   ├── implementations.cr
    │   │   │   ├── init/
    │   │   │   │   └── template/
    │   │   │   │       ├── editorconfig.ecr
    │   │   │   │       ├── example.cr.ecr
    │   │   │   │       ├── example_spec.cr.ecr
    │   │   │   │       ├── gitignore.ecr
    │   │   │   │       ├── license.ecr
    │   │   │   │       ├── readme.md.ecr
    │   │   │   │       ├── shard.yml.ecr
    │   │   │   │       └── spec_helper.cr.ecr
    │   │   │   ├── init.cr
    │   │   │   ├── macro_code_coverage.cr
    │   │   │   ├── playground/
    │   │   │   │   ├── agent.cr
    │   │   │   │   ├── agent_instrumentor_transformer.cr
    │   │   │   │   ├── public/
    │   │   │   │   │   ├── application.css
    │   │   │   │   │   ├── application.js
    │   │   │   │   │   ├── session.js
    │   │   │   │   │   ├── settings.js
    │   │   │   │   │   └── vendor/
    │   │   │   │   │       ├── REUSE.toml
    │   │   │   │   │       ├── ansi_up-1.3.0/
    │   │   │   │   │       │   ├── ansi_up.js
    │   │   │   │   │       │   └── theme.css
    │   │   │   │   │       ├── codemirror-5.38.0/
    │   │   │   │   │       │   ├── addon/
    │   │   │   │   │       │   │   └── comment/
    │   │   │   │   │       │   │       └── comment.js
    │   │   │   │   │       │   ├── lib/
    │   │   │   │   │       │   │   ├── codemirror.css
    │   │   │   │   │       │   │   └── codemirror.js
    │   │   │   │   │       │   ├── mode/
    │   │   │   │   │       │   │   └── crystal/
    │   │   │   │   │       │   │       └── crystal.js
    │   │   │   │   │       │   └── theme/
    │   │   │   │   │       │       └── neat.css
    │   │   │   │   │       └── octicons-19.5.0/
    │   │   │   │   │           └── octicons.css
    │   │   │   │   ├── server.cr
    │   │   │   │   └── views/
    │   │   │   │       ├── _about.html
    │   │   │   │       ├── _index.html
    │   │   │   │       ├── _settings.html
    │   │   │   │       ├── _workbook.html.ecr
    │   │   │   │       └── layout.html.ecr
    │   │   │   ├── playground.cr
    │   │   │   ├── print_hierarchy.cr
    │   │   │   ├── print_types_visitor.cr
    │   │   │   ├── table_print.cr
    │   │   │   ├── typed_def_processor.cr
    │   │   │   └── unreachable.cr
    │   │   ├── types.cr
    │   │   ├── util.cr
    │   │   └── warnings.cr
    │   ├── crystal.cr
    │   └── requires.cr
    ├── complex.cr
    ├── compress/
    │   ├── deflate/
    │   │   ├── deflate.cr
    │   │   ├── reader.cr
    │   │   └── writer.cr
    │   ├── gzip/
    │   │   ├── gzip.cr
    │   │   ├── header.cr
    │   │   ├── reader.cr
    │   │   └── writer.cr
    │   ├── zip/
    │   │   ├── checksum_reader.cr
    │   │   ├── checksum_writer.cr
    │   │   ├── compression_method.cr
    │   │   ├── file.cr
    │   │   ├── file_info.cr
    │   │   ├── reader.cr
    │   │   ├── writer.cr
    │   │   └── zip.cr
    │   └── zlib/
    │       ├── reader.cr
    │       ├── writer.cr
    │       └── zlib.cr
    ├── concurrent.cr
    ├── crypto/
    │   ├── bcrypt/
    │   │   ├── base64.cr
    │   │   ├── blowfish.cr
    │   │   └── password.cr
    │   ├── bcrypt.cr
    │   ├── blowfish.cr
    │   └── subtle.cr
    ├── crystal/
    │   ├── at_exit_handlers.cr
    │   ├── atomic_semaphore.cr
    │   ├── compiler_rt/
    │   │   ├── divmod128.cr
    │   │   ├── fixint.cr
    │   │   ├── float.cr
    │   │   ├── mul.cr
    │   │   ├── multi3.cr
    │   │   ├── pow.cr
    │   │   └── shift.cr
    │   ├── compiler_rt.cr
    │   ├── datum.cr
    │   ├── digest/
    │   │   ├── md5.cr
    │   │   └── sha1.cr
    │   ├── dwarf/
    │   │   ├── abbrev.cr
    │   │   ├── info.cr
    │   │   ├── line_numbers.cr
    │   │   └── strings.cr
    │   ├── dwarf.cr
    │   ├── elf.cr
    │   ├── event_loop/
    │   │   ├── epoll.cr
    │   │   ├── file_descriptor.cr
    │   │   ├── iocp/
    │   │   │   ├── fiber_event.cr
    │   │   │   └── timer.cr
    │   │   ├── iocp.cr
    │   │   ├── kqueue.cr
    │   │   ├── libevent/
    │   │   │   ├── event.cr
    │   │   │   └── lib_event2.cr
    │   │   ├── libevent.cr
    │   │   ├── lock.cr
    │   │   ├── polling/
    │   │   │   ├── arena.cr
    │   │   │   ├── event.cr
    │   │   │   ├── fiber_event.cr
    │   │   │   ├── poll_descriptor.cr
    │   │   │   └── waiters.cr
    │   │   ├── polling.cr
    │   │   ├── socket.cr
    │   │   ├── timers.cr
    │   │   └── wasi.cr
    │   ├── event_loop.cr
    │   ├── fd_lock.cr
    │   ├── hasher.cr
    │   ├── iconv.cr
    │   ├── interpreter.cr
    │   ├── lib_iconv.cr
    │   ├── mach_o.cr
    │   ├── main.cr
    │   ├── once.cr
    │   ├── pe.cr
    │   ├── pointer_linked_list.cr
    │   ├── pointer_pairing_heap.cr
    │   ├── print_buffered.cr
    │   ├── rw_lock.cr
    │   ├── scheduler.cr
    │   ├── small_deque.cr
    │   ├── spin_lock.cr
    │   ├── syntax_highlighter/
    │   │   ├── colorize.cr
    │   │   └── html.cr
    │   ├── syntax_highlighter.cr
    │   ├── system/
    │   │   ├── addrinfo.cr
    │   │   ├── dir.cr
    │   │   ├── env.cr
    │   │   ├── fiber.cr
    │   │   ├── file.cr
    │   │   ├── file_descriptor.cr
    │   │   ├── file_info.cr
    │   │   ├── group.cr
    │   │   ├── mime.cr
    │   │   ├── panic.cr
    │   │   ├── path.cr
    │   │   ├── print_error.cr
    │   │   ├── process.cr
    │   │   ├── random.cr
    │   │   ├── signal.cr
    │   │   ├── socket.cr
    │   │   ├── thread.cr
    │   │   ├── thread_condition_variable.cr
    │   │   ├── thread_linked_list.cr
    │   │   ├── thread_mutex.cr
    │   │   ├── thread_wait_group.cr
    │   │   ├── time.cr
    │   │   ├── unix/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── arc4random.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── env.cr
    │   │   │   ├── epoll.cr
    │   │   │   ├── eventfd.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── file_info.cr
    │   │   │   ├── getrandom.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── kqueue.cr
    │   │   │   ├── linux_cpucount.cr
    │   │   │   ├── main.cr
    │   │   │   ├── mime.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── pthread.cr
    │   │   │   ├── pthread_condition_variable.cr
    │   │   │   ├── pthread_mutex.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── spawn.cr
    │   │   │   ├── syscall.cr
    │   │   │   ├── sysconf_cpucount.cr
    │   │   │   ├── sysctl_cpucount.cr
    │   │   │   ├── time.cr
    │   │   │   ├── timerfd.cr
    │   │   │   ├── urandom.cr
    │   │   │   └── user.cr
    │   │   ├── unix.cr
    │   │   ├── user.cr
    │   │   ├── wasi/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── cpucount.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── lib_wasi.cr
    │   │   │   ├── main.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── random.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── thread.cr
    │   │   │   ├── thread_condition_variable.cr
    │   │   │   ├── thread_mutex.cr
    │   │   │   ├── user.cr
    │   │   │   └── wasi.cr
    │   │   ├── win32/
    │   │   │   ├── addrinfo.cr
    │   │   │   ├── addrinfo_win7.cr
    │   │   │   ├── cpucount.cr
    │   │   │   ├── crypto.cr
    │   │   │   ├── dir.cr
    │   │   │   ├── env.cr
    │   │   │   ├── fiber.cr
    │   │   │   ├── file.cr
    │   │   │   ├── file_descriptor.cr
    │   │   │   ├── file_info.cr
    │   │   │   ├── group.cr
    │   │   │   ├── hostname.cr
    │   │   │   ├── iocp.cr
    │   │   │   ├── library_archive.cr
    │   │   │   ├── mime.cr
    │   │   │   ├── path.cr
    │   │   │   ├── process.cr
    │   │   │   ├── random.cr
    │   │   │   ├── signal.cr
    │   │   │   ├── socket.cr
    │   │   │   ├── thread.cr
    │   │   │   ├── thread_condition_variable.cr
    │   │   │   ├── thread_mutex.cr
    │   │   │   ├── time.cr
    │   │   │   ├── user.cr
    │   │   │   ├── visual_studio.cr
    │   │   │   ├── waitable_timer.cr
    │   │   │   ├── windows_registry.cr
    │   │   │   ├── windows_sdk.cr
    │   │   │   ├── wmain.cr
    │   │   │   └── zone_names.cr
    │   │   └── windows.cr
    │   ├── system.cr
    │   ├── thread_local_value.cr
    │   ├── tracing.cr
    │   └── value_with_finalizer.cr
    ├── csv/
    │   ├── builder.cr
    │   ├── error.cr
    │   ├── lexer/
    │   │   ├── io_based.cr
    │   │   └── string_based.cr
    │   ├── lexer.cr
    │   ├── parser.cr
    │   └── token.cr
    ├── csv.cr
    ├── deque.cr
    ├── digest/
    │   ├── adler32.cr
    │   ├── crc32.cr
    │   ├── digest.cr
    │   ├── io_digest.cr
    │   ├── md5.cr
    │   ├── sha1.cr
    │   ├── sha256.cr
    │   └── sha512.cr
    ├── digest.cr
    ├── dir/
    │   └── glob.cr
    ├── dir.cr
    ├── docs_main.cr
    ├── docs_pseudo_methods.cr
    ├── ecr/
    │   ├── lexer.cr
    │   ├── macros.cr
    │   ├── process.cr
    │   └── processor.cr
    ├── ecr.cr
    ├── empty.cr
    ├── enum.cr
    ├── enumerable.cr
    ├── env.cr
    ├── errno.cr
    ├── exception/
    │   ├── call_stack/
    │   │   ├── dwarf.cr
    │   │   ├── elf.cr
    │   │   ├── interpreter.cr
    │   │   ├── libunwind.cr
    │   │   ├── mach_o.cr
    │   │   ├── null.cr
    │   │   └── stackwalk.cr
    │   ├── call_stack.cr
    │   └── lib_unwind.cr
    ├── exception.cr
    ├── fiber/
    │   ├── context/
    │   │   ├── aarch64-generic.cr
    │   │   ├── aarch64-microsoft.cr
    │   │   ├── arm.cr
    │   │   ├── i386.cr
    │   │   ├── interpreted.cr
    │   │   ├── wasm32.cr
    │   │   ├── x86_64-microsoft.cr
    │   │   └── x86_64-sysv.cr
    │   ├── context.cr
    │   ├── execution_context/
    │   │   ├── concurrent.cr
    │   │   ├── global_queue.cr
    │   │   ├── isolated.cr
    │   │   ├── monitor.cr
    │   │   ├── parallel/
    │   │   │   └── scheduler.cr
    │   │   ├── parallel.cr
    │   │   ├── runnables.cr
    │   │   ├── scheduler.cr
    │   │   └── thread_pool.cr
    │   ├── execution_context.cr
    │   ├── list.cr
    │   ├── pointer_linked_list_node.cr
    │   ├── stack.cr
    │   └── stack_pool.cr
    ├── fiber.cr
    ├── file/
    │   ├── error.cr
    │   ├── info.cr
    │   ├── match.cr
    │   ├── preader.cr
    │   └── tempfile.cr
    ├── file.cr
    ├── file_utils.cr
    ├── float/
    │   ├── fast_float/
    │   │   ├── ascii_number.cr
    │   │   ├── bigint.cr
    │   │   ├── decimal_to_binary.cr
    │   │   ├── digit_comparison.cr
    │   │   ├── fast_table.cr
    │   │   ├── fast_table_slice_literal.cr
    │   │   ├── float_common.cr
    │   │   └── parse_number.cr
    │   ├── fast_float.cr
    │   ├── printer/
    │   │   ├── cached_powers.cr
    │   │   ├── diy_fp.cr
    │   │   ├── dragonbox.cr
    │   │   ├── dragonbox_cache.cr
    │   │   ├── grisu3.cr
    │   │   ├── hexfloat.cr
    │   │   ├── ieee.cr
    │   │   ├── ryu_printf.cr
    │   │   └── ryu_printf_table.cr
    │   └── printer.cr
    ├── float.cr
    ├── gc/
    │   ├── boehm.cr
    │   └── none.cr
    ├── gc.cr
    ├── hash.cr
    ├── html/
    │   └── entities.cr
    ├── html.cr
    ├── http/
    │   ├── client/
    │   │   └── response.cr
    │   ├── client.cr
    │   ├── common.cr
    │   ├── content.cr
    │   ├── cookie.cr
    │   ├── cookies.cr
    │   ├── formdata/
    │   │   ├── builder.cr
    │   │   ├── parser.cr
    │   │   └── part.cr
    │   ├── formdata.cr
    │   ├── headers.cr
    │   ├── log.cr
    │   ├── params.cr
    │   ├── request.cr
    │   ├── server/
    │   │   ├── context.cr
    │   │   ├── handler.cr
    │   │   ├── handlers/
    │   │   │   ├── compress_handler.cr
    │   │   │   ├── error_handler.cr
    │   │   │   ├── log_handler.cr
    │   │   │   ├── static_file_handler.cr
    │   │   │   ├── static_file_handler.html
    │   │   │   └── websocket_handler.cr
    │   │   ├── request_processor.cr
    │   │   └── response.cr
    │   ├── server.cr
    │   ├── status.cr
    │   ├── web_socket/
    │   │   ├── close_code.cr
    │   │   └── protocol.cr
    │   └── web_socket.cr
    ├── http.cr
    ├── humanize.cr
    ├── indexable/
    │   └── mutable.cr
    ├── indexable.cr
    ├── ini.cr
    ├── int.cr
    ├── intrinsics.cr
    ├── io/
    │   ├── argf.cr
    │   ├── buffered.cr
    │   ├── byte_format.cr
    │   ├── console.cr
    │   ├── delimited.cr
    │   ├── encoding.cr
    │   ├── encoding_stubs.cr
    │   ├── error.cr
    │   ├── evented.cr
    │   ├── file_descriptor.cr
    │   ├── hexdump.cr
    │   ├── memory.cr
    │   ├── multi_writer.cr
    │   ├── sized.cr
    │   └── stapled.cr
    ├── io.cr
    ├── iterable.cr
    ├── iterator.cr
    ├── json/
    │   ├── any.cr
    │   ├── builder.cr
    │   ├── from_json.cr
    │   ├── lexer/
    │   │   ├── io_based.cr
    │   │   └── string_based.cr
    │   ├── lexer.cr
    │   ├── parser.cr
    │   ├── pull_parser.cr
    │   ├── serialization.cr
    │   ├── to_json.cr
    │   └── token.cr
    ├── json.cr
    ├── kernel.cr
    ├── levenshtein.cr
    ├── lib_c/
    │   ├── aarch64-darwin/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-android/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── ioctl.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── syscall.cr
    │   │       │   ├── system_properties.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── aarch64-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── arm-linux-gnueabihf/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── i386-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── i386-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── linux/
    │   │   └── tls.cr
    │   ├── wasm32-wasi/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── iconv.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── sched.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── file.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── times.cr
    │   │       │   └── types.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-darwin/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-dragonfly/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-freebsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── cpuset.cr
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── ktls.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-linux-gnu/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-linux-musl/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── random.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── uio.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-netbsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-openbsd/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── event.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── sysctl.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   ├── x86_64-solaris/
    │   │   └── c/
    │   │       ├── arpa/
    │   │       │   └── inet.cr
    │   │       ├── dirent.cr
    │   │       ├── dlfcn.cr
    │   │       ├── elf.cr
    │   │       ├── errno.cr
    │   │       ├── fcntl.cr
    │   │       ├── grp.cr
    │   │       ├── iconv.cr
    │   │       ├── limits.cr
    │   │       ├── link.cr
    │   │       ├── net/
    │   │       │   └── if.cr
    │   │       ├── netdb.cr
    │   │       ├── netinet/
    │   │       │   ├── in.cr
    │   │       │   └── tcp.cr
    │   │       ├── pthread.cr
    │   │       ├── pwd.cr
    │   │       ├── sched.cr
    │   │       ├── signal.cr
    │   │       ├── stdarg.cr
    │   │       ├── stddef.cr
    │   │       ├── stdint.cr
    │   │       ├── stdio.cr
    │   │       ├── stdlib.cr
    │   │       ├── string.cr
    │   │       ├── sys/
    │   │       │   ├── epoll.cr
    │   │       │   ├── eventfd.cr
    │   │       │   ├── file.cr
    │   │       │   ├── mman.cr
    │   │       │   ├── resource.cr
    │   │       │   ├── select.cr
    │   │       │   ├── socket.cr
    │   │       │   ├── stat.cr
    │   │       │   ├── time.cr
    │   │       │   ├── timerfd.cr
    │   │       │   ├── types.cr
    │   │       │   ├── un.cr
    │   │       │   └── wait.cr
    │   │       ├── termios.cr
    │   │       ├── time.cr
    │   │       └── unistd.cr
    │   └── x86_64-windows-msvc/
    │       └── c/
    │           ├── afunix.cr
    │           ├── basetsd.cr
    │           ├── combaseapi.cr
    │           ├── consoleapi.cr
    │           ├── consoleapi2.cr
    │           ├── corecrt.cr
    │           ├── dbghelp.cr
    │           ├── debugapi.cr
    │           ├── delayimp.cr
    │           ├── direct.cr
    │           ├── errhandlingapi.cr
    │           ├── errno.cr
    │           ├── fcntl.cr
    │           ├── fileapi.cr
    │           ├── guiddef.cr
    │           ├── handleapi.cr
    │           ├── heapapi.cr
    │           ├── in6addr.cr
    │           ├── inaddr.cr
    │           ├── int_safe.cr
    │           ├── io.cr
    │           ├── ioapiset.cr
    │           ├── jobapi2.cr
    │           ├── knownfolders.cr
    │           ├── libloaderapi.cr
    │           ├── lm.cr
    │           ├── malloc.cr
    │           ├── memoryapi.cr
    │           ├── minwinbase.cr
    │           ├── mswsock.cr
    │           ├── netioapi.cr
    │           ├── ntdef.cr
    │           ├── ntdll.cr
    │           ├── ntifs.cr
    │           ├── ntsecapi.cr
    │           ├── ntstatus.cr
    │           ├── process.cr
    │           ├── processenv.cr
    │           ├── processthreadsapi.cr
    │           ├── profileapi.cr
    │           ├── regapix.cr
    │           ├── sddl.cr
    │           ├── sdkddkver.cr
    │           ├── security.cr
    │           ├── shlobj_core.cr
    │           ├── signal.cr
    │           ├── stdarg.cr
    │           ├── stddef.cr
    │           ├── stdint.cr
    │           ├── stdio.cr
    │           ├── stdlib.cr
    │           ├── string.cr
    │           ├── stringapiset.cr
    │           ├── synchapi.cr
    │           ├── sys/
    │           │   ├── stat.cr
    │           │   ├── types.cr
    │           │   └── utime.cr
    │           ├── sysinfoapi.cr
    │           ├── timezoneapi.cr
    │           ├── tlhelp32.cr
    │           ├── userenv.cr
    │           ├── wdm.cr
    │           ├── win_def.cr
    │           ├── winbase.cr
    │           ├── wincrypt.cr
    │           ├── windows.cr
    │           ├── winioctl.cr
    │           ├── winnls.cr
    │           ├── winnt.cr
    │           ├── winreg.cr
    │           ├── winsock2.cr
    │           ├── winternl.cr
    │           ├── ws2def.cr
    │           ├── ws2ipdef.cr
    │           ├── ws2tcpip.cr
    │           └── wtypesbase.cr
    ├── lib_c.cr
    ├── lib_z/
    │   └── lib_z.cr
    ├── llvm/
    │   ├── abi/
    │   │   ├── aarch64.cr
    │   │   ├── arm.cr
    │   │   ├── avr.cr
    │   │   ├── wasm32.cr
    │   │   ├── x86.cr
    │   │   ├── x86_64.cr
    │   │   └── x86_win64.cr
    │   ├── abi.cr
    │   ├── basic_block.cr
    │   ├── basic_block_collection.cr
    │   ├── builder.cr
    │   ├── context.cr
    │   ├── di_builder.cr
    │   ├── enums/
    │   │   └── atomic.cr
    │   ├── enums.cr
    │   ├── ext/
    │   │   ├── find-llvm-config.sh
    │   │   ├── llvm-versions.txt
    │   │   └── llvm_ext.cc
    │   ├── function.cr
    │   ├── function_collection.cr
    │   ├── function_pass_manager.cr
    │   ├── generic_value.cr
    │   ├── global_collection.cr
    │   ├── instruction_collection.cr
    │   ├── jit_compiler.cr
    │   ├── lib_llvm/
    │   │   ├── analysis.cr
    │   │   ├── bit_reader.cr
    │   │   ├── bit_writer.cr
    │   │   ├── config.cr
    │   │   ├── core.cr
    │   │   ├── debug_info.cr
    │   │   ├── error.cr
    │   │   ├── execution_engine.cr
    │   │   ├── initialization.cr
    │   │   ├── ir_reader.cr
    │   │   ├── lljit.cr
    │   │   ├── orc.cr
    │   │   ├── support.cr
    │   │   ├── target.cr
    │   │   ├── target_machine.cr
    │   │   ├── transforms/
    │   │   │   ├── pass_builder.cr
    │   │   │   └── pass_manager_builder.cr
    │   │   └── types.cr
    │   ├── lib_llvm.cr
    │   ├── lib_llvm_ext.cr
    │   ├── memory_buffer.cr
    │   ├── module.cr
    │   ├── module_pass_manager.cr
    │   ├── operand_bundle_def.cr
    │   ├── orc/
    │   │   ├── jit_dylib.cr
    │   │   ├── lljit.cr
    │   │   ├── lljit_builder.cr
    │   │   ├── thread_safe_context.cr
    │   │   └── thread_safe_module.cr
    │   ├── parameter_collection.cr
    │   ├── pass_builder_options.cr
    │   ├── pass_manager_builder.cr
    │   ├── pass_registry.cr
    │   ├── phi_table.cr
    │   ├── target.cr
    │   ├── target_data.cr
    │   ├── target_machine.cr
    │   ├── type.cr
    │   ├── value.cr
    │   └── value_methods.cr
    ├── llvm.cr
    ├── log/
    │   ├── backend.cr
    │   ├── broadcast_backend.cr
    │   ├── builder.cr
    │   ├── dispatch.cr
    │   ├── entry.cr
    │   ├── format.cr
    │   ├── io_backend.cr
    │   ├── json.cr
    │   ├── log.cr
    │   ├── main.cr
    │   ├── memory_backend.cr
    │   ├── metadata.cr
    │   ├── setup.cr
    │   └── spec.cr
    ├── log.cr
    ├── macros.cr
    ├── math/
    │   ├── libm.cr
    │   └── math.cr
    ├── mime/
    │   ├── media_type.cr
    │   ├── multipart/
    │   │   ├── builder.cr
    │   │   ├── parser.cr
    │   │   └── state.cr
    │   └── multipart.cr
    ├── mime.cr
    ├── mutex.cr
    ├── named_tuple.cr
    ├── nil.cr
    ├── number.cr
    ├── oauth/
    │   ├── access_token.cr
    │   ├── authorization_header.cr
    │   ├── consumer.cr
    │   ├── error.cr
    │   ├── oauth.cr
    │   ├── request_token.cr
    │   └── signature.cr
    ├── oauth.cr
    ├── oauth2/
    │   ├── access_token/
    │   │   ├── access_token.cr
    │   │   ├── bearer.cr
    │   │   └── mac.cr
    │   ├── auth_scheme.cr
    │   ├── client.cr
    │   ├── error.cr
    │   ├── error_response.cr
    │   ├── oauth2.cr
    │   └── session.cr
    ├── oauth2.cr
    ├── object/
    │   └── properties.cr
    ├── object.cr
    ├── openssl/
    │   ├── algorithm.cr
    │   ├── bio.cr
    │   ├── cipher.cr
    │   ├── digest.cr
    │   ├── error.cr
    │   ├── hmac.cr
    │   ├── ktls.cr
    │   ├── lib_crypto.cr
    │   ├── lib_ssl.cr
    │   ├── md5.cr
    │   ├── pkcs5.cr
    │   ├── sha1.cr
    │   ├── ssl/
    │   │   ├── context.cr
    │   │   ├── defaults.cr
    │   │   ├── hostname_validation.cr
    │   │   ├── server.cr
    │   │   └── socket.cr
    │   └── x509/
    │       ├── certificate.cr
    │       ├── extension.cr
    │       ├── name.cr
    │       └── x509.cr
    ├── openssl.cr
    ├── option_parser.cr
    ├── path.cr
    ├── pointer.cr
    ├── prelude.cr
    ├── pretty_print.cr
    ├── primitives.cr
    ├── proc.cr
    ├── process/
    │   ├── executable_path.cr
    │   ├── shell.cr
    │   └── status.cr
    ├── process.cr
    ├── raise.cr
    ├── random/
    │   ├── isaac.cr
    │   ├── pcg32.cr
    │   └── secure.cr
    ├── random.cr
    ├── range/
    │   └── bsearch.cr
    ├── range.cr
    ├── reference.cr
    ├── reference_storage.cr
    ├── regex/
    │   ├── engine.cr
    │   ├── lib_pcre.cr
    │   ├── lib_pcre2.cr
    │   ├── match_data.cr
    │   ├── pcre.cr
    │   └── pcre2.cr
    ├── regex.cr
    ├── semantic_version.cr
    ├── set.cr
    ├── signal.cr
    ├── slice/
    │   └── sort.cr
    ├── slice.cr
    ├── socket/
    │   ├── address.cr
    │   ├── addrinfo.cr
    │   ├── common.cr
    │   ├── ip_socket.cr
    │   ├── server.cr
    │   ├── tcp_server.cr
    │   ├── tcp_socket.cr
    │   ├── udp_socket.cr
    │   ├── unix_server.cr
    │   └── unix_socket.cr
    ├── socket.cr
    ├── spec/
    │   ├── cli.cr
    │   ├── context.cr
    │   ├── dsl.cr
    │   ├── example/
    │   │   └── procsy.cr
    │   ├── example.cr
    │   ├── example_group/
    │   │   └── procsy.cr
    │   ├── expectations.cr
    │   ├── filters.cr
    │   ├── formatter.cr
    │   ├── helpers/
    │   │   ├── iterate.cr
    │   │   └── string.cr
    │   ├── item.cr
    │   ├── junit_formatter.cr
    │   ├── methods.cr
    │   ├── source.cr
    │   └── tap_formatter.cr
    ├── spec.cr
    ├── static_array.cr
    ├── steppable.cr
    ├── string/
    │   ├── builder.cr
    │   ├── formatter.cr
    │   ├── grapheme/
    │   │   ├── grapheme.cr
    │   │   └── properties.cr
    │   ├── grapheme.cr
    │   └── utf16.cr
    ├── string.cr
    ├── string_pool.cr
    ├── string_scanner.cr
    ├── struct.cr
    ├── symbol.cr
    ├── sync/
    │   ├── condition_variable.cr
    │   ├── cv.cr
    │   ├── errors.cr
    │   ├── exclusive.cr
    │   ├── lockable.cr
    │   ├── mu.cr
    │   ├── mutex.cr
    │   ├── rw_lock.cr
    │   ├── shared.cr
    │   ├── sync.cr
    │   ├── type.cr
    │   └── waiter.cr
    ├── syscall/
    │   ├── aarch64-linux.cr
    │   ├── arm-linux.cr
    │   ├── i386-linux.cr
    │   └── x86_64-linux.cr
    ├── syscall.cr
    ├── system/
    │   ├── group.cr
    │   └── user.cr
    ├── system.cr
    ├── system_error.cr
    ├── termios.cr
    ├── time/
    │   ├── format/
    │   │   ├── custom/
    │   │   │   ├── http_date.cr
    │   │   │   ├── iso_8601.cr
    │   │   │   ├── rfc_2822.cr
    │   │   │   ├── rfc_3339.cr
    │   │   │   └── yaml_date.cr
    │   │   ├── formatter.cr
    │   │   ├── parser.cr
    │   │   └── pattern.cr
    │   ├── format.cr
    │   ├── instant.cr
    │   ├── location/
    │   │   └── loader.cr
    │   ├── location.cr
    │   ├── span.cr
    │   └── tz.cr
    ├── time.cr
    ├── tuple.cr
    ├── unicode/
    │   ├── data.cr
    │   └── unicode.cr
    ├── union.cr
    ├── uri/
    │   ├── encoding.cr
    │   ├── json.cr
    │   ├── params/
    │   │   ├── from_www_form.cr
    │   │   ├── serializable.cr
    │   │   └── to_www_form.cr
    │   ├── params.cr
    │   ├── punycode.cr
    │   ├── uri_parser.cr
    │   └── yaml.cr
    ├── uri.cr
    ├── uuid/
    │   ├── json.cr
    │   └── yaml.cr
    ├── uuid.cr
    ├── va_list.cr
    ├── value.cr
    ├── wait_group.cr
    ├── wasi_error.cr
    ├── weak_ref.cr
    ├── winerror.cr
    ├── xml/
    │   ├── attribute_type.cr
    │   ├── attributes.cr
    │   ├── builder.cr
    │   ├── document.cr
    │   ├── error.cr
    │   ├── html_parser_options.cr
    │   ├── libxml2.cr
    │   ├── namespace.cr
    │   ├── node/
    │   │   └── type.cr
    │   ├── node.cr
    │   ├── node_set.cr
    │   ├── parser_options.cr
    │   ├── reader/
    │   │   └── type.cr
    │   ├── reader.cr
    │   ├── save_options.cr
    │   └── xpath_context.cr
    ├── xml.cr
    ├── yaml/
    │   ├── any.cr
    │   ├── builder.cr
    │   ├── enums.cr
    │   ├── from_yaml.cr
    │   ├── lib_yaml.cr
    │   ├── nodes/
    │   │   ├── builder.cr
    │   │   ├── nodes.cr
    │   │   └── parser.cr
    │   ├── nodes.cr
    │   ├── parse_context.cr
    │   ├── parser.cr
    │   ├── pull_parser.cr
    │   ├── schema/
    │   │   ├── core/
    │   │   │   └── parser.cr
    │   │   ├── core.cr
    │   │   └── fail_safe.cr
    │   ├── serialization.cr
    │   └── to_yaml.cr
    └── yaml.cr
Download .txt
SYMBOL INDEX (494 symbols across 19 files)

FILE: etc/gdb/crystal_formatters.py
  class CrystalStringPrinter (line 3) | class CrystalStringPrinter:
    method __init__ (line 4) | def __init__(self, val):
    method to_string (line 7) | def to_string(self):
    method display_hint (line 12) | def display_hint(self):
  class CrystalArrayPrinter (line 15) | class CrystalArrayPrinter:
    method __init__ (line 16) | def __init__(self, val):
    method to_string (line 19) | def to_string(self):
    method children (line 25) | def children(self):
    method display_hint (line 29) | def display_hint(self):
  class CrystalReferenceSubPrinter (line 32) | class CrystalReferenceSubPrinter:
    method __init__ (line 33) | def __init__(self, name, cls):
    method recognize (line 38) | def recognize(self, val):
  class CrystalPrettyPrinter (line 49) | class CrystalPrettyPrinter(gdb.printing.PrettyPrinter):
    method __init__ (line 50) | def __init__(self):
    method __call__ (line 55) | def __call__(self, val):

FILE: etc/lldb/crystal_formatters.py
  class CrystalArraySyntheticProvider (line 3) | class CrystalArraySyntheticProvider:
    method __init__ (line 4) | def __init__(self, valobj, internal_dict):
    method update (line 9) | def update(self):
    method num_children (line 16) | def num_children(self):
    method get_child_index (line 20) | def get_child_index(self, name):
    method get_child_at_index (line 26) | def get_child_at_index(self,index):
  function findType (line 37) | def findType(name, module):
  function CrystalString_SummaryProvider (line 46) | def CrystalString_SummaryProvider(value, dict):
  function __lldb_init_module (line 59) | def __lldb_init_module(debugger, dict):

FILE: spec/compiler/data/ffi/sum.c
  function EXPORT (line 8) | EXPORT int64_t answer()
  function EXPORT (line 13) | EXPORT int64_t sum(int32_t a, int32_t b, int32_t c)
  function EXPORT (line 18) | EXPORT void sum_primitive_types(
  type test_struct (line 29) | struct test_struct
  function EXPORT (line 40) | EXPORT int64_t sum_struct(struct test_struct s)
  function EXPORT (line 47) | EXPORT int64_t sum_array(int32_t ary[4])
  function EXPORT (line 57) | EXPORT int64_t sum_variadic(int32_t count, ...)
  function test_struct (line 73) | test_struct make_struct(int8_t b, int16_t s, int32_t i, int64_t j, float...

FILE: spec/compiler/data/interpreter/sum.c
  function EXPORT (line 4) | EXPORT float sum_float(int count, ...) {
  function sum_int (line 17) | EXPORT long sum_int(int count, ...) {
  function EXPORT (line 30) | EXPORT int simple_sum_int(int a, int b) {

FILE: spec/compiler/data/loader/bar.c
  function LOCAL (line 3) | LOCAL int foo() {
  function EXPORT (line 7) | EXPORT int bar() {

FILE: spec/compiler/data/loader/foo.c
  function EXPORT (line 3) | EXPORT int foo() {

FILE: spec/compiler/data/loader/foo2.c
  function LOCAL (line 3) | LOCAL int a() {
  function EXPORT (line 7) | EXPORT int foo() {

FILE: src/compiler/crystal/tools/doc/html/js/_navigator.js
  function delayWhileSearching (line 20) | function delayWhileSearching(callback) {
  function clearMoveTimeout (line 33) | function clearMoveTimeout() {
  function startMoveTimeout (line 38) | function startMoveTimeout(upwards){
  function scrollCenter (line 51) | function scrollCenter(element) {
  function handleKeyUp (line 109) | function handleKeyUp(event) {
  function handleKeyDown (line 126) | function handleKeyDown(event) {
  function handleInputKeyUp (line 176) | function handleInputKeyUp(event) {
  function handleInputKeyDown (line 186) | function handleInputKeyDown(event) {

FILE: src/compiler/crystal/tools/doc/html/js/_search.js
  function searchType (line 5) | function searchType(type, query, results) {
  function searchMethod (line 76) | function searchMethod(method, type, kind, query, results) {
  function searchConstant (line 122) | function searchConstant(constant, type, query, results) {
  function uniqueArray (line 162) | function uniqueArray(ar) {
  function sanitize (line 295) | function sanitize(html){
  function runMatcher (line 385) | function runMatcher(field, matcher) {
  function namespaceMatcher (line 409) | function namespaceMatcher(normalized, term){
  function escapeRegExp (line 464) | function escapeRegExp(s) {
  function loadJSON (line 516) | function loadJSON(file, callback) {
  function loadScript (line 528) | function loadScript(file) {
  function parseJSON (line 534) | function parseJSON(json) {
  function crystal_doc_search_index_callback (line 557) | function crystal_doc_search_index_callback(data) {

FILE: src/compiler/crystal/tools/doc/html/js/_versions.js
  function loadJSON (line 2) | function loadJSON(file, callback) {
  function parseJSON (line 14) | function parseJSON(json) {

FILE: src/compiler/crystal/tools/doc/html/js/doc.js
  function handleShortkeys (line 156) | function handleShortkeys(event) {

FILE: src/compiler/crystal/tools/playground/public/application.js
  function saveAsLastCode (line 38) | function saveAsLastCode() {
  function initDemoPlayground (line 118) | function initDemoPlayground(dom) {

FILE: src/compiler/crystal/tools/playground/public/session.js
  function ModalDialog (line 15) | function ModalDialog(options) {
  function cdiv (line 54) | function cdiv(cssClass) {
  function run (line 633) | function run() {
  function stop (line 645) | function stop() {

FILE: src/compiler/crystal/tools/playground/public/settings.js
  function hasStorage (line 5) | function hasStorage() {

FILE: src/compiler/crystal/tools/playground/public/vendor/ansi_up-1.3.0/ansi_up.js
  function Ansi_Up (line 42) | function Ansi_Up() {

FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/addon/comment/comment.js
  function firstNonWS (line 18) | function firstNonWS(str) {
  function probablyInsideString (line 48) | function probablyInsideString(cm, pos, line) {
  function getMode (line 52) | function getMode(cm, pos) {

FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/lib/codemirror.js
  function classTest (line 50) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
  function removeChildren (line 61) | function removeChildren(e) {
  function removeChildrenAndAdd (line 67) | function removeChildrenAndAdd(parent, e) {
  function elt (line 71) | function elt(tag, content, className, style) {
  function eltP (line 80) | function eltP(tag, content, className, style) {
  function contains (line 103) | function contains(parent, child) {
  function activeElt (line 114) | function activeElt() {
  function addClass (line 129) | function addClass(node, cls) {
  function joinClasses (line 133) | function joinClasses(a, b) {
  function bind (line 146) | function bind(f) {
  function copyObj (line 151) | function copyObj(obj, target, overwrite) {
  function countColumn (line 161) | function countColumn(string, end, tabSize, startIndex, startValue) {
  function indexOf (line 182) | function indexOf(array, elt) {
  function findColumn (line 201) | function findColumn(string, goal, tabSize) {
  function spaceStr (line 216) | function spaceStr(n) {
  function lst (line 222) | function lst(arr) { return arr[arr.length-1] }
  function map (line 224) | function map(array, f) {
  function insertSorted (line 230) | function insertSorted(array, value, score) {
  function nothing (line 236) | function nothing() {}
  function createObj (line 238) | function createObj(base, props) {
  function isWordCharBasic (line 251) | function isWordCharBasic(ch) {
  function isWordChar (line 255) | function isWordChar(ch, helper) {
  function isEmpty (line 261) | function isEmpty(obj) {
  function isExtendingChar (line 272) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
  function skipExtendingChars (line 275) | function skipExtendingChars(str, pos, dir) {
  function findFirst (line 283) | function findFirst(pred, from, to) {
  function Display (line 300) | function Display(place, doc, input) {
  function getLine (line 400) | function getLine(doc, n) {
  function getBetween (line 416) | function getBetween(doc, start, end) {
  function getLines (line 428) | function getLines(doc, from, to) {
  function updateLineHeight (line 436) | function updateLineHeight(line, height) {
  function lineNo (line 443) | function lineNo(line) {
  function lineAtHeight (line 457) | function lineAtHeight(chunk, h) {
  function isLine (line 477) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
  function lineNumberFor (line 479) | function lineNumberFor(options, i) {
  function Pos (line 484) | function Pos(line, ch, sticky) {
  function cmp (line 495) | function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
  function equalCursorPos (line 497) | function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b)...
  function copyPos (line 499) | function copyPos(x) {return Pos(x.line, x.ch)}
  function maxPos (line 500) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
  function minPos (line 501) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
  function clipLine (line 505) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
  function clipPos (line 506) | function clipPos(doc, pos) {
  function clipToLen (line 512) | function clipToLen(pos, linelen) {
  function clipPosArray (line 518) | function clipPosArray(doc, array) {
  function seeReadOnlySpans (line 527) | function seeReadOnlySpans() {
  function seeCollapsedSpans (line 531) | function seeCollapsedSpans() {
  function MarkedSpan (line 537) | function MarkedSpan(marker, from, to) {
  function getMarkedSpanFor (line 543) | function getMarkedSpanFor(spans, marker) {
  function removeMarkedSpan (line 551) | function removeMarkedSpan(spans, span) {
  function addMarkedSpan (line 558) | function addMarkedSpan(line, span) {
  function markedSpansBefore (line 567) | function markedSpansBefore(old, startCh, isInsert) {
  function markedSpansAfter (line 579) | function markedSpansAfter(old, endCh, isInsert) {
  function stretchSpansOverChange (line 599) | function stretchSpansOverChange(doc, change) {
  function clearEmptySpans (line 661) | function clearEmptySpans(spans) {
  function removeReadOnlyRanges (line 672) | function removeReadOnlyRanges(doc, from, to) {
  function detachMarkedSpans (line 701) | function detachMarkedSpans(line) {
  function attachMarkedSpans (line 708) | function attachMarkedSpans(line, spans) {
  function extraLeft (line 717) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
  function extraRight (line 718) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
  function compareCollapsedMarkers (line 723) | function compareCollapsedMarkers(a, b) {
  function collapsedSpanAtSide (line 736) | function collapsedSpanAtSide(line, start) {
  function collapsedSpanAtStart (line 746) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
  function collapsedSpanAtEnd (line 747) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
  function collapsedSpanAround (line 749) | function collapsedSpanAround(line, ch) {
  function conflictingCollapsedRange (line 762) | function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
  function visualLine (line 782) | function visualLine(line) {
  function visualLineEnd (line 789) | function visualLineEnd(line) {
  function visualLineContinued (line 798) | function visualLineContinued(line) {
  function visualLineNo (line 809) | function visualLineNo(doc, lineN) {
  function visualLineEndNo (line 817) | function visualLineEndNo(doc, lineN) {
  function lineIsHidden (line 829) | function lineIsHidden(doc, line) {
  function lineIsHiddenInner (line 840) | function lineIsHiddenInner(doc, line, span) {
  function heightAtLine (line 857) | function heightAtLine(lineObj) {
  function lineLength (line 879) | function lineLength(line) {
  function findMaxLine (line 898) | function findMaxLine(cm) {
  function iterateBidiSections (line 914) | function iterateBidiSections(order, from, to, f) {
  function getBidiPartAt (line 928) | function getBidiPartAt(order, ch, sticky) {
  function charType (line 974) | function charType(code) {
  function BidiSpan (line 987) | function BidiSpan(level, from, to) {
  function getOrder (line 1119) | function getOrder(line, direction) {
  function getHandlers (line 1143) | function getHandlers(emitter, type) {
  function off (line 1147) | function off(emitter, type, f) {
  function signal (line 1162) | function signal(emitter, type /*, values...*/) {
  function signalDOMEvent (line 1172) | function signalDOMEvent(cm, e, override) {
  function signalCursorActivity (line 1179) | function signalCursorActivity(cm) {
  function hasHandler (line 1187) | function hasHandler(emitter, type) {
  function eventMixin (line 1193) | function eventMixin(ctor) {
  function e_preventDefault (line 1201) | function e_preventDefault(e) {
  function e_stopPropagation (line 1205) | function e_stopPropagation(e) {
  function e_defaultPrevented (line 1209) | function e_defaultPrevented(e) {
  function e_stop (line 1212) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}
  function e_target (line 1214) | function e_target(e) {return e.target || e.srcElement}
  function e_button (line 1215) | function e_button(e) {
  function zeroWidthElement (line 1236) | function zeroWidthElement(measure) {
  function hasBadBidiRects (line 1251) | function hasBadBidiRects(measure) {
  function hasBadZoomedRects (line 1300) | function hasBadZoomedRects(measure) {
  function defineMode (line 1313) | function defineMode(name, mode) {
  function defineMIME (line 1319) | function defineMIME(mime, spec) {
  function resolveMode (line 1325) | function resolveMode(spec) {
  function getMode (line 1344) | function getMode(options, spec) {
  function extendMode (line 1368) | function extendMode(mode, properties) {
  function copyState (line 1373) | function copyState(mode, state) {
  function innerMode (line 1387) | function innerMode(mode, state) {
  function startState (line 1398) | function startState(mode, a1, a2) {
  function highlightLine (line 1542) | function highlightLine(cm, line, context, forceToEnd) {
  function getLineStyles (line 1587) | function getLineStyles(cm, line, updateFrontier) {
  function getContextBefore (line 1603) | function getContextBefore(cm, n, precise) {
  function processLine (line 1623) | function processLine(cm, text, context, startAt) {
  function callBlankLine (line 1634) | function callBlankLine(mode, state) {
  function readToken (line 1641) | function readToken(mode, stream, state, inner) {
  function takeToken (line 1658) | function takeToken(cm, pos, precise, asArray) {
  function extractLineClasses (line 1672) | function extractLineClasses(type, output) {
  function runMode (line 1687) | function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
  function findStartLine (line 1731) | function findStartLine(cm, n, precise) {
  function retreatFrontier (line 1748) | function retreatFrontier(doc, n) {
  function updateLine (line 1781) | function updateLine(line, text, markedSpans, estimateHeight) {
  function cleanUpLine (line 1793) | function cleanUpLine(line) {
  function interpretTokenStyle (line 1803) | function interpretTokenStyle(style, options) {
  function buildLineContent (line 1815) | function buildLineContent(cm, lineView) {
  function defaultSpecialCharPlaceholder (line 1873) | function defaultSpecialCharPlaceholder(ch) {
  function buildToken (line 1882) | function buildToken(builder, text, style, startStyle, endStyle, title, c...
  function splitSpaces (line 1944) | function splitSpaces(text, trailingBefore) {
  function buildTokenBadBidi (line 1959) | function buildTokenBadBidi(inner, order) {
  function buildCollapsedSpan (line 1979) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
  function insertLineContent (line 1997) | function insertLineContent(line, builder, styles) {
  function LineView (line 2069) | function LineView(doc, line, lineN) {
  function buildViewArray (line 2081) | function buildViewArray(cm, from, to) {
  function pushOperation (line 2093) | function pushOperation(op) {
  function fireCallbacksForOps (line 2104) | function fireCallbacksForOps(group) {
  function finishOperation (line 2120) | function finishOperation(op, endCb) {
  function signalLater (line 2140) | function signalLater(emitter, type /*, values...*/) {
  function fireOrphanDelayed (line 2160) | function fireOrphanDelayed() {
  function updateLineForChanges (line 2169) | function updateLineForChanges(cm, lineView, lineN, dims) {
  function ensureLineWrapped (line 2182) | function ensureLineWrapped(lineView) {
  function updateLineBackground (line 2193) | function updateLineBackground(cm, lineView) {
  function getLineContent (line 2208) | function getLineContent(cm, lineView) {
  function updateLineText (line 2221) | function updateLineText(cm, lineView) {
  function updateLineClasses (line 2236) | function updateLineClasses(cm, lineView) {
  function updateLineGutter (line 2246) | function updateLineGutter(cm, lineView, lineN, dims) {
  function updateLineWidgets (line 2284) | function updateLineWidgets(cm, lineView, dims) {
  function buildLineElement (line 2295) | function buildLineElement(cm, lineView, lineN, dims) {
  function insertLineWidgets (line 2309) | function insertLineWidgets(cm, lineView, dims) {
  function insertLineWidgetsFor (line 2315) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
  function positionLineWidget (line 2331) | function positionLineWidget(widget, node, lineView, dims) {
  function widgetHeight (line 2349) | function widgetHeight(widget) {
  function eventInWidget (line 2365) | function eventInWidget(display, e) {
  function paddingTop (line 2375) | function paddingTop(display) {return display.lineSpace.offsetTop}
  function paddingVert (line 2376) | function paddingVert(display) {return display.mover.offsetHeight - displ...
  function paddingH (line 2377) | function paddingH(display) {
  function scrollGap (line 2386) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
  function displayWidth (line 2387) | function displayWidth(cm) {
  function displayHeight (line 2390) | function displayHeight(cm) {
  function ensureLineHeights (line 2398) | function ensureLineHeights(cm, lineView, rect) {
  function mapFromLineView (line 2419) | function mapFromLineView(lineView, line, lineN) {
  function updateExternalMeasurement (line 2432) | function updateExternalMeasurement(cm, line) {
  function measureChar (line 2445) | function measureChar(cm, line, ch, bias) {
  function findViewForLine (line 2450) | function findViewForLine(cm, lineN) {
  function prepareMeasureForLine (line 2463) | function prepareMeasureForLine(cm, line) {
  function measureCharPrepared (line 2485) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
  function nodeAndOffsetInLineMap (line 2507) | function nodeAndOffsetInLineMap(map, ch, bias) {
  function getUsefulRect (line 2545) | function getUsefulRect(rects, bias) {
  function measureCharInner (line 2555) | function measureCharInner(cm, prepared, ch, bias) {
  function maybeUpdateRectForZooming (line 2608) | function maybeUpdateRectForZooming(measure, rect) {
  function clearLineMeasurementCacheFor (line 2618) | function clearLineMeasurementCacheFor(lineView) {
  function clearLineMeasurementCache (line 2627) | function clearLineMeasurementCache(cm) {
  function clearCaches (line 2634) | function clearCaches(cm) {
  function pageScrollX (line 2641) | function pageScrollX() {
  function pageScrollY (line 2648) | function pageScrollY() {
  function widgetTopHeight (line 2653) | function widgetTopHeight(lineObj) {
  function intoCoordSystem (line 2664) | function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
  function fromCoordSystem (line 2686) | function fromCoordSystem(cm, coords, context) {
  function charCoords (line 2703) | function charCoords(cm, pos, context, lineObj, bias) {
  function cursorCoords (line 2724) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
  function estimateCoords (line 2755) | function estimateCoords(cm, pos) {
  function PosWithInfo (line 2770) | function PosWithInfo(line, ch, sticky, outside, xRel) {
  function coordsChar (line 2779) | function coordsChar(cm, x, y) {
  function wrappedLineExtent (line 2799) | function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
  function wrappedLineExtentChar (line 2807) | function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
  function boxIsAfter (line 2815) | function boxIsAfter(box, x, y, left) {
  function coordsCharInner (line 2819) | function coordsCharInner(cm, lineObj, lineNo, x, y) {
  function coordsBidiPart (line 2886) | function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, ...
  function coordsBidiPartWrapped (line 2910) | function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, or...
  function textHeight (line 2945) | function textHeight(display) {
  function charWidth (line 2965) | function charWidth(display) {
  function getDimensions (line 2977) | function getDimensions(cm) {
  function compensateForHScroll (line 2994) | function compensateForHScroll(display) {
  function estimateHeight (line 3001) | function estimateHeight(cm) {
  function estimateLineHeights (line 3019) | function estimateLineHeights(cm) {
  function posFromMouse (line 3032) | function posFromMouse(cm, e, liberal, forRect) {
  function findViewIndex (line 3050) | function findViewIndex(cm, n) {
  function updateSelection (line 3061) | function updateSelection(cm) {
  function prepareSelection (line 3065) | function prepareSelection(cm, primary) {
  function drawSelectionCursor (line 3086) | function drawSelectionCursor(cm, head, output) {
  function cmpCoords (line 3104) | function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
  function drawSelectionRange (line 3107) | function drawSelectionRange(cm, range, output) {
  function restartBlink (line 3200) | function restartBlink(cm) {
  function ensureFocus (line 3213) | function ensureFocus(cm) {
  function delayBlurEvent (line 3217) | function delayBlurEvent(cm) {
  function onFocus (line 3225) | function onFocus(cm, e) {
  function onBlur (line 3244) | function onBlur(cm, e) {
  function updateHeightsInViewport (line 3258) | function updateHeightsInViewport(cm) {
  function updateWidgetHeight (line 3285) | function updateWidgetHeight(line) {
  function visibleLines (line 3295) | function visibleLines(display, doc, viewport) {
  function alignHorizontally (line 3318) | function alignHorizontally(cm) {
  function maybeUpdateLineNumberWidth (line 3341) | function maybeUpdateLineNumberWidth(cm) {
  function maybeScrollWindow (line 3363) | function maybeScrollWindow(cm, rect) {
  function scrollPosIntoView (line 3380) | function scrollPosIntoView(cm, pos, end, margin) {
  function scrollIntoView (line 3414) | function scrollIntoView(cm, rect) {
  function calculateScrollPos (line 3424) | function calculateScrollPos(cm, rect) {
  function addToScrollTop (line 3454) | function addToScrollTop(cm, top) {
  function ensureCursorVisible (line 3462) | function ensureCursorVisible(cm) {
  function scrollToCoords (line 3468) | function scrollToCoords(cm, x, y) {
  function scrollToRange (line 3474) | function scrollToRange(cm, range) {
  function resolveScrollToPos (line 3483) | function resolveScrollToPos(cm) {
  function scrollToCoordsRange (line 3492) | function scrollToCoordsRange(cm, from, to, margin) {
  function updateScrollTop (line 3504) | function updateScrollTop(cm, val) {
  function setScrollTop (line 3512) | function setScrollTop(cm, val, forceScroll) {
  function setScrollLeft (line 3522) | function setScrollLeft(cm, val, isScroller, forceScroll) {
  function measureForScrollbars (line 3535) | function measureForScrollbars(cm) {
  function maybeDisable (line 3627) | function maybeDisable() {
  function updateScrollbars (line 3656) | function updateScrollbars(cm, measure) {
  function updateScrollbarsInner (line 3670) | function updateScrollbarsInner(cm, measure) {
  function initScrollbars (line 3692) | function initScrollbars(cm) {
  function startOperation (line 3722) | function startOperation(cm) {
  function endOperation (line 3744) | function endOperation(cm) {
  function endOperations (line 3755) | function endOperations(group) {
  function endOperation_R1 (line 3769) | function endOperation_R1(op) {
  function endOperation_W1 (line 3782) | function endOperation_W1(op) {
  function endOperation_R2 (line 3786) | function endOperation_R2(op) {
  function endOperation_W2 (line 3807) | function endOperation_W2(op) {
  function endOperation_finish (line 3832) | function endOperation_finish(op) {
  function runInOp (line 3871) | function runInOp(cm, f) {
  function operation (line 3878) | function operation(cm, f) {
  function methodOp (line 3888) | function methodOp(f) {
  function docMethodOp (line 3896) | function docMethodOp(f) {
  function regChange (line 3912) | function regChange(cm, from, to, lendiff) {
  function regLineChange (line 3977) | function regLineChange(cm, line, type) {
  function resetView (line 3991) | function resetView(cm) {
  function viewCuttingPoint (line 3997) | function viewCuttingPoint(cm, oldN, newN, dir) {
  function adjustView (line 4024) | function adjustView(cm, from, to) {
  function countDirtyView (line 4045) | function countDirtyView(cm) {
  function startWorker (line 4056) | function startWorker(cm, time) {
  function highlightWorker (line 4061) | function highlightWorker(cm) {
  function maybeClipScrollbars (line 4131) | function maybeClipScrollbars(cm) {
  function selectionSnapshot (line 4142) | function selectionSnapshot(cm) {
  function restoreSelection (line 4159) | function restoreSelection(snapshot) {
  function updateDisplayIfNeeded (line 4175) | function updateDisplayIfNeeded(cm, update) {
  function postUpdateDisplay (line 4247) | function postUpdateDisplay(cm, update) {
  function updateDisplaySimple (line 4277) | function updateDisplaySimple(cm, viewport) {
  function patchDisplay (line 4294) | function patchDisplay(cm, updateNumbersFrom, dims) {
  function updateGutterSpace (line 4336) | function updateGutterSpace(cm) {
  function setDocumentHeight (line 4341) | function setDocumentHeight(cm, measure) {
  function updateGutters (line 4349) | function updateGutters(cm) {
  function setGuttersForLineNumbers (line 4367) | function setGuttersForLineNumbers(options) {
  function wheelEventDelta (line 4388) | function wheelEventDelta(e) {
  function wheelEventPixels (line 4395) | function wheelEventPixels(e) {
  function onScrollWheel (line 4402) | function onScrollWheel(cm, e) {
  function normalizeSelection (line 4541) | function normalizeSelection(ranges, primIndex) {
  function simpleSelection (line 4557) | function simpleSelection(anchor, head) {
  function changeEnd (line 4563) | function changeEnd(change) {
  function adjustForChange (line 4571) | function adjustForChange(pos, change) {
  function computeSelAfterChange (line 4580) | function computeSelAfterChange(doc, change) {
  function offsetPos (line 4590) | function offsetPos(pos, old, nw) {
  function computeReplacedSel (line 4599) | function computeReplacedSel(doc, changes, hint) {
  function loadMode (line 4620) | function loadMode(cm) {
  function resetModeState (line 4625) | function resetModeState(cm) {
  function isWholeLineUpdate (line 4641) | function isWholeLineUpdate(doc, change) {
  function updateDoc (line 4647) | function updateDoc(doc, change, markedSpans, estimateHeight) {
  function linkedDocs (line 4699) | function linkedDocs(doc, f, sharedHistOnly) {
  function attachDoc (line 4714) | function attachDoc(cm, doc) {
  function setDirectionClass (line 4726) | function setDirectionClass(cm) {
  function directionChanged (line 4730) | function directionChanged(cm) {
  function History (line 4737) | function History(startGen) {
  function historyChangeFromChange (line 4754) | function historyChangeFromChange(doc, change) {
  function clearSelectionEvents (line 4763) | function clearSelectionEvents(array) {
  function lastChangeEvent (line 4773) | function lastChangeEvent(hist, force) {
  function addChangeToHistory (line 4788) | function addChangeToHistory(doc, change, selAfter, opId) {
  function selectionEventCanBeMerged (line 4831) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
  function addSelectionToHistory (line 4844) | function addSelectionToHistory(doc, sel, opId, options) {
  function pushSelectionToHistory (line 4866) | function pushSelectionToHistory(sel, dest) {
  function attachLocalSpans (line 4873) | function attachLocalSpans(doc, change, from, to) {
  function removeClearedSpans (line 4884) | function removeClearedSpans(spans) {
  function getOldSpans (line 4895) | function getOldSpans(doc, change) {
  function mergeOldSpans (line 4908) | function mergeOldSpans(doc, change) {
  function copyHistoryArray (line 4932) | function copyHistoryArray(events, newGroup, instantiateSel) {
  function extendRange (line 4964) | function extendRange(range, head, other, extend) {
  function extendSelection (line 4983) | function extendSelection(doc, head, other, options, extend) {
  function extendSelections (line 4990) | function extendSelections(doc, heads, options) {
  function replaceOneSelection (line 5000) | function replaceOneSelection(doc, i, range, options) {
  function setSimpleSelection (line 5007) | function setSimpleSelection(doc, anchor, head, options) {
  function filterSelectionChange (line 5013) | function filterSelectionChange(doc, sel, options) {
  function setSelectionReplaceHistory (line 5032) | function setSelectionReplaceHistory(doc, sel, options) {
  function setSelection (line 5043) | function setSelection(doc, sel, options) {
  function setSelectionNoUndo (line 5048) | function setSelectionNoUndo(doc, sel, options) {
  function setSelectionInner (line 5060) | function setSelectionInner(doc, sel) {
  function reCheckSelection (line 5074) | function reCheckSelection(doc) {
  function skipAtomicInSelection (line 5080) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
  function skipAtomicInner (line 5095) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
  function skipAtomic (line 5128) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
  function movePos (line 5141) | function movePos(doc, pos, dir, line) {
  function selectAll (line 5153) | function selectAll(cm) {
  function filterChange (line 5160) | function filterChange(doc, change, update) {
  function makeChange (line 5184) | function makeChange(doc, change, ignoreReadOnly) {
  function makeChangeInner (line 5206) | function makeChangeInner(doc, change) {
  function makeChangeFromHistory (line 5224) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
  function shiftDoc (line 5300) | function shiftDoc(doc, distance) {
  function makeChangeSingleDoc (line 5316) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
  function makeChangeSingleDocInEditor (line 5349) | function makeChangeSingleDocInEditor(cm, change, spans) {
  function replaceRange (line 5407) | function replaceRange(doc, code, from, to, origin) {
  function rebaseHistSelSingle (line 5417) | function rebaseHistSelSingle(pos, from, to, diff) {
  function rebaseHistArray (line 5433) | function rebaseHistArray(array, from, to, diff) {
  function rebaseHist (line 5461) | function rebaseHist(hist, change) {
  function changeLine (line 5470) | function changeLine(doc, handle, changeType, op) {
  function LeafChunk (line 5492) | function LeafChunk(lines) {
  function BranchChunk (line 5545) | function BranchChunk(children) {
  function adjustScrollWhenAboveVisible (line 5708) | function adjustScrollWhenAboveVisible(cm, line, diff) {
  function addLineWidget (line 5713) | function addLineWidget(doc, handle, node, options) {
  function markText (line 5873) | function markText(doc, from, to, options, type) {
  function markTextShared (line 5971) | function markTextShared(doc, from, to, options, type) {
  function findSharedMarkers (line 5986) | function findSharedMarkers(doc) {
  function copySharedMarkers (line 5990) | function copySharedMarkers(doc, markers) {
  function detachSharedMarkers (line 6002) | function detachSharedMarkers(markers) {
  function onDrop (line 6444) | function onDrop(e) {
  function onDragStart (line 6504) | function onDragStart(cm, e) {
  function onDragOver (line 6527) | function onDragOver(cm, e) {
  function clearDragCursor (line 6539) | function clearDragCursor(cm) {
  function forEachCodeMirror (line 6550) | function forEachCodeMirror(f) {
  function ensureGlobalHandlers (line 6560) | function ensureGlobalHandlers() {
  function registerGlobalHandlers (line 6565) | function registerGlobalHandlers() {
  function onResize (line 6578) | function onResize(cm) {
  function normalizeKeyName (line 6651) | function normalizeKeyName(name) {
  function normalizeKeyMap (line 6675) | function normalizeKeyMap(keymap) {
  function lookupKey (line 6702) | function lookupKey(key, map, handle, context) {
  function isModifierKey (line 6721) | function isModifierKey(value) {
  function addModifierNames (line 6726) | function addModifierNames(name, event, noShift) {
  function keyName (line 6736) | function keyName(event, noShift) {
  function getKeyMap (line 6746) | function getKeyMap(val) {
  function deleteNearSelection (line 6752) | function deleteNearSelection(cm, compute) {
  function moveCharLogically (line 6775) | function moveCharLogically(line, ch, dir) {
  function moveLogically (line 6780) | function moveLogically(line, start, dir) {
  function endOfLine (line 6785) | function endOfLine(visually, cm, lineObj, lineNo, dir) {
  function moveVisually (line 6812) | function moveVisually(cm, line, start, dir) {
  function lineStart (line 7024) | function lineStart(cm, lineN) {
  function lineEnd (line 7030) | function lineEnd(cm, lineN) {
  function lineStartSmart (line 7036) | function lineStartSmart(cm, pos) {
  function doHandleBinding (line 7049) | function doHandleBinding(cm, bound, dropShift) {
  function lookupKeyForEditor (line 7069) | function lookupKeyForEditor(cm, name, handle) {
  function dispatchKey (line 7083) | function dispatchKey(cm, name, e, handle) {
  function dispatchKeyInner (line 7101) | function dispatchKeyInner(cm, name, e, handle) {
  function handleKeyBinding (line 7118) | function handleKeyBinding(cm, e) {
  function handleCharBinding (line 7137) | function handleCharBinding(cm, e, ch) {
  function onKeyDown (line 7142) | function onKeyDown(e) {
  function showCrossHair (line 7163) | function showCrossHair(cm) {
  function onKeyUp (line 7178) | function onKeyUp(e) {
  function onKeyPress (line 7183) | function onKeyPress(e) {
  function clickRepeat (line 7211) | function clickRepeat(pos, button) {
  function onMouseDown (line 7232) | function onMouseDown(e) {
  function handleMappedButton (line 7269) | function handleMappedButton(cm, button, pos, repeat, event) {
  function configureMouse (line 7289) | function configureMouse(cm, repeat, event) {
  function leftButtonDown (line 7302) | function leftButtonDown(cm, pos, repeat, event) {
  function leftButtonStartDrag (line 7320) | function leftButtonStartDrag(cm, event, pos, behavior) {
  function rangeForUnit (line 7359) | function rangeForUnit(cm, pos, unit) {
  function leftButtonSelect (line 7368) | function leftButtonSelect(cm, event, start, behavior) {
  function bidiSimplify (line 7500) | function bidiSimplify(cm, range) {
  function gutterEvent (line 7535) | function gutterEvent(cm, e, type, prevent) {
  function clickInGutter (line 7564) | function clickInGutter(cm, e) {
  function onContextMenu (line 7573) | function onContextMenu(cm, e) {
  function contextMenuInGutter (line 7579) | function contextMenuInGutter(cm, e) {
  function themeChanged (line 7584) | function themeChanged(cm) {
  function defineOptions (line 7595) | function defineOptions(CodeMirror) {
  function guttersChanged (line 7729) | function guttersChanged(cm) {
  function dragDropChanged (line 7735) | function dragDropChanged(cm, value, old) {
  function wrappingChanged (line 7748) | function wrappingChanged(cm) {
  function CodeMirror (line 7766) | function CodeMirror(place, options) {
  function registerEventHandlers (line 7842) | function registerEventHandlers(cm) {
  function indentLine (line 7957) | function indentLine(cm, n, how, aggressive) {
  function setLastCopied (line 8021) | function setLastCopied(newLastCopied) {
  function applyTextInput (line 8025) | function applyTextInput(cm, inserted, deleted, sel, origin) {
  function handlePaste (line 8073) | function handlePaste(e, cm) {
  function triggerElectric (line 8083) | function triggerElectric(cm, inserted) {
  function copyableRanges (line 8107) | function copyableRanges(cm) {
  function disableBrowserMagic (line 8118) | function disableBrowserMagic(field, spellcheck) {
  function hiddenTextarea (line 8124) | function hiddenTextarea() {
  function addEditorMethods (line 8147) | function addEditorMethods(CodeMirror) {
  function findPosH (line 8590) | function findPosH(doc, pos, dir, unit, visually) {
  function findPosV (line 8650) | function findPosV(cm, pos, dir, unit) {
  function onCopyCut (line 8713) | function onCopyCut(e) {
  function poll (line 8871) | function poll() {
  function posToDOM (line 9037) | function posToDOM(cm, pos) {
  function isInGutter (line 9053) | function isInGutter(node) {
  function badPos (line 9059) | function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
  function domTextBetween (line 9061) | function domTextBetween(cm, from, to, fromLine, toLine) {
  function domToPos (line 9114) | function domToPos(cm, node, offset) {
  function locateNodeInLineView (line 9133) | function locateNodeInLineView(lineView, node, offset) {
  function prepareCopyCut (line 9230) | function prepareCopyCut(e) {
  function p (line 9370) | function p() {
  function prepareSelectAllHack (line 9473) | function prepareSelectAllHack() {
  function rehide (line 9486) | function rehide() {
  function fromTextArea (line 9532) | function fromTextArea(textarea, options) {
  function addLegacyProps (line 9589) | function addLegacyProps(CodeMirror) {

FILE: src/compiler/crystal/tools/playground/public/vendor/codemirror-5.38.0/mode/crystal/crystal.js
  function wordRegExp (line 15) | function wordRegExp(words, end) {
  function chain (line 19) | function chain(tokenize, stream, state) {
  function tokenBase (line 58) | function tokenBase(stream, state) {
  function tokenNest (line 237) | function tokenNest(begin, end, style, started) {
  function tokenMacro (line 256) | function tokenMacro(begin, end, started) {
  function tokenMacroDef (line 274) | function tokenMacroDef(stream, state) {
  function tokenFollowIdent (line 291) | function tokenFollowIdent(stream, state) {
  function tokenFollowType (line 305) | function tokenFollowType(stream, state) {
  function tokenQuote (line 315) | function tokenQuote(end, style, embed) {
  function tokenHereDoc (line 354) | function tokenHereDoc(phrase, embed) {

FILE: src/llvm/ext/llvm_ext.cc
  type LLVMOpaqueOperandBundle (line 20) | struct LLVMOpaqueOperandBundle
  function LLVMMetadataRef (line 27) | LLVMMetadataRef LLVMExtDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder,
  function LLVMExtClearCurrentDebugLocation (line 35) | void LLVMExtClearCurrentDebugLocation(LLVMBuilderRef B) {
  function LLVMOperandBundleRef (line 41) | LLVMOperandBundleRef LLVMExtCreateOperandBundle(const char *Tag, size_t ...
  function LLVMExtDisposeOperandBundle (line 48) | void LLVMExtDisposeOperandBundle(LLVMOperandBundleRef Bundle) {
  function LLVMValueRef (line 52) | LLVMValueRef
  function LLVMValueRef (line 67) | LLVMValueRef LLVMExtBuildInvokeWithOperandBundles(
  function TargetMachine (line 83) | static TargetMachine *unwrap(LLVMTargetMachineRef P) {
  function LLVMExtSetTargetMachineGlobalISel (line 87) | void LLVMExtSetTargetMachineGlobalISel(LLVMTargetMachineRef T, LLVMBool ...
Copy disabled (too large) Download .json
Condensed preview — 2517 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,617K chars).
[
  {
    "path": ".ameba.yml",
    "chars": 5343,
    "preview": "# This configuration file was generated by `ameba --gen-config`\n# on 2025-06-02 13:57:07 UTC using Ameba version 1.7.0-d"
  },
  {
    "path": ".circleci/config.yml",
    "chars": 16519,
    "preview": "version: 2.1\n\nparameters:\n  distribution-scripts-repo:\n    description: \"Git url https://github.com/crystal-lang/distrib"
  },
  {
    "path": ".editorconfig",
    "chars": 156,
    "preview": "root = true\n\n[*.{cr,ecr}]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size "
  },
  {
    "path": ".gitattributes",
    "chars": 1113,
    "preview": "## Sources\n\n*.cr text eol=lf\n\n## Sourced-in dependencies\n\nlib/** linguist-vendored\n\n## Generated files\n\n# produced by sc"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "chars": 1284,
    "preview": "---\nname: \"\\U0001F41B Bug Report\"\nabout: I want to report a bug.\nlabels: kind:bug\ntype: Bug\n---\n\n# Bug Report\n\nMake sure"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 435,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: \"\\U00002753 Crystal Community Forum\"\n    url: https://forum.crystal"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/discussion.md",
    "chars": 673,
    "preview": "---\nname: \"\\U0001F914 Language Improvement Discussion\"\nabout: I want to start a new discussion about improving the langu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.md",
    "chars": 1129,
    "preview": "---\nname: \"\\U0001F680 Feature Request\"\nabout: I want to propose a new language feature.\nlabels: kind:feature\ntype: Featu"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/pull_request_template.md",
    "chars": 1527,
    "preview": "# Pull Request\n\nWe thank you for helping improve Crystal. In order to ease the reviewing process, we invite you to read "
  },
  {
    "path": ".github/actionlint.yaml",
    "chars": 903,
    "preview": "self-hosted-runner:\n  # Labels of self-hosted runner in array of strings.\n  labels:\n    - runs-on\n    - runner=*\n    - f"
  },
  {
    "path": ".github/renovate.json",
    "chars": 489,
    "preview": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\"\n  ],\n  \"sepa"
  },
  {
    "path": ".github/workflows/aarch64.yml",
    "chars": 4408,
    "preview": "name: AArch64 CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref"
  },
  {
    "path": ".github/workflows/backport.yml",
    "chars": 1430,
    "preview": "# WARNING:\n# When extending this action, be aware that $GITHUB_TOKEN allows write access to\n# the GitHub repository. Thi"
  },
  {
    "path": ".github/workflows/docs.yml",
    "chars": 1129,
    "preview": "name: Docs\n\non:\n  push:\n    branches:\n      - master\n\npermissions: {}\n\nenv:\n  TRAVIS_OS_NAME: linux\n\njobs:\n  deploy_api_"
  },
  {
    "path": ".github/workflows/forward-compatibility.yml",
    "chars": 2216,
    "preview": "name: Forward Compatibility\n\non:\n  push:\n    paths:\n      - .github/workflows/forward-compatibility.yml\n  schedule:\n  - "
  },
  {
    "path": ".github/workflows/interpreter.yml",
    "chars": 2595,
    "preview": "name: Interpreter Test\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ gith"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 2008,
    "preview": "name: Lint\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\npermissions: {}\n\njobs:\n  prek:\n    runs-on: ubuntu-latest\n "
  },
  {
    "path": ".github/workflows/linux.yml",
    "chars": 3670,
    "preview": "name: Linux CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }"
  },
  {
    "path": ".github/workflows/llvm.yml",
    "chars": 2754,
    "preview": "name: LLVM CI\n\non:\n  push:\n    paths:\n      - 'src/compiler/crystal/codegen/**'\n      - 'src/llvm/**'\n      - 'spec/std/"
  },
  {
    "path": ".github/workflows/macos.yml",
    "chars": 2460,
    "preview": "name: macOS CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }"
  },
  {
    "path": ".github/workflows/mingw-w64-steps.yml",
    "chars": 5050,
    "preview": "name: MinGW-w64 CI / Build\r\n\r\non:\r\n  workflow_call:\r\n    inputs:\r\n      arch:\r\n        required: true\r\n        type: str"
  },
  {
    "path": ".github/workflows/mingw-w64.yml",
    "chars": 703,
    "preview": "name: MinGW-w64 CI\r\n\r\non: [push, pull_request]\r\n\r\npermissions: {}\r\n\r\nconcurrency:\r\n  group: ${{ github.workflow }}-${{ g"
  },
  {
    "path": ".github/workflows/openssl.yml",
    "chars": 2207,
    "preview": "name: OpenSSL CI\n\non:\n  push:\n    paths:\n      - 'src/openssl/**'\n      - 'spec/std/digest/**'\n      - 'spec/std/openssl"
  },
  {
    "path": ".github/workflows/regex-engine.yml",
    "chars": 1802,
    "preview": "name: Regex Engine CI\n\non:\n  push:\n    paths:\n      - 'src/regex.cr'\n      - 'src/regex/**'\n      - 'spec/std/regex_spec"
  },
  {
    "path": ".github/workflows/smoke.yml",
    "chars": 2136,
    "preview": "# These jobs are smoke tests for platforms where we don't run full tests.\n# They ensure that std_spec, compiler_spec and"
  },
  {
    "path": ".github/workflows/update-devenv.yml",
    "chars": 1567,
    "preview": "name: Update devenv\n\non:\n  schedule:\n    - cron: \"0 3 * * 2\" # Weekly on Tuesdays\n  push:\n    branches:\n      - master\n "
  },
  {
    "path": ".github/workflows/wasm32.yml",
    "chars": 1888,
    "preview": "name: WebAssembly CI\n\non: [push, pull_request]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github"
  },
  {
    "path": ".github/workflows/win.yml",
    "chars": 14646,
    "preview": "name: Windows CI\n\non: [push, pull_request, workflow_dispatch]\n\npermissions: {}\n\nconcurrency:\n  group: ${{ github.workflo"
  },
  {
    "path": ".github/workflows/win_build_portable.yml",
    "chars": 4817,
    "preview": "name: Windows CI / Build Portable Package\n\non:\n  workflow_call:\n    inputs:\n      release:\n        required: true\n      "
  },
  {
    "path": ".github/workflows/xml.yml",
    "chars": 1580,
    "preview": "name: XML CI\n\non:\n  push:\n    paths:\n      - 'spec/std/xml/**'\n      - 'src/xml/**'\n      - '.github/workflows/xml.yml'\n"
  },
  {
    "path": ".github/zizmor.yml",
    "chars": 166,
    "preview": "rules:\n  dangerous-triggers:\n    ignore:\n      - backport.yml\n  unpinned-uses:\n    config:\n      policies:\n        actio"
  },
  {
    "path": ".gitignore",
    "chars": 341,
    "preview": "# Environment configuration\n/Makefile.local\n/Makefile.win.local\n.env\n.env.*\n.envrc\n.envrc.*\n\n# Build artifacts\n*.o\n*.ll\n"
  },
  {
    "path": ".mailmap",
    "chars": 1035,
    "preview": "Ary Borenszweig <asterite@gmail.com> <aborenszweig@manas.com.ar>\nAry Borenszweig <asterite@gmail.com> <ary@esperanto.org"
  },
  {
    "path": ".markdownlint.yaml",
    "chars": 574,
    "preview": "default: true\n\nheading-style: \"setext\"\n\nno-inline-html: false\nline-length: false\n\nol-prefix:\n  style: \"ordered\"\nul-style"
  },
  {
    "path": ".markdownlintignore",
    "chars": 6,
    "preview": "/lib/\n"
  },
  {
    "path": ".well-known/funding-manifest-urls",
    "chars": 38,
    "preview": "https://crystal-lang.org/funding.json\n"
  },
  {
    "path": "Brewfile",
    "chars": 133,
    "preview": "brew \"gmp\"\nbrew \"libevent\"\nbrew \"pcre\"\nbrew \"pkg-config\"\nbrew \"openssl@1.1\"\nbrew \"llvm@11\", link: true, conflicts_with: "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 122,
    "preview": "# Changelog\n\nFor information on prior releases, refer to the changelogs in [./doc/changelogs](./doc/changelogs/README.md"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3296,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 15278,
    "preview": "# Contributing to Crystal\n\nSo you've decided to contribute to Crystal. Excellent!\n\n## Using the issue tracker\n\nThe [issu"
  },
  {
    "path": "LICENSE",
    "chars": 11798,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "LICENSES/Apache-2.0.txt",
    "chars": 10280,
    "preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
  },
  {
    "path": "LICENSES/MIT.txt",
    "chars": 1078,
    "preview": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "LICENSES/Swift-exception.txt",
    "chars": 355,
    "preview": "### Runtime Library Exception to the Apache 2.0 License: ###\n\nAs an exception, if you use this Software to compile your "
  },
  {
    "path": "Makefile",
    "chars": 12929,
    "preview": "all:\n\n-include Makefile.local # for optional local options e.g. threads\n\n# Recipes for this Makefile\n\n## Build the compi"
  },
  {
    "path": "Makefile.win",
    "chars": 13090,
    "preview": "all:\r\n\r\n-include Makefile.win.local # for optional local options e.g. threads\r\n\r\n# Recipes for this Makefile\r\n\r\n## Build"
  },
  {
    "path": "NOTICE.md",
    "chars": 2504,
    "preview": "# Crystal Programming Language\n\nCopyright 2012-2026 Manas Technology Solutions.\n\nThis product includes software develope"
  },
  {
    "path": "README.md",
    "chars": 4010,
    "preview": "# Crystal\n\n[![Linux CI Build Status](https://github.com/crystal-lang/crystal/workflows/Linux%20CI/badge.svg)](https://gi"
  },
  {
    "path": "REUSE.toml",
    "chars": 911,
    "preview": "version = 1\n\n# All original code in this repository is licensed under Apache 2.0 with Swift\n# exception.\n[[annotations]]"
  },
  {
    "path": "SECURITY.md",
    "chars": 528,
    "preview": "# Reporting a Vulnerability\n\nShould you find any security-related issue, please _do not share them openly_ in\nthe issue "
  },
  {
    "path": "UPGRADING.md",
    "chars": 1221,
    "preview": "# Upgrading\n\nThis guide provides instructions for upgrading Crystal from one release to the next.\nUpgrades must be run s"
  },
  {
    "path": "_typos.toml",
    "chars": 1719,
    "preview": "[default.extend-words]\nflate = \"flate\"\n\n[default.extend-identifiers]\nACCES = \"ACCES\"\nba = \"ba\"\nba2 = \"ba2\"\nbui = \"bui\"\nc"
  },
  {
    "path": "bin/check-compiler-flag",
    "chars": 2395,
    "preview": "#!/bin/sh\n\n# Use `./bin/check-compiler-flag FLAG` to check the behaviour of the given compiler flag.\n# This is useful if"
  },
  {
    "path": "bin/ci",
    "chars": 6882,
    "preview": "#!/bin/sh\n\nfail() {\n  echo \"${*}\" >&2\n  exit 1\n}\n\non_tag() {\n  if [ -n \"$CURRENT_TAG\" ]; then\n    echo \"${*}\"\n    eval \""
  },
  {
    "path": "bin/crystal",
    "chars": 6248,
    "preview": "#!/bin/sh\n\n################## https://github.com/mkropat/sh-realpath #####################\n#\n# The MIT License (MIT)\n#\n#"
  },
  {
    "path": "bin/crystal.bat",
    "chars": 98,
    "preview": "@echo off\r\npowershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"%~dp0crystal.ps1\" --%% %*\r\n"
  },
  {
    "path": "bin/crystal.ps1",
    "chars": 10856,
    "preview": "param(\r\n    [Parameter(Position = 0, ValueFromRemainingArguments)] [string[]] $CrystalArgs\r\n)\r\n\r\n# https://www.powershel"
  },
  {
    "path": "devenv.nix",
    "chars": 1249,
    "preview": "{ pkgs, lib, config, inputs, ... }:\n\n{\n  dotenv.enable = true;\n\n  git-hooks.hooks = {\n    actionlint.enable = true;\n    "
  },
  {
    "path": "devenv.yaml",
    "chars": 115,
    "preview": "inputs:\n  git-hooks:\n    url: github:cachix/git-hooks.nix\n  nixpkgs:\n    url: github:cachix/devenv-nixpkgs/rolling\n"
  },
  {
    "path": "doc/changelogs/README.md",
    "chars": 563,
    "preview": "# Changelog\n\n## Historical changelogs\n\n- [pre-1.0](pre-1.0.md)\n- [1.0 series](v1.0.md)\n- [1.1 series](v1.1.md)\n- [1.2 se"
  },
  {
    "path": "doc/changelogs/pre-1.0.md",
    "chars": 366560,
    "preview": "# Changelog pre 1.0\n\n## 0.36.1 (2021-02-02)\n\n### Standard library\n\n- Fix `Enum.from_value?` for flag enum with non `Int3"
  },
  {
    "path": "doc/changelogs/v1.0.md",
    "chars": 9310,
    "preview": "# Changelog 1.0\n\n## [1.0.0] - 2021-03-22\n\n[1.0.0]: https://github.com/crystal-lang/crystal/releases/1.0.0\n\n### Language "
  },
  {
    "path": "doc/changelogs/v1.1.md",
    "chars": 23254,
    "preview": "# Changelog 1.1\n\n## [1.1.1] - 2021-07-26\n\n[1.1.1]: https://github.com/crystal-lang/crystal/releases/1.1.1\n\n### Language "
  },
  {
    "path": "doc/changelogs/v1.10.md",
    "chars": 12233,
    "preview": "# Changelog 1.10\n\n## [1.10.1] (2023-10-13)\n\n[1.10.1]: https://github.com/crystal-lang/crystal/releases/1.10.1\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.11.md",
    "chars": 27960,
    "preview": "# Changelog 1.11\n\n## [1.11.2] (2024-01-18)\n\n[1.11.2]: https://github.com/crystal-lang/crystal/releases/1.11.2\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.12.md",
    "chars": 22866,
    "preview": "# Changelog 1.12\n\n## [1.12.2] (2024-05-31)\n\n_Patch release with a bug fix necessary for support of latest libgc._\n\n[1.12"
  },
  {
    "path": "doc/changelogs/v1.13.md",
    "chars": 30697,
    "preview": "# Changelog 1.13\n\n## [1.13.3] (2024-09-18)\n\n[1.13.3]: https://github.com/crystal-lang/crystal/releases/1.13.3\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.14.md",
    "chars": 21709,
    "preview": "# Changelog 1.14\n\n## [1.14.1] (2025-01-08)\n\n[1.14.1]: https://github.com/crystal-lang/crystal/releases/1.14.1\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.15.md",
    "chars": 26273,
    "preview": "# Changelog 1.15\n\n## [1.15.1] (2025-02-04)\n\n[1.15.1]: https://github.com/crystal-lang/crystal/releases/1.15.1\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.16.md",
    "chars": 29457,
    "preview": "# Changelog 1.16\n\n## [1.16.3] (2025-05-12)\n\n[1.16.3]: https://github.com/crystal-lang/crystal/releases/1.16.3\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.17.md",
    "chars": 27833,
    "preview": "# Changelog 1.17\n\n## [1.17.1] (2025-07-22)\n\n[1.17.1]: https://github.com/crystal-lang/crystal/releases/1.17.1\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.18.md",
    "chars": 27479,
    "preview": "# Changelog 1.18\n\n## [1.18.2] (2025-10-21)\n\n[1.18.2]: https://github.com/crystal-lang/crystal/releases/1.18.2\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.19.md",
    "chars": 35636,
    "preview": "# Changelog 1.19\n\n## [1.19.1] (2026-01-20)\n\n[1.19.1]: https://github.com/crystal-lang/crystal/releases/1.19.1\n\n### Bugfi"
  },
  {
    "path": "doc/changelogs/v1.2.md",
    "chars": 27612,
    "preview": "# Changelog 1.2\n\n## [1.2.2] - 2021-11-10\n\n[1.2.2]: https://github.com/crystal-lang/crystal/releases/1.2.2\n\n### Compiler\n"
  },
  {
    "path": "doc/changelogs/v1.3.md",
    "chars": 25105,
    "preview": "# Changelog 1.3\n\n## [1.3.2] - 2022-01-18\n\n[1.3.2]: https://github.com/crystal-lang/crystal/releases/1.3.2\n\n### Standard "
  },
  {
    "path": "doc/changelogs/v1.4.md",
    "chars": 18833,
    "preview": "# Changelog 1.4\n\n## [1.4.1] - 2022-04-22\n\n[1.4.1]: https://github.com/crystal-lang/crystal/releases/1.4.1\n\n### Standard "
  },
  {
    "path": "doc/changelogs/v1.5.md",
    "chars": 15668,
    "preview": "# Changelog 1.5\n\n## [1.5.1] - 2022-09-07\n\n[1.5.1]: https://github.com/crystal-lang/crystal/releases/1.5.1\n\n### Standard "
  },
  {
    "path": "doc/changelogs/v1.6.md",
    "chars": 27952,
    "preview": "# Changelog 1.6\n\n## [1.6.2] - 2022-11-03\n\n[1.6.2]: https://github.com/crystal-lang/crystal/releases/1.6.2\n\n### Language\n"
  },
  {
    "path": "doc/changelogs/v1.7.md",
    "chars": 23429,
    "preview": "# Changelog 1.7\n\n## [1.7.3] - 2023-03-07\n\n[1.7.3]: https://github.com/crystal-lang/crystal/releases/1.7.3\n\n### Standard "
  },
  {
    "path": "doc/changelogs/v1.8.md",
    "chars": 26282,
    "preview": "# Changelog 1.8\n\n## [1.8.2] - 2023-05-08\n\n[1.8.2]: https://github.com/crystal-lang/crystal/releases/1.8.2\n\n### Standard "
  },
  {
    "path": "doc/changelogs/v1.9.md",
    "chars": 24504,
    "preview": "# Changelog 1.9\n\n## [1.9.2] - 2023-07-19\n\n[1.9.2]: https://github.com/crystal-lang/crystal/releases/1.9.2\n\n### Bugfixes\n"
  },
  {
    "path": "doc/man/crystal-build.adoc",
    "chars": 5211,
    "preview": "= crystal-build(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compile"
  },
  {
    "path": "doc/man/crystal-docs.adoc",
    "chars": 2349,
    "preview": "= crystal-docs(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
  },
  {
    "path": "doc/man/crystal-env.adoc",
    "chars": 986,
    "preview": "= crystal-env(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler "
  },
  {
    "path": "doc/man/crystal-eval.adoc",
    "chars": 1537,
    "preview": "= crystal-eval(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
  },
  {
    "path": "doc/man/crystal-init.adoc",
    "chars": 839,
    "preview": "= crystal-init(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
  },
  {
    "path": "doc/man/crystal-play.adoc",
    "chars": 616,
    "preview": "= crystal-play(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
  },
  {
    "path": "doc/man/crystal-run.adoc",
    "chars": 416,
    "preview": "= crystal-run(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler "
  },
  {
    "path": "doc/man/crystal-spec.adoc",
    "chars": 1420,
    "preview": "= crystal-spec(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler"
  },
  {
    "path": "doc/man/crystal-tool-dependencies.adoc",
    "chars": 1212,
    "preview": "= crystal-tool-dependencies(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Cry"
  },
  {
    "path": "doc/man/crystal-tool-format.adoc",
    "chars": 499,
    "preview": "= crystal-tool-format(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal C"
  },
  {
    "path": "doc/man/crystal-tool-macro_code_coverage.adoc",
    "chars": 1641,
    "preview": "= crystal-tool-macro_code_coverage(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manu"
  },
  {
    "path": "doc/man/crystal-tool-unreachable.adoc",
    "chars": 1640,
    "preview": "= crystal-tool-unreachable(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crys"
  },
  {
    "path": "doc/man/crystal.adoc",
    "chars": 5422,
    "preview": "= crystal(1)\n:doctype: manpage\n:date: {localdate}\n:crystal_version: {crystal_version}\n:man manual: Crystal Compiler Comm"
  },
  {
    "path": "etc/completion.bash",
    "chars": 3883,
    "preview": "# Bash completion for \"crystal\" command.\n# Written by Sergey Potapov <blake131313@gmail.com>.\n\n# Return list of options,"
  },
  {
    "path": "etc/completion.fish",
    "chars": 26211,
    "preview": "set -l crystal_commands init build clear_cache docs env eval i interactive play run spec tool help version\nset -l tool_s"
  },
  {
    "path": "etc/completion.zsh",
    "chars": 8759,
    "preview": "#compdef crystal\n\n_crystal() {\n\n_crystal_commands() {\n  local -a commands\n  commands=(\n    \"init:generate new crystal pr"
  },
  {
    "path": "etc/gdb/crystal_formatters.py",
    "chars": 2011,
    "preview": "import gdb\n\nclass CrystalStringPrinter:\n    def __init__(self, val):\n        self.val = val\n\n    def to_string(self):\n  "
  },
  {
    "path": "etc/lldb/crystal_formatters.py",
    "chars": 2127,
    "preview": "import lldb\n\nclass CrystalArraySyntheticProvider:\n    def __init__(self, valobj, internal_dict):\n        self.valobj = v"
  },
  {
    "path": "etc/msvc/crystal.natvis",
    "chars": 1312,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010"
  },
  {
    "path": "etc/win-ci/build-ffi.ps1",
    "chars": 1048,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-gc.ps1",
    "chars": 1618,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [Parameter(M"
  },
  {
    "path": "etc/win-ci/build-iconv.ps1",
    "chars": 1101,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-llvm.ps1",
    "chars": 1774,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [Parameter(M"
  },
  {
    "path": "etc/win-ci/build-mpir.ps1",
    "chars": 1851,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [switch] $Dynamic\r\n)\r\n\r\n. \"$(Split-Path -Parent $MyInvocati"
  },
  {
    "path": "etc/win-ci/build-openssl.ps1",
    "chars": 1315,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-pcre.ps1",
    "chars": 1698,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-pcre2.ps1",
    "chars": 1291,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-xml2.ps1",
    "chars": 1313,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-yaml.ps1",
    "chars": 1084,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/build-z.ps1",
    "chars": 1129,
    "preview": "param(\r\n    [Parameter(Mandatory)] [string] $BuildTree,\r\n    [Parameter(Mandatory)] [string] $Version,\r\n    [switch] $Dy"
  },
  {
    "path": "etc/win-ci/crystal.iss",
    "chars": 16460,
    "preview": "#define MyAppName \"Crystal\"\r\n#define VersionFile FileOpen(\"portable\\src\\VERSION\")\r\n#define MyAppVersion FileRead(Version"
  },
  {
    "path": "etc/win-ci/cygwin-build-iconv.sh",
    "chars": 1105,
    "preview": "#!/bin/sh\n# shellcheck disable=SC2155\n\nset -e\n\nDynamic=$1\n\nexport PATH=\"$(pwd)/build-aux:$PATH\"\nexport CC=\"$(pwd)/build-"
  },
  {
    "path": "etc/win-ci/setup.ps1",
    "chars": 2436,
    "preview": "function Run-InDirectory {\r\n    param(\r\n        [Parameter(Mandatory)] [string] $Path,\r\n        [Parameter(Mandatory)] ["
  },
  {
    "path": "lib/.shards.info",
    "chars": 364,
    "preview": "---\nversion: 1.0\nshards:\n  markd:\n    git: https://github.com/icyleaf/markd.git\n    version: 0.5.0\n  reply:\n    git: htt"
  },
  {
    "path": "man/crystal.1",
    "chars": 21545,
    "preview": "'\\\" t\n.\\\"     Title: crystal\n.\\\"    Author: [see the \"AUTHOR(S)\" section]\n.\\\" Generator: Asciidoctor 2.0.23\n.\\\"      Dat"
  },
  {
    "path": "samples/2048.cr",
    "chars": 7918,
    "preview": "# Based on 2048 by Gabriele Cirulli - gabrielecirulli.github.io/2048\n\nrequire \"colorize\"\n\nenum Action\n  Up\n  Down\n  Left"
  },
  {
    "path": "samples/Makefile",
    "chars": 1311,
    "preview": "CRYSTAL := ../bin/crystal## Crystal compiler to use\nO := .build## Output directory\n\nBUILDABLE_SOURCES := $(wildcard *.cr"
  },
  {
    "path": "samples/Makefile.win",
    "chars": 1796,
    "preview": "all:\r\n\r\nMAKEFLAGS += --no-builtin-rules\r\n.SUFFIXES:\r\n\r\nSHELL := cmd.exe\r\n\r\nMKDIR = if not exist $1 mkdir $1\r\nRMDIR = if "
  },
  {
    "path": "samples/binary-trees.cr",
    "chars": 1380,
    "preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/binarytrees"
  },
  {
    "path": "samples/brainfuck.cr",
    "chars": 1888,
    "preview": "# Brainf*ck interpreter\n\nstruct Tape\n  def initialize\n    @tape = [0]\n    @pos = 0\n  end\n\n  def get\n    @tape[@pos]\n  en"
  },
  {
    "path": "samples/channel_primes.cr",
    "chars": 553,
    "preview": "# Ported from Go sample from this page: https://web.archive.org/web/20160602135806/http://dancallahan.info/journal/go-co"
  },
  {
    "path": "samples/channel_select.cr",
    "chars": 370,
    "preview": "def generator(n : T) forall T\n  channel = Channel(T).new\n  spawn do\n    loop do\n      sleep n.seconds\n      channel.send"
  },
  {
    "path": "samples/compiler/formatter_example.cr",
    "chars": 283,
    "preview": "# This is a small sample on how to use a Crystal's\n# formatter programmatically.\n\n# Use `require \"compiler/crystal/forma"
  },
  {
    "path": "samples/compiler/transformer_example.cr",
    "chars": 530,
    "preview": "# This is a small sample on how to use a Crystal::Transformer\n# to transform source code.\n#\n# Here we transform all numb"
  },
  {
    "path": "samples/compiler/visitor_example.cr",
    "chars": 662,
    "preview": "# This is a small sample on how to use a Crystal::Visitor\n# to traverse an AST.\n#\n# Here we count the number of NumberLi"
  },
  {
    "path": "samples/conway.cr",
    "chars": 2029,
    "preview": "# Ported from http://arthurtw.github.io/2015/01/12/quick-comparison-nim-vs-rust.html\n\nstruct ANSI\n  def initialize(@io :"
  },
  {
    "path": "samples/degree_days.cr",
    "chars": 2533,
    "preview": "# Copied with little modifications from: https://github.com/rubinius/rubinius-benchmark/blob/master/real_world/bench_deg"
  },
  {
    "path": "samples/egrep.cr",
    "chars": 155,
    "preview": "if ARGV.empty?\n  abort \"Usage: cat somefile | egrep 'some'\"\nend\n\nregex = Regex.new(ARGV[0])\nwhile str = STDIN.gets\n  STD"
  },
  {
    "path": "samples/fannkuch-redux.cr",
    "chars": 1452,
    "preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/fannkuchred"
  },
  {
    "path": "samples/fibonacci.cr",
    "chars": 220,
    "preview": "def fibonacci(n : Int32) : Int32\n  return 0 if n < 0\n  return n if n <= 1\n\n  fibonacci(n - 1) + fibonacci(n - 2)\nend\n\npu"
  },
  {
    "path": "samples/havlak.cr",
    "chars": 11110,
    "preview": "# Havlak benchmark: https://code.google.com/p/multi-language-bench/\n# Crystal Implementation (translated from Python ver"
  },
  {
    "path": "samples/http_server.cr",
    "chars": 264,
    "preview": "# A very basic HTTP server\nrequire \"http/server\"\n\nserver = HTTP::Server.new do |context|\n  context.response.content_type"
  },
  {
    "path": "samples/impl.cr",
    "chars": 1015,
    "preview": "class Foo\n  property lorem : Int32?\n\n  def foo\n    1\n  end\nend\n\nclass Bar\n  def foo\n    2\n  end\nend\n\ndef bar(o)\n  while "
  },
  {
    "path": "samples/llvm/brainfuck.cr",
    "chars": 7416,
    "preview": "# Ported from https://github.com/Wilfred/Brainfrack/blob/5a2f613f9e82bfd57be687aa6a67aca15d3d9861/llvm/compiler.cpp\n\nreq"
  },
  {
    "path": "samples/mandelbrot.cr",
    "chars": 828,
    "preview": "def print_density(d)\n  if d > 8\n    print ' '\n  elsif d > 4\n    print '.'\n  elsif d > 2\n    print '*'\n  else\n    print '"
  },
  {
    "path": "samples/mandelbrot2.cr",
    "chars": 245,
    "preview": "require \"complex\"\n\ndef mandelbrot(a)\n  Iterator.of(a).first(100).reduce(a) { |z, c| z*z + c }\nend\n\n(1.0).step(to: -1, by"
  },
  {
    "path": "samples/matmul.cr",
    "chars": 863,
    "preview": "# Copied with little modifications from: https://github.com/attractivechaos/plb/blob/master/matmul/matmul_v1.rb\n\ndef mat"
  },
  {
    "path": "samples/meteor.cr",
    "chars": 4139,
    "preview": "# Translated from: https://gitlab.redox-os.org/redox-os/rust/blob/a59de37e99060162a2674e3ff45409ac73595c0e/src/test/benc"
  },
  {
    "path": "samples/mt_gc_test.cr",
    "chars": 5885,
    "preview": "# Experiment to stress the GC with multi-threading.\n# The experiment manually allocates multiple times a queue of fibers"
  },
  {
    "path": "samples/nbodies.cr",
    "chars": 3079,
    "preview": "# Copied with little modifications from: https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/nbody-yarv-"
  },
  {
    "path": "samples/neural_net.cr",
    "chars": 3523,
    "preview": "# Copied with little modifications from: https://github.com/jruby/rubybench/blob/master/time/bench_neural_net.rb\n\nclass "
  },
  {
    "path": "samples/noise.cr",
    "chars": 1978,
    "preview": "# Perlin noise benchmark: https://github.com/nsf/pnoise\n\nrecord Vec2, x : Float64, y : Float64\n\ndef lerp(a, b, v)\n  a * "
  },
  {
    "path": "samples/pig.cr",
    "chars": 2796,
    "preview": "# Translated from Go: http://golang.org/doc/codewalk/functions/\n\nWin            = 100 # The winning score in a game of P"
  },
  {
    "path": "samples/pretty_json.cr",
    "chars": 2053,
    "preview": "# JSON pretty printer\n# ~~~~~~~~~~~~~~~~~~~\n#\n# Reads JSON from STDIN and outputs it formatted and colored to STDOUT.\n#\n"
  },
  {
    "path": "samples/quine.cr",
    "chars": 64,
    "preview": "s = \"s = @; puts s.sub(\\\"@\\\", s.dump)\"; puts s.sub(\"@\", s.dump)\n"
  },
  {
    "path": "samples/red_black_tree.cr",
    "chars": 7909,
    "preview": "# Copied with little modifications from: https://github.com/rubinius/rubinius-benchmark/blob/cf4a2468f46d23cc300815afabc"
  },
  {
    "path": "samples/sdl/fire.cr",
    "chars": 9991,
    "preview": "require \"./sdl/sdl\"\n\nclass Point\n  MAX_LIFE  = 50\n  HALF_LIFE = MAX_LIFE / 2\n\n  property x : Float64\n  property y : Floa"
  },
  {
    "path": "samples/sdl/fire.txt",
    "chars": 627,
    "preview": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n         xxxxxx  xxxxx   xx  xx  xxxxxx  xxxxxx  xxxxxx  xx\n         xxxxxx  xxxxxx  xx  xx  xxxxxx  "
  },
  {
    "path": "samples/sdl/raytracer.cr",
    "chars": 5699,
    "preview": "# Ported from Nimrod: https://gist.github.com/AdrianV/5774141\n\nrequire \"./sdl/sdl\"\n\nWIDTH     = 1280\nHEIGHT    =  720\nFO"
  },
  {
    "path": "samples/sdl/sdl/lib_sdl.cr",
    "chars": 3449,
    "preview": "{% if flag?(:darwin) %}\n  @[Link(\"SDL\")]\n  @[Link(\"SDLMain\")]\n  @[Link(framework: \"Cocoa\")]\n{% else %}\n  @[Link(\"SDL\")]\n"
  },
  {
    "path": "samples/sdl/sdl/sdl.cr",
    "chars": 795,
    "preview": "require \"./*\"\n\nmodule SDL\n  def self.init(flags = LibSDL::INIT_EVERYTHING)\n    if LibSDL.init(flags) != 0\n      raise \"C"
  },
  {
    "path": "samples/sdl/sdl/surface.cr",
    "chars": 652,
    "preview": "class SDL::Surface\n  getter :surface\n  getter :width\n  getter :height\n  getter :bpp\n\n  def initialize(@surface : LibSDL:"
  },
  {
    "path": "samples/sdl/tv.cr",
    "chars": 3116,
    "preview": "require \"./sdl/sdl\"\n\nclass ColorMaker\n  enum State\n    BlueUp\n    BlueDown\n    GreenUp\n    GreenDown\n    RedUp\n    RedDo"
  },
  {
    "path": "samples/sdl/tv.txt",
    "chars": 595,
    "preview": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n      xxxxx   xxxx    x   x   xxxxx   xxxxx   xxxxx   x\n      x.....  x...x   x.  x.  x.....   .x... "
  },
  {
    "path": "samples/sieve.cr",
    "chars": 352,
    "preview": "# Compute prime numbers up to 100 with the Sieve of Eratosthenes\nmax = 100\n\nsieve = Array.new(max + 1, true)\nsieve[0] = "
  },
  {
    "path": "samples/spectral-norm.cr",
    "chars": 827,
    "preview": "# Copied with little modifications from: https://github.com/wmoxam/Ruby-Benchmarks-Game/blob/master/benchmarks/spectral-"
  },
  {
    "path": "samples/sudoku.cr",
    "chars": 5039,
    "preview": "# Copied with little modifications from: https://github.com/attractivechaos/plb/blob/master/sudoku/sudoku_v1.rb\n\ndef sd_"
  },
  {
    "path": "samples/tcp_client.cr",
    "chars": 183,
    "preview": "require \"socket\"\n\n# goes with tcp_server.cr\n\nsocket = TCPSocket.new \"127.0.0.1\", 9000\n10.times do |i|\n  socket.puts i\n  "
  },
  {
    "path": "samples/tcp_server.cr",
    "chars": 432,
    "preview": "require \"socket\"\n\n# goes with tcp_client.cr\n\ndef process(client)\n  client_addr = client.remote_address\n  puts \"#{client_"
  },
  {
    "path": "samples/text_raytracer.cr",
    "chars": 2703,
    "preview": "# Ported from Rust from https://gist.github.com/joshmarinacci/c84d0979e100d107f685\n\nrecord Vector, x : Float64, y : Floa"
  },
  {
    "path": "samples/tree.cr",
    "chars": 518,
    "preview": "class Node\n  @left : self?\n  @right : self?\n\n  def initialize(@value : Char)\n  end\n\n  def add(x)\n    if x < @value\n     "
  },
  {
    "path": "samples/wordcount.cr",
    "chars": 1200,
    "preview": "# Ported from http://arthurtw.github.io/2015/01/12/quick-comparison-nim-vs-rust.html\n\nrequire \"option_parser\"\n\ndef do_wo"
  },
  {
    "path": "scripts/docs-versions.sh",
    "chars": 379,
    "preview": "#! /usr/bin/env sh\n\ngit tag --list | \\\ngrep -v -E '0\\.1?[0-9]\\.' | \\\ngrep '^[0-9]' | \\\nsort -rV | \\\nawk '\n  BEGIN {\n    "
  },
  {
    "path": "scripts/generate_data.mk",
    "chars": 1732,
    "preview": "\n## Run all data generators\n##   $ make -f scripts/generate_data.mk\n## Generate time zone database for stdlib specs\n##  "
  },
  {
    "path": "scripts/generate_glob_specs.sh",
    "chars": 2399,
    "preview": "#!/bin/env bash\n\n# This tool generates the tests in spec/std/file/match-fast-glob_spec.cr\n# from https://github.com/oxc-"
  },
  {
    "path": "scripts/generate_grapheme_break_specs.cr",
    "chars": 2064,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the file spec/std/string/graphemes_break_spec.cr\n# that contains test "
  },
  {
    "path": "scripts/generate_grapheme_properties.cr",
    "chars": 2179,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/string/grapheme/properties.cr\n# that contains compact rep"
  },
  {
    "path": "scripts/generate_html_entities.cr",
    "chars": 1154,
    "preview": "#! /usr/bin/env crystal\n\nrequire \"http\"\nrequire \"json\"\nrequire \"ecr\"\n\nrecord Entity, characters : String, codepoints : A"
  },
  {
    "path": "scripts/generate_llvm_version_info.cr",
    "chars": 2322,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the `lib/llvm_VERSION` file from LLVM-C.dll, needed for\n# dynamically "
  },
  {
    "path": "scripts/generate_object_properties.cr",
    "chars": 9005,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the `src/object/properties.cr` file with the whole set\n# of `[class_]("
  },
  {
    "path": "scripts/generate_ssl_server_defaults.cr",
    "chars": 2846,
    "preview": "#! /usr/bin/env crystal\n#\n# This helper fetches the Mozilla recommendations for default TLS ciphers\n# (https://wiki.mozi"
  },
  {
    "path": "scripts/generate_unicode_data.cr",
    "chars": 10947,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/unicode/data.cr\n# that contains compact representations o"
  },
  {
    "path": "scripts/generate_windows_zone_names.cr",
    "chars": 1884,
    "preview": "#! /usr/bin/env crystal\n#\n# This script generates the file src/crystal/system/win32/zone_names.cr\n# that contains mappin"
  },
  {
    "path": "scripts/git/pre-commit",
    "chars": 1196,
    "preview": "#! /bin/sh\n#\n# This script ensures Crystal code is correctly formatted before committing it.\n# It won't apply any format"
  },
  {
    "path": "scripts/github-changelog.cr",
    "chars": 10765,
    "preview": "#! /usr/bin/env crystal\n\n# This helper queries merged pull requests for a given milestone from the GitHub API\n# and crea"
  },
  {
    "path": "scripts/grapheme_properties.ecr",
    "chars": 1990,
    "preview": "# This file was automatically generated by running:\n#\n#   scripts/generate_grapheme_properties.cr\n#\n# DO NOT EDIT\n\nstruc"
  },
  {
    "path": "scripts/html_entities.ecr",
    "chars": 662,
    "preview": "# This file was automatically generated by running:\n#\n#   scripts/generate_html_entities.cr\n#\n# DO NOT EDIT\n\nmodule HTML"
  },
  {
    "path": "scripts/print_regex_config.cr",
    "chars": 4758,
    "preview": "#! /usr/bin/env crystal\n\n{% if Regex::Engine.resolve.name == \"Regex::PCRE2\" %}\n  enum LibPCRE2::BSR : UInt32\n    UNICODE"
  },
  {
    "path": "scripts/release-update.sh",
    "chars": 3101,
    "preview": "#!/usr/bin/env sh\n#\n# This helper updates all references to the previous Crystal release as bootstrap version with a new"
  },
  {
    "path": "scripts/test_ssl_server.cr",
    "chars": 898,
    "preview": "#! /usr/bin/env crystal\n#\n# This helper runs a default `HTTP::Server` instance and checks its behaviour\n# using [testssl"
  },
  {
    "path": "scripts/unicode_data.ecr",
    "chars": 9635,
    "preview": "# This file was automatically generated by running:\n#\n#   scripts/generate_unicode_data.cr\n#\n# DO NOT EDIT\n\nmodule Unico"
  },
  {
    "path": "scripts/update-changelog.sh",
    "chars": 2787,
    "preview": "#! /bin/sh\n\n# This script automates generating changelog with `scripts/github-changelog.cr`,\n# editing it into `doc/chan"
  },
  {
    "path": "scripts/update-distribution-scripts.sh",
    "chars": 2047,
    "preview": "#!/usr/bin/env sh\n#\n# This helper updates the reference of [distribution-scripts](https://github.com/crystal-lang/distri"
  },
  {
    "path": "scripts/update-shards.sh",
    "chars": 808,
    "preview": "#!/usr/bin/env sh\n\n# Update shards release.\n#\n# Usage:\n#\n#    scripts/update-shards.sh [<version>]\n#\n# This helper scrip"
  },
  {
    "path": "scripts/windows_zone_names.ecr",
    "chars": 1611,
    "preview": "# This file was automatically generated by running:\n#\n#   scripts/generate_windows_zone_names.cr\n#\n# DO NOT EDIT\n\nmodule"
  },
  {
    "path": "shard.yml",
    "chars": 582,
    "preview": "name: crystal\nversion: 1.20.0-dev\n\nauthors:\n  - Crystal Core Team <crystal@manas.tech>\n\ndescription: |\n  The Crystal sta"
  },
  {
    "path": "shell.nix",
    "chars": 3575,
    "preview": "# This nix-shell script can be used to get a complete development environment\n# for the Crystal compiler.\n#\n# You can ch"
  },
  {
    "path": "spec/all_spec.cr",
    "chars": 75,
    "preview": "require \"./compiler_spec\"\nrequire \"./std_spec\"\nrequire \"./primitives_spec\"\n"
  },
  {
    "path": "spec/compiler/codegen/abi/aarch64_spec.cr",
    "chars": 5250,
    "preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/aarch64\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:aa"
  },
  {
    "path": "spec/compiler/codegen/abi/arm_spec.cr",
    "chars": 4792,
    "preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/arm\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:arm) %"
  },
  {
    "path": "spec/compiler/codegen/abi/avr_spec.cr",
    "chars": 7001,
    "preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/avr\"\n\n{% if LibLLVM::BUILT_TARGETS.includes?(:avr) %"
  },
  {
    "path": "spec/compiler/codegen/abi/x86_64_spec.cr",
    "chars": 10277,
    "preview": "require \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crystal/codegen/abi/x86_64\"\nrequire \"compiler/crystal/codegen/abi/x86_wi"
  },
  {
    "path": "spec/compiler/codegen/abi/x86_spec.cr",
    "chars": 5040,
    "preview": "{% skip_file if flag?(:win32) %} # 32-bit windows is not supported\n\nrequire \"spec\"\nrequire \"llvm\"\nrequire \"compiler/crys"
  },
  {
    "path": "spec/compiler/codegen/alias_spec.cr",
    "chars": 3323,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: alias\" do\n  it \"invokes methods on empty array of recursive alias (1)\" "
  },
  {
    "path": "spec/compiler/codegen/and_spec.cr",
    "chars": 4406,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: and\" do\n  it \"codegens and with bool false and false\" do\n    run(\"false"
  },
  {
    "path": "spec/compiler/codegen/array_literal_spec.cr",
    "chars": 5041,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: array literal spec\" do\n  it \"creates custom non-generic array\" do\n    r"
  },
  {
    "path": "spec/compiler/codegen/asm_spec.cr",
    "chars": 1506,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: asm\" do\n  # TODO: arm asm tests\n  {% if flag?(:i386) || flag?(:x86_64) "
  },
  {
    "path": "spec/compiler/codegen/automatic_cast_spec.cr",
    "chars": 4836,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: automatic cast\" do\n  it \"casts literal integer (Int32 -> Int64)\" do\n   "
  },
  {
    "path": "spec/compiler/codegen/block_spec.cr",
    "chars": 26309,
    "preview": "require \"../../spec_helper\"\n\ndescribe \"Code gen: block\" do\n  it \"generate inline\" do\n    run(<<-CRYSTAL).to_i.should eq("
  }
]

// ... and 2317 more files (download for full content)

About this extraction

This page contains the full source code of the crystal-lang/crystal GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2517 files (16.3 MB), approximately 4.1M tokens, and a symbol index with 494 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!