Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxHalford committed Sep 22, 2024
1 parent fdb5faf commit 82dd89a
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 101 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# icanexplain ~ explain why metrics change

This library
This library is here to help with the difficult task of explaining why a metric changes. It's particularly useful for analysts, data scientists, analytics engineers, and business intelligence professionals who need to understand the drivers of a metric's change.

Let's say you're an analyst at an Airbnb-like company, and you're tasked with analyzing year-over-year revenue growth. You have obtained the following dataset:
This README provides a small introduction. For more information, please refer to the [documentation](https://carbonfact.github.io/icanexplain).

Let's say you're an analyst at an Airbnb-like company. You're tasked with analyzing year-over-year revenue growth. You have obtained the following dataset:

```py
>>> import locale
Expand Down Expand Up @@ -78,6 +80,8 @@ Here's how to interpret this explanation:
- From 2020 to 2021, the revenue growth was entirely due to an increase in the number of bookings. The revenue per booking was exactly the same. Therefore, the $110,000 is entirely due to the mix effect (increase in bookings).
- From 2021 to 2022, there was a $52,500 revenue growth. However, the revenue per booking went down by $10, so the increase is due to the higher number of bookings. The inner effect is -$7,500 while the mix effect is $45,000.

Here's a visual representation of this last interpretation:

<div>
<img src="https://github.com/user-attachments/assets/d93a8b33-929f-4895-87c8-1b60c8d3bb2f" alt="example" width="70%"/>
</div>
190 changes: 95 additions & 95 deletions docs/examples/simple-revenue-funnel.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
},
{
"cell_type": "code",
"execution_count": 29,
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2024-09-07T18:52:10.894160Z",
Expand All @@ -31,135 +31,135 @@
"text/html": [
"<style type=\"text/css\">\n",
"</style>\n",
"<table id=\"T_e33b1\">\n",
"<table id=\"T_a7b2c\">\n",
" <thead>\n",
" <tr>\n",
" <th class=\"blank level0\" >&nbsp;</th>\n",
" <th id=\"T_e33b1_level0_col0\" class=\"col_heading level0 col0\" >date</th>\n",
" <th id=\"T_e33b1_level0_col1\" class=\"col_heading level0 col1\" >group</th>\n",
" <th id=\"T_e33b1_level0_col2\" class=\"col_heading level0 col2\" >impressions</th>\n",
" <th id=\"T_e33b1_level0_col3\" class=\"col_heading level0 col3\" >clicks</th>\n",
" <th id=\"T_e33b1_level0_col4\" class=\"col_heading level0 col4\" >conversions</th>\n",
" <th id=\"T_e33b1_level0_col5\" class=\"col_heading level0 col5\" >revenue</th>\n",
" <th id=\"T_a7b2c_level0_col0\" class=\"col_heading level0 col0\" >date</th>\n",
" <th id=\"T_a7b2c_level0_col1\" class=\"col_heading level0 col1\" >group</th>\n",
" <th id=\"T_a7b2c_level0_col2\" class=\"col_heading level0 col2\" >impressions</th>\n",
" <th id=\"T_a7b2c_level0_col3\" class=\"col_heading level0 col3\" >clicks</th>\n",
" <th id=\"T_a7b2c_level0_col4\" class=\"col_heading level0 col4\" >conversions</th>\n",
" <th id=\"T_a7b2c_level0_col5\" class=\"col_heading level0 col5\" >revenue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
" <td id=\"T_e33b1_row0_col0\" class=\"data row0 col0\" >2018-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row0_col1\" class=\"data row0 col1\" >A</td>\n",
" <td id=\"T_e33b1_row0_col2\" class=\"data row0 col2\" >1000</td>\n",
" <td id=\"T_e33b1_row0_col3\" class=\"data row0 col3\" >150</td>\n",
" <td id=\"T_e33b1_row0_col4\" class=\"data row0 col4\" >120</td>\n",
" <td id=\"T_e33b1_row0_col5\" class=\"data row0 col5\" >$8,600.00</td>\n",
" <th id=\"T_a7b2c_level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
" <td id=\"T_a7b2c_row0_col0\" class=\"data row0 col0\" >2018-01-01</td>\n",
" <td id=\"T_a7b2c_row0_col1\" class=\"data row0 col1\" >A</td>\n",
" <td id=\"T_a7b2c_row0_col2\" class=\"data row0 col2\" >1000</td>\n",
" <td id=\"T_a7b2c_row0_col3\" class=\"data row0 col3\" >150</td>\n",
" <td id=\"T_a7b2c_row0_col4\" class=\"data row0 col4\" >120</td>\n",
" <td id=\"T_a7b2c_row0_col5\" class=\"data row0 col5\" >$8,600.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
" <td id=\"T_e33b1_row1_col0\" class=\"data row1 col0\" >2018-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row1_col1\" class=\"data row1 col1\" >B</td>\n",
" <td id=\"T_e33b1_row1_col2\" class=\"data row1 col2\" >2000</td>\n",
" <td id=\"T_e33b1_row1_col3\" class=\"data row1 col3\" >150</td>\n",
" <td id=\"T_e33b1_row1_col4\" class=\"data row1 col4\" >150</td>\n",
" <td id=\"T_e33b1_row1_col5\" class=\"data row1 col5\" >$9,400.00</td>\n",
" <th id=\"T_a7b2c_level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
" <td id=\"T_a7b2c_row1_col0\" class=\"data row1 col0\" >2018-01-01</td>\n",
" <td id=\"T_a7b2c_row1_col1\" class=\"data row1 col1\" >B</td>\n",
" <td id=\"T_a7b2c_row1_col2\" class=\"data row1 col2\" >2000</td>\n",
" <td id=\"T_a7b2c_row1_col3\" class=\"data row1 col3\" >150</td>\n",
" <td id=\"T_a7b2c_row1_col4\" class=\"data row1 col4\" >150</td>\n",
" <td id=\"T_a7b2c_row1_col5\" class=\"data row1 col5\" >$9,400.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
" <td id=\"T_e33b1_row2_col0\" class=\"data row2 col0\" >2018-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row2_col1\" class=\"data row2 col1\" >C</td>\n",
" <td id=\"T_e33b1_row2_col2\" class=\"data row2 col2\" >2500</td>\n",
" <td id=\"T_e33b1_row2_col3\" class=\"data row2 col3\" >250</td>\n",
" <td id=\"T_e33b1_row2_col4\" class=\"data row2 col4\" >125</td>\n",
" <td id=\"T_e33b1_row2_col5\" class=\"data row2 col5\" >$10,750.00</td>\n",
" <th id=\"T_a7b2c_level0_row2\" class=\"row_heading level0 row2\" >2</th>\n",
" <td id=\"T_a7b2c_row2_col0\" class=\"data row2 col0\" >2018-01-01</td>\n",
" <td id=\"T_a7b2c_row2_col1\" class=\"data row2 col1\" >C</td>\n",
" <td id=\"T_a7b2c_row2_col2\" class=\"data row2 col2\" >2500</td>\n",
" <td id=\"T_a7b2c_row2_col3\" class=\"data row2 col3\" >250</td>\n",
" <td id=\"T_a7b2c_row2_col4\" class=\"data row2 col4\" >125</td>\n",
" <td id=\"T_a7b2c_row2_col5\" class=\"data row2 col5\" >$10,750.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
" <td id=\"T_e33b1_row3_col0\" class=\"data row3 col0\" >2019-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row3_col1\" class=\"data row3 col1\" >A</td>\n",
" <td id=\"T_e33b1_row3_col2\" class=\"data row3 col2\" >1000</td>\n",
" <td id=\"T_e33b1_row3_col3\" class=\"data row3 col3\" >120</td>\n",
" <td id=\"T_e33b1_row3_col4\" class=\"data row3 col4\" >160</td>\n",
" <td id=\"T_e33b1_row3_col5\" class=\"data row3 col5\" >$9,055.00</td>\n",
" <th id=\"T_a7b2c_level0_row3\" class=\"row_heading level0 row3\" >3</th>\n",
" <td id=\"T_a7b2c_row3_col0\" class=\"data row3 col0\" >2019-01-01</td>\n",
" <td id=\"T_a7b2c_row3_col1\" class=\"data row3 col1\" >A</td>\n",
" <td id=\"T_a7b2c_row3_col2\" class=\"data row3 col2\" >1000</td>\n",
" <td id=\"T_a7b2c_row3_col3\" class=\"data row3 col3\" >120</td>\n",
" <td id=\"T_a7b2c_row3_col4\" class=\"data row3 col4\" >160</td>\n",
" <td id=\"T_a7b2c_row3_col5\" class=\"data row3 col5\" >$9,055.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
" <td id=\"T_e33b1_row4_col0\" class=\"data row4 col0\" >2019-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row4_col1\" class=\"data row4 col1\" >B</td>\n",
" <td id=\"T_e33b1_row4_col2\" class=\"data row4 col2\" >2150</td>\n",
" <td id=\"T_e33b1_row4_col3\" class=\"data row4 col3\" >200</td>\n",
" <td id=\"T_e33b1_row4_col4\" class=\"data row4 col4\" >145</td>\n",
" <td id=\"T_e33b1_row4_col5\" class=\"data row4 col5\" >$8,739.00</td>\n",
" <th id=\"T_a7b2c_level0_row4\" class=\"row_heading level0 row4\" >4</th>\n",
" <td id=\"T_a7b2c_row4_col0\" class=\"data row4 col0\" >2019-01-01</td>\n",
" <td id=\"T_a7b2c_row4_col1\" class=\"data row4 col1\" >B</td>\n",
" <td id=\"T_a7b2c_row4_col2\" class=\"data row4 col2\" >2150</td>\n",
" <td id=\"T_a7b2c_row4_col3\" class=\"data row4 col3\" >200</td>\n",
" <td id=\"T_a7b2c_row4_col4\" class=\"data row4 col4\" >145</td>\n",
" <td id=\"T_a7b2c_row4_col5\" class=\"data row4 col5\" >$8,739.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
" <td id=\"T_e33b1_row5_col0\" class=\"data row5 col0\" >2019-01-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row5_col1\" class=\"data row5 col1\" >C</td>\n",
" <td id=\"T_e33b1_row5_col2\" class=\"data row5 col2\" >2000</td>\n",
" <td id=\"T_e33b1_row5_col3\" class=\"data row5 col3\" >400</td>\n",
" <td id=\"T_e33b1_row5_col4\" class=\"data row5 col4\" >166</td>\n",
" <td id=\"T_e33b1_row5_col5\" class=\"data row5 col5\" >$10,147.00</td>\n",
" <th id=\"T_a7b2c_level0_row5\" class=\"row_heading level0 row5\" >5</th>\n",
" <td id=\"T_a7b2c_row5_col0\" class=\"data row5 col0\" >2019-01-01</td>\n",
" <td id=\"T_a7b2c_row5_col1\" class=\"data row5 col1\" >C</td>\n",
" <td id=\"T_a7b2c_row5_col2\" class=\"data row5 col2\" >2000</td>\n",
" <td id=\"T_a7b2c_row5_col3\" class=\"data row5 col3\" >400</td>\n",
" <td id=\"T_a7b2c_row5_col4\" class=\"data row5 col4\" >166</td>\n",
" <td id=\"T_a7b2c_row5_col5\" class=\"data row5 col5\" >$10,147.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
" <td id=\"T_e33b1_row6_col0\" class=\"data row6 col0\" >2018-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row6_col1\" class=\"data row6 col1\" >A</td>\n",
" <td id=\"T_e33b1_row6_col2\" class=\"data row6 col2\" >50</td>\n",
" <td id=\"T_e33b1_row6_col3\" class=\"data row6 col3\" >20</td>\n",
" <td id=\"T_e33b1_row6_col4\" class=\"data row6 col4\" >10</td>\n",
" <td id=\"T_e33b1_row6_col5\" class=\"data row6 col5\" >$500.00</td>\n",
" <th id=\"T_a7b2c_level0_row6\" class=\"row_heading level0 row6\" >6</th>\n",
" <td id=\"T_a7b2c_row6_col0\" class=\"data row6 col0\" >2018-02-01</td>\n",
" <td id=\"T_a7b2c_row6_col1\" class=\"data row6 col1\" >A</td>\n",
" <td id=\"T_a7b2c_row6_col2\" class=\"data row6 col2\" >50</td>\n",
" <td id=\"T_a7b2c_row6_col3\" class=\"data row6 col3\" >20</td>\n",
" <td id=\"T_a7b2c_row6_col4\" class=\"data row6 col4\" >10</td>\n",
" <td id=\"T_a7b2c_row6_col5\" class=\"data row6 col5\" >$500.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
" <td id=\"T_e33b1_row7_col0\" class=\"data row7 col0\" >2018-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row7_col1\" class=\"data row7 col1\" >B</td>\n",
" <td id=\"T_e33b1_row7_col2\" class=\"data row7 col2\" >2000</td>\n",
" <td id=\"T_e33b1_row7_col3\" class=\"data row7 col3\" >300</td>\n",
" <td id=\"T_e33b1_row7_col4\" class=\"data row7 col4\" >150</td>\n",
" <td id=\"T_e33b1_row7_col5\" class=\"data row7 col5\" >$11,400.00</td>\n",
" <th id=\"T_a7b2c_level0_row7\" class=\"row_heading level0 row7\" >7</th>\n",
" <td id=\"T_a7b2c_row7_col0\" class=\"data row7 col0\" >2018-02-01</td>\n",
" <td id=\"T_a7b2c_row7_col1\" class=\"data row7 col1\" >B</td>\n",
" <td id=\"T_a7b2c_row7_col2\" class=\"data row7 col2\" >2000</td>\n",
" <td id=\"T_a7b2c_row7_col3\" class=\"data row7 col3\" >300</td>\n",
" <td id=\"T_a7b2c_row7_col4\" class=\"data row7 col4\" >150</td>\n",
" <td id=\"T_a7b2c_row7_col5\" class=\"data row7 col5\" >$11,400.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
" <td id=\"T_e33b1_row8_col0\" class=\"data row8 col0\" >2018-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row8_col1\" class=\"data row8 col1\" >C</td>\n",
" <td id=\"T_e33b1_row8_col2\" class=\"data row8 col2\" >2500</td>\n",
" <td id=\"T_e33b1_row8_col3\" class=\"data row8 col3\" >250</td>\n",
" <td id=\"T_e33b1_row8_col4\" class=\"data row8 col4\" >125</td>\n",
" <td id=\"T_e33b1_row8_col5\" class=\"data row8 col5\" >$8,750.00</td>\n",
" <th id=\"T_a7b2c_level0_row8\" class=\"row_heading level0 row8\" >8</th>\n",
" <td id=\"T_a7b2c_row8_col0\" class=\"data row8 col0\" >2018-02-01</td>\n",
" <td id=\"T_a7b2c_row8_col1\" class=\"data row8 col1\" >C</td>\n",
" <td id=\"T_a7b2c_row8_col2\" class=\"data row8 col2\" >2500</td>\n",
" <td id=\"T_a7b2c_row8_col3\" class=\"data row8 col3\" >250</td>\n",
" <td id=\"T_a7b2c_row8_col4\" class=\"data row8 col4\" >125</td>\n",
" <td id=\"T_a7b2c_row8_col5\" class=\"data row8 col5\" >$8,750.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row9\" class=\"row_heading level0 row9\" >9</th>\n",
" <td id=\"T_e33b1_row9_col0\" class=\"data row9 col0\" >2019-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row9_col1\" class=\"data row9 col1\" >A</td>\n",
" <td id=\"T_e33b1_row9_col2\" class=\"data row9 col2\" >2500</td>\n",
" <td id=\"T_e33b1_row9_col3\" class=\"data row9 col3\" >1000</td>\n",
" <td id=\"T_e33b1_row9_col4\" class=\"data row9 col4\" >500</td>\n",
" <td id=\"T_e33b1_row9_col5\" class=\"data row9 col5\" >$50,000.00</td>\n",
" <th id=\"T_a7b2c_level0_row9\" class=\"row_heading level0 row9\" >9</th>\n",
" <td id=\"T_a7b2c_row9_col0\" class=\"data row9 col0\" >2019-02-01</td>\n",
" <td id=\"T_a7b2c_row9_col1\" class=\"data row9 col1\" >A</td>\n",
" <td id=\"T_a7b2c_row9_col2\" class=\"data row9 col2\" >2500</td>\n",
" <td id=\"T_a7b2c_row9_col3\" class=\"data row9 col3\" >1000</td>\n",
" <td id=\"T_a7b2c_row9_col4\" class=\"data row9 col4\" >500</td>\n",
" <td id=\"T_a7b2c_row9_col5\" class=\"data row9 col5\" >$50,000.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row10\" class=\"row_heading level0 row10\" >10</th>\n",
" <td id=\"T_e33b1_row10_col0\" class=\"data row10 col0\" >2019-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row10_col1\" class=\"data row10 col1\" >B</td>\n",
" <td id=\"T_e33b1_row10_col2\" class=\"data row10 col2\" >2150</td>\n",
" <td id=\"T_e33b1_row10_col3\" class=\"data row10 col3\" >323</td>\n",
" <td id=\"T_e33b1_row10_col4\" class=\"data row10 col4\" >145</td>\n",
" <td id=\"T_e33b1_row10_col5\" class=\"data row10 col5\" >$10,739.00</td>\n",
" <th id=\"T_a7b2c_level0_row10\" class=\"row_heading level0 row10\" >10</th>\n",
" <td id=\"T_a7b2c_row10_col0\" class=\"data row10 col0\" >2019-02-01</td>\n",
" <td id=\"T_a7b2c_row10_col1\" class=\"data row10 col1\" >B</td>\n",
" <td id=\"T_a7b2c_row10_col2\" class=\"data row10 col2\" >2150</td>\n",
" <td id=\"T_a7b2c_row10_col3\" class=\"data row10 col3\" >323</td>\n",
" <td id=\"T_a7b2c_row10_col4\" class=\"data row10 col4\" >145</td>\n",
" <td id=\"T_a7b2c_row10_col5\" class=\"data row10 col5\" >$10,739.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th id=\"T_e33b1_level0_row11\" class=\"row_heading level0 row11\" >11</th>\n",
" <td id=\"T_e33b1_row11_col0\" class=\"data row11 col0\" >2019-02-01 00:00:00</td>\n",
" <td id=\"T_e33b1_row11_col1\" class=\"data row11 col1\" >C</td>\n",
" <td id=\"T_e33b1_row11_col2\" class=\"data row11 col2\" >2000</td>\n",
" <td id=\"T_e33b1_row11_col3\" class=\"data row11 col3\" >320</td>\n",
" <td id=\"T_e33b1_row11_col4\" class=\"data row11 col4\" >166</td>\n",
" <td id=\"T_e33b1_row11_col5\" class=\"data row11 col5\" >$12,147.00</td>\n",
" <th id=\"T_a7b2c_level0_row11\" class=\"row_heading level0 row11\" >11</th>\n",
" <td id=\"T_a7b2c_row11_col0\" class=\"data row11 col0\" >2019-02-01</td>\n",
" <td id=\"T_a7b2c_row11_col1\" class=\"data row11 col1\" >C</td>\n",
" <td id=\"T_a7b2c_row11_col2\" class=\"data row11 col2\" >2000</td>\n",
" <td id=\"T_a7b2c_row11_col3\" class=\"data row11 col3\" >320</td>\n",
" <td id=\"T_a7b2c_row11_col4\" class=\"data row11 col4\" >166</td>\n",
" <td id=\"T_a7b2c_row11_col5\" class=\"data row11 col5\" >$12,147.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n"
],
"text/plain": [
"<pandas.io.formats.style.Styler at 0x16af291d0>"
"<pandas.io.formats.style.Styler at 0x12d757850>"
]
},
"execution_count": 29,
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
Expand All @@ -182,7 +182,7 @@
"})\n",
"traffic['date'] = pd.to_datetime(traffic['date'])\n",
"traffic['revenue'] = traffic['revenue'].str.replace('$', '', regex=False).str.replace(',', '', regex=False).astype(float)\n",
"traffic.style.format({'revenue': fmt_currency}, na_rep='N/A')"
"traffic.style.format({'revenue': fmt_currency, 'date': lambda x: x.strftime('%Y-%m-%d')}, na_rep='N/A')"
]
},
{
Expand Down
4 changes: 0 additions & 4 deletions docs/index.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@
"\n",
"If you're like me, then you're used to pesky stakeholders, who ask you why a metric changed. These kind of questions are tricky to answer confidently. It usually ends with you sharing a few other related metrics, giving some context, and providing a weak explanation. All the while hoping the stakeholder will be satisfied (or fed up) and go away 😮‍💨\n",
"\n",
"</br>\n",
"<div class=\"tenor-gif-embed\" data-postid=\"17635701\" data-share-method=\"host\" data-aspect-ratio=\"1.86047\" data-width=\"100%\"><a href=\"https://tenor.com/view/breaking-bad-gustavo-fring-giancarlo-esposito-explain-yourself-series-gif-17635701\"></a></div> <script type=\"text/javascript\" async src=\"https://tenor.com/embed.js\"></script>\n",
"</br>\n",
"\n",
"This isn't a good situation to be in. But what if you could tell *exactly* why a metric changed? Wouldn't that be great? 🤩\n",
"\n",
"`icanexplain` is a Python package. It provides a framework to break a metric down into drivers. It attributes the change in a metric to its drivers. Instead of just measuring the evolution of each driver, we can exactly quantify how much of the metric's evolution is due to each driver.\n",
Expand Down

0 comments on commit 82dd89a

Please sign in to comment.