OLD | NEW |
1 .. _sdk-examples-2: | 1 .. _sdk-examples-2: |
2 | 2 |
3 Running the SDK Examples | 3 Examples |
4 ======================== | 4 ======== |
5 | 5 |
6 Every Native Client SDK bundle comes with a folder of example applications. | 6 Every Native Client SDK bundle comes with a folder of example applications. |
7 Each example demonstrates one or two key Native Client programming concepts. | 7 Each example demonstrates one or two key Native Client programming concepts. |
8 After you've :doc:`downloaded the SDK <download>`, follow the instructions | 8 After you've :doc:`downloaded the SDK <download>`, follow the instructions |
9 on this page to build and run the examples. | 9 on this page to build and run the examples. |
10 | 10 |
11 Your version of Chrome must be equal to or greater than the version of your SDK | 11 Your version of Chrome must be equal to or greater than the version of your SDK |
12 bundle. For example, if you're developing with the ``pepper_31`` bundle, you | 12 bundle. For example, if you're developing with the ``pepper_35`` bundle, you |
13 must use Google Chrome version 31 or greater. To find out what version of Chrome | 13 must use Google Chrome version 35 or greater. To find out what version of Chrome |
14 you're using, type ``about:chrome`` or ``about:version`` in the Chrome address | 14 you're using, type ``about:chrome`` or ``about:version`` in the Chrome address |
15 bar. | 15 bar. |
16 | 16 |
| 17 .. _enable-native-client: |
17 | 18 |
18 Enable Native Client | 19 Enable Native Client |
19 -------------------- | 20 -------------------- |
20 | 21 |
21 .. note:: | 22 If you are using Chrome 31 or later, you can skip this section. To run Portable |
22 :class: note | 23 Native Client applications you must specifically enable Native Client in Chrome: |
23 | |
24 If you are using Chrome 31 or later, you can skip this section. | |
25 | |
26 To run Portable Native Client applications you must specifically enable Native | |
27 Client in Chrome: | |
28 | 24 |
29 #. Type ``about:flags`` in the Chrome address bar and scroll down to "Native | 25 #. Type ``about:flags`` in the Chrome address bar and scroll down to "Native |
30 Client". | 26 Client". |
31 | 27 |
32 - If the link below "Native Client" says "Disable", then Native Client is | 28 - If the link below "Native Client" says "Disable", then Native Client is |
33 already enabled and you don't need to do anything else. | 29 already enabled and you don't need to do anything else. |
34 | 30 |
35 * If the link below "Native Client" says "Enable", click the "Enable" | 31 * If the link below "Native Client" says "Enable", click the "Enable" |
36 link. | 32 link. |
37 | 33 |
38 #. Scroll down to the bottom of the page, and click "Relaunch Now". All browser | 34 #. Scroll down to the bottom of the page, and click "Relaunch Now". All browser |
39 windows will restart when you relaunch Chrome. | 35 windows will restart when you relaunch Chrome. |
40 | 36 |
41 Disable the Chrome cache | 37 .. _build-the-sdk-examples: |
42 ------------------------ | |
43 | |
44 Chrome caches resources aggressively. When you are building a Native Client | |
45 application you should disable the cache to make sure that Chrome loads the | |
46 latest version. | |
47 | |
48 #. Open Chrome's developer tools by clicking the menu icon |menu-icon| and | |
49 choosing Tools > Developer tools. | |
50 | |
51 #. Click the gear icon |gear-icon| in the bottom right corner of the Chrome | |
52 window. | |
53 | |
54 #. Under the "General" settings, check the box next to "Disable cache". | |
55 | 38 |
56 Build the SDK examples | 39 Build the SDK examples |
57 ---------------------- | 40 ---------------------- |
58 | 41 |
59 The Makefile scripts for the SDK examples build multiple versions of the | 42 The Makefile scripts for the SDK examples can build multiple versions of the |
60 examples using all three SDK toolchains (newlib, glibc, and PNaCl) and in both | 43 examples using any of the three SDK toolchains (newlib, glibc, and PNaCl) and in |
61 release and debug configurations. (Note that some examples build only with | 44 both release and debug configurations. Note that some examples, ``dlopen`` for |
62 particular toolchains). | 45 example, build only with particular toolchains. |
63 | 46 |
64 Build all examples | 47 Find the toolchains for each example by looking at the ``VALID_TOOLCHAINS`` |
65 ^^^^^^^^^^^^^^^^^^ | 48 variable in the Makefile for a particular example. The first item listed is the |
| 49 default. It's built when you run an example make file without parameters. for |
| 50 example running make in the ``core`` directory of pepper_35 builds the example |
| 51 using the ``newlib`` toolchain. :: |
66 | 52 |
67 To build all the examples, go to the examples directory in a specific SDK | 53 $ cd pepper_35/examples/api/core |
68 bundle and run ``make``:: | 54 $ make |
| 55 CXX newlib/Release/core_x86_32.o |
| 56 LINK newlib/Release/core_unstripped_x86_32.nexe |
| 57 VALIDATE newlib/Release/core_unstripped_x86_32.nexe |
| 58 CXX newlib/Release/core_x86_64.o |
| 59 LINK newlib/Release/core_unstripped_x86_64.nexe |
| 60 VALIDATE newlib/Release/core_unstripped_x86_64.nexe |
| 61 CXX newlib/Release/core_arm.o |
| 62 LINK newlib/Release/core_unstripped_arm.nexe |
| 63 VALIDATE newlib/Release/core_unstripped_arm.nexe |
| 64 STRIP newlib/Release/core_x86_32.nexe |
| 65 STRIP newlib/Release/core_x86_64.nexe |
| 66 STRIP newlib/Release/core_arm.nexe |
| 67 CREATE_NMF newlib/Release/core.nmf |
69 | 68 |
70 $ cd pepper_31/examples | 69 As you can see, this produces a number of architecture specific nexe files in |
71 $ make | 70 the ``pepper_35/examples/api/core/Release`` directory. Create debug versions by |
72 make -C api all | 71 using the ``CONFIG`` parameter of the make command. :: |
73 make[1]: Entering directory `pepper_31/examples/api' | 72 |
74 make -C audio all | 73 $make CONFIG=Debug |
75 make[2]: Entering directory `pepper_31/examples/api/audio' | |
76 CXX newlib/Debug/audio_x86_32.o | |
77 LINK newlib/Debug/audio_x86_32.nexe | |
78 CXX newlib/Debug/audio_x86_64.o | |
79 LINK newlib/Debug/audio_x86_64.nexe | |
80 CXX newlib/Debug/audio_arm.o | |
81 LINK newlib/Debug/audio_arm.nexe | |
82 CREATE_NMF newlib/Debug/audio.nmf | |
83 make[2]: Leaving directory `pepper_31/examples/api/audio' | |
84 make -C url_loader all | |
85 make[2]: Entering directory `pepper_31/examples/api/url_loader' | |
86 CXX newlib/Debug/url_loader_x86_32.o | |
87 ... | |
88 | 74 |
89 Build a single example | 75 This creates similar output, but in ``pepper_35/examples/api/core/Debug``. |
90 ^^^^^^^^^^^^^^^^^^^^^^ | |
91 | 76 |
92 Calling ``make`` from inside a particular example's directory will build only | 77 Select a different toolchain with the ``TOOLCHAIN`` parameter. For example:: |
93 that example:: | |
94 | 78 |
95 $ cd pepper_31/examples/api/core | 79 $ cd pepper_35/examples/api/core |
96 $ make | |
97 CXX newlib/Debug/core_x86_32.o | |
98 LINK newlib/Debug/core_x86_32.nexe | |
99 CXX newlib/Debug/core_x86_64.o | |
100 LINK newlib/Debug/core_x86_64.nexe | |
101 CXX newlib/Debug/core_arm.o | |
102 LINK newlib/Debug/core_arm.nexe | |
103 CREATE_NMF newlib/Debug/core.nmf | |
104 | |
105 Override defaults | |
106 ^^^^^^^^^^^^^^^^^ | |
107 | |
108 You can call ``make`` with the ``TOOLCHAIN`` and ``CONFIG`` parameters to | |
109 override the defaults:: | |
110 | |
111 $ make TOOLCHAIN=pnacl CONFIG=Release | 80 $ make TOOLCHAIN=pnacl CONFIG=Release |
112 CXX pnacl/Release/core_pnacl.o | 81 CXX pnacl/Release/core.o |
113 LINK pnacl/Release/core.bc | 82 LINK pnacl/Release/core_unstripped.bc |
114 FINALIZE pnacl/Release/core.pexe | 83 FINALIZE pnacl/Release/core_unstripped.pexe |
115 CREATE_NMF pnacl/Release/core.nmf | 84 CREATE_NMF pnacl/Release/core.nmf |
116 | 85 |
| 86 You can also set ``TOOLCHAIN`` to ``all`` to build all Release versions with |
| 87 default toolchains. :: |
117 | 88 |
118 You can also set ``TOOLCHAIN`` to "all" to build one or more examples with | 89 $ cd pepper_35/examples/api/core |
119 all available toolchains:: | 90 $ make TOOLCHAIN=all |
| 91 make TOOLCHAIN=newlib |
| 92 make[1]: Entering directory 'pepper_35/examples/api/core' |
| 93 CXX newlib/Release/core_x86_32.o |
| 94 LINK newlib/Release/core_unstripped_x86_32.nexe |
| 95 VALIDATE newlib/Release/core_unstripped_x86_32.nexe |
| 96 CXX newlib/Release/core_x86_64.o |
| 97 LINK newlib/Release/core_unstripped_x86_64.nexe |
| 98 VALIDATE newlib/Release/core_unstripped_x86_64.nexe |
| 99 CXX newlib/Release/core_arm.o |
| 100 LINK newlib/Release/core_unstripped_arm.nexe |
| 101 VALIDATE newlib/Release/core_unstripped_arm.nexe |
| 102 STRIP newlib/Release/core_x86_32.nexe |
| 103 STRIP newlib/Release/core_x86_64.nexe |
| 104 STRIP newlib/Release/core_arm.nexe |
| 105 CREATE_NMF newlib/Release/core.nmf |
| 106 make[1]: Leaving directory 'pepper_35/examples/api/core' |
| 107 make TOOLCHAIN=glibc |
| 108 make[1]: Entering directory 'pepper_35/examples/api/core' |
| 109 CXX glibc/Release/core_x86_32.o |
| 110 LINK glibc/Release/core_unstripped_x86_32.nexe |
| 111 VALIDATE glibc/Release/core_unstripped_x86_32.nexe |
| 112 CXX glibc/Release/core_x86_64.o |
| 113 LINK glibc/Release/core_unstripped_x86_64.nexe |
| 114 VALIDATE glibc/Release/core_unstripped_x86_64.nexe |
| 115 ... |
| 116 (content excerpted) |
| 117 ... |
120 | 118 |
121 $ make TOOLCHAIN=all | 119 .. _build-results: |
122 make TOOLCHAIN=newlib | |
123 make[1]: Entering directory `pepper_31/examples/api/core' | |
124 CXX newlib/Debug/core_x86_32.o | |
125 LINK newlib/Debug/core_x86_32.nexe | |
126 CXX newlib/Debug/core_x86_64.o | |
127 LINK newlib/Debug/core_x86_64.nexe | |
128 CXX newlib/Debug/core_arm.o | |
129 LINK newlib/Debug/core_arm.nexe | |
130 CREATE_NMF newlib/Debug/core.nmf | |
131 make[1]: Leaving directory `pepper_31/examples/api/core' | |
132 make TOOLCHAIN=glibc | |
133 make[1]: Entering directory `pepper_31/examples/api/core' | |
134 CXX glibc/Debug/core_x86_32.o | |
135 LINK glibc/Debug/core_x86_32.nexe | |
136 CXX glibc/Debug/core_x86_64.o | |
137 LINK glibc/Debug/core_x86_64.nexe | |
138 CREATE_NMF glibc/Debug/core.nmf | |
139 make[1]: Leaving directory `pepper_31/examples/api/core' | |
140 make TOOLCHAIN=pnacl | |
141 make[1]: Entering directory `pepper_31/examples/api/core' | |
142 CXX pnacl/Debug/core.o | |
143 LINK pnacl/Debug/core_unstripped.bc | |
144 FINALIZE pnacl/Debug/core_unstripped.pexe | |
145 CREATE_NMF pnacl/Debug/core.nmf | |
146 make[1]: Leaving directory `pepper_31/examples/api/core' | |
147 make TOOLCHAIN=linux | |
148 make[1]: Entering directory `pepper_31/examples/api/core' | |
149 CXX linux/Debug/core.o | |
150 LINK linux/Debug/core.so | |
151 make[1]: Leaving directory `pepper_31/examples/api/core' | |
152 | 120 |
153 Build results | 121 Build results |
154 ------------- | 122 ^^^^^^^^^^^^^ |
155 | 123 |
156 After running ``make``, each example directory will contain one or more of | 124 After running ``make``, example directories will contain one or more of the |
157 the following subdirectories: | 125 following subdirectories, depending on which Makefile you run: |
158 | 126 |
159 * ``newlib`` with subdirectories ``Debug`` and ``Release``; | 127 * ``newlib`` with subdirectories ``Debug`` and ``Release``; |
160 * ``glibc`` with subdirectories ``Debug`` and ``Release``; | 128 * ``glibc`` with subdirectories ``Debug`` and ``Release``; |
161 * ``pnacl`` with subdirectories ``Debug`` and ``Release``; | 129 * ``pnacl`` with subdirectories ``Debug`` and ``Release``; |
162 | 130 |
163 For the newlib and glibc toolchains the Debug and Release subdirectories | 131 For the newlib and glibc toolchains the Debug and Release subdirectories |
164 contain .nexe files for all target architectures. For the PNaCl toolchain | 132 contain .nexe files for all target architectures. For the PNaCl toolchain |
165 they contain a single .pexe file. PNaCl debug also produces pre-translated | 133 they contain a single .pexe file. PNaCl debug also produces pre-translated |
166 .nexe files, for ease of debugging. All Debug and Release directories contain | 134 .nexe files, for ease of debugging. All Debug and Release directories contain |
167 a manifest (.nmf) file that references the associated .nexe or .pexe files. | 135 a manifest (.nmf) file that references the associated .nexe or .pexe files. |
168 For information about Native Client manifest files, see the :doc:`Technical | 136 For information about Native Client manifest files, see the :doc:`Technical |
169 Overview <../overview>`. | 137 Overview <../overview>`. |
170 | 138 |
171 For details on how to use ``make``, see the `GNU 'make' Manual | 139 For details on how to use ``make``, see the `GNU 'make' Manual |
172 <http://www.gnu.org/software/make/manual/make.html>`_. For details on how to | 140 <http://www.gnu.org/software/make/manual/make.html>`_. For details on how to |
173 use the SDK toolchain itself, see :doc:`Building Native Client Modules | 141 use the SDK toolchain itself, see :doc:`Building Native Client Modules |
174 <../devguide/devcycle/building>`. | 142 <../devguide/devcycle/building>`. |
175 | 143 |
176 .. _running_the_sdk_examples: | 144 .. _running_the_sdk_examples: |
177 | 145 |
178 Run the SDK examples | 146 Run the SDK examples |
179 -------------------- | 147 -------------------- |
180 | 148 |
181 To run the SDK examples, you can use the ``make run`` command:: | 149 .. _disable-chrome-cache: |
182 | 150 |
183 $ cd pepper_31/examples/api/core | 151 Disable the Chrome cache |
| 152 ^^^^^^^^^^^^^^^^^^^^^^^^ |
| 153 |
| 154 Chrome's intelligent caching caches resources aggressively. When building a |
| 155 Native Client application you should disable the cache to make sure that Chrome |
| 156 loads the latest version. Intelligent caching only remains inactive while |
| 157 Developer Tools are open. Otherwise, agressive caching continues. |
| 158 |
| 159 #. Open Chrome's developer tools by clicking the menu icon |menu-icon| and |
| 160 choosing Tools > Developer tools. |
| 161 |
| 162 #. Click the gear icon |gear-icon| in the bottom right corner of the Chrome |
| 163 window. |
| 164 |
| 165 #. Under the "General" settings, check the box next to "Disable cache". |
| 166 |
| 167 .. _run-the-examples: |
| 168 |
| 169 Run the examples |
| 170 ^^^^^^^^^^^^^^^^ |
| 171 |
| 172 To run the SDK examples, use the ``make run`` command:: |
| 173 |
| 174 $ cd pepper_35/examples/api/core |
184 $ make run | 175 $ make run |
185 | 176 |
186 This will launch a local HTTP server which will serve the data for the | 177 This launches a local HTTP server that serves the example. It then launches |
187 example. It then launches Chrome with the address of this server, usually | 178 Chrome with the address of this server, usually ``http://localhost:5103``. |
188 ``http://localhost:5103``. After you close Chrome, the local HTTP server is | 179 After you close Chrome, the local HTTP server automatically shuts down. |
189 automatically shutdown. | |
190 | 180 |
191 This command will try to find an executable named ``google-chrome`` in your | 181 This command tries to find an executable named ``google-chrome`` in your |
192 ``PATH`` environment variable. If it can't, you'll get an error message like | 182 ``PATH`` environment variable. If it can't, you'll get an error message like |
193 this:: | 183 this:: |
194 | 184 |
195 pepper_31/tools/common.mk:415: No valid Chrome found at CHROME_PATH= | 185 pepper_35/tools/common.mk:415: No valid Chrome found at CHROME_PATH= |
196 pepper_31/tools/common.mk:415: *** Set CHROME_PATH via an environment variable
, or command-line.. Stop. | 186 pepper_35/tools/common.mk:415: *** Set CHROME_PATH via an environment variable
, or command-line.. Stop. |
| 187 |
| 188 .. _add-an-env-variable-for-chrome: |
| 189 |
| 190 Add an environment variable for Chrome |
| 191 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
197 | 192 |
198 Set the CHROME_PATH environment variable to the location of your Chrome | 193 Set the CHROME_PATH environment variable to the location of your Chrome |
199 executable. | 194 executable. |
200 | 195 |
201 * On Windows: | 196 * On Windows: |
202 | 197 |
203 The default install location of Chrome is | 198 The default install location of Chrome is |
204 ``C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`` for Chrome | 199 ``C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`` for Chrome |
205 stable and | 200 stable and |
206 ``C:\Users\<username>\AppData\Local\Google\Chrome SxS\Application\chrome.exe`` | 201 ``C:\Users\<username>\AppData\Local\Google\Chrome SxS\Application\chrome.exe`` |
207 for Chrome Canary; try looking in those directories first:: | 202 for Chrome Canary. Try looking in those directories first:: |
208 | 203 |
209 > set CHROME_PATH=<Path to chrome.exe> | 204 > set CHROME_PATH=<Path to chrome.exe> |
210 | 205 |
211 * On Linux:: | 206 * On Linux:: |
212 | 207 |
213 $ export CHROME_PATH=<Path to google-chrome> | 208 $ export CHROME_PATH=<Path to google-chrome> |
214 | 209 |
215 * On Mac: | 210 * On Mac: |
216 | 211 |
217 The default install location of Chrome is | 212 The default install location of Chrome is |
218 ``/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`` for | 213 ``/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`` for |
219 Chrome Stable and | 214 Chrome Stable and |
220 ``Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`` | 215 ``Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary`` |
221 for Chrome Canary. Note that you have to reference the executable inside the | 216 for Chrome Canary. Note that you have to reference the executable inside the |
222 application bundle, not the top-level ``.app`` directory:: | 217 application bundle, not the top-level ``.app`` directory:: |
223 | 218 |
224 $ export CHROME_PATH=<Path to Google Chrome> | 219 $ export CHROME_PATH=<Path to Google Chrome> |
225 | 220 |
226 You can run via a different toolchain or configuration by using the | |
227 ``TOOLCHAIN`` and ``CONFIG`` parameters to make:: | |
228 | |
229 $ make run TOOLCHAIN=pnacl CONFIG=Debug | |
230 | |
231 .. _run_sdk_examples_as_packaged: | 221 .. _run_sdk_examples_as_packaged: |
232 | 222 |
233 Run the SDK examples as packaged apps | 223 Run the SDK examples as packaged apps |
234 ------------------------------------- | 224 ------------------------------------- |
235 | 225 |
236 Each example can also be launched as a packaged app. For more information about | 226 Each example can also be launched as a packaged application. A packaged |
237 using Native Client for packaged apps, see :ref:`Packaged application | 227 application is a special zip file (with a .crx extension) hosted in the Chrome |
238 <distributing_packaged>`. For general information about packaged apps, see the | 228 Web Store. This file contains all of the application parts: A Chrome Web Store |
239 `Chrome apps documentation </apps/about_apps>`_. | 229 manifest file (manifest.json), an icon, and all of the regular Native Client |
| 230 application files. Refer to `What are Chrome Apps </apps/about_apps>`_ for more |
| 231 information about creating a packaged application. |
240 | 232 |
241 Some Pepper features, such as TCP/UDP socket access, are only allowed in | 233 Some Pepper features, such as TCP/UDP socket access, are only allowed in |
242 packaged apps. The examples that use these features must be run as packaged | 234 packaged applications. The examples that use these features must be run as |
243 apps, by using the ``make run_package`` command:: | 235 packaged applications, by using the following command:: |
244 | 236 |
245 $ make run_package | 237 $ make run_package |
246 | 238 |
247 You can use ``TOOLCHAIN`` and ``CONFIG`` parameters as above to run with a | 239 You can use ``TOOLCHAIN`` and ``CONFIG`` parameters as described above to run |
248 different toolchain or configuration. | 240 with a different toolchain or configuration. |
249 | |
250 | 241 |
251 .. _debugging_the_sdk_examples: | 242 .. _debugging_the_sdk_examples: |
252 | 243 |
253 Debugging the SDK examples | 244 Debugging the SDK examples |
254 -------------------------- | 245 -------------------------- |
255 | 246 |
256 The NaCl SDK uses `GDB <https://www.gnu.org/software/gdb/>`_ to debug Native | 247 The NaCl SDK uses `GDB <https://www.gnu.org/software/gdb/>`_ to debug Native |
257 Client code. The SDK includes a prebuilt version of GDB that is compatible with | 248 Client code. The SDK includes a prebuilt version of GDB that is compatible with |
258 NaCl code. To use it, run the ``make debug`` command from an example directory:: | 249 NaCl code. To use it, run the ``make debug`` command from an example directory:: |
259 | 250 |
260 $ make debug | 251 $ make debug |
261 | 252 |
262 This will launch Chrome with the ``--enable-nacl-debug`` flag set. This flag | 253 This launches Chrome with the ``--enable-nacl-debug`` flag set. This flag causes |
263 will cause Chrome to pause when a NaCl module is first loaded, waiting for a | 254 Chrome to pause when a NaCl module is first loaded, waiting for a connection |
264 connection from gdb. The ``make debug`` command also simultaneously launches | 255 from gdb. The ``make debug`` command also simultaneously launches GDB and loads |
265 GDB and loads the symbols for that NEXE. To connect GDB to Chrome, in the GDB | 256 the symbols for that NEXE. To connect GDB to Chrome, in the GDB console, type:: |
266 console, type:: | |
267 | 257 |
268 (gdb) target remote :4014 | 258 (gdb) target remote :4014 |
269 | 259 |
270 This tells GDB to connect to a TCP port on ``localhost:4014``--the port that | 260 This tells GDB to connect to a TCP port on ``localhost:4014``, the port that |
271 Chrome is listening on. GDB will respond:: | 261 Chrome is listening on. GDB will respond:: |
272 | 262 |
273 Remote debugging using :4014 | 263 Remote debugging using :4014 |
274 0x000000000fa00080 in ?? () | 264 0x000000000fa00080 in ?? () |
275 | 265 |
276 At this point, you can use the standard GDB commands to debug your NaCl module. | 266 At this point, you can use the standard GDB commands to debug your NaCl module. |
277 The most common commands you will use to debug are ``continue``, ``step``, | 267 The most common commands you will use to debug are ``continue``, ``step``, |
278 ``next``, ``break`` and ``backtrace``. See :doc:`Debugging | 268 ``next``, ``break`` and ``backtrace``. See |
279 <../devguide/devcycle/debugging>` for more information about debugging a Native
Client | 269 :doc:`Debugging <../devguide/devcycle/debugging>` for more information about |
280 application. | 270 debugging a Native Client application. |
281 | 271 |
282 | 272 |
283 .. |menu-icon| image:: /images/menu-icon.png | 273 .. |menu-icon| image:: /images/menu-icon.png |
284 .. |gear-icon| image:: /images/gear-icon.png | 274 .. |gear-icon| image:: /images/gear-icon.png |
OLD | NEW |