€•ÑDŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ+/translations/zh_CN/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/zh_TW/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/it_IT/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ja_JP/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ko_KR/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/pt_BR/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/sp_SP/core-api/floating-point”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ!SPDX-License-Identifier: GPL-2.0+”h]”hŒ!SPDX-License-Identifier: GPL-2.0+”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒE/var/lib/git/docbuild/linux/Documentation/core-api/floating-point.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒFloating-point API”h]”hŒFloating-point API”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hXKernel code is normally prohibited from using floating-point (FP) registers or instructions, including the C float and double data types. This rule reduces system call overhead, because the kernel does not need to save and restore the userspace floating-point register state.”h]”hXKernel code is normally prohibited from using floating-point (FP) registers or instructions, including the C float and double data types. This rule reduces system call overhead, because the kernel does not need to save and restore the userspace floating-point register state.”…””}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)”}”(hXNHowever, occasionally drivers or library functions may need to include FP code. This is supported by isolating the functions containing FP code to a separate translation unit (a separate source file), and saving/restoring the FP register state around calls to those functions. This creates "critical sections" of floating-point usage.”h]”hXRHowever, occasionally drivers or library functions may need to include FP code. This is supported by isolating the functions containing FP code to a separate translation unit (a separate source file), and saving/restoring the FP register state around calls to those functions. This creates “critical sections†of floating-point usage.”…””}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhÊh²hubhÞ)”}”(hX-The reason for this isolation is to prevent the compiler from generating code touching the FP registers outside these critical sections. Compilers sometimes use FP registers to optimize inlined ``memcpy`` or variable assignment, as floating-point registers may be wider than general-purpose registers.”h]”(hŒÂThe reason for this isolation is to prevent the compiler from generating code touching the FP registers outside these critical sections. Compilers sometimes use FP registers to optimize inlined ”…””}”(hhûh²hh³Nh´NubhŒliteral”“”)”}”(hŒ ``memcpy``”h]”hŒmemcpy”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhûubhŒa or variable assignment, as floating-point registers may be wider than general-purpose registers.”…””}”(hhûh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)”}”(hX Usability of floating-point code within the kernel is architecture-specific. Additionally, because a single kernel may be configured to support platforms both with and without a floating-point unit, FPU availability must be checked both at build time and at run time.”h]”hX Usability of floating-point code within the kernel is architecture-specific. Additionally, because a single kernel may be configured to support platforms both with and without a floating-point unit, FPU availability must be checked both at build time and at run time.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)”}”(hŒÊSeveral architectures implement the generic kernel floating-point API from ``linux/fpu.h``, as described below. Some other architectures implement their own unique APIs, which are documented separately.”h]”(hŒKSeveral architectures implement the generic kernel floating-point API from ”…””}”(hj+h²hh³Nh´Nubj)”}”(hŒ``linux/fpu.h``”h]”hŒ linux/fpu.h”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj+ubhŒp, as described below. Some other architectures implement their own unique APIs, which are documented separately.”…””}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒBuild-time API”h]”hŒBuild-time API”…””}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjKh²hh³hÇh´K ubhÞ)”}”(hŒèFloating-point code may be built if the option ``ARCH_HAS_KERNEL_FPU_SUPPORT`` is enabled. For C code, such code must be placed in a separate file, and that file must have its compilation flags adjusted using the following pattern::”h]”(hŒ/Floating-point code may be built if the option ”…””}”(hj\h²hh³Nh´Nubj)”}”(hŒ``ARCH_HAS_KERNEL_FPU_SUPPORT``”h]”hŒARCH_HAS_KERNEL_FPU_SUPPORT”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj\ubhŒ™ is enabled. For C code, such code must be placed in a separate file, and that file must have its compilation flags adjusted using the following pattern:”…””}”(hj\h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K"hjKh²hubhŒ literal_block”“”)”}”(hŒICFLAGS_foo.o += $(CC_FLAGS_FPU) CFLAGS_REMOVE_foo.o += $(CC_FLAGS_NO_FPU)”h]”hŒICFLAGS_foo.o += $(CC_FLAGS_FPU) CFLAGS_REMOVE_foo.o += $(CC_FLAGS_NO_FPU)”…””}”hj~sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j|h³hÇh´K&hjKh²hubhÞ)”}”(hŒxArchitectures are expected to define one or both of these variables in their top-level Makefile as needed. For example::”h]”hŒwArchitectures are expected to define one or both of these variables in their top-level Makefile as needed. For example:”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K)hjKh²hubj})”}”(hŒCC_FLAGS_FPU := -mhard-float”h]”hŒCC_FLAGS_FPU := -mhard-float”…””}”hjšsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j|h³hÇh´K,hjKh²hubhÞ)”}”(hŒor::”h]”hŒor:”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K.hjKh²hubj})”}”(hŒCC_FLAGS_NO_FPU := -msoft-float”h]”hŒCC_FLAGS_NO_FPU := -msoft-float”…””}”hj¶sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j|h³hÇh´K0hjKh²hubhÞ)”}”(hŒKNormal kernel code is assumed to use the equivalent of ``CC_FLAGS_NO_FPU``.”h]”(hŒ7Normal kernel code is assumed to use the equivalent of ”…””}”(hjÄh²hh³Nh´Nubj)”}”(hŒ``CC_FLAGS_NO_FPU``”h]”hŒCC_FLAGS_NO_FPU”…””}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄubhŒ.”…””}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K2hjKh²hubeh}”(h]”Œbuild-time-api”ah ]”h"]”Œbuild-time api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Runtime API”h]”hŒ Runtime API”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjìh²hh³hÇh´K5ubhÞ)”}”(hŒëThe runtime API is provided in ``linux/fpu.h``. This header cannot be included from files implementing FP code (those with their compilation flags adjusted as above). Instead, it must be included when defining the FP critical sections.”h]”(hŒThe runtime API is provided in ”…””}”(hjýh²hh³Nh´Nubj)”}”(hŒ``linux/fpu.h``”h]”hŒ linux/fpu.h”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjýubhŒ½. This header cannot be included from files implementing FP code (those with their compilation flags adjusted as above). Instead, it must be included when defining the FP critical sections.”…””}”(hjýh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K7hjìh²hubhŒindex”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œ!kernel_fpu_available (C function)”Œc.kernel_fpu_available”hNt”auh1jhjìh²hh³hÇh´NubhŒdesc”“”)”}”(hhh]”(hŒdesc_signature”“”)”}”(hŒ!bool kernel_fpu_available( void )”h]”hŒdesc_signature_line”“”)”}”(hŒbool kernel_fpu_available(void)”h]”(hŒdesc_sig_keyword_type”“”)”}”(hŒbool”h]”hŒbool”…””}”(hjAh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1j?hj;h²hh³hÇh´K;ubhŒdesc_sig_space”“”)”}”(hŒ ”h]”hŒ ”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jPhj;h²hh³hÇh´K;ubhŒ desc_name”“”)”}”(hŒkernel_fpu_available”h]”hŒ desc_sig_name”“”)”}”(hŒkernel_fpu_available”h]”hŒkernel_fpu_available”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jghjcubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jahj;h²hh³hÇh´K;ubhŒdesc_parameterlist”“”)”}”(hŒ(void)”h]”hŒdesc_parameter”“”)”}”(hŒvoid”h]”j@)”}”(hŒvoid”h]”hŒvoid”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjˆubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j†hj‚ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j€hj;h²hh³hÇh´K;ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1j9Œsphinx_line_type”Œ declarator”hj5h²hh³hÇh´K;ubah}”(h]”j,ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j3h³hÇh´K;hj0h²hubhŒ desc_content”“”)”}”(hhh]”hÞ)”}”(hŒâThis function reports if floating-point code can be used on this CPU or platform. The value returned by this function is not expected to change at runtime, so it only needs to be called once, not before every critical section.”h]”hŒâThis function reports if floating-point code can be used on this CPU or platform. The value returned by this function is not expected to change at runtime, so it only needs to be called once, not before every critical section.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K=hj½h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j»hj0h²hh³hÇh´K;ubeh}”(h]”h ]”(Œc”Œfunction”eh"]”h$]”h&]”Œdomain”j׌objtype”jØŒdesctype”jØŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j.h²hhjìh³hÇh´Nubj)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”((j*Œkernel_fpu_begin (C function)”Œc.kernel_fpu_begin”hNt”(j*Œkernel_fpu_end (C function)”Œc.kernel_fpu_end”hNt”euh1jhjìh²hh³hÇh´Nubj/)”}”(hhh]”(j4)”}”(hŒvoid kernel_fpu_begin( void )”h]”j:)”}”(hŒvoid kernel_fpu_begin(void)”h]”(j@)”}”(hŒvoid”h]”hŒvoid”…””}”(hjþh²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjúh²hh³hÇh´KBubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjúh²hh³hÇh´KBubjb)”}”(hŒkernel_fpu_begin”h]”jh)”}”(hŒkernel_fpu_begin”h]”hŒkernel_fpu_begin”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”jtah"]”h$]”h&]”uh1jghjubah}”(h]”h ]”(j{j|eh"]”h$]”h&]”hÅhÆuh1jahjúh²hh³hÇh´KBubj)”}”(hŒ(void)”h]”j‡)”}”(hŒvoid”h]”j@)”}”(hŒvoid”h]”hŒvoid”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj6ubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j†hj2ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j€hjúh²hh³hÇh´KBubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­ˆuh1j9j®j¯hjöh²hh³hÇh´KBubah}”(h]”jîah ]”(j³j´eh"]”h$]”h&]”j¸ˆj¹)jºhuh1j3h³hÇh´KBhjóh²hubj4)”}”(hŒvoid kernel_fpu_end( void )”h]”j:)”}”(hŒvoid kernel_fpu_end(void)”h]”(j@)”}”(hŒvoid”h]”hŒvoid”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hjeh²hh³hÇh´KBubjQ)”}”(hŒ ”h]”hŒ ”…””}”(hjwh²hh³Nh´Nubah}”(h]”h ]”j]ah"]”h$]”h&]”uh1jPhjeh²hh³hÇh´KBubjb)”}”(hŒkernel_fpu_end”h]”jh)”}”(hŒkernel_fpu_end”h]”hŒkernel_fpu_end”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”jtah"]”h$]”h&]”uh1jghj…ubah}”(h]”h ]”(j{j|eh"]”h$]”h&]”hÅhÆuh1jahjeh²hh³hÇh´KBubj)”}”(hŒ(void)”h]”j‡)”}”(hŒvoid”h]”j@)”}”(hŒvoid”h]”hŒvoid”…””}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”jLah"]”h$]”h&]”uh1j?hj¡ubah}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j†hjubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j€hjeh²hh³hÇh´KBubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj­ˆuh1j9j®j¯hjah²hh³hÇh´KBubah}”(h]”jñah ]”(j³j´eh"]”h$]”h&]”j¸ˆj¹)jºhuh1j3h³hÇh´KBhjóh²hubj¼)”}”(hhh]”(hÞ)”}”(hXThese functions create a floating-point critical section. It is only valid to call ``kernel_fpu_begin()`` after a previous call to ``kernel_fpu_available()`` returned ``true``. These functions are only guaranteed to be callable from (preemptible or non-preemptible) process context.”h]”(hŒSThese functions create a floating-point critical section. It is only valid to call ”…””}”(hjÏh²hh³Nh´Nubj)”}”(hŒ``kernel_fpu_begin()``”h]”hŒkernel_fpu_begin()”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏubhŒ after a previous call to ”…””}”(hjÏh²hh³Nh´Nubj)”}”(hŒ``kernel_fpu_available()``”h]”hŒkernel_fpu_available()”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏubhŒ returned ”…””}”(hjÏh²hh³Nh´Nubj)”}”(hŒ``true``”h]”hŒtrue”…””}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏubhŒk. These functions are only guaranteed to be callable from (preemptible or non-preemptible) process context.”…””}”(hjÏh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KEhjÌh²hubhÞ)”}”(hŒßPreemption may be disabled inside critical sections, so their size should be minimized. They are *not* required to be reentrant. If the caller expects to nest critical sections, it must implement its own reference counting.”h]”(hŒaPreemption may be disabled inside critical sections, so their size should be minimized. They are ”…””}”(hjh²hh³Nh´NubhŒemphasis”“”)”}”(hŒ*not*”h]”hŒnot”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒy required to be reentrant. If the caller expects to nest critical sections, it must implement its own reference counting.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KKhjÌh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1j»hjóh²hh³hÇh´KBubeh}”(h]”h ]”(j׌function”eh"]”h$]”h&]”jÜj×jÝj>jÞj>j߉jà‰já‰uh1j.h²hhjìh³hÇh´Nubeh}”(h]”Œ runtime-api”ah ]”h"]”Œ runtime api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K5ubeh}”(h]”Œfloating-point-api”ah ]”h"]”Œfloating-point api”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”juŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jOjLjéjæjGjDuŒ nametypes”}”(jO‰jé‰jG‰uh}”(jLhÊjæjKjDjìj,j5jîjöjñjauŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.