€•qŒ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/driver-api/phy/phy”Œ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/driver-api/phy/phy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/it_IT/driver-api/phy/phy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ja_JP/driver-api/phy/phy”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ&/translations/ko_KR/driver-api/phy/phy”Œ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/driver-api/phy/phy”Œ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Œ PHY subsystem”h]”hŒ PHY subsystem”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒ@/var/lib/git/docbuild/linux/Documentation/driver-api/phy/phy.rst”h KubhŒ field_list”“”)”}”(hhh]”hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒAuthor”h]”hŒAuthor”…””}”(hhÃhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÁhh¾hŸh¶h KubhŒ field_body”“”)”}”(hŒ'Kishon Vijay Abraham I ”h]”hŒ paragraph”“”)”}”(hŒ&Kishon Vijay Abraham I ”h]”(hŒKishon Vijay Abraham I <”…””}”(hhÙhžhhŸNh NubhŒ reference”“”)”}”(hŒ kishon@ti.com”h]”hŒ kishon@ti.com”…””}”(hhãhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:kishon@ti.com”uh1háhhÙubhŒ>”…””}”(hhÙhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KhhÓubah}”(h]”h ]”h"]”h$]”h&]”uh1hÑhh¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h¼hŸh¶h Khh¹hžhubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hh£hžhhŸh¶h KubhØ)”}”(hŒ^This document explains the Generic PHY Framework along with the APIs provided, and how-to-use.”h]”hŒ^This document explains the Generic PHY Framework along with the APIs provided, and how-to-use.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h Khh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjhžhhŸh¶h K ubhØ)”}”(hXÍ*PHY* is the abbreviation for physical layer. It is used to connect a device to the physical medium e.g., the USB controller has a PHY to provide functions such as serialization, de-serialization, encoding, decoding and is responsible for obtaining the required data transmission rate. Note that some USB controllers have PHY functionality embedded into it and others use an external PHY. Other peripherals that use PHY include Wireless LAN, Ethernet, SATA etc.”h]”(hŒemphasis”“”)”}”(hŒ*PHY*”h]”hŒPHY”…””}”(hj4hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j2hj.ubhXÈ is the abbreviation for physical layer. It is used to connect a device to the physical medium e.g., the USB controller has a PHY to provide functions such as serialization, de-serialization, encoding, decoding and is responsible for obtaining the required data transmission rate. Note that some USB controllers have PHY functionality embedded into it and others use an external PHY. Other peripherals that use PHY include Wireless LAN, Ethernet, SATA etc.”…””}”(hj.hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K hjhžhubhØ)”}”(hŒ±The intention of creating this framework is to bring the PHY drivers spread all over the Linux kernel to drivers/phy to increase code re-use and for better code maintainability.”h]”hŒ±The intention of creating this framework is to bring the PHY drivers spread all over the Linux kernel to drivers/phy to increase code re-use and for better code maintainability.”…””}”(hjLhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KhjhžhubhØ)”}”(hŒ~This framework will be of use only to devices that use external PHY (PHY functionality is not embedded within the controller).”h]”hŒ~This framework will be of use only to devices that use external PHY (PHY functionality is not embedded within the controller).”…””}”(hjZhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h Khjhžhubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K ubh¢)”}”(hhh]”(h§)”}”(hŒ*Registering/Unregistering the PHY provider”h]”hŒ*Registering/Unregistering the PHY provider”…””}”(hjshžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjphžhhŸh¶h KubhØ)”}”(hX‡PHY provider refers to an entity that implements one or more PHY instances. For the simple case where the PHY provider implements only a single instance of the PHY, the framework provides its own implementation of of_xlate in of_phy_simple_xlate. If the PHY provider implements multiple instances, it should provide its own implementation of of_xlate. of_xlate is used only for dt boot case.”h]”hX‡PHY provider refers to an entity that implements one or more PHY instances. For the simple case where the PHY provider implements only a single instance of the PHY, the framework provides its own implementation of of_xlate in of_phy_simple_xlate. If the PHY provider implements multiple instances, it should provide its own implementation of of_xlate. of_xlate is used only for dt boot case.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KhjphžhubhŒ literal_block”“”)”}”(hX%#define of_phy_provider_register(dev, xlate) \ __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) #define devm_of_phy_provider_register(dev, xlate) \ __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))”h]”hX%#define of_phy_provider_register(dev, xlate) \ __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) #define devm_of_phy_provider_register(dev, xlate) \ __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))”…””}”hj‘sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jhŸh¶h K(hjphžhubhØ)”}”(hXof_phy_provider_register and devm_of_phy_provider_register macros can be used to register the phy_provider and it takes device and of_xlate as arguments. For the dt boot case, all PHY providers should use one of the above 2 macros to register the PHY provider.”h]”hXof_phy_provider_register and devm_of_phy_provider_register macros can be used to register the phy_provider and it takes device and of_xlate as arguments. For the dt boot case, all PHY providers should use one of the above 2 macros to register the PHY provider.”…””}”(hj¡hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K/hjphžhubhØ)”}”(hX{Often the device tree nodes associated with a PHY provider will contain a set of children that each represent a single PHY. Some bindings may nest the child nodes within extra levels for context and extensibility, in which case the low level of_phy_provider_register_full() and devm_of_phy_provider_register_full() macros can be used to override the node containing the children.”h]”hX{Often the device tree nodes associated with a PHY provider will contain a set of children that each represent a single PHY. Some bindings may nest the child nodes within extra levels for context and extensibility, in which case the low level of_phy_provider_register_full() and devm_of_phy_provider_register_full() macros can be used to override the node containing the children.”…””}”(hj¯hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K4hjphžhubj)”}”(hXî#define of_phy_provider_register_full(dev, children, xlate) \ __of_phy_provider_register(dev, children, THIS_MODULE, xlate) #define devm_of_phy_provider_register_full(dev, children, xlate) \ __devm_of_phy_provider_register_full(dev, children, THIS_MODULE, xlate) void devm_of_phy_provider_unregister(struct device *dev, struct phy_provider *phy_provider); void of_phy_provider_unregister(struct phy_provider *phy_provider);”h]”hXî#define of_phy_provider_register_full(dev, children, xlate) \ __of_phy_provider_register(dev, children, THIS_MODULE, xlate) #define devm_of_phy_provider_register_full(dev, children, xlate) \ __devm_of_phy_provider_register_full(dev, children, THIS_MODULE, xlate) void devm_of_phy_provider_unregister(struct device *dev, struct phy_provider *phy_provider); void of_phy_provider_unregister(struct phy_provider *phy_provider);”…””}”hj½sbah}”(h]”h ]”h"]”h$]”h&]”jŸj uh1jhŸh¶h K`, while others may use a default mode (typically configured via devicetree or other firmware). For compatibility, you should always call this function if you know what mode you will be using. Generally, this function should be called after :c:func:`phy_power_on`, although some PHY drivers may allow it at any time.”h]”(hŒ#Some PHY drivers may not implement ”…””}”(hj°hžhhŸNh Nubh)”}”(hŒ:c:func:`phy_init`”h]”hŒliteral”“”)”}”(hjºh]”hŒ phy_init()”…””}”(hj¾hžhhŸNh Nubah}”(h]”h ]”(Œxref”Œc”Œc-func”eh"]”h$]”h&]”uh1j¼hj¸ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œdriver-api/phy/phy”Œ refdomain”jÉŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰Œ reftarget”Œphy_init”uh1hhŸh¶h K˜hj°ubhŒ or ”…””}”(hj°hžhhŸNh Nubh)”}”(hŒ:c:func:`phy_power_on`”h]”j½)”}”(hjãh]”hŒphy_power_on()”…””}”(hjåhžhhŸNh Nubah}”(h]”h ]”(jÈjÉŒc-func”eh"]”h$]”h&]”uh1j¼hjáubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÕŒ refdomain”jÉŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÛŒ phy_power_on”uh1hhŸh¶h K˜hj°ubhŒm, but controllers should always call these functions to be compatible with other PHYs. Some PHYs may require ”…””}”(hj°hžhhŸNh Nubh)”}”(hŒ):c:func:`phy_set_mode `”h]”j½)”}”(hjh]”hŒ phy_set_mode”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”(jÈjÉŒc-func”eh"]”h$]”h&]”uh1j¼hjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÕŒ refdomain”jÉŒreftype”Œfunc”Œ refexplicit”ˆŒrefwarn”‰jÛŒphy_set_mode_ext”uh1hhŸh¶h K˜hj°ubhŒð, while others may use a default mode (typically configured via devicetree or other firmware). For compatibility, you should always call this function if you know what mode you will be using. Generally, this function should be called after ”…””}”(hj°hžhhŸNh Nubh)”}”(hŒ:c:func:`phy_power_on`”h]”j½)”}”(hj)h]”hŒphy_power_on()”…””}”(hj+hžhhŸNh Nubah}”(h]”h ]”(jÈjÉŒc-func”eh"]”h$]”h&]”uh1j¼hj'ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÕŒ refdomain”jÉŒreftype”Œfunc”Œ refexplicit”‰Œrefwarn”‰jÛŒ phy_power_on”uh1hhŸh¶h K˜hj°ubhŒ5, although some PHY drivers may allow it at any time.”…””}”(hj°hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K˜hjƒhžhubeh}”(h]”Œorder-of-api-calls”ah ]”h"]”Œorder of api calls”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K‹ubh¢)”}”(hhh]”(h§)”}”(hŒ Releasing a reference to the PHY”h]”hŒ Releasing a reference to the PHY”…””}”(hj[hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjXhžhhŸh¶h K¡ubhØ)”}”(hŒÛWhen the controller no longer needs the PHY, it has to release the reference to the PHY it has obtained using the APIs mentioned in the above section. The PHY framework provides 2 APIs to release a reference to the PHY.”h]”hŒÛWhen the controller no longer needs the PHY, it has to release the reference to the PHY it has obtained using the APIs mentioned in the above section. The PHY framework provides 2 APIs to release a reference to the PHY.”…””}”(hjihžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K£hjXhžhubj)”}”(hŒVvoid phy_put(struct phy *phy); void devm_phy_put(struct device *dev, struct phy *phy);”h]”hŒVvoid phy_put(struct phy *phy); void devm_phy_put(struct device *dev, struct phy *phy);”…””}”hjwsbah}”(h]”h ]”h"]”h$]”h&]”jŸj uh1jhŸh¶h K©hjXhžhubhØ)”}”(hŒyBoth these APIs are used to release a reference to the PHY and devm_phy_put destroys the devres associated with this PHY.”h]”hŒyBoth these APIs are used to release a reference to the PHY and devm_phy_put destroys the devres associated with this PHY.”…””}”(hj…hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K¬hjXhžhubeh}”(h]”Œ releasing-a-reference-to-the-phy”ah ]”h"]”Œ releasing a reference to the phy”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K¡ubh¢)”}”(hhh]”(h§)”}”(hŒDestroying the PHY”h]”hŒDestroying the PHY”…””}”(hjžhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj›hžhhŸh¶h K°ubhØ)”}”(hŒzWhen the driver that created the PHY is unloaded, it should destroy the PHY it created using one of the following 2 APIs::”h]”hŒyWhen the driver that created the PHY is unloaded, it should destroy the PHY it created using one of the following 2 APIs:”…””}”(hj¬hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K²hj›hžhubj)”}”(hŒ^void phy_destroy(struct phy *phy); void devm_phy_destroy(struct device *dev, struct phy *phy);”h]”hŒ^void phy_destroy(struct phy *phy); void devm_phy_destroy(struct device *dev, struct phy *phy);”…””}”hjºsbah}”(h]”h ]”h"]”h$]”h&]”jŸj uh1jhŸh¶h Kµhj›hžhubhØ)”}”(hŒbBoth these APIs destroy the PHY and devm_phy_destroy destroys the devres associated with this PHY.”h]”hŒbBoth these APIs destroy the PHY and devm_phy_destroy destroys the devres associated with this PHY.”…””}”(hjÈhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K¸hj›hžhubeh}”(h]”Œdestroying-the-phy”ah ]”h"]”Œdestroying the phy”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K°ubh¢)”}”(hhh]”(h§)”}”(hŒ PM Runtime”h]”hŒ PM Runtime”…””}”(hjáhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjÞhžhhŸh¶h K¼ubhØ)”}”(hXBThis subsystem is pm runtime enabled. So while creating the PHY, pm_runtime_enable of the phy device created by this subsystem is called and while destroying the PHY, pm_runtime_disable is called. Note that the phy device created by this subsystem will be a child of the device that calls phy_create (PHY provider device).”h]”hXBThis subsystem is pm runtime enabled. So while creating the PHY, pm_runtime_enable of the phy device created by this subsystem is called and while destroying the PHY, pm_runtime_disable is called. Note that the phy device created by this subsystem will be a child of the device that calls phy_create (PHY provider device).”…””}”(hjïhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h K¾hjÞhžhubhØ)”}”(hX¸So pm_runtime_get_sync of the phy_device created by this subsystem will invoke pm_runtime_get_sync of PHY provider device because of parent-child relationship. It should also be noted that phy_power_on and phy_power_off performs phy_pm_runtime_get_sync and phy_pm_runtime_put respectively. There are exported APIs like phy_pm_runtime_get, phy_pm_runtime_get_sync, phy_pm_runtime_put and phy_pm_runtime_put_sync for performing PM operations.”h]”hX¸So pm_runtime_get_sync of the phy_device created by this subsystem will invoke pm_runtime_get_sync of PHY provider device because of parent-child relationship. It should also be noted that phy_power_on and phy_power_off performs phy_pm_runtime_get_sync and phy_pm_runtime_put respectively. There are exported APIs like phy_pm_runtime_get, phy_pm_runtime_get_sync, phy_pm_runtime_put and phy_pm_runtime_put_sync for performing PM operations.”…””}”(hjýhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KÄhjÞhžhubeh}”(h]”Œ pm-runtime”ah ]”h"]”Œ pm runtime”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K¼ubh¢)”}”(hhh]”(h§)”}”(hŒ PHY Mappings”h]”hŒ PHY Mappings”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjhžhhŸh¶h KÌubhØ)”}”(hXIn order to get reference to a PHY without help from DeviceTree, the framework offers lookups which can be compared to clkdev that allow clk structures to be bound to devices. A lookup can be made during runtime when a handle to the struct phy already exists.”h]”hXIn order to get reference to a PHY without help from DeviceTree, the framework offers lookups which can be compared to clkdev that allow clk structures to be bound to devices. A lookup can be made during runtime when a handle to the struct phy already exists.”…””}”(hj$hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KÎhjhžhubhØ)”}”(hŒVThe framework offers the following API for registering and unregistering the lookups::”h]”hŒUThe framework offers the following API for registering and unregistering the lookups:”…””}”(hj2hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KÓhjhžhubj)”}”(hŒÍint phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);”h]”hŒÍint phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);”…””}”hj@sbah}”(h]”h ]”h"]”h$]”h&]”jŸj uh1jhŸh¶h KÖhjhžhubeh}”(h]”Œ phy-mappings”ah ]”h"]”Œ phy mappings”ah$]”h&]”uh1h¡hh£hžhhŸh¶h KÌubh¢)”}”(hhh]”(h§)”}”(hŒDeviceTree Binding”h]”hŒDeviceTree Binding”…””}”(hjYhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjVhžhhŸh¶h KÜubhØ)”}”(hŒjThe documentation for PHY dt binding can be found @ Documentation/devicetree/bindings/phy/phy-bindings.txt”h]”hŒjThe documentation for PHY dt binding can be found @ Documentation/devicetree/bindings/phy/phy-bindings.txt”…””}”(hjghžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h×hŸh¶h KÞhjVhžhubeh}”(h]”Œdevicetree-binding”ah ]”h"]”Œdevicetree binding”ah$]”h&]”uh1h¡hh£hžhhŸh¶h KÜubeh}”(h]”Œ phy-subsystem”ah ]”h"]”Œ phy subsystem”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”j¨Œ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”}”(j‚jjmjjjÞjÛj/j,j€j}jUjRj˜j•jÛjØjj jSjPjzjwuŒ nametypes”}”(j‚‰jm‰jÞ‰j/‰j€‰jU‰j˜‰jÛ‰j‰jS‰jz‰uh}”(jh£jjjjÛjpj,jáj}j2jRjƒj•jXjØj›j jÞjPjjwjVuŒ 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.