diff --git a/Ohmpi.py b/Ohmpi.py
index 5febe34fcdf4a792941e5dd4d5967f945aae6fc8..b8efb7bb0c0ad63d0da8c54755d68c116121b524 100644
--- a/Ohmpi.py
+++ b/Ohmpi.py
@@ -33,6 +33,8 @@ print(current_time.strftime("%Y-%m-%d %H:%M:%S"))
 Hardware parameters
 """
 R_shunt = 0.2# reference resistance value in ohm
+Imax=4800/50/2
+print(colored('The maximum current cannot be higher than 48 mA', 'red'))
 coef_p2 = 2.50# slope for current conversion for ADS.P2, measurement in V/V
 coef_p3 = 2.50 # slope for current conversion for ADS.P3, measurement in V/V
 offset_p2= 0
diff --git a/Ohmpi_4elec.py b/Ohmpi_4elec.py
index e1038e6adb1db42c512fef6d24df09ff921bb309..ce3b060c1a32fa3b78366cd634655f0d701e05fe 100644
--- a/Ohmpi_4elec.py
+++ b/Ohmpi_4elec.py
@@ -36,6 +36,7 @@ hardware parameters
 R_shunt = 2# reference resistance value in ohm
 Imax=4800/50/2
 print(colored(('The maximum current cannot be higher than ',Imax, 'mA'), 'red'))
+
 coef_p2 = 2.50# slope for current conversion for ADS.P2, measurement in V/V
 coef_p3 = 2.50 # slope for current conversion for ADS.P3, measurement in V/V
 offset_p2= 0
diff --git a/V2_00_step_02 - Copie.rst b/V2_00_step_02 - Copie.rst
deleted file mode 100644
index c98864a23f267342179258e203608484e10d167a..0000000000000000000000000000000000000000
--- a/V2_00_step_02 - Copie.rst	
+++ /dev/null
@@ -1,467 +0,0 @@
-
-**STEP n°2**: Assembly of the measurement board
-****************************************************
-
-+----------------------------------------------------+
-| **Required components**                            | 
-+----------------------------------------------------+
-
-.. figure:: step_n_2/00_mes_board_components.jpg       
-	   :width: 600px
-	   :align: center
-	   :height: 450px
-	   :alt: alternate text
-	   :figclass: align-center 
-
-
-
-
-.. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\step_n_2\Mesure_board_list_2_xx.csv
-   :widths: 30, 70, 70, 70, 70, 35, 35
-   :header-rows: 1
-   
-Description
-==========================================   
-
-.. figure:: schema_measurement_board.jpg       
-	   :width: 600px
-	   :align: center
-	   :height: 450px
-	   :alt: alternate text
-	   :figclass: align-center 
-
-Figure  shows the general schematics for the electronic measurement board developed.
-We have developed a complete "plug and play" measurement board. To measure electrical resistivity with Raspberry Pi. 
-two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
-is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the 
-input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component, 
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:
-
-
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/01_mes_board.jpg                     |
-   |      1 +------------------------------------------------------------+
-   |        | Installation of female header, 1 by10  pins, for ADS1115   | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/02_mes_board.jpg                     |
-   |2       +------------------------------------------------------------+
-   |        | Soldering of 4 dual-in-line- socket (2 by 2 pins) for      | 
-   |        | optical relay, AQY211EH.                                   |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/03_mes_board.jpg                     |
-   |3       +------------------------------------------------------------+
-   |        | Soldering of 1 dual-in-line- socket (2 by 9 pins)          | 
-   |        | for INA282.                                                |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/04_mes_board.jpg                     |
-   | 4      +------------------------------------------------------------+
-   |        | Soldering of 1 dual-in-line- socket (2 by 4 pins)          | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+ 
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/05_mes_board.jpg                     |
-   |5       +------------------------------------------------------------+
-   |        | Soldering of 2 dual-in-line- socket (2 by 4 pins)          | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/06_mes_board.jpg                     |
-   | 6      +------------------------------------------------------------+
-   |        | Traco Power Supply 12V to 5V, TDH15 - 1211N                | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+  
-
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/07_mes_board.jpg                     |
-   |7       +------------------------------------------------------------+
-   |        | Four screw terminals for 12V inpout et 5V outpout          | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/08_mes_board.jpg                     |
-   |8       +------------------------------------------------------------+
-   |        | Traco power Supply 12V to 24V, TRN-1215                    | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+    
-
-.. table::
-   :align: center
-  
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_2/09_mes_board.jpg                     |
-   |9       +------------------------------------------------------------+
-   |        | Two screw terminals electrodes M and N                     | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/10_mes_board.jpg                     |
-   |10       +------------------------------------------------------------+
-   |         | Four screw terminals, for 12V power supply and for         | 
-   |         | electrodes A and B                                         |                                                                       
-   +---------+------------------------------------------------------------+
-
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/11_mes_board.jpg                     |
-   |11       +------------------------------------------------------------+
-   |         |  Soldering three capacitors (100nF)                        | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/12_mes_board.jpg                     |
-   | 12      +------------------------------------------------------------+
-   |         | 2 ohms shunt resistor pre-adjustment                       | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/13_mes_board.jpg                     |
-   |13       +------------------------------------------------------------+
-   |         | Soldering 2 ohms shunt resistor                            | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/14_mes_board.jpg                     |
-   |14       +------------------------------------------------------------+
-   |         | 1 Mohms resistors                                          | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+  
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/15_mes_board.jpg                     |
-   |15       +------------------------------------------------------------+
-   |         | Soldering tow 1 Kohms resistors                            | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/16_mes_board.jpg                     |
-   |16       +------------------------------------------------------------+
-   |         | Soldering tow 1.5Kohms resistors                           | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/17_mes_board.jpg                     |
-   |17       +------------------------------------------------------------+
-   |         | Soldering tow 1.5Kohms resistors                           | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/18_mes_board.jpg                     |
-   |18       +------------------------------------------------------------+
-   |         | Female header 2 by 20 pins for Raspberry Pi connection     | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/19_mes_board.jpg                     |
-   |19       +------------------------------------------------------------+
-   |         | View of the female  header 2 by 20 pins installation       | 
-   |         | for Raspberry Pi connection                                |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/20_mes_board.jpg                     |
-   |20       +------------------------------------------------------------+
-   |         | Fixing MCP23008 component                                  | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/21_mes_board.jpg                     |
-   |21       +------------------------------------------------------------+
-   |         |Mounting optical relay, AQY211EH                            | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/22_mes_board.jpg                     |
-   |22       +------------------------------------------------------------+
-   |         | Mounting LM158 operational amplificator                    | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/23_mes_board.jpg                     |
-   |23       +------------------------------------------------------------+
-   |         |  Mounting ADS115 board                                     | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-  
-   +---------+------------------------------------------------------------+
-   |         |   .. image:: step_n_2/24_mes_board.jpg                     |
-   |24       +------------------------------------------------------------+
-   |         | Fixing the INA282                                          | 
-   |         |                                                            |                                                                       
-   +---------+------------------------------------------------------------+
-  
-  
-
-**STEP n°3**: Start-up of the measurement board.
-****************************************************
-
-+------------------------------------------------------------------------+
-| **Required components**                                                | 
-+------------------------------------------------------------------------+
-
-.. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\step_n_3\test_2_xx.csv
-   :widths: 30, 70, 70, 70, 70, 35, 35
-   :header-rows: 1
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/001.jpg                              |
-   |1       +------------------------------------------------------------+
-   |        | Shutdown the raspberry Pi and unplug the power supply      | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
-   
-   +--------+--------------------------------------------------------------------------+
-   |        |   .. image:: step_n_3/001.jpg                                            |
-   |2       +--------------------------------------------------------------------------+
-   |        | Mounting the bottom spacers on the Raspberry Pi (male/female, 11mm, M3)  | 
-   |        |                                                                          |                                                                       
-   +--------+--------------------------------------------------------------------------+
-
-.. table::
-   :align: center
-   
-   +--------+--------------------------------------------------------------------------+
-   |        |   .. image:: step_n_3/002.jpg                                            |
-   |3       +--------------------------------------------------------------------------+
-   |        | Mounting the upper spacers on the Raspberry Pi (female/female, 11mm, M3) | 
-   |        |                                                                          |                                                                       
-   +--------+--------------------------------------------------------------------------+
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/003.jpg                              |
-   |4       +------------------------------------------------------------+
-   |        | Mounting the Ohmpi's measurement board on the Raspberry Pi | 
-   |        |                                                            |                                                                       
-   +--------+------------------------------------------------------------+
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/004.jpg                              |
-   |5       +------------------------------------------------------------+
-   |        | Mounting the Ohmpi's measurement board on the Raspberry Pi | 
-   |        |                                                            |
-   +--------+------------------------------------------------------------+   
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_3/005.jpg                              |
-   |6       +------------------------------------------------------------+
-   |        | Plug the power supply into a socket and connect it to your | 
-   |        | Raspberry Pi's power port.                                 |
-   +--------+------------------------------------------------------------+  
-
-
-**STEP n°4**: Measurement board validation
-****************************************************
-
- Run the terminal, and write
-
- .. code-block:: python
-
-	 i2cdetect -y 1
-
-.. table::
-   :align: center
-   
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/i2cdetect.png                        |
-   |1       +------------------------------------------------------------+
-   |        |If everything is working, three I2C addresses should appear | 
-   |        |on the screen.                                              |                                                                       
-   +--------+------------------------------------------------------------+
-
-
-
-Setting up an equivalent electronic circuit, for this you will need: 
- * 4 1kohm resistor (R2)
- * 1 220 ohm resistor (R1)
- * 1 small padboard
- * Spool of solder
- 
- .. table::
-   :align: left
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/ref_circuit.png                      |
-   |2       +------------------------------------------------------------+
-   |        | Schematic of equivalent electronic circuit test            |                                                                       
-   +--------+------------------------------------------------------------+
-   
-.. table::
-   :align: center
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/20210905_122820.jpg                  |
-   |3       +------------------------------------------------------------+
-   |        | Préparer le circuit équivalent                             |                                                                       
-   +--------+------------------------------------------------------------+ 
-
-  
-.. table::
-   :align: center
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/20210905_123034.jpg                  |
-   |4       +------------------------------------------------------------+
-   |        | Préparer les cables de connexion aux batterie et les cosses|                                                                       
-   +--------+------------------------------------------------------------+ 
-
-
-.. table::
-   :align: center
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/20210905_132856.jpg                  |
-   |5       +------------------------------------------------------------+
-   |        | Souder les câbles et les cosses                            |                                                                       
-   +--------+------------------------------------------------------------+ 
-
-
-.. table::
-   :align: center
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/20210905_210045.jpg                  |
-   |6       +------------------------------------------------------------+
-   |        | Installer les cables rouges sur la borne +12V et cable noir|                                                                       
-   |        | sur la borne ground.                                       |
-   +--------+------------------------------------------------------------+ 
-
-.. table::
-   :align: center
- 
-   +--------+------------------------------------------------------------+
-   |        |   .. image:: step_n_4/20210905_210045.jpg                  |
-   |7       +------------------------------------------------------------+
-   |        | Installer le circuit de référence                          |                                                                       
-   |        |                                                            |
-   +--------+------------------------------------------------------------+
-
-
-Run the Thonny IDE and load the code Ohmpy4elec.pi
-
-
-**STEP n°5**: Assembly of the MUX board
-****************************************************
-
-
-
-**STEP n°6**: Check Mux Board
-****************************************************
-
-
-
-**STEP n°7**: Assemble Ohmpi
-****************************************************
-
-
-
-**STEP n°8**: Boxing Ohmpi
-****************************************************
-
-
-
-**STEP n°9**: Field measurement
-****************************************************
- 
\ No newline at end of file
diff --git a/public/Ohmpi_V2_00/V2_00_step_01.html b/public/Ohmpi_V2_00/V2_00_step_01.html
index 5ac23f2ae4def4663826454fb9ad9eb197667ce5..334179d93098eecc6814f7f9778885b2de1390e9 100644
--- a/public/Ohmpi_V2_00/V2_00_step_01.html
+++ b/public/Ohmpi_V2_00/V2_00_step_01.html
@@ -117,7 +117,7 @@
 For this step, the installation instructions are well described on the Raspberry website</p>
 <ol class="arabic simple">
 <li><p>Watch the vidéo “how to set up your raspberry Pi” (<a class="reference external" href="https://www.youtube.com/watch?v=wjWZhV1v3Pk">https://www.youtube.com/watch?v=wjWZhV1v3Pk</a>)</p></li>
-<li><p>The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).</p></li>
+<li><p>The authors recommend installing the latest stable and complete version of Raspberry Pi OS (Previously called Raspbian) by using Raspberry Pi Imager.</p></li>
 <li><p>or you can visit this website : (<a class="reference external" href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up">https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up</a>)</p></li>
 </ol>
 <div class="admonition note">
@@ -129,7 +129,7 @@ For this step, the installation instructions are well described on the Raspberry
 </div>
 <div class="admonition warning">
 <p class="admonition-title">Warning</p>
-<p>Once the OS has been installed,  <strong>1-wire, spi and GPIO remote option</strong> must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.</p>
+<p>Once the OS has been installed,  <strong>1-wire, spi and GPIO remote option</strong> must be deactivated and <strong>I2C option</strong> must be activated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.</p>
 </div>
 <p>3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly.
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.</p>
@@ -185,7 +185,8 @@ Each virtual environment contains a discrete copy of the Python interpreter, inc
 </pre></div>
 </div>
 <p>Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">RPi</span><span class="o">.</span><span class="n">GPIO</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">blinka</span> <span class="n">numpy</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">ads1x15</span> <span class="n">pandas</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">export</span> <span class="n">CFLAGS</span><span class="o">=-</span><span class="n">fcommon</span>
+    <span class="n">sudo</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">RPi</span><span class="o">.</span><span class="n">GPIO</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">blinka</span> <span class="n">numpy</span> <span class="n">pandas</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">ads1x15</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">tca9548a</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">mcp230xx</span> <span class="n">gpiozero</span>
 </pre></div>
 </div>
 <p>Check that requirements are met using</p>
diff --git a/public/Ohmpi_V2_00/V2_00_step_02.html b/public/Ohmpi_V2_00/V2_00_step_02.html
index 3b2db4300821cb523f44bb2408fbb3fa1756e399..dad3c8422d5a87616f6227110133f3fa5cf7e6a3 100644
--- a/public/Ohmpi_V2_00/V2_00_step_02.html
+++ b/public/Ohmpi_V2_00/V2_00_step_02.html
@@ -116,15 +116,15 @@
 <tbody>
 <tr class="row-even"><td><p>Raspberry Pi 4 Model B</p></td>
 <td><p>1</p></td>
-<td><p>58.75</p></td>
-<td><p>58.75</p></td>
+<td><p>58,75</p></td>
+<td><p>58,75</p></td>
 <td><p>Raspberry</p></td>
 <td><p>Raspberry Pi 4 Model B</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D">https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>LM158N AMP-o</p></td>
-<td><p>4</p></td>
-<td><p>14.5</p></td>
+<td><p>2</p></td>
+<td><p>14,5</p></td>
 <td><p>58</p></td>
 <td><p>Texas Instruments</p></td>
 <td><p>LM358AN/NOPB</p></td>
@@ -146,171 +146,166 @@
 </tr>
 <tr class="row-odd"><td><p>ADS1115</p></td>
 <td><p>2</p></td>
-<td><p>11.9</p></td>
-<td><p>23.8</p></td>
+<td><p>11,9</p></td>
+<td><p>23,8</p></td>
 <td><p>Adafruit</p></td>
 <td><p>1085</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D">https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Capacitor 100nF 50Vdc 10% Ceramic</p></td>
-<td><p>4</p></td>
-<td><p>0.2</p></td>
-<td><p>0.8</p></td>
+<td><p>3</p></td>
+<td><p>0,2</p></td>
+<td><p>0,8</p></td>
 <td><p>KEMET</p></td>
-<td><p>C320C104K1</p></td>
+<td><blockquote>
+<div><p>C320C104K1</p>
+</div></blockquote>
+</td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D">https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>Resistor 1 Kohm 0.5W +- 0.1%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>TE Connectivity</p></td>
 <td><p>H81K0BYA</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D">https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Resistor 1.5 Kohms +- 0.1%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>TE Connectivity</p></td>
 <td><p>H81K5BYA</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D">https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>Resistor 1.5 Kohms +- 5%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>Vishay</p></td>
 <td><p>CCF071K50GKE36</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D">https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Resistor 10 Mohms +-5%</p></td>
 <td><p>2</p></td>
-<td><p>0.762</p></td>
-<td><p>1.524</p></td>
+<td><p>0,762</p></td>
+<td><p>1,524</p></td>
 <td><p>VISHAY</p></td>
 <td><p>CMF651M0000FKEK143</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D">https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>2 ohm shunt resistor+-  1%</p></td>
 <td><p>1</p></td>
-<td><p>2.42</p></td>
-<td><p>2.42</p></td>
+<td><p>2,42</p></td>
+<td><p>2,42</p></td>
 <td><p>Ohmite</p></td>
 <td><p>41F2R0E</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D">https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Dual screw terminal (5.08-mm pitch)</p></td>
 <td><p>5</p></td>
-<td><p>0.648</p></td>
-<td><p>3.24</p></td>
+<td><p>0,648</p></td>
+<td><p>3,24</p></td>
 <td><p>CUI Devices</p></td>
 <td><p>TB009-508-02BE</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D">https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>DC/DC converter 12 to 24V</p></td>
-<td><p>2</p></td>
-<td><p>15.58</p></td>
-<td><p>31.16</p></td>
+<td><p>1</p></td>
+<td><p>15,58</p></td>
+<td><p>31,16</p></td>
 <td><p>TracoPower</p></td>
 <td><p>TRN 3-1215</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D">https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>DIP Dual In Line Socket 2*4</p></td>
 <td><p>3</p></td>
-<td><p>0.72</p></td>
-<td><p>2.16</p></td>
+<td><p>0,72</p></td>
+<td><p>2,16</p></td>
 <td><p>Mill-Max</p></td>
 <td><p>110-43-308-41-001000</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE">https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>AQY211EH</p></td>
 <td><p>4</p></td>
-<td><p>3.84</p></td>
-<td><p>15.36</p></td>
+<td><p>3,84</p></td>
+<td><p>15,36</p></td>
 <td><p>Panasonic Industrial Devices</p></td>
 <td><p>AQY211EH</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D">https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>DIP Dual In Line Socket 2*2</p></td>
 <td><p>4</p></td>
-<td><p>0.449</p></td>
-<td><p>1.796</p></td>
+<td><p>0,449</p></td>
+<td><p>1,796</p></td>
 <td><p>Preci-dip</p></td>
 <td><p>110-83-304-41-001101</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D">https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>SSQ-103-03-G-D</p></td>
-<td><p>1</p></td>
-<td><p>2.06</p></td>
-<td><p>2.06</p></td>
-<td><p>Samtec</p></td>
-<td><p>SSQ-103-03-G-D</p></td>
-<td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSQ-103-03-G-D?qs=rU5fayqh%252BE2Z%252BZTchcPoHQ%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSQ-103-03-G-D?qs=rU5fayqh%252BE2Z%252BZTchcPoHQ%3D%3D</a></p></td>
-</tr>
-<tr class="row-even"><td><p>MCP23008</p></td>
+<tr class="row-odd"><td><p>MCP23008</p></td>
 <td><p>1</p></td>
-<td><p>1.72</p></td>
-<td><p>1.72</p></td>
+<td><p>1,72</p></td>
+<td><p>1,72</p></td>
 <td><p>Adafruit</p></td>
 <td><p>593</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D">https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>Header sets 1x10</p></td>
+<tr class="row-even"><td><p>Header sets 1x10</p></td>
 <td><p>2</p></td>
-<td><p>2.12</p></td>
-<td><p>4.24</p></td>
+<td><p>2,12</p></td>
+<td><p>4,24</p></td>
 <td><p>Samtec</p></td>
 <td><p>SSW-110-02-G-S</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>SMT Breakout PCB for SOIC-8</p></td>
+<tr class="row-odd"><td><p>SMT Breakout PCB for SOIC-8</p></td>
 <td><p>1</p></td>
-<td><p>2.5</p></td>
-<td><p>2.5</p></td>
+<td><p>2,5</p></td>
+<td><p>2,5</p></td>
 <td><p>Adafruit</p></td>
 <td><p>1212</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE">https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>INA282AID</p></td>
+<tr class="row-even"><td><p>INA282AID</p></td>
 <td><p>1</p></td>
-<td><p>4.11</p></td>
-<td><p>4.11</p></td>
+<td><p>4,11</p></td>
+<td><p>4,11</p></td>
 <td><p>Texas Instruments</p></td>
 <td><p>INA282AID</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D">https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>THD 15-1211N</p></td>
+<tr class="row-odd"><td><p>THD 15-1211N</p></td>
 <td><p>1</p></td>
-<td><p>39.72</p></td>
-<td><p>39.72</p></td>
+<td><p>39,72</p></td>
+<td><p>39,72</p></td>
 <td><p>TracoPower</p></td>
 <td><p>THD 15-1211N</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D">https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>DIP Dual In Line Socket 2*20</p></td>
+<tr class="row-even"><td><p>DIP Dual In Line Socket 2*20</p></td>
 <td><p>1</p></td>
-<td><p>8.53</p></td>
-<td><p>8.53</p></td>
+<td><p>8,53</p></td>
+<td><p>8,53</p></td>
 <td><p>Samtec</p></td>
 <td><p>SSQ-120-23-G-D</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>Pin strip no ejector</p></td>
+<tr class="row-odd"><td><p>Pin strip no ejector</p></td>
 <td><p>1</p></td>
-<td><p>0.35</p></td>
-<td><p>0.35</p></td>
+<td><p>0,35</p></td>
+<td><p>0,35</p></td>
 <td><p>BLK electronic</p></td>
 <td><p>10120550</p></td>
 <td><p><a class="reference external" href="https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&amp;searchType=suggest&amp;searchSuggest=product">https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&amp;searchType=suggest&amp;searchSuggest=product</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>Male Female spacer 2.5M HEXAGONALE</p></td>
-<td><p>	4</p></td>
-<td><p>	0.87</p></td>
-<td><p>	3.48</p></td>
-<td><p>	HARWIN</p></td>
-<td><p>	R25-3002002</p></td>
-<td><p>	<a class="reference external" href="https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D">https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D</a></p></td>
+<tr class="row-even"><td><p>Male Female spacer 2.5M HEXAGONALE</p></td>
+<td><p>4</p></td>
+<td><p>0,87</p></td>
+<td><p>3,48</p></td>
+<td><p>HARWIN</p></td>
+<td><p>R25-3002002</p></td>
+<td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D">https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D</a></p></td>
 </tr>
 </tbody>
 </table>
@@ -325,7 +320,7 @@ We have developed a complete “plug and play” measurement board. To measure e
 two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the
 input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component,
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:</p>
+which allows to realize precise current measurement around a shunt resistor. The assembly are described in the following steps:</p>
 <table class="docutils align-center">
 <colgroup>
 <col style="width: 12%" />
@@ -483,6 +478,10 @@ electrodes A and B</p></td>
 </tr>
 </tbody>
 </table>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>In this version, We used a shunt resistor of 2 ohms, which limits the current measurement to 48 mA. If the current is higher than this value, you just have to decrease the value of the shunt resistor.Change the shunt value in the code.</p>
+</div>
 <table class="docutils align-center">
 <colgroup>
 <col style="width: 13%" />
@@ -606,7 +605,7 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/20_mes_board.jpg" src="../_images/20_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Fixing MCP23008 component</p></td>
+<tr class="row-even"><td><p>Fixing MCP23008 component (Dot mark on the top left corner)</p></td>
 </tr>
 </tbody>
 </table>
@@ -620,7 +619,8 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/21_mes_board.jpg" src="../_images/21_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Mounting optical relay, AQY211EH</p></td>
+<tr class="row-even"><td><p>Mounting optical relay, AQY211EH (Dot mark in the top left
+corners)</p></td>
 </tr>
 </tbody>
 </table>
@@ -662,7 +662,7 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/24_mes_board.jpg" src="../_images/24_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Fixing the INA282</p></td>
+<tr class="row-even"><td><p>Fixing the INA282 (Dot mark in the top right corner)</p></td>
 </tr>
 </tbody>
 </table>
@@ -904,7 +904,8 @@ on the screen.</p></td>
 </td>
 </tr>
 <tr class="row-even"><td><p>Install the red cables on the +12V terminal and black cable
-on the ground terminal.</p></td>
+on the ground terminal. Connect to two different 12V
+batteries</p></td>
 </tr>
 </tbody>
 </table>
@@ -929,7 +930,7 @@ on the ground terminal.</p></td>
 </colgroup>
 <tbody>
 <tr class="row-odd"><td rowspan="2"><p>7</p></td>
-<td><img alt="../_images/thonny_first_interface2.jpg" src="../_images/thonny_first_interface2.jpg" />
+<td><img alt="../_images/thonny_first_interface1.jpg" src="../_images/thonny_first_interface1.jpg" />
 </td>
 </tr>
 <tr class="row-even"><td><p>Run Tonny Interpreter</p></td>
@@ -947,7 +948,7 @@ on the ground terminal.</p></td>
 </td>
 </tr>
 <tr class="row-even"><td><p>Run Ohmpi_4elec.py, if everything works you should
-get the following result</p></td>
+get the following result (220 ohm)</p></td>
 </tr>
 </tbody>
 </table>
diff --git a/public/Ohmpi_V2_00/V2_00_step_03.html b/public/Ohmpi_V2_00/V2_00_step_03.html
index 55294eecec2c06101ef5a9ff2775d347795e79ef..144fa110a39ac45898e22d0af276b0d389dcc2ee 100644
--- a/public/Ohmpi_V2_00/V2_00_step_03.html
+++ b/public/Ohmpi_V2_00/V2_00_step_03.html
@@ -39,7 +39,7 @@
 <li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li>
 <li class="toctree-l1"><a class="reference internal" href="../V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li>
 <li class="toctree-l1"><a class="reference internal" href="../V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li>
-<li class="toctree-l1 current"><a class="reference internal" href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes)</a><ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes and 12V)</a><ul class="current">
 <li class="toctree-l2"><a class="reference internal" href="../V2_00.html#the-philosophy-of-ohmpi">The philosophy of Ohmpi</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../V2_00.html#technical-data">Technical data</a></li>
 <li class="toctree-l2 current"><a class="reference internal" href="../V2_00.html#ohmpi-2-step-by-step">Ohmpi 2 step by step</a><ul class="current">
@@ -47,6 +47,7 @@
 <li class="toctree-l3"><a class="reference internal" href="V2_00_step_02.html"><strong>STEP n°2</strong>: Measurement board</a></li>
 <li class="toctree-l3 current"><a class="current reference internal" href="#"><strong>STEP n°3</strong>: MUX board</a><ul>
 <li class="toctree-l4"><a class="reference internal" href="#part-a-assembly-of-mux-board"><strong>PART A</strong> Assembly of MUX board</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#part-b-test-of-mux-board"><strong>PART B</strong> Test of MUX board</a></li>
 </ul>
 </li>
 </ul>
@@ -69,7 +70,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
-          <li><a href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes)</a> &raquo;</li>
+          <li><a href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes and 12V)</a> &raquo;</li>
       <li><strong>STEP n°3</strong>: MUX board</li>
       <li class="wy-breadcrumbs-aside">
             <a href="../_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt" rel="nofollow"> View page source</a>
@@ -87,7 +88,7 @@
 <div class="section" id="required-components">
 <h3>Required components<a class="headerlink" href="#required-components" title="Permalink to this headline">¶</a></h3>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="../_images/00_mes_board_components1.jpg"><img alt="alternate text" src="../_images/00_mes_board_components1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="../_images/MUX_board_componement.jpg"><img alt="alternate text" src="../_images/MUX_board_componement.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <table class="colwidths-given docutils align-default" id="id1">
 <caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
@@ -255,7 +256,170 @@
 </tr>
 </tbody>
 </table>
+<p>The multiplexing of the channels is a mechanical multiplexing based on OMRON’s manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs.
+We used gpio expender I2C (MCP23017). We have associated these components with an I2C muliplexer of type type TCA9548A from adafruit.
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77.
+In the following presentation for an Ohmpi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N.
+0X73 for the N channel. 4 MUX board will be needed to multiplex an Ohmpi 64 electrodes.</p>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>1</p></td>
+<td><img alt="../_images/MUX_00.jpg" src="../_images/MUX_00.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Mux board pcb</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>2</p></td>
+<td><img alt="../_images/MUX_01.jpg" src="../_images/MUX_01.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the 150 Kohm resistors</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>3</p></td>
+<td><img alt="../_images/MUX_02.jpg" src="../_images/MUX_02.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the mosfet ZVN4206A</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>4</p></td>
+<td><img alt="../_images/MUX_03.jpg" src="../_images/MUX_03.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the diode-1n4007</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>5</p></td>
+<td><img alt="../_images/MUX_04.jpg" src="../_images/MUX_04.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the relay</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>6</p></td>
+<td><img alt="../_images/MUX_05.jpg" src="../_images/MUX_05.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Instalation of the terminal screw</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>7</p></td>
+<td><img alt="../_images/MUX_06.jpg" src="../_images/MUX_06.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of generic male header</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>8</p></td>
+<td><img alt="../_images/MUX_07.jpg" src="../_images/MUX_07.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of Pin strip (6 pins)  and pin strip (16 pins)</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>9</p></td>
+<td><img alt="../_images/MUX_08.jpg" src="../_images/MUX_08.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of DIP Dual In Line Socket 2*14</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>10</p></td>
+<td><img alt="../_images/MUX_09.jpg" src="../_images/MUX_09.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of Adafruit TCA9548A</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>10</p></td>
+<td><img alt="../_images/MUX_10.jpg" src="../_images/MUX_10.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of MCP23017</p></td>
+</tr>
+</tbody>
+</table>
+</div>
 </div>
+<div class="section" id="part-b-test-of-mux-board">
+<h2><strong>PART B</strong> Test of MUX board<a class="headerlink" href="#part-b-test-of-mux-board" title="Permalink to this headline">¶</a></h2>
 </div>
 </div>
 
diff --git a/public/V1_01.html b/public/V1_01.html
index 768b87788f9e05441e6aa679a3656b983bab73da..e39b5bcd05fc3df33d2d120906257e843db1d862 100644
--- a/public/V1_01.html
+++ b/public/V1_01.html
@@ -259,7 +259,7 @@ to leave the virtual environment simply type:</p>
 <p>1- Run the Thonny Python IDE software, Click on raspebrry acces <strong>menu &gt; programming&gt; Thonny pythonIDE</strong></p>
 <p>2- Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))</p>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="_images/thonny_first_interface1.jpg"><img alt="alternate text" src="_images/thonny_first_interface1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="_images/thonny_first_interface2.jpg"><img alt="alternate text" src="_images/thonny_first_interface2.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <p>3-Click on <strong>Run&gt;select interpreter</strong>, a new window opens click on interpret</p>
 <div class="align-center figure">
diff --git a/public/V1_02.html b/public/V1_02.html
index f286a04154eeac868d53bdac51de90383680598c..6b2f19822a78618b5c86bd9f7ced602c263a30e5 100644
--- a/public/V1_02.html
+++ b/public/V1_02.html
@@ -257,7 +257,7 @@ to leave the virtual environment simply type:</p>
 <p>1- Run the Thonny Python IDE software, Click on raspebrry acces <strong>menu &gt; programming&gt; Thonny pythonIDE</strong></p>
 <p>2- Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))</p>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="_images/thonny_first_interface1.jpg"><img alt="alternate text" src="_images/thonny_first_interface1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="_images/thonny_first_interface2.jpg"><img alt="alternate text" src="_images/thonny_first_interface2.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <p>3-Click on <strong>Run&gt;select interpreter</strong>, a new window opens click on interpret</p>
 <div class="align-center figure">
diff --git a/public/V2_00.html b/public/V2_00.html
index e6c583e736844a9a707b0951d334e648b8cb021d..ccdb011362c7809e98e5ec8bc84684ec8ded22fe 100644
--- a/public/V2_00.html
+++ b/public/V2_00.html
@@ -216,6 +216,7 @@ control system</p></td>
 <li class="toctree-l3"><a class="reference internal" href="Ohmpi_V2_00/V2_00_step_03.html#required-components">Required components</a></li>
 </ul>
 </li>
+<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2_00/V2_00_step_03.html#part-b-test-of-mux-board"><strong>PART B</strong> Test of MUX board</a></li>
 </ul>
 </li>
 </ul>
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/00_mes_board_components.jpg b/public/_images/00_mes_board_components1.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/00_mes_board_components.jpg
rename to public/_images/00_mes_board_components1.jpg
diff --git a/public/_images/01_mes_board.jpg b/public/_images/01_mes_board.jpg
index 2baa894bd38ab71c7a2f03bfca10a382ce93a0b9..237c47dca441248fde4a29fb3abbe983c2b357e4 100644
Binary files a/public/_images/01_mes_board.jpg and b/public/_images/01_mes_board.jpg differ
diff --git a/public/_images/03_mes_board.jpg b/public/_images/03_mes_board.jpg
index 41381d5341aed8952dab89fa31ed7c0303e50205..e52e56db4257d5076984ea68eb86f8ca2fe23a6d 100644
Binary files a/public/_images/03_mes_board.jpg and b/public/_images/03_mes_board.jpg differ
diff --git a/public/_images/04_mes_board.jpg b/public/_images/04_mes_board.jpg
index 988d238ad7fc61d9fb594467729879635deec63b..ed42f99b544b41a3dc361d42be429b3e0b47d8c8 100644
Binary files a/public/_images/04_mes_board.jpg and b/public/_images/04_mes_board.jpg differ
diff --git a/public/_images/06_mes_board.jpg b/public/_images/06_mes_board.jpg
index 94a903f0c942832b86d2f074b95ea5c65a58553b..16894c29798019e2229ada80b6df85b8e4cc69e1 100644
Binary files a/public/_images/06_mes_board.jpg and b/public/_images/06_mes_board.jpg differ
diff --git a/public/_images/07_mes_board.jpg b/public/_images/07_mes_board.jpg
index 954aabf761288a96221d98914011a337cd6664ad..0327314ce5fa099577d3d9e15e9b1b9570d47bb4 100644
Binary files a/public/_images/07_mes_board.jpg and b/public/_images/07_mes_board.jpg differ
diff --git a/public/_images/08_mes_board.jpg b/public/_images/08_mes_board.jpg
index 645ed57a8f2c9118f57500a4aa575913770acdad..968e454a8fb4abb3e001d7923a72f47ef6c645bb 100644
Binary files a/public/_images/08_mes_board.jpg and b/public/_images/08_mes_board.jpg differ
diff --git a/public/_images/09_mes_board.jpg b/public/_images/09_mes_board.jpg
index 28dc97fb5c4c69eec691f6070b7ff79674eae41c..ba7032edab114205c03bf3424866ca75862a49d6 100644
Binary files a/public/_images/09_mes_board.jpg and b/public/_images/09_mes_board.jpg differ
diff --git a/public/_images/11_mes_board.jpg b/public/_images/11_mes_board.jpg
index b9f76edf4a3fd158a8b3cb36fe8216c5d0f2d70d..0943785ea02a53667d3fd17de1f2d42ef54455c1 100644
Binary files a/public/_images/11_mes_board.jpg and b/public/_images/11_mes_board.jpg differ
diff --git a/public/_images/13_mes_board.jpg b/public/_images/13_mes_board.jpg
index c954948f8b497ac5a62701a2cbcba8d8133258b4..e2c364ae2f79db84ddedff044e8d30e0380f4741 100644
Binary files a/public/_images/13_mes_board.jpg and b/public/_images/13_mes_board.jpg differ
diff --git a/public/_images/14_mes_board.jpg b/public/_images/14_mes_board.jpg
index 06db732127be7c32a33d2153f3a58a764466891b..31c7f113e432921c311b3ce4967a2be82f2e3f5e 100644
Binary files a/public/_images/14_mes_board.jpg and b/public/_images/14_mes_board.jpg differ
diff --git a/public/_images/15_mes_board.jpg b/public/_images/15_mes_board.jpg
index cf98e5c5ce8ffe7373e6aee0bc7e13b880f47db8..43a4682dead6a8ffc87d444f7bfe9daabb577938 100644
Binary files a/public/_images/15_mes_board.jpg and b/public/_images/15_mes_board.jpg differ
diff --git a/public/_images/16_mes_board.jpg b/public/_images/16_mes_board.jpg
index 930821538195751d3b6be551bbf605711bf394f4..3dfa61ba684f9275e912e3f33f5b42daca0d6dd2 100644
Binary files a/public/_images/16_mes_board.jpg and b/public/_images/16_mes_board.jpg differ
diff --git a/public/_images/17_mes_board.jpg b/public/_images/17_mes_board.jpg
index a2cdc3b622201e41ee870d3c88dbd7bfe72c4fd1..90a4b6a1f978195d694abefb01a36d427a340365 100644
Binary files a/public/_images/17_mes_board.jpg and b/public/_images/17_mes_board.jpg differ
diff --git a/public/_images/18_mes_board.jpg b/public/_images/18_mes_board.jpg
index 699b20b0a617d080aa2ddcdbab91960a821ee3f7..7abcf130948510785c57bbcf4b83f3e663c26eeb 100644
Binary files a/public/_images/18_mes_board.jpg and b/public/_images/18_mes_board.jpg differ
diff --git a/public/_images/19_mes_board.jpg b/public/_images/19_mes_board.jpg
index f191473cb7982f67488e13a62ea6e53bc97e4e26..a3ec0b5f27b71f3ebc71685ca6e24c473324188a 100644
Binary files a/public/_images/19_mes_board.jpg and b/public/_images/19_mes_board.jpg differ
diff --git a/public/_images/20211206_144334.jpg b/public/_images/20211206_144334.jpg
index 2a0c06b5febef44d48975b274c2a9ea30cf397f9..ce94d8e783f3be1f89190dca989ba570b3d27de5 100644
Binary files a/public/_images/20211206_144334.jpg and b/public/_images/20211206_144334.jpg differ
diff --git a/public/_images/20_mes_board.jpg b/public/_images/20_mes_board.jpg
index f6780cd498352806e601bd9e77b9e6a9076b47c0..790fa362dc0ba5b00515862e62e2ade622a70d4e 100644
Binary files a/public/_images/20_mes_board.jpg and b/public/_images/20_mes_board.jpg differ
diff --git a/public/_images/21_mes_board.jpg b/public/_images/21_mes_board.jpg
index faf681109fae1e1a4115b95c3fca1b83608fd550..c8628d9c4aecbbd48215f53c78661baee4b33c5a 100644
Binary files a/public/_images/21_mes_board.jpg and b/public/_images/21_mes_board.jpg differ
diff --git a/public/_images/22_mes_board.jpg b/public/_images/22_mes_board.jpg
index 6b3e2ad86a98550cc53a2053a1151f67dad2d741..bf1defadf621dfc6053ff47ea933de519157d06b 100644
Binary files a/public/_images/22_mes_board.jpg and b/public/_images/22_mes_board.jpg differ
diff --git a/public/_images/23_mes_board.jpg b/public/_images/23_mes_board.jpg
index 6fa589f253fea3036bc1363592f803782dcce7b3..e9c8845baac74db8b8d3d218b1b71b57b064d37b 100644
Binary files a/public/_images/23_mes_board.jpg and b/public/_images/23_mes_board.jpg differ
diff --git a/public/_images/24_mes_board.jpg b/public/_images/24_mes_board.jpg
index 767e901170e31f12a7834931950bce5f3d8ca776..956a8f379a79cb4a49a03d777c98d339effc9b7f 100644
Binary files a/public/_images/24_mes_board.jpg and b/public/_images/24_mes_board.jpg differ
diff --git a/public/_images/Inked20211206_150522_LI.jpg b/public/_images/Inked20211206_150522_LI.jpg
index 5ec54996e216cb474520c30190b9ff6ac74cbf15..3f8ba9c3978be068fcd902bda5f37b2ba1cb0541 100644
Binary files a/public/_images/Inked20211206_150522_LI.jpg and b/public/_images/Inked20211206_150522_LI.jpg differ
diff --git a/public/_images/Inked20211206_150522_LI2.jpg b/public/_images/Inked20211206_150522_LI2.jpg
index b688467d89317bb015671419dcbae7a6afbe569b..eeeccbe38189f1ae07e71ab4f99d14a881379871 100644
Binary files a/public/_images/Inked20211206_150522_LI2.jpg and b/public/_images/Inked20211206_150522_LI2.jpg differ
diff --git a/public/_images/MUX_00.jpg b/public/_images/MUX_00.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fb2cf2d57c8ca616fd6c37c1f6d8d37a6d3b0be8
Binary files /dev/null and b/public/_images/MUX_00.jpg differ
diff --git a/public/_images/MUX_01.jpg b/public/_images/MUX_01.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8dc00f59bbe6c9a9f0de7cad657eb19878d2ccdd
Binary files /dev/null and b/public/_images/MUX_01.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_135840.jpg b/public/_images/MUX_02.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_135840.jpg
rename to public/_images/MUX_02.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_145705.jpg b/public/_images/MUX_03.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_145705.jpg
rename to public/_images/MUX_03.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_152448.jpg b/public/_images/MUX_04.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_152448.jpg
rename to public/_images/MUX_04.jpg
diff --git a/public/_images/MUX_05.jpg b/public/_images/MUX_05.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa6d46a10980852997d917165b79c34e6dc54812
Binary files /dev/null and b/public/_images/MUX_05.jpg differ
diff --git a/public/_images/MUX_06.jpg b/public/_images/MUX_06.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..73be96cbd21173e8bf355030e90bd1e768e52c03
Binary files /dev/null and b/public/_images/MUX_06.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_154015.jpg b/public/_images/MUX_07.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_154015.jpg
rename to public/_images/MUX_07.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_154700.jpg b/public/_images/MUX_08.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_154700.jpg
rename to public/_images/MUX_08.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211102_145223.jpg b/public/_images/MUX_09.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211102_145223.jpg
rename to public/_images/MUX_09.jpg
diff --git a/public/_images/MUX_10.jpg b/public/_images/MUX_10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..22bdca2ac5b44182e19801e4b00cdedfbec43864
Binary files /dev/null and b/public/_images/MUX_10.jpg differ
diff --git a/public/_images/MUX_board_componement.jpg b/public/_images/MUX_board_componement.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6fdad018330cc86c50b18552261d58359c79bc9c
Binary files /dev/null and b/public/_images/MUX_board_componement.jpg differ
diff --git a/public/_images/connection.jpg b/public/_images/connection.jpg
index e2b5e01b748d01d8eeed57b2526b83dd00822605..be7b2f429969bf07174631ee63f4d13f47bc9bad 100644
Binary files a/public/_images/connection.jpg and b/public/_images/connection.jpg differ
diff --git a/public/_images/installation_current_board.jpg b/public/_images/installation_current_board.jpg
index 2674efdd8fbdbc6cd539fad3e16858783f26bfac..669a2724f34c02c0abb14f5cac4649bfef50208a 100644
Binary files a/public/_images/installation_current_board.jpg and b/public/_images/installation_current_board.jpg differ
diff --git a/public/_images/measurement_board1-02.jpg b/public/_images/measurement_board1-02.jpg
index 559aead766a8549f1ab9c35991a912cb3dfc7be0..561140f366d25901936fc3e6ae2ad9c08f145889 100644
Binary files a/public/_images/measurement_board1-02.jpg and b/public/_images/measurement_board1-02.jpg differ
diff --git a/public/_images/schema_measurement_board.jpg b/public/_images/schema_measurement_board.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..e6a0633b3ab41ad782d7b0d4539119784aefde46 100644
Binary files a/public/_images/schema_measurement_board.jpg and b/public/_images/schema_measurement_board.jpg differ
diff --git a/public/_images/schema_measurement_board1.jpg b/public/_images/schema_measurement_board1.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..da38456330fc28f6a1c562709c6dc4a4b3685922 100644
Binary files a/public/_images/schema_measurement_board1.jpg and b/public/_images/schema_measurement_board1.jpg differ
diff --git a/public/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt b/public/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
index 51db436b12ff9740083e543f8be4a2ed566be331..4aeb76b6093e6d455a8089d0b74c5bdfb69ad11c 100644
--- a/public/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
+++ b/public/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
@@ -1,4 +1,4 @@
-**STEP n°1** : Raspberry Pi  configuration
+**STEP n°1** : Raspberry Pi  configuration 
 *******************************************
 
 
@@ -19,12 +19,13 @@
 |Computer Keyboard                                   |              1|
 +----------------------------------------------------+---------------+
 
+
 The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). 
 For this step, the installation instructions are well described on the Raspberry website 
 
 1. Watch the vidéo "how to set up your raspberry Pi" (https://www.youtube.com/watch?v=wjWZhV1v3Pk)
 
-2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
+2. The authors recommend installing the latest stable and complete version of Raspberry Pi OS (Previously called Raspbian) by using Raspberry Pi Imager.
 
 3. or you can visit this website : (https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)  
 
@@ -41,7 +42,7 @@ For this step, the installation instructions are well described on the Raspberry
 
 
 .. warning::
-	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated and **I2C option** must be activated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
 
 3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly. 
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
@@ -104,8 +105,9 @@ Activate it using the following command:
 Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
 
 .. code-block:: python
-	 
-	 pip install RPi.GPIO adafruit-blinka numpy adafruit-circuitpython-ads1x15 pandas
+     
+     export CFLAGS=-fcommon
+	 sudo pip install RPi.GPIO adafruit-blinka numpy pandas adafruit-circuitpython-ads1x15 adafruit-circuitpython-tca9548a adafruit-circuitpython-mcp230xx gpiozero
 
 Check that requirements are met using 
 
@@ -172,4 +174,4 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 9- Close thonny to save modifications
 
- 
\ No newline at end of file
+ 
diff --git a/public/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt b/public/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
index 63caad89aa3c0842f9f7846f3f92878576f08345..243ddd8ee3ec11314e9009e55c0dd1a971a379a1 100644
--- a/public/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
+++ b/public/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
@@ -40,7 +40,7 @@ We have developed a complete "plug and play" measurement board. To measure elect
 two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the 
 input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component, 
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:
+which allows to realize precise current measurement around a shunt resistor. The assembly are described in the following steps:
 
 
 
@@ -152,6 +152,12 @@ which allows to realize precise current measurement around a shunt resistor. The
    |         |  Soldering three capacitors (100nF)                        | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
+
+.. warning::
+	 
+	 In this version, We used a shunt resistor of 2 ohms, which limits the current measurement to 48 mA. If the current is higher than this value, you just have to decrease the value of the shunt resistor.Change the shunt value in the code.
+
+
    
 .. table::
    :align: center
@@ -237,7 +243,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/20_mes_board.jpg                   |
    |20       +------------------------------------------------------------+
-   |         | Fixing MCP23008 component                                  | 
+   |         | Fixing MCP23008 component (Dot mark on the top left corner)| 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
    
@@ -247,8 +253,8 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/21_mes_board.jpg                   |
    |21       +------------------------------------------------------------+
-   |         |Mounting optical relay, AQY211EH                            | 
-   |         |                                                            |                                                                       
+   |         |Mounting optical relay, AQY211EH (Dot mark in the top left  | 
+   |         |corners)                                                    |                                                                       
    +---------+------------------------------------------------------------+
    
 .. table::
@@ -277,7 +283,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/24_mes_board.jpg                   |
    |24       +------------------------------------------------------------+
-   |         | Fixing the INA282                                          | 
+   |         | Fixing the INA282 (Dot mark in the top right corner)       | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
   
@@ -429,7 +435,8 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/Inked20211206_150522_LI.jpg        |
    |6       +------------------------------------------------------------+
    |        |Install the red cables on the +12V terminal and black cable |                                                                       
-   |        |on the ground terminal.                                     |
+   |        |on the ground terminal. Connect to two different 12V        |
+   |        |batteries                                                   |
    +--------+------------------------------------------------------------+ 
 
 .. table::
@@ -461,5 +468,5 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/20211206_144334.jpg                |
    |7       +------------------------------------------------------------+
    |        | Run Ohmpi_4elec.py, if everything works you should         |                    
-   |        | get the following result                                   |
+   |        | get the following result (220 ohm)                         |
    +--------+------------------------------------------------------------+ 
diff --git a/public/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt b/public/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3572f898d9da0797c700078e3d56a2ae01390e49
--- /dev/null
+++ b/public/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt
@@ -0,0 +1,146 @@
+
+**STEP n°3**: MUX board
+****************************************************
+
+
+**PART A** Assembly of MUX board
+======================================================
+
+
+Required components 
+----------------------------------------------------
+
+.. figure:: step_n_3/a/MUX_board_componement.jpg       
+	   :width: 600px
+	   :align: center
+	   :height: 450px
+	   :alt: alternate text
+	   :figclass: align-center 
+
+
+.. csv-table:: List of components
+   :file: step_n_3/a/MUX_board_list_2_xx.csv
+   :widths: 30, 70, 70, 70, 70, 35, 35
+   :header-rows: 1 
+   
+The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with 
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. 
+We used gpio expender I2C (MCP23017). We have associated these components with an I2C muliplexer of type type TCA9548A from adafruit. 
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77. 
+In the following presentation for an Ohmpi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N. 
+0X73 for the N channel. 4 MUX board will be needed to multiplex an Ohmpi 64 electrodes.
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_00.jpg                         |
+   |      1 +------------------------------------------------------------+
+   |        |Mux board pcb                                               | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_01.jpg                         |
+   |      2 +------------------------------------------------------------+
+   |        |Installation of the 150 Kohm resistors                      | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_02.jpg                         |
+   |      3 +------------------------------------------------------------+
+   |        |Installation of the mosfet ZVN4206A                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+      
+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_03.jpg                         |
+   |      4 +------------------------------------------------------------+
+   |        |Installation of the diode-1n4007                            | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+    
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_04.jpg                         |
+   |      5 +------------------------------------------------------------+
+   |        |Installation of the relay                                   | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_05.jpg                         |
+   |      6 +------------------------------------------------------------+
+   |        |Instalation of the terminal screw                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_06.jpg                         |
+   |      7 +------------------------------------------------------------+
+   |        |Installation of generic male header                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+ 
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_07.jpg                         |
+   |      8 +------------------------------------------------------------+
+   |        |Installation of Pin strip (6 pins)  and pin strip (16 pins) | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_08.jpg                         |
+   |      9 +------------------------------------------------------------+
+   |        |Installation of DIP Dual In Line Socket 2*14                | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_09.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of Adafruit TCA9548A                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_10.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of MCP23017                                    | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+
+**PART B** Test of MUX board
+======================================================   
diff --git a/public/_sources/V1_01.rst.txt b/public/_sources/V1_01.rst.txt
index c144a69abe916e33b5df140e5c7dd5f927bc7e0d..f1610bfd3c48cce409df560574f596e77a84ab28 100644
--- a/public/_sources/V1_01.rst.txt
+++ b/public/_sources/V1_01.rst.txt
@@ -521,7 +521,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list.csv
+   :file: list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/public/_sources/V1_02.rst.txt b/public/_sources/V1_02.rst.txt
index facd94d9c002801d153e30985810659c0e46048c..ff4c42ece839b61930eb862d4e9f47edfec01d83 100644
--- a/public/_sources/V1_02.rst.txt
+++ b/public/_sources/V1_02.rst.txt
@@ -533,7 +533,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list - 1_02.csv
+   :file: list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/public/_static/underscore-1.13.1.js b/public/_static/underscore-1.13.1.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffd77af9648a47d389f2d6976d4aa1c44d7ce7ce
--- /dev/null
+++ b/public/_static/underscore-1.13.1.js
@@ -0,0 +1,2042 @@
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define('underscore', factory) :
+  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
+    var current = global._;
+    var exports = global._ = factory();
+    exports.noConflict = function () { global._ = current; return exports; };
+  }()));
+}(this, (function () {
+  //     Underscore.js 1.13.1
+  //     https://underscorejs.org
+  //     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+  //     Underscore may be freely distributed under the MIT license.
+
+  // Current version.
+  var VERSION = '1.13.1';
+
+  // Establish the root object, `window` (`self`) in the browser, `global`
+  // on the server, or `this` in some virtual machines. We use `self`
+  // instead of `window` for `WebWorker` support.
+  var root = typeof self == 'object' && self.self === self && self ||
+            typeof global == 'object' && global.global === global && global ||
+            Function('return this')() ||
+            {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var push = ArrayProto.push,
+      slice = ArrayProto.slice,
+      toString = ObjProto.toString,
+      hasOwnProperty = ObjProto.hasOwnProperty;
+
+  // Modern feature detection.
+  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+      supportsDataView = typeof DataView !== 'undefined';
+
+  // All **ECMAScript 5+** native function implementations that we hope to use
+  // are declared here.
+  var nativeIsArray = Array.isArray,
+      nativeKeys = Object.keys,
+      nativeCreate = Object.create,
+      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+  // Create references to these builtin functions because we override them.
+  var _isNaN = isNaN,
+      _isFinite = isFinite;
+
+  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+  // The largest integer that can be represented exactly.
+  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+  // Some functions take a variable number of arguments, or a few expected
+  // arguments at the beginning and then a variable number of values to operate
+  // on. This helper accumulates all remaining arguments past the function’s
+  // argument length (or an explicit `startIndex`), into an array that becomes
+  // the last argument. Similar to ES6’s "rest parameter".
+  function restArguments(func, startIndex) {
+    startIndex = startIndex == null ? func.length - 1 : +startIndex;
+    return function() {
+      var length = Math.max(arguments.length - startIndex, 0),
+          rest = Array(length),
+          index = 0;
+      for (; index < length; index++) {
+        rest[index] = arguments[index + startIndex];
+      }
+      switch (startIndex) {
+        case 0: return func.call(this, rest);
+        case 1: return func.call(this, arguments[0], rest);
+        case 2: return func.call(this, arguments[0], arguments[1], rest);
+      }
+      var args = Array(startIndex + 1);
+      for (index = 0; index < startIndex; index++) {
+        args[index] = arguments[index];
+      }
+      args[startIndex] = rest;
+      return func.apply(this, args);
+    };
+  }
+
+  // Is a given variable an object?
+  function isObject(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  }
+
+  // Is a given value equal to null?
+  function isNull(obj) {
+    return obj === null;
+  }
+
+  // Is a given variable undefined?
+  function isUndefined(obj) {
+    return obj === void 0;
+  }
+
+  // Is a given value a boolean?
+  function isBoolean(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  }
+
+  // Is a given value a DOM element?
+  function isElement(obj) {
+    return !!(obj && obj.nodeType === 1);
+  }
+
+  // Internal function for creating a `toString`-based type tester.
+  function tagTester(name) {
+    var tag = '[object ' + name + ']';
+    return function(obj) {
+      return toString.call(obj) === tag;
+    };
+  }
+
+  var isString = tagTester('String');
+
+  var isNumber = tagTester('Number');
+
+  var isDate = tagTester('Date');
+
+  var isRegExp = tagTester('RegExp');
+
+  var isError = tagTester('Error');
+
+  var isSymbol = tagTester('Symbol');
+
+  var isArrayBuffer = tagTester('ArrayBuffer');
+
+  var isFunction = tagTester('Function');
+
+  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+  var nodelist = root.document && root.document.childNodes;
+  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+    isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  var isFunction$1 = isFunction;
+
+  var hasObjectTag = tagTester('Object');
+
+  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+  // In IE 11, the most common among them, this problem also applies to
+  // `Map`, `WeakMap` and `Set`.
+  var hasStringTagBug = (
+        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+      ),
+      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+  var isDataView = tagTester('DataView');
+
+  // In IE 10 - Edge 13, we need a different heuristic
+  // to determine whether an object is a `DataView`.
+  function ie10IsDataView(obj) {
+    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+  }
+
+  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native `Array.isArray`.
+  var isArray = nativeIsArray || tagTester('Array');
+
+  // Internal function to check whether `key` is an own property name of `obj`.
+  function has$1(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  }
+
+  var isArguments = tagTester('Arguments');
+
+  // Define a fallback version of the method in browsers (ahem, IE < 9), where
+  // there isn't any inspectable "Arguments" type.
+  (function() {
+    if (!isArguments(arguments)) {
+      isArguments = function(obj) {
+        return has$1(obj, 'callee');
+      };
+    }
+  }());
+
+  var isArguments$1 = isArguments;
+
+  // Is a given object a finite number?
+  function isFinite$1(obj) {
+    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+  }
+
+  // Is the given value `NaN`?
+  function isNaN$1(obj) {
+    return isNumber(obj) && _isNaN(obj);
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function constant(value) {
+    return function() {
+      return value;
+    };
+  }
+
+  // Common internal logic for `isArrayLike` and `isBufferLike`.
+  function createSizePropertyCheck(getSizeProperty) {
+    return function(collection) {
+      var sizeProperty = getSizeProperty(collection);
+      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+    }
+  }
+
+  // Internal helper to generate a function to obtain property `key` from `obj`.
+  function shallowProperty(key) {
+    return function(obj) {
+      return obj == null ? void 0 : obj[key];
+    };
+  }
+
+  // Internal helper to obtain the `byteLength` property of an object.
+  var getByteLength = shallowProperty('byteLength');
+
+  // Internal helper to determine whether we should spend extensive checks against
+  // `ArrayBuffer` et al.
+  var isBufferLike = createSizePropertyCheck(getByteLength);
+
+  // Is a given value a typed array?
+  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+  function isTypedArray(obj) {
+    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+    // Otherwise, fall back on the above regular expression.
+    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+  }
+
+  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+  // Internal helper to obtain the `length` property of an object.
+  var getLength = shallowProperty('length');
+
+  // Internal helper to create a simple lookup structure.
+  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+  // circular imports. `emulatedSet` is a one-off solution that only works for
+  // arrays of strings.
+  function emulatedSet(keys) {
+    var hash = {};
+    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+    return {
+      contains: function(key) { return hash[key]; },
+      push: function(key) {
+        hash[key] = true;
+        return keys.push(key);
+      }
+    };
+  }
+
+  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+  // needed.
+  function collectNonEnumProps(obj, keys) {
+    keys = emulatedSet(keys);
+    var nonEnumIdx = nonEnumerableProps.length;
+    var constructor = obj.constructor;
+    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+    // Constructor is a special case.
+    var prop = 'constructor';
+    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+    while (nonEnumIdx--) {
+      prop = nonEnumerableProps[nonEnumIdx];
+      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+        keys.push(prop);
+      }
+    }
+  }
+
+  // Retrieve the names of an object's own properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`.
+  function keys(obj) {
+    if (!isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (has$1(obj, key)) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  function isEmpty(obj) {
+    if (obj == null) return true;
+    // Skip the more expensive `toString`-based type checks if `obj` has no
+    // `.length`.
+    var length = getLength(obj);
+    if (typeof length == 'number' && (
+      isArray(obj) || isString(obj) || isArguments$1(obj)
+    )) return length === 0;
+    return getLength(keys(obj)) === 0;
+  }
+
+  // Returns whether an object has a given set of `key:value` pairs.
+  function isMatch(object, attrs) {
+    var _keys = keys(attrs), length = _keys.length;
+    if (object == null) return !length;
+    var obj = Object(object);
+    for (var i = 0; i < length; i++) {
+      var key = _keys[i];
+      if (attrs[key] !== obj[key] || !(key in obj)) return false;
+    }
+    return true;
+  }
+
+  // If Underscore is called as a function, it returns a wrapped object that can
+  // be used OO-style. This wrapper holds altered versions of all functions added
+  // through `_.mixin`. Wrapped objects may be chained.
+  function _$1(obj) {
+    if (obj instanceof _$1) return obj;
+    if (!(this instanceof _$1)) return new _$1(obj);
+    this._wrapped = obj;
+  }
+
+  _$1.VERSION = VERSION;
+
+  // Extracts the result from a wrapped and chained object.
+  _$1.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // Provide unwrapping proxies for some methods used in engine operations
+  // such as arithmetic and JSON stringification.
+  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
+
+  _$1.prototype.toString = function() {
+    return String(this._wrapped);
+  };
+
+  // Internal function to wrap or shallow-copy an ArrayBuffer,
+  // typed array or DataView to a new view, reusing the buffer.
+  function toBufferView(bufferSource) {
+    return new Uint8Array(
+      bufferSource.buffer || bufferSource,
+      bufferSource.byteOffset || 0,
+      getByteLength(bufferSource)
+    );
+  }
+
+  // We use this string twice, so give it a name for minification.
+  var tagDataView = '[object DataView]';
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function eq(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // `null` or `undefined` only equal to itself (strict comparison).
+    if (a == null || b == null) return false;
+    // `NaN`s are equivalent, but non-reflexive.
+    if (a !== a) return b !== b;
+    // Exhaust primitive checks
+    var type = typeof a;
+    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+    return deepEq(a, b, aStack, bStack);
+  }
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function deepEq(a, b, aStack, bStack) {
+    // Unwrap any wrapped objects.
+    if (a instanceof _$1) a = a._wrapped;
+    if (b instanceof _$1) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    // Work around a bug in IE 10 - Edge 13.
+    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+      if (!isDataView$1(b)) return false;
+      className = tagDataView;
+    }
+    switch (className) {
+      // These types are compared by value.
+      case '[object RegExp]':
+        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN.
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+      case '[object Symbol]':
+        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+      case '[object ArrayBuffer]':
+      case tagDataView:
+        // Coerce to typed array so we can fall through.
+        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+    }
+
+    var areArrays = className === '[object Array]';
+    if (!areArrays && isTypedArray$1(a)) {
+        var byteLength = getByteLength(a);
+        if (byteLength !== getByteLength(b)) return false;
+        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+        areArrays = true;
+    }
+    if (!areArrays) {
+      if (typeof a != 'object' || typeof b != 'object') return false;
+
+      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+                               isFunction$1(bCtor) && bCtor instanceof bCtor)
+                          && ('constructor' in a && 'constructor' in b)) {
+        return false;
+      }
+    }
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+    // Initializing stack of traversed objects.
+    // It's done here since we only need them for objects and arrays comparison.
+    aStack = aStack || [];
+    bStack = bStack || [];
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+
+    // Recursively compare objects and arrays.
+    if (areArrays) {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      length = a.length;
+      if (length !== b.length) return false;
+      // Deep compare the contents, ignoring non-numeric properties.
+      while (length--) {
+        if (!eq(a[length], b[length], aStack, bStack)) return false;
+      }
+    } else {
+      // Deep compare objects.
+      var _keys = keys(a), key;
+      length = _keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      if (keys(b).length !== length) return false;
+      while (length--) {
+        // Deep compare each member
+        key = _keys[length];
+        if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return true;
+  }
+
+  // Perform a deep comparison to check if two objects are equal.
+  function isEqual(a, b) {
+    return eq(a, b);
+  }
+
+  // Retrieve all the enumerable property names of an object.
+  function allKeys(obj) {
+    if (!isObject(obj)) return [];
+    var keys = [];
+    for (var key in obj) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Since the regular `Object.prototype.toString` type tests don't work for
+  // some types in IE 11, we use a fingerprinting heuristic instead, based
+  // on the methods. It's not great, but it's the best we got.
+  // The fingerprint method lists are defined below.
+  function ie11fingerprint(methods) {
+    var length = getLength(methods);
+    return function(obj) {
+      if (obj == null) return false;
+      // `Map`, `WeakMap` and `Set` have no enumerable keys.
+      var keys = allKeys(obj);
+      if (getLength(keys)) return false;
+      for (var i = 0; i < length; i++) {
+        if (!isFunction$1(obj[methods[i]])) return false;
+      }
+      // If we are testing against `WeakMap`, we need to ensure that
+      // `obj` doesn't have a `forEach` method in order to distinguish
+      // it from a regular `Map`.
+      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+    };
+  }
+
+  // In the interest of compact minification, we write
+  // each string in the fingerprints only once.
+  var forEachName = 'forEach',
+      hasName = 'has',
+      commonInit = ['clear', 'delete'],
+      mapTail = ['get', hasName, 'set'];
+
+  // `Map`, `WeakMap` and `Set` each have slightly different
+  // combinations of the above sublists.
+  var mapMethods = commonInit.concat(forEachName, mapTail),
+      weakMapMethods = commonInit.concat(mapTail),
+      setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+  var isWeakSet = tagTester('WeakSet');
+
+  // Retrieve the values of an object's properties.
+  function values(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[_keys[i]];
+    }
+    return values;
+  }
+
+  // Convert an object into a list of `[key, value]` pairs.
+  // The opposite of `_.object` with one argument.
+  function pairs(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [_keys[i], obj[_keys[i]]];
+    }
+    return pairs;
+  }
+
+  // Invert the keys and values of an object. The values must be serializable.
+  function invert(obj) {
+    var result = {};
+    var _keys = keys(obj);
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      result[obj[_keys[i]]] = _keys[i];
+    }
+    return result;
+  }
+
+  // Return a sorted list of the function names available on the object.
+  function functions(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (isFunction$1(obj[key])) names.push(key);
+    }
+    return names.sort();
+  }
+
+  // An internal function for creating assigner functions.
+  function createAssigner(keysFunc, defaults) {
+    return function(obj) {
+      var length = arguments.length;
+      if (defaults) obj = Object(obj);
+      if (length < 2 || obj == null) return obj;
+      for (var index = 1; index < length; index++) {
+        var source = arguments[index],
+            keys = keysFunc(source),
+            l = keys.length;
+        for (var i = 0; i < l; i++) {
+          var key = keys[i];
+          if (!defaults || obj[key] === void 0) obj[key] = source[key];
+        }
+      }
+      return obj;
+    };
+  }
+
+  // Extend a given object with all the properties in passed-in object(s).
+  var extend = createAssigner(allKeys);
+
+  // Assigns a given object with all the own properties in the passed-in
+  // object(s).
+  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+  var extendOwn = createAssigner(keys);
+
+  // Fill in a given object with default properties.
+  var defaults = createAssigner(allKeys, true);
+
+  // Create a naked function reference for surrogate-prototype-swapping.
+  function ctor() {
+    return function(){};
+  }
+
+  // An internal function for creating a new object that inherits from another.
+  function baseCreate(prototype) {
+    if (!isObject(prototype)) return {};
+    if (nativeCreate) return nativeCreate(prototype);
+    var Ctor = ctor();
+    Ctor.prototype = prototype;
+    var result = new Ctor;
+    Ctor.prototype = null;
+    return result;
+  }
+
+  // Creates an object that inherits from the given prototype object.
+  // If additional properties are provided then they will be added to the
+  // created object.
+  function create(prototype, props) {
+    var result = baseCreate(prototype);
+    if (props) extendOwn(result, props);
+    return result;
+  }
+
+  // Create a (shallow-cloned) duplicate of an object.
+  function clone(obj) {
+    if (!isObject(obj)) return obj;
+    return isArray(obj) ? obj.slice() : extend({}, obj);
+  }
+
+  // Invokes `interceptor` with the `obj` and then returns `obj`.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  function tap(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  }
+
+  // Normalize a (deep) property `path` to array.
+  // Like `_.iteratee`, this function can be customized.
+  function toPath$1(path) {
+    return isArray(path) ? path : [path];
+  }
+  _$1.toPath = toPath$1;
+
+  // Internal wrapper for `_.toPath` to enable minification.
+  // Similar to `cb` for `_.iteratee`.
+  function toPath(path) {
+    return _$1.toPath(path);
+  }
+
+  // Internal function to obtain a nested property in `obj` along `path`.
+  function deepGet(obj, path) {
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      if (obj == null) return void 0;
+      obj = obj[path[i]];
+    }
+    return length ? obj : void 0;
+  }
+
+  // Get the value of the (deep) property on `path` from `object`.
+  // If any property in `path` does not exist or if the value is
+  // `undefined`, return `defaultValue` instead.
+  // The `path` is normalized through `_.toPath`.
+  function get(object, path, defaultValue) {
+    var value = deepGet(object, toPath(path));
+    return isUndefined(value) ? defaultValue : value;
+  }
+
+  // Shortcut function for checking if an object has a given property directly on
+  // itself (in other words, not on a prototype). Unlike the internal `has`
+  // function, this public version can also traverse nested properties.
+  function has(obj, path) {
+    path = toPath(path);
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      var key = path[i];
+      if (!has$1(obj, key)) return false;
+      obj = obj[key];
+    }
+    return !!length;
+  }
+
+  // Keep the identity function around for default iteratees.
+  function identity(value) {
+    return value;
+  }
+
+  // Returns a predicate for checking whether an object has a given set of
+  // `key:value` pairs.
+  function matcher(attrs) {
+    attrs = extendOwn({}, attrs);
+    return function(obj) {
+      return isMatch(obj, attrs);
+    };
+  }
+
+  // Creates a function that, when passed an object, will traverse that object’s
+  // properties down the given `path`, specified as an array of keys or indices.
+  function property(path) {
+    path = toPath(path);
+    return function(obj) {
+      return deepGet(obj, path);
+    };
+  }
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  function optimizeCb(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      // The 2-argument case is omitted because we’re not using it.
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  }
+
+  // An internal function to generate callbacks that can be applied to each
+  // element in a collection, returning the desired result — either `_.identity`,
+  // an arbitrary callback, a property matcher, or a property accessor.
+  function baseIteratee(value, context, argCount) {
+    if (value == null) return identity;
+    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+    if (isObject(value) && !isArray(value)) return matcher(value);
+    return property(value);
+  }
+
+  // External wrapper for our callback generator. Users may customize
+  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+  // This abstraction hides the internal-only `argCount` argument.
+  function iteratee(value, context) {
+    return baseIteratee(value, context, Infinity);
+  }
+  _$1.iteratee = iteratee;
+
+  // The function we call internally to generate a callback. It invokes
+  // `_.iteratee` if overridden, otherwise `baseIteratee`.
+  function cb(value, context, argCount) {
+    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
+    return baseIteratee(value, context, argCount);
+  }
+
+  // Returns the results of applying the `iteratee` to each element of `obj`.
+  // In contrast to `_.map` it returns an object.
+  function mapObject(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = keys(obj),
+        length = _keys.length,
+        results = {};
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys[index];
+      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function noop(){}
+
+  // Generates a function for a given object that returns a given property.
+  function propertyOf(obj) {
+    if (obj == null) return noop;
+    return function(path) {
+      return get(obj, path);
+    };
+  }
+
+  // Run a function **n** times.
+  function times(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = optimizeCb(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  }
+
+  // Return a random integer between `min` and `max` (inclusive).
+  function random(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  }
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  var now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+  // Internal helper to generate functions for escaping and unescaping strings
+  // to/from HTML interpolation.
+  function createEscaper(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped.
+    var source = '(?:' + keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  }
+
+  // Internal list of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+
+  // Function for escaping strings to HTML interpolation.
+  var _escape = createEscaper(escapeMap);
+
+  // Internal list of HTML entities for unescaping.
+  var unescapeMap = invert(escapeMap);
+
+  // Function for unescaping strings from HTML interpolation.
+  var _unescape = createEscaper(unescapeMap);
+
+  // By default, Underscore uses ERB-style template delimiters. Change the
+  // following template settings to use alternative delimiters.
+  var templateSettings = _$1.templateSettings = {
+    evaluate: /<%([\s\S]+?)%>/g,
+    interpolate: /<%=([\s\S]+?)%>/g,
+    escape: /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `_.templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'": "'",
+    '\\': '\\',
+    '\r': 'r',
+    '\n': 'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  function escapeChar(match) {
+    return '\\' + escapes[match];
+  }
+
+  // In order to prevent third-party code injection through
+  // `_.templateSettings.variable`, we test it against the following regular
+  // expression. It is intentionally a bit more liberal than just matching valid
+  // identifiers, but still prevents possible loopholes through defaults or
+  // destructuring assignment.
+  var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  function template(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = defaults({}, settings, _$1.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offset.
+      return match;
+    });
+    source += "';\n";
+
+    var argument = settings.variable;
+    if (argument) {
+      // Insure against third-party code injection. (CVE-2021-23358)
+      if (!bareIdentifier.test(argument)) throw new Error(
+        'variable is not a bare identifier: ' + argument
+      );
+    } else {
+      // If a variable is not specified, place data values in local scope.
+      source = 'with(obj||{}){\n' + source + '}\n';
+      argument = 'obj';
+    }
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    var render;
+    try {
+      render = new Function(argument, '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _$1);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  }
+
+  // Traverses the children of `obj` along `path`. If a child is a function, it
+  // is invoked with its parent as context. Returns the value of the final
+  // child, or `fallback` if any child is undefined.
+  function result(obj, path, fallback) {
+    path = toPath(path);
+    var length = path.length;
+    if (!length) {
+      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+    }
+    for (var i = 0; i < length; i++) {
+      var prop = obj == null ? void 0 : obj[path[i]];
+      if (prop === void 0) {
+        prop = fallback;
+        i = length; // Ensure we don't continue iterating.
+      }
+      obj = isFunction$1(prop) ? prop.call(obj) : prop;
+    }
+    return obj;
+  }
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  function uniqueId(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  }
+
+  // Start chaining a wrapped Underscore object.
+  function chain(obj) {
+    var instance = _$1(obj);
+    instance._chain = true;
+    return instance;
+  }
+
+  // Internal function to execute `sourceFunc` bound to `context` with optional
+  // `args`. Determines whether to execute a function as a constructor or as a
+  // normal function.
+  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+    var self = baseCreate(sourceFunc.prototype);
+    var result = sourceFunc.apply(self, args);
+    if (isObject(result)) return result;
+    return self;
+  }
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+  // as a placeholder by default, allowing any combination of arguments to be
+  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+  var partial = restArguments(function(func, boundArgs) {
+    var placeholder = partial.placeholder;
+    var bound = function() {
+      var position = 0, length = boundArgs.length;
+      var args = Array(length);
+      for (var i = 0; i < length; i++) {
+        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return executeBound(func, bound, this, this, args);
+    };
+    return bound;
+  });
+
+  partial.placeholder = _$1;
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally).
+  var bind = restArguments(function(func, context, args) {
+    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+    var bound = restArguments(function(callArgs) {
+      return executeBound(func, bound, context, this, args.concat(callArgs));
+    });
+    return bound;
+  });
+
+  // Internal helper for collection methods to determine whether a collection
+  // should be iterated as an array or as an object.
+  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+  var isArrayLike = createSizePropertyCheck(getLength);
+
+  // Internal implementation of a recursive `flatten` function.
+  function flatten$1(input, depth, strict, output) {
+    output = output || [];
+    if (!depth && depth !== 0) {
+      depth = Infinity;
+    } else if (depth <= 0) {
+      return output.concat(input);
+    }
+    var idx = output.length;
+    for (var i = 0, length = getLength(input); i < length; i++) {
+      var value = input[i];
+      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+        // Flatten current level of array or arguments object.
+        if (depth > 1) {
+          flatten$1(value, depth - 1, strict, output);
+          idx = output.length;
+        } else {
+          var j = 0, len = value.length;
+          while (j < len) output[idx++] = value[j++];
+        }
+      } else if (!strict) {
+        output[idx++] = value;
+      }
+    }
+    return output;
+  }
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  var bindAll = restArguments(function(obj, keys) {
+    keys = flatten$1(keys, false, false);
+    var index = keys.length;
+    if (index < 1) throw new Error('bindAll must be passed function names');
+    while (index--) {
+      var key = keys[index];
+      obj[key] = bind(obj[key], obj);
+    }
+    return obj;
+  });
+
+  // Memoize an expensive function by storing its results.
+  function memoize(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  }
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  var delay = restArguments(function(func, wait, args) {
+    return setTimeout(function() {
+      return func.apply(null, args);
+    }, wait);
+  });
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  var defer = partial(delay, _$1, 1);
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  function throttle(func, wait, options) {
+    var timeout, context, args, result;
+    var previous = 0;
+    if (!options) options = {};
+
+    var later = function() {
+      previous = options.leading === false ? 0 : now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+
+    var throttled = function() {
+      var _now = now();
+      if (!previous && options.leading === false) previous = _now;
+      var remaining = wait - (_now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        if (timeout) {
+          clearTimeout(timeout);
+          timeout = null;
+        }
+        previous = _now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+
+    throttled.cancel = function() {
+      clearTimeout(timeout);
+      previous = 0;
+      timeout = context = args = null;
+    };
+
+    return throttled;
+  }
+
+  // When a sequence of calls of the returned function ends, the argument
+  // function is triggered. The end of a sequence is defined by the `wait`
+  // parameter. If `immediate` is passed, the argument function will be
+  // triggered at the beginning of the sequence instead of at the end.
+  function debounce(func, wait, immediate) {
+    var timeout, previous, args, result, context;
+
+    var later = function() {
+      var passed = now() - previous;
+      if (wait > passed) {
+        timeout = setTimeout(later, wait - passed);
+      } else {
+        timeout = null;
+        if (!immediate) result = func.apply(context, args);
+        // This check is needed because `func` can recursively invoke `debounced`.
+        if (!timeout) args = context = null;
+      }
+    };
+
+    var debounced = restArguments(function(_args) {
+      context = this;
+      args = _args;
+      previous = now();
+      if (!timeout) {
+        timeout = setTimeout(later, wait);
+        if (immediate) result = func.apply(context, args);
+      }
+      return result;
+    });
+
+    debounced.cancel = function() {
+      clearTimeout(timeout);
+      timeout = args = context = null;
+    };
+
+    return debounced;
+  }
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  function wrap(func, wrapper) {
+    return partial(wrapper, func);
+  }
+
+  // Returns a negated version of the passed-in predicate.
+  function negate(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  }
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  function compose() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  }
+
+  // Returns a function that will only be executed on and after the Nth call.
+  function after(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  }
+
+  // Returns a function that will only be executed up to (but not including) the
+  // Nth call.
+  function before(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      }
+      if (times <= 1) func = null;
+      return memo;
+    };
+  }
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  var once = partial(before, 2);
+
+  // Returns the first key on an object that passes a truth test.
+  function findKey(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = keys(obj), key;
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      key = _keys[i];
+      if (predicate(obj[key], key, obj)) return key;
+    }
+  }
+
+  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+  function createPredicateIndexFinder(dir) {
+    return function(array, predicate, context) {
+      predicate = cb(predicate, context);
+      var length = getLength(array);
+      var index = dir > 0 ? 0 : length - 1;
+      for (; index >= 0 && index < length; index += dir) {
+        if (predicate(array[index], index, array)) return index;
+      }
+      return -1;
+    };
+  }
+
+  // Returns the first index on an array-like that passes a truth test.
+  var findIndex = createPredicateIndexFinder(1);
+
+  // Returns the last index on an array-like that passes a truth test.
+  var findLastIndex = createPredicateIndexFinder(-1);
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  function sortedIndex(array, obj, iteratee, context) {
+    iteratee = cb(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = getLength(array);
+    while (low < high) {
+      var mid = Math.floor((low + high) / 2);
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  }
+
+  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+  function createIndexFinder(dir, predicateFind, sortedIndex) {
+    return function(array, item, idx) {
+      var i = 0, length = getLength(array);
+      if (typeof idx == 'number') {
+        if (dir > 0) {
+          i = idx >= 0 ? idx : Math.max(idx + length, i);
+        } else {
+          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        }
+      } else if (sortedIndex && idx && length) {
+        idx = sortedIndex(array, item);
+        return array[idx] === item ? idx : -1;
+      }
+      if (item !== item) {
+        idx = predicateFind(slice.call(array, i, length), isNaN$1);
+        return idx >= 0 ? idx + i : -1;
+      }
+      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+        if (array[idx] === item) return idx;
+      }
+      return -1;
+    };
+  }
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+  // Return the position of the last occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+  // Return the first value which passes a truth test.
+  function find(obj, predicate, context) {
+    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+    var key = keyFinder(obj, predicate, context);
+    if (key !== void 0 && key !== -1) return obj[key];
+  }
+
+  // Convenience version of a common use case of `_.find`: getting the first
+  // object containing specific `key:value` pairs.
+  function findWhere(obj, attrs) {
+    return find(obj, matcher(attrs));
+  }
+
+  // The cornerstone for collection functions, an `each`
+  // implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  function each(obj, iteratee, context) {
+    iteratee = optimizeCb(iteratee, context);
+    var i, length;
+    if (isArrayLike(obj)) {
+      for (i = 0, length = obj.length; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var _keys = keys(obj);
+      for (i = 0, length = _keys.length; i < length; i++) {
+        iteratee(obj[_keys[i]], _keys[i], obj);
+      }
+    }
+    return obj;
+  }
+
+  // Return the results of applying the iteratee to each element.
+  function map(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length,
+        results = Array(length);
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Internal helper to create a reducing function, iterating left or right.
+  function createReduce(dir) {
+    // Wrap code that reassigns argument variables in a separate function than
+    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+    var reducer = function(obj, iteratee, memo, initial) {
+      var _keys = !isArrayLike(obj) && keys(obj),
+          length = (_keys || obj).length,
+          index = dir > 0 ? 0 : length - 1;
+      if (!initial) {
+        memo = obj[_keys ? _keys[index] : index];
+        index += dir;
+      }
+      for (; index >= 0 && index < length; index += dir) {
+        var currentKey = _keys ? _keys[index] : index;
+        memo = iteratee(memo, obj[currentKey], currentKey, obj);
+      }
+      return memo;
+    };
+
+    return function(obj, iteratee, memo, context) {
+      var initial = arguments.length >= 3;
+      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+    };
+  }
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  var reduce = createReduce(1);
+
+  // The right-associative version of reduce, also known as `foldr`.
+  var reduceRight = createReduce(-1);
+
+  // Return all the elements that pass a truth test.
+  function filter(obj, predicate, context) {
+    var results = [];
+    predicate = cb(predicate, context);
+    each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  }
+
+  // Return all the elements for which a truth test fails.
+  function reject(obj, predicate, context) {
+    return filter(obj, negate(cb(predicate)), context);
+  }
+
+  // Determine whether all of the elements pass a truth test.
+  function every(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  }
+
+  // Determine if at least one element in the object passes a truth test.
+  function some(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  }
+
+  // Determine if the array or object contains a given item (using `===`).
+  function contains(obj, item, fromIndex, guard) {
+    if (!isArrayLike(obj)) obj = values(obj);
+    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+    return indexOf(obj, item, fromIndex) >= 0;
+  }
+
+  // Invoke a method (with arguments) on every item in a collection.
+  var invoke = restArguments(function(obj, path, args) {
+    var contextPath, func;
+    if (isFunction$1(path)) {
+      func = path;
+    } else {
+      path = toPath(path);
+      contextPath = path.slice(0, -1);
+      path = path[path.length - 1];
+    }
+    return map(obj, function(context) {
+      var method = func;
+      if (!method) {
+        if (contextPath && contextPath.length) {
+          context = deepGet(context, contextPath);
+        }
+        if (context == null) return void 0;
+        method = context[path];
+      }
+      return method == null ? method : method.apply(context, args);
+    });
+  });
+
+  // Convenience version of a common use case of `_.map`: fetching a property.
+  function pluck(obj, key) {
+    return map(obj, property(key));
+  }
+
+  // Convenience version of a common use case of `_.filter`: selecting only
+  // objects containing specific `key:value` pairs.
+  function where(obj, attrs) {
+    return filter(obj, matcher(attrs));
+  }
+
+  // Return the maximum element (or element-based computation).
+  function max(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Return the minimum element (or element-based computation).
+  function min(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Sample **n** random values from a collection using the modern version of the
+  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `_.map`.
+  function sample(obj, n, guard) {
+    if (n == null || guard) {
+      if (!isArrayLike(obj)) obj = values(obj);
+      return obj[random(obj.length - 1)];
+    }
+    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+    var length = getLength(sample);
+    n = Math.max(Math.min(n, length), 0);
+    var last = length - 1;
+    for (var index = 0; index < n; index++) {
+      var rand = random(index, last);
+      var temp = sample[index];
+      sample[index] = sample[rand];
+      sample[rand] = temp;
+    }
+    return sample.slice(0, n);
+  }
+
+  // Shuffle a collection.
+  function shuffle(obj) {
+    return sample(obj, Infinity);
+  }
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  function sortBy(obj, iteratee, context) {
+    var index = 0;
+    iteratee = cb(iteratee, context);
+    return pluck(map(obj, function(value, key, list) {
+      return {
+        value: value,
+        index: index++,
+        criteria: iteratee(value, key, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  }
+
+  // An internal function used for aggregate "group by" operations.
+  function group(behavior, partition) {
+    return function(obj, iteratee, context) {
+      var result = partition ? [[], []] : {};
+      iteratee = cb(iteratee, context);
+      each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  }
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  var groupBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+  // when you know that your index values will be unique.
+  var indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  var countBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Split a collection into two arrays: one whose elements all pass the given
+  // truth test, and one whose elements all do not pass the truth test.
+  var partition = group(function(result, value, pass) {
+    result[pass ? 0 : 1].push(value);
+  }, true);
+
+  // Safely create a real, live array from anything iterable.
+  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+  function toArray(obj) {
+    if (!obj) return [];
+    if (isArray(obj)) return slice.call(obj);
+    if (isString(obj)) {
+      // Keep surrogate pair characters together.
+      return obj.match(reStrSymbol);
+    }
+    if (isArrayLike(obj)) return map(obj, identity);
+    return values(obj);
+  }
+
+  // Return the number of elements in a collection.
+  function size(obj) {
+    if (obj == null) return 0;
+    return isArrayLike(obj) ? obj.length : keys(obj).length;
+  }
+
+  // Internal `_.pick` helper function to determine whether `key` is an enumerable
+  // property name of `obj`.
+  function keyInObj(value, key, obj) {
+    return key in obj;
+  }
+
+  // Return a copy of the object only containing the allowed properties.
+  var pick = restArguments(function(obj, keys) {
+    var result = {}, iteratee = keys[0];
+    if (obj == null) return result;
+    if (isFunction$1(iteratee)) {
+      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+      keys = allKeys(obj);
+    } else {
+      iteratee = keyInObj;
+      keys = flatten$1(keys, false, false);
+      obj = Object(obj);
+    }
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = keys[i];
+      var value = obj[key];
+      if (iteratee(value, key, obj)) result[key] = value;
+    }
+    return result;
+  });
+
+  // Return a copy of the object without the disallowed properties.
+  var omit = restArguments(function(obj, keys) {
+    var iteratee = keys[0], context;
+    if (isFunction$1(iteratee)) {
+      iteratee = negate(iteratee);
+      if (keys.length > 1) context = keys[1];
+    } else {
+      keys = map(flatten$1(keys, false, false), String);
+      iteratee = function(value, key) {
+        return !contains(keys, key);
+      };
+    }
+    return pick(obj, iteratee, context);
+  });
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N.
+  function initial(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  }
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  function first(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[0];
+    return initial(array, array.length - n);
+  }
+
+  // Returns everything but the first entry of the `array`. Especially useful on
+  // the `arguments` object. Passing an **n** will return the rest N values in the
+  // `array`.
+  function rest(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  }
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array.
+  function last(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[array.length - 1];
+    return rest(array, Math.max(0, array.length - n));
+  }
+
+  // Trim out all falsy values from an array.
+  function compact(array) {
+    return filter(array, Boolean);
+  }
+
+  // Flatten out an array, either recursively (by default), or up to `depth`.
+  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+  function flatten(array, depth) {
+    return flatten$1(array, depth, false);
+  }
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  var difference = restArguments(function(array, rest) {
+    rest = flatten$1(rest, true, true);
+    return filter(array, function(value){
+      return !contains(rest, value);
+    });
+  });
+
+  // Return a version of the array that does not contain the specified value(s).
+  var without = restArguments(function(array, otherArrays) {
+    return difference(array, otherArrays);
+  });
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // The faster algorithm will not work with an iteratee if the iteratee
+  // is not a one-to-one function, so providing an iteratee will disable
+  // the faster algorithm.
+  function uniq(array, isSorted, iteratee, context) {
+    if (!isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = cb(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var value = array[i],
+          computed = iteratee ? iteratee(value, i, array) : value;
+      if (isSorted && !iteratee) {
+        if (!i || seen !== computed) result.push(value);
+        seen = computed;
+      } else if (iteratee) {
+        if (!contains(seen, computed)) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (!contains(result, value)) {
+        result.push(value);
+      }
+    }
+    return result;
+  }
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  var union = restArguments(function(arrays) {
+    return uniq(flatten$1(arrays, true, true));
+  });
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  function intersection(array) {
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var item = array[i];
+      if (contains(result, item)) continue;
+      var j;
+      for (j = 1; j < argsLength; j++) {
+        if (!contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  }
+
+  // Complement of zip. Unzip accepts an array of arrays and groups
+  // each array's elements on shared indices.
+  function unzip(array) {
+    var length = array && max(array, getLength).length || 0;
+    var result = Array(length);
+
+    for (var index = 0; index < length; index++) {
+      result[index] = pluck(array, index);
+    }
+    return result;
+  }
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  var zip = restArguments(unzip);
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+  function object(list, values) {
+    var result = {};
+    for (var i = 0, length = getLength(list); i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  }
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](https://docs.python.org/library/functions.html#range).
+  function range(start, stop, step) {
+    if (stop == null) {
+      stop = start || 0;
+      start = 0;
+    }
+    if (!step) {
+      step = stop < start ? -1 : 1;
+    }
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  }
+
+  // Chunk a single array into multiple arrays, each containing `count` or fewer
+  // items.
+  function chunk(array, count) {
+    if (count == null || count < 1) return [];
+    var result = [];
+    var i = 0, length = array.length;
+    while (i < length) {
+      result.push(slice.call(array, i, i += count));
+    }
+    return result;
+  }
+
+  // Helper function to continue chaining intermediate results.
+  function chainResult(instance, obj) {
+    return instance._chain ? _$1(obj).chain() : obj;
+  }
+
+  // Add your own custom functions to the Underscore object.
+  function mixin(obj) {
+    each(functions(obj), function(name) {
+      var func = _$1[name] = obj[name];
+      _$1.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return chainResult(this, func.apply(_$1, args));
+      };
+    });
+    return _$1;
+  }
+
+  // Add all mutator `Array` functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) {
+        method.apply(obj, arguments);
+        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+          delete obj[0];
+        }
+      }
+      return chainResult(this, obj);
+    };
+  });
+
+  // Add all accessor `Array` functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) obj = method.apply(obj, arguments);
+      return chainResult(this, obj);
+    };
+  });
+
+  // Named Exports
+
+  var allExports = {
+    __proto__: null,
+    VERSION: VERSION,
+    restArguments: restArguments,
+    isObject: isObject,
+    isNull: isNull,
+    isUndefined: isUndefined,
+    isBoolean: isBoolean,
+    isElement: isElement,
+    isString: isString,
+    isNumber: isNumber,
+    isDate: isDate,
+    isRegExp: isRegExp,
+    isError: isError,
+    isSymbol: isSymbol,
+    isArrayBuffer: isArrayBuffer,
+    isDataView: isDataView$1,
+    isArray: isArray,
+    isFunction: isFunction$1,
+    isArguments: isArguments$1,
+    isFinite: isFinite$1,
+    isNaN: isNaN$1,
+    isTypedArray: isTypedArray$1,
+    isEmpty: isEmpty,
+    isMatch: isMatch,
+    isEqual: isEqual,
+    isMap: isMap,
+    isWeakMap: isWeakMap,
+    isSet: isSet,
+    isWeakSet: isWeakSet,
+    keys: keys,
+    allKeys: allKeys,
+    values: values,
+    pairs: pairs,
+    invert: invert,
+    functions: functions,
+    methods: functions,
+    extend: extend,
+    extendOwn: extendOwn,
+    assign: extendOwn,
+    defaults: defaults,
+    create: create,
+    clone: clone,
+    tap: tap,
+    get: get,
+    has: has,
+    mapObject: mapObject,
+    identity: identity,
+    constant: constant,
+    noop: noop,
+    toPath: toPath$1,
+    property: property,
+    propertyOf: propertyOf,
+    matcher: matcher,
+    matches: matcher,
+    times: times,
+    random: random,
+    now: now,
+    escape: _escape,
+    unescape: _unescape,
+    templateSettings: templateSettings,
+    template: template,
+    result: result,
+    uniqueId: uniqueId,
+    chain: chain,
+    iteratee: iteratee,
+    partial: partial,
+    bind: bind,
+    bindAll: bindAll,
+    memoize: memoize,
+    delay: delay,
+    defer: defer,
+    throttle: throttle,
+    debounce: debounce,
+    wrap: wrap,
+    negate: negate,
+    compose: compose,
+    after: after,
+    before: before,
+    once: once,
+    findKey: findKey,
+    findIndex: findIndex,
+    findLastIndex: findLastIndex,
+    sortedIndex: sortedIndex,
+    indexOf: indexOf,
+    lastIndexOf: lastIndexOf,
+    find: find,
+    detect: find,
+    findWhere: findWhere,
+    each: each,
+    forEach: each,
+    map: map,
+    collect: map,
+    reduce: reduce,
+    foldl: reduce,
+    inject: reduce,
+    reduceRight: reduceRight,
+    foldr: reduceRight,
+    filter: filter,
+    select: filter,
+    reject: reject,
+    every: every,
+    all: every,
+    some: some,
+    any: some,
+    contains: contains,
+    includes: contains,
+    include: contains,
+    invoke: invoke,
+    pluck: pluck,
+    where: where,
+    max: max,
+    min: min,
+    shuffle: shuffle,
+    sample: sample,
+    sortBy: sortBy,
+    groupBy: groupBy,
+    indexBy: indexBy,
+    countBy: countBy,
+    partition: partition,
+    toArray: toArray,
+    size: size,
+    pick: pick,
+    omit: omit,
+    first: first,
+    head: first,
+    take: first,
+    initial: initial,
+    last: last,
+    rest: rest,
+    tail: rest,
+    drop: rest,
+    compact: compact,
+    flatten: flatten,
+    without: without,
+    uniq: uniq,
+    unique: uniq,
+    union: union,
+    intersection: intersection,
+    difference: difference,
+    unzip: unzip,
+    transpose: unzip,
+    zip: zip,
+    object: object,
+    range: range,
+    chunk: chunk,
+    mixin: mixin,
+    'default': _$1
+  };
+
+  // Default Export
+
+  // Add all of the Underscore functions to the wrapper object.
+  var _ = mixin(allExports);
+  // Legacy Node.js API.
+  _._ = _;
+
+  return _;
+
+})));
+//# sourceMappingURL=underscore-umd.js.map
diff --git a/public/index.html b/public/index.html
index b3a51168f849a36a8fb3401a1e8af0ec0854e187..218bf292e517ef03aa66d8875d3c86c366d1616c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -75,7 +75,7 @@
 <dd class="field-odd"><p>open hardware resistivity-meter</p>
 </dd>
 <dt class="field-even">Date</dt>
-<dd class="field-even"><p>Dec 05, 2021</p>
+<dd class="field-even"><p>Jan 22, 2022</p>
 </dd>
 <dt class="field-odd">Date start</dt>
 <dd class="field-odd"><p>July 2016</p>
diff --git a/public/searchindex.js b/public/searchindex.js
index 57c3b7441e3f5e281c71ee4be8dde6276e594d37..3a5ba1aecaa72fc29aa9441a5f4a98d69ad9f186 100644
--- a/public/searchindex.js
+++ b/public/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["Ohmpi","Ohmpi_V2_00/V2_00_step_01","Ohmpi_V2_00/V2_00_step_02","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["Ohmpi.rst","Ohmpi_V2_00\\V2_00_step_01.rst","Ohmpi_V2_00\\V2_00_step_02.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"000":[3,4],"001000":2,"001101":2,"018":[3,4],"0251001":4,"02be":2,"100":[3,4],"100nf":[2,4],"101":[3,4],"10120550":2,"1016":0,"102110421":2,"103":[2,3,4],"1083":[3,4],"1085":2,"10v":4,"110":[2,3,4],"1115":[3,4],"114":[2,3,4],"11mm":2,"120":2,"1211n":2,"1212":2,"1215":[2,4],"128":6,"12v":[2,3,4,6],"1332":[3,4],"150":[3,4,5],"1565235":[3,4],"1568649":[3,4],"185":[3,4],"199":[3,4],"1kohm":2,"1x0":[3,4],"1x1":[3,4],"1x10":[2,3,4],"2016":6,"2020":0,"2021":[0,6],"220":2,"24v":[2,4],"252b7an":2,"252bdzonqg":2,"252be0w1orxzibqpw":2,"252be1bmvd":2,"252be2z":2,"252bg":2,"252bii":2,"252bnrpuooeq":2,"252bx":2,"252bztchcpohq":2,"254":2,"2701":2,"2f0t3ruis9pcaqjlt4":2,"2f12mkns3vxsdryxuhw":2,"2f33nj0gbxroculucynpyong":2,"2faaymw02gquicgqj0ta":2,"2ffq":2,"2fha2pyfadugpyeg4idvm":2,"2fha2pyfadugy9twham3ru9hmijohywhbin95knm":2,"2fha2pyfaduh":2,"2fha2pyfaduhuylh7az":2,"2fha2pyfadujqkqx4wauig":2,"2flq1th4mcyoetma":2,"2fm":2,"2fmgndxmcnv":2,"2fmjfh2xjoums6wztux4som":2,"2fmsr":2,"2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn":2,"2fq":2,"2fqaur8narg":2,"2fufuz19ilfayzxocfra":2,"3002002":2,"304":2,"305":2,"308":2,"3x11":2,"41f2r0e":2,"449":2,"45100":0,"4686":[3,4],"500":[3,4],"508":2,"50vdc":[2,4],"524":2,"537":[3,4],"5488":[3,4],"576":3,"593":2,"5kohm":2,"5vcc":[3,4],"5vdc":[3,4],"627":[3,4],"648":[2,3,4],"69626":0,"69675":0,"741435":2,"762":2,"796":2,"7ah":[3,4],"7mvldsj5uaxen3lyyh3sqw":2,"858":[3,4],"897":[3,4],"9004330000":[3,4],"966067":[3,4],"971110321":2,"ao\u00fbt":0,"case":[1,3,4],"final":[3,4],"function":[0,3,4],"h\u00e9l\u00e8ne":[0,6],"mm\u00b2":[3,4],"new":[1,3,4,5],"orl\u00e9an":0,"public":[3,4],"r\u00e9mi":[0,6],"return":[1,3,4],"switch":[3,4],"universit\u00e9":0,"vid\u00e9o":[1,3,4],ADS:[3,4],CMS:[3,4],For:[1,2,3,4],IDE:[5,6],IGE:0,Its:[3,4],The:[1,2,6],These:[3,4],With:[3,4],abmn:[3,4],abov:[3,4],acc:[1,3,4],access:[3,4],accord:[3,4],accur:[3,4],accuraci:[3,4],acid:[3,4],activ:[5,6],actual:[3,4],adafruit:[1,2,3,4],adapt:[2,3,4],adc:[2,3,4],add:[3,4],added:[3,4],adding:[3,4],addit:[3,4],address:[2,3,4],adjust:[2,3,4],ads1115:[2,3,4],ads115:[2,3,4],ads1x15:[1,3,4],advantag:2,after:[3,4],all:[1,3,4,5],allow:[0,2,3,4,5],alp:0,also:[1,3,4],altern:[1,3,4],amp:[2,3,4],amplif:2,amplifi:[3,4],analog:[2,3,4],ani:[3,4],anoth:[1,3,4],apm:2,appear:[1,2,3,4],appli:[0,3,4],applic:0,apt:[1,3,4],aqy211eh:2,arduino:3,arm:3,around:2,arrai:[3,4],articl:[3,4],asler:[2,3,4],assembl:[5,6],assist:[3,4],associ:0,attent:[3,4],attribut:[3,4],author:[0,1,3,4,6],automat:[0,3,4],automobil:[3,4],avail:[3,4],avr:3,bank:[3,4],base:[1,3,4],basic:0,batteri:[2,3,4,5],been:[1,3,4],befor:[3,4],behavior:[3,4],being:[3,4],below:[1,3,4],between:[2,3,4],bin:[1,3,4],bit:[2,3,4],bkl:2,black:[2,3,4],blinka:[1,3,4],blk:2,block:[3,4],blue:[3,4],board:[1,5,6],boot:[1,3,4],both:[3,4],bottom:[2,3,4],bought:[3,4],box:5,breakout:2,bridg:[3,4],bug:3,build:[3,4],button:[1,3,4],by10:2,c320c104k1:[2,4],c320c104k1r5ta7303:2,c4uyot:2,cabl:[1,2,3,4],calcul:[3,4],calibr:[3,4],call:0,can:[1,3,4,5],canal:3,cap:[3,4],capac:[3,4],capacitor:[2,4],car:3,card:[1,5,6],carri:[1,3,4],caus:[1,3,4],ccf071k50gke36:2,cedex:0,ceram:[2,4],channel:[3,4],characterist:[3,4],charg:[3,4],check:[1,3,4,5],chosen:[3,4],ciayqk2gdckzia2levalkg:2,circuit:[2,3,4],circuitpython:[1,3,4],circul:[3,4],cite:6,clean:[3,4],clement:[0,6],click:[1,3,4],close:[1,3,4],cmf651m0000fkek143:2,code:[1,3,4],coef_p0:[3,4],coef_p1:[3,4],coef_p2:[3,4],coef_p3:[3,4],coeff:[3,4],coeffici:[3,4],com:[1,2,3,4],command:[1,3,4],commerci:[3,4],common:[3,4],commun:[0,5],complet:[1,2,5,6],compon:[1,5,6],comput:[1,3,4],conduct:[3,4],config:[1,3,4],configur:[5,6],congratul:[3,4],connect:[1,2,6],connector:[3,4],conrad:2,consequ:[3,4],consist:[3,4],constitut:[3,4],construct:[3,4],consumpt:[3,4,5],contact:[2,3,4],contain:[1,3,4],content:6,control:[3,4,5],convers:[3,4],convert:[2,3,4],copi:1,correct:[3,4],correspond:3,cost:[0,2,3,4],could:[2,3,4],cpu:[3,4,5],creat:[1,3,4],creation:0,crimp:[3,4],csv:[3,4],ctrl:[1,3,4],cui:2,current:[0,2,5,6],dale:2,damag:[1,3,4],data:[0,6],date:[0,3,4,6],dcconvert:4,deactiv:[1,3,4],dec:6,decid:[1,3,4],decoupl:4,dedic:[0,5],delai:[3,4],deliv:[3,4],depart:0,depend:[1,3,4],describ:[1,2,3,4],descript:[5,6],design:[3,4],desktop:4,despit:[3,4],detail:3,dev:[1,3,4],develop:[0,1,2,3,4,5,6],devic:2,diagram:[3,4],differ:[1,3,4,5],digit:[2,3,4],dii:5,din:[3,4],dip:2,direct:[3,4],directli:[2,3,4],directori:[1,3,4],disconnect:[3,4],discret:1,displai:[3,4],distanc:[3,4],disturb:[3,4],divid:[3,4],document:[0,3],done:[1,3,4],down:[3,4],download:[3,4],dsp:3,dual:[2,3,4],duboi:[0,6],durat:[3,4,5],dure:[1,3,4],dzwb4:[3,4],e00122ff:0,each:[1,3,4],eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw:2,eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw:2,editor:[1,3,4],effort:5,eiffel:0,either:[1,3,4],ejector:2,electr:[0,2,6],electrod:[0,2,6],electron:[2,3,4],elektronik:2,elsevi:0,emil:0,enabl:[3,4],end:[1,3,4],energ:[3,4],enough:[3,4],ensur:[1,3,4],enter:[1,3,4],entir:[3,4],environ:[1,3,4],environn:[5,6],environnementshould:[1,3,4],equal:[3,4],equival:[2,3,4],ert:[3,4],escap:[1,3,4],estim:[3,4],everyon:0,everyth:2,evolv:[3,4],exampl:[3,4],excess:[3,4],execut:[1,3,4],exist:[3,4],experi:[0,3,4,5],explain:3,export_path:4,extra:[3,4],failur:[1,3,4],fargier:[0,6],fast:4,featur:[3,4],femal:[2,3,4],ferrul:[3,4],fewer:[3,4],ff10:0,fhac0002zxj:3,field:[3,4,5],fig:[3,4],figur:[2,3,4],file:[1,3,4],find:[1,3,4],first:[1,3,4],fix:2,flexibl:0,florsch:[2,3,4],flow:[3,4],folder:[1,3,4],follow:[1,2,3,4],forquet:[0,6],four:[2,5,6],framework:[3,4],franc:0,frist:6,from:[3,4,5],full:[3,4],fulli:0,fuse:[3,4],gain:[2,3,4],ganc:[0,6],gather:[1,3,4],gclid:2,gener:[2,3,4,6],geologi:0,ger:0,get:[0,1,2,3,4],gitlab:[3,4],gnd:[3,4],gnu:[1,3,4],gpio:[1,3,4],grenobl:0,gro:0,ground:[2,3,4],gui:[1,3,4],guidelin:6,gurawfaegucaqqfvnvtyeg:2,gustav:0,guyard:[0,6],h81k0bya:[2,3,4],h81k5bya:[2,3,4],had:[3,4],hand:[3,4],handl:[3,4],hardwar:[0,3,4],hardwarex:0,harwin:2,has:[1,3,4],have:[1,2,3,4,5],hazard:[3,4],hdmi:1,header:[2,3,4],hear:[3,4],here:4,hexagonal:2,hexseal:2,high:[3,4],higher:4,holder:[3,4],hole:[3,4],holsworthi:2,home:[1,3,4],horizont:[3,4],hous:[3,4],how:[1,3,4],howev:[3,4],http:[1,2,3,4],i2c:2,i2cdetect:2,ifsttar:0,iggadovctstu:2,illustr:[3,4],im6toxqzgoauedprb19mha:2,imag:0,imped:[3,4,5],implent:6,improv:[4,5],in1:[3,4],in2:[3,4],in3:[3,4],in4:[3,4],ina282:2,ina282aid:2,includ:[1,3,4],incom:[3,4],increas:[3,4],inde:[3,4],industri:2,initi:6,inject:[0,5,6],injection_dur:[3,4],inpout:2,input:[2,3,4,5],inra:0,insert:[3,4],insid:[3,4],instal:[2,5,6],instanc:1,instead:[3,4],instruct:[1,6],instrument:[0,2,3,4],integr:2,intens:[3,4],interfac:[1,3,4],interpret:[1,2,3,4],introduc:[3,4],introduct:6,invit:3,involv:0,ion:[3,4],iri:0,irstea:[3,4],its:[1,3,4,5],jason:4,jjse:2,journal:3,json:4,juillet:0,juli:6,julien:[0,6],just:4,kaufmann:[0,6],kemet:[2,4],keyboard:[1,3,4],known:[1,3,4],kohm:[2,3,4],laboratori:[0,3,4,5],laps:5,last:4,lastli:[3,4],latest:[1,3,4],lead:[3,4],leav:[1,3,4],length:[3,4],less:[3,4],let:[3,4],libatla:[1,3,4],librari:[1,3,4],lie:[2,3,4],limit:[5,6],line:[2,3,4],list:[1,6],lithium:[3,4],littelfus:[3,4],littl:[3,4],lm158:2,lm158j:2,lm158n:2,lm358an:[2,3,4],lm358n:[3,4],locat:[1,3,4],logger:[0,3,4],low:[0,1,3,4,5],lr20:[3,4],lying:[3,4],lyon:0,made:[3,4,5],mai:[1,3,4],main:[3,4],make:[1,3,4],male:2,manag:[3,4],manual:[3,4],manufactur:[2,3,4],manuscript:[3,4],master:[3,4],matur:6,max:2,maximum:[3,4],mcp23008:2,measur:[0,1,5,6],mechan:[3,4],meet:[1,3,4],mega:[3,4],menu:[1,3,4],mesur:6,met:[1,3,4],meter:[0,3,4,5],meterfeatur:0,mgh:2,micro:[1,3,4,5],mill:2,mimic:[3,4],min:[3,4,5],miss:3,mm2:[3,4],model:[1,2,3,4],modif:[1,3,4],modifi:[1,3,4],modul:[3,4],mohm:[2,3,4,5],mon:0,monitor:[3,4,5],more:5,moreov:[3,4],mount:[2,3,4],mous:[1,3,4],mouser:2,multi:[3,4],multielectrod:5,multipl:1,multiplex:[0,5,6],multipli:[3,4],must:[1,3,4],mux:[3,4,5,6],name:[3,4],nano:[1,3,4],nb_electrod:[3,4],nbr_mea:[3,4],necessari:[1,3,4],need:[1,2,3,4],neg:[3,4],next:[3,4],nicola:[0,6],noob:[1,3,4],nopb:[2,3,4],normal:[3,4],note:[3,4],now:[3,4],number:[2,3,4],numer:[3,4],numpi:[1,3,4],obtain:[3,4],offcial:6,offer:[3,4,5],ohm:[2,3,4,5],ohmit:2,ohmmet:[3,4],ohmpi:[1,2],ohmpi_4elec:2,ohmpi_param:4,ohx:0,olivi:[0,6],onc:[1,3,4],one:[2,3,4,5],onli:6,onto:[3,4],open:[0,1,3,4],oper:[1,2,5,6],optic:2,optim:[3,4],option:[1,3,4],order:[3,4],org:1,orient:4,osf:[3,4],other:[3,4],our:[3,4,5],out:[1,3,4],outpout:2,output:[3,4],overh:4,packag:[5,6],padboard:2,pai:[3,4],panason:2,panda:[1,3,4],parallel:1,paramet:[5,6],part:[3,4,5],parten:0,partenair:6,pat1l:4,path:[1,3,4],pcb:[2,3,4],pcs:2,per:[2,3,4],perform:[0,1,3,4],permut:[3,4],philosophi:[0,6],pic:3,piec:[3,4],pin:[2,3,4],pip:[1,3,4],pitch:[2,3,4],place:[3,4],plai:2,pleas:[3,4],plug:[2,3,4],point:[3,4,5],polar:[3,4],pole:[3,4],port:2,posit:[1,3,4],possibl:[3,4],potenti:[3,4],potentiomet:[3,4],pour:3,power:[2,3,4,5],practic:[3,4],pre:2,preci:2,precis:[2,3,4],prefer:[3,4],preliminari:6,prepar:[2,3,4],present:[0,3,4],press:[1,3,4],prevent:4,previou:5,previous:[1,3,4],print:[2,3,4],pro:[3,4],problem:1,procedur:6,produc:[3,4],product:2,productdetail:2,program:[1,3,4],progress:[0,6],project:[1,6],propos:[2,3,4],protect:1,protocol:[3,4],provid:[0,3,4],publish:3,puls:[3,4,5],purpos:[3,4],pyhton3:[1,3,4],python3:[1,3,4],python:[5,6],pythonid:[1,3,4],qkeozdl6eqpa6lzrlqfvow:2,quadripol:[3,4],quadrupol:[3,4],quantiti:[1,3,4],r10:[3,4],r11:[3,4],r12:[3,4],r25:2,r_ref:[3,4],rail:[3,4],rang:[3,4],rapberri:[5,6],raspberri:[2,5,6],raspberrypi:1,raspbian:[1,3,4],raspebrri:[1,3,4],readm:[3,4],realiz:2,recommend:[1,3,4],red:[2,3,4],reduct:[3,4],refer:[2,3,4],relai:[1,2,3,4],releas:6,remain:[3,4],rememb:[3,4],remot:[1,3,4],repeat:[3,4],repetit:[3,4],replac:4,repositori:[3,4],repres:[3,4],requir:[1,3,4,5],research:6,resist:[0,2,5,6],resistor:[2,3,4],resolut:[3,4,5],respect:[3,4],result:[2,3,4],revers:[3,4],reversa:[0,3,4],rm3x8mm:2,robust:[0,3,4,5],role:[3,4],root:[1,3,4],row:2,rpi:[1,3,4],rro:0,ru5fayqh:2,run:[1,2,3,4],safeti:[3,4],sain:[3,4],sainsmart:[3,4],same:[3,4],samtec:[2,3,4],save:[1,3,4],scale:0,schemat:[2,3,4],scienc:[3,4],scientif:0,screen:[2,3,4],screw:[2,3,4],searchsuggest:2,searchterm:2,searchtyp:2,second:[3,4],section:[3,4],see:[3,4],seeed:2,seek:5,select:[1,3,4],sequenc:[3,4],sequence_delai:[3,4],seri:[3,4],serv:[3,4],set:[1,2,3,4],setp:4,setup:[1,3,4],sever:[3,4],sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw:2,share:5,shield:[1,3,4],shortcut:[3,4],should:[1,2,3,4],show:[2,3,4],shown:[3,4],shunt:2,shutdown:2,signal:[2,3,4],simpl:[1,3,4],simpli:[1,3,4],simultan:[3,4],singl:[3,4],slope:[3,4],small:[0,2,3,4,5],smaller:[3,4],smart:[3,4],smt:2,socket:2,softwar:[1,3,4],soic:2,soil:[3,4],solder:[2,3,4],solut:[3,4],some:[3,4,6],sound:[3,4],sourc:[0,1,3,4],space:2,spacer:2,specif:[3,4,5],specifi:[1,3,4],spi:[1,3,4],spool:2,ssq:2,ssw:[2,3,4],stabl:[1,3,4],stack:[3,4],stainless:[3,4],start:[1,3,4,5,6],startup:6,statu:[0,6],steel:[3,4],step:[3,4,6],still:[3,4],stop:5,storag:[3,4,5],strict:[3,4],strip:[2,3,4],strong:[3,4],stronger:[3,4],strongli:[1,3,4],stuck:[3,4],studi:[3,4],studio:2,subject:[3,4],sudo:[1,3,4],suffici:[1,3,4],suggest:[2,3,4],suitabl:[3,4,5],sum:[3,4],suppli:[2,3,4],support:1,suppress:4,sure:[1,3,4],surfac:0,system:[1,3,4,5],tab:[1,3,4],tabl:4,target:6,task:[1,3,4],tb009:2,tdh15:2,team:5,technic:6,temperatur:[3,4,5],ten:[3,4],termin:[1,2,3,4],test:[1,2,3,4],texa:[2,3,4],than:[3,4],thd:2,the9:[3,4],thei:[3,4],them:[3,4],therefor:[3,4],thi:[0,1,2,3,4,5],thonni:[5,6],thousand:[3,4],three:[2,3,4],through:[3,4],thu:[3,4],time:[1,3,4,5],togeth:[3,4],toler:4,tonni:2,tool:[0,5],total:[2,3,4],tow:2,track:[3,4],traco:[2,4],tracopow:[2,4],trn3:4,trn:[2,4],tru:[3,4],turn:[3,4],tutori:6,two:[2,3,4,5],txt:[1,3,4],type:[1,3,4,5],typic:[3,4],under:[3,4],unexpectedli:[1,3,4],unit:[2,3,4,5],univ:0,unplug:2,unzip:[3,4],updat:0,upgrad:[4,5],upper:2,upping:[3,4],upw50b50rv:[3,4],use:[1,3,4],used:[1,2,3,4],user:[1,3,4,6],using:[1,3,4],usr:[1,3,4],util:1,valid:[3,4],valu:[2,3,4],variou:[3,4],velleman:[3,4],venv:[1,3,4],veri:4,version:[1,3,4,5],vertic:[3,4],via:[1,3,4],view:2,villeurbann:0,vip:2,virtual:[5,6],vishai:2,visit:1,vivien:[0,6],vlwxofp3u2wcfk5uckwtka:2,voltag:[2,3,4,5],voltmet:[3,4],w0yvoo0ixfenuv0hsdc4:2,wai:[1,3,4],want:4,watch:[1,3,4],weaker:3,web:2,websit:[1,3,4],weidmul:[3,4],welcom:0,well:[1,3,4],were:[1,2,3,4],when:[1,3,4],where:[1,3,4],which:[2,3,4,5],whose:[3,4],willing:0,window:[1,3,4],wire:[1,3,4],wish:5,within:[1,3,4],without:[3,4],wjwzhv1v3pk:[1,3,4],wktuvitrialgiu8hcm7dvq:2,work:2,would:[3,4],wpm404:[3,4],write:[1,2,3,4],wurth:2,www:[1,2,3,4],x1j7hmvl2zh8vpefml8:2,yannick:[0,6],yca:2,you:[1,2,3,4],your:[1,2,3,4],youtub:[1,3,4],ze4:2},titles:["OhmPi project","<strong>STEP n\u00b01</strong> : Raspberry Pi  configuration","<strong>STEP n\u00b02</strong>: Measurement board","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.xx (64 or 128 electrodes and 12V)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"128":5,"12v":5,IDE:[1,3,4],The:[3,4,5],activ:[1,3,4],assembl:[2,3,4],board:[2,3,4],card:[3,4],center:6,check:2,cite:0,complet:[3,4],compon:[2,3,4],configur:[1,3,4],connect:[3,4],current:[3,4],data:[3,4,5],descript:[2,3,4],document:6,electr:[3,4],electrod:[3,4,5],environn:[1,3,4],four:[3,4],frist:[3,4],hardwar:6,implement:[3,4],implent:[3,4],initi:[3,4],inject:[3,4],instal:[1,3,4],instruct:[3,4],introduct:0,limit:[3,4],list:[2,3,4],measur:[2,3,4],mesur:[3,4],meter:6,multiplex:[3,4],ohmpi:[0,3,4,5,6],onli:[3,4],open:6,oper:[3,4],packag:[1,3,4],paramet:[3,4],part:[1,2],partenair:0,philosophi:[3,4,5],preliminari:[3,4],procedur:[3,4],project:0,python:[1,3,4],rapberri:[1,3,4],raspberri:[1,3,4],requir:2,resist:[3,4],resit:6,sourc:6,start:2,startup:[3,4],step:[1,2,5],summari:6,tabl:3,technic:[3,4,5],thonni:[1,3,4],titl:3,virtual:[1,3,4]}})
\ No newline at end of file
+Search.setIndex({docnames:["Ohmpi","Ohmpi_V2_00/V2_00_step_01","Ohmpi_V2_00/V2_00_step_02","Ohmpi_V2_00/V2_00_step_03","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["Ohmpi.rst","Ohmpi_V2_00\\V2_00_step_01.rst","Ohmpi_V2_00\\V2_00_step_02.rst","Ohmpi_V2_00\\V2_00_step_03.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"000":[4,5],"001000":2,"001101":2,"008":3,"018":[4,5],"0251001":5,"02be":[2,3],"061":3,"091":3,"0x70":3,"0x71":3,"0x72":3,"0x73":3,"0x77":3,"100":[4,5],"100k":3,"100nf":[2,5],"101":[4,5],"10120158":3,"1012015810":3,"10120550":[2,3],"10120558":3,"10120862":3,"1016":0,"102110421":2,"103":[4,5],"103321":3,"1083":[4,5],"1085":2,"10v":5,"110":[2,4,5],"1115":[4,5],"114":[2,4,5],"11mm":2,"120":[2,3],"1211n":2,"1212":2,"1215":[2,5],"127":3,"128":[3,7],"12v":[2,4,5,7],"1332":[4,5],"140":3,"150":[3,4,5,6],"1548658":3,"1565235":[4,5],"1568649":[4,5],"1580994":3,"185":[4,5],"199":[4,5],"1kohm":2,"1n4007":3,"1x0":[4,5],"1x1":[4,5],"1x10":[2,4,5],"2016":7,"2020":0,"2021":0,"2022":7,"205":3,"220":2,"24300":3,"24v":[2,5],"252b7an":2,"252baqg":3,"252bdzonqg":2,"252be0w1orxzibqpw":2,"252be1bmvd":2,"252bg":2,"252bii":2,"252bnrpuooeq":2,"252bsz9b":3,"252bx":2,"252bz3hvktao":3,"252bzuq":3,"254":[2,3],"25515":3,"256":3,"2701":[2,3],"2717":3,"296":3,"2f0t3ruis9pcaqjlt4":2,"2f12mkns3vxsdryxuhw":[2,3],"2f2czwu0ejpozmzc2a":3,"2f2czwuxuhumfr":3,"2f33nj0gbxroculucynpyong":2,"2f5q":3,"2faaymw02gquicgqj0ta":2,"2fbpyakboruumren":3,"2ff6fcxt7g":3,"2ffq":2,"2fha2pyfadugpyeg4idvm":2,"2fha2pyfadugy9twham3ru9hmijohywhbin95knm":2,"2fha2pyfaduh":2,"2fha2pyfaduhuylh7az":2,"2fha2pyfadujqkqx4wauig":2,"2flq1th4mcyoetma":2,"2fm":2,"2fmgndxmcnv":2,"2fmjfh2xjoums6wztux4som":2,"2fmsr":2,"2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn":2,"2fq":2,"2fqaur8narg":2,"2fufuz19ilfayzxocfra":2,"3002002":2,"304":2,"305":[2,3],"308":2,"325":3,"3x11":2,"41f2r0e":2,"449":2,"45100":0,"4686":[4,5],"471":3,"500":[4,5],"503811":3,"508":[2,3],"50vdc":[2,5],"512":3,"524":2,"537":[4,5],"5488":[4,5],"560":3,"576":[3,4],"593":2,"5kohm":2,"5twgzeq9e7hsylqaljjyrw":3,"5vcc":[4,5],"5vdc":[4,5],"614":3,"616":3,"627":[4,5],"648":[2,3,4,5],"69626":0,"69675":0,"732":3,"741435":2,"741727":3,"742063":3,"745":3,"762":2,"776":3,"796":2,"7ah":[4,5],"7mvldsj5uaxen3lyyh3sqw":2,"846":3,"858":[4,5],"897":[4,5],"9004330000":[4,5],"966067":[4,5],"971110321":2,"ao\u00fbt":0,"case":[1,4,5],"export":1,"final":[4,5],"function":[0,4,5],"h\u00e9l\u00e8ne":[0,7],"mm\u00b2":[4,5],"new":[1,4,5,6],"orl\u00e9an":0,"public":[4,5],"r\u00e9mi":[0,7],"return":[1,4,5],"switch":[4,5],"universit\u00e9":0,"vid\u00e9o":[1,4,5],ADS:[4,5],CMS:[4,5],For:[1,2,4,5],IDE:[6,7],IGE:0,Its:[4,5],The:[1,2,3,7],These:[4,5],With:[4,5],abmn:[4,5],abov:[4,5],acc:[1,4,5],access:[4,5],accord:[4,5],accur:[4,5],accuraci:[4,5],acid:[4,5],activ:[3,6,7],actual:[4,5],adafruit:[1,2,3,4,5],adapt:[2,4,5],adc:[2,4,5],add:[4,5],added:[4,5],adding:[4,5],addit:[4,5],address:[2,3,4,5],adjust:[2,4,5],ads1115:[2,4,5],ads115:[2,4,5],ads1x15:[1,4,5],advantag:2,after:[4,5],all:[1,3,4,5,6],allow:[0,2,3,4,5,6],alp:0,also:[1,4,5],altern:[1,4,5],amp:[2,4,5],amplif:2,amplifi:[4,5],analog:[2,4,5],ani:[4,5],anoth:[1,4,5],apm:[2,3],appear:[1,2,4,5],appli:[0,4,5],applic:0,apt:[1,4,5],aqy211eh:2,arduino:4,arm:4,around:2,arrai:[4,5],articl:[4,5],asler:[2,3,4,5],assembl:[6,7],assist:[4,5],associ:[0,3],attent:[4,5],attribut:[4,5],author:[0,1,4,5,7],automat:[0,4,5],automobil:[4,5],avail:[4,5],avr:4,bank:[4,5],base:[1,3,4,5],basic:0,batteri:[2,4,5,6],been:[1,4,5],befor:[4,5],behavior:[4,5],being:[4,5],below:[1,4,5],between:[2,3,4,5],beyschlag:3,bin:[1,4,5],bit:[2,4,5],bkl:[2,3],black:[2,4,5],blinka:[1,4,5],blk:[2,3],block:[4,5],blue:[4,5],board:[1,6,7],boot:[1,4,5],both:[4,5],bottom:[2,4,5],bought:[4,5],box:6,breakout:2,bridg:[4,5],bug:4,build:[4,5],button:[1,4,5],by10:2,c320c104k1:[2,5],c320c104k1r5ta7303:2,c4uyot:2,cabl:[1,2,3,4,5],calcul:[4,5],calibr:[4,5],call:[0,1],can:[1,4,5,6],canal:4,cap:[4,5],capac:[4,5],capacitor:[2,5],car:4,card:[1,3,6,7],carri:[1,4,5],caus:[1,4,5],ccf071k50gke36:2,cedex:0,ceram:[2,5],cflag:1,chang:[2,3],channel:[3,4,5],characterist:[4,5],charg:[4,5],check:[1,4,5,6],chosen:[4,5],ciayqk2gdckzia2levalkg:2,circuit:[2,3,4,5],circuitpython:[1,4,5],circul:[4,5],cite:7,clean:[4,5],clement:[0,7],click:[1,4,5],close:[1,4,5],cmf651m0000fkek143:2,code:[1,2,4,5],coef_p0:[4,5],coef_p1:[4,5],coef_p2:[4,5],coef_p3:[4,5],coeff:[4,5],coeffici:[4,5],colour:3,com:[1,2,3,4,5],combin:3,command:[1,4,5],commerci:[4,5],common:[4,5],commun:[0,6],complet:[1,2,6,7],compon:[1,6,7],comput:[1,4,5],conduct:[4,5],config:[1,4,5],configur:[6,7],congratul:[4,5],connect:[1,2,3,7],connector:[3,4,5],conrad:[2,3],consequ:[4,5],consist:[4,5],constitut:[4,5],construct:[4,5],consumpt:[4,5,6],contact:[2,3,4,5],contain:[1,4,5],content:7,control:[4,5,6],convers:[4,5],convert:[2,4,5],copi:1,corner:2,correct:[4,5],correspond:4,cost:[0,2,3,4,5],could:[2,4,5],cpu:[4,5,6],creat:[1,4,5],creation:0,crimp:[4,5],csv:[4,5],ctrl:[1,4,5],cui:[2,3],current:[0,2,6,7],dale:2,damag:[1,4,5],data:[0,7],date:[0,4,5,7],dcconvert:5,deactiv:[1,4,5],decid:[1,4,5],decoupl:5,decreas:2,dedic:[0,6],delai:[4,5],deliv:[4,5],depart:0,depend:[1,4,5],describ:[1,2,4,5],descript:[6,7],design:[4,5],desktop:5,despit:[4,5],detail:4,dev:[1,4,5],develop:[0,1,2,4,5,6,7],devic:[2,3],diagram:[4,5],differ:[1,2,4,5,6],digit:[2,3,4,5],dii:6,din:[4,5],diod:3,dip:[2,3],direct:[4,5],directli:[2,4,5],directori:[1,4,5],disconnect:[4,5],discret:1,displai:[4,5],distanc:[4,5],disturb:[4,5],divid:[4,5],document:[0,4],done:[1,4,5],dot:2,down:[4,5],download:[4,5],dsp:4,dual:[2,3,4,5],duboi:[0,7],durat:[4,5,6],dure:[1,4,5],dzwb4:[4,5],e00122ff:0,each:[1,3,4,5],eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw:2,eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw:2,editor:[1,4,5],effort:6,eiffel:0,either:[1,4,5],ejector:[2,3],electr:[0,2,7],electrod:[0,2,3,7],electron:[2,3,4,5],elektronik:2,elsevi:0,emil:0,enabl:[4,5],end:[1,4,5],energ:[4,5],enough:[3,4,5],ensur:[1,4,5],enter:[1,4,5],entir:[4,5],environ:[1,4,5],environn:[6,7],environnementshould:[1,4,5],equal:[4,5],equival:[2,4,5],ert:[4,5],escap:[1,4,5],estim:[4,5],everyon:0,everyth:2,evolv:[4,5],exampl:[4,5],excess:[4,5],execut:[1,4,5],exist:[4,5],expand:3,expend:3,experi:[0,4,5,6],explain:4,export_path:5,extra:[4,5],failur:[1,4,5],fargier:[0,7],fast:5,fcommon:1,featur:[4,5],femal:[2,3,4,5],ferrul:[4,5],fewer:[4,5],ff10:0,fhac0002zxj:4,field:[4,5,6],fig:[4,5],figur:[2,4,5],file:[1,4,5],find:[1,4,5],first:[1,4,5],fix:2,flexibl:0,florsch:[2,4,5],flow:[4,5],folder:[1,4,5],follow:[1,2,3,4,5],forquet:[0,7],four:[2,6,7],framework:[4,5],franc:0,frist:7,from:[3,4,5,6],full:[4,5],fulli:0,fuse:[4,5],g5le:3,gain:[2,4,5],ganc:[0,7],gather:[1,4,5],gclid:2,gener:[2,3,4,5,7],geologi:0,ger:0,get:[0,1,2,4,5],gitlab:[4,5],gnd:[4,5],gnu:[1,4,5],gpio:[1,3,4,5],gpiozero:1,grenobl:0,gro:0,ground:[2,4,5],gui:[1,4,5],guidelin:7,gurawfaegucaqqfvnvtyeg:2,gustav:0,guyard:[0,7],h81k0bya:[2,4,5],h81k5bya:[2,4,5],had:[4,5],hand:[4,5],handl:[4,5],hardwar:[0,4,5],hardwarex:0,harwin:2,has:[1,3,4,5],have:[1,2,3,4,5,6],hazard:[4,5],hdmi:1,header:[2,3,4,5],hear:[4,5],here:5,hex:3,hexagonal:2,hexseal:[2,3],high:[4,5],higher:[2,5],holder:[4,5],hole:[4,5],holsworthi:2,home:[1,4,5],horizont:[4,5],hous:[4,5],how:[1,4,5],howev:[4,5],http:[1,2,3,4,5],i2c:[1,2,3],i2cdetect:2,ifsttar:0,iggadovctstu:2,illustr:[4,5],im6toxqzgoauedprb19mha:2,imag:[0,1],imped:[4,5,6],implent:7,improv:[5,6],in1:[4,5],in2:[4,5],in3:[4,5],in4:[4,5],ina282:2,ina282aid:2,includ:[1,4,5],incom:[4,5],incorpor:3,increas:[4,5],inde:[4,5],industri:2,initi:7,inject:[0,6,7],injection_dur:[4,5],inpout:2,input:[2,4,5,6],inra:0,insert:[4,5],insid:[4,5],instal:[2,3,6,7],instanc:1,instead:[4,5],instruct:[1,7],instrument:[0,2,4,5],integr:2,intens:[4,5],interfac:[1,4,5],interpret:[1,2,4,5],introduc:[4,5],introduct:7,invit:4,involv:0,ion:[4,5],iri:0,irstea:[4,5],its:[1,3,4,5,6],jan:7,jason:5,jjse:[2,3],journal:4,json:5,juillet:0,juli:7,julien:[0,7],just:[2,5],kaufmann:[0,7],kemet:[2,5],keyboard:[1,4,5],keyston:3,known:[1,4,5],kohm:[2,3,4,5],laboratori:[0,4,5,6],laps:6,last:5,lastli:[4,5],latest:[1,4,5],lead:[4,5],leav:[1,4,5],left:2,length:[4,5],less:[4,5],let:[4,5],libatla:[1,4,5],librari:[1,4,5],lie:[2,4,5],limit:[2,6,7],line:[2,3,4,5],list:[1,7],lithium:[4,5],littelfus:[4,5],littl:[4,5],lm158:2,lm158j:2,lm158n:2,lm358an:[2,4,5],lm358n:[4,5],locat:[1,4,5],logger:[0,4,5],low:[0,1,4,5,6],lr20:[4,5],lying:[4,5],lyon:0,made:[4,5,6],mai:[1,4,5],main:[4,5],make:[1,4,5],male:[2,3],manag:[4,5],manual:[4,5],manufactur:[2,3,4,5],manuscript:[4,5],mark:2,master:[4,5],matur:7,max:2,maximum:[4,5],mba02040c1003frp00:3,mcp23008:2,mcp23017:3,mcp230xx:1,measur:[0,1,6,7],mechan:[3,4,5],meet:[1,4,5],mega:[4,5],menu:[1,4,5],mesur:7,met:[1,4,5],meter:[0,4,5,6],meterfeatur:0,mgh:2,micro:[1,4,5,6],mill:2,mimic:[4,5],min:[4,5,6],miss:4,mm2:[4,5],model:[1,2,4,5],modif:[1,4,5],modifi:[1,4,5],modul:[4,5],mofset:3,mohm:[2,4,5,6],mon:0,monitor:[4,5,6],more:6,moreov:[4,5],mosfet:3,mount:[2,4,5],mous:[1,4,5],mouser:[2,3],muliplex:3,multi:[3,4,5],multielectrod:6,multipl:1,multiplex:[0,3,6,7],multipli:[4,5],must:[1,4,5],mux:[4,5,6,7],mzrxyrlhvdt9crf7zyf:3,name:[4,5],nano:[1,4,5],nb_electrod:[4,5],nbr_mea:[4,5],nchannel:3,necessari:[1,4,5],need:[1,2,3,4,5],neg:[4,5],next:[4,5],nicola:[0,7],noob:[4,5],nopb:[2,4,5],normal:[4,5],note:[4,5],now:[4,5],number:[2,3,4,5],numer:[4,5],numpi:[1,4,5],obtain:[4,5],offcial:7,offer:[4,5,6],ohm:[2,4,5,6],ohmit:2,ohmmet:[4,5],ohmpi:[1,2,3],ohmpi_4elec:2,ohmpi_param:5,ohx:0,olivi:[0,7],omron:3,onc:[1,4,5],one:[2,4,5,6],onli:[3,7],onto:[4,5],open:[0,1,4,5],oper:[1,2,6,7],optic:2,optim:[4,5],option:[1,4,5],order:[4,5],org:1,orient:5,osf:[4,5],other:[4,5],our:[4,5,6],out:[1,4,5],outpout:2,output:[4,5],over:3,overh:5,own:3,packag:[6,7],padboard:2,pai:[4,5],panason:2,panda:[1,4,5],parallel:1,paramet:[6,7],part:[4,5,6],parten:0,partenair:7,pat1l:5,path:[1,4,5],pcb:[2,3,4,5],pcs:[2,3],per:[2,3,4,5],perform:[0,1,4,5],permut:[4,5],philosophi:[0,7],pic:4,piec:[4,5],pin:[2,3,4,5],pip:[1,4,5],pitch:[2,3,4,5],place:[4,5],plai:2,pleas:[4,5],plug:[2,4,5],point:[4,5,6],polar:[4,5],pole:[4,5],port:2,posit:[1,4,5],possibl:[4,5],potenti:[4,5],potentiomet:[4,5],pour:4,power:[2,3,4,5,6],practic:[4,5],pre:2,preci:2,precis:[2,4,5],prefer:[4,5],preliminari:7,prepar:[2,4,5],present:[0,3,4,5],press:[1,4,5],prevent:5,previou:6,previous:[1,4,5],print:[2,3,4,5],pro:[4,5],problem:1,procedur:7,produc:[4,5],product:[2,3],productdetail:[2,3],program:[1,4,5],progress:[0,7],project:[1,7],propos:[2,4,5],protect:1,protocol:[4,5],provid:[0,4,5],publish:4,puls:[4,5,6],purpos:[4,5],pyhton3:[1,4,5],python3:[1,4,5],python:[6,7],pythonid:[1,4,5],qkeozdl6eqpa6lzrlqfvow:2,quadripol:[4,5],quadrupol:[4,5],quantiti:[1,4,5],r10:[4,5],r11:[4,5],r12:[4,5],r25:2,r_ref:[4,5],rail:[4,5],rang:[4,5],rapberri:[6,7],raspberri:[2,3,6,7],raspberrypi:1,raspbian:[1,4,5],raspebrri:[1,4,5],readm:[4,5],realiz:2,recommend:[1,4,5],red:[2,4,5],reduct:[4,5],refer:[2,3,4,5],relai:[1,2,3,4,5],releas:7,relief:3,remain:[4,5],rememb:[4,5],remot:[1,4,5],repeat:[4,5],repetit:[4,5],replac:5,repositori:[4,5],repres:[3,4,5],requir:[1,4,5,6],research:7,resist:[0,2,6,7],resistor:[2,3,4,5],resolut:[4,5,6],respect:[4,5],result:[2,4,5],revers:[4,5],reversa:[0,4,5],ribbon:3,right:2,rm3x8mm:[2,3],robust:[0,4,5,6],role:[4,5],root:[1,4,5],row:[2,3],rpi:[1,4,5],rro:0,ru5fayqh:2,run:[1,2,4,5],safeti:[4,5],sain:[4,5],sainsmart:[4,5],same:[4,5],samtec:[2,4,5],save:[1,4,5],scale:0,schemat:[2,4,5],scienc:[4,5],scientif:0,screen:[2,4,5],screw:[2,3,4,5],searchsuggest:[2,3],searchterm:[2,3],searchtyp:[2,3],second:[4,5],section:[4,5],see:[4,5],seeed:2,seek:6,select:[1,4,5],sequenc:[4,5],sequence_delai:[4,5],seri:[4,5],serv:[4,5],set:[1,2,4,5],setp:5,setup:[1,4,5],sever:[4,5],sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi:3,sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw:2,sgaepimzzmsyydr3r27av4eqf73yoh:3,sgaepimzzmueqxo7l:3,share:6,shield:[1,4,5],shortcut:[4,5],should:[1,2,4,5],show:[2,4,5],shown:[4,5],shunt:2,shutdown:2,signal:[2,4,5],simpl:[4,5],simpli:[1,4,5],simultan:[4,5],singl:[4,5],slope:[4,5],small:[0,2,4,5,6],smaller:[4,5],smart:[4,5],smt:2,socket:[2,3],softwar:[1,4,5],soic:2,soil:[4,5],solder:[2,4,5],solut:[4,5],some:[4,5,7],sound:[4,5],sourc:[0,1,4,5],space:[2,3],spacer:[2,3],specif:[4,5,6],specifi:[1,4,5],spi:[1,4,5],spool:2,ssq:2,ssw:[2,4,5],stabl:[1,4,5],stack:[4,5],stainless:[4,5],start:[1,4,5,6,7],startup:7,statu:[0,7],steel:[4,5],step:[4,5,7],still:[4,5],stop:6,storag:[4,5,6],strain:3,strict:[4,5],strip:[2,3,4,5],strong:[4,5],stronger:[4,5],strongli:[1,4,5],stuck:[4,5],studi:[4,5],studio:2,subject:[4,5],sudo:[1,4,5],suffici:[1,4,5],suggest:[2,3,4,5],suitabl:[4,5,6],sum:[4,5],suppli:[2,4,5],support:1,suppress:5,sure:[1,4,5],surfac:0,system:[1,4,5,6],tab:[1,4,5],tabl:5,target:7,task:[1,4,5],tb009:[2,3],tca9548a:[1,3],tdh15:2,team:6,technic:7,temperatur:[4,5,6],ten:[4,5],termin:[1,2,3,4,5],test:[1,2,4,5,6],texa:[2,4,5],than:[2,4,5],thd:2,the9:[4,5],thei:[4,5],them:[4,5],therefor:[4,5],thi:[0,1,2,3,4,5,6],thonni:[6,7],thousand:[4,5],three:[2,4,5],through:[4,5],thu:[4,5],time:[1,4,5,6],togeth:[4,5],toler:5,tonni:2,tool:[0,6],top:2,total:[2,3,4,5],tow:2,track:[4,5],traco:[2,5],tracopow:[2,5],trn3:5,trn:[2,5],tru:[3,4,5],turn:[4,5],tutori:7,two:[2,4,5,6],txt:[1,4,5],type:[1,3,4,5,6],typic:[4,5],under:[4,5],unexpectedli:[1,4,5],unit:[2,3,4,5,6],univ:0,unplug:2,unzip:[4,5],updat:0,upgrad:[5,6],upper:2,upping:[4,5],upw50b50rv:[4,5],use:[1,3,4,5],used:[1,2,3,4,5],user:[1,4,5,7],using:[1,4,5],usr:[1,4,5],util:1,uwqyq:3,valid:[4,5],valu:[2,4,5],variou:[4,5],vdc:3,velleman:[4,5],venv:[1,4,5],veri:5,version:[1,2,4,5,6],vertic:[4,5],vhuuswq2:3,via:[1,4,5],view:2,villeurbann:0,vip:2,virtual:[6,7],vishai:[2,3],visit:1,vivien:[0,7],vlwxofp3u2wcfk5uckwtka:[2,3],voltag:[2,4,5,6],voltmet:[4,5],w0yvoo0ixfenuv0hsdc4:2,wai:[1,4,5],want:5,watch:[1,4,5],weaker:4,web:[2,3],websit:[1,4,5],weidmul:[4,5],welcom:0,well:[1,4,5],were:[1,2,4,5],when:[1,4,5],where:[1,4,5],which:[2,3,4,5,6],whose:[4,5],willing:0,window:[1,4,5],wire:[1,4,5],wish:6,within:[1,4,5],without:[4,5],wjwzhv1v3pk:[1,4,5],wktuvitrialgiu8hcm7dvq:2,work:2,would:[4,5],wpm404:[4,5],write:[1,2,4,5],wurth:2,www:[1,2,3,4,5],x1j7hmvl2zh8vpefml8:2,yannick:[0,7],yca:2,you:[1,2,4,5],your:[1,2,4,5],youtub:[1,4,5],ze4:2,zvn4206a:3},titles:["OhmPi project","<strong>STEP n\u00b01</strong> : Raspberry Pi  configuration","<strong>STEP n\u00b02</strong>: Measurement board","<strong>STEP n\u00b03</strong>: MUX board","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.xx (64 or 128 electrodes and 12V)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"128":6,"12v":6,IDE:[1,4,5],The:[4,5,6],activ:[1,4,5],assembl:[2,3,4,5],board:[2,3,4,5],card:[4,5],center:7,check:2,cite:0,complet:[4,5],compon:[2,3,4,5],configur:[1,4,5],connect:[4,5],current:[4,5],data:[4,5,6],descript:[2,4,5],document:7,electr:[4,5],electrod:[4,5,6],environn:[1,4,5],four:[4,5],frist:[4,5],hardwar:7,implement:[4,5],implent:[4,5],initi:[4,5],inject:[4,5],instal:[1,4,5],instruct:[4,5],introduct:0,limit:[4,5],list:[2,3,4,5],measur:[2,4,5],mesur:[4,5],meter:7,multiplex:[4,5],mux:3,ohmpi:[0,4,5,6,7],onli:[4,5],open:7,oper:[4,5],packag:[1,4,5],paramet:[4,5],part:[1,2,3],partenair:0,philosophi:[4,5,6],preliminari:[4,5],procedur:[4,5],project:0,python:[1,4,5],rapberri:[1,4,5],raspberri:[1,4,5],requir:[2,3],resist:[4,5],resit:7,sourc:7,start:2,startup:[4,5],step:[1,2,3,6],summari:7,tabl:4,technic:[4,5,6],test:3,thonni:[1,4,5],titl:4,virtual:[1,4,5]}})
\ No newline at end of file
diff --git a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_01.doctree b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_01.doctree
index 8cf9c8329ac59a4ab9b429f75379ce752e5216cf..69431c2378ea4be5da9621f145dace45cbcb396f 100644
Binary files a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_01.doctree and b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_01.doctree differ
diff --git a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02 - Copie.doctree b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02 - Copie.doctree
deleted file mode 100644
index 7b959e7d79bf7257e9173cf0666058d54e55b2fd..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02 - Copie.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02.doctree b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02.doctree
index 58c52acdadc082b6218075a4245f2e709e868134..ca5c64db92f93c3868169f272b425743a7eaa031 100644
Binary files a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02.doctree and b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_02.doctree differ
diff --git a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_03.doctree b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_03.doctree
index a85a8d65e22eee6444615bdfe4462546e7efa041..9c596c156871bf154a78e15a37ee4e311504265b 100644
Binary files a/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_03.doctree and b/sphinx/build/doctrees/Ohmpi_V2_00/V2_00_step_03.doctree differ
diff --git a/sphinx/build/doctrees/V2_00_step_01.doctree b/sphinx/build/doctrees/V2_00_step_01.doctree
deleted file mode 100644
index 42aebaf9f88608adbe372cf7cd5e851ab731a6af..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/V2_00_step_01.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/V2_00_stpe_01.doctree b/sphinx/build/doctrees/V2_00_stpe_01.doctree
deleted file mode 100644
index 2b432c43c2f0e15e2b47e60f3151dc89fa64b108..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/V2_00_stpe_01.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/environment.pickle b/sphinx/build/doctrees/environment.pickle
index c536a30b560a49b0a4611c797c683d3a13c18cf7..907ba04705873a649dfdd548526718ca98c98e55 100644
Binary files a/sphinx/build/doctrees/environment.pickle and b/sphinx/build/doctrees/environment.pickle differ
diff --git a/sphinx/build/doctrees/index.doctree b/sphinx/build/doctrees/index.doctree
index 4dcaf4d6ca37d7e7c7f7f771b8f6172c3c2bae16..4b9a4f0a43d66273f16ec6b96b1dfda0bbbde60f 100644
Binary files a/sphinx/build/doctrees/index.doctree and b/sphinx/build/doctrees/index.doctree differ
diff --git a/sphinx/build/doctrees/old/page2.doctree b/sphinx/build/doctrees/old/page2.doctree
deleted file mode 100644
index 96f015a524fbdbbc9a0ba20bf96435fdaeb0bb96..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/old/page2.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/page0.doctree b/sphinx/build/doctrees/page0.doctree
deleted file mode 100644
index 16aaded7cbf2dc04b90a80a4ec46956ab771c94d..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/page0.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/page1.doctree b/sphinx/build/doctrees/page1.doctree
deleted file mode 100644
index 8cf0edecb8e47b70d345b76eefaa91307f2807b8..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/page1.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/page2.doctree b/sphinx/build/doctrees/page2.doctree
deleted file mode 100644
index 92d23f7e7efd59e3c0459f5bd27ac5b24d25e0f5..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/page2.doctree and /dev/null differ
diff --git a/sphinx/build/doctrees/test.doctree b/sphinx/build/doctrees/test.doctree
deleted file mode 100644
index 0eceec5892c84057ab2e267e6921fa19920bc267..0000000000000000000000000000000000000000
Binary files a/sphinx/build/doctrees/test.doctree and /dev/null differ
diff --git a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_01.html b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_01.html
index 5ac23f2ae4def4663826454fb9ad9eb197667ce5..334179d93098eecc6814f7f9778885b2de1390e9 100644
--- a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_01.html
+++ b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_01.html
@@ -117,7 +117,7 @@
 For this step, the installation instructions are well described on the Raspberry website</p>
 <ol class="arabic simple">
 <li><p>Watch the vidéo “how to set up your raspberry Pi” (<a class="reference external" href="https://www.youtube.com/watch?v=wjWZhV1v3Pk">https://www.youtube.com/watch?v=wjWZhV1v3Pk</a>)</p></li>
-<li><p>The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).</p></li>
+<li><p>The authors recommend installing the latest stable and complete version of Raspberry Pi OS (Previously called Raspbian) by using Raspberry Pi Imager.</p></li>
 <li><p>or you can visit this website : (<a class="reference external" href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up">https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up</a>)</p></li>
 </ol>
 <div class="admonition note">
@@ -129,7 +129,7 @@ For this step, the installation instructions are well described on the Raspberry
 </div>
 <div class="admonition warning">
 <p class="admonition-title">Warning</p>
-<p>Once the OS has been installed,  <strong>1-wire, spi and GPIO remote option</strong> must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.</p>
+<p>Once the OS has been installed,  <strong>1-wire, spi and GPIO remote option</strong> must be deactivated and <strong>I2C option</strong> must be activated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.</p>
 </div>
 <p>3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly.
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.</p>
@@ -185,7 +185,8 @@ Each virtual environment contains a discrete copy of the Python interpreter, inc
 </pre></div>
 </div>
 <p>Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">RPi</span><span class="o">.</span><span class="n">GPIO</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">blinka</span> <span class="n">numpy</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">ads1x15</span> <span class="n">pandas</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">export</span> <span class="n">CFLAGS</span><span class="o">=-</span><span class="n">fcommon</span>
+    <span class="n">sudo</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">RPi</span><span class="o">.</span><span class="n">GPIO</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">blinka</span> <span class="n">numpy</span> <span class="n">pandas</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">ads1x15</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">tca9548a</span> <span class="n">adafruit</span><span class="o">-</span><span class="n">circuitpython</span><span class="o">-</span><span class="n">mcp230xx</span> <span class="n">gpiozero</span>
 </pre></div>
 </div>
 <p>Check that requirements are met using</p>
diff --git a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_02.html b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_02.html
index 3b2db4300821cb523f44bb2408fbb3fa1756e399..dad3c8422d5a87616f6227110133f3fa5cf7e6a3 100644
--- a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_02.html
+++ b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_02.html
@@ -116,15 +116,15 @@
 <tbody>
 <tr class="row-even"><td><p>Raspberry Pi 4 Model B</p></td>
 <td><p>1</p></td>
-<td><p>58.75</p></td>
-<td><p>58.75</p></td>
+<td><p>58,75</p></td>
+<td><p>58,75</p></td>
 <td><p>Raspberry</p></td>
 <td><p>Raspberry Pi 4 Model B</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D">https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>LM158N AMP-o</p></td>
-<td><p>4</p></td>
-<td><p>14.5</p></td>
+<td><p>2</p></td>
+<td><p>14,5</p></td>
 <td><p>58</p></td>
 <td><p>Texas Instruments</p></td>
 <td><p>LM358AN/NOPB</p></td>
@@ -146,171 +146,166 @@
 </tr>
 <tr class="row-odd"><td><p>ADS1115</p></td>
 <td><p>2</p></td>
-<td><p>11.9</p></td>
-<td><p>23.8</p></td>
+<td><p>11,9</p></td>
+<td><p>23,8</p></td>
 <td><p>Adafruit</p></td>
 <td><p>1085</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D">https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Capacitor 100nF 50Vdc 10% Ceramic</p></td>
-<td><p>4</p></td>
-<td><p>0.2</p></td>
-<td><p>0.8</p></td>
+<td><p>3</p></td>
+<td><p>0,2</p></td>
+<td><p>0,8</p></td>
 <td><p>KEMET</p></td>
-<td><p>C320C104K1</p></td>
+<td><blockquote>
+<div><p>C320C104K1</p>
+</div></blockquote>
+</td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D">https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>Resistor 1 Kohm 0.5W +- 0.1%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>TE Connectivity</p></td>
 <td><p>H81K0BYA</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D">https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Resistor 1.5 Kohms +- 0.1%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>TE Connectivity</p></td>
 <td><p>H81K5BYA</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D">https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>Resistor 1.5 Kohms +- 5%</p></td>
 <td><p>2</p></td>
-<td><p>1.3</p></td>
-<td><p>2.6</p></td>
+<td><p>1,3</p></td>
+<td><p>2,6</p></td>
 <td><p>Vishay</p></td>
 <td><p>CCF071K50GKE36</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D">https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Resistor 10 Mohms +-5%</p></td>
 <td><p>2</p></td>
-<td><p>0.762</p></td>
-<td><p>1.524</p></td>
+<td><p>0,762</p></td>
+<td><p>1,524</p></td>
 <td><p>VISHAY</p></td>
 <td><p>CMF651M0000FKEK143</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D">https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>2 ohm shunt resistor+-  1%</p></td>
 <td><p>1</p></td>
-<td><p>2.42</p></td>
-<td><p>2.42</p></td>
+<td><p>2,42</p></td>
+<td><p>2,42</p></td>
 <td><p>Ohmite</p></td>
 <td><p>41F2R0E</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D">https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>Dual screw terminal (5.08-mm pitch)</p></td>
 <td><p>5</p></td>
-<td><p>0.648</p></td>
-<td><p>3.24</p></td>
+<td><p>0,648</p></td>
+<td><p>3,24</p></td>
 <td><p>CUI Devices</p></td>
 <td><p>TB009-508-02BE</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D">https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>DC/DC converter 12 to 24V</p></td>
-<td><p>2</p></td>
-<td><p>15.58</p></td>
-<td><p>31.16</p></td>
+<td><p>1</p></td>
+<td><p>15,58</p></td>
+<td><p>31,16</p></td>
 <td><p>TracoPower</p></td>
 <td><p>TRN 3-1215</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D">https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>DIP Dual In Line Socket 2*4</p></td>
 <td><p>3</p></td>
-<td><p>0.72</p></td>
-<td><p>2.16</p></td>
+<td><p>0,72</p></td>
+<td><p>2,16</p></td>
 <td><p>Mill-Max</p></td>
 <td><p>110-43-308-41-001000</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE">https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE</a></p></td>
 </tr>
 <tr class="row-odd"><td><p>AQY211EH</p></td>
 <td><p>4</p></td>
-<td><p>3.84</p></td>
-<td><p>15.36</p></td>
+<td><p>3,84</p></td>
+<td><p>15,36</p></td>
 <td><p>Panasonic Industrial Devices</p></td>
 <td><p>AQY211EH</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D">https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D</a></p></td>
 </tr>
 <tr class="row-even"><td><p>DIP Dual In Line Socket 2*2</p></td>
 <td><p>4</p></td>
-<td><p>0.449</p></td>
-<td><p>1.796</p></td>
+<td><p>0,449</p></td>
+<td><p>1,796</p></td>
 <td><p>Preci-dip</p></td>
 <td><p>110-83-304-41-001101</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D">https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>SSQ-103-03-G-D</p></td>
-<td><p>1</p></td>
-<td><p>2.06</p></td>
-<td><p>2.06</p></td>
-<td><p>Samtec</p></td>
-<td><p>SSQ-103-03-G-D</p></td>
-<td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSQ-103-03-G-D?qs=rU5fayqh%252BE2Z%252BZTchcPoHQ%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSQ-103-03-G-D?qs=rU5fayqh%252BE2Z%252BZTchcPoHQ%3D%3D</a></p></td>
-</tr>
-<tr class="row-even"><td><p>MCP23008</p></td>
+<tr class="row-odd"><td><p>MCP23008</p></td>
 <td><p>1</p></td>
-<td><p>1.72</p></td>
-<td><p>1.72</p></td>
+<td><p>1,72</p></td>
+<td><p>1,72</p></td>
 <td><p>Adafruit</p></td>
 <td><p>593</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D">https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>Header sets 1x10</p></td>
+<tr class="row-even"><td><p>Header sets 1x10</p></td>
 <td><p>2</p></td>
-<td><p>2.12</p></td>
-<td><p>4.24</p></td>
+<td><p>2,12</p></td>
+<td><p>4,24</p></td>
 <td><p>Samtec</p></td>
 <td><p>SSW-110-02-G-S</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>SMT Breakout PCB for SOIC-8</p></td>
+<tr class="row-odd"><td><p>SMT Breakout PCB for SOIC-8</p></td>
 <td><p>1</p></td>
-<td><p>2.5</p></td>
-<td><p>2.5</p></td>
+<td><p>2,5</p></td>
+<td><p>2,5</p></td>
 <td><p>Adafruit</p></td>
 <td><p>1212</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE">https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&amp;mgh=1&amp;vip=1&amp;gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>INA282AID</p></td>
+<tr class="row-even"><td><p>INA282AID</p></td>
 <td><p>1</p></td>
-<td><p>4.11</p></td>
-<td><p>4.11</p></td>
+<td><p>4,11</p></td>
+<td><p>4,11</p></td>
 <td><p>Texas Instruments</p></td>
 <td><p>INA282AID</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D">https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>THD 15-1211N</p></td>
+<tr class="row-odd"><td><p>THD 15-1211N</p></td>
 <td><p>1</p></td>
-<td><p>39.72</p></td>
-<td><p>39.72</p></td>
+<td><p>39,72</p></td>
+<td><p>39,72</p></td>
 <td><p>TracoPower</p></td>
 <td><p>THD 15-1211N</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D">https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>DIP Dual In Line Socket 2*20</p></td>
+<tr class="row-even"><td><p>DIP Dual In Line Socket 2*20</p></td>
 <td><p>1</p></td>
-<td><p>8.53</p></td>
-<td><p>8.53</p></td>
+<td><p>8,53</p></td>
+<td><p>8,53</p></td>
 <td><p>Samtec</p></td>
 <td><p>SSQ-120-23-G-D</p></td>
 <td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D">https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D</a></p></td>
 </tr>
-<tr class="row-even"><td><p>Pin strip no ejector</p></td>
+<tr class="row-odd"><td><p>Pin strip no ejector</p></td>
 <td><p>1</p></td>
-<td><p>0.35</p></td>
-<td><p>0.35</p></td>
+<td><p>0,35</p></td>
+<td><p>0,35</p></td>
 <td><p>BLK electronic</p></td>
 <td><p>10120550</p></td>
 <td><p><a class="reference external" href="https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&amp;searchType=suggest&amp;searchSuggest=product">https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&amp;searchType=suggest&amp;searchSuggest=product</a></p></td>
 </tr>
-<tr class="row-odd"><td><p>Male Female spacer 2.5M HEXAGONALE</p></td>
-<td><p>	4</p></td>
-<td><p>	0.87</p></td>
-<td><p>	3.48</p></td>
-<td><p>	HARWIN</p></td>
-<td><p>	R25-3002002</p></td>
-<td><p>	<a class="reference external" href="https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D">https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D</a></p></td>
+<tr class="row-even"><td><p>Male Female spacer 2.5M HEXAGONALE</p></td>
+<td><p>4</p></td>
+<td><p>0,87</p></td>
+<td><p>3,48</p></td>
+<td><p>HARWIN</p></td>
+<td><p>R25-3002002</p></td>
+<td><p><a class="reference external" href="https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D">https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D</a></p></td>
 </tr>
 </tbody>
 </table>
@@ -325,7 +320,7 @@ We have developed a complete “plug and play” measurement board. To measure e
 two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the
 input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component,
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:</p>
+which allows to realize precise current measurement around a shunt resistor. The assembly are described in the following steps:</p>
 <table class="docutils align-center">
 <colgroup>
 <col style="width: 12%" />
@@ -483,6 +478,10 @@ electrodes A and B</p></td>
 </tr>
 </tbody>
 </table>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>In this version, We used a shunt resistor of 2 ohms, which limits the current measurement to 48 mA. If the current is higher than this value, you just have to decrease the value of the shunt resistor.Change the shunt value in the code.</p>
+</div>
 <table class="docutils align-center">
 <colgroup>
 <col style="width: 13%" />
@@ -606,7 +605,7 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/20_mes_board.jpg" src="../_images/20_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Fixing MCP23008 component</p></td>
+<tr class="row-even"><td><p>Fixing MCP23008 component (Dot mark on the top left corner)</p></td>
 </tr>
 </tbody>
 </table>
@@ -620,7 +619,8 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/21_mes_board.jpg" src="../_images/21_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Mounting optical relay, AQY211EH</p></td>
+<tr class="row-even"><td><p>Mounting optical relay, AQY211EH (Dot mark in the top left
+corners)</p></td>
 </tr>
 </tbody>
 </table>
@@ -662,7 +662,7 @@ for Raspberry Pi connection</p></td>
 <td><img alt="../_images/24_mes_board.jpg" src="../_images/24_mes_board.jpg" />
 </td>
 </tr>
-<tr class="row-even"><td><p>Fixing the INA282</p></td>
+<tr class="row-even"><td><p>Fixing the INA282 (Dot mark in the top right corner)</p></td>
 </tr>
 </tbody>
 </table>
@@ -904,7 +904,8 @@ on the screen.</p></td>
 </td>
 </tr>
 <tr class="row-even"><td><p>Install the red cables on the +12V terminal and black cable
-on the ground terminal.</p></td>
+on the ground terminal. Connect to two different 12V
+batteries</p></td>
 </tr>
 </tbody>
 </table>
@@ -929,7 +930,7 @@ on the ground terminal.</p></td>
 </colgroup>
 <tbody>
 <tr class="row-odd"><td rowspan="2"><p>7</p></td>
-<td><img alt="../_images/thonny_first_interface2.jpg" src="../_images/thonny_first_interface2.jpg" />
+<td><img alt="../_images/thonny_first_interface1.jpg" src="../_images/thonny_first_interface1.jpg" />
 </td>
 </tr>
 <tr class="row-even"><td><p>Run Tonny Interpreter</p></td>
@@ -947,7 +948,7 @@ on the ground terminal.</p></td>
 </td>
 </tr>
 <tr class="row-even"><td><p>Run Ohmpi_4elec.py, if everything works you should
-get the following result</p></td>
+get the following result (220 ohm)</p></td>
 </tr>
 </tbody>
 </table>
diff --git a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_03.html b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_03.html
index 55294eecec2c06101ef5a9ff2775d347795e79ef..144fa110a39ac45898e22d0af276b0d389dcc2ee 100644
--- a/sphinx/build/html/Ohmpi_V2_00/V2_00_step_03.html
+++ b/sphinx/build/html/Ohmpi_V2_00/V2_00_step_03.html
@@ -39,7 +39,7 @@
 <li class="toctree-l1"><a class="reference internal" href="../Ohmpi.html">OhmPi project</a></li>
 <li class="toctree-l1"><a class="reference internal" href="../V1_01.html">OhmPi V 1.01 (limited to 32 electrodes)</a></li>
 <li class="toctree-l1"><a class="reference internal" href="../V1_02.html">OhmPi V 1.02 (limited to 32 electrodes)</a></li>
-<li class="toctree-l1 current"><a class="reference internal" href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes)</a><ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes and 12V)</a><ul class="current">
 <li class="toctree-l2"><a class="reference internal" href="../V2_00.html#the-philosophy-of-ohmpi">The philosophy of Ohmpi</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../V2_00.html#technical-data">Technical data</a></li>
 <li class="toctree-l2 current"><a class="reference internal" href="../V2_00.html#ohmpi-2-step-by-step">Ohmpi 2 step by step</a><ul class="current">
@@ -47,6 +47,7 @@
 <li class="toctree-l3"><a class="reference internal" href="V2_00_step_02.html"><strong>STEP n°2</strong>: Measurement board</a></li>
 <li class="toctree-l3 current"><a class="current reference internal" href="#"><strong>STEP n°3</strong>: MUX board</a><ul>
 <li class="toctree-l4"><a class="reference internal" href="#part-a-assembly-of-mux-board"><strong>PART A</strong> Assembly of MUX board</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#part-b-test-of-mux-board"><strong>PART B</strong> Test of MUX board</a></li>
 </ul>
 </li>
 </ul>
@@ -69,7 +70,7 @@
           <div role="navigation" aria-label="Page navigation">
   <ul class="wy-breadcrumbs">
       <li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
-          <li><a href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes)</a> &raquo;</li>
+          <li><a href="../V2_00.html">OhmPi V 2.xx (64 or 128 electrodes and 12V)</a> &raquo;</li>
       <li><strong>STEP n°3</strong>: MUX board</li>
       <li class="wy-breadcrumbs-aside">
             <a href="../_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt" rel="nofollow"> View page source</a>
@@ -87,7 +88,7 @@
 <div class="section" id="required-components">
 <h3>Required components<a class="headerlink" href="#required-components" title="Permalink to this headline">¶</a></h3>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="../_images/00_mes_board_components1.jpg"><img alt="alternate text" src="../_images/00_mes_board_components1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="../_images/MUX_board_componement.jpg"><img alt="alternate text" src="../_images/MUX_board_componement.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <table class="colwidths-given docutils align-default" id="id1">
 <caption><span class="caption-text">List of components</span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
@@ -255,7 +256,170 @@
 </tr>
 </tbody>
 </table>
+<p>The multiplexing of the channels is a mechanical multiplexing based on OMRON’s manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs.
+We used gpio expender I2C (MCP23017). We have associated these components with an I2C muliplexer of type type TCA9548A from adafruit.
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77.
+In the following presentation for an Ohmpi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N.
+0X73 for the N channel. 4 MUX board will be needed to multiplex an Ohmpi 64 electrodes.</p>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>1</p></td>
+<td><img alt="../_images/MUX_00.jpg" src="../_images/MUX_00.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Mux board pcb</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>2</p></td>
+<td><img alt="../_images/MUX_01.jpg" src="../_images/MUX_01.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the 150 Kohm resistors</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>3</p></td>
+<td><img alt="../_images/MUX_02.jpg" src="../_images/MUX_02.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the mosfet ZVN4206A</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>4</p></td>
+<td><img alt="../_images/MUX_03.jpg" src="../_images/MUX_03.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the diode-1n4007</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>5</p></td>
+<td><img alt="../_images/MUX_04.jpg" src="../_images/MUX_04.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of the relay</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>6</p></td>
+<td><img alt="../_images/MUX_05.jpg" src="../_images/MUX_05.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Instalation of the terminal screw</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>7</p></td>
+<td><img alt="../_images/MUX_06.jpg" src="../_images/MUX_06.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of generic male header</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>8</p></td>
+<td><img alt="../_images/MUX_07.jpg" src="../_images/MUX_07.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of Pin strip (6 pins)  and pin strip (16 pins)</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>9</p></td>
+<td><img alt="../_images/MUX_08.jpg" src="../_images/MUX_08.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of DIP Dual In Line Socket 2*14</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>10</p></td>
+<td><img alt="../_images/MUX_09.jpg" src="../_images/MUX_09.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of Adafruit TCA9548A</p></td>
+</tr>
+</tbody>
+</table>
+<table class="docutils align-center">
+<colgroup>
+<col style="width: 12%" />
+<col style="width: 88%" />
+</colgroup>
+<tbody>
+<tr class="row-odd"><td rowspan="2"><p>10</p></td>
+<td><img alt="../_images/MUX_10.jpg" src="../_images/MUX_10.jpg" />
+</td>
+</tr>
+<tr class="row-even"><td><p>Installation of MCP23017</p></td>
+</tr>
+</tbody>
+</table>
+</div>
 </div>
+<div class="section" id="part-b-test-of-mux-board">
+<h2><strong>PART B</strong> Test of MUX board<a class="headerlink" href="#part-b-test-of-mux-board" title="Permalink to this headline">¶</a></h2>
 </div>
 </div>
 
diff --git a/sphinx/build/html/V1_01.html b/sphinx/build/html/V1_01.html
index 768b87788f9e05441e6aa679a3656b983bab73da..e39b5bcd05fc3df33d2d120906257e843db1d862 100644
--- a/sphinx/build/html/V1_01.html
+++ b/sphinx/build/html/V1_01.html
@@ -259,7 +259,7 @@ to leave the virtual environment simply type:</p>
 <p>1- Run the Thonny Python IDE software, Click on raspebrry acces <strong>menu &gt; programming&gt; Thonny pythonIDE</strong></p>
 <p>2- Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))</p>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="_images/thonny_first_interface1.jpg"><img alt="alternate text" src="_images/thonny_first_interface1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="_images/thonny_first_interface2.jpg"><img alt="alternate text" src="_images/thonny_first_interface2.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <p>3-Click on <strong>Run&gt;select interpreter</strong>, a new window opens click on interpret</p>
 <div class="align-center figure">
diff --git a/sphinx/build/html/V1_02.html b/sphinx/build/html/V1_02.html
index f286a04154eeac868d53bdac51de90383680598c..6b2f19822a78618b5c86bd9f7ced602c263a30e5 100644
--- a/sphinx/build/html/V1_02.html
+++ b/sphinx/build/html/V1_02.html
@@ -257,7 +257,7 @@ to leave the virtual environment simply type:</p>
 <p>1- Run the Thonny Python IDE software, Click on raspebrry acces <strong>menu &gt; programming&gt; Thonny pythonIDE</strong></p>
 <p>2- Thonny’s interface opens, Python runs on the Root (Python 3.7.3 (/usr/bin/python3))</p>
 <div class="align-center figure">
-<a class="reference internal image-reference" href="_images/thonny_first_interface1.jpg"><img alt="alternate text" src="_images/thonny_first_interface1.jpg" style="width: 600px; height: 450px;" /></a>
+<a class="reference internal image-reference" href="_images/thonny_first_interface2.jpg"><img alt="alternate text" src="_images/thonny_first_interface2.jpg" style="width: 600px; height: 450px;" /></a>
 </div>
 <p>3-Click on <strong>Run&gt;select interpreter</strong>, a new window opens click on interpret</p>
 <div class="align-center figure">
diff --git a/sphinx/build/html/V2_00.html b/sphinx/build/html/V2_00.html
index e6c583e736844a9a707b0951d334e648b8cb021d..ccdb011362c7809e98e5ec8bc84684ec8ded22fe 100644
--- a/sphinx/build/html/V2_00.html
+++ b/sphinx/build/html/V2_00.html
@@ -216,6 +216,7 @@ control system</p></td>
 <li class="toctree-l3"><a class="reference internal" href="Ohmpi_V2_00/V2_00_step_03.html#required-components">Required components</a></li>
 </ul>
 </li>
+<li class="toctree-l2"><a class="reference internal" href="Ohmpi_V2_00/V2_00_step_03.html#part-b-test-of-mux-board"><strong>PART B</strong> Test of MUX board</a></li>
 </ul>
 </li>
 </ul>
diff --git a/sphinx/build/html/_images/00_mes_board_components1.jpg b/sphinx/build/html/_images/00_mes_board_components1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a04c9abdf2e35f6793c3ca0230c0a6f81a7ceb5d
Binary files /dev/null and b/sphinx/build/html/_images/00_mes_board_components1.jpg differ
diff --git a/sphinx/build/html/_images/01_mes_board.jpg b/sphinx/build/html/_images/01_mes_board.jpg
index 2baa894bd38ab71c7a2f03bfca10a382ce93a0b9..237c47dca441248fde4a29fb3abbe983c2b357e4 100644
Binary files a/sphinx/build/html/_images/01_mes_board.jpg and b/sphinx/build/html/_images/01_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/03_mes_board.jpg b/sphinx/build/html/_images/03_mes_board.jpg
index 41381d5341aed8952dab89fa31ed7c0303e50205..e52e56db4257d5076984ea68eb86f8ca2fe23a6d 100644
Binary files a/sphinx/build/html/_images/03_mes_board.jpg and b/sphinx/build/html/_images/03_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/04_mes_board.jpg b/sphinx/build/html/_images/04_mes_board.jpg
index 988d238ad7fc61d9fb594467729879635deec63b..ed42f99b544b41a3dc361d42be429b3e0b47d8c8 100644
Binary files a/sphinx/build/html/_images/04_mes_board.jpg and b/sphinx/build/html/_images/04_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/06_mes_board.jpg b/sphinx/build/html/_images/06_mes_board.jpg
index 94a903f0c942832b86d2f074b95ea5c65a58553b..16894c29798019e2229ada80b6df85b8e4cc69e1 100644
Binary files a/sphinx/build/html/_images/06_mes_board.jpg and b/sphinx/build/html/_images/06_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/07_mes_board.jpg b/sphinx/build/html/_images/07_mes_board.jpg
index 954aabf761288a96221d98914011a337cd6664ad..0327314ce5fa099577d3d9e15e9b1b9570d47bb4 100644
Binary files a/sphinx/build/html/_images/07_mes_board.jpg and b/sphinx/build/html/_images/07_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/08_mes_board.jpg b/sphinx/build/html/_images/08_mes_board.jpg
index 645ed57a8f2c9118f57500a4aa575913770acdad..968e454a8fb4abb3e001d7923a72f47ef6c645bb 100644
Binary files a/sphinx/build/html/_images/08_mes_board.jpg and b/sphinx/build/html/_images/08_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/09_mes_board.jpg b/sphinx/build/html/_images/09_mes_board.jpg
index 28dc97fb5c4c69eec691f6070b7ff79674eae41c..ba7032edab114205c03bf3424866ca75862a49d6 100644
Binary files a/sphinx/build/html/_images/09_mes_board.jpg and b/sphinx/build/html/_images/09_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/11_mes_board.jpg b/sphinx/build/html/_images/11_mes_board.jpg
index b9f76edf4a3fd158a8b3cb36fe8216c5d0f2d70d..0943785ea02a53667d3fd17de1f2d42ef54455c1 100644
Binary files a/sphinx/build/html/_images/11_mes_board.jpg and b/sphinx/build/html/_images/11_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/13_mes_board.jpg b/sphinx/build/html/_images/13_mes_board.jpg
index c954948f8b497ac5a62701a2cbcba8d8133258b4..e2c364ae2f79db84ddedff044e8d30e0380f4741 100644
Binary files a/sphinx/build/html/_images/13_mes_board.jpg and b/sphinx/build/html/_images/13_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/14_mes_board.jpg b/sphinx/build/html/_images/14_mes_board.jpg
index 06db732127be7c32a33d2153f3a58a764466891b..31c7f113e432921c311b3ce4967a2be82f2e3f5e 100644
Binary files a/sphinx/build/html/_images/14_mes_board.jpg and b/sphinx/build/html/_images/14_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/15_mes_board.jpg b/sphinx/build/html/_images/15_mes_board.jpg
index cf98e5c5ce8ffe7373e6aee0bc7e13b880f47db8..43a4682dead6a8ffc87d444f7bfe9daabb577938 100644
Binary files a/sphinx/build/html/_images/15_mes_board.jpg and b/sphinx/build/html/_images/15_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/16_mes_board.jpg b/sphinx/build/html/_images/16_mes_board.jpg
index 930821538195751d3b6be551bbf605711bf394f4..3dfa61ba684f9275e912e3f33f5b42daca0d6dd2 100644
Binary files a/sphinx/build/html/_images/16_mes_board.jpg and b/sphinx/build/html/_images/16_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/17_mes_board.jpg b/sphinx/build/html/_images/17_mes_board.jpg
index a2cdc3b622201e41ee870d3c88dbd7bfe72c4fd1..90a4b6a1f978195d694abefb01a36d427a340365 100644
Binary files a/sphinx/build/html/_images/17_mes_board.jpg and b/sphinx/build/html/_images/17_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/18_mes_board.jpg b/sphinx/build/html/_images/18_mes_board.jpg
index 699b20b0a617d080aa2ddcdbab91960a821ee3f7..7abcf130948510785c57bbcf4b83f3e663c26eeb 100644
Binary files a/sphinx/build/html/_images/18_mes_board.jpg and b/sphinx/build/html/_images/18_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/19_mes_board.jpg b/sphinx/build/html/_images/19_mes_board.jpg
index f191473cb7982f67488e13a62ea6e53bc97e4e26..a3ec0b5f27b71f3ebc71685ca6e24c473324188a 100644
Binary files a/sphinx/build/html/_images/19_mes_board.jpg and b/sphinx/build/html/_images/19_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/20211206_144334.jpg b/sphinx/build/html/_images/20211206_144334.jpg
index 2a0c06b5febef44d48975b274c2a9ea30cf397f9..ce94d8e783f3be1f89190dca989ba570b3d27de5 100644
Binary files a/sphinx/build/html/_images/20211206_144334.jpg and b/sphinx/build/html/_images/20211206_144334.jpg differ
diff --git a/sphinx/build/html/_images/20_mes_board.jpg b/sphinx/build/html/_images/20_mes_board.jpg
index f6780cd498352806e601bd9e77b9e6a9076b47c0..790fa362dc0ba5b00515862e62e2ade622a70d4e 100644
Binary files a/sphinx/build/html/_images/20_mes_board.jpg and b/sphinx/build/html/_images/20_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/21_mes_board.jpg b/sphinx/build/html/_images/21_mes_board.jpg
index faf681109fae1e1a4115b95c3fca1b83608fd550..c8628d9c4aecbbd48215f53c78661baee4b33c5a 100644
Binary files a/sphinx/build/html/_images/21_mes_board.jpg and b/sphinx/build/html/_images/21_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/22_mes_board.jpg b/sphinx/build/html/_images/22_mes_board.jpg
index 6b3e2ad86a98550cc53a2053a1151f67dad2d741..bf1defadf621dfc6053ff47ea933de519157d06b 100644
Binary files a/sphinx/build/html/_images/22_mes_board.jpg and b/sphinx/build/html/_images/22_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/23_mes_board.jpg b/sphinx/build/html/_images/23_mes_board.jpg
index 6fa589f253fea3036bc1363592f803782dcce7b3..e9c8845baac74db8b8d3d218b1b71b57b064d37b 100644
Binary files a/sphinx/build/html/_images/23_mes_board.jpg and b/sphinx/build/html/_images/23_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/24_mes_board.jpg b/sphinx/build/html/_images/24_mes_board.jpg
index 767e901170e31f12a7834931950bce5f3d8ca776..956a8f379a79cb4a49a03d777c98d339effc9b7f 100644
Binary files a/sphinx/build/html/_images/24_mes_board.jpg and b/sphinx/build/html/_images/24_mes_board.jpg differ
diff --git a/sphinx/build/html/_images/Inked20211206_150522_LI.jpg b/sphinx/build/html/_images/Inked20211206_150522_LI.jpg
index 5ec54996e216cb474520c30190b9ff6ac74cbf15..3f8ba9c3978be068fcd902bda5f37b2ba1cb0541 100644
Binary files a/sphinx/build/html/_images/Inked20211206_150522_LI.jpg and b/sphinx/build/html/_images/Inked20211206_150522_LI.jpg differ
diff --git a/sphinx/build/html/_images/Inked20211206_150522_LI2.jpg b/sphinx/build/html/_images/Inked20211206_150522_LI2.jpg
index b688467d89317bb015671419dcbae7a6afbe569b..eeeccbe38189f1ae07e71ab4f99d14a881379871 100644
Binary files a/sphinx/build/html/_images/Inked20211206_150522_LI2.jpg and b/sphinx/build/html/_images/Inked20211206_150522_LI2.jpg differ
diff --git a/sphinx/build/html/_images/MUX_00.jpg b/sphinx/build/html/_images/MUX_00.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fb2cf2d57c8ca616fd6c37c1f6d8d37a6d3b0be8
Binary files /dev/null and b/sphinx/build/html/_images/MUX_00.jpg differ
diff --git a/sphinx/build/html/_images/MUX_01.jpg b/sphinx/build/html/_images/MUX_01.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8dc00f59bbe6c9a9f0de7cad657eb19878d2ccdd
Binary files /dev/null and b/sphinx/build/html/_images/MUX_01.jpg differ
diff --git a/sphinx/build/html/_images/MUX_02.jpg b/sphinx/build/html/_images/MUX_02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7601e8b721e6f47ed75a245bd2625d2d07e3950c
Binary files /dev/null and b/sphinx/build/html/_images/MUX_02.jpg differ
diff --git a/sphinx/build/html/_images/MUX_03.jpg b/sphinx/build/html/_images/MUX_03.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e87437e4f187bbc3aaf1a2186c19ab6827d8c2ea
Binary files /dev/null and b/sphinx/build/html/_images/MUX_03.jpg differ
diff --git a/sphinx/build/html/_images/MUX_04.jpg b/sphinx/build/html/_images/MUX_04.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b80c7e30b84649d3b684266ffa7a8a528a98d5df
Binary files /dev/null and b/sphinx/build/html/_images/MUX_04.jpg differ
diff --git a/sphinx/build/html/_images/MUX_05.jpg b/sphinx/build/html/_images/MUX_05.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa6d46a10980852997d917165b79c34e6dc54812
Binary files /dev/null and b/sphinx/build/html/_images/MUX_05.jpg differ
diff --git a/sphinx/build/html/_images/MUX_06.jpg b/sphinx/build/html/_images/MUX_06.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..73be96cbd21173e8bf355030e90bd1e768e52c03
Binary files /dev/null and b/sphinx/build/html/_images/MUX_06.jpg differ
diff --git a/sphinx/build/html/_images/MUX_07.jpg b/sphinx/build/html/_images/MUX_07.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1086d5ab36c451047701fb728d9e5f1fc37f7af8
Binary files /dev/null and b/sphinx/build/html/_images/MUX_07.jpg differ
diff --git a/sphinx/build/html/_images/MUX_08.jpg b/sphinx/build/html/_images/MUX_08.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..af86ba353fed5b6d9231ca13771ea9556c149907
Binary files /dev/null and b/sphinx/build/html/_images/MUX_08.jpg differ
diff --git a/sphinx/build/html/_images/MUX_09.jpg b/sphinx/build/html/_images/MUX_09.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0f3247cc8858201b4919d45a6ec450e099dd6480
Binary files /dev/null and b/sphinx/build/html/_images/MUX_09.jpg differ
diff --git a/sphinx/build/html/_images/MUX_10.jpg b/sphinx/build/html/_images/MUX_10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..22bdca2ac5b44182e19801e4b00cdedfbec43864
Binary files /dev/null and b/sphinx/build/html/_images/MUX_10.jpg differ
diff --git a/sphinx/build/html/_images/MUX_board_componement.jpg b/sphinx/build/html/_images/MUX_board_componement.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6fdad018330cc86c50b18552261d58359c79bc9c
Binary files /dev/null and b/sphinx/build/html/_images/MUX_board_componement.jpg differ
diff --git a/sphinx/build/html/_images/connection.jpg b/sphinx/build/html/_images/connection.jpg
index e2b5e01b748d01d8eeed57b2526b83dd00822605..be7b2f429969bf07174631ee63f4d13f47bc9bad 100644
Binary files a/sphinx/build/html/_images/connection.jpg and b/sphinx/build/html/_images/connection.jpg differ
diff --git a/sphinx/build/html/_images/installation_current_board.jpg b/sphinx/build/html/_images/installation_current_board.jpg
index 2674efdd8fbdbc6cd539fad3e16858783f26bfac..669a2724f34c02c0abb14f5cac4649bfef50208a 100644
Binary files a/sphinx/build/html/_images/installation_current_board.jpg and b/sphinx/build/html/_images/installation_current_board.jpg differ
diff --git a/sphinx/build/html/_images/measurement_board1-02.jpg b/sphinx/build/html/_images/measurement_board1-02.jpg
index 559aead766a8549f1ab9c35991a912cb3dfc7be0..561140f366d25901936fc3e6ae2ad9c08f145889 100644
Binary files a/sphinx/build/html/_images/measurement_board1-02.jpg and b/sphinx/build/html/_images/measurement_board1-02.jpg differ
diff --git a/sphinx/build/html/_images/schema_measurement_board.jpg b/sphinx/build/html/_images/schema_measurement_board.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..e6a0633b3ab41ad782d7b0d4539119784aefde46 100644
Binary files a/sphinx/build/html/_images/schema_measurement_board.jpg and b/sphinx/build/html/_images/schema_measurement_board.jpg differ
diff --git a/sphinx/build/html/_images/schema_measurement_board1.jpg b/sphinx/build/html/_images/schema_measurement_board1.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..da38456330fc28f6a1c562709c6dc4a4b3685922 100644
Binary files a/sphinx/build/html/_images/schema_measurement_board1.jpg and b/sphinx/build/html/_images/schema_measurement_board1.jpg differ
diff --git a/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
index 51db436b12ff9740083e543f8be4a2ed566be331..4aeb76b6093e6d455a8089d0b74c5bdfb69ad11c 100644
--- a/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
+++ b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_01.rst.txt
@@ -1,4 +1,4 @@
-**STEP n°1** : Raspberry Pi  configuration
+**STEP n°1** : Raspberry Pi  configuration 
 *******************************************
 
 
@@ -19,12 +19,13 @@
 |Computer Keyboard                                   |              1|
 +----------------------------------------------------+---------------+
 
+
 The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). 
 For this step, the installation instructions are well described on the Raspberry website 
 
 1. Watch the vidéo "how to set up your raspberry Pi" (https://www.youtube.com/watch?v=wjWZhV1v3Pk)
 
-2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
+2. The authors recommend installing the latest stable and complete version of Raspberry Pi OS (Previously called Raspbian) by using Raspberry Pi Imager.
 
 3. or you can visit this website : (https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)  
 
@@ -41,7 +42,7 @@ For this step, the installation instructions are well described on the Raspberry
 
 
 .. warning::
-	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated and **I2C option** must be activated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
 
 3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly. 
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
@@ -104,8 +105,9 @@ Activate it using the following command:
 Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
 
 .. code-block:: python
-	 
-	 pip install RPi.GPIO adafruit-blinka numpy adafruit-circuitpython-ads1x15 pandas
+     
+     export CFLAGS=-fcommon
+	 sudo pip install RPi.GPIO adafruit-blinka numpy pandas adafruit-circuitpython-ads1x15 adafruit-circuitpython-tca9548a adafruit-circuitpython-mcp230xx gpiozero
 
 Check that requirements are met using 
 
@@ -172,4 +174,4 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 9- Close thonny to save modifications
 
- 
\ No newline at end of file
+ 
diff --git a/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
index 63caad89aa3c0842f9f7846f3f92878576f08345..243ddd8ee3ec11314e9009e55c0dd1a971a379a1 100644
--- a/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
+++ b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_02.rst.txt
@@ -40,7 +40,7 @@ We have developed a complete "plug and play" measurement board. To measure elect
 two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the 
 input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component, 
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:
+which allows to realize precise current measurement around a shunt resistor. The assembly are described in the following steps:
 
 
 
@@ -152,6 +152,12 @@ which allows to realize precise current measurement around a shunt resistor. The
    |         |  Soldering three capacitors (100nF)                        | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
+
+.. warning::
+	 
+	 In this version, We used a shunt resistor of 2 ohms, which limits the current measurement to 48 mA. If the current is higher than this value, you just have to decrease the value of the shunt resistor.Change the shunt value in the code.
+
+
    
 .. table::
    :align: center
@@ -237,7 +243,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/20_mes_board.jpg                   |
    |20       +------------------------------------------------------------+
-   |         | Fixing MCP23008 component                                  | 
+   |         | Fixing MCP23008 component (Dot mark on the top left corner)| 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
    
@@ -247,8 +253,8 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/21_mes_board.jpg                   |
    |21       +------------------------------------------------------------+
-   |         |Mounting optical relay, AQY211EH                            | 
-   |         |                                                            |                                                                       
+   |         |Mounting optical relay, AQY211EH (Dot mark in the top left  | 
+   |         |corners)                                                    |                                                                       
    +---------+------------------------------------------------------------+
    
 .. table::
@@ -277,7 +283,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/24_mes_board.jpg                   |
    |24       +------------------------------------------------------------+
-   |         | Fixing the INA282                                          | 
+   |         | Fixing the INA282 (Dot mark in the top right corner)       | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
   
@@ -429,7 +435,8 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/Inked20211206_150522_LI.jpg        |
    |6       +------------------------------------------------------------+
    |        |Install the red cables on the +12V terminal and black cable |                                                                       
-   |        |on the ground terminal.                                     |
+   |        |on the ground terminal. Connect to two different 12V        |
+   |        |batteries                                                   |
    +--------+------------------------------------------------------------+ 
 
 .. table::
@@ -461,5 +468,5 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/20211206_144334.jpg                |
    |7       +------------------------------------------------------------+
    |        | Run Ohmpi_4elec.py, if everything works you should         |                    
-   |        | get the following result                                   |
+   |        | get the following result (220 ohm)                         |
    +--------+------------------------------------------------------------+ 
diff --git a/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3572f898d9da0797c700078e3d56a2ae01390e49
--- /dev/null
+++ b/sphinx/build/html/_sources/Ohmpi_V2_00/V2_00_step_03.rst.txt
@@ -0,0 +1,146 @@
+
+**STEP n°3**: MUX board
+****************************************************
+
+
+**PART A** Assembly of MUX board
+======================================================
+
+
+Required components 
+----------------------------------------------------
+
+.. figure:: step_n_3/a/MUX_board_componement.jpg       
+	   :width: 600px
+	   :align: center
+	   :height: 450px
+	   :alt: alternate text
+	   :figclass: align-center 
+
+
+.. csv-table:: List of components
+   :file: step_n_3/a/MUX_board_list_2_xx.csv
+   :widths: 30, 70, 70, 70, 70, 35, 35
+   :header-rows: 1 
+   
+The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with 
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. 
+We used gpio expender I2C (MCP23017). We have associated these components with an I2C muliplexer of type type TCA9548A from adafruit. 
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77. 
+In the following presentation for an Ohmpi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N. 
+0X73 for the N channel. 4 MUX board will be needed to multiplex an Ohmpi 64 electrodes.
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_00.jpg                         |
+   |      1 +------------------------------------------------------------+
+   |        |Mux board pcb                                               | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_01.jpg                         |
+   |      2 +------------------------------------------------------------+
+   |        |Installation of the 150 Kohm resistors                      | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_02.jpg                         |
+   |      3 +------------------------------------------------------------+
+   |        |Installation of the mosfet ZVN4206A                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+      
+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_03.jpg                         |
+   |      4 +------------------------------------------------------------+
+   |        |Installation of the diode-1n4007                            | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+    
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_04.jpg                         |
+   |      5 +------------------------------------------------------------+
+   |        |Installation of the relay                                   | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_05.jpg                         |
+   |      6 +------------------------------------------------------------+
+   |        |Instalation of the terminal screw                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_06.jpg                         |
+   |      7 +------------------------------------------------------------+
+   |        |Installation of generic male header                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+ 
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_07.jpg                         |
+   |      8 +------------------------------------------------------------+
+   |        |Installation of Pin strip (6 pins)  and pin strip (16 pins) | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_08.jpg                         |
+   |      9 +------------------------------------------------------------+
+   |        |Installation of DIP Dual In Line Socket 2*14                | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_09.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of Adafruit TCA9548A                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_10.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of MCP23017                                    | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+
+**PART B** Test of MUX board
+======================================================   
diff --git a/sphinx/build/html/_sources/V1_01.rst.txt b/sphinx/build/html/_sources/V1_01.rst.txt
index c144a69abe916e33b5df140e5c7dd5f927bc7e0d..f1610bfd3c48cce409df560574f596e77a84ab28 100644
--- a/sphinx/build/html/_sources/V1_01.rst.txt
+++ b/sphinx/build/html/_sources/V1_01.rst.txt
@@ -521,7 +521,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list.csv
+   :file: list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/build/html/_sources/V1_02.rst.txt b/sphinx/build/html/_sources/V1_02.rst.txt
index facd94d9c002801d153e30985810659c0e46048c..ff4c42ece839b61930eb862d4e9f47edfec01d83 100644
--- a/sphinx/build/html/_sources/V1_02.rst.txt
+++ b/sphinx/build/html/_sources/V1_02.rst.txt
@@ -533,7 +533,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list - 1_02.csv
+   :file: list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/build/html/_static/underscore-1.13.1.js b/sphinx/build/html/_static/underscore-1.13.1.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffd77af9648a47d389f2d6976d4aa1c44d7ce7ce
--- /dev/null
+++ b/sphinx/build/html/_static/underscore-1.13.1.js
@@ -0,0 +1,2042 @@
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define('underscore', factory) :
+  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
+    var current = global._;
+    var exports = global._ = factory();
+    exports.noConflict = function () { global._ = current; return exports; };
+  }()));
+}(this, (function () {
+  //     Underscore.js 1.13.1
+  //     https://underscorejs.org
+  //     (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+  //     Underscore may be freely distributed under the MIT license.
+
+  // Current version.
+  var VERSION = '1.13.1';
+
+  // Establish the root object, `window` (`self`) in the browser, `global`
+  // on the server, or `this` in some virtual machines. We use `self`
+  // instead of `window` for `WebWorker` support.
+  var root = typeof self == 'object' && self.self === self && self ||
+            typeof global == 'object' && global.global === global && global ||
+            Function('return this')() ||
+            {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var push = ArrayProto.push,
+      slice = ArrayProto.slice,
+      toString = ObjProto.toString,
+      hasOwnProperty = ObjProto.hasOwnProperty;
+
+  // Modern feature detection.
+  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+      supportsDataView = typeof DataView !== 'undefined';
+
+  // All **ECMAScript 5+** native function implementations that we hope to use
+  // are declared here.
+  var nativeIsArray = Array.isArray,
+      nativeKeys = Object.keys,
+      nativeCreate = Object.create,
+      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+  // Create references to these builtin functions because we override them.
+  var _isNaN = isNaN,
+      _isFinite = isFinite;
+
+  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+  // The largest integer that can be represented exactly.
+  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+  // Some functions take a variable number of arguments, or a few expected
+  // arguments at the beginning and then a variable number of values to operate
+  // on. This helper accumulates all remaining arguments past the function’s
+  // argument length (or an explicit `startIndex`), into an array that becomes
+  // the last argument. Similar to ES6’s "rest parameter".
+  function restArguments(func, startIndex) {
+    startIndex = startIndex == null ? func.length - 1 : +startIndex;
+    return function() {
+      var length = Math.max(arguments.length - startIndex, 0),
+          rest = Array(length),
+          index = 0;
+      for (; index < length; index++) {
+        rest[index] = arguments[index + startIndex];
+      }
+      switch (startIndex) {
+        case 0: return func.call(this, rest);
+        case 1: return func.call(this, arguments[0], rest);
+        case 2: return func.call(this, arguments[0], arguments[1], rest);
+      }
+      var args = Array(startIndex + 1);
+      for (index = 0; index < startIndex; index++) {
+        args[index] = arguments[index];
+      }
+      args[startIndex] = rest;
+      return func.apply(this, args);
+    };
+  }
+
+  // Is a given variable an object?
+  function isObject(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  }
+
+  // Is a given value equal to null?
+  function isNull(obj) {
+    return obj === null;
+  }
+
+  // Is a given variable undefined?
+  function isUndefined(obj) {
+    return obj === void 0;
+  }
+
+  // Is a given value a boolean?
+  function isBoolean(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  }
+
+  // Is a given value a DOM element?
+  function isElement(obj) {
+    return !!(obj && obj.nodeType === 1);
+  }
+
+  // Internal function for creating a `toString`-based type tester.
+  function tagTester(name) {
+    var tag = '[object ' + name + ']';
+    return function(obj) {
+      return toString.call(obj) === tag;
+    };
+  }
+
+  var isString = tagTester('String');
+
+  var isNumber = tagTester('Number');
+
+  var isDate = tagTester('Date');
+
+  var isRegExp = tagTester('RegExp');
+
+  var isError = tagTester('Error');
+
+  var isSymbol = tagTester('Symbol');
+
+  var isArrayBuffer = tagTester('ArrayBuffer');
+
+  var isFunction = tagTester('Function');
+
+  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+  var nodelist = root.document && root.document.childNodes;
+  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+    isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  var isFunction$1 = isFunction;
+
+  var hasObjectTag = tagTester('Object');
+
+  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+  // In IE 11, the most common among them, this problem also applies to
+  // `Map`, `WeakMap` and `Set`.
+  var hasStringTagBug = (
+        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+      ),
+      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+  var isDataView = tagTester('DataView');
+
+  // In IE 10 - Edge 13, we need a different heuristic
+  // to determine whether an object is a `DataView`.
+  function ie10IsDataView(obj) {
+    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+  }
+
+  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native `Array.isArray`.
+  var isArray = nativeIsArray || tagTester('Array');
+
+  // Internal function to check whether `key` is an own property name of `obj`.
+  function has$1(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  }
+
+  var isArguments = tagTester('Arguments');
+
+  // Define a fallback version of the method in browsers (ahem, IE < 9), where
+  // there isn't any inspectable "Arguments" type.
+  (function() {
+    if (!isArguments(arguments)) {
+      isArguments = function(obj) {
+        return has$1(obj, 'callee');
+      };
+    }
+  }());
+
+  var isArguments$1 = isArguments;
+
+  // Is a given object a finite number?
+  function isFinite$1(obj) {
+    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+  }
+
+  // Is the given value `NaN`?
+  function isNaN$1(obj) {
+    return isNumber(obj) && _isNaN(obj);
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function constant(value) {
+    return function() {
+      return value;
+    };
+  }
+
+  // Common internal logic for `isArrayLike` and `isBufferLike`.
+  function createSizePropertyCheck(getSizeProperty) {
+    return function(collection) {
+      var sizeProperty = getSizeProperty(collection);
+      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+    }
+  }
+
+  // Internal helper to generate a function to obtain property `key` from `obj`.
+  function shallowProperty(key) {
+    return function(obj) {
+      return obj == null ? void 0 : obj[key];
+    };
+  }
+
+  // Internal helper to obtain the `byteLength` property of an object.
+  var getByteLength = shallowProperty('byteLength');
+
+  // Internal helper to determine whether we should spend extensive checks against
+  // `ArrayBuffer` et al.
+  var isBufferLike = createSizePropertyCheck(getByteLength);
+
+  // Is a given value a typed array?
+  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+  function isTypedArray(obj) {
+    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+    // Otherwise, fall back on the above regular expression.
+    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+  }
+
+  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+  // Internal helper to obtain the `length` property of an object.
+  var getLength = shallowProperty('length');
+
+  // Internal helper to create a simple lookup structure.
+  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+  // circular imports. `emulatedSet` is a one-off solution that only works for
+  // arrays of strings.
+  function emulatedSet(keys) {
+    var hash = {};
+    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+    return {
+      contains: function(key) { return hash[key]; },
+      push: function(key) {
+        hash[key] = true;
+        return keys.push(key);
+      }
+    };
+  }
+
+  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+  // needed.
+  function collectNonEnumProps(obj, keys) {
+    keys = emulatedSet(keys);
+    var nonEnumIdx = nonEnumerableProps.length;
+    var constructor = obj.constructor;
+    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+    // Constructor is a special case.
+    var prop = 'constructor';
+    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+    while (nonEnumIdx--) {
+      prop = nonEnumerableProps[nonEnumIdx];
+      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+        keys.push(prop);
+      }
+    }
+  }
+
+  // Retrieve the names of an object's own properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`.
+  function keys(obj) {
+    if (!isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (has$1(obj, key)) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  function isEmpty(obj) {
+    if (obj == null) return true;
+    // Skip the more expensive `toString`-based type checks if `obj` has no
+    // `.length`.
+    var length = getLength(obj);
+    if (typeof length == 'number' && (
+      isArray(obj) || isString(obj) || isArguments$1(obj)
+    )) return length === 0;
+    return getLength(keys(obj)) === 0;
+  }
+
+  // Returns whether an object has a given set of `key:value` pairs.
+  function isMatch(object, attrs) {
+    var _keys = keys(attrs), length = _keys.length;
+    if (object == null) return !length;
+    var obj = Object(object);
+    for (var i = 0; i < length; i++) {
+      var key = _keys[i];
+      if (attrs[key] !== obj[key] || !(key in obj)) return false;
+    }
+    return true;
+  }
+
+  // If Underscore is called as a function, it returns a wrapped object that can
+  // be used OO-style. This wrapper holds altered versions of all functions added
+  // through `_.mixin`. Wrapped objects may be chained.
+  function _$1(obj) {
+    if (obj instanceof _$1) return obj;
+    if (!(this instanceof _$1)) return new _$1(obj);
+    this._wrapped = obj;
+  }
+
+  _$1.VERSION = VERSION;
+
+  // Extracts the result from a wrapped and chained object.
+  _$1.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // Provide unwrapping proxies for some methods used in engine operations
+  // such as arithmetic and JSON stringification.
+  _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
+
+  _$1.prototype.toString = function() {
+    return String(this._wrapped);
+  };
+
+  // Internal function to wrap or shallow-copy an ArrayBuffer,
+  // typed array or DataView to a new view, reusing the buffer.
+  function toBufferView(bufferSource) {
+    return new Uint8Array(
+      bufferSource.buffer || bufferSource,
+      bufferSource.byteOffset || 0,
+      getByteLength(bufferSource)
+    );
+  }
+
+  // We use this string twice, so give it a name for minification.
+  var tagDataView = '[object DataView]';
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function eq(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // `null` or `undefined` only equal to itself (strict comparison).
+    if (a == null || b == null) return false;
+    // `NaN`s are equivalent, but non-reflexive.
+    if (a !== a) return b !== b;
+    // Exhaust primitive checks
+    var type = typeof a;
+    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+    return deepEq(a, b, aStack, bStack);
+  }
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function deepEq(a, b, aStack, bStack) {
+    // Unwrap any wrapped objects.
+    if (a instanceof _$1) a = a._wrapped;
+    if (b instanceof _$1) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    // Work around a bug in IE 10 - Edge 13.
+    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+      if (!isDataView$1(b)) return false;
+      className = tagDataView;
+    }
+    switch (className) {
+      // These types are compared by value.
+      case '[object RegExp]':
+        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN.
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+      case '[object Symbol]':
+        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+      case '[object ArrayBuffer]':
+      case tagDataView:
+        // Coerce to typed array so we can fall through.
+        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+    }
+
+    var areArrays = className === '[object Array]';
+    if (!areArrays && isTypedArray$1(a)) {
+        var byteLength = getByteLength(a);
+        if (byteLength !== getByteLength(b)) return false;
+        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+        areArrays = true;
+    }
+    if (!areArrays) {
+      if (typeof a != 'object' || typeof b != 'object') return false;
+
+      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+                               isFunction$1(bCtor) && bCtor instanceof bCtor)
+                          && ('constructor' in a && 'constructor' in b)) {
+        return false;
+      }
+    }
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+    // Initializing stack of traversed objects.
+    // It's done here since we only need them for objects and arrays comparison.
+    aStack = aStack || [];
+    bStack = bStack || [];
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+
+    // Recursively compare objects and arrays.
+    if (areArrays) {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      length = a.length;
+      if (length !== b.length) return false;
+      // Deep compare the contents, ignoring non-numeric properties.
+      while (length--) {
+        if (!eq(a[length], b[length], aStack, bStack)) return false;
+      }
+    } else {
+      // Deep compare objects.
+      var _keys = keys(a), key;
+      length = _keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      if (keys(b).length !== length) return false;
+      while (length--) {
+        // Deep compare each member
+        key = _keys[length];
+        if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return true;
+  }
+
+  // Perform a deep comparison to check if two objects are equal.
+  function isEqual(a, b) {
+    return eq(a, b);
+  }
+
+  // Retrieve all the enumerable property names of an object.
+  function allKeys(obj) {
+    if (!isObject(obj)) return [];
+    var keys = [];
+    for (var key in obj) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Since the regular `Object.prototype.toString` type tests don't work for
+  // some types in IE 11, we use a fingerprinting heuristic instead, based
+  // on the methods. It's not great, but it's the best we got.
+  // The fingerprint method lists are defined below.
+  function ie11fingerprint(methods) {
+    var length = getLength(methods);
+    return function(obj) {
+      if (obj == null) return false;
+      // `Map`, `WeakMap` and `Set` have no enumerable keys.
+      var keys = allKeys(obj);
+      if (getLength(keys)) return false;
+      for (var i = 0; i < length; i++) {
+        if (!isFunction$1(obj[methods[i]])) return false;
+      }
+      // If we are testing against `WeakMap`, we need to ensure that
+      // `obj` doesn't have a `forEach` method in order to distinguish
+      // it from a regular `Map`.
+      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+    };
+  }
+
+  // In the interest of compact minification, we write
+  // each string in the fingerprints only once.
+  var forEachName = 'forEach',
+      hasName = 'has',
+      commonInit = ['clear', 'delete'],
+      mapTail = ['get', hasName, 'set'];
+
+  // `Map`, `WeakMap` and `Set` each have slightly different
+  // combinations of the above sublists.
+  var mapMethods = commonInit.concat(forEachName, mapTail),
+      weakMapMethods = commonInit.concat(mapTail),
+      setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+  var isWeakSet = tagTester('WeakSet');
+
+  // Retrieve the values of an object's properties.
+  function values(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[_keys[i]];
+    }
+    return values;
+  }
+
+  // Convert an object into a list of `[key, value]` pairs.
+  // The opposite of `_.object` with one argument.
+  function pairs(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [_keys[i], obj[_keys[i]]];
+    }
+    return pairs;
+  }
+
+  // Invert the keys and values of an object. The values must be serializable.
+  function invert(obj) {
+    var result = {};
+    var _keys = keys(obj);
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      result[obj[_keys[i]]] = _keys[i];
+    }
+    return result;
+  }
+
+  // Return a sorted list of the function names available on the object.
+  function functions(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (isFunction$1(obj[key])) names.push(key);
+    }
+    return names.sort();
+  }
+
+  // An internal function for creating assigner functions.
+  function createAssigner(keysFunc, defaults) {
+    return function(obj) {
+      var length = arguments.length;
+      if (defaults) obj = Object(obj);
+      if (length < 2 || obj == null) return obj;
+      for (var index = 1; index < length; index++) {
+        var source = arguments[index],
+            keys = keysFunc(source),
+            l = keys.length;
+        for (var i = 0; i < l; i++) {
+          var key = keys[i];
+          if (!defaults || obj[key] === void 0) obj[key] = source[key];
+        }
+      }
+      return obj;
+    };
+  }
+
+  // Extend a given object with all the properties in passed-in object(s).
+  var extend = createAssigner(allKeys);
+
+  // Assigns a given object with all the own properties in the passed-in
+  // object(s).
+  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+  var extendOwn = createAssigner(keys);
+
+  // Fill in a given object with default properties.
+  var defaults = createAssigner(allKeys, true);
+
+  // Create a naked function reference for surrogate-prototype-swapping.
+  function ctor() {
+    return function(){};
+  }
+
+  // An internal function for creating a new object that inherits from another.
+  function baseCreate(prototype) {
+    if (!isObject(prototype)) return {};
+    if (nativeCreate) return nativeCreate(prototype);
+    var Ctor = ctor();
+    Ctor.prototype = prototype;
+    var result = new Ctor;
+    Ctor.prototype = null;
+    return result;
+  }
+
+  // Creates an object that inherits from the given prototype object.
+  // If additional properties are provided then they will be added to the
+  // created object.
+  function create(prototype, props) {
+    var result = baseCreate(prototype);
+    if (props) extendOwn(result, props);
+    return result;
+  }
+
+  // Create a (shallow-cloned) duplicate of an object.
+  function clone(obj) {
+    if (!isObject(obj)) return obj;
+    return isArray(obj) ? obj.slice() : extend({}, obj);
+  }
+
+  // Invokes `interceptor` with the `obj` and then returns `obj`.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  function tap(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  }
+
+  // Normalize a (deep) property `path` to array.
+  // Like `_.iteratee`, this function can be customized.
+  function toPath$1(path) {
+    return isArray(path) ? path : [path];
+  }
+  _$1.toPath = toPath$1;
+
+  // Internal wrapper for `_.toPath` to enable minification.
+  // Similar to `cb` for `_.iteratee`.
+  function toPath(path) {
+    return _$1.toPath(path);
+  }
+
+  // Internal function to obtain a nested property in `obj` along `path`.
+  function deepGet(obj, path) {
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      if (obj == null) return void 0;
+      obj = obj[path[i]];
+    }
+    return length ? obj : void 0;
+  }
+
+  // Get the value of the (deep) property on `path` from `object`.
+  // If any property in `path` does not exist or if the value is
+  // `undefined`, return `defaultValue` instead.
+  // The `path` is normalized through `_.toPath`.
+  function get(object, path, defaultValue) {
+    var value = deepGet(object, toPath(path));
+    return isUndefined(value) ? defaultValue : value;
+  }
+
+  // Shortcut function for checking if an object has a given property directly on
+  // itself (in other words, not on a prototype). Unlike the internal `has`
+  // function, this public version can also traverse nested properties.
+  function has(obj, path) {
+    path = toPath(path);
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      var key = path[i];
+      if (!has$1(obj, key)) return false;
+      obj = obj[key];
+    }
+    return !!length;
+  }
+
+  // Keep the identity function around for default iteratees.
+  function identity(value) {
+    return value;
+  }
+
+  // Returns a predicate for checking whether an object has a given set of
+  // `key:value` pairs.
+  function matcher(attrs) {
+    attrs = extendOwn({}, attrs);
+    return function(obj) {
+      return isMatch(obj, attrs);
+    };
+  }
+
+  // Creates a function that, when passed an object, will traverse that object’s
+  // properties down the given `path`, specified as an array of keys or indices.
+  function property(path) {
+    path = toPath(path);
+    return function(obj) {
+      return deepGet(obj, path);
+    };
+  }
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  function optimizeCb(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      // The 2-argument case is omitted because we’re not using it.
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  }
+
+  // An internal function to generate callbacks that can be applied to each
+  // element in a collection, returning the desired result — either `_.identity`,
+  // an arbitrary callback, a property matcher, or a property accessor.
+  function baseIteratee(value, context, argCount) {
+    if (value == null) return identity;
+    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+    if (isObject(value) && !isArray(value)) return matcher(value);
+    return property(value);
+  }
+
+  // External wrapper for our callback generator. Users may customize
+  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+  // This abstraction hides the internal-only `argCount` argument.
+  function iteratee(value, context) {
+    return baseIteratee(value, context, Infinity);
+  }
+  _$1.iteratee = iteratee;
+
+  // The function we call internally to generate a callback. It invokes
+  // `_.iteratee` if overridden, otherwise `baseIteratee`.
+  function cb(value, context, argCount) {
+    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
+    return baseIteratee(value, context, argCount);
+  }
+
+  // Returns the results of applying the `iteratee` to each element of `obj`.
+  // In contrast to `_.map` it returns an object.
+  function mapObject(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = keys(obj),
+        length = _keys.length,
+        results = {};
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys[index];
+      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function noop(){}
+
+  // Generates a function for a given object that returns a given property.
+  function propertyOf(obj) {
+    if (obj == null) return noop;
+    return function(path) {
+      return get(obj, path);
+    };
+  }
+
+  // Run a function **n** times.
+  function times(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = optimizeCb(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  }
+
+  // Return a random integer between `min` and `max` (inclusive).
+  function random(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  }
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  var now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+  // Internal helper to generate functions for escaping and unescaping strings
+  // to/from HTML interpolation.
+  function createEscaper(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped.
+    var source = '(?:' + keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  }
+
+  // Internal list of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+
+  // Function for escaping strings to HTML interpolation.
+  var _escape = createEscaper(escapeMap);
+
+  // Internal list of HTML entities for unescaping.
+  var unescapeMap = invert(escapeMap);
+
+  // Function for unescaping strings from HTML interpolation.
+  var _unescape = createEscaper(unescapeMap);
+
+  // By default, Underscore uses ERB-style template delimiters. Change the
+  // following template settings to use alternative delimiters.
+  var templateSettings = _$1.templateSettings = {
+    evaluate: /<%([\s\S]+?)%>/g,
+    interpolate: /<%=([\s\S]+?)%>/g,
+    escape: /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `_.templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'": "'",
+    '\\': '\\',
+    '\r': 'r',
+    '\n': 'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  function escapeChar(match) {
+    return '\\' + escapes[match];
+  }
+
+  // In order to prevent third-party code injection through
+  // `_.templateSettings.variable`, we test it against the following regular
+  // expression. It is intentionally a bit more liberal than just matching valid
+  // identifiers, but still prevents possible loopholes through defaults or
+  // destructuring assignment.
+  var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  function template(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = defaults({}, settings, _$1.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offset.
+      return match;
+    });
+    source += "';\n";
+
+    var argument = settings.variable;
+    if (argument) {
+      // Insure against third-party code injection. (CVE-2021-23358)
+      if (!bareIdentifier.test(argument)) throw new Error(
+        'variable is not a bare identifier: ' + argument
+      );
+    } else {
+      // If a variable is not specified, place data values in local scope.
+      source = 'with(obj||{}){\n' + source + '}\n';
+      argument = 'obj';
+    }
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    var render;
+    try {
+      render = new Function(argument, '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _$1);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  }
+
+  // Traverses the children of `obj` along `path`. If a child is a function, it
+  // is invoked with its parent as context. Returns the value of the final
+  // child, or `fallback` if any child is undefined.
+  function result(obj, path, fallback) {
+    path = toPath(path);
+    var length = path.length;
+    if (!length) {
+      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+    }
+    for (var i = 0; i < length; i++) {
+      var prop = obj == null ? void 0 : obj[path[i]];
+      if (prop === void 0) {
+        prop = fallback;
+        i = length; // Ensure we don't continue iterating.
+      }
+      obj = isFunction$1(prop) ? prop.call(obj) : prop;
+    }
+    return obj;
+  }
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  function uniqueId(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  }
+
+  // Start chaining a wrapped Underscore object.
+  function chain(obj) {
+    var instance = _$1(obj);
+    instance._chain = true;
+    return instance;
+  }
+
+  // Internal function to execute `sourceFunc` bound to `context` with optional
+  // `args`. Determines whether to execute a function as a constructor or as a
+  // normal function.
+  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+    var self = baseCreate(sourceFunc.prototype);
+    var result = sourceFunc.apply(self, args);
+    if (isObject(result)) return result;
+    return self;
+  }
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+  // as a placeholder by default, allowing any combination of arguments to be
+  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+  var partial = restArguments(function(func, boundArgs) {
+    var placeholder = partial.placeholder;
+    var bound = function() {
+      var position = 0, length = boundArgs.length;
+      var args = Array(length);
+      for (var i = 0; i < length; i++) {
+        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return executeBound(func, bound, this, this, args);
+    };
+    return bound;
+  });
+
+  partial.placeholder = _$1;
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally).
+  var bind = restArguments(function(func, context, args) {
+    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+    var bound = restArguments(function(callArgs) {
+      return executeBound(func, bound, context, this, args.concat(callArgs));
+    });
+    return bound;
+  });
+
+  // Internal helper for collection methods to determine whether a collection
+  // should be iterated as an array or as an object.
+  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+  var isArrayLike = createSizePropertyCheck(getLength);
+
+  // Internal implementation of a recursive `flatten` function.
+  function flatten$1(input, depth, strict, output) {
+    output = output || [];
+    if (!depth && depth !== 0) {
+      depth = Infinity;
+    } else if (depth <= 0) {
+      return output.concat(input);
+    }
+    var idx = output.length;
+    for (var i = 0, length = getLength(input); i < length; i++) {
+      var value = input[i];
+      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+        // Flatten current level of array or arguments object.
+        if (depth > 1) {
+          flatten$1(value, depth - 1, strict, output);
+          idx = output.length;
+        } else {
+          var j = 0, len = value.length;
+          while (j < len) output[idx++] = value[j++];
+        }
+      } else if (!strict) {
+        output[idx++] = value;
+      }
+    }
+    return output;
+  }
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  var bindAll = restArguments(function(obj, keys) {
+    keys = flatten$1(keys, false, false);
+    var index = keys.length;
+    if (index < 1) throw new Error('bindAll must be passed function names');
+    while (index--) {
+      var key = keys[index];
+      obj[key] = bind(obj[key], obj);
+    }
+    return obj;
+  });
+
+  // Memoize an expensive function by storing its results.
+  function memoize(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+      if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  }
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  var delay = restArguments(function(func, wait, args) {
+    return setTimeout(function() {
+      return func.apply(null, args);
+    }, wait);
+  });
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  var defer = partial(delay, _$1, 1);
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  function throttle(func, wait, options) {
+    var timeout, context, args, result;
+    var previous = 0;
+    if (!options) options = {};
+
+    var later = function() {
+      previous = options.leading === false ? 0 : now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+
+    var throttled = function() {
+      var _now = now();
+      if (!previous && options.leading === false) previous = _now;
+      var remaining = wait - (_now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        if (timeout) {
+          clearTimeout(timeout);
+          timeout = null;
+        }
+        previous = _now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+
+    throttled.cancel = function() {
+      clearTimeout(timeout);
+      previous = 0;
+      timeout = context = args = null;
+    };
+
+    return throttled;
+  }
+
+  // When a sequence of calls of the returned function ends, the argument
+  // function is triggered. The end of a sequence is defined by the `wait`
+  // parameter. If `immediate` is passed, the argument function will be
+  // triggered at the beginning of the sequence instead of at the end.
+  function debounce(func, wait, immediate) {
+    var timeout, previous, args, result, context;
+
+    var later = function() {
+      var passed = now() - previous;
+      if (wait > passed) {
+        timeout = setTimeout(later, wait - passed);
+      } else {
+        timeout = null;
+        if (!immediate) result = func.apply(context, args);
+        // This check is needed because `func` can recursively invoke `debounced`.
+        if (!timeout) args = context = null;
+      }
+    };
+
+    var debounced = restArguments(function(_args) {
+      context = this;
+      args = _args;
+      previous = now();
+      if (!timeout) {
+        timeout = setTimeout(later, wait);
+        if (immediate) result = func.apply(context, args);
+      }
+      return result;
+    });
+
+    debounced.cancel = function() {
+      clearTimeout(timeout);
+      timeout = args = context = null;
+    };
+
+    return debounced;
+  }
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  function wrap(func, wrapper) {
+    return partial(wrapper, func);
+  }
+
+  // Returns a negated version of the passed-in predicate.
+  function negate(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  }
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  function compose() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  }
+
+  // Returns a function that will only be executed on and after the Nth call.
+  function after(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  }
+
+  // Returns a function that will only be executed up to (but not including) the
+  // Nth call.
+  function before(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      }
+      if (times <= 1) func = null;
+      return memo;
+    };
+  }
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  var once = partial(before, 2);
+
+  // Returns the first key on an object that passes a truth test.
+  function findKey(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = keys(obj), key;
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      key = _keys[i];
+      if (predicate(obj[key], key, obj)) return key;
+    }
+  }
+
+  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+  function createPredicateIndexFinder(dir) {
+    return function(array, predicate, context) {
+      predicate = cb(predicate, context);
+      var length = getLength(array);
+      var index = dir > 0 ? 0 : length - 1;
+      for (; index >= 0 && index < length; index += dir) {
+        if (predicate(array[index], index, array)) return index;
+      }
+      return -1;
+    };
+  }
+
+  // Returns the first index on an array-like that passes a truth test.
+  var findIndex = createPredicateIndexFinder(1);
+
+  // Returns the last index on an array-like that passes a truth test.
+  var findLastIndex = createPredicateIndexFinder(-1);
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  function sortedIndex(array, obj, iteratee, context) {
+    iteratee = cb(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = getLength(array);
+    while (low < high) {
+      var mid = Math.floor((low + high) / 2);
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  }
+
+  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+  function createIndexFinder(dir, predicateFind, sortedIndex) {
+    return function(array, item, idx) {
+      var i = 0, length = getLength(array);
+      if (typeof idx == 'number') {
+        if (dir > 0) {
+          i = idx >= 0 ? idx : Math.max(idx + length, i);
+        } else {
+          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        }
+      } else if (sortedIndex && idx && length) {
+        idx = sortedIndex(array, item);
+        return array[idx] === item ? idx : -1;
+      }
+      if (item !== item) {
+        idx = predicateFind(slice.call(array, i, length), isNaN$1);
+        return idx >= 0 ? idx + i : -1;
+      }
+      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+        if (array[idx] === item) return idx;
+      }
+      return -1;
+    };
+  }
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+  // Return the position of the last occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+  // Return the first value which passes a truth test.
+  function find(obj, predicate, context) {
+    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+    var key = keyFinder(obj, predicate, context);
+    if (key !== void 0 && key !== -1) return obj[key];
+  }
+
+  // Convenience version of a common use case of `_.find`: getting the first
+  // object containing specific `key:value` pairs.
+  function findWhere(obj, attrs) {
+    return find(obj, matcher(attrs));
+  }
+
+  // The cornerstone for collection functions, an `each`
+  // implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  function each(obj, iteratee, context) {
+    iteratee = optimizeCb(iteratee, context);
+    var i, length;
+    if (isArrayLike(obj)) {
+      for (i = 0, length = obj.length; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var _keys = keys(obj);
+      for (i = 0, length = _keys.length; i < length; i++) {
+        iteratee(obj[_keys[i]], _keys[i], obj);
+      }
+    }
+    return obj;
+  }
+
+  // Return the results of applying the iteratee to each element.
+  function map(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length,
+        results = Array(length);
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Internal helper to create a reducing function, iterating left or right.
+  function createReduce(dir) {
+    // Wrap code that reassigns argument variables in a separate function than
+    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+    var reducer = function(obj, iteratee, memo, initial) {
+      var _keys = !isArrayLike(obj) && keys(obj),
+          length = (_keys || obj).length,
+          index = dir > 0 ? 0 : length - 1;
+      if (!initial) {
+        memo = obj[_keys ? _keys[index] : index];
+        index += dir;
+      }
+      for (; index >= 0 && index < length; index += dir) {
+        var currentKey = _keys ? _keys[index] : index;
+        memo = iteratee(memo, obj[currentKey], currentKey, obj);
+      }
+      return memo;
+    };
+
+    return function(obj, iteratee, memo, context) {
+      var initial = arguments.length >= 3;
+      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+    };
+  }
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  var reduce = createReduce(1);
+
+  // The right-associative version of reduce, also known as `foldr`.
+  var reduceRight = createReduce(-1);
+
+  // Return all the elements that pass a truth test.
+  function filter(obj, predicate, context) {
+    var results = [];
+    predicate = cb(predicate, context);
+    each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  }
+
+  // Return all the elements for which a truth test fails.
+  function reject(obj, predicate, context) {
+    return filter(obj, negate(cb(predicate)), context);
+  }
+
+  // Determine whether all of the elements pass a truth test.
+  function every(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  }
+
+  // Determine if at least one element in the object passes a truth test.
+  function some(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  }
+
+  // Determine if the array or object contains a given item (using `===`).
+  function contains(obj, item, fromIndex, guard) {
+    if (!isArrayLike(obj)) obj = values(obj);
+    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+    return indexOf(obj, item, fromIndex) >= 0;
+  }
+
+  // Invoke a method (with arguments) on every item in a collection.
+  var invoke = restArguments(function(obj, path, args) {
+    var contextPath, func;
+    if (isFunction$1(path)) {
+      func = path;
+    } else {
+      path = toPath(path);
+      contextPath = path.slice(0, -1);
+      path = path[path.length - 1];
+    }
+    return map(obj, function(context) {
+      var method = func;
+      if (!method) {
+        if (contextPath && contextPath.length) {
+          context = deepGet(context, contextPath);
+        }
+        if (context == null) return void 0;
+        method = context[path];
+      }
+      return method == null ? method : method.apply(context, args);
+    });
+  });
+
+  // Convenience version of a common use case of `_.map`: fetching a property.
+  function pluck(obj, key) {
+    return map(obj, property(key));
+  }
+
+  // Convenience version of a common use case of `_.filter`: selecting only
+  // objects containing specific `key:value` pairs.
+  function where(obj, attrs) {
+    return filter(obj, matcher(attrs));
+  }
+
+  // Return the maximum element (or element-based computation).
+  function max(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Return the minimum element (or element-based computation).
+  function min(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Sample **n** random values from a collection using the modern version of the
+  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `_.map`.
+  function sample(obj, n, guard) {
+    if (n == null || guard) {
+      if (!isArrayLike(obj)) obj = values(obj);
+      return obj[random(obj.length - 1)];
+    }
+    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+    var length = getLength(sample);
+    n = Math.max(Math.min(n, length), 0);
+    var last = length - 1;
+    for (var index = 0; index < n; index++) {
+      var rand = random(index, last);
+      var temp = sample[index];
+      sample[index] = sample[rand];
+      sample[rand] = temp;
+    }
+    return sample.slice(0, n);
+  }
+
+  // Shuffle a collection.
+  function shuffle(obj) {
+    return sample(obj, Infinity);
+  }
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  function sortBy(obj, iteratee, context) {
+    var index = 0;
+    iteratee = cb(iteratee, context);
+    return pluck(map(obj, function(value, key, list) {
+      return {
+        value: value,
+        index: index++,
+        criteria: iteratee(value, key, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  }
+
+  // An internal function used for aggregate "group by" operations.
+  function group(behavior, partition) {
+    return function(obj, iteratee, context) {
+      var result = partition ? [[], []] : {};
+      iteratee = cb(iteratee, context);
+      each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  }
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  var groupBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+  // when you know that your index values will be unique.
+  var indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  var countBy = group(function(result, value, key) {
+    if (has$1(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Split a collection into two arrays: one whose elements all pass the given
+  // truth test, and one whose elements all do not pass the truth test.
+  var partition = group(function(result, value, pass) {
+    result[pass ? 0 : 1].push(value);
+  }, true);
+
+  // Safely create a real, live array from anything iterable.
+  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+  function toArray(obj) {
+    if (!obj) return [];
+    if (isArray(obj)) return slice.call(obj);
+    if (isString(obj)) {
+      // Keep surrogate pair characters together.
+      return obj.match(reStrSymbol);
+    }
+    if (isArrayLike(obj)) return map(obj, identity);
+    return values(obj);
+  }
+
+  // Return the number of elements in a collection.
+  function size(obj) {
+    if (obj == null) return 0;
+    return isArrayLike(obj) ? obj.length : keys(obj).length;
+  }
+
+  // Internal `_.pick` helper function to determine whether `key` is an enumerable
+  // property name of `obj`.
+  function keyInObj(value, key, obj) {
+    return key in obj;
+  }
+
+  // Return a copy of the object only containing the allowed properties.
+  var pick = restArguments(function(obj, keys) {
+    var result = {}, iteratee = keys[0];
+    if (obj == null) return result;
+    if (isFunction$1(iteratee)) {
+      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+      keys = allKeys(obj);
+    } else {
+      iteratee = keyInObj;
+      keys = flatten$1(keys, false, false);
+      obj = Object(obj);
+    }
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = keys[i];
+      var value = obj[key];
+      if (iteratee(value, key, obj)) result[key] = value;
+    }
+    return result;
+  });
+
+  // Return a copy of the object without the disallowed properties.
+  var omit = restArguments(function(obj, keys) {
+    var iteratee = keys[0], context;
+    if (isFunction$1(iteratee)) {
+      iteratee = negate(iteratee);
+      if (keys.length > 1) context = keys[1];
+    } else {
+      keys = map(flatten$1(keys, false, false), String);
+      iteratee = function(value, key) {
+        return !contains(keys, key);
+      };
+    }
+    return pick(obj, iteratee, context);
+  });
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N.
+  function initial(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  }
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  function first(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[0];
+    return initial(array, array.length - n);
+  }
+
+  // Returns everything but the first entry of the `array`. Especially useful on
+  // the `arguments` object. Passing an **n** will return the rest N values in the
+  // `array`.
+  function rest(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  }
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array.
+  function last(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[array.length - 1];
+    return rest(array, Math.max(0, array.length - n));
+  }
+
+  // Trim out all falsy values from an array.
+  function compact(array) {
+    return filter(array, Boolean);
+  }
+
+  // Flatten out an array, either recursively (by default), or up to `depth`.
+  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+  function flatten(array, depth) {
+    return flatten$1(array, depth, false);
+  }
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  var difference = restArguments(function(array, rest) {
+    rest = flatten$1(rest, true, true);
+    return filter(array, function(value){
+      return !contains(rest, value);
+    });
+  });
+
+  // Return a version of the array that does not contain the specified value(s).
+  var without = restArguments(function(array, otherArrays) {
+    return difference(array, otherArrays);
+  });
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // The faster algorithm will not work with an iteratee if the iteratee
+  // is not a one-to-one function, so providing an iteratee will disable
+  // the faster algorithm.
+  function uniq(array, isSorted, iteratee, context) {
+    if (!isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = cb(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var value = array[i],
+          computed = iteratee ? iteratee(value, i, array) : value;
+      if (isSorted && !iteratee) {
+        if (!i || seen !== computed) result.push(value);
+        seen = computed;
+      } else if (iteratee) {
+        if (!contains(seen, computed)) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (!contains(result, value)) {
+        result.push(value);
+      }
+    }
+    return result;
+  }
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  var union = restArguments(function(arrays) {
+    return uniq(flatten$1(arrays, true, true));
+  });
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  function intersection(array) {
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var item = array[i];
+      if (contains(result, item)) continue;
+      var j;
+      for (j = 1; j < argsLength; j++) {
+        if (!contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  }
+
+  // Complement of zip. Unzip accepts an array of arrays and groups
+  // each array's elements on shared indices.
+  function unzip(array) {
+    var length = array && max(array, getLength).length || 0;
+    var result = Array(length);
+
+    for (var index = 0; index < length; index++) {
+      result[index] = pluck(array, index);
+    }
+    return result;
+  }
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  var zip = restArguments(unzip);
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+  function object(list, values) {
+    var result = {};
+    for (var i = 0, length = getLength(list); i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  }
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](https://docs.python.org/library/functions.html#range).
+  function range(start, stop, step) {
+    if (stop == null) {
+      stop = start || 0;
+      start = 0;
+    }
+    if (!step) {
+      step = stop < start ? -1 : 1;
+    }
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  }
+
+  // Chunk a single array into multiple arrays, each containing `count` or fewer
+  // items.
+  function chunk(array, count) {
+    if (count == null || count < 1) return [];
+    var result = [];
+    var i = 0, length = array.length;
+    while (i < length) {
+      result.push(slice.call(array, i, i += count));
+    }
+    return result;
+  }
+
+  // Helper function to continue chaining intermediate results.
+  function chainResult(instance, obj) {
+    return instance._chain ? _$1(obj).chain() : obj;
+  }
+
+  // Add your own custom functions to the Underscore object.
+  function mixin(obj) {
+    each(functions(obj), function(name) {
+      var func = _$1[name] = obj[name];
+      _$1.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return chainResult(this, func.apply(_$1, args));
+      };
+    });
+    return _$1;
+  }
+
+  // Add all mutator `Array` functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) {
+        method.apply(obj, arguments);
+        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+          delete obj[0];
+        }
+      }
+      return chainResult(this, obj);
+    };
+  });
+
+  // Add all accessor `Array` functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _$1.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) obj = method.apply(obj, arguments);
+      return chainResult(this, obj);
+    };
+  });
+
+  // Named Exports
+
+  var allExports = {
+    __proto__: null,
+    VERSION: VERSION,
+    restArguments: restArguments,
+    isObject: isObject,
+    isNull: isNull,
+    isUndefined: isUndefined,
+    isBoolean: isBoolean,
+    isElement: isElement,
+    isString: isString,
+    isNumber: isNumber,
+    isDate: isDate,
+    isRegExp: isRegExp,
+    isError: isError,
+    isSymbol: isSymbol,
+    isArrayBuffer: isArrayBuffer,
+    isDataView: isDataView$1,
+    isArray: isArray,
+    isFunction: isFunction$1,
+    isArguments: isArguments$1,
+    isFinite: isFinite$1,
+    isNaN: isNaN$1,
+    isTypedArray: isTypedArray$1,
+    isEmpty: isEmpty,
+    isMatch: isMatch,
+    isEqual: isEqual,
+    isMap: isMap,
+    isWeakMap: isWeakMap,
+    isSet: isSet,
+    isWeakSet: isWeakSet,
+    keys: keys,
+    allKeys: allKeys,
+    values: values,
+    pairs: pairs,
+    invert: invert,
+    functions: functions,
+    methods: functions,
+    extend: extend,
+    extendOwn: extendOwn,
+    assign: extendOwn,
+    defaults: defaults,
+    create: create,
+    clone: clone,
+    tap: tap,
+    get: get,
+    has: has,
+    mapObject: mapObject,
+    identity: identity,
+    constant: constant,
+    noop: noop,
+    toPath: toPath$1,
+    property: property,
+    propertyOf: propertyOf,
+    matcher: matcher,
+    matches: matcher,
+    times: times,
+    random: random,
+    now: now,
+    escape: _escape,
+    unescape: _unescape,
+    templateSettings: templateSettings,
+    template: template,
+    result: result,
+    uniqueId: uniqueId,
+    chain: chain,
+    iteratee: iteratee,
+    partial: partial,
+    bind: bind,
+    bindAll: bindAll,
+    memoize: memoize,
+    delay: delay,
+    defer: defer,
+    throttle: throttle,
+    debounce: debounce,
+    wrap: wrap,
+    negate: negate,
+    compose: compose,
+    after: after,
+    before: before,
+    once: once,
+    findKey: findKey,
+    findIndex: findIndex,
+    findLastIndex: findLastIndex,
+    sortedIndex: sortedIndex,
+    indexOf: indexOf,
+    lastIndexOf: lastIndexOf,
+    find: find,
+    detect: find,
+    findWhere: findWhere,
+    each: each,
+    forEach: each,
+    map: map,
+    collect: map,
+    reduce: reduce,
+    foldl: reduce,
+    inject: reduce,
+    reduceRight: reduceRight,
+    foldr: reduceRight,
+    filter: filter,
+    select: filter,
+    reject: reject,
+    every: every,
+    all: every,
+    some: some,
+    any: some,
+    contains: contains,
+    includes: contains,
+    include: contains,
+    invoke: invoke,
+    pluck: pluck,
+    where: where,
+    max: max,
+    min: min,
+    shuffle: shuffle,
+    sample: sample,
+    sortBy: sortBy,
+    groupBy: groupBy,
+    indexBy: indexBy,
+    countBy: countBy,
+    partition: partition,
+    toArray: toArray,
+    size: size,
+    pick: pick,
+    omit: omit,
+    first: first,
+    head: first,
+    take: first,
+    initial: initial,
+    last: last,
+    rest: rest,
+    tail: rest,
+    drop: rest,
+    compact: compact,
+    flatten: flatten,
+    without: without,
+    uniq: uniq,
+    unique: uniq,
+    union: union,
+    intersection: intersection,
+    difference: difference,
+    unzip: unzip,
+    transpose: unzip,
+    zip: zip,
+    object: object,
+    range: range,
+    chunk: chunk,
+    mixin: mixin,
+    'default': _$1
+  };
+
+  // Default Export
+
+  // Add all of the Underscore functions to the wrapper object.
+  var _ = mixin(allExports);
+  // Legacy Node.js API.
+  _._ = _;
+
+  return _;
+
+})));
+//# sourceMappingURL=underscore-umd.js.map
diff --git a/sphinx/build/html/index.html b/sphinx/build/html/index.html
index b3a51168f849a36a8fb3401a1e8af0ec0854e187..218bf292e517ef03aa66d8875d3c86c366d1616c 100644
--- a/sphinx/build/html/index.html
+++ b/sphinx/build/html/index.html
@@ -75,7 +75,7 @@
 <dd class="field-odd"><p>open hardware resistivity-meter</p>
 </dd>
 <dt class="field-even">Date</dt>
-<dd class="field-even"><p>Dec 05, 2021</p>
+<dd class="field-even"><p>Jan 22, 2022</p>
 </dd>
 <dt class="field-odd">Date start</dt>
 <dd class="field-odd"><p>July 2016</p>
diff --git a/sphinx/build/html/searchindex.js b/sphinx/build/html/searchindex.js
index 57c3b7441e3f5e281c71ee4be8dde6276e594d37..3a5ba1aecaa72fc29aa9441a5f4a98d69ad9f186 100644
--- a/sphinx/build/html/searchindex.js
+++ b/sphinx/build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["Ohmpi","Ohmpi_V2_00/V2_00_step_01","Ohmpi_V2_00/V2_00_step_02","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["Ohmpi.rst","Ohmpi_V2_00\\V2_00_step_01.rst","Ohmpi_V2_00\\V2_00_step_02.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"000":[3,4],"001000":2,"001101":2,"018":[3,4],"0251001":4,"02be":2,"100":[3,4],"100nf":[2,4],"101":[3,4],"10120550":2,"1016":0,"102110421":2,"103":[2,3,4],"1083":[3,4],"1085":2,"10v":4,"110":[2,3,4],"1115":[3,4],"114":[2,3,4],"11mm":2,"120":2,"1211n":2,"1212":2,"1215":[2,4],"128":6,"12v":[2,3,4,6],"1332":[3,4],"150":[3,4,5],"1565235":[3,4],"1568649":[3,4],"185":[3,4],"199":[3,4],"1kohm":2,"1x0":[3,4],"1x1":[3,4],"1x10":[2,3,4],"2016":6,"2020":0,"2021":[0,6],"220":2,"24v":[2,4],"252b7an":2,"252bdzonqg":2,"252be0w1orxzibqpw":2,"252be1bmvd":2,"252be2z":2,"252bg":2,"252bii":2,"252bnrpuooeq":2,"252bx":2,"252bztchcpohq":2,"254":2,"2701":2,"2f0t3ruis9pcaqjlt4":2,"2f12mkns3vxsdryxuhw":2,"2f33nj0gbxroculucynpyong":2,"2faaymw02gquicgqj0ta":2,"2ffq":2,"2fha2pyfadugpyeg4idvm":2,"2fha2pyfadugy9twham3ru9hmijohywhbin95knm":2,"2fha2pyfaduh":2,"2fha2pyfaduhuylh7az":2,"2fha2pyfadujqkqx4wauig":2,"2flq1th4mcyoetma":2,"2fm":2,"2fmgndxmcnv":2,"2fmjfh2xjoums6wztux4som":2,"2fmsr":2,"2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn":2,"2fq":2,"2fqaur8narg":2,"2fufuz19ilfayzxocfra":2,"3002002":2,"304":2,"305":2,"308":2,"3x11":2,"41f2r0e":2,"449":2,"45100":0,"4686":[3,4],"500":[3,4],"508":2,"50vdc":[2,4],"524":2,"537":[3,4],"5488":[3,4],"576":3,"593":2,"5kohm":2,"5vcc":[3,4],"5vdc":[3,4],"627":[3,4],"648":[2,3,4],"69626":0,"69675":0,"741435":2,"762":2,"796":2,"7ah":[3,4],"7mvldsj5uaxen3lyyh3sqw":2,"858":[3,4],"897":[3,4],"9004330000":[3,4],"966067":[3,4],"971110321":2,"ao\u00fbt":0,"case":[1,3,4],"final":[3,4],"function":[0,3,4],"h\u00e9l\u00e8ne":[0,6],"mm\u00b2":[3,4],"new":[1,3,4,5],"orl\u00e9an":0,"public":[3,4],"r\u00e9mi":[0,6],"return":[1,3,4],"switch":[3,4],"universit\u00e9":0,"vid\u00e9o":[1,3,4],ADS:[3,4],CMS:[3,4],For:[1,2,3,4],IDE:[5,6],IGE:0,Its:[3,4],The:[1,2,6],These:[3,4],With:[3,4],abmn:[3,4],abov:[3,4],acc:[1,3,4],access:[3,4],accord:[3,4],accur:[3,4],accuraci:[3,4],acid:[3,4],activ:[5,6],actual:[3,4],adafruit:[1,2,3,4],adapt:[2,3,4],adc:[2,3,4],add:[3,4],added:[3,4],adding:[3,4],addit:[3,4],address:[2,3,4],adjust:[2,3,4],ads1115:[2,3,4],ads115:[2,3,4],ads1x15:[1,3,4],advantag:2,after:[3,4],all:[1,3,4,5],allow:[0,2,3,4,5],alp:0,also:[1,3,4],altern:[1,3,4],amp:[2,3,4],amplif:2,amplifi:[3,4],analog:[2,3,4],ani:[3,4],anoth:[1,3,4],apm:2,appear:[1,2,3,4],appli:[0,3,4],applic:0,apt:[1,3,4],aqy211eh:2,arduino:3,arm:3,around:2,arrai:[3,4],articl:[3,4],asler:[2,3,4],assembl:[5,6],assist:[3,4],associ:0,attent:[3,4],attribut:[3,4],author:[0,1,3,4,6],automat:[0,3,4],automobil:[3,4],avail:[3,4],avr:3,bank:[3,4],base:[1,3,4],basic:0,batteri:[2,3,4,5],been:[1,3,4],befor:[3,4],behavior:[3,4],being:[3,4],below:[1,3,4],between:[2,3,4],bin:[1,3,4],bit:[2,3,4],bkl:2,black:[2,3,4],blinka:[1,3,4],blk:2,block:[3,4],blue:[3,4],board:[1,5,6],boot:[1,3,4],both:[3,4],bottom:[2,3,4],bought:[3,4],box:5,breakout:2,bridg:[3,4],bug:3,build:[3,4],button:[1,3,4],by10:2,c320c104k1:[2,4],c320c104k1r5ta7303:2,c4uyot:2,cabl:[1,2,3,4],calcul:[3,4],calibr:[3,4],call:0,can:[1,3,4,5],canal:3,cap:[3,4],capac:[3,4],capacitor:[2,4],car:3,card:[1,5,6],carri:[1,3,4],caus:[1,3,4],ccf071k50gke36:2,cedex:0,ceram:[2,4],channel:[3,4],characterist:[3,4],charg:[3,4],check:[1,3,4,5],chosen:[3,4],ciayqk2gdckzia2levalkg:2,circuit:[2,3,4],circuitpython:[1,3,4],circul:[3,4],cite:6,clean:[3,4],clement:[0,6],click:[1,3,4],close:[1,3,4],cmf651m0000fkek143:2,code:[1,3,4],coef_p0:[3,4],coef_p1:[3,4],coef_p2:[3,4],coef_p3:[3,4],coeff:[3,4],coeffici:[3,4],com:[1,2,3,4],command:[1,3,4],commerci:[3,4],common:[3,4],commun:[0,5],complet:[1,2,5,6],compon:[1,5,6],comput:[1,3,4],conduct:[3,4],config:[1,3,4],configur:[5,6],congratul:[3,4],connect:[1,2,6],connector:[3,4],conrad:2,consequ:[3,4],consist:[3,4],constitut:[3,4],construct:[3,4],consumpt:[3,4,5],contact:[2,3,4],contain:[1,3,4],content:6,control:[3,4,5],convers:[3,4],convert:[2,3,4],copi:1,correct:[3,4],correspond:3,cost:[0,2,3,4],could:[2,3,4],cpu:[3,4,5],creat:[1,3,4],creation:0,crimp:[3,4],csv:[3,4],ctrl:[1,3,4],cui:2,current:[0,2,5,6],dale:2,damag:[1,3,4],data:[0,6],date:[0,3,4,6],dcconvert:4,deactiv:[1,3,4],dec:6,decid:[1,3,4],decoupl:4,dedic:[0,5],delai:[3,4],deliv:[3,4],depart:0,depend:[1,3,4],describ:[1,2,3,4],descript:[5,6],design:[3,4],desktop:4,despit:[3,4],detail:3,dev:[1,3,4],develop:[0,1,2,3,4,5,6],devic:2,diagram:[3,4],differ:[1,3,4,5],digit:[2,3,4],dii:5,din:[3,4],dip:2,direct:[3,4],directli:[2,3,4],directori:[1,3,4],disconnect:[3,4],discret:1,displai:[3,4],distanc:[3,4],disturb:[3,4],divid:[3,4],document:[0,3],done:[1,3,4],down:[3,4],download:[3,4],dsp:3,dual:[2,3,4],duboi:[0,6],durat:[3,4,5],dure:[1,3,4],dzwb4:[3,4],e00122ff:0,each:[1,3,4],eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw:2,eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw:2,editor:[1,3,4],effort:5,eiffel:0,either:[1,3,4],ejector:2,electr:[0,2,6],electrod:[0,2,6],electron:[2,3,4],elektronik:2,elsevi:0,emil:0,enabl:[3,4],end:[1,3,4],energ:[3,4],enough:[3,4],ensur:[1,3,4],enter:[1,3,4],entir:[3,4],environ:[1,3,4],environn:[5,6],environnementshould:[1,3,4],equal:[3,4],equival:[2,3,4],ert:[3,4],escap:[1,3,4],estim:[3,4],everyon:0,everyth:2,evolv:[3,4],exampl:[3,4],excess:[3,4],execut:[1,3,4],exist:[3,4],experi:[0,3,4,5],explain:3,export_path:4,extra:[3,4],failur:[1,3,4],fargier:[0,6],fast:4,featur:[3,4],femal:[2,3,4],ferrul:[3,4],fewer:[3,4],ff10:0,fhac0002zxj:3,field:[3,4,5],fig:[3,4],figur:[2,3,4],file:[1,3,4],find:[1,3,4],first:[1,3,4],fix:2,flexibl:0,florsch:[2,3,4],flow:[3,4],folder:[1,3,4],follow:[1,2,3,4],forquet:[0,6],four:[2,5,6],framework:[3,4],franc:0,frist:6,from:[3,4,5],full:[3,4],fulli:0,fuse:[3,4],gain:[2,3,4],ganc:[0,6],gather:[1,3,4],gclid:2,gener:[2,3,4,6],geologi:0,ger:0,get:[0,1,2,3,4],gitlab:[3,4],gnd:[3,4],gnu:[1,3,4],gpio:[1,3,4],grenobl:0,gro:0,ground:[2,3,4],gui:[1,3,4],guidelin:6,gurawfaegucaqqfvnvtyeg:2,gustav:0,guyard:[0,6],h81k0bya:[2,3,4],h81k5bya:[2,3,4],had:[3,4],hand:[3,4],handl:[3,4],hardwar:[0,3,4],hardwarex:0,harwin:2,has:[1,3,4],have:[1,2,3,4,5],hazard:[3,4],hdmi:1,header:[2,3,4],hear:[3,4],here:4,hexagonal:2,hexseal:2,high:[3,4],higher:4,holder:[3,4],hole:[3,4],holsworthi:2,home:[1,3,4],horizont:[3,4],hous:[3,4],how:[1,3,4],howev:[3,4],http:[1,2,3,4],i2c:2,i2cdetect:2,ifsttar:0,iggadovctstu:2,illustr:[3,4],im6toxqzgoauedprb19mha:2,imag:0,imped:[3,4,5],implent:6,improv:[4,5],in1:[3,4],in2:[3,4],in3:[3,4],in4:[3,4],ina282:2,ina282aid:2,includ:[1,3,4],incom:[3,4],increas:[3,4],inde:[3,4],industri:2,initi:6,inject:[0,5,6],injection_dur:[3,4],inpout:2,input:[2,3,4,5],inra:0,insert:[3,4],insid:[3,4],instal:[2,5,6],instanc:1,instead:[3,4],instruct:[1,6],instrument:[0,2,3,4],integr:2,intens:[3,4],interfac:[1,3,4],interpret:[1,2,3,4],introduc:[3,4],introduct:6,invit:3,involv:0,ion:[3,4],iri:0,irstea:[3,4],its:[1,3,4,5],jason:4,jjse:2,journal:3,json:4,juillet:0,juli:6,julien:[0,6],just:4,kaufmann:[0,6],kemet:[2,4],keyboard:[1,3,4],known:[1,3,4],kohm:[2,3,4],laboratori:[0,3,4,5],laps:5,last:4,lastli:[3,4],latest:[1,3,4],lead:[3,4],leav:[1,3,4],length:[3,4],less:[3,4],let:[3,4],libatla:[1,3,4],librari:[1,3,4],lie:[2,3,4],limit:[5,6],line:[2,3,4],list:[1,6],lithium:[3,4],littelfus:[3,4],littl:[3,4],lm158:2,lm158j:2,lm158n:2,lm358an:[2,3,4],lm358n:[3,4],locat:[1,3,4],logger:[0,3,4],low:[0,1,3,4,5],lr20:[3,4],lying:[3,4],lyon:0,made:[3,4,5],mai:[1,3,4],main:[3,4],make:[1,3,4],male:2,manag:[3,4],manual:[3,4],manufactur:[2,3,4],manuscript:[3,4],master:[3,4],matur:6,max:2,maximum:[3,4],mcp23008:2,measur:[0,1,5,6],mechan:[3,4],meet:[1,3,4],mega:[3,4],menu:[1,3,4],mesur:6,met:[1,3,4],meter:[0,3,4,5],meterfeatur:0,mgh:2,micro:[1,3,4,5],mill:2,mimic:[3,4],min:[3,4,5],miss:3,mm2:[3,4],model:[1,2,3,4],modif:[1,3,4],modifi:[1,3,4],modul:[3,4],mohm:[2,3,4,5],mon:0,monitor:[3,4,5],more:5,moreov:[3,4],mount:[2,3,4],mous:[1,3,4],mouser:2,multi:[3,4],multielectrod:5,multipl:1,multiplex:[0,5,6],multipli:[3,4],must:[1,3,4],mux:[3,4,5,6],name:[3,4],nano:[1,3,4],nb_electrod:[3,4],nbr_mea:[3,4],necessari:[1,3,4],need:[1,2,3,4],neg:[3,4],next:[3,4],nicola:[0,6],noob:[1,3,4],nopb:[2,3,4],normal:[3,4],note:[3,4],now:[3,4],number:[2,3,4],numer:[3,4],numpi:[1,3,4],obtain:[3,4],offcial:6,offer:[3,4,5],ohm:[2,3,4,5],ohmit:2,ohmmet:[3,4],ohmpi:[1,2],ohmpi_4elec:2,ohmpi_param:4,ohx:0,olivi:[0,6],onc:[1,3,4],one:[2,3,4,5],onli:6,onto:[3,4],open:[0,1,3,4],oper:[1,2,5,6],optic:2,optim:[3,4],option:[1,3,4],order:[3,4],org:1,orient:4,osf:[3,4],other:[3,4],our:[3,4,5],out:[1,3,4],outpout:2,output:[3,4],overh:4,packag:[5,6],padboard:2,pai:[3,4],panason:2,panda:[1,3,4],parallel:1,paramet:[5,6],part:[3,4,5],parten:0,partenair:6,pat1l:4,path:[1,3,4],pcb:[2,3,4],pcs:2,per:[2,3,4],perform:[0,1,3,4],permut:[3,4],philosophi:[0,6],pic:3,piec:[3,4],pin:[2,3,4],pip:[1,3,4],pitch:[2,3,4],place:[3,4],plai:2,pleas:[3,4],plug:[2,3,4],point:[3,4,5],polar:[3,4],pole:[3,4],port:2,posit:[1,3,4],possibl:[3,4],potenti:[3,4],potentiomet:[3,4],pour:3,power:[2,3,4,5],practic:[3,4],pre:2,preci:2,precis:[2,3,4],prefer:[3,4],preliminari:6,prepar:[2,3,4],present:[0,3,4],press:[1,3,4],prevent:4,previou:5,previous:[1,3,4],print:[2,3,4],pro:[3,4],problem:1,procedur:6,produc:[3,4],product:2,productdetail:2,program:[1,3,4],progress:[0,6],project:[1,6],propos:[2,3,4],protect:1,protocol:[3,4],provid:[0,3,4],publish:3,puls:[3,4,5],purpos:[3,4],pyhton3:[1,3,4],python3:[1,3,4],python:[5,6],pythonid:[1,3,4],qkeozdl6eqpa6lzrlqfvow:2,quadripol:[3,4],quadrupol:[3,4],quantiti:[1,3,4],r10:[3,4],r11:[3,4],r12:[3,4],r25:2,r_ref:[3,4],rail:[3,4],rang:[3,4],rapberri:[5,6],raspberri:[2,5,6],raspberrypi:1,raspbian:[1,3,4],raspebrri:[1,3,4],readm:[3,4],realiz:2,recommend:[1,3,4],red:[2,3,4],reduct:[3,4],refer:[2,3,4],relai:[1,2,3,4],releas:6,remain:[3,4],rememb:[3,4],remot:[1,3,4],repeat:[3,4],repetit:[3,4],replac:4,repositori:[3,4],repres:[3,4],requir:[1,3,4,5],research:6,resist:[0,2,5,6],resistor:[2,3,4],resolut:[3,4,5],respect:[3,4],result:[2,3,4],revers:[3,4],reversa:[0,3,4],rm3x8mm:2,robust:[0,3,4,5],role:[3,4],root:[1,3,4],row:2,rpi:[1,3,4],rro:0,ru5fayqh:2,run:[1,2,3,4],safeti:[3,4],sain:[3,4],sainsmart:[3,4],same:[3,4],samtec:[2,3,4],save:[1,3,4],scale:0,schemat:[2,3,4],scienc:[3,4],scientif:0,screen:[2,3,4],screw:[2,3,4],searchsuggest:2,searchterm:2,searchtyp:2,second:[3,4],section:[3,4],see:[3,4],seeed:2,seek:5,select:[1,3,4],sequenc:[3,4],sequence_delai:[3,4],seri:[3,4],serv:[3,4],set:[1,2,3,4],setp:4,setup:[1,3,4],sever:[3,4],sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw:2,share:5,shield:[1,3,4],shortcut:[3,4],should:[1,2,3,4],show:[2,3,4],shown:[3,4],shunt:2,shutdown:2,signal:[2,3,4],simpl:[1,3,4],simpli:[1,3,4],simultan:[3,4],singl:[3,4],slope:[3,4],small:[0,2,3,4,5],smaller:[3,4],smart:[3,4],smt:2,socket:2,softwar:[1,3,4],soic:2,soil:[3,4],solder:[2,3,4],solut:[3,4],some:[3,4,6],sound:[3,4],sourc:[0,1,3,4],space:2,spacer:2,specif:[3,4,5],specifi:[1,3,4],spi:[1,3,4],spool:2,ssq:2,ssw:[2,3,4],stabl:[1,3,4],stack:[3,4],stainless:[3,4],start:[1,3,4,5,6],startup:6,statu:[0,6],steel:[3,4],step:[3,4,6],still:[3,4],stop:5,storag:[3,4,5],strict:[3,4],strip:[2,3,4],strong:[3,4],stronger:[3,4],strongli:[1,3,4],stuck:[3,4],studi:[3,4],studio:2,subject:[3,4],sudo:[1,3,4],suffici:[1,3,4],suggest:[2,3,4],suitabl:[3,4,5],sum:[3,4],suppli:[2,3,4],support:1,suppress:4,sure:[1,3,4],surfac:0,system:[1,3,4,5],tab:[1,3,4],tabl:4,target:6,task:[1,3,4],tb009:2,tdh15:2,team:5,technic:6,temperatur:[3,4,5],ten:[3,4],termin:[1,2,3,4],test:[1,2,3,4],texa:[2,3,4],than:[3,4],thd:2,the9:[3,4],thei:[3,4],them:[3,4],therefor:[3,4],thi:[0,1,2,3,4,5],thonni:[5,6],thousand:[3,4],three:[2,3,4],through:[3,4],thu:[3,4],time:[1,3,4,5],togeth:[3,4],toler:4,tonni:2,tool:[0,5],total:[2,3,4],tow:2,track:[3,4],traco:[2,4],tracopow:[2,4],trn3:4,trn:[2,4],tru:[3,4],turn:[3,4],tutori:6,two:[2,3,4,5],txt:[1,3,4],type:[1,3,4,5],typic:[3,4],under:[3,4],unexpectedli:[1,3,4],unit:[2,3,4,5],univ:0,unplug:2,unzip:[3,4],updat:0,upgrad:[4,5],upper:2,upping:[3,4],upw50b50rv:[3,4],use:[1,3,4],used:[1,2,3,4],user:[1,3,4,6],using:[1,3,4],usr:[1,3,4],util:1,valid:[3,4],valu:[2,3,4],variou:[3,4],velleman:[3,4],venv:[1,3,4],veri:4,version:[1,3,4,5],vertic:[3,4],via:[1,3,4],view:2,villeurbann:0,vip:2,virtual:[5,6],vishai:2,visit:1,vivien:[0,6],vlwxofp3u2wcfk5uckwtka:2,voltag:[2,3,4,5],voltmet:[3,4],w0yvoo0ixfenuv0hsdc4:2,wai:[1,3,4],want:4,watch:[1,3,4],weaker:3,web:2,websit:[1,3,4],weidmul:[3,4],welcom:0,well:[1,3,4],were:[1,2,3,4],when:[1,3,4],where:[1,3,4],which:[2,3,4,5],whose:[3,4],willing:0,window:[1,3,4],wire:[1,3,4],wish:5,within:[1,3,4],without:[3,4],wjwzhv1v3pk:[1,3,4],wktuvitrialgiu8hcm7dvq:2,work:2,would:[3,4],wpm404:[3,4],write:[1,2,3,4],wurth:2,www:[1,2,3,4],x1j7hmvl2zh8vpefml8:2,yannick:[0,6],yca:2,you:[1,2,3,4],your:[1,2,3,4],youtub:[1,3,4],ze4:2},titles:["OhmPi project","<strong>STEP n\u00b01</strong> : Raspberry Pi  configuration","<strong>STEP n\u00b02</strong>: Measurement board","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.xx (64 or 128 electrodes and 12V)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"128":5,"12v":5,IDE:[1,3,4],The:[3,4,5],activ:[1,3,4],assembl:[2,3,4],board:[2,3,4],card:[3,4],center:6,check:2,cite:0,complet:[3,4],compon:[2,3,4],configur:[1,3,4],connect:[3,4],current:[3,4],data:[3,4,5],descript:[2,3,4],document:6,electr:[3,4],electrod:[3,4,5],environn:[1,3,4],four:[3,4],frist:[3,4],hardwar:6,implement:[3,4],implent:[3,4],initi:[3,4],inject:[3,4],instal:[1,3,4],instruct:[3,4],introduct:0,limit:[3,4],list:[2,3,4],measur:[2,3,4],mesur:[3,4],meter:6,multiplex:[3,4],ohmpi:[0,3,4,5,6],onli:[3,4],open:6,oper:[3,4],packag:[1,3,4],paramet:[3,4],part:[1,2],partenair:0,philosophi:[3,4,5],preliminari:[3,4],procedur:[3,4],project:0,python:[1,3,4],rapberri:[1,3,4],raspberri:[1,3,4],requir:2,resist:[3,4],resit:6,sourc:6,start:2,startup:[3,4],step:[1,2,5],summari:6,tabl:3,technic:[3,4,5],thonni:[1,3,4],titl:3,virtual:[1,3,4]}})
\ No newline at end of file
+Search.setIndex({docnames:["Ohmpi","Ohmpi_V2_00/V2_00_step_01","Ohmpi_V2_00/V2_00_step_02","Ohmpi_V2_00/V2_00_step_03","V1_01","V1_02","V2_00","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["Ohmpi.rst","Ohmpi_V2_00\\V2_00_step_01.rst","Ohmpi_V2_00\\V2_00_step_02.rst","Ohmpi_V2_00\\V2_00_step_03.rst","V1_01.rst","V1_02.rst","V2_00.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"000":[4,5],"001000":2,"001101":2,"008":3,"018":[4,5],"0251001":5,"02be":[2,3],"061":3,"091":3,"0x70":3,"0x71":3,"0x72":3,"0x73":3,"0x77":3,"100":[4,5],"100k":3,"100nf":[2,5],"101":[4,5],"10120158":3,"1012015810":3,"10120550":[2,3],"10120558":3,"10120862":3,"1016":0,"102110421":2,"103":[4,5],"103321":3,"1083":[4,5],"1085":2,"10v":5,"110":[2,4,5],"1115":[4,5],"114":[2,4,5],"11mm":2,"120":[2,3],"1211n":2,"1212":2,"1215":[2,5],"127":3,"128":[3,7],"12v":[2,4,5,7],"1332":[4,5],"140":3,"150":[3,4,5,6],"1548658":3,"1565235":[4,5],"1568649":[4,5],"1580994":3,"185":[4,5],"199":[4,5],"1kohm":2,"1n4007":3,"1x0":[4,5],"1x1":[4,5],"1x10":[2,4,5],"2016":7,"2020":0,"2021":0,"2022":7,"205":3,"220":2,"24300":3,"24v":[2,5],"252b7an":2,"252baqg":3,"252bdzonqg":2,"252be0w1orxzibqpw":2,"252be1bmvd":2,"252bg":2,"252bii":2,"252bnrpuooeq":2,"252bsz9b":3,"252bx":2,"252bz3hvktao":3,"252bzuq":3,"254":[2,3],"25515":3,"256":3,"2701":[2,3],"2717":3,"296":3,"2f0t3ruis9pcaqjlt4":2,"2f12mkns3vxsdryxuhw":[2,3],"2f2czwu0ejpozmzc2a":3,"2f2czwuxuhumfr":3,"2f33nj0gbxroculucynpyong":2,"2f5q":3,"2faaymw02gquicgqj0ta":2,"2fbpyakboruumren":3,"2ff6fcxt7g":3,"2ffq":2,"2fha2pyfadugpyeg4idvm":2,"2fha2pyfadugy9twham3ru9hmijohywhbin95knm":2,"2fha2pyfaduh":2,"2fha2pyfaduhuylh7az":2,"2fha2pyfadujqkqx4wauig":2,"2flq1th4mcyoetma":2,"2fm":2,"2fmgndxmcnv":2,"2fmjfh2xjoums6wztux4som":2,"2fmsr":2,"2fogzutwiq9iz5vjaqfoyugqalgxpeckigrqvf4hn":2,"2fq":2,"2fqaur8narg":2,"2fufuz19ilfayzxocfra":2,"3002002":2,"304":2,"305":[2,3],"308":2,"325":3,"3x11":2,"41f2r0e":2,"449":2,"45100":0,"4686":[4,5],"471":3,"500":[4,5],"503811":3,"508":[2,3],"50vdc":[2,5],"512":3,"524":2,"537":[4,5],"5488":[4,5],"560":3,"576":[3,4],"593":2,"5kohm":2,"5twgzeq9e7hsylqaljjyrw":3,"5vcc":[4,5],"5vdc":[4,5],"614":3,"616":3,"627":[4,5],"648":[2,3,4,5],"69626":0,"69675":0,"732":3,"741435":2,"741727":3,"742063":3,"745":3,"762":2,"776":3,"796":2,"7ah":[4,5],"7mvldsj5uaxen3lyyh3sqw":2,"846":3,"858":[4,5],"897":[4,5],"9004330000":[4,5],"966067":[4,5],"971110321":2,"ao\u00fbt":0,"case":[1,4,5],"export":1,"final":[4,5],"function":[0,4,5],"h\u00e9l\u00e8ne":[0,7],"mm\u00b2":[4,5],"new":[1,4,5,6],"orl\u00e9an":0,"public":[4,5],"r\u00e9mi":[0,7],"return":[1,4,5],"switch":[4,5],"universit\u00e9":0,"vid\u00e9o":[1,4,5],ADS:[4,5],CMS:[4,5],For:[1,2,4,5],IDE:[6,7],IGE:0,Its:[4,5],The:[1,2,3,7],These:[4,5],With:[4,5],abmn:[4,5],abov:[4,5],acc:[1,4,5],access:[4,5],accord:[4,5],accur:[4,5],accuraci:[4,5],acid:[4,5],activ:[3,6,7],actual:[4,5],adafruit:[1,2,3,4,5],adapt:[2,4,5],adc:[2,4,5],add:[4,5],added:[4,5],adding:[4,5],addit:[4,5],address:[2,3,4,5],adjust:[2,4,5],ads1115:[2,4,5],ads115:[2,4,5],ads1x15:[1,4,5],advantag:2,after:[4,5],all:[1,3,4,5,6],allow:[0,2,3,4,5,6],alp:0,also:[1,4,5],altern:[1,4,5],amp:[2,4,5],amplif:2,amplifi:[4,5],analog:[2,4,5],ani:[4,5],anoth:[1,4,5],apm:[2,3],appear:[1,2,4,5],appli:[0,4,5],applic:0,apt:[1,4,5],aqy211eh:2,arduino:4,arm:4,around:2,arrai:[4,5],articl:[4,5],asler:[2,3,4,5],assembl:[6,7],assist:[4,5],associ:[0,3],attent:[4,5],attribut:[4,5],author:[0,1,4,5,7],automat:[0,4,5],automobil:[4,5],avail:[4,5],avr:4,bank:[4,5],base:[1,3,4,5],basic:0,batteri:[2,4,5,6],been:[1,4,5],befor:[4,5],behavior:[4,5],being:[4,5],below:[1,4,5],between:[2,3,4,5],beyschlag:3,bin:[1,4,5],bit:[2,4,5],bkl:[2,3],black:[2,4,5],blinka:[1,4,5],blk:[2,3],block:[4,5],blue:[4,5],board:[1,6,7],boot:[1,4,5],both:[4,5],bottom:[2,4,5],bought:[4,5],box:6,breakout:2,bridg:[4,5],bug:4,build:[4,5],button:[1,4,5],by10:2,c320c104k1:[2,5],c320c104k1r5ta7303:2,c4uyot:2,cabl:[1,2,3,4,5],calcul:[4,5],calibr:[4,5],call:[0,1],can:[1,4,5,6],canal:4,cap:[4,5],capac:[4,5],capacitor:[2,5],car:4,card:[1,3,6,7],carri:[1,4,5],caus:[1,4,5],ccf071k50gke36:2,cedex:0,ceram:[2,5],cflag:1,chang:[2,3],channel:[3,4,5],characterist:[4,5],charg:[4,5],check:[1,4,5,6],chosen:[4,5],ciayqk2gdckzia2levalkg:2,circuit:[2,3,4,5],circuitpython:[1,4,5],circul:[4,5],cite:7,clean:[4,5],clement:[0,7],click:[1,4,5],close:[1,4,5],cmf651m0000fkek143:2,code:[1,2,4,5],coef_p0:[4,5],coef_p1:[4,5],coef_p2:[4,5],coef_p3:[4,5],coeff:[4,5],coeffici:[4,5],colour:3,com:[1,2,3,4,5],combin:3,command:[1,4,5],commerci:[4,5],common:[4,5],commun:[0,6],complet:[1,2,6,7],compon:[1,6,7],comput:[1,4,5],conduct:[4,5],config:[1,4,5],configur:[6,7],congratul:[4,5],connect:[1,2,3,7],connector:[3,4,5],conrad:[2,3],consequ:[4,5],consist:[4,5],constitut:[4,5],construct:[4,5],consumpt:[4,5,6],contact:[2,3,4,5],contain:[1,4,5],content:7,control:[4,5,6],convers:[4,5],convert:[2,4,5],copi:1,corner:2,correct:[4,5],correspond:4,cost:[0,2,3,4,5],could:[2,4,5],cpu:[4,5,6],creat:[1,4,5],creation:0,crimp:[4,5],csv:[4,5],ctrl:[1,4,5],cui:[2,3],current:[0,2,6,7],dale:2,damag:[1,4,5],data:[0,7],date:[0,4,5,7],dcconvert:5,deactiv:[1,4,5],decid:[1,4,5],decoupl:5,decreas:2,dedic:[0,6],delai:[4,5],deliv:[4,5],depart:0,depend:[1,4,5],describ:[1,2,4,5],descript:[6,7],design:[4,5],desktop:5,despit:[4,5],detail:4,dev:[1,4,5],develop:[0,1,2,4,5,6,7],devic:[2,3],diagram:[4,5],differ:[1,2,4,5,6],digit:[2,3,4,5],dii:6,din:[4,5],diod:3,dip:[2,3],direct:[4,5],directli:[2,4,5],directori:[1,4,5],disconnect:[4,5],discret:1,displai:[4,5],distanc:[4,5],disturb:[4,5],divid:[4,5],document:[0,4],done:[1,4,5],dot:2,down:[4,5],download:[4,5],dsp:4,dual:[2,3,4,5],duboi:[0,7],durat:[4,5,6],dure:[1,4,5],dzwb4:[4,5],e00122ff:0,each:[1,3,4,5],eaiaiqobchmin_taxbcx8wivq5nvch2qaqfpeayyccabegjk1_d_bw:2,eaiaiqobchmit8zjzr6x8wivgdnvch2vbwvseaqyayabegjqg_d_bw:2,editor:[1,4,5],effort:6,eiffel:0,either:[1,4,5],ejector:[2,3],electr:[0,2,7],electrod:[0,2,3,7],electron:[2,3,4,5],elektronik:2,elsevi:0,emil:0,enabl:[4,5],end:[1,4,5],energ:[4,5],enough:[3,4,5],ensur:[1,4,5],enter:[1,4,5],entir:[4,5],environ:[1,4,5],environn:[6,7],environnementshould:[1,4,5],equal:[4,5],equival:[2,4,5],ert:[4,5],escap:[1,4,5],estim:[4,5],everyon:0,everyth:2,evolv:[4,5],exampl:[4,5],excess:[4,5],execut:[1,4,5],exist:[4,5],expand:3,expend:3,experi:[0,4,5,6],explain:4,export_path:5,extra:[4,5],failur:[1,4,5],fargier:[0,7],fast:5,fcommon:1,featur:[4,5],femal:[2,3,4,5],ferrul:[4,5],fewer:[4,5],ff10:0,fhac0002zxj:4,field:[4,5,6],fig:[4,5],figur:[2,4,5],file:[1,4,5],find:[1,4,5],first:[1,4,5],fix:2,flexibl:0,florsch:[2,4,5],flow:[4,5],folder:[1,4,5],follow:[1,2,3,4,5],forquet:[0,7],four:[2,6,7],framework:[4,5],franc:0,frist:7,from:[3,4,5,6],full:[4,5],fulli:0,fuse:[4,5],g5le:3,gain:[2,4,5],ganc:[0,7],gather:[1,4,5],gclid:2,gener:[2,3,4,5,7],geologi:0,ger:0,get:[0,1,2,4,5],gitlab:[4,5],gnd:[4,5],gnu:[1,4,5],gpio:[1,3,4,5],gpiozero:1,grenobl:0,gro:0,ground:[2,4,5],gui:[1,4,5],guidelin:7,gurawfaegucaqqfvnvtyeg:2,gustav:0,guyard:[0,7],h81k0bya:[2,4,5],h81k5bya:[2,4,5],had:[4,5],hand:[4,5],handl:[4,5],hardwar:[0,4,5],hardwarex:0,harwin:2,has:[1,3,4,5],have:[1,2,3,4,5,6],hazard:[4,5],hdmi:1,header:[2,3,4,5],hear:[4,5],here:5,hex:3,hexagonal:2,hexseal:[2,3],high:[4,5],higher:[2,5],holder:[4,5],hole:[4,5],holsworthi:2,home:[1,4,5],horizont:[4,5],hous:[4,5],how:[1,4,5],howev:[4,5],http:[1,2,3,4,5],i2c:[1,2,3],i2cdetect:2,ifsttar:0,iggadovctstu:2,illustr:[4,5],im6toxqzgoauedprb19mha:2,imag:[0,1],imped:[4,5,6],implent:7,improv:[5,6],in1:[4,5],in2:[4,5],in3:[4,5],in4:[4,5],ina282:2,ina282aid:2,includ:[1,4,5],incom:[4,5],incorpor:3,increas:[4,5],inde:[4,5],industri:2,initi:7,inject:[0,6,7],injection_dur:[4,5],inpout:2,input:[2,4,5,6],inra:0,insert:[4,5],insid:[4,5],instal:[2,3,6,7],instanc:1,instead:[4,5],instruct:[1,7],instrument:[0,2,4,5],integr:2,intens:[4,5],interfac:[1,4,5],interpret:[1,2,4,5],introduc:[4,5],introduct:7,invit:4,involv:0,ion:[4,5],iri:0,irstea:[4,5],its:[1,3,4,5,6],jan:7,jason:5,jjse:[2,3],journal:4,json:5,juillet:0,juli:7,julien:[0,7],just:[2,5],kaufmann:[0,7],kemet:[2,5],keyboard:[1,4,5],keyston:3,known:[1,4,5],kohm:[2,3,4,5],laboratori:[0,4,5,6],laps:6,last:5,lastli:[4,5],latest:[1,4,5],lead:[4,5],leav:[1,4,5],left:2,length:[4,5],less:[4,5],let:[4,5],libatla:[1,4,5],librari:[1,4,5],lie:[2,4,5],limit:[2,6,7],line:[2,3,4,5],list:[1,7],lithium:[4,5],littelfus:[4,5],littl:[4,5],lm158:2,lm158j:2,lm158n:2,lm358an:[2,4,5],lm358n:[4,5],locat:[1,4,5],logger:[0,4,5],low:[0,1,4,5,6],lr20:[4,5],lying:[4,5],lyon:0,made:[4,5,6],mai:[1,4,5],main:[4,5],make:[1,4,5],male:[2,3],manag:[4,5],manual:[4,5],manufactur:[2,3,4,5],manuscript:[4,5],mark:2,master:[4,5],matur:7,max:2,maximum:[4,5],mba02040c1003frp00:3,mcp23008:2,mcp23017:3,mcp230xx:1,measur:[0,1,6,7],mechan:[3,4,5],meet:[1,4,5],mega:[4,5],menu:[1,4,5],mesur:7,met:[1,4,5],meter:[0,4,5,6],meterfeatur:0,mgh:2,micro:[1,4,5,6],mill:2,mimic:[4,5],min:[4,5,6],miss:4,mm2:[4,5],model:[1,2,4,5],modif:[1,4,5],modifi:[1,4,5],modul:[4,5],mofset:3,mohm:[2,4,5,6],mon:0,monitor:[4,5,6],more:6,moreov:[4,5],mosfet:3,mount:[2,4,5],mous:[1,4,5],mouser:[2,3],muliplex:3,multi:[3,4,5],multielectrod:6,multipl:1,multiplex:[0,3,6,7],multipli:[4,5],must:[1,4,5],mux:[4,5,6,7],mzrxyrlhvdt9crf7zyf:3,name:[4,5],nano:[1,4,5],nb_electrod:[4,5],nbr_mea:[4,5],nchannel:3,necessari:[1,4,5],need:[1,2,3,4,5],neg:[4,5],next:[4,5],nicola:[0,7],noob:[4,5],nopb:[2,4,5],normal:[4,5],note:[4,5],now:[4,5],number:[2,3,4,5],numer:[4,5],numpi:[1,4,5],obtain:[4,5],offcial:7,offer:[4,5,6],ohm:[2,4,5,6],ohmit:2,ohmmet:[4,5],ohmpi:[1,2,3],ohmpi_4elec:2,ohmpi_param:5,ohx:0,olivi:[0,7],omron:3,onc:[1,4,5],one:[2,4,5,6],onli:[3,7],onto:[4,5],open:[0,1,4,5],oper:[1,2,6,7],optic:2,optim:[4,5],option:[1,4,5],order:[4,5],org:1,orient:5,osf:[4,5],other:[4,5],our:[4,5,6],out:[1,4,5],outpout:2,output:[4,5],over:3,overh:5,own:3,packag:[6,7],padboard:2,pai:[4,5],panason:2,panda:[1,4,5],parallel:1,paramet:[6,7],part:[4,5,6],parten:0,partenair:7,pat1l:5,path:[1,4,5],pcb:[2,3,4,5],pcs:[2,3],per:[2,3,4,5],perform:[0,1,4,5],permut:[4,5],philosophi:[0,7],pic:4,piec:[4,5],pin:[2,3,4,5],pip:[1,4,5],pitch:[2,3,4,5],place:[4,5],plai:2,pleas:[4,5],plug:[2,4,5],point:[4,5,6],polar:[4,5],pole:[4,5],port:2,posit:[1,4,5],possibl:[4,5],potenti:[4,5],potentiomet:[4,5],pour:4,power:[2,3,4,5,6],practic:[4,5],pre:2,preci:2,precis:[2,4,5],prefer:[4,5],preliminari:7,prepar:[2,4,5],present:[0,3,4,5],press:[1,4,5],prevent:5,previou:6,previous:[1,4,5],print:[2,3,4,5],pro:[4,5],problem:1,procedur:7,produc:[4,5],product:[2,3],productdetail:[2,3],program:[1,4,5],progress:[0,7],project:[1,7],propos:[2,4,5],protect:1,protocol:[4,5],provid:[0,4,5],publish:4,puls:[4,5,6],purpos:[4,5],pyhton3:[1,4,5],python3:[1,4,5],python:[6,7],pythonid:[1,4,5],qkeozdl6eqpa6lzrlqfvow:2,quadripol:[4,5],quadrupol:[4,5],quantiti:[1,4,5],r10:[4,5],r11:[4,5],r12:[4,5],r25:2,r_ref:[4,5],rail:[4,5],rang:[4,5],rapberri:[6,7],raspberri:[2,3,6,7],raspberrypi:1,raspbian:[1,4,5],raspebrri:[1,4,5],readm:[4,5],realiz:2,recommend:[1,4,5],red:[2,4,5],reduct:[4,5],refer:[2,3,4,5],relai:[1,2,3,4,5],releas:7,relief:3,remain:[4,5],rememb:[4,5],remot:[1,4,5],repeat:[4,5],repetit:[4,5],replac:5,repositori:[4,5],repres:[3,4,5],requir:[1,4,5,6],research:7,resist:[0,2,6,7],resistor:[2,3,4,5],resolut:[4,5,6],respect:[4,5],result:[2,4,5],revers:[4,5],reversa:[0,4,5],ribbon:3,right:2,rm3x8mm:[2,3],robust:[0,4,5,6],role:[4,5],root:[1,4,5],row:[2,3],rpi:[1,4,5],rro:0,ru5fayqh:2,run:[1,2,4,5],safeti:[4,5],sain:[4,5],sainsmart:[4,5],same:[4,5],samtec:[2,4,5],save:[1,4,5],scale:0,schemat:[2,4,5],scienc:[4,5],scientif:0,screen:[2,4,5],screw:[2,3,4,5],searchsuggest:[2,3],searchterm:[2,3],searchtyp:[2,3],second:[4,5],section:[4,5],see:[4,5],seeed:2,seek:6,select:[1,4,5],sequenc:[4,5],sequence_delai:[4,5],seri:[4,5],serv:[4,5],set:[1,2,4,5],setp:5,setup:[1,4,5],sever:[4,5],sgaepimzzmskedp9slc0yfx16nydmpxjueeogolbldi:3,sgaepimzzmskedp9slc0yyv4kpdpmd1hts4slctivmw:2,sgaepimzzmsyydr3r27av4eqf73yoh:3,sgaepimzzmueqxo7l:3,share:6,shield:[1,4,5],shortcut:[4,5],should:[1,2,4,5],show:[2,4,5],shown:[4,5],shunt:2,shutdown:2,signal:[2,4,5],simpl:[4,5],simpli:[1,4,5],simultan:[4,5],singl:[4,5],slope:[4,5],small:[0,2,4,5,6],smaller:[4,5],smart:[4,5],smt:2,socket:[2,3],softwar:[1,4,5],soic:2,soil:[4,5],solder:[2,4,5],solut:[4,5],some:[4,5,7],sound:[4,5],sourc:[0,1,4,5],space:[2,3],spacer:[2,3],specif:[4,5,6],specifi:[1,4,5],spi:[1,4,5],spool:2,ssq:2,ssw:[2,4,5],stabl:[1,4,5],stack:[4,5],stainless:[4,5],start:[1,4,5,6,7],startup:7,statu:[0,7],steel:[4,5],step:[4,5,7],still:[4,5],stop:6,storag:[4,5,6],strain:3,strict:[4,5],strip:[2,3,4,5],strong:[4,5],stronger:[4,5],strongli:[1,4,5],stuck:[4,5],studi:[4,5],studio:2,subject:[4,5],sudo:[1,4,5],suffici:[1,4,5],suggest:[2,3,4,5],suitabl:[4,5,6],sum:[4,5],suppli:[2,4,5],support:1,suppress:5,sure:[1,4,5],surfac:0,system:[1,4,5,6],tab:[1,4,5],tabl:5,target:7,task:[1,4,5],tb009:[2,3],tca9548a:[1,3],tdh15:2,team:6,technic:7,temperatur:[4,5,6],ten:[4,5],termin:[1,2,3,4,5],test:[1,2,4,5,6],texa:[2,4,5],than:[2,4,5],thd:2,the9:[4,5],thei:[4,5],them:[4,5],therefor:[4,5],thi:[0,1,2,3,4,5,6],thonni:[6,7],thousand:[4,5],three:[2,4,5],through:[4,5],thu:[4,5],time:[1,4,5,6],togeth:[4,5],toler:5,tonni:2,tool:[0,6],top:2,total:[2,3,4,5],tow:2,track:[4,5],traco:[2,5],tracopow:[2,5],trn3:5,trn:[2,5],tru:[3,4,5],turn:[4,5],tutori:7,two:[2,4,5,6],txt:[1,4,5],type:[1,3,4,5,6],typic:[4,5],under:[4,5],unexpectedli:[1,4,5],unit:[2,3,4,5,6],univ:0,unplug:2,unzip:[4,5],updat:0,upgrad:[5,6],upper:2,upping:[4,5],upw50b50rv:[4,5],use:[1,3,4,5],used:[1,2,3,4,5],user:[1,4,5,7],using:[1,4,5],usr:[1,4,5],util:1,uwqyq:3,valid:[4,5],valu:[2,4,5],variou:[4,5],vdc:3,velleman:[4,5],venv:[1,4,5],veri:5,version:[1,2,4,5,6],vertic:[4,5],vhuuswq2:3,via:[1,4,5],view:2,villeurbann:0,vip:2,virtual:[6,7],vishai:[2,3],visit:1,vivien:[0,7],vlwxofp3u2wcfk5uckwtka:[2,3],voltag:[2,4,5,6],voltmet:[4,5],w0yvoo0ixfenuv0hsdc4:2,wai:[1,4,5],want:5,watch:[1,4,5],weaker:4,web:[2,3],websit:[1,4,5],weidmul:[4,5],welcom:0,well:[1,4,5],were:[1,2,4,5],when:[1,4,5],where:[1,4,5],which:[2,3,4,5,6],whose:[4,5],willing:0,window:[1,4,5],wire:[1,4,5],wish:6,within:[1,4,5],without:[4,5],wjwzhv1v3pk:[1,4,5],wktuvitrialgiu8hcm7dvq:2,work:2,would:[4,5],wpm404:[4,5],write:[1,2,4,5],wurth:2,www:[1,2,3,4,5],x1j7hmvl2zh8vpefml8:2,yannick:[0,7],yca:2,you:[1,2,4,5],your:[1,2,4,5],youtub:[1,4,5],ze4:2,zvn4206a:3},titles:["OhmPi project","<strong>STEP n\u00b01</strong> : Raspberry Pi  configuration","<strong>STEP n\u00b02</strong>: Measurement board","<strong>STEP n\u00b03</strong>: MUX board","OhmPi V 1.01 (limited to 32 electrodes)","OhmPi V 1.02 (limited to 32 electrodes)","OhmPi V 2.xx (64 or 128 electrodes and 12V)","OHMPI: Open source and open hardware resitivity-meter"],titleterms:{"128":6,"12v":6,IDE:[1,4,5],The:[4,5,6],activ:[1,4,5],assembl:[2,3,4,5],board:[2,3,4,5],card:[4,5],center:7,check:2,cite:0,complet:[4,5],compon:[2,3,4,5],configur:[1,4,5],connect:[4,5],current:[4,5],data:[4,5,6],descript:[2,4,5],document:7,electr:[4,5],electrod:[4,5,6],environn:[1,4,5],four:[4,5],frist:[4,5],hardwar:7,implement:[4,5],implent:[4,5],initi:[4,5],inject:[4,5],instal:[1,4,5],instruct:[4,5],introduct:0,limit:[4,5],list:[2,3,4,5],measur:[2,4,5],mesur:[4,5],meter:7,multiplex:[4,5],mux:3,ohmpi:[0,4,5,6,7],onli:[4,5],open:7,oper:[4,5],packag:[1,4,5],paramet:[4,5],part:[1,2,3],partenair:0,philosophi:[4,5,6],preliminari:[4,5],procedur:[4,5],project:0,python:[1,4,5],rapberri:[1,4,5],raspberri:[1,4,5],requir:[2,3],resist:[4,5],resit:7,sourc:7,start:2,startup:[4,5],step:[1,2,3,6],summari:7,tabl:4,technic:[4,5,6],test:3,thonni:[1,4,5],titl:4,virtual:[1,4,5]}})
\ No newline at end of file
diff --git a/sphinx/source/Ohmpi_V2_00/V2_00_step_01.rst b/sphinx/source/Ohmpi_V2_00/V2_00_step_01.rst
index 51db436b12ff9740083e543f8be4a2ed566be331..4aeb76b6093e6d455a8089d0b74c5bdfb69ad11c 100644
--- a/sphinx/source/Ohmpi_V2_00/V2_00_step_01.rst
+++ b/sphinx/source/Ohmpi_V2_00/V2_00_step_01.rst
@@ -1,4 +1,4 @@
-**STEP n°1** : Raspberry Pi  configuration
+**STEP n°1** : Raspberry Pi  configuration 
 *******************************************
 
 
@@ -19,12 +19,13 @@
 |Computer Keyboard                                   |              1|
 +----------------------------------------------------+---------------+
 
+
 The first step is to start up the Raspberry Pi board, including installation of an OS (operating system). 
 For this step, the installation instructions are well described on the Raspberry website 
 
 1. Watch the vidéo "how to set up your raspberry Pi" (https://www.youtube.com/watch?v=wjWZhV1v3Pk)
 
-2. The authors recommend installing the latest stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
+2. The authors recommend installing the latest stable and complete version of Raspberry Pi OS (Previously called Raspbian) by using Raspberry Pi Imager.
 
 3. or you can visit this website : (https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up)  
 
@@ -41,7 +42,7 @@ For this step, the installation instructions are well described on the Raspberry
 
 
 .. warning::
-	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
+	 Once the OS has been installed,  **1-wire, spi and GPIO remote option** must be deactivated and **I2C option** must be activated via the Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
 
 3. When the relays are connected to the GPIO, make sure that all the GPIOs are in the low position when the raspberry starts up. If not, the relays will activate unexpectedly. 
 To ensure that the GPIOs are in Low position, you will need to modify the /boot/config.txt file.
@@ -104,8 +105,9 @@ Activate it using the following command:
 Install packages within the virtual environment. Installing the following package should be sufficient to meet dependencies:
 
 .. code-block:: python
-	 
-	 pip install RPi.GPIO adafruit-blinka numpy adafruit-circuitpython-ads1x15 pandas
+     
+     export CFLAGS=-fcommon
+	 sudo pip install RPi.GPIO adafruit-blinka numpy pandas adafruit-circuitpython-ads1x15 adafruit-circuitpython-tca9548a adafruit-circuitpython-mcp230xx gpiozero
 
 Check that requirements are met using 
 
@@ -172,4 +174,4 @@ If you decided to use a virtual environment, it is necessary to setup Thonny Pyt
 
 9- Close thonny to save modifications
 
- 
\ No newline at end of file
+ 
diff --git a/sphinx/source/Ohmpi_V2_00/V2_00_step_02.rst b/sphinx/source/Ohmpi_V2_00/V2_00_step_02.rst
index 63caad89aa3c0842f9f7846f3f92878576f08345..243ddd8ee3ec11314e9009e55c0dd1a971a379a1 100644
--- a/sphinx/source/Ohmpi_V2_00/V2_00_step_02.rst
+++ b/sphinx/source/Ohmpi_V2_00/V2_00_step_02.rst
@@ -40,7 +40,7 @@ We have developed a complete "plug and play" measurement board. To measure elect
 two ADS1115 were used,one for the voltage measurement one for the current measurement, as proposed by Florsch [7]. The ADS1115
 is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. The advantage of ADS1115 is that the 
 input signal value could lie between - to + 6.114 V. For the current measurement we have directly integrated the INA282 component, 
-which allows to realize precise current measurement around a shunt resistor. The assembly steps are described in the following steps:
+which allows to realize precise current measurement around a shunt resistor. The assembly are described in the following steps:
 
 
 
@@ -152,6 +152,12 @@ which allows to realize precise current measurement around a shunt resistor. The
    |         |  Soldering three capacitors (100nF)                        | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
+
+.. warning::
+	 
+	 In this version, We used a shunt resistor of 2 ohms, which limits the current measurement to 48 mA. If the current is higher than this value, you just have to decrease the value of the shunt resistor.Change the shunt value in the code.
+
+
    
 .. table::
    :align: center
@@ -237,7 +243,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/20_mes_board.jpg                   |
    |20       +------------------------------------------------------------+
-   |         | Fixing MCP23008 component                                  | 
+   |         | Fixing MCP23008 component (Dot mark on the top left corner)| 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
    
@@ -247,8 +253,8 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/21_mes_board.jpg                   |
    |21       +------------------------------------------------------------+
-   |         |Mounting optical relay, AQY211EH                            | 
-   |         |                                                            |                                                                       
+   |         |Mounting optical relay, AQY211EH (Dot mark in the top left  | 
+   |         |corners)                                                    |                                                                       
    +---------+------------------------------------------------------------+
    
 .. table::
@@ -277,7 +283,7 @@ which allows to realize precise current measurement around a shunt resistor. The
    +---------+------------------------------------------------------------+
    |         |   .. image:: step_n_2/a/24_mes_board.jpg                   |
    |24       +------------------------------------------------------------+
-   |         | Fixing the INA282                                          | 
+   |         | Fixing the INA282 (Dot mark in the top right corner)       | 
    |         |                                                            |                                                                       
    +---------+------------------------------------------------------------+
   
@@ -429,7 +435,8 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/Inked20211206_150522_LI.jpg        |
    |6       +------------------------------------------------------------+
    |        |Install the red cables on the +12V terminal and black cable |                                                                       
-   |        |on the ground terminal.                                     |
+   |        |on the ground terminal. Connect to two different 12V        |
+   |        |batteries                                                   |
    +--------+------------------------------------------------------------+ 
 
 .. table::
@@ -461,5 +468,5 @@ Setting up an equivalent electronic circuit, for this you will need:
    |        |   .. image:: step_n_2/c/20211206_144334.jpg                |
    |7       +------------------------------------------------------------+
    |        | Run Ohmpi_4elec.py, if everything works you should         |                    
-   |        | get the following result                                   |
+   |        | get the following result (220 ohm)                         |
    +--------+------------------------------------------------------------+ 
diff --git a/sphinx/source/Ohmpi_V2_00/V2_00_step_03.rst b/sphinx/source/Ohmpi_V2_00/V2_00_step_03.rst
index 4684d5a143c3a16e2c534a45eb33b8f40da80fd3..3572f898d9da0797c700078e3d56a2ae01390e49 100644
--- a/sphinx/source/Ohmpi_V2_00/V2_00_step_03.rst
+++ b/sphinx/source/Ohmpi_V2_00/V2_00_step_03.rst
@@ -10,7 +10,7 @@
 Required components 
 ----------------------------------------------------
 
-.. figure:: step_n_3/a/00_mes_board_components.jpg       
+.. figure:: step_n_3/a/MUX_board_componement.jpg       
 	   :width: 600px
 	   :align: center
 	   :height: 450px
@@ -21,4 +21,126 @@ Required components
 .. csv-table:: List of components
    :file: step_n_3/a/MUX_board_list_2_xx.csv
    :widths: 30, 70, 70, 70, 70, 35, 35
-   :header-rows: 1 
\ No newline at end of file
+   :header-rows: 1 
+   
+The multiplexing of the channels is a mechanical multiplexing based on OMRON's manufacturing relays (G5LE-1-VD 12 VDC). Each relay is combined with 
+a ZVN4206A power MOFSET. The raspberry has only 30 GPIOs, which is not enough to activate all the 64 electrodes, which represent 512 GPIOs. 
+We used gpio expender I2C (MCP23017). We have associated these components with an I2C muliplexer of type type TCA9548A from adafruit. 
+This combination allows to go up to 512 GPIOs and up to 128 electrodes. Each card has its own digital address between 0X70 and 0X77. 
+In the following presentation for an Ohmpi 64 electrodes, we will use the addresses 0X70 for channel A, 0X71 for channel B, 0X72 for channel M and 0X73 for channel N. 
+0X73 for the N channel. 4 MUX board will be needed to multiplex an Ohmpi 64 electrodes.
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_00.jpg                         |
+   |      1 +------------------------------------------------------------+
+   |        |Mux board pcb                                               | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_01.jpg                         |
+   |      2 +------------------------------------------------------------+
+   |        |Installation of the 150 Kohm resistors                      | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_02.jpg                         |
+   |      3 +------------------------------------------------------------+
+   |        |Installation of the mosfet ZVN4206A                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+      
+   
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_03.jpg                         |
+   |      4 +------------------------------------------------------------+
+   |        |Installation of the diode-1n4007                            | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+    
+   
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_04.jpg                         |
+   |      5 +------------------------------------------------------------+
+   |        |Installation of the relay                                   | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_05.jpg                         |
+   |      6 +------------------------------------------------------------+
+   |        |Instalation of the terminal screw                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_06.jpg                         |
+   |      7 +------------------------------------------------------------+
+   |        |Installation of generic male header                         | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+ 
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_07.jpg                         |
+   |      8 +------------------------------------------------------------+
+   |        |Installation of Pin strip (6 pins)  and pin strip (16 pins) | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_08.jpg                         |
+   |      9 +------------------------------------------------------------+
+   |        |Installation of DIP Dual In Line Socket 2*14                | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_09.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of Adafruit TCA9548A                           | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+
+
+.. table::
+   :align: center
+   
+   +--------+------------------------------------------------------------+
+   |        |   .. image:: step_n_3/a/MUX_10.jpg                         |
+   |     10 +------------------------------------------------------------+
+   |        |Installation of MCP23017                                    | 
+   |        |                                                            |                                                                       
+   +--------+------------------------------------------------------------+  
+
+
+**PART B** Test of MUX board
+======================================================   
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/raspbian_version.JPG b/sphinx/source/Ohmpi_V2_00/step_n_1/raspbian_version.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_1/raspbian_version.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_1/raspbian_version.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/schema_measurement_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_1/schema_measurement_board.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..0d5031fec361276c1309ac48fbb9f996ffb5fb8b 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_1/schema_measurement_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_1/schema_measurement_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_first_interface.JPG b/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_first_interface.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_1/thonny_first_interface.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_1/thonny_first_interface.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter.JPG b/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter_folder.JPG b/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter_folder.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter_folder.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_1/thonny_interpreter_folder.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_option.JPG b/sphinx/source/Ohmpi_V2_00/step_n_1/thonny_option.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_1/thonny_option.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_1/thonny_option.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/01_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/01_mes_board.jpg
index 2baa894bd38ab71c7a2f03bfca10a382ce93a0b9..237c47dca441248fde4a29fb3abbe983c2b357e4 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/01_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/01_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/03_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/03_mes_board.jpg
index 41381d5341aed8952dab89fa31ed7c0303e50205..e52e56db4257d5076984ea68eb86f8ca2fe23a6d 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/03_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/03_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/04_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/04_mes_board.jpg
index 988d238ad7fc61d9fb594467729879635deec63b..ed42f99b544b41a3dc361d42be429b3e0b47d8c8 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/04_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/04_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/06_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/06_mes_board.jpg
index 94a903f0c942832b86d2f074b95ea5c65a58553b..16894c29798019e2229ada80b6df85b8e4cc69e1 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/06_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/06_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/07_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/07_mes_board.jpg
index 954aabf761288a96221d98914011a337cd6664ad..0327314ce5fa099577d3d9e15e9b1b9570d47bb4 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/07_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/07_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/08_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/08_mes_board.jpg
index 645ed57a8f2c9118f57500a4aa575913770acdad..968e454a8fb4abb3e001d7923a72f47ef6c645bb 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/08_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/08_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/09_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/09_mes_board.jpg
index 28dc97fb5c4c69eec691f6070b7ff79674eae41c..ba7032edab114205c03bf3424866ca75862a49d6 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/09_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/09_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/0_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/0_mes_board.jpg
index ffb247a2c8fa1930ceb99c47c4d50f4bd0493985..fe121c5903d428c786d5533ffe430a332427896f 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/0_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/0_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/11_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/11_mes_board.jpg
index b9f76edf4a3fd158a8b3cb36fe8216c5d0f2d70d..0943785ea02a53667d3fd17de1f2d42ef54455c1 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/11_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/11_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/13_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/13_mes_board.jpg
index c954948f8b497ac5a62701a2cbcba8d8133258b4..e2c364ae2f79db84ddedff044e8d30e0380f4741 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/13_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/13_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/14_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/14_mes_board.jpg
index 06db732127be7c32a33d2153f3a58a764466891b..31c7f113e432921c311b3ce4967a2be82f2e3f5e 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/14_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/14_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/15_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/15_mes_board.jpg
index cf98e5c5ce8ffe7373e6aee0bc7e13b880f47db8..43a4682dead6a8ffc87d444f7bfe9daabb577938 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/15_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/15_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/16_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/16_mes_board.jpg
index 930821538195751d3b6be551bbf605711bf394f4..3dfa61ba684f9275e912e3f33f5b42daca0d6dd2 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/16_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/16_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/17_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/17_mes_board.jpg
index a2cdc3b622201e41ee870d3c88dbd7bfe72c4fd1..90a4b6a1f978195d694abefb01a36d427a340365 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/17_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/17_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/18_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/18_mes_board.jpg
index 699b20b0a617d080aa2ddcdbab91960a821ee3f7..7abcf130948510785c57bbcf4b83f3e663c26eeb 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/18_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/18_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/19_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/19_mes_board.jpg
index f191473cb7982f67488e13a62ea6e53bc97e4e26..a3ec0b5f27b71f3ebc71685ca6e24c473324188a 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/19_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/19_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/20_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/20_mes_board.jpg
index f6780cd498352806e601bd9e77b9e6a9076b47c0..790fa362dc0ba5b00515862e62e2ade622a70d4e 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/20_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/20_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/21_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/21_mes_board.jpg
index faf681109fae1e1a4115b95c3fca1b83608fd550..c8628d9c4aecbbd48215f53c78661baee4b33c5a 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/21_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/21_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/22_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/22_mes_board.jpg
index 6b3e2ad86a98550cc53a2053a1151f67dad2d741..bf1defadf621dfc6053ff47ea933de519157d06b 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/22_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/22_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/23_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/23_mes_board.jpg
index 6fa589f253fea3036bc1363592f803782dcce7b3..e9c8845baac74db8b8d3d218b1b71b57b064d37b 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/23_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/23_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/24_mes_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/24_mes_board.jpg
index 767e901170e31f12a7834931950bce5f3d8ca776..956a8f379a79cb4a49a03d777c98d339effc9b7f 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/24_mes_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/24_mes_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/Mesure_board_list_2_xx.csv b/sphinx/source/Ohmpi_V2_00/step_n_2/a/Mesure_board_list_2_xx.csv
index 2b5581dc9f83de0e48e99095433d58809d17b234..ac47980cc24dd2c2ae989098a71e108ce38ac255 100644
--- a/sphinx/source/Ohmpi_V2_00/step_n_2/a/Mesure_board_list_2_xx.csv
+++ b/sphinx/source/Ohmpi_V2_00/step_n_2/a/Mesure_board_list_2_xx.csv
@@ -1,25 +1,24 @@
-Component,Number,Cost per unit € ,Total cost €,Manufacturer,Manufacturer s reference,Web reference
-Raspberry Pi 4 Model B,1,58.75,58.75,Raspberry,Raspberry Pi 4 Model B,https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D
-LM158N AMP-o,4,14.5,58,Texas Instruments,LM358AN/NOPB,https://www.mouser.fr/ProductDetail/Texas-Instruments/LM158J?qs=X1J7HmVL2ZH8vpEfMl8%2FFQ%3D%3D
-Printed circuit board ,1,12,12,Asler,-,-
-ADS1115,2,11.9,23.8,Adafruit,1085,https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D
-Capacitor 100nF 50Vdc 10% Ceramic,4,0.2,0.8,KEMET, C320C104K1,https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D
-Resistor 1 Kohm 0.5W +- 0.1%,2,1.3,2.6,TE Connectivity,H81K0BYA,https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D
-Resistor 1.5 Kohms +- 0.1%,2,1.3,2.6,TE Connectivity,H81K5BYA,https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D
-Resistor 1.5 Kohms +- 5%,2,1.3,2.6,Vishay,CCF071K50GKE36,https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D
-Resistor 10 Mohms +-5%,2,0.762,1.524,VISHAY,CMF651M0000FKEK143,https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D
-2 ohm shunt resistor+-  1%,1,2.42,2.42,Ohmite,41F2R0E,https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D
-Dual screw terminal (5.08-mm pitch),5,0.648,3.24,CUI Devices,TB009-508-02BE,https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D
-DC/DC converter 12 to 24V,2,15.58,31.16,TracoPower,TRN 3-1215,https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D
-DIP Dual In Line Socket 2*4,3,0.72,2.16,Mill-Max,110-43-308-41-001000,https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&mgh=1&vip=1&gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE
-AQY211EH,4,3.84,15.36,Panasonic Industrial Devices,AQY211EH,https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D
-DIP Dual In Line Socket 2*2,4,0.449,1.796,Preci-dip,110-83-304-41-001101,https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D
-SSQ-103-03-G-D,1,2.06,2.06,Samtec,SSQ-103-03-G-D,https://www.mouser.fr/ProductDetail/Samtec/SSQ-103-03-G-D?qs=rU5fayqh%252BE2Z%252BZTchcPoHQ%3D%3D
-MCP23008,1,1.72,1.72,Adafruit,593,https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D
-Header sets 1x10,2,2.12,4.24,Samtec,SSW-110-02-G-S,https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D
-SMT Breakout PCB for SOIC-8,1,2.5,2.5,Adafruit,1212,https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&mgh=1&vip=1&gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE
-INA282AID,1,4.11,4.11,Texas Instruments,INA282AID,https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D
-THD 15-1211N,1,39.72,39.72,TracoPower,THD 15-1211N,https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D
-DIP Dual In Line Socket 2*20,1,8.53,8.53,Samtec,SSQ-120-23-G-D,https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D
-Pin strip no ejector ,1,0.35,0.35,BLK electronic,10120550,https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&searchType=suggest&searchSuggest=product
-Male Female spacer 2.5M HEXAGONALE,	4,	0.87,	3.48,	HARWIN,	R25-3002002,	https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D
+"Component","Number","Cost per unit € ","Total cost €","Manufacturer","Manufacturer s reference","Web reference"
+"Raspberry Pi 4 Model B",1,"58,75","58,75","Raspberry","Raspberry Pi 4 Model B","https://www.mouser.fr/ProductDetail/Seeed-Studio/102110421?qs=7MVldsJ5UaxeN3LYyh3sqw%3D%3D"
+"LM158N AMP-o",2,"14,5",58,"Texas Instruments","LM358AN/NOPB","https://www.mouser.fr/ProductDetail/Texas-Instruments/LM158J?qs=X1J7HmVL2ZH8vpEfMl8%2FFQ%3D%3D"
+"Printed circuit board ",1,12,12,"Asler","-","-"
+"ADS1115",2,"11,9","23,8","Adafruit",1085,"https://www.mouser.fr/ProductDetail/Adafruit/1085?qs=%2Fha2pyFaduhE%2FOGzuTWIQ9Iz5VjaqFOYugqAlGxpEcKiGrQvF4hn%252Bg%3D%3D"
+"Capacitor 100nF 50Vdc 10% Ceramic",3,"0,2","0,8","KEMET"," C320C104K1","https://www.mouser.fr/ProductDetail/KEMET/C320C104K1R5TA7303?qs=c4UyoTs%2FLq1th4mcyOeTmA%3D%3D"
+"Resistor 1 Kohm 0.5W +- 0.1%",2,"1,3","2,6","TE Connectivity","H81K0BYA","https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K0BYA?qs=%2Fha2pyFaduhUylh7Az%2FmjFH2XjOUms6wZtUX4sOM%252BII%3D"
+"Resistor 1.5 Kohms +- 0.1%",2,"1,3","2,6","TE Connectivity","H81K5BYA","https://www.mouser.fr/ProductDetail/TE-Connectivity-Holsworthy/H81K5BYA?qs=%2Fha2pyFadugy9tWham3rU9HmIJOhyWhBIN95kNm%252BX%2FM%3D"
+"Resistor 1.5 Kohms +- 5%",2,"1,3","2,6","Vishay","CCF071K50GKE36","https://www.mouser.fr/ProductDetail/Vishay-Dale/CCF071K50GKE36?qs=QKEOZdL6EQpA6LZRLQFVOw%3D%3D"
+"Resistor 10 Mohms +-5%",2,"0,762","1,524","VISHAY","CMF651M0000FKEK143","https://www.mouser.fr/ProductDetail/Vishay-Dale/CMF651M0000FKEK143?qs=CiayqK2gdcKzIA2LEVaLkg%3D%3D"
+"2 ohm shunt resistor+-  1%",1,"2,42","2,42","Ohmite","41F2R0E","https://www.mouser.fr/ProductDetail/Ohmite/41F2R0E?qs=IM6ToxQzGOAuEDprb19mHA%3D%3D"
+"Dual screw terminal (5.08-mm pitch)",5,"0,648","3,24","CUI Devices","TB009-508-02BE","https://www.mouser.fr/ProductDetail/CUI-Devices/TB009-508-02BE?qs=vLWxofP3U2wCFk5uCkWTkA%3D%3D"
+"DC/DC converter 12 to 24V",1,"15,58","31,16","TracoPower","TRN 3-1215","https://www.mouser.fr/ProductDetail/TRACO-Power/TRN-3-1215?qs=YCa%2FAAYMW02gqUicGQj0tA%3D%3D"
+"DIP Dual In Line Socket 2*4",3,"0,72","2,16","Mill-Max","110-43-308-41-001000","https://www.mouser.fr/ProductDetail/Mill-Max/110-43-308-41-001000?qs=IGgAdOvCTsTu%2FqaUr8NArg%3D%3D&mgh=1&vip=1&gclid=EAIaIQobChMIn_TAxbCx8wIVQ5nVCh2QaQFpEAYYCCABEgJk1_D_BwE"
+"AQY211EH",4,"3,84","15,36","Panasonic Industrial Devices","AQY211EH","https://www.mouser.fr/ProductDetail/Panasonic-Industrial-Devices/AQY211EH?qs=wKtUvITRialGIU8hcM7DvQ%3D%3D"
+"DIP Dual In Line Socket 2*2",4,"0,449","1,796","Preci-dip","110-83-304-41-001101","https://www.mouser.fr/ProductDetail/Preci-dip/110-83-304-41-001101?qs=%2Fha2pyFadujQKqx4wAuiG%2FMGNdxMCNv%2F33Nj0gBxRocuLUcYnpyONg%3D%3D"
+"MCP23008",1,"1,72","1,72","Adafruit",593,"https://www.mouser.fr/ProductDetail/Adafruit/593?qs=sGAEpiMZZMsKEdP9slC0YYV4kPdpMD1Hts4SLctIVmw%3D"
+"Header sets 1x10",2,"2,12","4,24","Samtec","SSW-110-02-G-S","https://www.mouser.fr/ProductDetail/Samtec/SSW-110-02-G-S?qs=rU5fayqh%252BE0w1ORXZiBQpw%3D%3D"
+"SMT Breakout PCB for SOIC-8",1,"2,5","2,5","Adafruit",1212,"https://www.mouser.fr/ProductDetail/Adafruit/1212?qs=GURawfaeGuCAqqfvnVtyeg%3D%3D&mgh=1&vip=1&gclid=EAIaIQobChMIt8zJzr6x8wIVGdnVCh2vBwVsEAQYAyABEgJqG_D_BwE"
+"INA282AID",1,"4,11","4,11","Texas Instruments","INA282AID","https://www.mouser.fr/ProductDetail/Texas-Instruments/INA282AID?qs=Ze4%2FuFuz19ILFayZXOCfrA%3D%3D"
+"THD 15-1211N",1,"39,72","39,72","TracoPower","THD 15-1211N","https://www.mouser.fr/ProductDetail/TRACO-Power/THD-15-1211N?qs=%2Fha2pyFadugpyEG4IDvm%2FMSR%252B7aN%2F0T3rUIs9PCAqJlT4%252BnRpUOOeQ%3D%3D"
+"DIP Dual In Line Socket 2*20",1,"8,53","8,53","Samtec","SSQ-120-23-G-D","https://www.mouser.fr/ProductDetail/Samtec/SSQ-120-23-G-D?qs=rU5fayqh%252BE1BMVd%252BDZONqg%3D%3D"
+"Pin strip no ejector ",1,"0,35","0,35","BLK electronic",10120550,"https://www.conrad.com/p/bkl-electronic-10120550-pin-strip-no-ejector-contact-spacing-254-mm-total-number-of-pins-6-no-of-rows-2-1-pcs-741435?searchTerm=741435&searchType=suggest&searchSuggest=product"
+"Male Female spacer 2.5M HEXAGONALE",4,"0,87","3,48","HARWIN","R25-3002002","https://www.mouser.fr/ProductDetail/Harwin/R25-3002002?qs=W0yvOO0ixfENUv0hsdC4%2FQ%3D%3D"
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/a/schema_measurement_board.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/a/schema_measurement_board.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..e6a0633b3ab41ad782d7b0d4539119784aefde46 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/a/schema_measurement_board.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/a/schema_measurement_board.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_144334.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_144334.jpg
index 2a0c06b5febef44d48975b274c2a9ea30cf397f9..ce94d8e783f3be1f89190dca989ba570b3d27de5 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_144334.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_144334.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_150522.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_150522.jpg
index 376c9cc1b754a583b3eaf8b9bd63e102f91e3c56..03ecffe6f2b737e32f375d77cc05f9b06ae3789d 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_150522.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/c/20211206_150522.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI.jpg
index 5ec54996e216cb474520c30190b9ff6ac74cbf15..3f8ba9c3978be068fcd902bda5f37b2ba1cb0541 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI2.jpg b/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI2.jpg
index b688467d89317bb015671419dcbae7a6afbe569b..eeeccbe38189f1ae07e71ab4f99d14a881379871 100644
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI2.jpg and b/sphinx/source/Ohmpi_V2_00/step_n_2/c/Inked20211206_150522_LI2.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/i2Cdetect.png b/sphinx/source/Ohmpi_V2_00/step_n_2/c/i2cdetect.png
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_2/c/i2Cdetect.png
rename to sphinx/source/Ohmpi_V2_00/step_n_2/c/i2cdetect.png
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_2/c/thonny_first_interface.JPG b/sphinx/source/Ohmpi_V2_00/step_n_2/c/thonny_first_interface.jpg
similarity index 100%
rename from sphinx/source/Ohmpi_V2_00/step_n_2/c/thonny_first_interface.JPG
rename to sphinx/source/Ohmpi_V2_00/step_n_2/c/thonny_first_interface.jpg
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/00_mes_board_components.jpg.gsr2 b/sphinx/source/Ohmpi_V2_00/step_n_3/a/00_mes_board_components.jpg.gsr2
deleted file mode 100644
index 82debe82cd36ab709ea3bd43b495b47d0530264a..0000000000000000000000000000000000000000
--- a/sphinx/source/Ohmpi_V2_00/step_n_3/a/00_mes_board_components.jpg.gsr2
+++ /dev/null
@@ -1,9 +0,0 @@
-Golden Software Cartographic Reference Information : Version 2.00
-System Type : GCS
-Georef Method : Affine With Coefficients
-Georef Coefficient A : 3.98232497892982
-Georef Coefficient B : 0
-Georef Coefficient C : 0
-Georef Coefficient D : 0
-Georef Coefficient E : 3.98093587521664
-Georef Coefficient F : 0
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_123517.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_123517.jpg
deleted file mode 100644
index 686a35fc45a6a18ace8edd339a876e14a9bef592..0000000000000000000000000000000000000000
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_123517.jpg and /dev/null differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_131345.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_131345.jpg
deleted file mode 100644
index 19348c4f4611c767291be53d783ea25143e830be..0000000000000000000000000000000000000000
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_131345.jpg and /dev/null differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_152645.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_152645.jpg
deleted file mode 100644
index cabccc61f03295eeefcd1c0b6541ceba6fb06681..0000000000000000000000000000000000000000
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_152645.jpg and /dev/null differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_153141.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_153141.jpg
deleted file mode 100644
index 368e24b93596315a0dfb5a443d03cde196fc1d75..0000000000000000000000000000000000000000
Binary files a/sphinx/source/Ohmpi_V2_00/step_n_3/a/IMG_20211026_153141.jpg and /dev/null differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_00.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_00.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fb2cf2d57c8ca616fd6c37c1f6d8d37a6d3b0be8
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_00.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_01.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_01.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8dc00f59bbe6c9a9f0de7cad657eb19878d2ccdd
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_01.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_02.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7601e8b721e6f47ed75a245bd2625d2d07e3950c
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_02.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_03.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_03.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e87437e4f187bbc3aaf1a2186c19ab6827d8c2ea
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_03.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_04.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_04.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b80c7e30b84649d3b684266ffa7a8a528a98d5df
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_04.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_05.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_05.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa6d46a10980852997d917165b79c34e6dc54812
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_05.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_06.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_06.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..73be96cbd21173e8bf355030e90bd1e768e52c03
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_06.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_07.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_07.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1086d5ab36c451047701fb728d9e5f1fc37f7af8
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_07.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_08.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_08.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..af86ba353fed5b6d9231ca13771ea9556c149907
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_08.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_09.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_09.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0f3247cc8858201b4919d45a6ec450e099dd6480
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_09.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_10.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_10.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..22bdca2ac5b44182e19801e4b00cdedfbec43864
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_10.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_board_componement.jpg b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_board_componement.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6fdad018330cc86c50b18552261d58359c79bc9c
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/MUX_board_componement.jpg differ
diff --git a/sphinx/source/Ohmpi_V2_00/step_n_3/a/mux_fig.gpj b/sphinx/source/Ohmpi_V2_00/step_n_3/a/mux_fig.gpj
new file mode 100644
index 0000000000000000000000000000000000000000..fac471fa491552998d117c0b413c651752387b84
Binary files /dev/null and b/sphinx/source/Ohmpi_V2_00/step_n_3/a/mux_fig.gpj differ
diff --git a/sphinx/source/V1_01.rst b/sphinx/source/V1_01.rst
index c144a69abe916e33b5df140e5c7dd5f927bc7e0d..f1610bfd3c48cce409df560574f596e77a84ab28 100644
--- a/sphinx/source/V1_01.rst
+++ b/sphinx/source/V1_01.rst
@@ -521,7 +521,7 @@ Complete list of components
 
 
 .. csv-table:: Table Title
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list.csv
+   :file: list.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/source/V1_02.rst b/sphinx/source/V1_02.rst
index facd94d9c002801d153e30985810659c0e46048c..ff4c42ece839b61930eb862d4e9f47edfec01d83 100644
--- a/sphinx/source/V1_02.rst
+++ b/sphinx/source/V1_02.rst
@@ -533,7 +533,7 @@ Complete list of components
 
 
 .. csv-table:: List of components
-   :file: C:\Users\remi.clement\Documents\28_ohmpi_all_git\master2\sphinx\source\list - 1_02.csv
+   :file: list - 1_02.csv
    :widths: 30, 70, 70, 70, 70,70
    :header-rows: 1
 
diff --git a/sphinx/source/conf.py b/sphinx/source/conf.py
index ee5c6a363b4654116545c6cb0536080ce14336b0..d4fd7250fcdfa4884ed8a25715c258cc94ed1311 100644
--- a/sphinx/source/conf.py
+++ b/sphinx/source/conf.py
@@ -58,3 +58,5 @@ html_theme = 'sphinx_rtd_theme'
 # so a file named "default.css" will overwrite the builtin "default.css".
 html_static_path = ['_static']
 
+master_doc = 'index'
+
diff --git a/sphinx/source/connection.jpg b/sphinx/source/connection.jpg
index e2b5e01b748d01d8eeed57b2526b83dd00822605..be7b2f429969bf07174631ee63f4d13f47bc9bad 100644
Binary files a/sphinx/source/connection.jpg and b/sphinx/source/connection.jpg differ
diff --git a/sphinx/source/installation_current_board.jpg b/sphinx/source/installation_current_board.jpg
index 2674efdd8fbdbc6cd539fad3e16858783f26bfac..669a2724f34c02c0abb14f5cac4649bfef50208a 100644
Binary files a/sphinx/source/installation_current_board.jpg and b/sphinx/source/installation_current_board.jpg differ
diff --git a/sphinx/source/measurement_board1-02.jpg b/sphinx/source/measurement_board1-02.jpg
index 559aead766a8549f1ab9c35991a912cb3dfc7be0..561140f366d25901936fc3e6ae2ad9c08f145889 100644
Binary files a/sphinx/source/measurement_board1-02.jpg and b/sphinx/source/measurement_board1-02.jpg differ
diff --git a/sphinx/source/raspbian_version.JPG b/sphinx/source/raspbian_version.jpg
similarity index 100%
rename from sphinx/source/raspbian_version.JPG
rename to sphinx/source/raspbian_version.jpg
diff --git a/sphinx/source/schema_measurement_board.jpg b/sphinx/source/schema_measurement_board.jpg
index a4d73a9656272e18ec6a3341eba40956e568ae48..da38456330fc28f6a1c562709c6dc4a4b3685922 100644
Binary files a/sphinx/source/schema_measurement_board.jpg and b/sphinx/source/schema_measurement_board.jpg differ
diff --git a/sphinx/source/thonny_first_interface.JPG b/sphinx/source/thonny_first_interface.jpg
similarity index 100%
rename from sphinx/source/thonny_first_interface.JPG
rename to sphinx/source/thonny_first_interface.jpg
diff --git a/sphinx/source/thonny_interpreter.JPG b/sphinx/source/thonny_interpreter.jpg
similarity index 100%
rename from sphinx/source/thonny_interpreter.JPG
rename to sphinx/source/thonny_interpreter.jpg
diff --git a/sphinx/source/thonny_interpreter_folder.JPG b/sphinx/source/thonny_interpreter_folder.jpg
similarity index 100%
rename from sphinx/source/thonny_interpreter_folder.JPG
rename to sphinx/source/thonny_interpreter_folder.jpg
diff --git a/sphinx/source/thonny_option.JPG b/sphinx/source/thonny_option.jpg
similarity index 100%
rename from sphinx/source/thonny_option.JPG
rename to sphinx/source/thonny_option.jpg
diff --git a/sphinx/source/web_site.JPG b/sphinx/source/web_site.jpg
similarity index 100%
rename from sphinx/source/web_site.JPG
rename to sphinx/source/web_site.jpg
diff --git a/test_mux_board.py b/test_mux_board.py
index 003ded95232cc3ef203c2d457f332d8550a96352..f3ef60e4cf881670d2ef65965c0b08d5b68467fc 100644
--- a/test_mux_board.py
+++ b/test_mux_board.py
@@ -11,6 +11,7 @@ from digitalio import Direction
 
 
 address=0X70# choose the mux board address 
+
 activation_time=1 # choose your activation time in second 
 
 
@@ -73,6 +74,8 @@ if a== '2':
         time.sleep(activation_time) 
         switch_mux_off(electrode,address) 
         print('electrode:',electrode,' deactivate' ) 
+
         time.sleep(activation_time) 
+
 if a not in ['1', '2']: 
     print ("Wrong choice !")