Skip to content

Instantly share code, notes, and snippets.

@willglanville
Created September 25, 2018 15:08
Show Gist options
  • Save willglanville/9e9cfd4ccea3a93038920f2d470e95f1 to your computer and use it in GitHub Desktop.
Save willglanville/9e9cfd4ccea3a93038920f2d470e95f1 to your computer and use it in GitHub Desktop.
D3 curve explorer
license: gpl-3.0
height: 860
border: no
<!DOCTYPE html>
<meta charset="utf-8">
<head>
<title>D3 Curve Explorer</title>
</head>
<style>
body {
font-family: "Helvetica Neue", Helvetica, sans-serif;
font-size: 12px;
user-select: none;
}
svg {
box-shadow: 0px 0px 40px -5px rgba(0,0,0,0.3);
border-radius: 5px;
margin: 20px;
}
svg path {
fill: none;
}
svg circle {
fill: white;
stroke: #aaa;
cursor: move;
}
svg .points-menu g {
opacity: 0.2;
}
svg .points-menu g.active {
cursor: pointer;
opacity: 1;
}
svg .points-menu line {
stroke: #777;
stroke-width: 3;
}
svg .points-menu rect {
fill: white;
}
.sidebar {
display: inline-block;
position: relative;
vertical-align: top;
margin-top: 20px;
width: 530px;
color: #444;
}
.sidebar .header {
font-size: 14px;
font-weight: bold;
text-align: right;
color: #aaa;
width: 100%;
}
.menu .item {
padding: 5px;
border: 1px solid #ddd;
margin: 4px 2px;
float: left;
cursor: pointer;
border-radius: 8px;
width: 160px;
text-align: center;
}
.sidebar .info {
float: left;
margin-top: 20px;
line-height: 1.5em;
}
</style>
<body>
<svg width="700" height="400">
<g>
<path></path>
<g class="points-menu" transform="translate(660, 380)">
<g class="remove-point">
<rect x="-6" y="-6" width="12" height="12"></rect>
<line x1="-6" x2="6"></line>
</g>
<g class="add-point" transform="translate(20,0)">
<rect x="-6" y="-6" width="12" height="12"></rect>
<line x1="-6" x2="6"></line><line y1="-6" y2="6"></line>
</g>
</g>
</g>
</svg>
<div class="sidebar">
<div class="header">D3 CURVE EXPLORER</div>
<div class="menu"></div>
<div class="info">
<span class="default">The JavaScript library <a href="http://d3js.org">D3</a> provides a number of <a href="https://github.com/d3/d3-shape#curves">curve types</a> to interpolate (or approximate) a set of points. Toggle each of the curve types using the buttons above. You can also add/remove/drag the points to change the shape of the curve.</span>
<span class="text"></span>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.2/d3.min.js"></script>
<script>
var curveTypes = [
{name: 'curveLinear', curve: d3.curveLinear, active: true, lineString: '', clear: false, info: 'Interpolates the points using linear segments.'},
{name: 'curveBasis', curve: d3.curveBasis, active: true, lineString: '', clear: true, info: 'Interpolates the start and end points and approximates the inner points using a B-spline.'},
{name: 'curveBasisClosed', curve: d3.curveBasisClosed, active: false, lineString: '', clear: false, info: 'Uses a closed B-Spline to approximate the points.'},
{name: 'curveBundle (ß=0)', curve: d3.curveBundle.beta(0), active: false, lineString: '', clear: true, info: 'Same as curveBasis with the addition of a paramter ß which determines how close to a straight line the curve is. If ß=0 the curve is straight.'},
{name: 'curveBundle (ß=0.5)', curve: d3.curveBundle.beta(0.5), active: false, lineString: '', clear: false, info: 'Same as curveBasis with the addition of a paramter ß which determines how close to a straight line the curve is.'},
{name: 'curveBundle (ß=1)', curve: d3.curveBundle.beta(1), active: false, lineString: '', clear: false, info: 'Same as curveBasis with the addition of a paramter ß which determines how close to a straight line the curve is. If ß=1 the curve is the same as curveBasis.'},
{name: 'curveCardinal (tension=0)', curve: d3.curveCardinal.tension(0), active: false, lineString: '', clear: true, info: "Interpolates the points using a cubic B-spline. A tension parameter determines how 'taut' the curve is. As tension approaches 1 the segments become linear."},
{name: 'curveCardinal (tension=0.5)', curve: d3.curveCardinal.tension(0.5), active: false, lineString: '', clear: false, info: "Interpolates the points using a cubic B-spline. A tension parameter determines how 'taut' the curve is. As tension approaches 1 the segments become linear."},
{name: 'curveCardinal (tension=1)', curve: d3.curveCardinal.tension(1), active: false, lineString: '', clear: false, info: "Interpolates the points using a cubic B-spline. A tension parameter determines how 'taut' the curve is. As tension approaches 1 the segments become linear."},
{name: 'curveCatmullRom (α=0)', curve: d3.curveCatmullRom.alpha(0), active: false, lineString: '', clear: true, info: 'Similar to curveCardinal (tension=0) but with a parameter α that determines the parameterisation used to interpolate the points. If α=0 the parameterisation is uniform.'},
{name: 'curveCatmullRom (α=0.5)', curve: d3.curveCatmullRom.alpha(0.5), active: false, lineString: '', clear: false, info: 'Similar to curveCardinal (tension=0) but with a parameter α that determines the parameterisation used to interpolate the points. If α=0.5 the parameterisation is centripetal and self intersecting loops are avoided.'},
{name: 'curveCatmullRom (α=1)', curve: d3.curveCatmullRom.alpha(1), active: false, lineString: '', clear: false, info: 'Similar to curveCardinal (tension=0) but with a parameter α that determines the parameterisation used to interpolate the points. If α=1 the parameterisation is chordal.'},
{name: 'curveMonotoneX', curve: d3.curveMonotoneX, active: false, lineString: '', clear: true, info: 'Interpolates the points with a cubic spline which are monotonic (i.e. always increasing or always decreasing) in y.'},
{name: 'curveMonotoneY', curve: d3.curveMonotoneY, active: false, lineString: '', clear: false, info: 'Interpolates the points with a cubic spline which are monotonic (i.e. always increasing or always decreasing) in x.'},
{name: 'curveNatural', curve: d3.curveNatural, active: false, lineString: '', clear: true, info: 'Interpolates the points with a cubic spline with zero 2nd derivatives at the endpoints.'},
{name: 'curveStep', curve: d3.curveStep, active: false, lineString: '', clear: true, info: 'Interpolates the points with alternating horizontal and vertical linear segments. The vertical segments lie midway between points.'},
{name: 'curveStepAfter', curve: d3.curveStepAfter, active: false, lineString: '', clear: false, info: 'Interpolates the points with alternating horizontal and vertical linear segments. The y value changes after the x value.'},
{name: 'curveStepBefore', curve: d3.curveStepBefore, active: false, lineString: '', clear: false, info: 'Interpolates the points with alternating horizontal and vertical linear segments. The y value changes before the x value.'}
];
var lineGenerator = d3.line();
var categoryScale = d3.scaleOrdinal(d3.schemeCategory10);
function colorScale(d) {return d === 0 ? '#777' : categoryScale(d);}
var points = [ [50, 330], [75, 200], [280, 75], [300, 75], [475, 300], [600, 200] ];
var numActivePoints = points.length;
var drag = d3.drag()
.on('drag', function(d, i) {
points[i][0] = d3.event.x;
points[i][1] = d3.event.y;
update();
});
function updateInfo(info) {
d3.select('.info .default').style('display', info ? 'none' : 'inline');
d3.select('.info .text').text(info);
}
function updateMenu() {
var u = d3.select('.menu')
.selectAll('div.item')
.data(curveTypes);
u.enter()
.append('div')
.classed('item', true)
.style('clear', function(d) { return d.clear ? 'left' : 'none'; })
.text(function(d) { return d.name; })
.on('click', function(d) {
d.active = !d.active;
update();
})
.on('mouseover', function(d) { updateInfo(d.info); })
.on('mouseout', function() { updateInfo(''); })
.merge(u)
.style('background-color', function(d, i) { return d.active ? colorScale(i) : '#fff'; })
.style('color', function(d, i) { return d.active ? 'white' : '#444'; });
}
function updatePointsMenu() {
d3.select('.remove-point')
.classed('active', numActivePoints > 2)
.on('click', function() {
if(numActivePoints <= 2) return;
numActivePoints--;
update();
});
d3.select('.add-point')
.classed('active', numActivePoints < points.length)
.on('click', function() {
if(numActivePoints >= points.length) return;
numActivePoints++;
update();
});
}
function updateLines() {
curveTypes.forEach(function(d) {
if(!d.active) return;
lineGenerator.curve(d.curve);
d.lineString = lineGenerator(points.slice(0, numActivePoints));
});
var u = d3.select('svg g')
.selectAll('path')
.data(curveTypes);
u.enter()
.append('path')
.merge(u)
.style('stroke', function(d, i) { return colorScale(i); })
.attr('d', function(d) { return d.lineString; })
.style('display', function(d) { return d.active ? 'inline' : 'none'; });
}
function updatePoints() {
var u = d3.select('g')
.selectAll('circle')
.data(points.slice(0, numActivePoints));
u.enter()
.append('circle')
.attr('r', 4)
.call(drag)
.merge(u)
.attr('cx', function(d) { return d[0];})
.attr('cy', function(d) { return d[1];});
u.exit().remove();
}
function update() {
updateMenu();
updatePointsMenu();
updateLines();
updatePoints();
}
update();
</script>
</body>
</html>
�PNG

IHDR��T�bY IDATx���{|u����gvh+R����M�#b�V�R�fS� T�mffI=��i�Ά��GQ�� �bQȦ Pn�b�EQ.�E� �B����ZOOI�\v3����x�tf�;���w�3�'u�a��ou��D����Ը���L10EY8)�O(�@�EQB)��(�@L�F�9(���H -���r���O�@ ��R��(W���>���r��J]$�2�`�-EF
3@e*E��C9E�@)�a)
��Ơ�`4l�����@ ��Pf��ߑ� l�`�薎i��h�n/��^f�PJÝ��vJ0#�~E�`���ۆR����Pgp7�6��;�[���H�c)��P����R�0�.��-�C�`����ޑ����d65�[��s)��P���ơ��n������Z����g���������eR����;��?�|�`f~�Tz�Vr[�)�@�ZGZ~�6��<�l����e8���f_���TxK�w0�w��x���m�C)��-���yk���P
�h�_`�ֶ &+*�`g}�Vt[~)�@�$y�` �@et�ew83�[;7*��2�[ض�ϛn�96�|� v��d0���ͷv�w�?���2R� 2��߁��������r����gk�x0�w8�����<`���eFx㱛���a��F`$xSC}�wK%��%� ����lQݼ�n��vlJ/0�S��6�:�����m���n��U ���}�-��� T��� �0%�~Ƞ �Pf}{6|�� ���D�����&��v0��V��2�;�gz7��� 9)o��y}���o����� PF��r��J�_�%:'7���5�F�y�@���on�_�M��/ƫ-]�t} `� �o����n��ҿ~��֮�z���?(�R�iS[�Ճ �J��5� � �(hx��:�����0mi�؁���σ�`�F:��_nn@%������7����P�ʿ\q 4*�P��{� �ʵ
�F[z700^q ��H
�`����~~�0�mieg� Dl�x0���]���Ё>���J���@� 0*��f{Dd�xK��[;P��r-�$0��[����_~�PI��(�P� ��Ju �@K�3 �J2��`� "�_.ſJm���/8*I3�C��hL�P�E�������@L��*Ь �J��50��@ ��om����o�sM�u20
J1�/+0<\K������ �J��5�P� � J���n������U��JƵ2�r�-�/8�51�.���h`�@����)f�a8x���_���q= D�\3������@ĸP(���@T
0�"P�� �`@E�*P(���@T
0�"P�� �`@E�*P(���@T
0�"P�� �`@E�*P(���@T
0�"P�� �`@E�*P(���@T
0�"P�� �`@EHFFjٲe����f��$�U'�x�Mq�Cܦ�������Ϳ�*Qvn�ҥ����N�����S�L�$"�v���z{{�<��s�y���x���. ���~�o�%������f��Y;��S>�J2}����l���ۯY��ɋȇ���3�Ƥe˖ͮ����iY�h���ɪ���˖-��x�f��I}}}�6ަܟ)S�lw�w6����Y[��}�Þy��>���o�C=4KDx`�b@��-� �q�`cR"�X��O��eYDd�ڵ���.-_��W5c�lٲ�k׮����ӷ��x�%�U#� �h1 `�q]��իW��׿^������_�fM���w�P^_t�'���ۻf͚5��u<�3�ƌL&�s�-"r��-\�~��]]]�'�|��� u� �ɯ]����=��S���� �x���m0�x0�1����̬EU��v�m677�lܷlٲ�}}}�D޼5z�3����jժ�Tu����f�w��o���)
0�X�<�i�^Um�����;OU����3���}}c�)
0�XZ�`��D"�HDN�� �����οG{eMh���KD'��6"��+��Lh�GE����黇���v�%�S��y@Š1E;��&"��0�j�ĉM���/m~LjA����GE��"�!�� ���<��k% _�y=4K8"ۉ�;�dOq�@1��LV�� ����������lE.�k-�_0�P����������ڢ��7��|��S :��s����*�2�?Hh7%�moJ�ݭ�����#fǛȉbzQ(���su��g���R�bqu��������{�=
0S`��y^��|���r�%���p�ζ}���>'bۙ9���mw0��R�wʷ:v�N���u3Y�N���3�g2�L: å�bq��ŋ ��W(�@LQ�D����̬���jjiiyRD$�x����;]�N�߉&��sn,g���_ " E������~��c^�ұ��fT�� >Z�L�1� �@$�v�ED���At�����?.�8S�>d�?�
��=r�1όV�?������i�Φ��ұ��^��OA�0Z�c�)
0�Q�y���櫍�� 8GD���<Yľ��������\���j��1&�DLn,��.�o��hhh�P]]�JU�d�� �� �%
0S`�&��� ðEDvgakk�C5^�����J����\�o���o�7%S�^=Oՙ. 9�뜺{7?�uݙ��JUgF��b@�P����(�������ՋD�� �;_Q��?�"���U3;��mnlWT��;�bf���i]�9�m��u�y������Y������
0SN��o��ί��~PD�A��%r�����3E�;�\��q.�""]ٺ���k.��:����r��"�������`��P���au�̬�đ�4�F��4l-d�uơ��ԙ
�v���Q꾹�~��n0��\�5�|��`�)
0���?������q��������\=�i�n��U�G*�vt���weӧm����)U,W�a8���-ֳ����1EP2��!o��|�u�~�b��o�� &��;��~��J)�w�RL�V����?~8獍�3�L: å�bq��ŋ QfD� ��1���<�:9嵾��/��^z!��&{�m�Mo�WD��������gbx�^��߾q{kkk�̖$�ɥ�@?�0lg�yf��ɓ[T� Um�$<�����V��w����:c�����"�����'�h?����]׽DU���!�|�H0 �3����Sv�a��Tur�}�?c�~N�N6 ?���ʯ�H!������T75s�;6n���'"G��z��� f� I&�yw�-"2�~���ڏ��~&�w����G�/*5^G�������'� "��LU]��3���]Qg�f����4�u���M/ɤ�Zy��"�yU�nW��=�lqP�u&vж�w܃��^�}�t3����3���}}��� ��@�*�u��<ﯪ�O��<�Zy��H����T����
�<�w�&�8���j�l6{������� �t`���_kf-"2c��sM���c&��9η�[��-�|q�r�?2���A����<ϻ��V�r��(�F3�@L1 �_��7��Cݺ˺K��G�]g�X��O����KME_H��K6nK&��Tu~ccc:�l��`���G�j�:����v� �u�9&�� �è��5�^�rQy�+����H&�I�a��X,�\�xq!�|��a�)f���H&���󼟩��V��Z>8k�V?�z_�����
�'�&���oimmْ͛d2�4�l�� @|�?+ Ç���L�x�I{ǎ�Q�A����=浨�e�MX7WDO��&�\.�jf�x���a��[��
�y�!"�򂼭z���V���~�;������ô��ڵ�/��i�
��544L���^��K6� _��)
0P�,X0)�H,�So������P/&�)���u��ƻ��V������]ם���Tuf6��+�|���1�-�@��}��d2���d�w_�����M~�)�4�oyus�W�U�KRn~v.�[����liCCÄ��Tf��
���8CU[���S��^Y'U�D��̽&�l����<YŖ��|��u��6< �K�F� P2�1E*��y-�8�X)�����x��,,dӋ��U�j���T O+:�G?�z����`f+r�\k��%Ab�[��q����<�{�~�����!�=%;<�$�j)�������L�K�U�RD$�L�S�����騳�g��Pcc�ގ�<'o���K�� -���}|E���R~�/%�7
��32�L: å�bq��ŋ Qg�3�@L1 �3��-N�[�ݻ� �k�붗u�3)��S��^T�������ښ7�%�driԹ�+f��q"��� ð����}��;Csnt��c��t�ٰe����4�nնB����.�g� h�:`ؘb� �q S�����o����{�U�� 5�<��{]��08��k�/N�V�z�����z��.�f�F� 0,` �(����|U]t��ww�v>�����sQ����x�*�+G��'��mTu����f�wE� 0d` �(������f���Z}��9�O���� ��y,�l�Z��˦�U�G~�n�7��===�����G� 0$` ��Q0x��ϟ\]]��ms­��G^ҷm'f^!��2�l����)??�7�K�A�h������@DN�:�x� 00Fx�w����Y���!��A1�A!H7E� �����XUWP���n0��\�5�\�Ac�)
0s��df-���q��+oH�s��B[���Ά�I��k̑5�K�y^�X\�ἶ��|Թ�Bb� ��O�ӪGy�EUϸY\�O�<SE����QgC�M�ֲT���*��N
oy�q���bq��ŋ Qgl�)'����S}�ч֩3.�Þ����d��j_�o�xl��/q��d/O�ْd2�4�\c3�@�x�w��,zͶ��I|�U�P��]�ܫ�Άh�x�j��0��OI�̈�3A4D� 0 f���b� �u�#"��Y�*v�̚�t�=� �?已u����IȯW��6��Q��u.���` b����������ܶ(�mE�+�;�Ά�H�9utߓ�[[Tu����f�wE� �/f�����}���ZDd�M�����>oj~wP��:���TC{�3�m�������Y�����x
0S� D���F3{��v^w���Ӻ�N"r��cۉ�����QDVTUU�(�0 �"�u�V�y�S?����yUm����$�lvo\��ㄷ������/�ي\.�u.��� 0S``d2���0l�����W�vL��hUOo�#�;���alI�WD̹v�<��򷟅a8���-u.��Q����e���Yf֢��_f�h(�LlAwP�˨�a��;O3��Ͷ{������L&g�����
0[ɨ��y��H�����}����|��soo1|�����E�c[W���5ng�&���O��%�bq��|4�\q� 0Pb ,��H$�ȩ"�t����~ZE���/�:Ɨ/���}ZVN�g� h�:�` �X(!��OK&��Yu�3�+��a����F��_�Cw�����q��9���ӣ�W�%���8CU[Tu��6�����M���̽<�|�vkꘚ(��]��_�ֿ6���l6{WԹ��1 �!��ZD�f��R���*�=QY��u�|48���2���!br� },�O�������޾>�\P�(�@L�0L��df-fvGoo�WV}���ZCW�������)����+�Z�)/]�}�+KE䔨s� 3��566��8N���-" /��^�P�U��Pu~w6�b�Q�j��Lhv�gde�����r�Qg�
� 0S,� ��yg;�����.�#>d�W��⮠� �_D�+[��<p�|�eU���ؘ�:@\0 B&���a��<�a��#w�0\b&ǜ�]mu��:#����;�+/-k>�L&g������` �x@CC�����Ea��M�l��Z�3c�-4��ݹ������I|��p��w��}���R�hԙ��-����;����AY�>�������br���P~_�h��l�}�{X��d�<�=�LQ�h`3���au�̬����ޔ��5���6ve�(3j܎O�����/o��s�l�¨3@�h �(����͓׭[��8�q"�0���<u��wI�6?P�]��?����:'0T)/��ʊ_8A���pV.�[u&�(�@Lq 4 "�睱~���T��X,��f^�/���m�FT�ޕKA��XU���j�k���U����� Qg��`��������HU��hkk�]�4��#�p���ҝM�uN`�
A��S~gG^�@]��"rJԙF�@�"577W�[�n����au�����]u���jh�4q���|rO�Y�R��]�[��]}�>>�=a��s�\kԙ`��h �(��8��""-"r��8M���ϊ�ԺS��¯w���*ڔ@y���' Õ���mk§Nmkk�G� �!
0S`T ���E"2�̚r���""{x5}��H,LHU��
��y,ڤ@y�����-G�__�-�ʌ���Bԙ`��1�"X���7��=�zG37��Z���D� W��9�_T��[�+͑O�����)N�4�<�%�϶�����e��u��;�ߊH��~"��.߸���X"�g���s���0&0�^�풿������2��O����n�:�#������~0������Vw���v��o�W��9Ü�<U}�g[;kms�����ÿ:��������od�� ����@1EƸ��~�����9�l�y�}5~�L59OE���ϋ*#'�v�]���<w�=0+�˭�:�` �(�7\�=ZU[D�IY����y��ԴI?����l��Ȃ1t���{w��N��[M{{�����Gb*u`�2���a����"��%���tβ�~"bw��AѤ�������>����vy�yʁU�1���V���K{��>��ߔ�?�B�MT~X�gE�����=�Wu�C
����x?�,�<��-��ug����sS6���������g&r`B��ǂ�5�$ƖC3��6|����'�}]�WE��(n�b��1e�����"9U޼���͏���P������\�WG?%0����oyBv�wח>~c����c�)n�Ƙ���i�d�A3�~�7�������j��T~J������y����+��,�9�<��"X�������bf�U���\������;�o"G:�XPϫ\�X�q�G���=k��"Ru�R�#�<�k�o��� ��w����t��3{�j�3�?�c�c�����κ���'��]�����?u���`Ē��'�Y�����ӳ��������u�o.G��l]�(��=�ugަ�z�&����I�D���b��Xill��q���q������[:6�u,ѯ�꼮lݵ��(��~�F9�{��s��m�:�` �(�� ����ysu�s�t�n �OH�[� IDATTO�PE��k��O��<1z)��t��h�-r�����we�~u�9
0S`D��:Y$"�a������M�}����{�����F/%�����[��3BIW�\u�1
0S,���455M-��D�PUm�f�W t|��8U��.2��u鷼 @yMM�r�!���.�/���wg�wG� `(�F$\ם���D��A4m������b���i���o�����ؘ~ԙrɟe�U��G���3@ 1 �����#ͬ��^2�����{:~Js�����s��;�N[�\��he�?�u3k�=O��>�;�>���~]ԙ f(�@LQ�1*���'�[���q��Dda6���":Ӽk��R����X��,J��y�ŷ��}����B�NG�b� Ĕu��睱~���T��X,�;��[�v|2��j��/?===_:��V���6����E�y�`�����Y��T�a�������|����M����s�+��0��;SUW�N>t�Ru�X�� 0S`�\sss��u���Vw��`?�r;�7�}E��c��
�� `�|�?�(��[;�U���-�:��)
0J��SD�ED�w�������|����愿6�ǻ��˛@)y���/۶v��������(�L1
0S`���y��"�jfM�\���~�6�9�B�����;W���P.��ݰVv�˭r���lA!Wqԙ B` �X #��~��ܣ�wA0s(��ϟd��TGQ~��+�LΛ"/����.�\���uQg�3�6�u�W�E"�fó�]C�|���`f�hxj!;��2�0Jӎ�,�љ�?n�c�������s@�b��!�}�v���36�������r��ʑ��>�h[��e� ��fT��K� E���8}4��KԹ`�Q����cH|�o4�U='��6g���q��l�3A>���~]�3���y��3�����R-ݕ�Đ��1� �T2�\�=ZU[��Iy_6���cLi�ةj�\����ʥO-CL1�������U����D=_�j��̕{�����*3�Ђ vI$�D�hi
����S�Y�n��2�]!�����;���T�Uf6�2=��D��n´��o>�'�l0
�b�U��E�H$4��^|��}�[~�y�Gh�(b?���!�˭V�y�z� =7�#"~u�c��:�l��-ug���nX����U�.?�4�BE>��/-aLc��y�f�k.�;%�v����w铣�e� 0S`�ۂ &%�9E޼�����W�v~�Ԗ��'�su�~70�����lE.�kMy��XOw��bԹ��(�@Lq 4DD���Ӓ��fV��o�3���w6�Zshz��l�dr���ollL��SEd����QԹ@�a��566�P�U���v�G:f���G��bh'>�;~�Hccc�q���drfKKK���������K/�:�3�@L1\�<�kq�6�>�CKQ~S^�MU?����)�6jkk˛ْb��TD$�y�x�����*3�����̬EDn���Y����d)�M��������>���ǼV�1�/��],"�Aа[��;&�'\k�\]�(��f����W���ƽ�i���ijmm]^��S^�&�cw�>�Tc&TWW�R�%�l����׾K¾kE�ׅl][���D(�@LQ�+��yg�H�����9�;��/-�ϔr\��3Uu�����r�k�kj͊ך�y�A����%@b�<�y�W'"�D��0 ����J�\n��_��뺂�/�r\����������Y���맹W�J�Ui�
��E�F� �x�jjj�Z,�ȡVw����Hy���� A�K����y^�����N����{�>�FT�[��]u>
0S�q�u����HD�AS9�Q�u^-fOu��_.��*��y7�ي\.�*"��O,�FU��l�ϣ��Db�� �#���y��"rt������*OR~�T2�����3�LZD���sO��z���/�٨����q���y�u�Z�9NDf�ٲ͚����B�����W�u����1�8��d29���� "��t,}�\4�Z!�{I�`��b��1��3֯_������}�Y~S^�J3{�� ������f��X,.ݸ��Z��Ջ:����?e>0~0<F������H���j�;�y�Z/���R���y���E� 6n��u�u��󺃹�G��` �(�1�lٲ�}}}�DD�ĪO<������_��EfvƆ՝\�<)/�+�B��\���r544L���^ef���r�� ��;�4s����l��+�c�@� ��)
p�,]�t��v�)_UU5}ʔ)�DD֮]�Zoo��{.����ݰ�����4���>[�L)��|Uݾ+H�\�s���[V�٬\.�z�����-*yS9� l��a޼y�D���Q������UW]uK*�:d����M��w�}�����5k�<jfM�\����S�w|�L�,��h�DD|�?�������joo_�q��3�����u��_eF j[�fX�fM�P(�q�q�}8�l
0[,�˖-�]UU5}���������M���o�4s�Lo��o�˷��{�M�t�h�6�f��Ȋ�����n���߬aXg����>%�x@��f�>}z���j��e�fG� �}}}�6��ԟ�v�-���r����&}������8'l*�U��u�̦ۻ���bbsD����:>U> J[�f�2eʤѺf����������c2/!vBW�엢��r%��y�:?�����0����Ԝ9*zn�ͳ2=4
pL$�Uk׮}mK�׮]�Z"�XU� )7���j"��G���r� �������0 �655�6�ו��GS���|7��ϊ*#�8\3�XE��O<����5k֬y�-�k֬)����)� R^��Ԭ�S������u������-)�K7�םM�&�XQ�f���������U�:�<����w�[���5�e�#_i�H$޿�n�M���x�A�M�Y�-f�����_��0��],"�A𖢻��^ s~/��)��-�F�Q�Ͼ�-�,��|���q"�A�-V�b�C���AUU��v�e����R�#�oJ>��[M��\:(�y`$&TWW�2���r������15Y�ߙ��� �EF��>�^رVw�S#�,Z���7W�޸�U��0$` �(�1�y�y"�s�}�Z/��<Sȥ�������}� 3[mf�r������6�n�������ו��F�r����7��]ﴗN�6��Q��VQ�����R��zo�ϓr;r�ʶ�_cA6��KU�� 6�������M�t��L���E�(�cݟ5û�e�{�OoO����ǐ��OU�)�9j��W�q���}����R�f��Ȋ�����-"rs��bWP7WU�R^~���wW0&��컏��m��n]|n����x�-�1��d� �� �,�9vo��cN�Y�8�CY��X�y� f�"�˵n阔���������IO����h�F���}1�p 4S��L�3D�l�?����:��s � �_cU2�����3�LzK�r鯉ڝ���+v��k4�#1���/��#�L��c�_(-
p�����V���.R�r�+�u(����B���0\��Ԕ��q�lz���� �k3��F3#0Toy�����R�nj��m���<3)t��r�����-ofK��b��oT�'�߶0��&ӹ�c J<� ��3�:#�L����ί9*���}��c@T6<���y�םK�BB����oRn~�(����ݲ��yv�-�����8F\��MD�����R�;��<B���z���h�q����K"r���B[�rQ=RT���o�x��x�F8FT�����ռ�����"����I���c@������~`�ugtlw6}wќ٢rl������l��} �)��=��~&"W��KJ9.�I6��kc nhh�0бO��<Q�P�a�9�u�n���<(5����P�cDUg�aX���� T�� A��Tc@\e�� EdEUUՀ�b��H��]A�S"�X�z�{d:�)B@�C�/o�]��3-<� ��/%�~�_���0�J)��� �U��u��`�/�o������?��r�Ce;�����d���"����:T"
pLd2�w��N�\����u@��ա؏E��O��?\�x0f��y�:?�� �G]ٹ�b�U5����8���PyN�,��~�{%Q�B��*�� ����}}}3D�$������?"zs![q)���d��Ņ0 �a����)5��r�+%L��̯�;�)wFT����5�5��c���Z�=u�'�O^u&�d��pg���3�qj��ϋ��BP���������-ofK���֟ޠ�v�M�0���Z/Ym�Mۖ3#ƿ�K�zT����셶ۂ/u86J���ou�T�a(�Q�\0V�r�Vy����~�;�~����E���W����<��1���/~�e�td�>]ws�K~�yo�����Q�K��E�����+K
Ʋ���/��Q����纃t��^�'vg����e��qh�w�q��x5)}�{�Oocp�5Qg�/
p lxg�>�sΰ p�����l_��0�i����7��uݙC�l!�����8�����v�2b�8����<&;�~Wy�۳�? �<�������n;����W�k������q!��޵�o��A��կ(&ƒU�����͔掉�ʉ���%�^�m�|�Vg�u@�(�1����>A�\kz,�_S�X0nd�� EdEUUՠ��艖�'���cD䩪u�j��1��d�o��5��]��$yc��Κ:r__u&��Q�c@Ug�ٰ
p�������;�ϕ:�'A4��.��f���B���8���Y���,u>�=x�mM��+���wk��)�km}(�L��Q��aX+@Ou����B �r���X,�S���L&=���� Me��|�������06�������Ή�����/�=�Ȩ3�3&L�0���0���g��U�P0�,^����0 �655��3Fw6}waŸR'������A�Ή��q;>i�7��g�{d��_�<��
p�g��C����򹔛?AD����*O2�����f��X,�y�kn A�L��c�5^���W�����$�=�<�5]
�����Qg 8b�Dbx����cjg�!�{�\�UD��<�}$�t�������d���l���K1�{c��=�����>y����� ޓ�f�u.��Q�#ffC~����WTVw����]OOϗD�(�u�d�'���tuV�������g����M:��yd�!�����E�E� 0|����
p���o����v9s�x��޾~���]��
A��=MM�_��y^m�Mۖ"'���\sp���1�^=�^�� מ��Q�� 8bf�>U�g�ǫJ�Z����ʙ *A6��kc nhh�0���ιn��|��m�k��z�Ǖ"'FW�˷H_q�{�Nj��=���=�x���6���M��~�o��T���y�Lf�0 � �`��_�uԫh��(w6�$�絛ٮ�\�R�Y�-�W �U����}48��R������*��H�C�{��M߸/�͞u.�I����/����_��ϛ�o�A`8Ba��A�����1��2F��A����n�Tcvs:�M�t���֧=��:>_��QZ�WOK��_�*�=��B�x�$y�
�/�?�h�o�+@�܎���?���+ʜ *R�X����3�L�Tc��<�X��T OQѳj���k����'FR^�BI�?L��O�� g�?� ���<� �8B�]z��$*�v���h��J�x��B���0\��Ԕ*��]��� A�Cjv���生���q�_Hy��E����w��r79NU�y_�(�R��dr�x�d�IM�X�~�h��J��֖7�%�bqi9�/��ۜ�����G���l9΃-K5v�Iy���������������. ��p�� ��`E�����UUU�� x�@����=���d�X�H��V>�d��],"�A�P�s��_�1ǜ��z ������R�sAd��yD(�JJB�r�766�ǹHDnyF��S�G���j�`����2"v�FOOOϗD�(�u���g�^W҇�:��:�H��_�x��|p��4.?4�嗅b�j��MX��_�y��q.�y_�,�� ���?�=��g�9�� ��޾~���]םY�s�ur�Z�_�xG���8���i�<g%��;�Ly��S'����\�{ve�~""������P�(�Q�aX�OD�O���~�b6�f�wm,� �}��l]��ޛ��qLy�P��nw7?���_g���u� �Gw�������{y��R��}�RQ��3� �4��3�`!�^<���+��^("+���ʲ(�準|�B�nJ�U���:I8��;ϫ�,�h�,K��y)/�'G����_������y�766���N����@�b�d2�w�a�h�o阔�ѡ"�]����f6�[y�w�����r��yީ�+�Qe����}]D�wD�{,��u43�ٞMؽ���%=C��>�i��~���y��@D�0 ��-�%,��T2�����o���?�Q1٫+HS~ ���d2�:������u�
ԓ�'</"�8�O-����Y��Oj��s"zQ�ĉ���yvq���Iʻ��"������l��L��9���c}�?�����/�<@�c8����v�`~�S^�r �+ m��v6@�6�2gi2�����R�*G�͟ ������%��K �o�*�h���<0!��"�iy^T~ٻ��|ms�����}/3�HU��gD�` ������W���ƽ�(��Z�/�K[[[�u�%�bq��|4��\�J�rϦ���[L|F��-��w�eb��B��#�l�6���ԋ8lj��bzEh���su�s���HD�l6�+��� p<��k��mkk{�m�)���,quw0��(��y��"�L Qg٨���� "z���]D:-�k����u�7��u���u�&m������G��XI�H��\]� n���}�1Ee ���_��z�}�7�w�����"`�6�w|��}?�ˍ���CQ�]{�j���X1����p,�9L$n�n�s{��6U���Nq�f�9��a��!��TnP黮�=����_�G��)
�(�<�Y�����z��C o����A�����Af���f�r��Q�ْ}ݫ�{C�#&·E�py���2ӻL잤�G'�u�47�e �|S��������{T��"�>1�^TW������_Z{��?�r�P��y_��)
�(s]�,U����n�9'�C!H�3�l���}�t3����3���}}�yc���6aݫ�D�"�>U}���'*��áɣ�jwh��=&��Z_�KE^y��o���O���`']����0����I�8�ΎN_�΢ή"6�Dv��CL���C"��E�~3�/�Ƚ���=4ҿӆ��.� ��E\P���b�Q��3��-����Yʏ���l6{��yVUU-�S��3�6�~UDVl������gv��Nh{�ȴ�,�:ή�;�&&�.�]�O'�ס&�� _��ۻ� I�:O࿬���qWa} ���p�TT�U�;X�az�ݻؗ&����cp� �f�Λ��ۻ�Cet���\z��\%p5B�ЖS�Al����|��Ʀ�������|"22+3+�WMԐ�z�'3�D��"���,���,;TJ�(�G#�K�l�5E��G���v�2� @�������{#⺑��g����7����L��캞<���'
,�& |6�t����΢ki����\�s��I�} Z� `�/N 0t(-�+oӓO>����l����f�`��������whh���;w��V�Y���텙����\Zd-�>�� �&7�pæ���?�����!�w��ss1U��w�>��y"�Ci�IDAT_��{o����g-�{��"�67�`)�T.�e��y��_�"���#����X�]�vݑR�iff����V �Y�T�H���fW,���RJ��,{� �R�E��RPI������]�Z388���xk�e��ͮXc�WP�e��<�}��o |�uy��>��J�3X����=餓�������j ^&�}h5-�+(�ta�\~�8��#�#�@ �ٳ�H�e}Y���������Y͌���244�8�s���#"�����E�LϤ�*�2Zixx����}��uE׳� @��+$��M����#�)����+Xm0<<�ሸ�R���$�}h'x�\���Y��gY��" �}FFF�gYvN�Pѵ����/�BD���ȥ����/�&�x�,��K?uID����w\m433ӗe�uCCCW]K'3���"��,�6MOO="b6�^�E���k��v��}0��<���x��]O'2���$��믿�E���8��,�
�]`׮]w��n���1����4xT*�M�����m��F�����`������]K'0����+`���T�z�����XYSSS�F��������H��P$xdY�)���O�����7�M�ZtM��={��>p�������P4xel�����̺�%"n{h��ZtA�������C�����]�J2��N �����Yq�Ν;��"]�E�+�&�3<<�ሸ�R�t�M������m6;;�)"�~� ����ⲇ.zZ�r###۳,;�����Z��x_:��f�RiSD|-J���Ǣ�w��(���L_�e� ]Qt-�`�/�Hn��;@瑽-��X���v��}0��<���_t=�d�/�����������,K�=8�/.�Ѣ��S�ڵ�����"█����Y�������>���\Zt=PM p���8%"^����$��-�,]�etttgD<600���Z��x_V���8�M��R�+��(�:���Ե�������kY
�}X-�6J)m:=�LWL�K05�ٳ�������_Ut=�0���$kr]Vcy�T�1��mQ�o``��_���߉����k�.������������ڼgϞ#E�S��x�,���~Ź�טR�y�5��VK���6�0;��"��]�oxx��qw�R�[t-�� �j%�צ#餋�RY�!###۳,;�����Zj1���Ln�n�a�?����&�������cff�/˲놆�:j����vp����M㬧�Hw] ���ݻ�yޗ�������gpp�e_���txx��E�K!�IJi�cq�iy
���ڵ뎔�M)�[���x_��M�F�#q҆�G����ZX�FGGwF�c{�8���5p��8�~a)��E���655umD�����o%�k�/k�������+�/�����;8|客�`u�$�toJi����m>�����y0t(-�m033s�c�(��wE���7<<|_�e}Y�ݲ}��u�:���up��|�랎����+��+=�cxx��qw�R�ێ�� @7������W�S�]k�����,�����j�q���[�]�Z��l��#�_]k���L_OOϽCCC��ܹsYau~�oD<022ri�J����Ů���=��t4*�(�֞ݻw��/�󽃃��/�8��Ѝ�{�r֥Oĩ��F��E��ڴk׮;RJ7��nY�����[ �-�X:�����#E���6::�3"���������bOe�.>9��Zt�}�֭�;r�Ƚ���}���u�m�/DdM��j,/�J5��ӣ-��#�j�βl�����`ѵ�� ^�R�7��y����ggg7GD���[�l�'��x�R������VĹ�טR�y�5���Z4@n�������n�I)�ӿ3��_]���}�}�+_9z�gΜ{��#"&''OOOO�w�}wMOO_����� +F�� t }#ao9�=�����s��o;���mܸ�{{lܸ�􉉉�>��S�����v����"k�N�&X-t4N��S������{���_V�T6. ��6n�X:�3�%�\�"j�N#���qҦu��}E�@����ݼaÆ��m߰a�3��� �-t8ֽ�t��*�$���n���~���s�]cE�@�(��&''/�}rr�p�\>��5@��[�g&���8���Ö-[��������61113===1�8$�v��"�Qz��8�X��C�]wLNNn�<���m@�-s,*����������������x����e���w7G����Mn�#q� �͞�t�uн��� ��[�׷�̟��)/����] �� V �����i���={�)�j�[ K��Sb�Ѣ�`qp K=����Wt,Nn�����ӟ/�'��S�d��[t,N^���p�啘�����/�'/�t����q��E�@}�2�*�ZS]� ��t$����_,������9gV���E�@}�2��l���s�]�] � ��p4/_qj:�D�upb�2LG���J��+�NL^�#q�+ONS�������x�9'g��������n~�T��?5�λ������X){��q��E�@cz�.`��J�KO�c?(�#7i||������_zt�5O����.��dM��j,/�J5��ӣ-�}E�ݻ����>��J��qÆ ��=��?zzvf�+������E�@G87"�S�1����r�Z�hn��g�}�y���7>�7�p��S&&&^wD�닫�q����_V�T6. ��6n��S�T6���_VDm4Fn����� 6�_l�� ����n^ɚh� @W�P.�LNN^l�����r�|`%k�9p�l�r��������L���������-[��SDm4�]�t�С+"���ɍ��'''OOOO�m��yp����/���U�\>���*� J����C @W��
0]A�+�t�� �`�� @W��
0]A�+�t�� �`�� @W��
0]A�+�t�� �`�� @W��
0]A�+�t�� �`�� @W��
��M����52l)��ח�s= ����8UM������StPKJ���eYv��]���]w���sODD\v�e��7���x_m��@�kw �_��v���C�#��@m���@�
���ȍ���ĵ1t��N�5����@]���g[z����Y�~��g-Wo_�Z7�jdh�V�K���Z��oxU˃>>�`K�� �V�r�@7ҍ�D�`�Y�5��dX�Zn뭫5��J5�K ���pֶ�|�3M��7��Mu{%�y��z ��?�L��K_��x�_�����,�1H�DD�`J ����]��/$,��#W߅8�����pֶU����/�nu^,�
��ju���_�������t�z���������1H��mp�;�I���Z�ʮ�a�-57���`�Q�������Q�q� �\=��eW ����1�K�[oX�Vu����/]���u��}]Ch47��]lp���`��7��nЮ��Ŗ�\�kF��������{3���ǟ�"g�K @w���::D38E�fU�_��j���l���z��u �Ŗ��0�.l퍪uQc�U���\�m�k`�\���/W��t��>����o` �1Xh�Y3]���l���U�#�w������s#�
�kV�r�TO�_��m:'m�k]���Z�y&��Ti�9��T�~ ��^(P#����ܜ�X��/���Н7pnX-*Q;G��N�eh�V����"��z�έ+�]9"N�_ ��j-��4�\ޥ�� ċ�����9j���D4��Zk^����z�����JP�jU^�����Z�Fk�;�(\.'7��޼��eZ�s�>���z�Ij�\���3�^���\=ov�ּ���[N p�m��]o]�y��z��>���ˍ��z�j��-׫X�f�b���+t�u͆�F��H�t�f[�k�k&�6r,�°B� �+��V�PO��"j&�
���Z�kmk��v)-�Ki���ˉB�r�E�Z�����'C,%.7/\nf{���iu],�.% �;^3����\����m;Q=�������G�k������`h���f�7���6Z,����F�R^7Z��e�w)cn��O�?4���V]�
��V�V��Z������hunf]3ہXN 𼥎�meWf�`Ь���f�/u 2��j9]������ �˽��� +����c-�+�� �JXN��FC�� +�Ձ���"0��\�-�����/�]����{hD�����-�� ٮ� @�`_�+4���%h��W�:D�R�`-x�CFa��:\���N�jvaZ��s�� @gla +]�$+�:í���g�R錔R�_�eٓ333��\s�C������^D\�Rz�R���UW]�x���߿��y��'"^1w�o����p�UW�x�xeY�/SJ?�ַ��sǎ����SJ�)�?�l����j�;�c)�D�?���K)�R�t�֭[����G�k#�H��w���-)�c�����S�ު:k��R�|vzz��,˦�,{r�֭���۷�O�<?7˲<"�"���j�͏��n���������xb�ߥڎ;J\p��"�5������Ϝ�����]��D��T*ݖR�FJ�=Y�M���۶m�h�:�H0����x�"�������������"�{���S�e�~�֭��֛����SD�XcSʲ�[�n�e߾}�N)��8��ްm۶�GD�߿�7�<���rJ�o���>A�O�J���<�dD�#�+����,��q~D�fY��)��X�8�R�i۶m��[P�b���,��0"�;��۶m�о}��J)���6y��ᗮ_���:�cooo�ccc���ߎ������ާ�wܷoߛSJ�G�I5�������i���޶mۿj`�����-��]��[qaoo��b���V*�:��s���QD�d������������x�MqoD�<"��Ҟ�}�cgUt�s>���8ߞ{���nID, J�� ��Ӈ#b��s~��Z�������u��y>ν��ccc�GD|��=?"^8��@D�t�92���'�,���<Uu�z�#Y�]1��,����NK)��l�R� ���_��|�?���[_�G׭[�+��cccϯ
�ߌ�����q��}��Ͻ������� j�flllS�q�������� ˲wW� E�)�:�}�����8�6"�."�GĶ�����<�_�e��n���-�����ߌ���hǎ��x����,�^�u��/F�r�eٮ�(�����,�~��Z�������s]p��DĹqjD�7D��)�ވ�P�\�6"*s����eh��xk叚8w���۷��ҟD��;����)�ѫ���{s�_����8��/��շ/ا����,��)���wlݺ��#�i��QD��R��������3�9/�Jo��������[�$˲���xn�=�Al��8�c��gٶm��__.��=y�/ֺ ���B�����v�IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment