€•òGŒ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”Œ5/translations/zh_CN/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/zh_TW/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/it_IT/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ja_JP/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ko_KR/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/pt_BR/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/sp_SP/driver-api/thermal/exynos_thermal”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒKernel driver exynos_tmu”h]”hŒKernel driver exynos_tmu”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒO/var/lib/git/docbuild/linux/Documentation/driver-api/thermal/exynos_thermal.rst”h´KubhŒ paragraph”“”)”}”(hŒSupported chips:”h]”hŒSupported chips:”…””}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhŒ bullet_list”“”)”}”(hhh]”hŒ list_item”“”)”}”(hŒNARM Samsung Exynos4, Exynos5 series of SoC Datasheet: Not publicly available ”h]”(hÌ)”}”(hŒ*ARM Samsung Exynos4, Exynos5 series of SoC”h]”hŒ*ARM Samsung Exynos4, Exynos5 series of SoC”…””}”(hhæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhhâubhÌ)”}”(hŒ!Datasheet: Not publicly available”h]”hŒ!Datasheet: Not publicly available”…””}”(hhôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hhâubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhhÝh²hh³hÊh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1hÛh³hÊh´Khh·h²hubhÌ)”}”(hŒ[Authors: Donggeun Kim Authors: Amit Daniel ”h]”(hŒAuthors: Donggeun Kim <”…””}”(hjh²hh³Nh´NubhŒ reference”“”)”}”(hŒdg77.kim@samsung.com”h]”hŒdg77.kim@samsung.com”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:dg77.kim@samsung.com”uh1jhjubhŒ> Authors: Amit Daniel <”…””}”(hjh²hh³Nh´Nubj)”}”(hŒamit.daniel@samsung.com”h]”hŒamit.daniel@samsung.com”…””}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:amit.daniel@samsung.com”uh1jhjubhŒ>”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒTMU controller Description:”h]”hŒTMU controller Description:”…””}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjHh²hh³hÊh´KubhÌ)”}”(hŒNThis driver allows to read temperature inside Samsung Exynos4/5 series of SoC.”h]”hŒNThis driver allows to read temperature inside Samsung Exynos4/5 series of SoC.”…””}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhjHh²hubhÌ)”}”(hŒÒThe chip only exposes the measured 8-bit temperature code value through a register. Temperature can be taken from the temperature code. There are three equations converting from temperature to temperature code.”h]”hŒÒThe chip only exposes the measured 8-bit temperature code value through a register. Temperature can be taken from the temperature code. There are three equations converting from temperature to temperature code.”…””}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhjHh²hubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hXThe three equations are: 1. Two point trimming:: Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1 2. One point trimming:: Tc = T + TI1 - 25 3. No trimming:: Tc = T + 50 Tc: Temperature code, T: Temperature, TI1: Trimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged ”h]”(hŒterm”“”)”}”(hŒThe three equations are:”h]”hŒThe three equations are:”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´K,hj|ubhŒ definition”“”)”}”(hhh]”(hŒenumerated_list”“”)”}”(hhh]”(há)”}”(hŒGTwo point trimming:: Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1 ”h]”(hÌ)”}”(hŒTwo point trimming::”h]”hŒTwo point trimming:”…””}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhjšubhŒ literal_block”“”)”}”(hŒ-Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1”h]”hŒ-Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1”…””}”hj®sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j¬h³hÊh´Khjšubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj—ubhá)”}”(hŒ+One point trimming:: Tc = T + TI1 - 25 ”h]”(hÌ)”}”(hŒOne point trimming::”h]”hŒOne point trimming:”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhjÄubj­)”}”(hŒTc = T + TI1 - 25”h]”hŒTc = T + TI1 - 25”…””}”hjÖsbah}”(h]”h ]”h"]”h$]”h&]”j¼j½uh1j¬h³hÊh´KhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj—ubhá)”}”(hŒNo trimming:: Tc = T + 50 ”h]”(hÌ)”}”(hŒ No trimming::”h]”hŒ No trimming:”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K!hjêubj­)”}”(hŒ Tc = T + 50”h]”hŒ Tc = T + 50”…””}”hjüsbah}”(h]”h ]”h"]”h$]”h&]”j¼j½uh1j¬h³hÊh´K#hjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1hàhj—ubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j•hj’ubjv)”}”(hhh]”(j{)”}”(hŒ%Tc: Temperature code, T: Temperature,”h]”(j)”}”(hŒTc:”h]”hŒTc:”…””}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´K%hjubj‘)”}”(hhh]”hÌ)”}”(hŒ!Temperature code, T: Temperature,”h]”hŒ!Temperature code, T: Temperature,”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K&hj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´K%hjubj{)”}”(hŒˆTI1: Trimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”h]”(j)”}”(hŒTI1:”h]”hŒTI1:”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´K(hjMubj‘)”}”(hhh]”hÌ)”}”(hŒƒTrimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”h]”hŒƒTrimming info for 25 degree Celsius (stored at TRIMINFO register) Temperature code measured at 25 degree Celsius which is unchanged”…””}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K(hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjMubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´K(hjubj{)”}”(hŒ‰TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged ”h]”(j)”}”(hŒTI2:”h]”hŒTI2:”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´K,hj|ubj‘)”}”(hhh]”hÌ)”}”(hŒƒTrimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged”h]”hŒƒTrimming info for 85 degree Celsius (stored at TRIMINFO register) Temperature code measured at 85 degree Celsius which is unchanged”…””}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K+hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´K,hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1juhj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´K,hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjHh²hh³Nh´NubhÌ)”}”(hŒÎTMU(Thermal Management Unit) in Exynos4/5 generates interrupt when temperature exceeds pre-defined levels. The maximum number of configurable threshold is five. The threshold levels are defined as follows::”h]”hŒÍTMU(Thermal Management Unit) in Exynos4/5 generates interrupt when temperature exceeds pre-defined levels. The maximum number of configurable threshold is five. The threshold levels are defined as follows:”…””}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K.hjHh²hubj­)”}”(hŒëLevel_0: current temperature > trigger_level_0 + threshold Level_1: current temperature > trigger_level_1 + threshold Level_2: current temperature > trigger_level_2 + threshold Level_3: current temperature > trigger_level_3 + threshold”h]”hŒëLevel_0: current temperature > trigger_level_0 + threshold Level_1: current temperature > trigger_level_1 + threshold Level_2: current temperature > trigger_level_2 + threshold Level_3: current temperature > trigger_level_3 + threshold”…””}”hjÑsbah}”(h]”h ]”h"]”h$]”h&]”j¼j½uh1j¬h³hÊh´K3hjHh²hubhÌ)”}”(hŒQThe threshold and each trigger_level are set through the corresponding registers.”h]”hŒQThe threshold and each trigger_level are set through the corresponding registers.”…””}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K8hjHh²hubhÌ)”}”(hŒØWhen an interrupt occurs, this driver notify kernel thermal framework with the function exynos_report_trigger. Although an interrupt condition for level_0 can be set, it can be used to synchronize the cooling action.”h]”hŒØWhen an interrupt occurs, this driver notify kernel thermal framework with the function exynos_report_trigger. Although an interrupt condition for level_0 can be set, it can be used to synchronize the cooling action.”…””}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K;hjHh²hubeh}”(h]”Œtmu-controller-description”ah ]”h"]”Œtmu controller description:”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒTMU driver description:”h]”hŒTMU driver description:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KAubhÌ)”}”(hŒ,The exynos thermal driver is structured as::”h]”hŒ+The exynos thermal driver is structured as:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KChjh²hubj­)”}”(hX5 Kernel Core thermal framework (thermal_core.c, step_wise.c, cpufreq_cooling.c) ^ | | TMU configuration data -----> TMU Driver <----> Exynos Core thermal wrapper (exynos_tmu_data.c) (exynos_tmu.c) (exynos_thermal_common.c) (exynos_tmu_data.h) (exynos_tmu.h) (exynos_thermal_common.h)”h]”hX5 Kernel Core thermal framework (thermal_core.c, step_wise.c, cpufreq_cooling.c) ^ | | TMU configuration data -----> TMU Driver <----> Exynos Core thermal wrapper (exynos_tmu_data.c) (exynos_tmu.c) (exynos_thermal_common.c) (exynos_tmu_data.h) (exynos_tmu.h) (exynos_thermal_common.h)”…””}”hj"sbah}”(h]”h ]”h"]”h$]”h&]”j¼j½uh1j¬h³hÊh´KEhjh²hubj–)”}”(hhh]”(há)”}”(hXTMU configuration data: This consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”jv)”}”(hhh]”j{)”}”(hŒâTMU configuration data: This consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”(j)”}”(hŒTMU configuration data:”h]”hŒTMU configuration data:”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´KQhj:ubj‘)”}”(hhh]”hÌ)”}”(hŒÊThis consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”h]”hŒÊThis consist of TMU register offsets/bitfields described through structure exynos_tmu_registers. Also several other platform data (struct exynos_tmu_platform_data) members are used to configure the TMU.”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KOhjLubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´KQhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj0h²hh³Nh´Nubhá)”}”(hŒËTMU driver: This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”jv)”}”(hhh]”j{)”}”(hŒ¤TMU driver: This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”(j)”}”(hŒ TMU driver:”h]”hŒ TMU driver:”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´KUhj|ubj‘)”}”(hhh]”hÌ)”}”(hŒ˜This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”h]”hŒ˜This component initialises the TMU controller and sets different thresholds. It invokes core thermal implementation with the call exynos_report_trigger.”…””}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KThjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´KUhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1juhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj0h²hh³Nh´Nubhá)”}”(hŒåExynos Core thermal wrapper: This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”jv)”}”(hhh]”j{)”}”(hŒ¾Exynos Core thermal wrapper: This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”(j)”}”(hŒExynos Core thermal wrapper:”h]”hŒExynos Core thermal wrapper:”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j€h³hÊh´KYhj¾ubj‘)”}”(hhh]”hÌ)”}”(hŒ¡This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”h]”hŒ¡This provides 3 wrapper function to use the Kernel core thermal framework. They are exynos_unregister_thermal, exynos_register_thermal and exynos_report_trigger.”…””}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KXhjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jzh³hÊh´KYhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1juhj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hàhj0h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jŒ loweralpha”jhjŒ)”uh1j•hjh²hh³hÊh´KNubeh}”(h]”Œtmu-driver-description”ah ]”h"]”Œtmu driver description:”ah$]”h&]”uh1hµhh·h²hh³hÊh´KAubeh}”(h]”Œkernel-driver-exynos-tmu”ah ]”h"]”Œkernel driver exynos_tmu”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”j4Œ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”}”(jj jjýjjuŒ nametypes”}”(j‰j‰j‰uh}”(j h·jýjHjjuŒ 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.