bsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget-/translations/zh_CN/admin-guide/gpio/gpio-simmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/zh_TW/admin-guide/gpio/gpio-simmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/it_IT/admin-guide/gpio/gpio-simmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ja_JP/admin-guide/gpio/gpio-simmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ko_KR/admin-guide/gpio/gpio-simmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/sp_SP/admin-guide/gpio/gpio-simmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h)SPDX-License-Identifier: GPL-2.0-or-laterh]h)SPDX-License-Identifier: GPL-2.0-or-later}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhG/var/lib/git/docbuild/linux/Documentation/admin-guide/gpio/gpio-sim.rsthKubhsection)}(hhh](htitle)}(hConfigfs GPIO Simulatorh]hConfigfs GPIO Simulator}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThe configfs GPIO Simulator (gpio-sim) provides a way to create simulated GPIO chips for testing purposes. The lines exposed by these chips can be accessed using the standard GPIO character device interface as well as manipulated using sysfs attributes.h]hThe configfs GPIO Simulator (gpio-sim) provides a way to create simulated GPIO chips for testing purposes. The lines exposed by these chips can be accessed using the standard GPIO character device interface as well as manipulated using sysfs attributes.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hCreating simulated chipsh]hCreating simulated chips}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hThe gpio-sim module registers a configfs subsystem called ``'gpio-sim'``. For details of the configfs filesystem, please refer to the configfs documentation.h](h:The gpio-sim module registers a configfs subsystem called }(hhhhhNhNubhliteral)}(h``'gpio-sim'``h]h 'gpio-sim'}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubhU. For details of the configfs filesystem, please refer to the configfs documentation.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThe user can create a hierarchy of configfs groups and items as well as modify values of exposed attributes. Once the chip is instantiated, this hierarchy will be translated to appropriate device properties. The general structure is:h]hThe user can create a hierarchy of configfs groups and items as well as modify values of exposed attributes. Once the chip is instantiated, this hierarchy will be translated to appropriate device properties. The general structure is:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h**Group:** ``/config/gpio-sim``h](hstrong)}(h **Group:**h]hGroup:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h``/config/gpio-sim``h]h/config/gpio-sim}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h8This is the top directory of the gpio-sim configfs tree.h]h8This is the top directory of the gpio-sim configfs tree.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h+**Group:** ``/config/gpio-sim/gpio-device``h](j)}(h **Group:**h]hGroup:}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh }(hjThhhNhNubh)}(h ``/config/gpio-sim/gpio-device``h]h/config/gpio-sim/gpio-device}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjTubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h8**Attribute:** ``/config/gpio-sim/gpio-device/dev_name``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubh }(hj~hhhNhNubh)}(h)``/config/gpio-sim/gpio-device/dev_name``h]h%/config/gpio-sim/gpio-device/dev_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h4**Attribute:** ``/config/gpio-sim/gpio-device/live``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h%``/config/gpio-sim/gpio-device/live``h]h!/config/gpio-sim/gpio-device/live}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXThis is a directory representing a GPIO platform device. The ``'dev_name'`` attribute is read-only and allows the user-space to read the platform device name (e.g. ``'gpio-sim.0'``). The ``'live'`` attribute allows to trigger the actual creation of the device once it's fully configured. The accepted values are: ``'1'`` to enable the simulated device and ``'0'`` to disable and tear it down.h](h=This is a directory representing a GPIO platform device. The }(hjhhhNhNubh)}(h``'dev_name'``h]h 'dev_name'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhY attribute is read-only and allows the user-space to read the platform device name (e.g. }(hjhhhNhNubh)}(h``'gpio-sim.0'``h]h 'gpio-sim.0'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh). The }(hjhhhNhNubh)}(h ``'live'``h]h'live'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhv attribute allows to trigger the actual creation of the device once it’s fully configured. The accepted values are: }(hjhhhNhNubh)}(h``'1'``h]h'1'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh$ to enable the simulated device and }(hjhhhNhNubh)}(h``'0'``h]h'0'}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh to disable and tear it down.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h6**Group:** ``/config/gpio-sim/gpio-device/gpio-bankX``h](j)}(h **Group:**h]hGroup:}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubh }(hj:hhhNhNubh)}(h+``/config/gpio-sim/gpio-device/gpio-bankX``h]h'/config/gpio-sim/gpio-device/gpio-bankX}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:ubeh}(h]h ]h"]h$]h&]uh1hhhhK&hhhhubh)}(hD**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/chip_name``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubh }(hjdhhhNhNubh)}(h5``/config/gpio-sim/gpio-device/gpio-bankX/chip_name``h]h1/config/gpio-sim/gpio-device/gpio-bankX/chip_name}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdubeh}(h]h ]h"]h$]h&]uh1hhhhK(hhhhubh)}(hD**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/num_lines``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h5``/config/gpio-sim/gpio-device/gpio-bankX/num_lines``h]h1/config/gpio-sim/gpio-device/gpio-bankX/num_lines}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK*hhhhubh)}(hXThis group represents a bank of GPIOs under the top platform device. The ``'chip_name'`` attribute is read-only and allows the user-space to read the device name of the bank device. The ``'num_lines'`` attribute allows to specify the number of lines exposed by this bank.h](hIThis group represents a bank of GPIOs under the top platform device. The }(hjhhhNhNubh)}(h``'chip_name'``h]h 'chip_name'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhb attribute is read-only and allows the user-space to read the device name of the bank device. The }(hjhhhNhNubh)}(h``'num_lines'``h]h 'num_lines'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhF attribute allows to specify the number of lines exposed by this bank.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK,hhhhubh)}(h<**Group:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY``h](j)}(h **Group:**h]hGroup:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h1``/config/gpio-sim/gpio-device/gpio-bankX/lineY``h]h-/config/gpio-sim/gpio-device/gpio-bankX/lineY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK1hhhhubh)}(hE**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/name``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h6``/config/gpio-sim/gpio-device/gpio-bankX/lineY/name``h]h2/config/gpio-sim/gpio-device/gpio-bankX/lineY/name}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhK3hhhhubh)}(hThis group represents a single line at the offset Y. The 'name' attribute allows to set the line name as represented by the 'gpio-line-names' property.h]hThis group represents a single line at the offset Y. The ‘name’ attribute allows to set the line name as represented by the ‘gpio-line-names’ property.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hhhhubh)}(h?**Item:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog``h](j)}(h **Item:**h]hItem:}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh }(hjLhhhNhNubh)}(h5``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog``h]h1/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLubeh}(h]h ]h"]h$]h&]uh1hhhhK8hhhhubh)}(hI**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/name``h](j)}(h**Attribute:**h]h Attribute:}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh }(hjvhhhNhNubh)}(h:``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/name``h]h6/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvubeh}(h]h ]h"]h$]h&]uh1hhhhK:hhhhubh)}(hN**Attribute:** ``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/direction``h](j)}(h**Attribute:**h]h Attribute:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubh)}(h?``/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/direction``h]h;/config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/direction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXInside each bank directory, there's a set of attributes that can be used to configure the new chip. Additionally the user can ``mkdir()`` subdirectories inside the chip's directory that allow to pass additional configuration for specific lines. The name of those subdirectories must take the form of: ``'line'`` (e.g. ``'line0'``, ``'line20'``, etc.) as the name will be used by the module to assign the config to the specific line at given offset.h](hInside each bank directory, there’s a set of attributes that can be used to configure the new chip. Additionally the user can }(hj2hhhNhNubh)}(h ``mkdir()``h]hmkdir()}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubh subdirectories inside the chip’s directory that allow to pass additional configuration for specific lines. The name of those subdirectories must take the form of: }(hj2hhhNhNubh)}(h``'line'``h]h'line'}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubh (e.g. }(hj2hhhNhNubh)}(h ``'line0'``h]h'line0'}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubh, }(hj2hhhNhNubh)}(h ``'line20'``h]h'line20'}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubhi, etc.) as the name will be used by the module to assign the config to the specific line at given offset.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKChhhhubh)}(hXKOnce the configuration is complete, the ``'live'`` attribute must be set to 1 in order to instantiate the chip. It can be set back to 0 to destroy the simulated chip. The module will synchronously wait for the new simulated device to be successfully probed and if this doesn't happen, writing to ``'live'`` will result in an error.h](h(Once the configuration is complete, the }(hjhhhNhNubh)}(h ``'live'``h]h'live'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh attribute must be set to 1 in order to instantiate the chip. It can be set back to 0 to destroy the simulated chip. The module will synchronously wait for the new simulated device to be successfully probed and if this doesn’t happen, writing to }(hjhhhNhNubh)}(h ``'live'``h]h'live'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh will result in an error.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKJhhhhubh)}(hSimulated GPIO chips can also be defined in device-tree. The compatible string must be: ``"gpio-simulator"``. Supported properties are:h](hXSimulated GPIO chips can also be defined in device-tree. The compatible string must be: }(hjhhhNhNubh)}(h``"gpio-simulator"``h]h"gpio-simulator"}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh. Supported properties are:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKPhhhhubh block_quote)}(h"``"gpio-sim,label"`` - chip label h]h)}(h!``"gpio-sim,label"`` - chip labelh](h)}(h``"gpio-sim,label"``h]h"gpio-sim,label"}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh - chip label}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKShjubah}(h]h ]h"]h$]h&]uh1jhhhKShhhhubh)}(hOther standard GPIO properties (like ``"gpio-line-names"``, ``"ngpios"`` or ``"gpio-hog"``) are also supported. Please refer to the GPIO documentation for details.h](h%Other standard GPIO properties (like }(hjhhhNhNubh)}(h``"gpio-line-names"``h]h"gpio-line-names"}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, }(hjhhhNhNubh)}(h ``"ngpios"``h]h"ngpios"}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh or }(hjhhhNhNubh)}(h``"gpio-hog"``h]h "gpio-hog"}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhI) are also supported. Please refer to the GPIO documentation for details.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhhhhubh)}(h6An example device-tree code defining a GPIO simulator:h]h6An example device-tree code defining a GPIO simulator:}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhhhhubh literal_block)}(hXgpio-sim { compatible = "gpio-simulator"; bank0 { gpio-controller; #gpio-cells = <2>; ngpios = <16>; gpio-sim,label = "dt-bank0"; gpio-line-names = "", "sim-foo", "", "sim-bar"; }; bank1 { gpio-controller; #gpio-cells = <2>; ngpios = <8>; gpio-sim,label = "dt-bank1"; line3 { gpio-hog; gpios = <3 0>; output-high; line-name = "sim-hog-from-dt"; }; }; };h]hXgpio-sim { compatible = "gpio-simulator"; bank0 { gpio-controller; #gpio-cells = <2>; ngpios = <16>; gpio-sim,label = "dt-bank0"; gpio-line-names = "", "sim-foo", "", "sim-bar"; }; bank1 { gpio-controller; #gpio-cells = <2>; ngpios = <8>; gpio-sim,label = "dt-bank1"; line3 { gpio-hog; gpios = <3 0>; output-high; line-name = "sim-hog-from-dt"; }; }; };}hjVsbah}(h]h ]h"]h$]h&]hhforcelanguagenonehighlight_args}uh1jThhhK[hhhhubeh}(h]creating-simulated-chipsah ]h"]creating simulated chipsah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hManipulating simulated linesh]hManipulating simulated lines}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhhhhhKxubh)}(hX&Each simulated GPIO chip creates a separate sysfs group under its device directory for each exposed line (e.g. ``/sys/devices/platform/gpio-sim.X/gpiochipY/``). The name of each group is of the form: ``'sim_gpioX'`` where X is the offset of the line. Inside each group there are two attributes:h](hoEach simulated GPIO chip creates a separate sysfs group under its device directory for each exposed line (e.g. }(hjhhhNhNubh)}(h/``/sys/devices/platform/gpio-sim.X/gpiochipY/``h]h+/sys/devices/platform/gpio-sim.X/gpiochipY/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh*). The name of each group is of the form: }(hjhhhNhNubh)}(h``'sim_gpioX'``h]h 'sim_gpioX'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhO where X is the offset of the line. Inside each group there are two attributes:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKzhjqhhubj)}(hXS``pull`` - allows to read and set the current simulated pull setting for every line, when writing the value must be one of: ``'pull-up'``, ``'pull-down'`` ``value`` - allows to read the current value of the line which may be different from the pull if the line is being driven from user-spaceh]hdefinition_list)}(hhh](hdefinition_list_item)}(h``pull`` - allows to read and set the current simulated pull setting for every line, when writing the value must be one of: ``'pull-up'``, ``'pull-down'`` h](hterm)}(hH``pull`` - allows to read and set the current simulated pull setting forh](h)}(h``pull``h]hpull}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh@ - allows to read and set the current simulated pull setting for}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubh definition)}(hhh]h)}(hQevery line, when writing the value must be one of: ``'pull-up'``, ``'pull-down'``h](h3every line, when writing the value must be one of: }(hjhhhNhNubh)}(h ``'pull-up'``h]h 'pull-up'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh, }(hjhhhNhNubh)}(h``'pull-down'``h]h 'pull-down'}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubj)}(h``value`` - allows to read the current value of the line which may be different from the pull if the line is being driven from user-spaceh](j)}(hE``value`` - allows to read the current value of the line which may beh](h)}(h ``value``h]hvalue}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$ubh< - allows to read the current value of the line which may be}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hhh]h)}(hCdifferent from the pull if the line is being driven from user-spaceh]hCdifferent from the pull if the line is being driven from user-space}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj@ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjqhhubeh}(h]manipulating-simulated-linesah ]h"]manipulating simulated linesah$]h&]uh1hhhhhhhhKxubeh}(h]configfs-gpio-simulatorah ]h"]configfs gpio simulatorah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jvjsjnjkjnjku nametypes}(jvjnjnuh}(jshjkhjkjqu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.