From 4f6ea7e0816596d1bcadad834d77be8b92db8077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:27:50 -0500 Subject: [PATCH 01/23] introduce axis breaks attributes ... including potential future attributes `gap` and `gapmode` --- src/plots/cartesian/layout_attributes.js | 129 +++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 4e2e3697e71..160bc62acbb 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -248,6 +248,135 @@ module.exports = { 'Moreover, note that matching axes must have the same `type`.' ].join(' ') }, + + breaks: templatedArray('break', { + enabled: { + valType: 'boolean', + role: 'info', + dflt: true, + editType: 'calc', + description: [ + 'Determines whether this axis break is enabled or disabled.' + ].join(' ') + }, + + bounds: { + valType: 'info_array', + role: 'info', + items: [ + {valType: 'any', editType: 'calc'}, + {valType: 'any', editType: 'calc'} + ], + editType: 'calc', + description: [ + 'Sets the lower and upper bounds of this axis break.', + 'Can be used with `operation` to determine the behavior at the bounds.', + 'On *date* axes, it can be used `pattern`.' + ].join(' ') + }, + + pattern: { + valType: 'enumerated', + // TODO could add '%H:%M:%S' + values: ['%w', '%H', ''], + dflt: '', + role: 'info', + editType: 'calc', + description: [ + 'Only coerced on *date* axes.', + 'Determines a pattern on the time line that generates breaks.', + 'If *%w* - Sunday-based weekday as a decimal number [0, 6].', + 'If *%H* - hour (24-hour clock) as a decimal number [0, 23].', + 'These are the same directive as in `tickformat`, see', + 'https://github.com/d3/d3-time-format#locale_format', + 'for more info.', + 'Examples:', + '- { pattern: \'%w\', bounds: [6, 0], operation: \'[]\' }', + ' breaks from Saturday to Monday (i.e. skips the weekends).', + '- { pattern: \'%H\', bounds: [17, 8] }', + ' breaks from 5pm to 8am (i.e. skips non-work hours).' + ].join(' ') + }, + + values: { + valType: 'info_array', + freeLength: true, + role: 'info', + editType: 'calc', + items: { + valType: 'any', + editType: 'calc' + }, + description: [ + 'Sets the coordinate values corresponding to the breaks.', + 'An alternative to `bounds`.', + 'Use `dvalue` to set the spread of the values along the axis.' + ].join(' ') + }, + dvalue: { + // TODO could become 'any' to add support for 'months', 'years' + valType: 'number', + role: 'info', + editType: 'calc', + min: 0, + description: [ + 'Sets the spread of each `values` item.', + 'For *linear* axes, the default is *1*.', + 'For *date* axes, the default is one day in milliseconds.' + ].join(' ') + }, + + operation: { + valType: 'enumerated', + values: ['[]', '()', '[)', '(]'], + dflt: '()', + role: 'info', + editType: 'calc', + description: [ + 'Determines if we include or not the bound values within the break.', + 'Closed interval bounds (i.e. starting with *[* or ending with *]*)', + 'include the bound value within the break and thus make coordinates', + 'equal to the bound disappear.', + 'Open interval bounds (i.e. starting with *(* or ending with *)*)', + 'does not include the bound value within the break and thus keep coordinates', + 'equal to the bound on the axis.' + ].join(' ') + }, + + /* + gap: { + valType: 'number', + min: 0, + dflt: 0, // for *date* axes, maybe something else for *linear* + editType: 'calc', + role: 'info', + description: [ + 'Sets the gap distance between the start and the end of this break.', + 'Use with `gapmode` to set the unit of measurement.' + ].join(' ') + }, + gapmode: { + valType: 'enumerated', + values: ['pixels', 'fraction'], + dflt: 'pixels', + editType: 'calc', + role: 'info', + description: [ + 'Determines if the `gap` value corresponds to a pixel length', + 'or a fraction of the plot area.' + ].join(' ') + }, + */ + + // To complete https://github.com/plotly/plotly.js/issues/4210 + // we additionally need `gap` and make this work on *linear*, and + // possibly all other cartesian axis types. We possibly would also need + // some style attributes controlling the zig-zag on the corresponding + // axis. + + editType: 'calc' + }), + // ticks tickmode: { valType: 'enumerated', From e9cfe04bcf5ef6cfc7750acfe435761fc2812785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:30:47 -0500 Subject: [PATCH 02/23] add axis breaks default logic --- src/plots/cartesian/axis_defaults.js | 67 ++++++++++++++++ test/jasmine/tests/axes_test.js | 109 +++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index 02eab325f73..6a437234fcf 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -11,6 +11,8 @@ var Registry = require('../../registry'); var Lib = require('../../lib'); +var handleArrayContainerDefaults = require('../array_container_defaults'); + var layoutAttributes = require('./layout_attributes'); var handleTickValueDefaults = require('./tick_value_defaults'); var handleTickMarkDefaults = require('./tick_mark_defaults'); @@ -19,6 +21,8 @@ var handleCategoryOrderDefaults = require('./category_order_defaults'); var handleLineGridDefaults = require('./line_grid_defaults'); var setConvert = require('./set_convert'); +var ONEDAY = require('../../constants/numerical').ONEDAY; + /** * options: object containing: * @@ -117,5 +121,68 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } } + // TODO + // - does this make sense for 'log', 'category' and 'multicategory' axis types ?? + + var breaks = containerIn.breaks; + if(Array.isArray(breaks) && breaks.length) { + handleArrayContainerDefaults(containerIn, containerOut, { + name: 'breaks', + inclusionAttr: 'enabled', + handleItemDefaults: breaksDefaults + }); + setConvert(containerOut, layoutOut); + } + return containerOut; }; + +function breaksDefaults(itemIn, itemOut, containerOut) { + function coerce(attr, dflt) { + return Lib.coerce(itemIn, itemOut, layoutAttributes.breaks, attr, dflt); + } + + var enabled = coerce('enabled'); + + if(enabled) { + var isDateAxis = containerOut.type === 'date'; + + var bnds = coerce('bounds'); + + if(bnds && bnds.length >= 2) { + if(bnds.length > 2) { + itemOut.bounds = itemOut.bounds.slice(0, 2); + } + + if(containerOut.autorange === false) { + var rng = containerOut.range; + + // if bounds are bigger than the (set) range, disable break + if(rng[0] < rng[1]) { + if(bnds[0] < rng[0] && bnds[1] > rng[1]) { + itemOut.enabled = false; + return; + } + } else if(bnds[0] > rng[0] && bnds[1] < rng[1]) { + itemOut.enabled = false; + return; + } + } + + if(isDateAxis) { + coerce('pattern'); + } + } else { + var values = coerce('values'); + + if(values && values.length) { + coerce('dvalue', isDateAxis ? ONEDAY : 1); + } else { + itemOut.enabled = false; + return; + } + } + + coerce('operation'); + } +} diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 83a3298876f..4adaa2ad42f 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -1017,6 +1017,115 @@ describe('Test axes', function() { expect(layoutOut.yaxis.range).withContext('yaxis range').toEqual([0, 4]); expect(layoutOut.yaxis2.range).withContext('yaxis2 range').toEqual([0, 4]); }); + + it('should coerce *breaks* container only when it is a non-empty array', function() { + layoutIn = { + xaxis: {breaks: [{bounds: [0, 1]}]}, + xaxis2: {breaks: []}, + xaxis3: {breaks: false}, + xaxis4: {} + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(Array.isArray(layoutOut.xaxis.breaks) && layoutOut.xaxis.breaks.length) + .toBe(1, 'xaxis.breaks is array of length 1'); + expect(layoutOut.xaxis2.breaks).toBeUndefined(); + expect(layoutOut.xaxis3.breaks).toBeUndefined(); + expect(layoutOut.xaxis4.breaks).toBeUndefined(); + }); + + it('should set *breaks* to *enabled:false* when *bounds* have less than 2 items', function() { + layoutIn = { + xaxis: {breaks: [{bounds: [0]}]}, + xaxis2: {breaks: [{bounds: [0], values: [1]}]}, + xaxis3: {breaks: [{bounds: [0], values: {}}]}, + xaxis4: {breaks: [{bounds: [0, 1, 2]}]} + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(layoutOut.xaxis.breaks[0].enabled).toBe(false, 'invalid *bounds*'); + expect(layoutOut.xaxis2.breaks[0].enabled).toBe(true, 'invalid *bounds*, valid *values*'); + expect(layoutOut.xaxis3.breaks[0].enabled).toBe(false, 'invalid *bounds*, invalid *values*'); + expect(layoutOut.xaxis4.breaks[0].enabled && layoutOut.xaxis4.breaks[0].bounds) + .withContext('valid *bounds*, sliced to length=2').toEqual([0, 1]); + }); + + it('if *breaks* *bounds* are bigger than the set *range*, disable break', function() { + layoutIn = { + xaxis: {range: [0, 4], breaks: [{bounds: [1, 2]}]}, + xaxis2: {range: [1, 2], breaks: [{bounds: [0, 4]}]}, + xaxis3: {range: [4, 0], breaks: [{bounds: [2, 1]}]}, + xaxis4: {range: [2, 1], breaks: [{bounds: [4, 0]}]} + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(layoutOut.xaxis.breaks[0].enabled).toBe(true, '*bounds* within set range'); + expect(layoutOut.xaxis2.breaks[0].enabled).toBe(false, '*bounds* bigger than set range'); + expect(layoutOut.xaxis3.breaks[0].enabled).toBe(true, '*bounds* within set range (reversed)'); + expect(layoutOut.xaxis4.breaks[0].enabled).toBe(false, '*bounds* bigger than set range (reversed)'); + }); + + it('should coerce *breaks* *bounds* over *values*/*dvalue* if both are present', function() { + layoutIn = { + xaxis: {breaks: [{bounds: [0, 1]}]}, + xaxis2: {breaks: [{values: [0, 2, 4], dvalue: 2}]}, + xaxis3: {breaks: [{bounds: [0, 1], values: [0, 2, 4], dvalue: 2}]}, + xaxis4: {breaks: [{bounds: false, values: [0, 2, 4], dvalue: 2}]}, + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + var xaBreak = layoutOut.xaxis.breaks[0]; + expect(xaBreak.bounds).withContext('valid *bounds*').toEqual([0, 1]); + expect(xaBreak.values).toBe(undefined, 'not coerced'); + expect(xaBreak.dvalue).toBe(undefined, 'not coerced'); + + xaBreak = layoutOut.xaxis2.breaks[0]; + expect(xaBreak.bounds).toBe(undefined, 'not set, not coerced'); + expect(xaBreak.values).withContext('valid *values*').toEqual([0, 2, 4]); + expect(xaBreak.dvalue).toBe(2, 'valid *dvalue*'); + + xaBreak = layoutOut.xaxis3.breaks[0]; + expect(xaBreak.bounds).withContext('set to valid, coerced').toEqual([0, 1]); + expect(xaBreak.values).toBe(undefined, 'not coerced'); + expect(xaBreak.dvalue).toBe(undefined, 'not coerced'); + + xaBreak = layoutOut.xaxis4.breaks[0]; + expect(xaBreak.bounds).toBe(undefined, 'set but invalid, not coerced'); + expect(xaBreak.values).withContext('valid *values*').toEqual([0, 2, 4]); + expect(xaBreak.dvalue).toBe(2, 'valid *dvalue*'); + }); + + it('should only coerce breaks *pattern* on date axes with *bounds*', function() { + layoutIn = { + xaxis: {type: 'linear', breaks: [{bounds: [0, 1], pattern: 'not-gonna-work'}]}, + xaxis2: {type: 'date', breaks: [{bounds: ['2020-01-04', '2020-01-05']}]}, + xaxis3: {type: 'date', breaks: [{bounds: [6, 0], pattern: '%w'}]}, + xaxis4: {type: 'date', breaks: [{values: ['2020-01-04', '2020-01-05'], pattern: 'NOP'}]}, + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(layoutOut.xaxis.breaks[0].pattern).toBe(undefined, 'not coerced, on linear axis'); + expect(layoutOut.xaxis2.breaks[0].pattern).toBe('', 'coerced to dflt value'); + expect(layoutOut.xaxis3.breaks[0].pattern).toBe('%w', 'coerced'); + expect(layoutOut.xaxis4.breaks[0].pattern).toBe(undefined, 'not coerce, using *values*'); + }); + + it('should only coerce *dvalue* with correct smart dflt', function() { + layoutIn = { + xaxis: {type: 'linear', breaks: [{values: [1]}]}, + xaxis2: {type: 'date', breaks: [{values: ['2020-01-04']}]}, + }; + layoutOut._subplots.xaxis.push('x2'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(layoutOut.xaxis.breaks[0].dvalue).toBe(1, 'type:linear dflt'); + expect(layoutOut.xaxis2.breaks[0].dvalue).toBe(24 * 60 * 60 * 1000, 'type:date dflt'); + }); }); describe('constraints relayout', function() { From baf753aad7cb77d9dff47cf946a77d67ba2aca9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:34:12 -0500 Subject: [PATCH 03/23] add ax.maskBreaks method - used during makeCalcdata to mask (i.e. set to BADNUM) coordinates inside the axis breaks. --- src/plots/cartesian/set_convert.js | 80 ++++++++++++ test/jasmine/tests/axes_test.js | 203 +++++++++++++++++++++++++++++ 2 files changed, 283 insertions(+) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index c910ceed7e1..f2ac43d63ec 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -492,6 +492,79 @@ module.exports = function setConvert(ax, fullLayout) { } }; + ax.maskBreaks = function(v) { + var breaksIn = ax.breaks || []; + var bnds, b0, b1, vb; + + for(var i = 0; i < breaksIn.length; i++) { + var brk = breaksIn[i]; + + if(brk.enabled) { + var op = brk.operation; + var op0 = op.charAt(0); + var op1 = op.charAt(1); + + if(brk.bounds) { + var doesCrossPeriod = false; + + switch(brk.pattern) { + case '%w': + bnds = Lib.simpleMap(brk.bounds, cleanNumber); + b0 = bnds[0]; + b1 = bnds[1]; + vb = (new Date(v)).getUTCDay(); + if(bnds[0] > bnds[1]) doesCrossPeriod = true; + break; + case '%H': + bnds = Lib.simpleMap(brk.bounds, cleanNumber); + b0 = bnds[0]; + b1 = bnds[1]; + vb = (new Date(v)).getUTCHours(); + if(bnds[0] > bnds[1]) doesCrossPeriod = true; + break; + default: + bnds = Lib.simpleMap(brk.bounds, ax.d2c); + if(bnds[0] <= bnds[1]) { + b0 = bnds[0]; + b1 = bnds[1]; + } else { + b0 = bnds[1]; + b1 = bnds[0]; + } + vb = v; + } + + if(doesCrossPeriod) { + if( + (op0 === '(' ? vb > b0 : vb >= b0) || + (op1 === ')' ? vb < b1 : vb <= b1) + ) return BADNUM; + } else { + if( + (op0 === '(' ? vb > b0 : vb >= b0) && + (op1 === ')' ? vb < b1 : vb <= b1) + ) return BADNUM; + } + } else { + var vals = Lib.simpleMap(brk.values, ax.d2c).sort(Lib.sorterAsc); + var onOpenBound = false; + + for(var j = 0; j < vals.length; j++) { + b0 = vals[j]; + b1 = b0 + brk.dvalue; + if( + (op0 === '(' ? v > b0 : v >= b0) && + (op1 === ')' ? v < b1 : v <= b1) + ) return BADNUM; + + if(onOpenBound && op0 === '(' && v === b0) return BADNUM; + onOpenBound = op1 === ')' && v === b1; + } + } + } + } + return v; + }; // makeCalcdata: takes an x or y array and converts it // to a position on the axis object "ax" // inputs: @@ -541,6 +614,13 @@ module.exports = function setConvert(ax, fullLayout) { } } + // mask (i.e. set to BADNUM) coords that fall inside breaks + if(ax.breaks) { + for(i = 0; i < len; i++) { + arrayOut[i] = ax.maskBreaks(arrayOut[i]); + } + } + return arrayOut; }; diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 4adaa2ad42f..246289ecf70 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -13,6 +13,7 @@ var Axes = require('@src/plots/cartesian/axes'); var Fx = require('@src/components/fx'); var supplyLayoutDefaults = require('@src/plots/cartesian/layout_defaults'); var BADNUM = require('@src/constants/numerical').BADNUM; +var ONEDAY = require('@src/constants/numerical').ONEDAY; var createGraphDiv = require('../assets/create_graph_div'); var destroyGraphDiv = require('../assets/destroy_graph_div'); @@ -4011,6 +4012,208 @@ describe('Test axes', function() { .then(done); }); }); + + describe('*breaks*', function() { + describe('during doCalcdata', function() { + var gd; + + function _calc(trace, layout) { + gd = {data: [trace], layout: layout}; + supplyDefaults(gd); + Plots.doCalcdata(gd); + } + + function _assert(msg, exp) { + var cd = gd.calcdata[0]; + var xc = cd.map(function(cdi) { return cdi.x; }); + expect(xc).withContext(msg).toEqual(exp); + } + + it('should discard coords within break bounds', function() { + _calc({ + x: [0, 10, 50, 90, 100, 150, 190, 200] + }, { + xaxis: { + breaks: [ + {'operation': '()', bounds: [10, 90]}, + {'operation': '()', bounds: [100, 190]} + ] + } + }); + _assert('with operation:()', [0, 10, BADNUM, 90, 100, BADNUM, 190, 200]); + + _calc({ + x: [0, 10, 50, 90, 100, 150, 190, 200] + }, { + xaxis: { + breaks: [ + {operation: '[]', bounds: [10, 90]}, + {operation: '[]', bounds: [100, 190]} + ] + } + }); + _assert('with operation:[]', [0, BADNUM, BADNUM, BADNUM, BADNUM, BADNUM, BADNUM, 200]); + + _calc({ + x: [0, 10, 50, 90, 100, 150, 190, 200] + }, { + xaxis: { + breaks: [ + {operation: '[)', bounds: [10, 90]}, + {operation: '(]', bounds: [100, 190]} + ] + } + }); + _assert('with mixed operation values', [0, BADNUM, BADNUM, 90, 100, BADNUM, BADNUM, 200]); + }); + + it('should discard coords within break bounds - date %w case', function() { + var x = [ + // Thursday + '2020-01-02 08:00', '2020-01-02 16:00', + // Friday + '2020-01-03 08:00', '2020-01-03 16:00', + // Saturday + '2020-01-04 08:00', '2020-01-04 16:00', + // Sunday + '2020-01-05 08:00', '2020-01-05 16:00', + // Monday + '2020-01-06 08:00', '2020-01-06 16:00', + // Tuesday + '2020-01-07 08:00', '2020-01-07 16:00' + ]; + + var noWeekend = [ + 1577952000000, 1577980800000, + 1578038400000, 1578067200000, + BADNUM, BADNUM, + BADNUM, BADNUM, + 1578297600000, 1578326400000, + 1578384000000, 1578412800000 + ]; + + _calc({x: x}, { + xaxis: { + breaks: [ + {pattern: '%w', bounds: [6, 0], operation: '[]'} + ] + } + }); + _assert('[6,0]', noWeekend); + + _calc({x: x}, { + xaxis: { + breaks: [ + {pattern: '%w', bounds: [5, 1], operation: '()'} + ] + } + }); + _assert('(5,1)', noWeekend); + + _calc({x: x}, { + xaxis: { + breaks: [ + {pattern: '%w', bounds: [6, 1], operation: '[)'} + ] + } + }); + _assert('[6,1)', noWeekend); + + _calc({x: x}, { + xaxis: { + breaks: [ + {pattern: '%w', bounds: [5, 0], operation: '(]'} + ] + } + }); + _assert('(5,0]', noWeekend); + }); + + it('should discard coords within break bounds - date %H case', function() { + _calc({ + x: [ + '2020-01-02 08:00', '2020-01-02 20:00', + '2020-01-03 08:00', '2020-01-03 20:00', + '2020-01-04 08:00', '2020-01-04 20:00', + '2020-01-05 08:00', '2020-01-05 20:00', + '2020-01-06 08:00', '2020-01-06 20:00', + '2020-01-07 08:00', '2020-01-07 20:00' + ] + }, { + xaxis: { + breaks: [ + {pattern: '%H', bounds: [17, 8]} + ] + } + }); + _assert('with dflt operation', [ + 1577952000000, BADNUM, + 1578038400000, BADNUM, + 1578124800000, BADNUM, + 1578211200000, BADNUM, + 1578297600000, BADNUM, + 1578384000000, BADNUM + ]); + }); + + it('should discard coords within [values[i], values[i] + dvalue] bounds', function() { + var x = [ + // Thursday + '2020-01-02 08:00', '2020-01-02 16:00', + // Friday + '2020-01-03 08:00', '2020-01-03 16:00', + // Saturday + '2020-01-04 08:00', '2020-01-04 16:00', + // Sunday + '2020-01-05 08:00', '2020-01-05 16:00', + // Monday + '2020-01-06 08:00', '2020-01-06 16:00', + // Tuesday + '2020-01-07 08:00', '2020-01-07 16:00' + ]; + + _calc({x: x}, { + xaxis: { + breaks: [{values: ['2020-01-04', '2020-01-05'], dvalue: ONEDAY}], + } + }); + _assert('two values', [ + 1577952000000, 1577980800000, + 1578038400000, 1578067200000, + BADNUM, BADNUM, + BADNUM, BADNUM, + 1578297600000, 1578326400000, + 1578384000000, 1578412800000 + ]); + }); + + it('should discard coords equal to two consecutive open values bounds', function() { + _calc({ + x: [1, 2, 3, 4, 5] + }, { + xaxis: { + breaks: [{ values: [2, 3], dvalue: 1, operation: '()' }] + } + }); + _assert('', [1, 2, BADNUM, 4, 5]); + }); + + it('should adapt coords generated from x0/dx about breaks', function() { + _calc({ + x0: 1, + dx: 0.5, + y: [1, 3, 5, 2, 4] + }, { + xaxis: { + breaks: [ + {bounds: [2, 3]} + ] + } + }); + _assert('generated x=2.5 gets masked', [1, 1.5, 2, BADNUM, 3]); + }); + }); + }); }); function getZoomInButton(gd) { From 259eafa1e805def29df18289a0f0292ffda0cc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:41:41 -0500 Subject: [PATCH 04/23] implement axis breaks setConvert logic - add abstractions: + ax._breaks, the disjoint breaks inside the range though ax.locateBreaks + ax._lBreaks, length of these breaks in value space + ax._m2, l2p slope (same for all intervals) + ax._B, set of l2p offsets (one for each of the (N+1) piecewise intervals) - adapt l2p and p2l for axis breaks - add jasmine tests for setConvert and hover labels --- src/plots/cartesian/set_convert.js | 253 ++++++++++++++++- test/jasmine/tests/axes_test.js | 359 +++++++++++++++++++++++++ test/jasmine/tests/hover_label_test.js | 127 +++++++++ 3 files changed, 734 insertions(+), 5 deletions(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index f2ac43d63ec..b769f1aa63e 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -22,6 +22,10 @@ var numConstants = require('../../constants/numerical'); var FP_SAFE = numConstants.FP_SAFE; var BADNUM = numConstants.BADNUM; var LOG_CLIP = numConstants.LOG_CLIP; +var ONEDAY = numConstants.ONEDAY; +var ONEHOUR = numConstants.ONEHOUR; +var ONEMIN = numConstants.ONEMIN; +var ONESEC = numConstants.ONESEC; var constants = require('./constants'); var axisIds = require('./axis_ids'); @@ -170,14 +174,73 @@ module.exports = function setConvert(ax, fullLayout) { if(isNumeric(v)) return +v; } - function l2p(v) { + // include 2 fractional digits on pixel, for PDF zooming etc + function _l2p(v, m, b) { return d3.round(b + m * v, 2); } + + function _p2l(px, m, b) { return (px - b) / m; } + + var l2p = function l2p(v) { if(!isNumeric(v)) return BADNUM; + return _l2p(v, ax._m, ax._b); + }; - // include 2 fractional digits on pixel, for PDF zooming etc - return d3.round(ax._b + ax._m * v, 2); - } + var p2l = function(px) { + return _p2l(px, ax._m, ax._b); + }; - function p2l(px) { return (px - ax._b) / ax._m; } + if(ax.breaks) { + if(axLetter === 'y') { + l2p = function(v) { + if(!isNumeric(v)) return BADNUM; + if(!ax._breaks.length) return _l2p(v, ax._m, ax._b); + + var b = ax._B[0]; + for(var i = 0; i < ax._breaks.length; i++) { + var brk = ax._breaks[i]; + if(v <= brk.min) b = ax._B[i + 1]; + else if(v > brk.max) break; + } + return _l2p(v, -ax._m2, b); + }; + p2l = function(px) { + if(!isNumeric(px)) return BADNUM; + if(!ax._breaks.length) return _p2l(px, ax._m, ax._b); + + var b = ax._B[0]; + for(var i = 0; i < ax._breaks.length; i++) { + var brk = ax._breaks[i]; + if(px >= brk.pmin) b = ax._B[i + 1]; + else if(px < brk.pmax) break; + } + return _p2l(px, -ax._m2, b); + }; + } else { + l2p = function(v) { + if(!isNumeric(v)) return BADNUM; + if(!ax._breaks.length) return _l2p(v, ax._m, ax._b); + + var b = ax._B[0]; + for(var i = 0; i < ax._breaks.length; i++) { + var brk = ax._breaks[i]; + if(v >= brk.max) b = ax._B[i + 1]; + else if(v < brk.min) break; + } + return _l2p(v, ax._m2, b); + }; + p2l = function(px) { + if(!isNumeric(px)) return BADNUM; + if(!ax._breaks.length) return _p2l(px, ax._m, ax._b); + + var b = ax._B[0]; + for(var i = 0; i < ax._breaks.length; i++) { + var brk = ax._breaks[i]; + if(px >= brk.pmax) b = ax._B[i + 1]; + else if(px < brk.pmin) break; + } + return _p2l(px, ax._m2, b); + }; + } + } // conversions among c/l/p are fairly simple - do them together for all axis types ax.c2l = (ax.type === 'log') ? toLog : ensureNumber; @@ -486,6 +549,51 @@ module.exports = function setConvert(ax, fullLayout) { ax._b = -ax._m * rl0; } + // set of "N" disjoint breaks inside the range + ax._breaks = []; + // length of these breaks in value space + ax._lBreaks = 0; + // l2p slope (same for all intervals) + ax._m2 = 0; + // set of l2p offsets (one for each of the (N+1) piecewise intervals) + ax._B = []; + + if(ax.breaks) { + var i, brk; + + ax._breaks = ax.locateBreaks(rl0, rl1); + + if(ax._breaks.length) { + for(i = 0; i < ax._breaks.length; i++) { + brk = ax._breaks[i]; + ax._lBreaks += (brk.max - brk.min); + } + + ax._m2 = ax._length / (rl1 - rl0 - ax._lBreaks); + + if(axLetter === 'y') { + ax._breaks.reverse(); + // N.B. top to bottom (negative coord, positive px direction) + ax._B.push(ax._m2 * rl1); + } else { + ax._B.push(-ax._m2 * rl0); + } + + for(i = 0; i < ax._breaks.length; i++) { + brk = ax._breaks[i]; + ax._B.push(ax._B[ax._B.length - 1] - ax._m2 * (brk.max - brk.min)); + } + + // fill pixel (i.e. 'p') min/max here, + // to not have to loop through the _breaks twice during `p2l` + for(i = 0; i < ax._breaks.length; i++) { + brk = ax._breaks[i]; + brk.pmin = l2p(brk.min); + brk.pmax = l2p(brk.max); + } + } + } + if(!isFinite(ax._m) || !isFinite(ax._b) || ax._length < 0) { fullLayout._replotting = false; throw new Error('Something went wrong with axis scaling'); @@ -565,6 +673,141 @@ module.exports = function setConvert(ax, fullLayout) { } return v; }; + + ax.locateBreaks = function(r0, r1) { + var i, bnds, b0, b1; + + var breaksOut = []; + if(!ax.breaks) return breaksOut; + + var breaksIn; + if(ax.type === 'date') { + breaksIn = ax.breaks.slice().sort(function(a, b) { + if(a.pattern === '%w' && b.pattern === '%H') return -1; + else if(b.pattern === '%w' && a.pattern === '%H') return 1; + return 0; + }); + } else { + breaksIn = ax.breaks; + } + + var addBreak = function(min, max) { + min = Lib.constrain(min, r0, r1); + max = Lib.constrain(max, r0, r1); + if(min === max) return; + + var isNewBreak = true; + for(var j = 0; j < breaksOut.length; j++) { + var brkj = breaksOut[j]; + if(min > brkj.max || max < brkj.min) { + // potentially a new break + } else { + if(min < brkj.min) { + brkj.min = min; + } + if(max > brkj.max) { + brkj.max = max; + } + isNewBreak = false; + } + } + if(isNewBreak) { + breaksOut.push({min: min, max: max}); + } + }; + + for(i = 0; i < breaksIn.length; i++) { + var brk = breaksIn[i]; + + if(brk.enabled) { + var op = brk.operation; + var op0 = op.charAt(0); + var op1 = op.charAt(1); + + if(brk.bounds) { + if(brk.pattern) { + bnds = Lib.simpleMap(brk.bounds, cleanNumber); + if(bnds[0] === bnds[1] && op === '()') continue; + + // r0 value as date + var r0Date = new Date(r0); + // r0 value for break pattern + var r0Pattern; + // delta between r0 and first break in break pattern values + var r0PatternDelta; + // delta between break bounds in ms + var bndDelta; + // step in ms between breaks + var step; + // tracker to position bounds + var t; + + switch(brk.pattern) { + case '%w': + b0 = bnds[0] + (op0 === '(' ? 1 : 0); + b1 = bnds[1]; + r0Pattern = r0Date.getUTCDay(); + r0PatternDelta = b0 - r0Pattern; + bndDelta = (b1 >= b0 ? b1 - b0 : (b1 + 7) - b0) * ONEDAY; + if(op1 === ']') bndDelta += ONEDAY; + step = 7 * ONEDAY; + + t = r0 + r0PatternDelta * ONEDAY - + r0Date.getUTCHours() * ONEHOUR - + r0Date.getUTCMinutes() * ONEMIN - + r0Date.getUTCSeconds() * ONESEC - + r0Date.getUTCMilliseconds(); + break; + case '%H': + b0 = bnds[0]; + b1 = bnds[1]; + r0Pattern = r0Date.getUTCHours(); + r0PatternDelta = b0 - r0Pattern; + bndDelta = (b1 >= b0 ? b1 - b0 : (b1 + 24) - b0) * ONEHOUR; + step = ONEDAY; + + t = r0 + r0PatternDelta * ONEHOUR - + r0Date.getUTCMinutes() * ONEMIN - + r0Date.getUTCSeconds() * ONESEC - + r0Date.getUTCMilliseconds(); + break; + } + + while(t <= r1) { + // TODO we need to remove decimal (most often found + // in auto ranges) for this to work correctly, + // should this be Math.floor, Math.ceil or + // Math.round ?? + addBreak(Math.floor(t), Math.floor(t + bndDelta)); + t += step; + } + } else { + bnds = Lib.simpleMap(brk.bounds, ax.r2l); + if(bnds[0] <= bnds[1]) { + b0 = bnds[0]; + b1 = bnds[1]; + } else { + b0 = bnds[1]; + b1 = bnds[0]; + } + addBreak(b0, b1); + } + } else { + var vals = Lib.simpleMap(brk.values, ax.d2c); + for(var j = 0; j < vals.length; j++) { + b0 = vals[j]; + b1 = b0 + brk.dvalue; + addBreak(b0, b1); + } + } + } + } + + breaksOut.sort(function(a, b) { return a.min - b.min; }); + + return breaksOut; + }; + // makeCalcdata: takes an x or y array and converts it // to a position on the axis object "ax" // inputs: diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 246289ecf70..95f4fd6ac5f 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4213,6 +4213,365 @@ describe('Test axes', function() { _assert('generated x=2.5 gets masked', [1, 1.5, 2, BADNUM, 3]); }); }); + + describe('during setConvert (once range is available)', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function _assert(msg, axLetter, exp) { + var fullLayout = gd._fullLayout; + var ax = fullLayout[axLetter + 'axis']; + + if(exp) { + expect(ax._breaks.length) + .toBe(exp.breaks.length, msg + '| correct # of breaks'); + expect(ax._breaks.map(function(brk) { return [brk.min, brk.max]; })) + .toBeCloseTo2DArray(exp.breaks, 2, msg + '| breaks [min,max]'); + + expect(ax._m2).toBe(exp.m2, msg + '| l2p slope'); + expect(ax._B).toBeCloseToArray(exp.B, 2, msg + '| l2p piecewise offsets'); + } else { + expect(ax._breaks).withContext(msg).toEqual([]); + expect(ax._m2).toBe(0, msg); + expect(ax._B).withContext(msg).toEqual([]); + } + } + + it('should locate breaks & compute l <-> p parameters - x-axis case', function(done) { + Plotly.plot(gd, [{ + x: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + xaxis: {} + }) + .then(function() { + _assert('no set breaks', 'x', null); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('2 disjoint breaks within range', 'x', { + breaks: [[11, 89], [101, 189]], + m2: 14.073529411764703, + B: [30.749, -1066.985, -2305.455] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {bounds: [11, 89]}, + {bounds: [70, 189]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('2 overlapping breaks within range', 'x', { + breaks: [[11, 189]], + m2: 21.749999999999986, + B: [30.749, -3840.749] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {bounds: [-10, 89]}, + {bounds: [101, 189]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('break beyond xaxis.range[0]', 'x', { + breaks: [[88.58620689655173, 89], [101, 189]], + m2: 22.118644067796602, + B: [-1959.406, -1968.559, -3914.999] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {bounds: [11, 89]}, + {bounds: [101, 300]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('break beyond xaxis.range[1]', 'x', { + breaks: [[11, 89], [101, 101.41379310344827]], + m2: 22.118644067796616, + B: [31.271, -1693.983, -1703.135] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {bounds: [-11, 90]}, + {bounds: [101, 300]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('both breaks beyond xaxis.range', 'x', { + breaks: [[89.35736677115987, 90]], + m2: 50.73932253313696, + B: [-4533.9322, -4566.539] + }); + }) + .catch(failTest) + .then(done); + }); + + it('should locate breaks & compute l <-> p parameters - y-axis case', function(done) { + Plotly.plot(gd, [{ + y: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + yaxis: {} + }) + .then(function() { + _assert('no set breaks', 'y', null); + }) + .then(function() { + gd.layout.yaxis.breaks = [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('2 disjoint breaks within range', 'y', { + breaks: [[101, 189], [11, 89]], + m2: 6.926470588235295, + B: [1402.544, 793.0147, 252.75] + }); + }) + .then(function() { + gd.layout.yaxis.breaks = [ + {bounds: [11, 89]}, + {bounds: [70, 189]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('2 overlapping breaks within range', 'y', { + breaks: [[11, 189]], + m2: 10.70454545454546, + B: [2158.1590, 252.75] + }); + }) + .catch(failTest) + .then(done); + }); + + it('should locate breaks & compute l <-> p parameters - date axis case', function(done) { + Plotly.plot(gd, [{ + x: [ + // Thursday + '2020-01-02 08:00', '2020-01-02 17:00', + // Friday + '2020-01-03 08:00', '2020-01-03 17:00', + // Saturday + '2020-01-04 08:00', '2020-01-04 17:00', + // Sunday + '2020-01-05 08:00', '2020-01-05 17:00', + // Monday + '2020-01-06 08:00', '2020-01-06 17:00', + // Tuesday + '2020-01-07 08:00', '2020-01-07 17:00' + ] + }], { + xaxis: {} + }) + .then(function() { + _assert('no set breaks', 'x', null); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [5, 1]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('break over the weekend days', 'x', { + breaks: [ + ['2020-01-04', '2020-01-06'].map(Lib.dateTime2ms) + ], + m2: 0.000001640946501588664, + B: [-2589304.064, -2589587.619] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [6, 0], operation: '[]'} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('break over the weekend days (with operation:[])', 'x', { + breaks: [ + ['2020-01-04', '2020-01-06'].map(Lib.dateTime2ms) + ], + m2: 0.000001640946501588664, + B: [-2589304.064, -2589587.619] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [4, 6]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('skip Friday', 'x', { + breaks: [ + ['2020-01-03', '2020-01-04'].map(Lib.dateTime2ms) + ], + m2: 0.0000012658730158736563, + B: [-1997456.107, -1997565.478] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [5, 5], operation: '[]'} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('skip Friday (operation:[] version)', 'x', { + breaks: [ + ['2020-01-03', '2020-01-04'].map(Lib.dateTime2ms) + ], + m2: 0.0000012658730158736563, + B: [-1997456.107, -1997565.478] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [5, 5], operation: '()'} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('bad input -> implied empty breaks', 'x', null); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%H', bounds: [17, 8]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('breaks outside workday hours', 'x', { + breaks: [ + ['2020-01-02 17:00:00', '2020-01-03 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-03 17:00:00', '2020-01-04 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-04 17:00:00', '2020-01-05 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-05 17:00:00', '2020-01-06 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-06 17:00:00', '2020-01-07 08:00:00'].map(Lib.dateTime2ms), + [Lib.dateTime2ms('2020-01-07 17:00:00'), 1578428892790] + ], + m2: 0.0000026100474550128112, + B: [ + -4118496.99495763, -4118637.937520201, + -4118778.8800827716, -4118919.8226453424, + -4119060.7652079132, -4119201.707770484, + -4119234.3145452295 + ] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [5, 1]}, + {pattern: '%H', bounds: [17, 8]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('breaks outside workday hours & weekends', 'x', { + breaks: [ + ['2020-01-02 17:00:00', '2020-01-03 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-03 17:00:00', '2020-01-06 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-06 17:00:00', '2020-01-07 08:00:00'].map(Lib.dateTime2ms), + [Lib.dateTime2ms('2020-01-07 17:00:00'), 1578424728526.6] + ], + m2: 0.000003915071184408763, + B: [ + -6177761.798805676, -6177973.212649634, + -6178861.150794258, -6179072.564638216, + -6179105.171412717 + ] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%H', bounds: [17, 8]}, + {pattern: '%w', bounds: [5, 1]} + ]; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('breaks outside workday hours & weekends (reversed break order)', 'x', { + breaks: [ + ['2020-01-02 17:00:00', '2020-01-03 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-03 17:00:00', '2020-01-06 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-06 17:00:00', '2020-01-07 08:00:00'].map(Lib.dateTime2ms), + [Lib.dateTime2ms('2020-01-07 17:00:00'), 1578424728526.6] + ], + m2: 0.000003915071184408763, + B: [ + -6177761.798805676, -6177973.212649634, + -6178861.150794258, -6179072.564638216, + -6179105.171412717 + ] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%H', bounds: [17, 8]} + ]; + // N.B. xaxis.range[0] falls within a break + gd.layout.xaxis.autorange = false; + gd.layout.xaxis.range = ['2020-01-01 20:00:00', '2020-01-04 20:00:00']; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('when range[0] falls within a break pattern (%H case)', 'x', { + breaks: [ + [1577908800000, Lib.dateTime2ms('2020-01-02 08:00:00')], + ['2020-01-02 17:00:00', '2020-01-03 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-03 17:00:00', '2020-01-04 08:00:00'].map(Lib.dateTime2ms), + ['2020-01-04 17:00:00', '2020-01-04 20:00:00'].map(Lib.dateTime2ms) + ], + m2: 0.000005555555555555556, + B: [-8766160, -8766400, -8766700, -8767000, -8767060] + }); + }) + .then(function() { + gd.layout.xaxis.breaks = [ + {pattern: '%w', bounds: [1, 4]} + ]; + // N.B. xaxis.range[0] falls within a break + gd.layout.xaxis.autorange = false; + gd.layout.xaxis.range = ['2020-01-01', '2020-01-09']; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('when range[0] falls within a break pattern (%w case)', 'x', { + breaks: [ + ['2020-01-01 00:00:00', '2020-01-02 00:00:00'].map(Lib.dateTime2ms), + ['2020-01-07 00:00:00', '2020-01-09 00:00:00'].map(Lib.dateTime2ms) + ], + m2: 0.00000125, + B: [-1972296, -1972404, -1972620] + }); + }) + .catch(failTest) + .then(done); + }); + }); }); }); diff --git a/test/jasmine/tests/hover_label_test.js b/test/jasmine/tests/hover_label_test.js index c26cd8a2067..d6de235f11a 100644 --- a/test/jasmine/tests/hover_label_test.js +++ b/test/jasmine/tests/hover_label_test.js @@ -2682,6 +2682,133 @@ describe('Hover on multicategory axes', function() { }); }); +describe('Hover on axes with breaks', function() { + var gd; + var eventData; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function _hover(x, y) { + delete gd._hoverdata; + Lib.clearThrottle(); + mouseEvent('mousemove', x, y); + } + + function _assert(msg, exp) { + assertHoverLabelContent({ nums: exp.nums, axis: exp.axis }, msg + '| hover label'); + expect(eventData.x).toBe(exp.x, 'event data x'); + expect(eventData.y).toBe(exp.y, 'event data y'); + } + + it('should work when breaks are present on x-axis', function(done) { + Plotly.plot(gd, [{ + mode: 'lines', // i.e. no autorange padding + x: [0, 10, 50, 90, 95, 100, 150, 190, 200] + }], { + xaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + }, + width: 400, + height: 400, + margin: {l: 10, t: 10, b: 10, r: 10}, + hovermode: 'x' + }) + .then(function() { + gd.on('plotly_hover', function(d) { + eventData = d.points[0]; + }); + }) + .then(function() { _hover(11, 11); }) + .then(function() { + _assert('leftmost interval', { + nums: '0', + axis: '0', + x: 0, + y: 0 + }); + }) + .then(function() { _hover(200, 200); }) + .then(function() { + _assert('middle interval', { + nums: '4', + axis: '95', + x: 95, + y: 4 + }); + }) + .then(function() { _hover(388, 388); }) + .then(function() { + _assert('rightmost interval', { + nums: '8', + axis: '200', + x: 200, + y: 8 + }); + }) + .catch(failTest) + .then(done); + }); + + it('should work when breaks are present on y-axis', function(done) { + Plotly.plot(gd, [{ + mode: 'lines', // i.e. no autorange padding + y: [0, 10, 50, 90, 95, 100, 150, 190, 200] + }], { + yaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + }, + width: 400, + height: 400, + margin: {l: 10, t: 10, b: 10, r: 10}, + hovermode: 'y' + }) + .then(function() { + gd.on('plotly_hover', function(d) { + eventData = d.points[0]; + }); + }) + .then(function() { _hover(388, 30); }) + .then(function() { + _assert('topmost interval', { + nums: '8', + axis: '200', + x: 8, + y: 200 + }); + }) + .then(function() { _hover(200, 200); }) + .then(function() { + _assert('middle interval', { + nums: '4', + axis: '95', + x: 4, + y: 95 + }); + }) + .then(function() { _hover(11, 370); }) + .then(function() { + _assert('bottom interval', { + nums: '0', + axis: '0', + x: 0, + y: 0 + }); + }) + .catch(failTest) + .then(done); + }); +}); + describe('hover updates', function() { 'use strict'; From eca3da70067e45ecac492cdfe7d6cfda4fb8ea34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:42:49 -0500 Subject: [PATCH 05/23] adapt autorange routine for axis breaks ... as the value-space length is reduced when axis breaks are present within the trial range --- src/plots/cartesian/autorange.js | 16 +++++++- test/jasmine/tests/axes_test.js | 68 ++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/autorange.js b/src/plots/cartesian/autorange.js index 5de73652823..db84d70b4ac 100644 --- a/src/plots/cartesian/autorange.js +++ b/src/plots/cartesian/autorange.js @@ -95,6 +95,18 @@ function getAutoRange(gd, ax) { // don't allow padding to reduce the data to < 10% of the length var minSpan = axLen / 10; + // find axis breaks in [v0,v1] and compute its length in value space + var calcBreaksLength = function(v0, v1) { + var lBreaks = 0; + if(ax.breaks) { + var breaksOut = ax.locateBreaks(v0, v1); + for(var i = 0; i < breaksOut.length; i++) { + lBreaks += (breaksOut[i].max - breaksOut[i].min); + } + } + return lBreaks; + }; + var mbest = 0; var minpt, maxpt, minbest, maxbest, dp, dv; @@ -102,7 +114,7 @@ function getAutoRange(gd, ax) { minpt = minArray[i]; for(j = 0; j < maxArray.length; j++) { maxpt = maxArray[j]; - dv = maxpt.val - minpt.val; + dv = maxpt.val - minpt.val - calcBreaksLength(minpt.val, maxpt.val); if(dv > 0) { dp = axLen - getPad(minpt) - getPad(maxpt); if(dp > minSpan) { @@ -167,7 +179,7 @@ function getAutoRange(gd, ax) { } // in case it changed again... - mbest = (maxbest.val - minbest.val) / + mbest = (maxbest.val - minbest.val - calcBreaksLength(minpt.val, maxpt.val)) / (axLen - getPad(minbest) - getPad(maxbest)); newRange = [ diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 95f4fd6ac5f..e49d4083623 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4214,6 +4214,74 @@ describe('Test axes', function() { }); }); + describe('during doAutorange', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function _assert(msg, exp) { + expect(gd._fullLayout.xaxis.range).toEqual(exp.xrng, msg + '| x range'); + expect(gd._fullLayout.xaxis._lBreaks).toBe(exp.lBreaks, msg + '| lBreaks'); + } + + it('should adapt padding about axis breaks length', function(done) { + Plotly.plot(gd, [{ + mode: 'markers', + x: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + xaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + } + }) + .then(function() { + _assert('mode:markers (i.e. with padding)', { + xrng: [-2.1849529780564265, 202.18495297805643], + lBreaks: 166 + }); + }) + .then(function() { + gd.data[0].mode = 'lines'; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('mode:lines (i.e. no padding)', { + xrng: [0, 200], + lBreaks: 166 + }); + }) + .then(function() { + gd.data[0].mode = 'markers'; + gd.layout.xaxis.breaks[0].enabled = false; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('mode:markers | one of two breaks enabled', { + xrng: [-7.197492163009405, 207.1974921630094], + lBreaks: 88 + }); + }) + .then(function() { + gd.layout.xaxis.breaks[1].enabled = false; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('mode:markers | no breaks enabled', { + xrng: [-12.852664576802507, 212.8526645768025], + lBreaks: 0 + }); + }) + .catch(failTest) + .then(done); + }); + }); + describe('during setConvert (once range is available)', function() { var gd; From 6bec94d3869b8af7a9260142e5127bc95a1662a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:45:47 -0500 Subject: [PATCH 06/23] adapt calcTicks for axis breaks - reduce the value-space range by `ax._lBreaks` to get the correct the number of auto ticks on the axes. - add logic to remove ticks falling inside breaks - add (could do better) logic for ticks that overlap on either side of a break. --- src/plots/cartesian/axes.js | 25 +++++++++++++++-- test/jasmine/tests/axes_test.js | 49 +++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index af04c97d90b..6f56281e939 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -526,7 +526,8 @@ axes.prepTicks = function(ax) { // have explicit tickvals without tick text if(ax.tickmode === 'array') nt *= 100; - axes.autoTicks(ax, Math.abs(rng[1] - rng[0]) / nt); + axes.autoTicks(ax, (Math.abs(rng[1] - rng[0]) - (ax._lBreaks || 0)) / nt); + // check for a forced minimum dtick if(ax._minDtick > 0 && ax.dtick < ax._minDtick * 2) { ax.dtick = ax._minDtick; @@ -608,6 +609,19 @@ axes.calcTicks = function calcTicks(ax) { tickVals.pop(); } + if(ax.breaks) { + // remove ticks falling inside breaks + tickVals = tickVals.filter(function(d) { + return ax.maskBreaks(d.value) !== BADNUM; + }); + + // TODO what to do with "overlapping" ticks? + var tf2 = ax.tickfont ? 1.5 * ax.tickfont.size : 0; + tickVals = tickVals.filter(function(d, i, self) { + return !(i && Math.abs(ax.c2p(d.value) - ax.c2p(self[i - 1].value)) < tf2); + }); + } + // save the last tick as well as first, so we can // show the exponent only on the last one ax._tmax = (tickVals[tickVals.length - 1] || {}).value; @@ -670,6 +684,13 @@ function arrayTicks(ax) { if(j < vals.length) ticksOut.splice(j, vals.length - j); + if(ax.breaks) { + // remove ticks falling inside breaks + ticksOut = ticksOut.filter(function(d) { + return ax.maskBreaks(d.x) !== BADNUM; + }); + } + return ticksOut; } @@ -966,7 +987,7 @@ axes.tickText = function(ax, x, hover, noSuffixPrefix) { if(arrayMode && Array.isArray(ax.ticktext)) { var rng = Lib.simpleMap(ax.range, ax.r2l); - var minDiff = Math.abs(rng[1] - rng[0]) / 10000; + var minDiff = (Math.abs(rng[1] - rng[0]) - (ax._lBreaks || 0)) / 10000; for(i = 0; i < ax.ticktext.length; i++) { if(Math.abs(x - tickVal2l(ax.tickvals[i])) < minDiff) break; diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index e49d4083623..beb22c2b45b 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4640,6 +4640,55 @@ describe('Test axes', function() { .then(done); }); }); + + describe('during calcTicks', function() { + var gd; + + beforeEach(function() { + gd = createGraphDiv(); + }); + + afterEach(destroyGraphDiv); + + function _assert(msg, exp) { + var fullLayout = gd._fullLayout; + var xa = fullLayout.xaxis; + + expect(xa._vals.map(function(d) { return d.x; })) + .withContext(msg).toEqual(exp.tickVals); + } + + it('should not include ticks that fall within breaks', function(done) { + Plotly.plot(gd, [{ + x: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + xaxis: {}, + width: 500, + height: 400 + }) + .then(function() { + _assert('base', { + tickVals: [0, 50, 100, 150, 200] + }); + }) + .then(function() { + gd.layout.xaxis = { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + }; + return Plotly.react(gd, gd.data, gd.layout); + }) + .then(function() { + _assert('with two breaks', { + tickVals: [0, 10, 100, 200] + }); + }) + .catch(failTest) + .then(done); + }); + }); }); }); From fe80cad564dfd6cc71c7065112fb9667a71439eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:46:05 -0500 Subject: [PATCH 07/23] adapt dragbox logic for axis breaks --- src/plots/cartesian/dragbox.js | 33 +++++++--- test/jasmine/tests/cartesian_interact_test.js | 64 +++++++++++++++++++ 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/src/plots/cartesian/dragbox.js b/src/plots/cartesian/dragbox.js index affb0e36926..98e02a31faf 100644 --- a/src/plots/cartesian/dragbox.js +++ b/src/plots/cartesian/dragbox.js @@ -986,10 +986,20 @@ function zoomAxRanges(axList, r0Fraction, r1Fraction, updates, linkedAxes) { var axi = axList[i]; if(axi.fixedrange) continue; - var axRangeLinear0 = axi._rl[0]; - var axRangeLinearSpan = axi._rl[1] - axRangeLinear0; - updates[axi._name + '.range[0]'] = axi.l2r(axRangeLinear0 + axRangeLinearSpan * r0Fraction); - updates[axi._name + '.range[1]'] = axi.l2r(axRangeLinear0 + axRangeLinearSpan * r1Fraction); + if(axi.breaks) { + if(axi._id.charAt(0) === 'y') { + updates[axi._name + '.range[0]'] = axi.l2r(axi.p2l((1 - r0Fraction) * axi._length)); + updates[axi._name + '.range[1]'] = axi.l2r(axi.p2l((1 - r1Fraction) * axi._length)); + } else { + updates[axi._name + '.range[0]'] = axi.l2r(axi.p2l(r0Fraction * axi._length)); + updates[axi._name + '.range[1]'] = axi.l2r(axi.p2l(r1Fraction * axi._length)); + } + } else { + var axRangeLinear0 = axi._rl[0]; + var axRangeLinearSpan = axi._rl[1] - axRangeLinear0; + updates[axi._name + '.range[0]'] = axi.l2r(axRangeLinear0 + axRangeLinearSpan * r0Fraction); + updates[axi._name + '.range[1]'] = axi.l2r(axRangeLinear0 + axRangeLinearSpan * r1Fraction); + } } // zoom linked axes about their centers @@ -1003,10 +1013,17 @@ function dragAxList(axList, pix) { for(var i = 0; i < axList.length; i++) { var axi = axList[i]; if(!axi.fixedrange) { - axi.range = [ - axi.l2r(axi._rl[0] - pix / axi._m), - axi.l2r(axi._rl[1] - pix / axi._m) - ]; + if(axi.breaks) { + axi.range = [ + axi.l2r(axi._rl[0] - (axi.p2l(pix) - axi.p2l(0))), + axi.l2r(axi._rl[1] - (axi.p2l(axi._length + pix) - axi.p2l(axi._length))) + ]; + } else { + axi.range = [ + axi.l2r(axi._rl[0] - pix / axi._m), + axi.l2r(axi._rl[1] - pix / axi._m) + ]; + } } } } diff --git a/test/jasmine/tests/cartesian_interact_test.js b/test/jasmine/tests/cartesian_interact_test.js index 29bb79810ef..a045bc1baf6 100644 --- a/test/jasmine/tests/cartesian_interact_test.js +++ b/test/jasmine/tests/cartesian_interact_test.js @@ -2029,6 +2029,70 @@ describe('axis zoom/pan and main plot zoom', function() { .catch(failTest) .then(done); }); + + describe('with axis breaks', function() { + it('should compute correct range updates - x-axis case', function(done) { + function _assert(msg, xrng) { + expect(gd.layout.xaxis.range).toBeCloseToArray(xrng, 2, 'xrng - ' + msg); + } + + Plotly.plot(gd, [{ + mode: 'lines', + x: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + xaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + }, + dragmode: 'zoom' + }) + .then(function() { _assert('base', [0, 200]); }) + .then(doDrag('xy', 'nsew', 50, 0)) + // x range would be ~ [100, 118] w/o breaks + .then(function() { _assert('after x-only zoombox', [95, 98.148]); }) + .then(doDblClick('xy', 'nsew')) + .then(function() { _assert('back to base', [0, 200]); }) + .then(function() { return Plotly.relayout(gd, 'dragmode', 'pan'); }) + .then(doDrag('xy', 'nsew', 50, 0)) + // x range would be ~ [-18, 181] w/o breaks + .then(function() { _assert('after x-only pan', [-3.148, 196.851]); }) + .catch(failTest) + .then(done); + }); + + it('should compute correct range updates - y-axis case', function(done) { + function _assert(msg, yrng) { + expect(gd.layout.yaxis.range).toBeCloseToArray(yrng, 2, 'yrng - ' + msg); + } + + Plotly.plot(gd, [{ + mode: 'lines', + y: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + yaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ] + }, + dragmode: 'zoom' + }) + .then(function() { _assert('base', [-1.888, 201.888]); }) + .then(doDrag('xy', 'nsew', 0, 50)) + // y range would be ~ [62, 100] w/o breaks + .then(function() { _assert('after y-only zoombox', [10.004, 95.00]); }) + .then(doDblClick('xy', 'nsew')) + .then(function() { _assert('back to base', [-1.888, 201.888]); }) + .then(function() { return Plotly.relayout(gd, 'dragmode', 'pan'); }) + .then(doDrag('xy', 'nsew', 0, 50)) + // y range would be ~ [35, 239] w/o breaks + .then(function() { _assert('after y-only pan', [5.106, 208.884]); }) + .catch(failTest) + .then(done); + }); + }); }); describe('Event data:', function() { From d425373aad83310783ee6cf29ddb8146c6f55e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:46:51 -0500 Subject: [PATCH 08/23] do not show zeroline when it falls inside an axis break --- src/plots/cartesian/axes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 6f56281e939..07fdf4fe776 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -2849,6 +2849,7 @@ axes.shouldShowZeroLine = function(gd, ax, counterAxis) { (rng[0] * rng[1] <= 0) && ax.zeroline && (ax.type === 'linear' || ax.type === '-') && + !(ax.breaks && ax.maskBreaks(0) === BADNUM) && ( clipEnds(ax, 0) || !anyCounterAxLineAtZero(gd, ax, counterAxis, rng) || From 5f2fbe0722f65bc72aedcfcb3dcc9d1ad2f37399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:48:05 -0500 Subject: [PATCH 09/23] add axis breaks mocks - test breaks on x axes - test breaks on y axes - test date axes with patterns - test breaks with tickvals and ticktext - test for zeroline inside breaks --- test/image/baselines/axes_breaks-tickvals.png | Bin 0 -> 28126 bytes test/image/baselines/axes_breaks-values.png | Bin 0 -> 24286 bytes .../axes_breaks-weekends-weeknights.png | Bin 0 -> 17689 bytes test/image/baselines/axes_breaks.png | Bin 0 -> 37140 bytes test/image/mocks/axes_breaks-tickvals.json | 24 +++++++ test/image/mocks/axes_breaks-values.json | 21 ++++++ .../axes_breaks-weekends-weeknights.json | 33 +++++++++ test/image/mocks/axes_breaks.json | 65 ++++++++++++++++++ 8 files changed, 143 insertions(+) create mode 100644 test/image/baselines/axes_breaks-tickvals.png create mode 100644 test/image/baselines/axes_breaks-values.png create mode 100644 test/image/baselines/axes_breaks-weekends-weeknights.png create mode 100644 test/image/baselines/axes_breaks.png create mode 100644 test/image/mocks/axes_breaks-tickvals.json create mode 100644 test/image/mocks/axes_breaks-values.json create mode 100644 test/image/mocks/axes_breaks-weekends-weeknights.json create mode 100644 test/image/mocks/axes_breaks.json diff --git a/test/image/baselines/axes_breaks-tickvals.png b/test/image/baselines/axes_breaks-tickvals.png new file mode 100644 index 0000000000000000000000000000000000000000..ba22b0b9d2961e8b302ef11b5a59d6f4f4fc1f71 GIT binary patch literal 28126 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/axes_breaks-values.png b/test/image/baselines/axes_breaks-values.png new file mode 100644 index 0000000000000000000000000000000000000000..c998de4ce7131009ba2e909052ce744229e7e5ff GIT binary patch literal 24286 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 UcMJjFt*4NaR=kmZ{ob?x4}XgM!2kdN literal 0 HcmV?d00001 diff --git a/test/image/baselines/axes_breaks-weekends-weeknights.png b/test/image/baselines/axes_breaks-weekends-weeknights.png new file mode 100644 index 0000000000000000000000000000000000000000..fec2920693babb90da14d7b496b742900ee45c96 GIT binary patch literal 17689 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 literal 0 HcmV?d00001 diff --git a/test/image/baselines/axes_breaks.png b/test/image/baselines/axes_breaks.png new file mode 100644 index 0000000000000000000000000000000000000000..97f4217d55d58972868a1b7738cfb29e52cd6367 GIT binary patch literal 37140 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/axes_breaks-tickvals.json b/test/image/mocks/axes_breaks-tickvals.json new file mode 100644 index 00000000000..5157c692281 --- /dev/null +++ b/test/image/mocks/axes_breaks-tickvals.json @@ -0,0 +1,24 @@ +{ + "data": [ + { + "x": [ -20, 0, 10, 50, 90, 100, 150, 190, 200 ] + } + ], + "layout": { + "xaxis": { + "breaks": [ + { "bounds": [ -1, 90 ] }, + { "bounds": [ 101, 189 ] } + ], + "tickvals": [ -20, -10, 0, 10, 50, 90, 100, 150, 190, 200 ], + "ticktext": [ "(-20)", "(10)", "(0)" ], + "zeroline": true + }, + "title": { + "text": "Should not show x-axis zeroline
Should mask tickvals inside breaks
Should fill in ticktext correctly", + "font": {"size": 12}, + "x": 0, + "xref": "paper" + } + } +} diff --git a/test/image/mocks/axes_breaks-values.json b/test/image/mocks/axes_breaks-values.json new file mode 100644 index 00000000000..92fb240e3fe --- /dev/null +++ b/test/image/mocks/axes_breaks-values.json @@ -0,0 +1,21 @@ +{ + "data": [ + { + "x": [ + "2020-01-02 08:00", "2020-01-02 17:00", + "2020-01-03 08:00", "2020-01-03 17:00", + "2020-01-04 08:00", "2020-01-04 17:00", + "2020-01-05 08:00", "2020-01-05 17:00", + "2020-01-06 08:00", "2020-01-06 17:00", + "2020-01-07 08:00", "2020-01-07 17:00" + ] + } + ], + "layout": { + "xaxis": { + "breaks": [ + { "values": [ "2020-01-04", "2020-01-05" ] } + ] + } + } +} diff --git a/test/image/mocks/axes_breaks-weekends-weeknights.json b/test/image/mocks/axes_breaks-weekends-weeknights.json new file mode 100644 index 00000000000..3cef36b00cf --- /dev/null +++ b/test/image/mocks/axes_breaks-weekends-weeknights.json @@ -0,0 +1,33 @@ +{ + "data": [ + { + "x": [ + "2020-01-02 08:00", "2020-01-02 16:00", + "2020-01-03 08:00", "2020-01-03 16:00", + "2020-01-04 08:00", "2020-01-04 16:00", + "2020-01-05 08:00", "2020-01-05 16:00", + "2020-01-06 08:00", "2020-01-06 16:00", + "2020-01-07 08:00", "2020-01-07 16:00" + ] + } + ], + "layout": { + "xaxis": { + "breaks": [ + { + "pattern": "%w", + "bounds": [ 6, 0 ], + "operation": "[]" + }, + { + "pattern": "%H", + "bounds": [ 16, 8 ], + "operation": "()" + } + ] + }, + "hovermode": "closest", + "width": 600, + "height": 400 + } +} diff --git a/test/image/mocks/axes_breaks.json b/test/image/mocks/axes_breaks.json new file mode 100644 index 00000000000..491d966927a --- /dev/null +++ b/test/image/mocks/axes_breaks.json @@ -0,0 +1,65 @@ +{ + "data": [ + { + "y": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "xaxis": "x", + "yaxis": "y" + }, + { + "y": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "xaxis": "x2", + "yaxis": "y2" + }, + { + "x": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "xaxis": "x3", + "yaxis": "y3" + }, + { + "x": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "xaxis": "x4", + "yaxis": "y4" + } + ], + "layout": { + "grid": { "rows": 2, "columns": 2, "pattern": "independent" }, + "yaxis": { + "breaks": [ + { "bounds": [ 11, 89 ] }, + { "bounds": [ 101, 189 ] } + ] + }, + "xaxis3": { + "breaks": [ + { "bounds": [ 11, 89 ] }, + { "bounds": [ 101, 189 ] } + ] + }, + "shapes": [ + { + "type": "rect", + "y0": 11, "y1": 89, "yref": "y2", + "x0": 0.56, "x1": 1, "xref": "paper" + }, + { + "type": "rect", + "y0": 101, "y1": 189, "yref": "y2", + "x0": 0.56, "x1": 1, "xref": "paper" + }, + { + "type": "rect", + "x0": 11, "x1": 89, "xref": "x4", + "y0": 0, "y1": 0.5, "yref": "paper" + }, + { + "type": "rect", + "x0": 101, "x1": 189, "xref": "x4", + "y0": 0, "y1": 0.5, "yref": "paper" + } + ], + "showlegend": false, + "hovermode": "closest", + "width": 700, + "height": 600 + } +} From b5aaf92ce91e7f76101cfebd41ccfa101d747521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:48:23 -0500 Subject: [PATCH 10/23] add TODO for better "first tick" algo on date axes --- src/plots/cartesian/axes.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 07fdf4fe776..3f51a3f7367 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -739,6 +739,8 @@ axes.autoTicks = function(ax, roughDTick) { // being > half of the final unit - so precalculate twice the rough val var roughX2 = 2 * roughDTick; + // TODO find way to have 'better' first tick on axes with breaks + if(roughX2 > ONEAVGYEAR) { roughDTick /= ONEAVGYEAR; base = getBase(10); @@ -797,6 +799,9 @@ axes.autoTicks = function(ax, roughDTick) { ax.tick0 = 0; base = getBase(10); ax.dtick = roundDTick(roughDTick, base, roundBase10); + + // TODO having tick0 = 0 being insider a breaks does not seem + // to matter ... } // prevent infinite loops From 187c93afe4f210ceef20a1e67aa66d36109cfec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 3 Mar 2020 11:29:05 -0500 Subject: [PATCH 11/23] fix typo in comment --- src/plots/cartesian/set_convert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index b769f1aa63e..f65f7ed4740 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -526,7 +526,7 @@ module.exports = function setConvert(ax, fullLayout) { ax.domain = ax2.domain; } - // While transitions are occuring, occurring, we get a double-transform + // While transitions are occurring, we get a double-transform // issue if we transform the drawn layer *and* use the new axis range to // draw the data. This allows us to construct setConvert using the pre- // interaction values of the range: From ebca01bbd58c9d3cfda322f3879f54e314277541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 4 Mar 2020 16:11:37 -0500 Subject: [PATCH 12/23] fix axis breaks + rangeslider behavior - pass axis breaks to mock rangeslider figures - consider axis breaks in rangeslider d2p & p2d - add mocks + drag test --- src/components/rangeslider/draw.js | 69 +- .../baselines/axes_breaks-rangeslider.png | Bin 0 -> 60493 bytes test/image/mocks/axes_breaks-rangeslider.json | 2686 +++++++++++++++++ test/jasmine/tests/range_slider_test.js | 34 + 4 files changed, 2783 insertions(+), 6 deletions(-) create mode 100644 test/image/baselines/axes_breaks-rangeslider.png create mode 100644 test/image/mocks/axes_breaks-rangeslider.json diff --git a/src/components/rangeslider/draw.js b/src/components/rangeslider/draw.js index e857030cbb4..991484bc8c7 100644 --- a/src/components/rangeslider/draw.js +++ b/src/components/rangeslider/draw.js @@ -123,19 +123,68 @@ module.exports = function(gd) { // update data <--> pixel coordinate conversion methods - var range0 = axisOpts.r2l(opts.range[0]); - var range1 = axisOpts.r2l(opts.range[1]); - var dist = range1 - range0; + opts._rl = Lib.simpleMap(opts.range, axisOpts.r2l); + var rl0 = opts._rl[0]; + var rl1 = opts._rl[1]; + var drl = rl1 - rl0; opts.p2d = function(v) { - return (v / opts._width) * dist + range0; + return (v / opts._width) * drl + rl0; }; opts.d2p = function(v) { - return (v - range0) / dist * opts._width; + return (v - rl0) / drl * opts._width; }; - opts._rl = [range0, range1]; + if(axisOpts.breaks) { + var rsBreaks = axisOpts.locateBreaks(rl0, rl1); + + if(rsBreaks.length) { + var j, brk; + + var lBreaks = 0; + for(j = 0; j < rsBreaks.length; j++) { + brk = rsBreaks[j]; + lBreaks += (brk.max - brk.min); + } + + // compute slope and piecewise offsets + var m2 = opts._width / (rl1 - rl0 - lBreaks); + var _B = [-m2 * rl0]; + for(j = 0; j < rsBreaks.length; j++) { + brk = rsBreaks[j]; + _B.push(_B[_B.length - 1] - m2 * (brk.max - brk.min)); + } + + opts.d2p = function(v) { + var b = _B[0]; + for(var j = 0; j < rsBreaks.length; j++) { + var brk = rsBreaks[j]; + if(v >= brk.max) b = _B[j + 1]; + else if(v < brk.min) break; + } + return b + m2 * v; + }; + + // fill pixel (i.e. 'p') min/max here, + // to not have to loop through the _breaks twice during `p2d` + for(j = 0; j < rsBreaks.length; j++) { + brk = rsBreaks[j]; + brk.pmin = opts.d2p(brk.min); + brk.pmax = opts.d2p(brk.max); + } + + opts.p2d = function(v) { + var b = _B[0]; + for(var j = 0; j < rsBreaks.length; j++) { + var brk = rsBreaks[j]; + if(v >= brk.pmax) b = _B[j + 1]; + else if(v < brk.pmin) break; + } + return (v - b) / m2; + }; + } + } if(oppAxisRangeOpts.rangemode !== 'match') { var range0OppAxis = oppAxisOpts.r2l(oppAxisRangeOpts.range[0]); @@ -404,6 +453,10 @@ function drawRangePlot(rangeSlider, gd, axisOpts, opts) { _context: gd._context }; + if(axisOpts.breaks) { + mockFigure.layout.xaxis.breaks = axisOpts.breaks; + } + mockFigure.layout[oppAxisName] = { type: oppAxisOpts.type, domain: [0, 1], @@ -411,6 +464,10 @@ function drawRangePlot(rangeSlider, gd, axisOpts, opts) { calendar: oppAxisOpts.calendar }; + if(oppAxisOpts.breaks) { + mockFigure.layout[oppAxisName].breaks = oppAxisOpts.breaks; + } + Plots.supplyDefaults(mockFigure); var xa = mockFigure._fullLayout.xaxis; diff --git a/test/image/baselines/axes_breaks-rangeslider.png b/test/image/baselines/axes_breaks-rangeslider.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3302b7d82c2e427c91471a25fa881615942f3a GIT binary patch literal 60493 zcmeFY^;eW#+dd8qAtfN)DAFa}C8Z!KQo^8gBS;L*h#(*#E!`~)DK)@Ihk$g$P|`3U zou7;Qxu5sG-}PPV`xm@F&4M+vuYH~SjN?4cV~1&Js1V}O;Gv$&R3Jqa_#VbcpFe}iR!{@)L#7v!ODkc6W#YfhCI-_W=a zcoqNoxQ9gr@p|<4AAf&*ti>RJzm14T$(WqyE>^ z0-;Ik|9S?ntegQC0zo^`-k)y%uU!GlBG<(KXD@#}o_GT92`c0m<+}dQ?(ZHCZ1evA zZSy||_kY&>Ki~W(zLA8>bW;Ianm=c%o(4p&51K9KnvsAy>J{E4i&qGK3gN@@8qWa437 zx-4%wpN}w+pvYCkMW(Y>dM2O6zk)fd=q|)NsF|Rih~2OfJ9SMprI}j%<(aeUq$jrR zyo#p1Ad#yg&Q|!w`FdveknC+lXz0CzQXB>dS`aqjh;G;M_T(_kRQ6}4EMsRl`DlC+ zpVhzCN4x-XKu}SO5wh8pgOYaSWsIRQ`WQOfpC?&HFW(H)<=4_cPm2pP+ESfc!VcH^ zFUMzVYJ?s?eth-{+xp)NF--v(23y-j7?J8_Bika~!kCo%Nc+T2hSj7b@FT4~XW1Ao zyxHfpYq|6DE(Lgc%{1VeTrH7X9@v!28R~7Cr00FV%ahJTp4X^J(}1P6V0UaLj(t#4dD~)gFZI-OU ztjRy9aWd^rp=(F6C51fYB_MZpkLqE9inb(Qp1erkJvk+kIb(8a++;;BINlm>|MF0Q zn3fhFV?jGtc`1lU2EkJ|_hD>I7k)Bh54qf}8_s)9YGGj!+B%RXUQLX8a25Nx-8@=4 z#D22;p}08p?OC_%uX-1Ab)$pMf9G^eBfv?}*tvNcGQvHuz^-r4M5M{PjZLVG@xLIp zi{B8H-?u2{F=-S!{PU;MtP{`o&wwa~1umpeBRyRFJ(+&k&z~A6$YaH9J^B2~vHiDnntu-y{ zM8ko#F87++9HDQLvXVv)R=WB9uOOBDks}FQ`oD5jh|qiE z=}c%gTJ_6}EbA=d$iIH;Flltd4a_lq{O?$}04mQoEd6&{xeQ!#w52=Bz9EN>B>2Z) z53`%A`EB&#bZ@@$-O^J!aaYXu>x1OH1m1!A7k_lX*x-RtsNg@PNbU<6P+4Pt=|*BM z$kff34F>-}LrS}Ek!^gMBV@0cD$Mi`&-A}|uIR{=gbf6s23mReKh^Su_Fb%1sUdk{ z0_gQ~9^t9HMU7L?Yt!_oFD>5Qh*niqY2_&5lBmDk_?2CxTl@e7<7+1Y~3S?l8-k=+v7Mn=11%6Y5(h6{J^(9PX)gB zH2fd95lGH%2W*R?mSp{=>R)(6s{^nVj~Qri-tu3OomIqvK)fDPPP^>?mpjOjybOfa zg%XN+CjDbB187bGuzzh@mp#6JpXXn>?U4v_&g9>aB|HTHGD>ecM4jeBiDa*c*)%g0 zU%Vh-fFRM2Hip|5{*=A0TTb^}_z}yZModj@dwY%i5#+Mmfvc#fnB}%PQV+P=L3F?s zNLyQ5Nltk0(Lay;_!(GwNg$Tt;sD42cZUPnF00dO@^D0NULVR-NtbZn5eIv%ky}_> zuT*w3v;&XX#Dw#;oaOX*p6nRHFSbf;Cd=s?-M1-zm$;n%19q6w?)<56*ljdP+UMj= zR|GX=zxj0TBp&IxGgV0??)q4-+!zrN(#BPS&4}lue`K zM-UFbMGr9dDE;Jwrn(wRYnlu}-&PtzC7C{#?jf=f#$}1FDWTzI_<>eDknDK+a)=%Jf(drrlu@ zp4tBXBtB+YSw_pg_(})bpy>*rU_E4I#g2)I`SDH9-9#S-#)>p_bF0~sTJn9Xp>ba| zkvj}PH?ONw-JI8c|IRUPa7}c`Tu?S?@*td^o@O^~ffqdDHLedVDq`oi(tB~&Qc8n3 zb&K9~{&q>7V}A!^Fn%KDM~@5`KLe=G{s8^3&Wiwk!$~!FMF9UXKD#(W1-X8uW$KR& z_G@(ET>(5$7(6PM(1W05x8%{`1;LcCpIQo1L0;im#`IG`2B`00gWtQY8{yx9NQvqX zP*JxoRed#Th<-4N?Sa2kJj)Y! z;Mr0*R1gKPBi)*GsDAJ>ipG!7$)`ctIUEFVPDMNf3jrLRIN|eHKHBTMcTff1;iUx; zI3F<2=uBt|6(mxNA7TkSS=0VIDkWEVa?1pWreDbq3E@1R z`-=x?lh896hNi)PTlF(0YD9sfrHv8{)G zI#2Z2V|Z~jG7cK~67R5E1Y0!$$1IioRAuvyzVg{U+7Few zEwr|Mzy{*^6#UU`Y2g|6!V|`&M_6!jJ2dNPc4k%N?EB|Gk~~5q1VPTB1o36b|F#Jf z15A`&cZtf7#7L7SFqW|Y^wuH0tX`I2Iu9NvmRy1cf)yX)v>aC8fG@Vdkk%@Pu>kTf zEmT?g?6@sNE$i;>@<PAzRb2?I+AVgZOrR^fjz5( zLPdXmk~Kgyy}6{}o@${0IqiQ$uVX9G6MlnG<6*Mj$4lMU4VB{q!M2Lc!|;J4rN+LC z)4Hc+GK<2>=zL{#vGT!s_nRH0{!l0Gq>EX0#>~;IT8VJoGsK()BKda^I1f5W?yc~~ zFbpbMeB-RF$22e zu^`HBw7;m78WO1^aMXt@jKp zrxW+VaOawjSe+m`--%!3B^1!hfx)c3(&y%WS6luz29j3Pp0~Xva=bJx;2cO+qkQr2 zKhdFLr*z4#d#w27T_dRb&446V zC0ZHiUOVLIq`k>T3)I_tV39KFGuA`5*Zc&0*K`|MNMIyIYsXcV+oi8LxoK!6*f5Y zWtR>m;NyaHfLCrf1sf?mfJ~SDz=yg{Y(`lVo^)%sCQYxM0#xek`LVdm94<-DzI0-a^Lr$ zlX9xk90%;PE38J41yja+0I_yBqyDo}!o1YsH5_r&w>B)h@$#2$iFM?iD&)^-0_Km)&A31=zDUp(X7j6fa009b|3WGuYyN7q!YZ{tBh%ba< z^{gkvY_Uz~$3;fUx@cTU`YD8rd@Qbpo>?)t<8h+;U=G6X97cKsP$`e$gLXi|#ap)) z!3N7>5iIRI#D&+iiRBl#-s`MyfB4PcMpSwy@H9amEI;4qUip4qgIKDgyW1Rv{88_= z8Cx;q55Te$66P;uI{A2a2>S}vPGkUw@B_d)bRbm}zb@o$d&t}Ci{rMO%bn_>nLm+q z;yP%q0ESOkoQ|R*yLGI5Umb)6FCOPyf=tI2d5VZ45t8PAD9^Z=$vqjRBg0fgI4Bk- z%%PVzmW<5a>;;9sC4ru!R*0Hu#KdW!@Cpw-W*QK13`PHw!(M0WjU&_|6NdcD2m`KP zG5OGF?WAZ@ieoqW{AHVhxlf2Xn= z^K3-(&+mas>mdgC)nWg}cqt`=_r}B3-@iY+N%n>GZateY>8tZTwxbh!Cs!}jbM#Yi z2zk)WNcp7sPmljxmEDs*%lt4|Qzuz;eP>3xBj}OtTQHa*oSe%F;v>O#URbfCiVrKb z52`_d)5OTnBU8P8?>_v6%qH6Nl(;30H-AaZ~Yi$y<<;;n4kl(bNk1@?9=ao50UP__TW{RY=C0W`V zV_@b)RTI!~(FmHZtXT^`jFSdH6abnM8TjnXnKIC=?mrk%kiO25a&sR3YAB4gmFzfv zW9LXIJxjTNL*YkLr;^!4pH`LGBmMb7Cil~0Sj&Ufq#=JE_g_r~wyoXJ?>>s()2wff zQcQLs!%d$S%THmKB4i{A8NS=dU(<^rg@mEhut**f9S4{m&yU z@~t0Rb4@=~RT{Hiyk1rL)7bmO@eO7Mdkxu22f-vAw24PsbU* zX9XM=6wy?ZpZPWCC;kjt8$rJRW7H}y*V>loTq^_56Qnoc7VV44tjG=4$AHZ}R+)Tx zbnhHl?VM44R`sAs=6i`Y}k9Vx&s#Ma%}b(@5Geto4_PO;}+~R-#FbJ%VfVd*U;t;6)7RVN&^%NHiZ z*DEi}cY8R`Q+?y?)ENZsT(w< z-9Q(W#1kyRlIwzU)mXA2L`PeQxx8u1J>O19uMxqAX(DSOc>rd>pA(`KjF2{uC70haB-pYsn|X7D+s1X#paNOE%o!Yk}U&Hu6MROqJM3j z>Brg@K0Kn(zu3!9eii%Gv<)`kxSBFap%@= zk1m574G58Fy2mEQn*?wRr9C&<*no?<=3viGEhax)6w*h|mvPitZW8+m%E;*%TqG1a znRf73U%)k{ib##UAn!8e{Pgjoh@2UvPj%Wtw;pJr`V-WX=6xPEDVw$dhVzr-JX-Fx zKaT7GolYf#-E;FStYPv!|F0sX@==p|4Vh-3a{oh``|3|_Un#{@4) zFlCGQ;fxeWIkTf!dFZ0&xRTP0X)+|->7&09VlpdqJ*jm0p2w@T1CT^TbbGY%C7Bj7f!AG`w&UBA zCl7xCUL}iDOpNld!-X#@SGJ9ieD{C+*Zy|-B$5)h1XGgK7#m0r8p3MUmT%ZLOGW=ZO>uS`pveHs+DJW zxk@2oZwB5Vk6+F_MX1T--SEEVP6@g;_4{x%m|lTg*8XWC$&jGMDr@K9D)6|)J` zIo>Rl3<29ceZ)PjK8|00P~E!64gZ0;ur?d@R%f@Wuh=Py5u+S2yCmYWS}Cm>v?D5g zWs!%?*yMa2uc{BUwkB1{cl{jQ=5*U%r<@RYib%?Qvs@r8*Nlw_kf{>=ywLr~JDP_( z`7DS5Y4XQ3tM@HaD;{b_#stB|jIX{gK!+?9%Zqc9es*ej_?Bg>DRB%%r1ABjI;h8tM`7 zI?=5~Ep^+^PzrDf-|tCj$YI@a&c^dePUg$A%xA@Zq_IXU4{duF6C{R?vA4!?Wb~t= z3PAi)82gegh-qfk$AssVSsI;zrkx1dcVUEOK;NV#{)(~-QEF6D(Nv+e!H<)5ObOYf zmqPui`$EHxT#K|X7*qk=V@=aLKu9NXHfyxS)}Ft@jOy2he^%kZgVG#^bEWz#Rc_Yw z`PXRh;-4J5Hi8dwYi#&}-J=8z;_2`* zQQs*7N7;9s0B-)tJ5re47vkAM&-DnrK?G`Wdilc#1cJ7`;)UN2s~;q{$i@ z)Z?S`p-Z1H$4;zvr-^j}#Is|>#}(`OCLx2V=y2%d5UoJZG&LlMyS_}~?>3Nui2RTg zl0J8w7kt`BD0fKIXXQZD8%G3torKL9BwC&<5(y-r_yr!6PV)XDmW3sI44Q7&kh@gJ zhs4!gUcws;=gnvN(lrtL>l}PhL|AN#kM-$6gmC*V^w-v)s0kB0g-IXi9No_i2;0^= zSa~GTWRNF!4OX_#5hFw=KRx92Mi=n>+;{>Fae!JGp01_%duKn;7RYH|Y8U@NM;cQz zd9b6d`n%9!!GyeeREu)offiZQT^a+1DL@#wxk0o;0m-#PyZ!mgX{pRWJB;v!X=1#P zTz#oj3Dk3#j%7Qip|9152X2`BOwBMVIAD*{VTmWT@FPX;>Q+Ie70Wv*(v2}JgQlu1 z|7j8oFn%Va9kIPmNWHp40GFqj)1$v5RsaBQics?ry*X}`)!Oup8Zj14o!F38Rv91d zvTn%!c`$!6v9vf0pQ^({Ez7@2Strg-;eo?l25M{p%B%2*0jjTIN4Nx=L+9(PH@Ue! z4Oaur`?j~f^eE7I#0VDVCB%fsuO_hszhKrndNBAij=Kb^Pr<~~Yy>_1lmG0}je(+T z+zn$PK&XM%Pb5muH{Q}O*T)gX+ZH*+XLVn)@_<*~DaDfl!xcvTh>7=&jr_62*?nUp= zLI-rTuK>ldrj~OIs|JDKy3hzR#kb1BX=!#?*9r{)?V=o!!NyfkQ&b`~{yFe8n30I- z;FR>yH;Qu<&3*VG5{uKI+mWNxGIA22b7tvswlGn+`XV}?tiD!-@xsWGxnqa!!7FTFUKjlB*z=C} z2>P3rX+?0AHH}er7s(z9Xud7i=3+pc?Xww_#^;?3cwSR3r z4HG=mJMBq)vX~rb_*xG+;YyB*9#|pc+7H@CcY9osv`VG$1mJ9r`_*5sj>wsQr7@-z z0_}gzMhwy;#-_0nZE*lPrK6RvW`_{S(Cw?b|Z zj6~D|)dz4f852>$fD`04k=qesqWVJdsshk)z_tXV4I_5JF84Y`0QQyNE{X&2&odzou{EhDVo)5Yrh=Sb6ekfst-&dIrPB5}J z`^MdO#6cQae_o}}v;qP0s*h&!E##S{{)iTz!Nob)<-Q{A9sPSeUwp#s$byncKRMhFK;QP}5ca~wEuewe zGE+3*_Kejet1vRVpgu|>^Wg%qn1-1gc0qWVQ(5TyP(MV|XkepoVA|=plI1UfM2hP+ zfcF*%{cYNhupgwlqe6jma|b$1udA7xW-9o${jg#oJK+(2(#oez{bBt>l{`*t*w zcZn09|e8+B~QW`ycWxF@XSHiA|4Req5o5Y~V@2oAKPSp$`$kVTzzlFpGrUN5$wW%`JR?c zEt+G^w`bo4PGk-tWX(ztaL3#Iu%6~M3L%pjLX!0;3fG5Bp@9AbZN4TR-XK)tI8F%2 zTE6)T_vKBtshxL{G;e9X#pguLh)yPel&x)Mj0^1yc+P?c5T$mj-0w+%e6H|!$$mwM z@)+X!ygJl!fCoQf$ls6!SiLD&sb~AZ*V~?I52Sjl0Zy;`Y*;Hku}7SgA;6{GV5Bda zW_5sAPuo2gJO>A8CqKxf11=E@p9CQexP8Rm+oQ$!8b!ceGAJU(fL6>BZJ;#~FgpK#jgAL5G%aBAT5I}Rxk`Jq;oW4D z14gDVSk}89&RjZnNZP#IbA)93;{#YxpqE`~FK{x)$z6|XMXna8rtFrEICS;ZsJ_ML zNOk8k_VPtRjX8r=xd7kMi?;6dg$#pV0<#6RpmqDDUggv9Cnlt$QI9Tu8rGRsM49Md z!Q+4M>r$Un$9)b;U8O|LKt1XRZH73%Z1Z3VIDE!p76#Idy8?D09WZm<*fGNYyP)bL z)h{8Hq2ck3Zq@h9H$_p29O&>|_$@`IZ8VWn6U!4s|Nj_w4hy2RGet-}Wm?ItT-!<* zC$g&)v{k6h>Mcvr@%SE>v%?FP7Yk=$53D^DLawcNESA#UiQWm&59x1wZraYq zEWAPJ{#$=-Pf!q;GmW89^de~GT$;%S{sZ{{|B*?djEu=Fdw=O4?_)XFAjG|Ytl4n` zCo>RaVE3Taxv58wOPy43a8u&mzpk3y^KrE$1{zD$$Rf{%o^>$)ecii!qBDU7DV`cr z<%v0&HjdaLW^0il>M&JocKx)2P@B}clC4EZZgmYl<07FIL%IipCwmBSP98cgxkZ#1 zKCSuDa<%eY!3FNRf-(7VN-RqkYt7&ddQI)ShOP8HO(Q`&V|W5{QoOFy6uxpCFm}qW za&ZTaq%c1*mI_i^L=K+3z=H2NjT-lE+Gh}?cD@g_^rw0*!SlyZvNmct1*%x zE;k9wP&O+*m?#|x*~QFHUJ@(1l3w6ymbCc%Kj0jDJPXhep=_@xbmkHBy+sgQ@y&mDGIkSDdYgpwGR86*wwL-BlB0b zyXm3E!$-7`VrLXb~>EHR}pl%a5YOS8X*><>ms14L=Z`l!_*a+1Xsitc~`O|kcK--|5YXbt~y$94~ z%bzQh?b-16KU}Jr%Xy?MkH~dn#;FDIJPzkY=FjKJ#PZ_vC2UfazfgYu3j==GU;C7h zCGYDe3kj4Fw+;y8ycG6msNvMgl7vx@Y&```x7$U{*f!XHWr;jK#>D%1$N1;kv&WZE zL+E)*?^A&55I#$-;V~g|=Vr8*&P%l}&|l*(&$JqHwmP4X;jKKtbF@GTyT-4s?%mA> zsotR}9xkQN?XpJ5UP@2I7f1ihtyRZaz?z-BmlXaqbv2K*T$@0|?^BK8ErpzBFIS%0 zmm`wjKi!bEcc;4WfmY`OZ)exe)gog&vqUe>UPAyyi~X9|h-r^(n(s1A!&yJI7i_lA z3`rPR#2IdZeDzT0D_G|q#56fjyS1DvR8td2TAM~v_k0o`C2_vi7pLM!WovAC+-R## zh$^QpG)MqZ$FRRx|1jaikFtC9bM{y!&~vQa{mJ#JU0%|+@R}D`G(mPt03KAFVn8!% zpQFjk^AAQJPi5NN!$AvQSL^kdKiC;4I$WfTnPejA^yULm49FYxxh?|SgIhjhd^Cvp z1rGT0xfVaF5ocjlvz0^4p)>t53KM+T+~fx4_!yWZQ=doF7;`ECaz-1|HGK?%d6%{A z_B}<|zkXHA*s}_PysV0Tw6@Un#mxujv9Jx8DSD950u1#WP(?O-2BtX-QGju0oJ2H7 zV|p9(d7&~FxoYwE>#_;F1KJ)yqUj|=0Kp-e&*`3$t}dC?U|N`J0_PGi!TKuU&Uv3v zCIVpX%>We@Am)Rb9MMa9y!r6~OAL^`nVFk+*2Wj5)h&4A1JWL4Kne8((CBG{vsdxp zWaG&EB@E)1GK(Q~5_+AjuB|`zbjB+VEJ(*BQ@NgIXyusWOQ(-VJ|Bm2O>g*{Yo@Vl zD;w_%KK)SUqQOhZEAx#ER6nhfd57KQ3NNASj&JoHCYwhJId0r7s0a1GeRj?DD8d1s zBef1X?f!OFSSEsNp88%Ot}m_!t~bbH*An0P*P>z0-K_L(l!*yHZk_!YBk8ZAHy!(x zQD4D9_a#1jssY5r9_6g}i@rPbX|AU|Uf3o%5Z}}(Kl{UqzUnA=fg8qn^c%)n_RF5g z=s77&q3_@6l6=qJ5zq+T1Ef+EDkptMN28j|92~fSeH4|Iu?t=#fAISAJKLf+cBenb(e%1I^oa`?$_V)JHuS7|rIw?&95ofiN;6H?Lv=Q$c6Ewc`S(87k zS(+!RbmhO$oY#d&Dm^LP9C+WvrL9Y|zJ3gi&vmRU?hbnNp*`2-R7}Mc^<|nARj@M~ zf_3{k2q1Iw3>0 zgRPNe7wr^uB_{L=A_ZP`s6I=1>V;2NsEu|t28X9HPZ`q6HkAsjH~|fXcJG-zP=O|e zbX6bUiW(oKv!eq&;V6!y>y z0j5n~VuKR{C;3SXj(2A%f$3iLt@mN%dADFc(Fs~i#$zt3~+SRP85q8 zlbYiyKTS}f?Gi3zEz;ta(`kml5T-%aO~-fZ-9!&b$~1_Yg43<_|A~(4QC$p=x3|V( z8g>2h@=U0YMIokG>gSIK2>a}30InQFT&^y|p2(I0tsM$L= z9fZTu7g)1JEBy(;z{EiGfJeM6wp$0ses~MXW%db39;05C`^)?5FJe91T5L5 zF;@Xv&`rmbKDw@kkiL!XuyW)-uJP!gM|ifm0}a1iZ}o85k`+wDTs zq`J%5X|nP%zVH-+%QxhbPAUD=VJ^*m=f+BQ`L_Yf?|ltXkO$FwLU~_*9&ajQM%^V z)>G(wKWyCGgzjW`@tm*lV68WeXvl5`pBI6A*I&q!xa;^@uLQi0w}LPCTTKy;LmATY zd-%YZi%QbtTi{#}4$(3K3Tn%jFR;$=!j6``sSn(Q!=*0wnPpQx^+f+(nIY9&o*@Nw z?th;5Oga;Fo+k&UGkd6?2u95Ch$dDpHgVmGDKw#EH1E{Uv;|ggMHZ$!<{kk&Wkq zU~8!ztDo_&{?Bu&80mD~ZI$IcW0NGw7a=7w*o~2Z>hez4633;HwLPXIGvG;6J(3S< zg_;3VII8;9?WYuA&r`H{eYb!$*#q+ONu53MNwP{$@|+eg60y>>8pS`!ziVYTf#DiE z7%m3n<=>k8=>2M^6n;CSX?TT-T#lFcudMMxIGTJ7l%Xr%|NHl6nP&_#P zc~5ai_0M!-k!Ge`$HI91gd;_{@Fq)mR?FT`iF?zcr83q+pRII4DnQ_wP~|-W7Z+8s zkMm8Q=Do2jU!}YR?$b*=o+Is9gNl?62L&6`7}eU{O{(6Gm%KW8u9o;F#Td|YcLCF% zCr)!>m&7so5I~PXV_rB8MrxY4V9?EvP_f> z=Nfr{pE98J-6H3zs8fk|37KgtMW@I&CGaPWdT(d8 zVG3M$6|p2Lw$)|L)qqNW6c@rca81oTbRAk+CmpU9HVU6GIh+m1?uhcLA8}yftqV|k zCAk^=g2-#em}+BHj3UaN{MJicwT${R+&lf<0n`iX6f${;%l;f+lSuO=t@ZoOY<~PM zNaSl-#-OBfPE5EPUju6+Y~!Z!*UHP)Nt-q8g3$hTZL>eKW*It-dgYB@Cl?MOqf)Z6 zrfBgA-JfTuocL6|tu{6(*Rm^f_^a)5tmWz>lVXfU-)9?il|MyDHngJ&73b`-q`7kS zOuhBu+bep0b`cBiJ`r`T(Z?-aLH`+3mnnUwuvu(r-VkVD{$@~#0c*J^iNib^VGw(l zHC3ccLg{_F7im~+HJ!_+RTBaze6yd&v3?bCqygj_(lMC~UxB0V{>12SQXrdKS&ets5w|y4D_Sw7iI)Ju7>SRIiU^ zd0HH1`Q|YCC{Z`<+wT-<8(zXF8504GDu)Ol8&#+&{2<6)lWO&YNDt`K{2^D^nE>;* z_O>S7jDMNRmk%<)2KVt2Vuw?kDcQQ(qK^IZTl!BEcPntqT&V!?n=rGWK=$2D{>B7j zqqFNEKQ)21p{1@yBp#+Rh3;%*loI&zgRZMB)35vuJc}O*VSmk2vjTeEp${CNO1dm# z_Lx9fQD6DZiKJg)d*kfftbdg)i&ljC#HjRc`K95YhKUDdq_P^v#y2>_){GW&z}BvXG5GW*%@WvJPFmZ>3`%NHNXb6Ltf zc4u${Od8x2k;j9Q`}aOSfx2eO_`O^7I}H=)i9U@KT_Bb-uC`KNT99+`#?O~S+aFoz zv!bPTdfqRELW3W5vYXHvLz5U7PWV(yJ};A(dm$Vn?_*>J-BfI~1c_|PgMY)A&$>>vqu2|^srbU6`jLn(({_YCydYaACmXRH zE#J#Z1#&L>N%t``cv5#0gbsgc$LU1KX*NT#)ue&UcTMwvd*hw28azz@rmP1}7^b$+ z>qmnr-PNuVOmLEdZbz@b(5)Mj=YY2*(A0W)h$w#B;5k(36jdduQKNzTq z$7^l2)#S2}vht@3*q?t34tzRd$$&lTcMeWzD`c$QR~|EA7WyP8VAgWR88oAk`rcOd zsTd3P!aEvuM?Zct$T-z|Um;Cl)I=F9&B_RdbkpaQ;JOq78;BA`JAs4pzTS!hvOT95 z{2b{9Nj;NPU!{w!3OCy)j*5}k;D9-5xL{ zFQN2_Rn9KF{Fi!d z76NhlG2e((9GQPjA`f0QVtFFI7QpT^PH__torH-GBDRx!d6OeC!LmVbKPOH*2}!hw zUC&@04T(7bx=q&?Fk`TbiI~g6b+J&Dk3cxI@EM_hnvOX&vi8{>TX2d{d#~$I?v{js z1z*S@bPLFkj!?6%))H`R2}S3QRZe1HW|ZCQ(;7Wg9(o z0LbYrw1xE>T!-CUi!qu;&6Tryu+!<%ybO+kAlSv8DZnSPQ22bBAbR>0h)>%29vXoJ zlvnFIW(|-$8@=65Q*kh9gEF`_abjF*I8@<|a?~ zF{%WvX3tjFea(>L_u+yUZt{mQbw9Dd5)EqQZd5xsEw^KtUu!L~w)7gQd&?L{gxZDB zVRPS3kv?dS6V>m`khLfzX1(nL;$j+CubgH!Kx(-3+k3{YV5O^9(^M1l@uw7D3_cUC zX#_U>QQ|wrkM)I{I%#RxnXrewHk2!5xfBVB?i-%HG;#f_&BFP(;EVBGuVEX~ zNtz=4#jmipvh&nM>WRQWQxRb4-Lb(l*;2CQ-sq@>X}mLA{CDpOkzbcb?WvLZUC&Bm zWXqrN4&`N`!LG7+UTGLY1uCwUWy~xM3E)sIVWB=DOvttPk1-|IfWXPhB34W1j&Ik_ z?5(a>?_?{8AlJgkI=>5qj8KR$dl^6l=~yubPKFNHF$C&I2lwzsOH#$}5ma8J->74O zC(YUNEt`k0=qvfT{0HHr?ovMu*efJuU9O+S0&A!gxwFCAX{<(dYqv zfsF04kDT~AoMfLw(e%I=3r8F)cp|&D6^BLNQ4)>jU+jZYayx?ZDx2&8^*`C-Y6;Mo znbKAYA8B);3jE*(AC2AA=T~MPi3?9R_vh9e+SQ*5yJhzn_aW?8wP?}d$_{$?n5ae{ zIVvQ`k^`C0&D<@bcLh;@cGoSc-L6AuvLuo8$M5J}9@t|zIq>E zNB6!CN0Z87?fNEqUhK(n0uqg{;Saa4H7JW>6VUeGk*qWT7bm^VF;;-x8-W2nNSl>@ zIW094knl%dlmJen-0=svUl7t`!=*TYKb}McBS{^{K!=aGDrJA}k&TI!EksPuPzfRP zFIG2=br^wm`FdgXuAgNHJcUVhR$bPKz1jTafzQ_&l`-BD4os_Q6;3jw!f92zvs`v~ zQhaCUFrgq ze&n}46$B)v4@kJlCQXsTcGX5qfs^Fe*V0&nB?x=hyWC2I@bSqx#0mEn@F=2(aAdeC z27mTPhppg`ZGMy|AHt4S!S7dpgI$je=!VxmiTM4D4W3C)cpl8~1Gsr1YM}ZW#-I>5 z>C$pZ9bhDgY7s!s^*336{O!77rI+bs$QsJ1GyQ3DXtM_xr3Y$EU!#Lva|(Mk`nUW; zo>$iOT8^fmNJgk8dWr)cVE5uF-ZWud*YN~(eHJcP0R-jZvHxTnLzzP!PNYu4}x-IQjIiH-fwJp4+Yw zK1QiRDx5Evk;3N;S`Q_G3(a@p?lVHTtNX~%rA|pH9z@o(#JA{W4?l2?hm{osiy0|J z2Tvy9^3caB1-D3WJl47$_ealr=^23yp7sbIeO_UY0JZBP%XD6$({>xcSyh1SGmZ@> z%YL||ny87)uTNV3b`incvo%W;=M3kaV_tpBt;>Z~Ss3r$z5C2-2fd?9S5XJV;#Aud zpWsJhYIPN8NA9GU)LP5w8z!%}@D$J?R0Mhm_v*)E*CFhY_dSFi$KC_;2Zr%B=4et> zBK*}R**vLT+z&>#l0f}Nvj+5qJZw)h;9h$lhf9Vr%~V^dhg&na8(|+B@%?EH2Hztx zdpwp8-8j~?J{i|vv!C@#1s<_RejE>X;%trmC~p{=Ibp)trHdpd>XRQNQj5ErXK}`< zVOtg6GAx$szeUwF%hjOm=k1?n0Z8e<){OS&w|4`ZNAe{q82fo50qrSUBKy5%4%9J!5r{&>I%zWEFRjyBZ)6krmcQ^-g6xm%3Jme3x3G(ZZ2zU zGN}FRCxB1wX*gLV&|w*`)Nm89>7T6fp(J)`zw9ZNy zsySf|2uf6*_YU42oCGxK%H7A`EDb-%-t_*Cf`=8WS&7~&OF|tMEI;Ujor{L*R}+@c zk?wP8D#S?VoKI5|(|tG?>2KDQB=27Oc*AoK4IcgbCL(6tzr$OojZeIeNo4(jmB`Ds z&+7XUbjQv`tlV85NJl+Nd>UO2;P&qo1TCyJlbCjCE3-KeAe@2g)Pb;@Qbq_zp)qxK zG{X#{U}Qbrn3}@DlxvHkJIZP1<*%sX>KI=O!Kn2#d8-p!7QM<;ayn-~L9+3u&Pk~` zr4?=M20LQDWK5oR@7@TZLFd8giAz!@RFt?RL^&Bqpnk_W*iR(dzudnB!Gm+!02>Lg zX5hUAO6qJuA7|azE`;)E;s~RJ)YTC_?+NqP(yLW$0ddP7HvnAA z7vy1)&`BlNZa^5prq2kzNY6~Ad3^7Ark0czsaUl}7(!l8ka5$yeK2(6I1JYR;@sy+ zp#GK${Sg&q($jwT?NBz-)aAV*KPTwvaC0(M@=4RLFkip8QGb=w=41?yO|}bFhD6vL z^qRa6jdW3YylXvLT@&P^Cn=iAW zG4BTi5NheMZ0pTeOcgGw5Ak8wLG9S^cuPR>h4Kr2;DKMEf**5~9Jd_v8q^>v_E;UE zc5Wk{kd5Rgv3;;wv6^L0Z?vKtV?YZb|{!C20dk-795!A`@J*>gSOja%JX{V#)j!KpoD3??-0s<&~KfHMW}|( z7sm4!nCnKy98N8d;BBbcSrS?L_bawFebs>MHO=~zZkgg2D6WlkQf?GZxEbGghA z^kI!a>NK~$S`^Bfc%B8}dV|F1r0-wO?gcJ+u3VeDab078Hw(!*t1x zaMJvzjB|T>dOJe|=J)%ac)xgBEcMsja(YK#5Q+xR??5^^)q!d9?qy_u5&3VTgKA%~8uf5i~@9Vn0E8#n-Xhj`J<=wjB@@|o} z$<|*h;Plv9+4}f*#0C6n?p(_WZ~-6Qd0_&lqwWHU4zq%e=Yh-;5`2gq#k)mz%p}TGxpxtKco9_=@#i;*%eZbzf>g#+-Ya!KMqch-=T9 z%OX9yw8bm8qVnC3N_1~Zq`VjV$gl5Y8R=$E3MLHZ)LLc*Qh+R`1dEbm?5eyHv;ROq zi7ZR+L4oaBhjzUJJ)lv$BUO`9CI0Z{d@;;rA$s=vbr+nz`dMN5^23R;!36_2(qn}@ zPQ~_cj(@KH6MNg!7#DIVgQ3D`gaxC>&%L2;r6e%T>6|Reka4M~mO+(&h7Glm4l$x) zpC*NUG!IBP)?u@n_c{%%{D_atC&>iP?3tm{SkVsJKMMo#)5+QT+Xt>De-S7iDK0*~ z@+ic3(z`TH4>*`H80IJ+A(kTSdwAecOQi^&O+Jk;fwQpk<3m@+aSS`pEF76a*FQC=;oN6X_==e5Ln*aL+-& zqvSe}tN6n??qjI)6d~+5Y|NaV0odm@`)_#^b6j#TS@kI}Tz?ZLw}p$K{L#Q5n(CDO z+E1201{fCUy!P}Y2_e>2kEHWHlZ|#*4ZHys|M|ZD>&$}79216cvzXpolSyG@7-*oV zHvH=+BTCd*#0dSG|Jw{^z}Fyc0wKRUT2YC6yGIJ)iD-HBT#Sn}v_3VYJ{5THJ>rTl zN(yo$MvnSc-snj_r$n{QQ(p2>&KObt8f$}hmaOKzTGD?JAczg#Pyh6cxS@mzA;bB7 z72VAyei9oK!uao9m9HZAFgx&lG09Up1N$!s=41qNGNLp?0`^rl@kY?$aYX~W#Dz%C zBv3!M?2@nVf;SUtc?-hJHTm&iYfk>#3<~lAlC}twcH|>$+8(9e^?k3W2Z#XNv)2We z^(cInMcqe~9X*mpUs4kj!?s*5b}+!c8SKu^KGAT+!e6Z;#1>f2lk@Wcu1j{swV4~2Hq3A+c_AjU$zU+1NKLVCD zqJ+`rPft+(=!mTOP*u-Gj0#{TmBUT%UkYxNE#isgk+%qz$khGW{#nN(p2Ts8cA2%E zRRtWot}OL_@K)CwsBLtS)>?vZWqM;7qX6yF8c=qWJ$X0F8W5e^3#BI!lR)RYjSI&At^ExcyJ+V3pV~|eT`k?GfS$K;&^+NJG@Oz(LY=i^&&($s!T-Z1jw&O z2Va`!;X%S`m2>eSU9Q~9)$0FO4400Sl=M8*?|Qp1At~u&ETb$NJ3EGc!OISq--%B3 zyXXJJ0iBi>(73`KCyVir`8ZDZcee?dnbEQbjTjbzM_4|4GojO9&zTXc<=p>F_oJaq zpH^xa<=56fvGHK%TWIenAHN+VfSuOeYiC-m*Zo$a0A@*sY?$$N{HKPAYzv(|>G|X0 z3~nNV`U*;Q$^i|cSU6vtDiyt>RR9GD3=}2l?3iVz&+Y~8LQ+K+`~wt5s~zqq;k$=C zcYCo^50ksYp8{wKYC1Sg0^?mT(7aCjY0r)R0-zg^Nuc%oN4*E)M=#JSteXR`M6S>G zqW~>_HbmZiMP(u2u+@IHI{$JJkm-+r6losdCee8HiW=SmBuEFd<>|)@Ur|rTV>SMN zab0>St8hJ#5`PLcS}kDg3QbKH6iB0zKKi2v=SyAaSC;PfQBJFBh#MX|MXSg=lURO1 zRq)-6Xu<`fyS;!B(m$M$;?nxlX}y@WdQ9LCr2z@Y7c{-xl>Mc2Xzhm}zXk-d$e{IPBb^2p^Sy;8@>)5D|67IsxAo}v z>mofYfGJdoW?YR%LN7tMMwXD0!U^^L-$T7*>}t`9K&)5b=@<|sLaQ(%)5psogB0~{ zn}_qc>)%$Pz7%d-BC~o^q$4|lAwI?4Y8*cCz5wDX= zme0KA9Y@2K95KLnH}CTEV+6c3FmFdle2+FZqTS3`$Kj#!zi$j>5De@C z*}G_PtN(It1XJe&zY1WO;q$pUIuB|7@QtXF_&q`e zN@sV&{#o+PxdnHXbvDOFb_wpm0i}f}%givn#lHK6Z^_e|v(x@xa;sCreE=hX<)FX> z(z>b`*E9EhG1*o1fP6Q)7~w44!BCNwmIgiNSRfz)Jm4|*Ykwb6Q*-sY0A#W^)$i~) zUu8!Fa3#D8Ob@@DA;))D0AFk_M=fLQ!B&JG5esjz?806imwiys%~&*rjYH_g9Wm4Q zUTb5ny>5H{+e$-7@LCE_?Tf!HCYw(_>-~^%BSH*4fqCc|5VcjE^xMT3ilWY-6iV?r z!3l}jHB6FT=Mi{e8lmd26#4X(79ATgA@@`h<%mDC2fOCmz|H}UVL9%*w&i}wMXG01 zT|mNDDhN%5;Tm0+*_(W-1!k9YW6P0#C}x|lnM(YId`vW?YbNO;%gd|mrK3mdALrl9 znRJ!)m%M2TUp4QpMPEegOEj)*?7*w?R-PI?y~CYaFuV@w}ptZByP+-6;?{uBS*n9DKxf;p&^QV49OS)XIB$;^EU z9-FJk5g%Fm(p#DxlVyxE`uLm*Ha>e&tlf<;jJ&QDDwo`gzEOXQZ(p+gP3t0cH8@w% z(B5X%Fz5RHyQcqyz5h!^2UmTGm+b^x8mOI;zf|J>Zvm>4j^aVOxKpLqww~;}5zQ=? zQneVm&ScBET8D@9v5Mbm!12*7zz`51`s(quQZsB|Uzy9E@xex;t85_6FxiY8GEx}{ znd5%<%4627hezJUoQ}zbP)s`d^sAw8kq@)G4jPA{E*(RLpybFmhK~y(fe~zswq=ye+aZWz^Is{m zRiE*6FVEbsK_5#`Xd{g3wVTBZity#`MHJ~}c$%2Ji(jXqS@a1Kp;OKL=qd4Wz}5SR z{q?gs9lwn6f*9W(G&Rr_Pa99K-%%q+bCePwpxGWOIKR!1^%dN*z*pKxXAl6SW39I@ z+ge3lbO8&}(MHCBfY)n!f1s>oUqOS79dBUfjlI(A5pHjTN?wIOw!3s67b~oM7aNi) z%wbr|9`88<)U?4vn8E0X_!Uh}beP?6&YPtJ?Nq_Y67=hYe&X_jw^QO9H9|=9Ih-87 zqRs|0QIuYo>|%vt1teoW@V8dBZ}}=5zUyQgzPV(GQPE4(clWCY5S{%yhUkG5`LXWf zaKMD5$30u`Y`WZ_Iq-(UBl?Hb$p7S%eKj#-;hHuKa*#)^up?~kOsP=d1>;|Y&&@c%(XvL+CttRvFBru(`GXkIy{?gzXiH{>iggmw@2z5|7~cj*N0nvP}971Smau z4eGnPwM%PMW=?XokMujUrM5?SeTz@71po7?a3}<1O18O#z8g707xU@zR2y~Sv z(GTyw*a%nZ>$@LC6Ftqd{gk1z-2n!&%y4m&uvH~&*#_(0^0UZaUKl^(m>W#bVCb&@ zv8FrMOrVHK)HBB97mz=hCM&ej>+DNq;R0wkVae2>GsMKm@C3H*p)R z=R-M0tMAw7Vm}~UppmR^J~|?a9wt~kFal084A-sbX*S9Bsnkk& zy`l@T+baT=p?aRr{BEm#cqJ}>2!>f!fJSh$7Zcl~P$1u8fG*^0n=$JBaX#D+3#|S` zuPU?5sq^ypJ3M5aqLc_vA{UU#aHAjNqYjLR9M9Gd?5}t>0>b0(ra;m&*V6DUvU;Kq zJ`E{!@GU~at`a&3qgenxqXKJc1O@}#!Z6}Jkg9XkQvJfl%A`?jN zSnCg!cBoNTc)sFG2~9NDc+j7c(cve^-TJQbF#wVxpo6af>I`=| zrqm}D3kP|-oKnuM4|}|`s6zxuz#j8Yz6%m1MIj?^c(;E~v$(z$WrT#iZ$0uZY{5cg z2PJ&H;?r|n`uOwp^S=s>2>hfBGIRD;PvaAbwy+Rohm;J8y8m2yygvoj^K38tw8us1-Re66 z*-ngFhw+bFEdR?|iSGJ{T?`<2PsstN&$6Sj1(S!vJkSi{=MK`Pc*3$8seoi$!sc$G z=MnaO8&X2bWKR2z&(IXolQ`wWjdt76o9{A2&Z7wDBiVI}mfR(U2-rK+VhAxB?$VTN zXB!l#+HcDs(+Yt+!p)mNW&w`b3UNZndY|E=mGt6mZj1`LrTCOy~Ma37xjOYkB;c9M#NZTBiQaA?ujj%Vshhy`tBzv~btt z_{o2L-)DF*&dZD%64$LkA%N*d%V#bCfToCH=QgLp&k_Q=Y|vp<)Pi}Ai?@;OnV-l1 z?O6WK5{Ngfe{7rFh~;?_%MMslbQ8!?GA56=b8wjpt#pF{r$A%q(CCH!^!uZ%e*08x zEh+@dVcU6GI034-AGu2h()`k$GyY@O1ZD|$65gkU1Zn+5-L$+yid$xj0EG?U(jdyJ z8k^Ju)_-W~i|4=6S)ms(UxDDrP2R5w7UDCfi9Q0SO;-7nhE8}1duF07GT+2Te$A8? zNj~!d9rh~tya0Det-n8F`bex=&D?8|M9t2l8bxQ`h`vsX4dZER_n`fxA5>~(A1r;Pc&FGaL6&au|N>(jkY)mKMqp*B@m4QmGix5 zFT$S-nLKbyH7lhW!!H7Nx`-()3N-kZ38?r?XoyJgg7;>thpo@^Dp`S#|w~OuF_i5w9;LRKI`zi z`Ie{KCulsNL#DI^=#tx{#P83Dd|0{!<73jt14^lXsC?5UpDe0C{vulb@$7%ATwgfM zuQ#xSF*E3zfE0&KpXALJe`sNt@C2?6O8h^IJzEd3xi#UFuEkklBOZN|Ljyh#yHc;Z zB!FW0K5BzSz{bxKDDK3AaHs~q|73!AoA};hgL$D6Rk~tf@+C>kFW#;1x8wIe4dM!n zA?T?$WK96r1VC&BLhjP_D|}tm`}M_Az62EyvQFpWv_T~4Ok)o8n!NYEJy8a>A9e#m zZQB1t^=nN4{-ehCHVg;->LEI>at=Na9pSk2#oE#T*6h zgAzS0lhg_|r*!E#51UMSCU#8(x+a=hXj4RUjax4n*%%)GA>blO zlK$u=xa^6g&2o@0FX|a@d~%W3(qw+e(c?xOyOLyX7QmZ@t@3(+8h9dFCZTVUbvLzD zk`HH>|H54w{#FyZtmCW7nNZCEV-PmVk4h)*ALdm{zP;|Be35A&S30mj;!<558JrQNkLCpB?{QS*6%%bP;R;tMOFdlGnz8!m6LqI^dGuH zAV60Lot~Kh_MMo-kcm<-a1dCf=m~<7sj6=^sTlR3qk|nk4_%WIB9nzU)S1ov%-kMY z*uwklvN}Z|@O30h$UCCtMX%2l?D`2HuwRn+)kl4MDRQ83`gtYeO`Q=^oK-ojk}Fd_ z3V^o*Xwgm;n?^@*0PPLStYkUaOOO_C=8fx)7c#nL%T$G)6`8!3Shr4?8NIrXG0Ukkvz1 ztp{eQ{Sm+{?Inr_PA<*3Z4Bl#FOo6*gMT#2UM2vfzLvP2+@nxAWO+T@NkO@!X*+_B z8SG1ic;y=sAznglJ@NOM{a5eTNtqK37#=`>=U)C!hZuO;9wacTP=4PolQrn{rS~p9Kj_B9e4Gy$I(YrV_qb5W%XFMNHEi(eS^+s+4{$5tzn5%-e+p$u zHKQSvT4QB_%i3~3YGsO)iN%O;Rc(D*j_%b6uM}4NQGW^Z5B2Rh7uR@oMKLZ(@qW!| zzNRk74Pd7v^Y<`zB`(#vca@auH`|Up z4`|f|TMyvHsII)rS%1>Si-(Kyu}2q^CroPBL4!@K6bwNf=6vRH@F7cbq@StiB`E7r zOkkW+T9P+=Z~)4vN(|A$B>4S=h|sW8C>^;u3@@=} z(fZQ~clwIzC6Fbw`UT>c2i12w;V~1yAwFX2h*5sj-k`R z{&N$vih-h#8WeG3Ya&^`<>*2uyk*~c9Q@AFRyzR$Or9DGlrDoB%+n)%?E9im-irS* z*V4|=Z;5qlQwioDb=_W5|DYeUkHUpU4Lz@k)>G_70F5U(Ti zrN)kxz_l!Kh3nRevHPCl4U#ei1=zuNoR5O>Ak^33BJDI2xkC!kl1l@u zcgW`y|I5L@wYj`;jFe?_RZxAd%HL#z+d{81wGr$q^i=%yHe@96H<3K+@L z6a~_9QPbo&d0u%^EHb^;VXejx&vG-B%}+v+uy8cjB|Lai`U_LeOnn|JHz7U`IA5=_ z^!4nZuqE+GxIf3dqTU(=uZGBbVJ!d-vWI+Vq-aP>F*qC$1E!~z< z_<^smSN>h{n%pc3puR?7%5&LII%kp%%ccQ5&osw>MgTK56!2i14 zZCAVfeBZmRwy9I(!D$xS5YlUj-gZ9pPJ$ZqRk0tSV^n*B5ZV{)g|93IZ=4DA&Rx2I zN;Ayr$ZC_=j=!xu~?bSz2&OnNqaUVJ<)C1qE1^iUm;-raD3otvnfhin@_G*kX2VuM14k^Be_ z+8??AQcZoC(w=TNm+lW#Nq{YHKUZ6H9eV~l{=+Bbv4-n7T^=KB-TUj>Di;^k`yrVj zNDL1ai2KvkEGB!E(_Z$kG45l7KkhkZi|-eHs#6U9Z7+Z1Z(HUIa^=-#EequFT6BL> z4JTk(N60=oSPJ@kSETdluQRY+dWvLeacW%2gdGDA4jQ4Nd1a`i3Ua-ZRmN>>;E!0; zQS4~aBbRRlp{d3$Z*Jb*y5Yr{T$k7Zj5iK7bi^a=H15OnUFZeCN5y}A*nS^e>oon> z<}5LS$sZR0Wj;$4G_M4Dl7PI!blCP!@CyackGB`;PUR02>nfK;8M*tLlS`n@<$koH zdb&GJ0su_yCyOZ+Zcp_~jcc%n zRvmabm?^A{?s`nrGxAh)5)a1HGhE_GPQnx=h2mWDB=|afyH5`(5gSjbyLHq(e=NgT z+PM{q-(Y_77)6#8{H>TsHA48=bC!BiBoQg(>=7%Y6s;{BGWSRm04B6g`1f~O;X?$1 zg{hE4M?XKW95ex~^q&zV%&*~2`~Z%-Bj{qWkma?IbziJu{5&A-Fnqn(8pQw}g~IvX zY*>+gq1D*W=Z^Fsw+e9U15q}KTbJ!i0e(3TIs)lc^G*l{Wt+tP;pg9&QRjb3r|$#B zS6teE;q!T-U!xoeUjD*!6lmdX)Ka*Y)TtsP%V zSjy|*Q0{jk&`Z#}aiEGl#Da8T!g|+#_+??GiFdS8qhnOWJ&$L|eUW~Lsc>yoH#PXN zNMo**%;8_d599o~G>>t&ea|S1XyE_cRn-e)&2V7Dawmj46GdTlPSYQFvH|4Y18Vl2 zjg2LMJjJ&-#M1pGkt^ZJZzOPlzOdF=m$U=K&HrB&Xf2tBii44L|YS z-(4a=r5paa-uD24scNe$E2wVrS2^~hKOg`WmlAEsZ!-%&@M^r-+v)vWE#52nGYTM! z8fNO+I_dBkz^*R?cRf4<0*T3+zDFxPfY@ckO62c%xg6mR%wF!ajdLHtKo)(H7Ag=0 zGnkOCf0yHa&o?3DoG>|RN-AORW}sr#s%8UuVNrHT*6%E+nvW4-{#rox;_M5<@hJK6 z*oWtTo*mmxLkOkM2!eS{FvR05V$N`U-##D0xA!?_;7#U_a9OfF46#Jvnl;v?s(YdW z3x^&efyY7D2|<^`o$u3b&ohR&11~G*IIq$N5(1wCji@nnM5^fD1_??mCfe{Qt&G)` zAS1T>%`UepCEv_L>G}G?-Un&+mkuih|1b2`Mf?hZwmoVg@Pfhgsb@TWfJ~tQhjE_{ zDtT^a*z=XWM6A!U27T8wh|y+M!{YAdDtTz{4a5w%euMBTTi)ZyfH3pq6Tb1vnb%$N zbb{+9K1EuPsNhs1+2-Nxg5TxU^w4B^-Io~m;1Lqm{?35Ezmgp6Q*`LbTUrDKJL+d~ z>W37zdanG2jT>i>*qfWBPUita(ubbZ2aHhC^}klmy%J(tzdlVjI}zMb1h!@7Z?b)_ zk|Q};AE5r~W9w7D8`S%9X}?md90RPaVlDM-wKpcY4WI@a9W?=eb^+O2LkQ>@laz6c zBvrUrt?Lrlc_4$RivjmHrezACU04ArMH+ek+HvqHMI4PVh=^W7#n!ffac`@R&u_>-e9{D_77Mz^SX*kN>=$rkZwmf!?Wp_Rt~I?0eqC40yh$(F zbtUM|4cjo!be6=oE2puU*I&K4I>FERaa2j5hB+4%B=#?7VpyqueLHjPpUz5_#P5(m zA#KDzN+2=m%ALX}Q{dT;&A%WzX9T^S-wOkO zxsgNvWTXwBrNVG8Am0?U|KuGc=KA$S!MA=mh{ms9`m7pp`IQb*HK4fmw2_p<)*_A| zzZkieV-a@X%Pkw;1-6|RG9C-~qfz6%w*K(-da#*fNH~ua>2ui_g|k1T#D^7juXEO) z1t8&}kh4i6!(J?e;iX#l?i#XraP?heXhuT&lwJ6Aylm)FUE;Sy1K=KAiAHZyT60d55_!P&rR2Ozhsw8 zUlv(+;QF4yK8exjeU=Dos}q|ZLZ5G zq#OeQ-28-9_|YI-?2*?u^JQQVKE=J3Wxz)p)~+5i22+1&-n&nG{FWcn^1~5ubyTJ? z9dL`x=TwVx1u=SslaJs;G}kRUwX$$DXll@opCEA;bzqrX=T&&Dva%KZf+dppC@= zr?*Ag5b|4FN;|~x41C~MLKm7pu1tGQjI@b8P-8i1r@4%-0hM zwVsj@Gs#8nOqP_O!arg>=evk7QEGO=9R~Orb7)t8w^X%_8d0L$(Z*{3MB{3WU32?iQ-;3O#v4}?vu60onssG%%#gAsbn@A;E#)itGTzK?Bt1kPIr~3ErBE)7` zj2h5fx$PXiE+~;P`6bT?(Vpu#FQYB595?eyo&9r$&O) z!k-b7ic4oxMPd0cVF8z4;MQuqoi3Ng__&}Fi} zz~dU0qK?v_^XD2PK2&SCPR*Mi9%efl45mhU$Ko$ucuBmMT{(A{p0;aWW7yvD*4K2? zW%8Cv-g%2}Q7Yekm%i`XSWk{5O8uHpp$?TirZb)UfL4)zj58%=#B6$-e7sV<1vY0# zu~lKYEwTJsitUUD&+h4H#&PhH zc`;nAQ)&|HKixlNWmw9P(g02cD^ap7vXQ{f9M&gjspH}f6EwDE$Te^NJYlb!s6q{G z_!9_%z2;$tw18ltPE`5ZWnv;a+&zrSnoI(0DB5)gff_PQkJ%zNnZnA6`H$j!-j zgE9NLJ9DO)*s)JXb%ZyQLN)uV7|fyXJs2+|+Xz z^2nTJ?x9Yp1gO+hu?JJi^p|5c?w>JHBH_W$%kUwV!}tdL4LJ5PxQ+Xi5KJ)By;F?1 z7U(o^*y0|e;089rp$=)7H(h@P)V~FYHdvDh~G}{9SA_Mlt0XGR+*r_ew!T{*ZaUVetVrW1&cZrx+M$)cg@|q zw{|omRZ(-j9>}2?5)_vcJ8D1^t&8RjP2se6;NT}Ah=^@A4wyMHyq*COH5~$ul(FGs zFET%OOtBUElGOgXD8Cp_a&f1@XLg7YB7G`<9Y;9fv`9*`6O{Xvft9HB>4=p&-tOtK z8tI(;_9HyxdZez&r?IqJZ(5zzMfsZ!m~34%!otNd(ch12ucuS1GPW2e>9HDrw{+Vw55*}zm z6<9%}G2xOR%(n!ZQqa^34DA(q)Gl+Q^+_-#8|5R^anETTXF5JQ#j~IbAK;qV52p&Qw3g(AlZsUi^3dSbEGq1-0=4+y-l^>Mhyy_ zXMe%?2z#eE_`pf>QJ!(1IFjSi#9$DuLVZ}WrgUxmwb?`$rj*~_a+!LS@ck?tn%Y<1 z^$rc8&j@L1aqlb>%pdP+fw5K^m|{z*^FEW$TnYUi@1IMf7I+mds-hfW$Ay|>;h>FE z0>FJy9FewIkg!JrDL$mg7*?kq8I*{GQQY{Xl4Lm7&u`M6$8sn-ed8uS4EF8iNh9o+ z%}oMhUp9>@2WWf>+O6Ho&o^yVfM4o-%1|546$0fsW~l17)&B6r#TpwT@88DA$3Z7w zyf-y~bFvy2CX0as4mvhLiwob(XBvU)o#Tdh%!%~XEls%3;2Ls zX~4)XOBr;8+b^0d8B72bS7TF#i!$L1LK3y0SF~AuYmdhsC;H~6I5MBSk>ZuDlUSuK z-i0Hw%Jpr4!YtO{J9Go_+3X4HP;|K;6NKmMfrIA>Hn7JxH@w1`V)iZV3*{gXJ}=ZV ziR_%OsnHs1iqX{Gi4UEIFgW8lv6E3HxnUfxv42Wvb}dmyX2Fj2OK*j-7E2^L_nn*9 z2{GJf&I-FbAU8-_yX$HOuyKTTHZ;{@JL**$2;9I?lI7fl;rcJ5u96^@DaL1wqyY|o zuLnR5mc#5{LnU!XtsJP)5rFBM8o3_EbBh8Ky84zZbzdvQO);Z(wmV@;rL;WKtTErH zFJ(z6(82aX3gZmt68vu-;iF<*Mo6PBTvP@urtD{*zoEJ4w+z_$MvM+2$exMlbgiGT z`op{sACy8D#||gNT9%m{0=fP<9v*FX)c0}2jcV?`llAazVTkA&2>5Zy zvBeakPmEk=6Zyjb%M>+cVqaJz|Kj(e1-l+MSsbCq2VFlPo;)X zc7b#wWZm-@BEU<^x*9D4HWL{c)2T0L6*gly2vpz6llu(6yVPYOn5{F3tFUX}Z#V9Q zcH^xq@dEtSN?T?9v&kmUO}G@os^^P?F%>`EHPP!2Ziig(T^$4FFA{@$Bv_C{y#{N) zO1O9a}SrF5X>DV7uaGxrXq#Cwn zZhp$ng>FhbqyJ$x2y*S;9-sIqwh&yHQh?eJEG|4?C925ejft6;uxCPaMTL$PLQB9H z&8J3*mN`PA=kmHB@RauB<1Q6akc&_AyveS&ENvP%%Y@ss&S44)0k<`*~m61NL(Kq#JtP` z!4gI%CF%g)dN0MD?ALniqE%*n_eiGH|7_e%aHDunF^;0e>G15`ZyGm;N8 z=Jx+Qen7-RQ|0rFw1;B`B3eFA{>6ltYw^OJMxMRW-G~eo-(4R1E%yQJ`Q4Lr3Kxdi za(XFMyA(iU22SBvUp2h^rNn{NdTR=fyTjr|%fpVq0k$I3_rD+gAf4%9SeUW}SkE?| zBSCX7v5L(c1A#tCTCD-W(1<*2h;LfAss$4q*owQ2w|=x#TA?d-fT<^9x;%hgR>fpI z%O~c4f(oaF#ASZ&6Xj^mneF#XGcGCBf1LU}JX{Jvj1wgjO6@dlZz*7AGsa0vhY1Oj z9WI;GgiiCW=S`HOxh8!iRu>%wfr+PgmI?4;>J}Pr231Irl*lvx^u`{GbS$v%q2R70 zNa%huKCqprCDWLu*;zKy#D>hRd7o0FH1(Gpfd5|;ESr20c5CW$HlwA_1U@M0lC>VC z9j4E>!iL1;;{Ii5ae)t5-oM}&_~G3F5qn`uk|`ZUzP(CnbR$(+F7wsItX#}n@c98Y z>}60&!WD_kfmyW4uB}z@DCe($BVOc~8jZVK40f&(1S0x3S@q9RiXg4{n^b>?QRjm1 z>UdfstoQ5Lp{e9km(>R}T9IG<{56{%fqj(;i3fkEc*Opg$_i_^+{CJGCC0 zYhz&r6X7!LWpGr9fEo=Go+vM4G&=UN@%M+&HVd{uC-_V(Rbo1&Lw&b29#2PKFm>&s z(lbEdse`n)^YY6~nZGUGWMJBzqOLQb^gZ)!Xs#4J#8p5y_7PU?zXK4=ry)K!giFNz z$(iJyASkJLoTWCJFq=4oKxxFY2hZM2WI{@K=;zCa;UcstZOI+#&z;SJ6r=X#^zJ!N zrQGpsZ)z#M2aMdy%WW3E50J!}N*E2TOb@U#9;mELYw9{L+c{p!TrDgyg3>R z8J$%-aqK_xTs{=>(wv%;-z-NZtXP9OX8=ioMEKjJ2DUuI)lF200HmU^hw0y|jb zAE%&o5Nv9mC7uaz$^A$_HU>Dsih~iMuT(aG?uA@H2}%?7r+#T+28oi~JJD zuYb>^sgZ_0u+0PDxUpIcx$ahaB}5lKIRhf<|I*F)3@S-htX7~6Jm)RP3==Gfvo*dx zBPmjxBhguc>>=)C5r^h;^N|Ouyccyy@+;;m_Trb?L5#o4=ZetOqRKP`KR~Fp3+wQQ z5LA4N{jj94P5M?o`%Nzvk3S6Wu?$OG-)YZo@he1%2=S@P+4}MsCambpQKJMC~Cp`Dm^=c1_;%1SpfjAOjOBWXzXAOD7em$vP%mLsOvxUOzV5JZ7+G@^qqLj>*iRHJbp-R201dO zekHe#3r?RNJc=-d0_az!8$krp*~v0|9fU+YE5jhB#fC zWD^th%NZgH$m|z|Bm@dO=YnCfoH%?iI^KPLU!!pqJpIPtq*dSa8U$wF+l9BRw*@@O zH&b}1cAxLNoGqqzbUwD>)9AJg5)l>EZT50F zv3vFlUecFL2aA$HwT%=A9-Cv9^S)-0Y%xGcQmH?=jMGGf9YM+Qgj*sZOyP_YhMUXFJC6$ z@Ekf#HXG(*0F|`g=ARWF2D$bIBTG~jdoZ~cn!0Obpps=89FK$Zlz5ELS3i)NYZ^WC zxW(6yh0QzEF!)*Dz8NP&=KHz_dY9R~Vjhp}C*6HNNLY zN7?eH0fF}9Cwscnlg(&PC_;_#%4Phi&UzINMXZQC*|UF43!+ik7xjV`lub+?Kxl|1qFdWIVt== zx-p|Wwghr{%tjbGuLOT6D&(GLk!WlQp1X}d~l;?I#?gc%1*lwjc8$^)AKi>L?P63-2If$oof6Ua7XEF}`5#H?U%N&>m z`Gb8w^XY4+xL$hu>ogI1T=#X2I4|khy$}t7YihaNFG~iRi8DF$octS_cEX0VOtqWY zyo=;B8(g@mC^YcYTwf=GoV};}n`FZ%;fI4bZHH2Sf96p&j_-fAva)=JG?$n@nwfb4 zm6X`)25-DTE;hI_Kioe09s#4p!l!^I@#yQ+zc&W%W<(?BdcK#0ZFSK%b>JBS0`*cNMmThPl1kjQ>o{}3>^Cg zzGtVTcWq&Nfq^u$q=QkRR}d57doC5Ho%O zoD|H!?|#-6c$L}rGID>ajK0}x`vV}@y}h|Sf?O>6>i*OqJ@Zvo1_8;%610n}&F@A_ zl)MJGK#cF1o*vl)m-N-sTMDPC(hkpId1~_4z@~;LDlN+cr#C$(Lk^vz$PP|#DjP3c z-fkvJCA2?j=2}>dUYsm*qDE>d1S$(abD#ZuiX3Y2#NuQ$DGl{#S3So;XjyODF zA`fV{Ah5Nx=LR95u`2`u;_}}(Ko*H|DsRGeo~!L}ZdeQlDAPQbhSTTcukwIv<|E_c z9xkmFb{KnnCcOj?0MNMrFbi_<`Dp~~}su?1zDNAMdOAek5 z514e)5Y+FdKyph9olYD&J>D!|J%fP@{j00LJYkYMCC zD$hLLQaJw2{`WSVggF+tT{TxJ4DIz*)mG*sfZcb=l0gZiM5Lm8$dTfBu={VnjDHK4 zSj3U9tEYStYeW|^;`_HWElP12bL&8^=H>WvCHAl#Cj0teA@V8lfk8xN;1c2fn{0)R z%wK(b1d9bj6VTLrm!O{tw;?n~>-6~NK+}F{DcJ7Z(I(tevXqtRTA5Z=(*a>F7_|o` zT*kG;0f*~8$?P!tM`hly{2u58JuEHdz<@uFHa1Gh9d(m)o78fH1CLa(;JygILXgEB zaFMS`&yK>`g#OleVchli5YdlHLN#{7*sI-wO>1O73kyr)v0LSUt7RKEvjZqzde$+^ zrUDLxTmZygzt851y6OLJp=p;mJ#clhX}Hj2PT<_L+xa&ry1=KFdf420%Rp@YV)}K? zIj@K-l|*oZ4w1WLkq-H41ugQu)v2#&>kyAr#38ZI}Hl%OmF6hbh7sn;iu9m#x5aAYojKCTvj02ak z=Z5zk*N2`EnQxMfIz?kMK?(#hd=v29d4$^CYJmGOqT-47h4%ZW>7fObPPr!;_?#!mnDvHW^ z;-349N4Cq6>LiDae{Uz5ejHI9h@-4hLmg#XZ$s$M zR9+kP5yZ7?_aQGjG9x;eYynJh*rMV2KuqG)R*}trSp)!pq(vO?)xBM4bf0PREX05H z_BRGsNtT?S-X}3LpIMtf*0R0_W}DB2o#({Ft770Sj+4C6O!9MAjPgDIodZ_Nsr6)y zpTA<04glgk+-;c}=v%`4U|6HG1sbI79$2rqUjtayBQuu?ARApG71GjXa6D(lJQQxR z{{2>PD!5J&-L>Z9T-r=f<@g77>Q_B;(at;f&m#zOuOy%TY99`2RlaT8zU2~j>33XT zht1SVANM$2=z|W&(1l9c3BbPp4|#7HR@K+-4U9@BV}*wOYOUy5$DpIy9L&;*GWOKk=pMRt{;(BtipJvy;Z#3O68voG+)U?6dj`m zo+Buq?+kEPsLGsG!j8ASXwHTWm@Yh=`o-GRD)F#zvs&8PIF5hOMz#oN%px=M8u(B1 zdx}8U9R__!ieVSjo7mgwXIX3<1-opE%vO1~1twy%xW8Rp=i>);(t?NKo0WjlQB>uy zuU&L};CMu4;wbDgvfxJ+QDVO&DRNz~_HGChmIzeKzw?Wm@>eZ+}vfGOg-cy;KA$xwh5*rnyQ%hLs^IA^IcABL+n1`oWp9CP4 z{%yC-dw1&C+l;ZSAG?D?Em^!vNk_hLrj3(zT8AxFO35K#_e5dfw&X*&TG4Iyq^_~# zhY$@`8Q3cxUzp`_^CtC@T`vf?c#e+C=E}EmEH5VSOwDh@hT=`kttOBX1$aBVsjH$M zDQT<(@XGR`7i-5QMLnu+=W`s(qA7PsGJ)g{8EEq$DTjEyhN@ zE~b5%FirHn33S|CNNwpLHMpbZeND0Tu8!*igqw@w4YCxa0B3j_>;I+#Oo$M>LjEav z*xaK$Z0)rGSIA3-ZpG&pENZ{}6a7r71QQKTg-N9Iq|N3Doa`5e`{tv{nYo+abvie9 z=fJ^&i$I5OLHqzZj6r8jc!t#w@Tb#}J)4qv(Ley@sXdqLnLiPSW^L&&upVSTV88f!)fD|+sIyAqKE^~8}i9( z2nL;wnX+3H47Y6~K-sG}>&6vxs_jTP+~TWhhbgRco|-O>lej>&U5JfQW^=) zJ%K!0bd-p}R#o)gsgY=r_n&tZ*JAVd-R{U^L}ktpLgCSqgRSKCg9C;t zgrKljBi{`32@S-g$SGTTcOEkq)e>(E6JVvFRiIQJ1mHA8#I@BKIMOH)Gk^LqwyUF8 z_{@jNaBdo#>Q|C$AIrfL2AYfR%59m&LREaaq9Nk|&5&YP)8JXiW5fmprw+AT)3?uK zPf8A=sbyNi``C{Fyl23ri+O1&Ou8W?rZUy4 zCkJMOU3~ADt2FXIy;i=(b@08*ZO`!tSz1-AsCPw5J<-X>iBfsNG~b5UkgCvWoErPn zO$OjyjQYjvc16?+DM5$}j-%xM)sipP^UN^d#|a2`_N;gIZ%raQ_j=p5)tNjrH(dsV z;!UJ^zg-6+!@19pZ!*|cLTz%prf{3EE{-`Kn|XWgK5wyscwTIUBfxg1m~+xF4j$2` zmu(p?Mp58f!?yhl3aA^KE^zxsB$x{G`rL~zExkIcWYrey2J5f*6XXGs ze>m<}u+p+&P;_bMd)1nYN#bl&g-N{r496!zoN19>e=BMe_9fZ#dI5dc&=j|M*bfJ&RMQiC%gy0?{$pK3&f8SvJ8l~s)I zwuR@Rxf2-qsF^^E8x^x5`@UPERDR~e%evt6OwH>9$^It;albUW9z`lcKzkp(H6()= zq0{K(Bz$*pA7zk}0|uT6hFny&J_HD@>*%xee@_0QlTD^r2chxZa_xNQiCdm!`cJ(p zE~@~(${&^C`S2q1(>*{*Al5eiVbqdNUh<}<_*bvj3iLtXzoZiaYPdH3Hge)KOZFr^B>h-*l_kXoY%%r9+A!AL$O`fR;QRk-kM2dg|9@&N}{f>vO zVt>Noqs3M8lUGhI0=F`IBU@Vhv{y+74YtlG$N)mX0hEt!j6)uhoB2};?>Nps0+>0^$AEAzZ?H<&N! zX^-ZiX9OzY2%e?PBjrNzOSHB7MpSj(G0D%rq~k0+7dwk<&ZcKe9gWGGN2N$T2Kxy( z>-V@Y4z5HC?aKWTitQBelOoXmDbI|9cL5-8br=*GnxLaWcYs5MKDR)@p)k|40VhN! z;rfo*P}eycQ)>eabXtX=V(>|{Cj88l+IL+8g56&j*f0c-!9y=cK}lND!JQ}1mR2-) zup9I>K7_sjJ$rc%+-923an#hs)Y2?PV>8=k>BgZ0&JKGmZ(6bjc91bwf|9~%Rrbr8 zo7%h1ks3ISbLMI)?04j7zJf(0BfD;23D~mi^qK0)?*Yq&MqJi0)B0i~bXYfp`C1yHMd*f|P?sUtgHL0f$J7^5a6$J;%PW|Pj za4J32adpInbklNMMnq`u58S+^IkX0SD1V`(m4a?vD=IuiyXYgQ_Mf<~$P*h&wzSe&*D(iodCDZQS(d zBjtA11EJ;6x2XQ-eQWz;%o%wc&*`>vmiA4i*-(?CTh(d)cs?e>G^bmgD3Ytm3k~U4 zf;PUgn{GDKw!@uoqcEfr*b<8t79KCG%hbZ*S^Mo8wh|(sOEam<9DVb%8 zBj&Ig+SICrO;mC>5+l4Tx~)AN9xqf|AiHb}tH($a!37%zXg1B8n zB&hm@uT1d%$KXBC4{T4{*e&7_Lt^L>3WN{pvKT_i54K*EqJ8MokWl`S@I-6zt1Ep} zY3p^Kxy)i#c05ZICuM76$sep{``Cg2t!Zj#kSSsKWYdzvr9f4>lF`a{`~_mf;cF#j zr${SzN8@CO9Vkf&9kWjVQ`O6y%t3&iRN%icg0*qglvX^4FJ7i6vhyvcVBa$LWP-*+zqhxqEeVa1X4RgZMqNt1C<; zfzpiN*|aGEA~c2cnc6(wVt8y>bgs4^KUbYh-UQ&25o(?rAMINr?Kf4{Tx=pU9h}q5 z;Q2PU{}hRQcY1L3M)B-Y!02|nr8z>sqffP01%+lB3k6Q+k|k3F{f{6A0Jy7m;!^zG zc9c_wZmV_@4I+D2$U#?K7${9eM=q`62{-1a?zG!t1sKGD;cP%v`X(7YjB6~>xGWb5 z@h_dkmbgwK(001+goAE3Mw9S-gE<10}`jl?*>L%&<(?;`-OshxAlW1MYB_a3|tiv zVg5)=YCq7vG{LC=pMNb(kfZI(t^_Q1W1)svzp7PszNO>XqbY zeV2eq&Ec(GE+(*WDILphAe8RW2AW|0RjPj-+HR)L&X|So@m3)K0^h1ZfJv-Xw09si zRB?RFRYE&R{_?_=|H)!F+bsG)M|>lw{0-c@N9$Sxh<8AX=t8S)FeYeSJhKAf&&l;hCMZ&I+Mg~{E(+v#k zqhqeNm+UTUJ>9SDXc?ZL`7Ia(x#)hfRE&RkaHZbm0~7)?gA5BE&p}D13L`HY@K(Fc zrTlhjotkDq zZWXHeUH3BrOk))%mlJrE{4Kv905s9+=+fZ-djBS_X)QJ64n0pnLO7>L45%8+rpJ3D zMhUexo`Wv(!sZl<^s&K+&MqJ$G1HAB8Qf070I&8Lk9@gs=-^f*b!IOv#g`I7Qat!e^9!2b}(L7I=CcAjPOI|25J z299mj83hL^6*L5lPImqdAtEYRh)=Bp@(35hqe@(JwfrX8<2fdA|2ZU><%73LYeS)c zRowImnc^I|ehy$urY!QP@6;sx_!T5&{x9hmcqL=Fgz#|AdIlqHzsVkM=!~m2_zTwo z^#2$sfw~7D{?X3>Y(Ywz(=Q}3z~(JCg{A>&aEPkA8d(U%UkjF+!CC2!w``OcsUgju z-^EvmxPs+#sch3I!?)A47$+$u1<%6Id@uWdSZEi&k|f`8Ci=VE1n7zpw@&m2d$ZNJ zu*OqjKG;GS5-NsKPwWdOy(-oRkv*BjbER&(NPXhylxo`@c#_%w?ZO`` zGN3T&2va?6mjt{mR2H*y)ra6j-?H5bRTld&#%7i1uIa8IR6)AvSbs}g``%Jt<5>ph z5X?d1()MA72zB>^(?~eg_L|V5C}`Ig^#3Z8PCO_Zkmi60f&~uFRUAK+zUBe^)$Q=` zaAUHV=F68aLwTAkUcl8(r`#Mn&2z6dv7`(ErjXb@E&nh_KyZ2N*?5k_McgN2eJ-=% zYNVtDhSPQWI|9tsfU&mrpIYBMmni&hc)@Mbocgl10Yq=V{ z-GKZJwLOMGQSF+86aL?Nsb6RD#EX@UpY?^9{#AoL#cF`VgzPOCjqb-%finNS-=%Bq zhZ$rRq@$g!LJ(d4drtPdv|RUb52h=971F79WkbUS{k%wdEb%aim;*pr5h(D)T0rZt zQpeTTL=zmQU3g|}FwpI0-mNF|x{EGSpil@XnNYicj;W+E3jnmRXW)^!qThf;hl~Pc zXKwYX2W7u^Sm=r$$^e%@rL0>CUj2FNq zU*amXwUcWv&xwA^Xd!8f_MO*9tzX}}q$FYC!>M~iX=QSuo1SUgu)jX|%}`KcN9Thm zyD;?|=%zZ){kQ3Op=4s|@gcU*lHouSYnQGksN8&n*%OAT2K>RmO- zNOZistLBmxfu%_yi9G(8z$?E>&P6mV-v9`4PU;{1-PnuoBxi&vq z>pXlXxd1YDQ}nD4950>%-5_nI3MeuVzN#uiM|@yBH9Rn$c*`BZeq=L7vREnOW~C|8 zQ0fI>!H%+1g%iME36SHPdF3}L)4?%J^pL1Z8xbHbpnYQ2e3az}hkyLi|K%$HZ=*#$ z!oi74dE34MJOmC=rgrc{rp#9b4(Z{0BYAMR$t5MoY|XZlHtG?I(W7lEKK~CyKcod9 z`uKR7d04Lz4Qn?#J{L;}g=qzr17u|1iL^EcAa~{4TNca9OzOOIpZ({o+5rkCNes z0K@y<&HleXq%;#;234MoG#`L-O#w*LdZOSnkX!O@cs#45yFRSqujY6_I65i{ zFZZYMcW9~h!*VNbnk1N_jQhsc>KAn@vRn~swczcZ4i^D&KAI<@43+zN!JpJIb7?J12He$eXo zR7Ew*7~m8zqb4Xaz3u;)x&=6SsOD+B;DIg7joeAsA3p2_Qzh>n2xA*@_3*>*9vim+ za_!l+tZdwHzXH*02n0I%{!mEMC(!Q`3y3lws}mnB>6aL_TJ{oGoxve=4O?k5kfsYH z&}_GZcT#`lxCSI4f?^DPG8btB>@uh7-HML}I?Ea* zhkp-To12?I$gttdpBXjy`_qD5#eU8`P*dkDH9I+PZ;l7I%om!xJx}dDfoPw@hL1Mj@Kx+-fG-|}q#0^?45tl8E)%2y_qUmFf-wbBwPak5dWQET3Dwx*V{H{Q! zCH(Obwqr-<6DEuP&LH0?}0S>czy7(=qGnXc;j?v zRCjRooMj7}R{|K2}HO7033^i z+c(95ccMs-U`$@=20oXo!+TJT*%T4?vNHAI@6v}yy^wmW;h9$GiRsXGpV*PifKCs! zsD}V=kIk8oegvI|$Fu3>t#Aa*UkI@)@w}FoSEUu0`*!>|>>b`im*EejTfa*1X1Hen zWZCg)6klR?=vra+cUj~2!gm!j$8OX!tJHXGqB~O&2*p%|Pcp>pW~&rii-uXg^Gm}B z8|%F!j@JesKU?CT36u&uG4AN>tmpAQ+j+~2B_D}J^Xo)yQz~hA&!l3;rM8fA*YL_+udl(b?j0S;KbLj@u}xq+Y`6}s zI&5>L1d9fKaxhiMp$uV+)AzkSwKmp+zM%ZF_MEcGYlGUoemWGQdWHP9`VF))A^Ujb z{n^o&Y*3&5GWNDrNB#?nR>S8 zm&&6KYKr~dyNKSNyS39Q(XYX!_PAY`fUMDvsdeTQ<~4->4D8T3T!=%xy&2XW)Q&na zX{a4doC}ekw=)ekqCHl^`87N$fi^$yos37m;F#S0vtWwN>7@VykK9wz2Fr79-QA>8 zlIvd$QC=@Ux#D})GVi^I1Y!0ka!T3#u2~1}?0L=P$gjF1UGc9CLy7Cw-#Ut;d!#-AblU{s(^VIhK8eK`w#+G4rh2FN$dLCF* zZDay-U5|N!uhD7}3|y1Qk9=G_Zc>2uK{%ZRHk+f4ir>|sP&S2ux#?QVtd|%YQoD%R&bKG!WY~n!>AK1j|kDO z&5a@2@=4n6Kybe$9kb5H_!i$|*BGMocNvp`(dF>U*p^R<()jl3$XUNZ`=Y+Ob~e#o4}uhp8_oka*;o`hJ);V$TE6|OH{e9zdNaw{&lQM zuDyWzMZDg7)%4zObuGwkFNFv2(8=#_D8h70&jUHiXrDK#(nID zd^hv6bGvcT(f**XxQ_b<&?#r&_O04zg7GZafvkaN%balknRE?g z{}0W1mq3-^#M9ehDtGC)#Qk+&2 zJ7UXZbxo4P&!1d_^P%Lph)Q<0 znV{gy5S8`}aWSk5`v~G!mtRt8ar+>7kRPqIvJ77=J|T;?xo5!jWa6NnIP)XWfECbz z`z?F$)EjO@!;uZn)hI!3L;GptAkyi6sD72(WRbx@*i$TC-Rk#Wky=1HKQwZ2XryG` zgm)~R3H#GzeGUj^IH0)!2h?+y_uDz2@|kg-tjFP{WH&3nYobcZ><&>_xQP`Fd*JPa z9!yYn3oPL>HP445a^zB#C|j?*@-wMN8)jydY$n!)seLcq1?l2xu~Sj^p`^i`wA~FV zB4FD<^s3=rB|IkQHt}$36PlN$=#8!*q(q|!fLzZs;=;h= zrMq~JUUd;sw%U;0))JXwGLLGE^XB;KMs%}hN`2!aT&@sxAE#L zVzGdY+~MHUX?~n)cHIg&_ns-(3dS4G_fNjfyBW&F-4kfQZ^H0bdeIqWrl+Bl=4(-o z&=NAkF*K&l%}r+drwOQ4DUI+2`&XScJM4_boPpC{=-+6N;=hB$@3bdKv13WL7_mYa zI|h<@d-ogr=b`$E%V70toer_cMwuIESuYJjossN$x_Ue%-Zwpd>|skO_^t+d-_wH= zYG_>CLI|(}1<3SFx}U?_fz{rG{EJ3nHeEmN40oq>3`G z*aBsl#R3!u*Wn1=oe3=&6e&URX+q#IkA}Wt z&+U;HI60dchU)J|5(J|?shx*bFp7p^S#|aF99cmIuGVreR&Ks0eNk?1n$rIHjc)2t zWF=G`P;xXak$2l|LN+IBuy|LX=-saDCwbgjUrJs>iizMRT#^qrY z`~ykCspk~z1h%rCoC`Y57M))jcf8mGXZUZ)kDa~AcFo4Q`Nmd4*X{uOT|=0px}DZR zlAXp81z(c=c&W_(7X_m#rxSv9OhzYo2HJzA_9>O0q|1Fa=M5DoO|$Ro6-9I4nKT?m z66{sPvFlNs!F@F^2ML3_(Ql0*p2;9YUT~c+heGlM)IGG^?GA;)%-`K79w#llF_)q} zA;TQx1lbdGt}YYqU3k6`qi z-X){3Q$(^-_T$H^G}Rl$us356TSRN2?D+eoIiS1Lq%$v=Tk5F*x@mthuc~2fI6qnw zKDRn@InPjiZ_|?t(z6!0q1a+UpRcv<28Uf&JL-iBgGSwK=;lw6)#upiqdxf=jTaw& z(}!FxKR^4Ri}m5mcr98!hC%S%m;C3BtB{V=y7j127H3j^BeX}dc$SbL>_hq*kJByY zzy4C?3dN?YqEBO`#`oILl9 z(Dyd0;U|b~gTaxLR$2}$v@{6b3KVD;>hhwtD4c_;*S-Lws}B8N z(2W4;ZYWf)i$1Y_U3~R;Bfo9)~ zB3W3&-_Rqn;9(9<`Qb843O`_DI=K_&NPRE5oXt-5xFGbRWLKsy>MhsOlt*iva}2IX z3w_`{^49zpB%Ws9uuF}Kb!r}?IC+EeRN9frcIiOt3GI_>@aWMS!DCiRh@}Z`phnvN zRjN!gkvBmhxXi~J=KSWrKLPyyQxSkO z2Fc3iO8>9REkD8KnK6zLw*UDbU-=(A)KRIavWWlJWyF7%_T;Mn_Z|LvsH4K2WB>nh zq5rBi|0PCsy+QfW-|bU$Ko&Ff`+hiSe!y3;Ogix)V=Pa1 z&#L3Su6k&@@6%1zC*Y{RL#Zb(w8CcPww@|VQ-Q6 zaMe|oB~&m3Pho$rBL4<6SIXX)CVeUVt~!D3zou0-!Z%*P;&@i7Mm0E?e7=CVkb-m4 zNV6f#ba4lvEO3Vt?Dw1>%aQ~Vp5&?)o-4i8RNL+iam zrrYn+ovju_&RQ~+AB~v_IgL5x&l^g#VgmALMljvbCRZ_TlndpC0J%}($Jm?)tmXUP zt>p_lTD%0*=Nd>#uyO0ZDf*GQFO`3MCvln_{@68FOLU9-Rkjv+u;y%xl+=)C!Hq+- zabQQ8)cBJ?D$jB+zlI@PePgKJK*LWPH)CjN2ECy@0a5xMRcjov3`3CjHSlCfhRvp6 zH@xv3Z%T3hcvjV460|@QVCg+=@UIy1G#LXAJ}RCPx^!J0rIP#TVCT)i+GXk@_p`&r z(jE5AbDx;6&PcFe#Tja4iY>0U!JYjVb4$m;S)C~o%kvpy4A+nTh0Bn+IY23IqM&{G zkba*SI-@PbZHAepS*wwoV%1YqVro06ru*wn-mev0M3#+2Oe$DRI(Pym2Mj4WleM3b z{+t1o>IdqPbCiaHKW6Y3cGzm2;>5|p{3haR)j!^?;bL-FZ9YPsU>)_D3M0a1Pq!YH z+K8>BkcOBdl3*fT*CFfOJ5pN%qny{m*}>ZPYcZEC6)ctfcD0)*j%Qs}|6oQsMF`(w z*fZT8rLP`e1k&&?|{YXD=YhAfh1xVuk!=TC5xL8H>RjBO2kWUg?EoJ!u^QPt1o()*M*~)nmy(1x>trbfu&px&<6rtqrf_2>oOiS9xA0lL(xN;Q&sKYH=F_-mb-G0ij@&1f{FYep-0P~G z!g$|nBKv9RqP=|jq9VdJT1m+_#(SOM;llTljpW#6>t$#sk8(^e_(&G9gX3|!j5T9s z$2zx?TR6i5oSvnEZfYB z;liFcp|~()_B)gvw$L8~_tI)TgE{q#boEL~7@nS0_jI%;@2{Rr9hwZh{ej}(;fvmk z;sja3?Wi^?Zn4?v22B1yOo{3gzu)9D&$)>2%=OEl5qn4xdwqAllh%vBtOh${hjb`# zjD5ZRJ%FD0SlRE74`KxMBX%1skrmRrWH*u$tLQ564DFDAqm#Qt_Kz0`-o)p+(>wUy zd`8scWgHFrR`q=^4SBkAc@1@qL_T-cfxQV!tWcNy8gtc2aL-Db+kU#LT}~W|te)ql zR?@R>@HFt2@}PBH7mn&bi`Jj2d=!fOT`Gx?L@wA=4@|F>=R+2ON6#GL=Hmf**!9u6 z8HE3^hJ5cLjuTQP{BPDv%g*|BNd8buV-QOorMc)%eRww|*10n}jqF!QWAb{FFVXP3 z>HsM{wUnR3>!(Ifyj;-M@S00EmT-j-gqwgo<1N1vS+e}<@*s|fIH@N^1S$jC9G0Cx zo!%RwQC_S|;#;bZUNo^tdN}*--Q{nYRBM>F;_{bkaZZ0#uxzM&O&4Mi{*3fpV(ei! z#?Hl6j$fY$((eqhY~!S#(nMVHydRWZ@xl}P7DJ)!MBS!%NN>OIzaM3PfqOcw%t*0x z=rNO%k@jJ92l2Rx=zK~}W2Q=7@rPDsssZ*3&eIADXLim8r4h5_IKGWt;Fl6VU?(fN z|G{0(T3yQBydIdJa0VaK@p8A3^(K2sah?n+w123P5va^&9x$v)XXk5fxxN~2$>0fN z`a_i)NT4B9k}ydlG41^b0!wef^dne#&2A79l0A?P?LU%O^}<1LRZJ->Um49Ac6fep zDDq>#SDOkqR2vu4YSK;GpR$8A9FC||G8)Rso7f|^B)8kKPZzxq&L=6h+tFs+x5NUQ zUaEWYODhtmZvUnV?WzK--dFP*PQQQj#)oSsQfjagJrj* z)q>VQMjv7%6a0$xg+U7{+%qk-?Eux#g1=ClMixgV_)Tcu;3n!FXH$vCqfP^XP+5qr zZ0ARo3h$73Bn%$ep4_bq)(jL3?V_M=er(Je6@g#f(i}Q-jSV*n!O*+@9i_fSyrAw? ze>Wc34)9R>@fG00y6b6wypF@q&O-;Enf1cDEN4h-j;v20Dy?Qm6Q5?SO-3@>l<^nfDbhh!c4@*z*KW9FrX)znDa!hBX3YtGDnF=re7p6;|6H6djT=C?<%K|0eC=kUCuwK+m{?)z*Xrw)gk zU`GYa50T>R;t^DIo>KHwL|b#gx)bTSM-8&cZ?a#@#R3UG-X|ZUc8z|ZCtmM3a}zjf zWQs~5e0s2^mlDF+{J!<>iFBEN_1)@*ZgXWkzW+cPKLe7>_T@l{QGme!_9kcl3CjD? z`@=(PhnaLH9*XHI)DreZt70a z?dr6*tU5hr?i{Z8n_M2L$>7MmUZd`_g+4~VH?3oRl#zYuu}G7?efE** zTDvZU->1=?4NH06|BAlH*g1cTNh^agZHgP0{(kzWBB4n^bZJd6gu@02M((QD-A8ip z+EVJNg{DT;cueoH`CtM!$)Xu9doEh482VW5V|`z`D85(6WA-oceIakz5q3V^u3C_7 zS2(-0#y%}iLmAb0b+&ZNU{~Zi|0t@G{+W05YiUFpjE&7E0okC;7$2#fhVk}mF~eB* zKM%Sv$|QU-6CLDhW73S})WjF!zIhDuq9^M#HCZPRYeF~urXoP-sR4AUk9fRK7Y&Z< zCnQ6)X7(q^ZJ-P|-|8($(-UGzGJ1Y2c2VN>=&g6P%8A`qb1O~NT#-q=C`+dQZdbiv znbwRFb%e_0noXBw?WMF|SjXu+m{cEMu0Zz02+Oc!8-q(`kxd^ZM+M)~N&0NIIe-tv zf&SHd5^v+rI1TgF_l3~D)IdHFPnp{kXKfONh2y%jar%1_jRA!Ox?ycz4TPO|=Y>%e z1?4moNjgJ3Z&MM@{Dny236svb%^K@tr7>o`ZYQkr>7E9=b?PU}o2z_de5SstPq8op zfX51Iy$F>0B+zZml@WiE-*cbP4rxy$wU z;HbSc2h2hwfBX4OHu`vPfE4rC%CGmaO@v5o7G6X1&pcQ{Wj0h zE>?dxqEf`uEv-bBJH6&^#21})pzlBJ@6#&g9hQlik~N2AWT&v;_w+e%Z*}vjYDheW z@@?wZiABlJ4hI+*kVr8wn#`5nozm04Uio>ETw`%;!vyydu9`dH+p26B&CSzZ`}BRU zHUk(~JuM)8azK8(Ut6sRdoQUj%RWaTMFZtTD6SK{u`tGywV7(4$NVjCr7tE(OdXP1 z5#NLg-}7w|j|lin|JrgvLR1rr=HiOkmR15LvxfiU=9D7Y_gIv-hkJ7%E*V7fgC{B$7t{4M(W%^8s6 z$$LL#zPo_haLbx)p>@K!(u8OZ}{8YTu7VL(NhEpCsABr91iTP zz7VWowe)KE-pF_RzTm>qbV1r@>AickjkVh<$1%ZZ2|QP8oA+MEHQ&Ef+ujmP$TDZH z_`NfpOsG)|YG3@K6t4tdt_^3GX=@-I>;`2CT;J-|c%1Jusotn4U1(F zZB7{6rw{(Tl@oB($j`jX+8FvCR^CKeTd$aEF;Eh1_Cn(Jwx#<>qCaEiO}f|4du& zFH@GMGD5Zz(JGa0sakpm!)y7y#W=93$uu*_7Eep420vHCUh1yJd?4|QsB|c}afn^0 z9vScGV|O?qJQ#l#_bW$=tdl9gge6Ezp=g3#c(jY2Xn2X7ZO&Ms-t0VOfiweO3N*)@i81(<
9LD~fY-#$DoL z=lbcR!^R9+Py5TnSkz25DY3Pz1PTYB3 z9T5eHwtDk9RMcl2uZ^qo6cCH`dc&z!1i%5adyQNZD4PFo8I1Kvb;S4SHNilAb^+g%V%O%a&g?ny{)czAU zp1WpoLoA&Xgt6LZ!jE(ZahWr)?@nXbzJCYLyoEaSM-p$eXk;xZ(I7;OS#~iSzsZs- z4GLtQWa`PwGcO0x4(@zC-H@Qt?)wfmozD_UtNfzyT;*aliBStkUnCIQ+t3tNXcxKU zR&HhHoK_JPdN-U|S;6)*wRLTZ=g95yr3)r>dDF*3KVa&jGo|2R=_%+S1<*_Q*?+t5 zOKMB~Yns$1-}QT61UC}RX|3VdJvio}2grR&z#Z)YgP$BYB^TB<{2dOSs|6lgpTqu6 zhlmai)Q!Htb?Og!hAlE8W8hTxCWShl`MjR)h_Ainz4$esXHHH@flk)7tIeqeOQm!5 z^_ZPAZFH~f>&#G%89v3)dgaKbvX|A%wy+fA(wn5IU~)D;Jz?9iYSj0qkD%AI=9zVO zl84!4LUO5(pB)d9<qE`;Bl@v}7*S*w!5$2{i#>d-{l;)gqLQ}p{jJB$1moDRid6Pigq;74$ zc$yYh>Px}jtiEp~UH-*h^6DUwAzJXus1(Wq3T5rZ6A7Cl$Y&JjeN6eC-jYyxB@aC1 z2iH25t8+7-=VTWNpwuf8If2v=olq76UUH<8|h)iJDTo-L-Zaqiiz zXP-|%9xFQkd=Ag79_H94Y;K;yZan+A7ua?+Fd1aI7|rF)*7z|9jSDF-`;ZQMW z{jgk1C{l4vF&RN#Ni|D8778257i}(3O`5K=zL4(OOO8wY6i7#LT6wT-$jjO?djGl6 zVWpwx*RBOkLl!<&9ZUWG+kpyyUF2f%9o??#xSQlRsEG9u&yHbn3z|*?o0-z{qhri$ zif^gv$9=EIX*_H)tDBDxwi;l!}ns|zj?mo z)hHDu_~oPgqGC%l0O2dvuD%HPPbNi_co&!RtoAi!*EUzrjwG@09@&4c5PDM^lP%!O zcmHwl^w`JZmF)3CnoojWNRJHJ&V-X`@BTH_<_FmLy}c?PqlF7=eY-*7NgP$%hjfyV z?^%1ve+WN$8eTX46hADex3!N{DE!9tR$MuMD9C_5;+3VfXe8g3);`@%m3 zxQ*8A;Z%E#Eh+J91KL%OPaDEltMz8aiF=N7xesQVX;P|f+~{{O9WbxLo;p2WcclOC zxAeKc`KC?ZO~YZNWGd=(Ln^tvSgz4^N9!_LYUYn`@q372o-$X*b|0CqmdvzucF(UX zP0Uo>>Ao_}*ZEWUo@VItzzJ*1wSI_g-=(;}{URf5oBUFlFiFy5U!jx(#ia*Z; zUBjZOA`pExab^fl@yrUvUkG`>fo$*TN6{bV$F6!qGHY^57Ej;=_J5b(AQTEV|EPGC zl`_HNyZ&f;cf+cUVJzp`+JCo6d@k$HKD=~~`!KDj@^O!?DLa6~4jP}S6`#*gC@b~J z2sS)US@;IAgDVNCW&G-w;;}S|GtGooseBmMS3KgoO?u3`dmG7{@yFgwxvnqQkU~9; z<;Z72f5PgU-Q;+RTRzO{t-_*DCPWb{q5v?e$VPO0@2B?laSlp znY@kR&eY+df(U~+$Fq_|GgCYNP~~{mG5-6*rYrN4==b4aiV1sXnsN{l_`?YaE3L!*a-jp1S!{Hsq^4LQ`5-@nZW z!=|u_T`x1S_~9}<|1HjDF6E6e(*DZ2ue3$8W4T^_V)XxM@5=jXhR^ZH!p5BGhYlzTBP0J@!@FIM$bG-yTX$SnEI>>qN%mW0q=CgpR z&iH($hN)Nrb7Vlal(hC#8uyfjZ@RhFCacqYOTTdPu--s#zXV3&bmWgCsbh{_H`L&) zJFiYmJF%ztm>JbO=qpcClHN3-LY#0^i}(sVr70DfywkL;lWty!<#;}l2~sdGO}x

Gyi^zyMwimO(g#l>+DIt9QK_2QrL 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 C-3a#p literal 0 HcmV?d00001 diff --git a/test/image/mocks/axes_breaks-rangeslider.json b/test/image/mocks/axes_breaks-rangeslider.json new file mode 100644 index 00000000000..a0230d2d4be --- /dev/null +++ b/test/image/mocks/axes_breaks-rangeslider.json @@ -0,0 +1,2686 @@ +{ + "data": [ + { + "name": "5min", + "type": "candlestick", + "x": [ + "2017-02-06 21:00:00", + "2017-02-06 21:05:00", + "2017-02-06 21:10:00", + "2017-02-06 21:15:00", + "2017-02-06 21:20:00", + "2017-02-06 21:25:00", + "2017-02-06 21:30:00", + "2017-02-06 21:35:00", + "2017-02-06 21:40:00", + "2017-02-06 21:45:00", + "2017-02-06 21:50:00", + "2017-02-06 21:55:00", + "2017-02-06 22:00:00", + "2017-02-06 22:05:00", + "2017-02-06 22:10:00", + "2017-02-06 22:15:00", + "2017-02-06 22:20:00", + "2017-02-06 22:25:00", + "2017-02-06 22:30:00", + "2017-02-06 22:35:00", + "2017-02-06 22:40:00", + "2017-02-06 22:45:00", + "2017-02-06 22:50:00", + "2017-02-06 22:55:00", + "2017-02-06 23:00:00", + "2017-02-06 23:05:00", + "2017-02-06 23:10:00", + "2017-02-06 23:15:00", + "2017-02-06 23:20:00", + "2017-02-06 23:25:00", + "2017-02-07 09:00:00", + "2017-02-07 09:05:00", + "2017-02-07 09:10:00", + "2017-02-07 09:15:00", + "2017-02-07 09:20:00", + "2017-02-07 09:25:00", + "2017-02-07 09:30:00", + "2017-02-07 09:35:00", + "2017-02-07 09:40:00", + "2017-02-07 09:45:00", + "2017-02-07 09:50:00", + "2017-02-07 09:55:00", + "2017-02-07 10:00:00", + "2017-02-07 10:05:00", + "2017-02-07 10:10:00", + "2017-02-07 10:30:00", + "2017-02-07 10:35:00", + "2017-02-07 10:40:00", + "2017-02-07 10:45:00", + "2017-02-07 10:50:00", + "2017-02-07 10:55:00", + "2017-02-07 11:00:00", + "2017-02-07 11:05:00", + "2017-02-07 11:10:00", + "2017-02-07 11:15:00", + "2017-02-07 11:20:00", + "2017-02-07 11:25:00", + "2017-02-07 13:30:00", + "2017-02-07 13:35:00", + "2017-02-07 13:40:00", + "2017-02-07 13:45:00", + "2017-02-07 13:50:00", + "2017-02-07 13:55:00", + "2017-02-07 14:00:00", + "2017-02-07 14:05:00", + "2017-02-07 14:10:00", + "2017-02-07 14:15:00", + "2017-02-07 14:20:00", + "2017-02-07 14:25:00", + "2017-02-07 14:30:00", + "2017-02-07 14:35:00", + "2017-02-07 14:40:00", + "2017-02-07 14:45:00", + "2017-02-07 14:50:00", + "2017-02-07 14:55:00", + "2017-02-07 21:00:00", + "2017-02-07 21:05:00", + "2017-02-07 21:10:00", + "2017-02-07 21:15:00", + "2017-02-07 21:20:00", + "2017-02-07 21:25:00", + "2017-02-07 21:30:00", + "2017-02-07 21:35:00", + "2017-02-07 21:40:00", + "2017-02-07 21:45:00", + "2017-02-07 21:50:00", + "2017-02-07 21:55:00", + "2017-02-07 22:00:00", + "2017-02-07 22:05:00", + "2017-02-07 22:10:00", + "2017-02-07 22:15:00", + "2017-02-07 22:20:00", + "2017-02-07 22:25:00", + "2017-02-07 22:30:00", + "2017-02-07 22:35:00", + "2017-02-07 22:40:00", + "2017-02-07 22:45:00", + "2017-02-07 22:50:00", + "2017-02-07 22:55:00", + "2017-02-07 23:00:00", + "2017-02-07 23:05:00", + "2017-02-07 23:10:00", + "2017-02-07 23:15:00", + "2017-02-07 23:20:00", + "2017-02-07 23:25:00", + "2017-02-08 09:00:00", + "2017-02-08 09:05:00", + "2017-02-08 09:10:00", + "2017-02-08 09:15:00", + "2017-02-08 09:20:00", + "2017-02-08 09:25:00", + "2017-02-08 09:30:00", + "2017-02-08 09:35:00", + "2017-02-08 09:40:00", + "2017-02-08 09:45:00", + "2017-02-08 09:50:00", + "2017-02-08 09:55:00", + "2017-02-08 10:00:00", + "2017-02-08 10:05:00", + "2017-02-08 10:10:00", + "2017-02-08 10:30:00", + "2017-02-08 10:35:00", + "2017-02-08 10:40:00", + "2017-02-08 10:45:00", + "2017-02-08 10:50:00", + "2017-02-08 10:55:00", + "2017-02-08 11:00:00", + "2017-02-08 11:05:00", + "2017-02-08 11:10:00", + "2017-02-08 11:15:00", + "2017-02-08 11:20:00", + "2017-02-08 11:25:00", + "2017-02-08 13:30:00", + "2017-02-08 13:35:00", + "2017-02-08 13:40:00", + "2017-02-08 13:45:00", + "2017-02-08 13:50:00", + "2017-02-08 13:55:00", + "2017-02-08 14:00:00", + "2017-02-08 14:05:00", + "2017-02-08 14:10:00", + "2017-02-08 14:15:00", + "2017-02-08 14:20:00", + "2017-02-08 14:25:00", + "2017-02-08 14:30:00", + "2017-02-08 14:35:00", + "2017-02-08 14:40:00", + "2017-02-08 14:45:00", + "2017-02-08 14:50:00", + "2017-02-08 14:55:00", + "2017-02-08 21:00:00", + "2017-02-08 21:05:00", + "2017-02-08 21:10:00", + "2017-02-08 21:15:00", + "2017-02-08 21:20:00", + "2017-02-08 21:25:00", + "2017-02-08 21:30:00", + "2017-02-08 21:35:00", + "2017-02-08 21:40:00", + "2017-02-08 21:45:00", + "2017-02-08 21:50:00", + "2017-02-08 21:55:00", + "2017-02-08 22:00:00", + "2017-02-08 22:05:00", + "2017-02-08 22:10:00", + "2017-02-08 22:15:00", + "2017-02-08 22:20:00", + "2017-02-08 22:25:00", + "2017-02-08 22:30:00", + "2017-02-08 22:35:00", + "2017-02-08 22:40:00", + "2017-02-08 22:45:00", + "2017-02-08 22:50:00", + "2017-02-08 22:55:00", + "2017-02-08 23:00:00", + "2017-02-08 23:05:00", + "2017-02-08 23:10:00", + "2017-02-08 23:15:00", + "2017-02-08 23:20:00", + "2017-02-08 23:25:00", + "2017-02-09 09:00:00", + "2017-02-09 09:05:00", + "2017-02-09 09:10:00", + "2017-02-09 09:15:00", + "2017-02-09 09:20:00", + "2017-02-09 09:25:00", + "2017-02-09 09:30:00", + "2017-02-09 09:35:00", + "2017-02-09 09:40:00", + "2017-02-09 09:45:00", + "2017-02-09 09:50:00", + "2017-02-09 09:55:00", + "2017-02-09 10:00:00", + "2017-02-09 10:05:00", + "2017-02-09 10:10:00", + "2017-02-09 10:30:00", + "2017-02-09 10:35:00", + "2017-02-09 10:40:00", + "2017-02-09 10:45:00", + "2017-02-09 10:50:00", + "2017-02-09 10:55:00", + "2017-02-09 11:00:00", + "2017-02-09 11:05:00", + "2017-02-09 11:10:00", + "2017-02-09 11:15:00", + "2017-02-09 11:20:00", + "2017-02-09 11:25:00", + "2017-02-09 13:30:00", + "2017-02-09 13:35:00", + "2017-02-09 13:40:00", + "2017-02-09 13:45:00", + "2017-02-09 13:50:00", + "2017-02-09 13:55:00", + "2017-02-09 14:00:00", + "2017-02-09 14:05:00", + "2017-02-09 14:10:00", + "2017-02-09 14:15:00", + "2017-02-09 14:20:00", + "2017-02-09 14:25:00", + "2017-02-09 14:30:00", + "2017-02-09 14:35:00", + "2017-02-09 14:40:00", + "2017-02-09 14:45:00", + "2017-02-09 14:50:00", + "2017-02-09 21:00:00", + "2017-02-09 21:05:00", + "2017-02-09 21:10:00", + "2017-02-09 21:15:00", + "2017-02-09 21:20:00", + "2017-02-09 21:25:00", + "2017-02-09 21:30:00", + "2017-02-09 21:35:00", + "2017-02-09 21:40:00", + "2017-02-09 21:45:00", + "2017-02-09 21:50:00", + "2017-02-09 21:55:00", + "2017-02-09 22:00:00", + "2017-02-09 22:05:00", + "2017-02-09 22:10:00", + "2017-02-09 22:15:00", + "2017-02-09 22:20:00", + "2017-02-09 22:25:00", + "2017-02-09 22:30:00", + "2017-02-09 22:35:00", + "2017-02-09 22:40:00", + "2017-02-09 22:45:00", + "2017-02-09 22:50:00", + "2017-02-09 22:55:00", + "2017-02-09 23:00:00", + "2017-02-09 23:05:00", + "2017-02-09 23:10:00", + "2017-02-09 23:15:00", + "2017-02-09 23:20:00", + "2017-02-09 23:25:00", + "2017-02-10 09:00:00", + "2017-02-10 09:05:00", + "2017-02-10 09:10:00", + "2017-02-10 09:15:00", + "2017-02-10 09:20:00", + "2017-02-10 09:25:00", + "2017-02-10 09:30:00", + "2017-02-10 09:35:00", + "2017-02-10 09:40:00", + "2017-02-10 09:45:00", + "2017-02-10 09:50:00", + "2017-02-10 09:55:00", + "2017-02-10 10:00:00", + "2017-02-10 10:05:00", + "2017-02-10 10:10:00", + "2017-02-10 10:30:00", + "2017-02-10 10:35:00", + "2017-02-10 10:40:00", + "2017-02-10 10:45:00", + "2017-02-10 10:50:00", + "2017-02-10 10:55:00", + "2017-02-10 11:00:00", + "2017-02-10 11:05:00", + "2017-02-10 11:10:00", + "2017-02-10 11:15:00", + "2017-02-10 11:20:00", + "2017-02-10 11:25:00", + "2017-02-10 13:30:00", + "2017-02-10 13:35:00", + "2017-02-10 13:40:00", + "2017-02-10 13:45:00", + "2017-02-10 13:50:00", + "2017-02-10 13:55:00", + "2017-02-10 14:00:00", + "2017-02-10 14:05:00", + "2017-02-10 14:10:00", + "2017-02-10 14:15:00", + "2017-02-10 14:20:00", + "2017-02-10 14:25:00", + "2017-02-10 14:30:00", + "2017-02-10 14:35:00", + "2017-02-10 14:40:00", + "2017-02-10 14:45:00", + "2017-02-10 14:50:00", + "2017-02-10 14:55:00", + "2017-02-10 21:00:00", + "2017-02-10 21:05:00", + "2017-02-10 21:10:00", + "2017-02-10 21:15:00", + "2017-02-10 21:20:00", + "2017-02-10 21:25:00", + "2017-02-10 21:30:00", + "2017-02-10 21:35:00", + "2017-02-10 21:40:00", + "2017-02-10 21:45:00", + "2017-02-10 21:50:00", + "2017-02-10 21:55:00", + "2017-02-10 22:00:00", + "2017-02-10 22:05:00", + "2017-02-10 22:10:00", + "2017-02-10 22:15:00", + "2017-02-10 22:20:00", + "2017-02-10 22:25:00", + "2017-02-10 22:30:00", + "2017-02-10 22:35:00", + "2017-02-10 22:40:00", + "2017-02-10 22:45:00", + "2017-02-10 22:50:00", + "2017-02-10 22:55:00", + "2017-02-10 23:00:00", + "2017-02-10 23:05:00", + "2017-02-10 23:10:00", + "2017-02-10 23:15:00", + "2017-02-10 23:20:00", + "2017-02-10 23:25:00", + "2017-02-10 23:25:00", + "2017-02-13 09:00:00", + "2017-02-13 09:05:00", + "2017-02-13 09:10:00", + "2017-02-13 09:15:00", + "2017-02-13 09:20:00", + "2017-02-13 09:25:00", + "2017-02-13 09:30:00", + "2017-02-13 09:35:00", + "2017-02-13 09:40:00", + "2017-02-13 09:45:00", + "2017-02-13 09:50:00", + "2017-02-13 09:55:00", + "2017-02-13 10:00:00", + "2017-02-13 10:05:00", + "2017-02-13 10:10:00", + "2017-02-13 10:30:00", + "2017-02-13 10:35:00", + "2017-02-13 10:40:00", + "2017-02-13 10:45:00", + "2017-02-13 10:50:00", + "2017-02-13 10:55:00", + "2017-02-13 11:00:00", + "2017-02-13 11:05:00", + "2017-02-13 11:10:00", + "2017-02-13 11:15:00", + "2017-02-13 11:20:00", + "2017-02-13 11:25:00", + "2017-02-13 13:30:00", + "2017-02-13 13:35:00", + "2017-02-13 13:40:00", + "2017-02-13 13:45:00", + "2017-02-13 13:50:00", + "2017-02-13 13:55:00", + "2017-02-13 14:00:00", + "2017-02-13 14:05:00", + "2017-02-13 14:10:00", + "2017-02-13 14:15:00", + "2017-02-13 14:20:00", + "2017-02-13 14:25:00", + "2017-02-13 14:30:00", + "2017-02-13 14:35:00", + "2017-02-13 14:40:00", + "2017-02-13 14:45:00", + "2017-02-13 14:50:00", + "2017-02-13 14:55:00" + ], + "low": [ + 6975, + 6972, + 6969, + 6964, + 6948, + 6964, + 6967, + 6966, + 6955, + 6962, + 6962, + 6961, + 6963, + 6960, + 6959, + 6962, + 6965, + 6965, + 6966, + 6970, + 6971, + 6971, + 6972, + 6970, + 6960, + 6962, + 6962, + 6967, + 6965, + 6965, + 6949, + 6950, + 6951, + 6954, + 6954, + 6955, + 6955, + 6960, + 6960, + 6955, + 6955, + 6957, + 6958, + 6958, + 6959, + 6962, + 6962, + 6974, + 6975, + 6975, + 6977, + 6978, + 6979, + 6978, + 6973, + 6975, + 6970, + 6969, + 6970, + 6971, + 6972, + 6977, + 6975, + 6975, + 6979, + 6977, + 6975, + 6976, + 6975, + 6973, + 6974, + 6974, + 6973, + 6971, + 6970, + 6951, + 6939, + 6946, + 6945, + 6942, + 6930, + 6928, + 6928, + 6935, + 6933, + 6934, + 6931, + 6930, + 6928, + 6925, + 6931, + 6932, + 6932, + 6933, + 6933, + 6932, + 6935, + 6935, + 6941, + 6943, + 6943, + 6934, + 6934, + 6936, + 6935, + 6909, + 6909, + 6913, + 6916, + 6915, + 6912, + 6915, + 6916, + 6917, + 6918, + 6920, + 6917, + 6913, + 6913, + 6915, + 6915, + 6919, + 6920, + 6920, + 6924, + 6920, + 6920, + 6921, + 6921, + 6917, + 6917, + 6917, + 6917, + 6920, + 6923, + 6920, + 6915, + 6916, + 6916, + 6922, + 6923, + 6924, + 6922, + 6922, + 6925, + 6927, + 6922, + 6919, + 6923, + 6931, + 6949, + 6953, + 6954, + 6952, + 6954, + 6951, + 6954, + 6946, + 6947, + 6948, + 6942, + 6943, + 6944, + 6944, + 6943, + 6943, + 6942, + 6944, + 6947, + 6943, + 6945, + 6948, + 6947, + 6948, + 6948, + 6948, + 6947, + 6947, + 6944, + 6942, + 6944, + 6942, + 6934, + 6933, + 6936, + 6935, + 6935, + 6936, + 6939, + 6942, + 6940, + 6938, + 6938, + 6939, + 6941, + 6940, + 6938, + 6937, + 6942, + 6945, + 6948, + 6947, + 6945, + 6944, + 6945, + 6944, + 6946, + 6946, + 6947, + 6944, + 6936, + 6929, + 6886, + 6885, + 6887, + 6885, + 6889, + 6893, + 6895, + 6899, + 6900, + 6896, + 6890, + 6888, + 6897, + 6893, + 6878, + 6882, + 6888, + 6904, + 6901, + 6903, + 6897, + 6897, + 6898, + 6903, + 6905, + 6907, + 6907, + 6909, + 6909, + 6907, + 6910, + 6908, + 6907, + 6908, + 6906, + 6906, + 6910, + 6910, + 6911, + 6912, + 6909, + 6910, + 6896, + 6898, + 6890, + 6888, + 6896, + 6893, + 6895, + 6895, + 6900, + 6898, + 6899, + 6897, + 6893, + 6895, + 6901, + 6900, + 6901, + 6900, + 6900, + 6895, + 6896, + 6891, + 6894, + 6898, + 6900, + 6897, + 6897, + 6898, + 6903, + 6905, + 6904, + 6908, + 6906, + 6909, + 6908, + 6908, + 6911, + 6910, + 6914, + 6910, + 6911, + 6908, + 6905, + 6907, + 6905, + 6901, + 6892, + 6893, + 6898, + 6896, + 6893, + 6902, + 6902, + 6904, + 6907, + 6906, + 6906, + 6908, + 6908, + 6908, + 6903, + 6897, + 6900, + 6901, + 6913, + 6912, + 6912, + 6913, + 6912, + 6913, + 6905, + 6906, + 6906, + 6905, + 6909, + 6910, + 6908, + 6914, + 6909, + 6911, + 6915, + 6944, + 6959, + 6950, + 6955, + 6962, + 6962, + 6964, + 6973, + 6959, + 6961, + 6961, + 6963, + 6966, + 6966, + 6964, + 6964, + 6968, + 6969, + 6973, + 6972, + 6966, + 6964, + 6968, + 6963, + 6956, + 6943, + 6948, + 6945, + 6945, + 6949, + 6950, + 6952, + 6954, + 6954, + 6955, + 6957, + 6957, + 6955, + 6954, + 6947 + ], + "high": [ + 6977, + 6980, + 6979, + 6971, + 6968, + 6970, + 6971, + 6970, + 6967, + 6968, + 6966, + 6966, + 6967, + 6965, + 6965, + 6967, + 6968, + 6967, + 6975, + 6974, + 6976, + 6975, + 6977, + 6976, + 6973, + 6967, + 6968, + 6970, + 6969, + 6975, + 6960, + 6955, + 6959, + 6963, + 6961, + 6959, + 6962, + 6964, + 6963, + 6960, + 6959, + 6962, + 6963, + 6960, + 6963, + 6966, + 6977, + 6987, + 6982, + 6983, + 6983, + 6985, + 6982, + 6983, + 6982, + 6979, + 6979, + 6973, + 6975, + 6975, + 6980, + 6980, + 6979, + 6981, + 6982, + 6982, + 6979, + 6980, + 6978, + 6977, + 6976, + 6981, + 6981, + 6974, + 6976, + 6965, + 6955, + 6955, + 6950, + 6947, + 6945, + 6935, + 6939, + 6938, + 6937, + 6936, + 6937, + 6934, + 6934, + 6933, + 6934, + 6938, + 6936, + 6937, + 6938, + 6937, + 6938, + 6946, + 6946, + 6947, + 6948, + 6945, + 6940, + 6939, + 6942, + 6924, + 6917, + 6922, + 6921, + 6918, + 6920, + 6919, + 6921, + 6920, + 6922, + 6924, + 6921, + 6918, + 6917, + 6917, + 6923, + 6926, + 6923, + 6930, + 6929, + 6926, + 6924, + 6925, + 6924, + 6923, + 6921, + 6920, + 6921, + 6924, + 6928, + 6925, + 6923, + 6920, + 6923, + 6928, + 6926, + 6928, + 6925, + 6927, + 6934, + 6931, + 6930, + 6926, + 6932, + 6957, + 6964, + 6962, + 6964, + 6964, + 6957, + 6957, + 6958, + 6957, + 6952, + 6955, + 6953, + 6949, + 6949, + 6949, + 6947, + 6948, + 6945, + 6950, + 6953, + 6948, + 6950, + 6951, + 6951, + 6952, + 6952, + 6951, + 6949, + 6950, + 6949, + 6947, + 6950, + 6947, + 6946, + 6939, + 6941, + 6940, + 6939, + 6939, + 6946, + 6945, + 6943, + 6941, + 6943, + 6942, + 6943, + 6944, + 6941, + 6944, + 6949, + 6949, + 6955, + 6953, + 6950, + 6947, + 6947, + 6948, + 6949, + 6949, + 6951, + 6948, + 6946, + 6939, + 6931, + 6904, + 6895, + 6899, + 6899, + 6898, + 6903, + 6904, + 6903, + 6905, + 6897, + 6894, + 6909, + 6902, + 6895, + 6889, + 6915, + 6909, + 6906, + 6908, + 6905, + 6901, + 6907, + 6908, + 6909, + 6911, + 6913, + 6913, + 6912, + 6912, + 6915, + 6913, + 6910, + 6912, + 6911, + 6911, + 6913, + 6913, + 6913, + 6917, + 6915, + 6914, + 6906, + 6907, + 6900, + 6900, + 6902, + 6897, + 6898, + 6901, + 6904, + 6903, + 6901, + 6900, + 6900, + 6901, + 6903, + 6909, + 6906, + 6906, + 6905, + 6901, + 6899, + 6897, + 6903, + 6903, + 6904, + 6902, + 6901, + 6908, + 6909, + 6914, + 6912, + 6911, + 6911, + 6914, + 6912, + 6913, + 6914, + 6924, + 6923, + 6917, + 6916, + 6915, + 6911, + 6910, + 6911, + 6917, + 6912, + 6902, + 6904, + 6904, + 6903, + 6910, + 6907, + 6910, + 6913, + 6910, + 6909, + 6913, + 6912, + 6911, + 6912, + 6904, + 6904, + 6918, + 6925, + 6918, + 6916, + 6918, + 6916, + 6917, + 6914, + 6911, + 6910, + 6911, + 6917, + 6910, + 6923, + 6923, + 6919, + 6917, + 6948, + 6985, + 6978, + 6963, + 6962, + 6969, + 6969, + 6980, + 6988, + 6981, + 6970, + 6966, + 6972, + 6973, + 6969, + 6969, + 6971, + 6972, + 6975, + 6980, + 6982, + 6974, + 6969, + 6976, + 6970, + 6966, + 6957, + 6951, + 6951, + 6955, + 6954, + 6955, + 6957, + 6959, + 6958, + 6959, + 6960, + 6960, + 6963, + 6960, + 6957 + ], + "open": [ + 6976, + 6975, + 6977, + 6970, + 6968, + 6965, + 6968, + 6969, + 6967, + 6962, + 6966, + 6963, + 6963, + 6965, + 6964, + 6963, + 6966, + 6967, + 6966, + 6973, + 6972, + 6971, + 6975, + 6975, + 6972, + 6963, + 6966, + 6969, + 6969, + 6967, + 6959, + 6950, + 6955, + 6956, + 6955, + 6958, + 6957, + 6960, + 6962, + 6960, + 6959, + 6957, + 6961, + 6959, + 6959, + 6963, + 6962, + 6978, + 6978, + 6976, + 6981, + 6979, + 6980, + 6979, + 6981, + 6975, + 6979, + 6972, + 6972, + 6974, + 6972, + 6977, + 6979, + 6976, + 6979, + 6980, + 6978, + 6977, + 6977, + 6976, + 6974, + 6974, + 6979, + 6973, + 6972, + 6959, + 6953, + 6953, + 6946, + 6946, + 6944, + 6933, + 6929, + 6936, + 6937, + 6936, + 6935, + 6931, + 6934, + 6930, + 6932, + 6934, + 6933, + 6936, + 6935, + 6932, + 6936, + 6936, + 6944, + 6943, + 6947, + 6944, + 6934, + 6937, + 6938, + 6924, + 6912, + 6916, + 6921, + 6917, + 6916, + 6919, + 6918, + 6917, + 6920, + 6922, + 6919, + 6916, + 6917, + 6917, + 6915, + 6923, + 6921, + 6921, + 6926, + 6925, + 6921, + 6922, + 6921, + 6923, + 6920, + 6919, + 6919, + 6920, + 6923, + 6924, + 6921, + 6918, + 6918, + 6922, + 6926, + 6925, + 6925, + 6922, + 6926, + 6931, + 6929, + 6924, + 6925, + 6931, + 6950, + 6958, + 6954, + 6963, + 6956, + 6955, + 6955, + 6955, + 6948, + 6951, + 6953, + 6945, + 6948, + 6946, + 6947, + 6947, + 6944, + 6944, + 6949, + 6948, + 6946, + 6949, + 6950, + 6948, + 6950, + 6950, + 6949, + 6948, + 6948, + 6946, + 6946, + 6947, + 6945, + 6939, + 6938, + 6937, + 6936, + 6936, + 6939, + 6945, + 6942, + 6940, + 6938, + 6941, + 6942, + 6942, + 6941, + 6938, + 6944, + 6946, + 6949, + 6953, + 6949, + 6945, + 6945, + 6945, + 6948, + 6948, + 6948, + 6948, + 6945, + 6938, + 6930, + 6889, + 6893, + 6891, + 6893, + 6895, + 6896, + 6902, + 6901, + 6903, + 6897, + 6892, + 6900, + 6901, + 6894, + 6884, + 6889, + 6907, + 6906, + 6904, + 6904, + 6900, + 6898, + 6905, + 6906, + 6908, + 6910, + 6910, + 6910, + 6911, + 6910, + 6912, + 6909, + 6910, + 6908, + 6910, + 6913, + 6912, + 6912, + 6912, + 6914, + 6912, + 6906, + 6901, + 6898, + 6891, + 6897, + 6897, + 6896, + 6897, + 6901, + 6903, + 6899, + 6899, + 6899, + 6895, + 6901, + 6902, + 6906, + 6902, + 6905, + 6900, + 6897, + 6897, + 6895, + 6901, + 6900, + 6902, + 6900, + 6898, + 6906, + 6906, + 6911, + 6909, + 6908, + 6911, + 6910, + 6910, + 6912, + 6914, + 6923, + 6915, + 6911, + 6915, + 6908, + 6910, + 6908, + 6907, + 6912, + 6895, + 6900, + 6902, + 6895, + 6902, + 6907, + 6904, + 6907, + 6908, + 6908, + 6908, + 6911, + 6911, + 6909, + 6904, + 6900, + 6901, + 6915, + 6916, + 6915, + 6914, + 6915, + 6915, + 6914, + 6908, + 6910, + 6906, + 6909, + 6910, + 6914, + 6921, + 6916, + 6912, + 6916, + 6946, + 6975, + 6963, + 6956, + 6962, + 6967, + 6966, + 6978, + 6977, + 6969, + 6964, + 6964, + 6969, + 6968, + 6966, + 6967, + 6970, + 6970, + 6974, + 6980, + 6973, + 6967, + 6969, + 6969, + 6965, + 6956, + 6951, + 6950, + 6947, + 6953, + 6953, + 6954, + 6956, + 6957, + 6955, + 6959, + 6959, + 6958, + 6959, + 6957 + ], + "close": [ + 6975, + 6978, + 6970, + 6968, + 6965, + 6968, + 6968, + 6967, + 6963, + 6966, + 6963, + 6964, + 6965, + 6965, + 6963, + 6966, + 6967, + 6966, + 6973, + 6972, + 6971, + 6975, + 6975, + 6973, + 6963, + 6966, + 6968, + 6968, + 6966, + 6965, + 6949, + 6955, + 6956, + 6955, + 6959, + 6956, + 6960, + 6962, + 6960, + 6958, + 6957, + 6961, + 6959, + 6959, + 6962, + 6962, + 6977, + 6978, + 6976, + 6981, + 6979, + 6980, + 6979, + 6981, + 6975, + 6979, + 6972, + 6971, + 6974, + 6972, + 6977, + 6979, + 6976, + 6980, + 6980, + 6978, + 6977, + 6977, + 6976, + 6974, + 6974, + 6979, + 6973, + 6972, + 6972, + 6953, + 6952, + 6946, + 6945, + 6944, + 6932, + 6930, + 6937, + 6937, + 6936, + 6935, + 6931, + 6933, + 6931, + 6932, + 6934, + 6933, + 6935, + 6936, + 6933, + 6937, + 6936, + 6945, + 6944, + 6947, + 6944, + 6934, + 6938, + 6938, + 6942, + 6912, + 6916, + 6921, + 6918, + 6916, + 6919, + 6918, + 6917, + 6920, + 6922, + 6920, + 6917, + 6918, + 6917, + 6916, + 6922, + 6921, + 6922, + 6925, + 6925, + 6921, + 6922, + 6921, + 6923, + 6920, + 6919, + 6918, + 6920, + 6923, + 6924, + 6921, + 6918, + 6918, + 6922, + 6926, + 6925, + 6925, + 6922, + 6926, + 6930, + 6929, + 6924, + 6924, + 6930, + 6947, + 6958, + 6955, + 6964, + 6957, + 6955, + 6955, + 6955, + 6948, + 6950, + 6953, + 6945, + 6948, + 6946, + 6948, + 6947, + 6944, + 6944, + 6950, + 6948, + 6946, + 6949, + 6950, + 6948, + 6950, + 6950, + 6949, + 6948, + 6949, + 6945, + 6944, + 6947, + 6945, + 6939, + 6939, + 6937, + 6936, + 6937, + 6939, + 6945, + 6943, + 6940, + 6938, + 6941, + 6942, + 6942, + 6941, + 6938, + 6944, + 6946, + 6949, + 6952, + 6949, + 6946, + 6945, + 6945, + 6948, + 6948, + 6948, + 6948, + 6945, + 6938, + 6929, + 6887, + 6893, + 6890, + 6892, + 6896, + 6897, + 6902, + 6902, + 6903, + 6897, + 6892, + 6891, + 6902, + 6895, + 6883, + 6889, + 6906, + 6906, + 6904, + 6905, + 6899, + 6898, + 6905, + 6906, + 6908, + 6910, + 6910, + 6910, + 6911, + 6910, + 6912, + 6909, + 6910, + 6908, + 6910, + 6911, + 6911, + 6912, + 6913, + 6914, + 6912, + 6913, + 6901, + 6899, + 6891, + 6897, + 6897, + 6896, + 6897, + 6900, + 6903, + 6899, + 6900, + 6900, + 6895, + 6901, + 6902, + 6906, + 6902, + 6905, + 6900, + 6897, + 6897, + 6895, + 6901, + 6900, + 6902, + 6900, + 6899, + 6906, + 6906, + 6910, + 6909, + 6908, + 6910, + 6910, + 6910, + 6913, + 6914, + 6923, + 6915, + 6912, + 6915, + 6908, + 6910, + 6908, + 6909, + 6912, + 6895, + 6901, + 6902, + 6896, + 6902, + 6907, + 6904, + 6907, + 6909, + 6908, + 6908, + 6911, + 6911, + 6909, + 6904, + 6901, + 6901, + 6915, + 6916, + 6915, + 6914, + 6915, + 6915, + 6915, + 6908, + 6910, + 6906, + 6910, + 6910, + 6910, + 6921, + 6917, + 6912, + 6916, + 6947, + 6974, + 6963, + 6956, + 6962, + 6967, + 6966, + 6978, + 6977, + 6969, + 6965, + 6964, + 6969, + 6969, + 6966, + 6968, + 6970, + 6970, + 6974, + 6979, + 6974, + 6967, + 6968, + 6969, + 6965, + 6956, + 6951, + 6950, + 6947, + 6953, + 6953, + 6954, + 6956, + 6957, + 6955, + 6959, + 6959, + 6957, + 6959, + 6957, + 6952 + ] + }, + { + "name": "SAR", + "type": "scatter", + "x": [ + "2017-02-06 21:00:00", + "2017-02-06 21:05:00", + "2017-02-06 21:10:00", + "2017-02-06 21:15:00", + "2017-02-06 21:20:00", + "2017-02-06 21:25:00", + "2017-02-06 21:30:00", + "2017-02-06 21:35:00", + "2017-02-06 21:40:00", + "2017-02-06 21:45:00", + "2017-02-06 21:50:00", + "2017-02-06 21:55:00", + "2017-02-06 22:00:00", + "2017-02-06 22:05:00", + "2017-02-06 22:10:00", + "2017-02-06 22:15:00", + "2017-02-06 22:20:00", + "2017-02-06 22:25:00", + "2017-02-06 22:30:00", + "2017-02-06 22:35:00", + "2017-02-06 22:40:00", + "2017-02-06 22:45:00", + "2017-02-06 22:50:00", + "2017-02-06 22:55:00", + "2017-02-06 23:00:00", + "2017-02-06 23:05:00", + "2017-02-06 23:10:00", + "2017-02-06 23:15:00", + "2017-02-06 23:20:00", + "2017-02-06 23:25:00", + "2017-02-07 09:00:00", + "2017-02-07 09:05:00", + "2017-02-07 09:10:00", + "2017-02-07 09:15:00", + "2017-02-07 09:20:00", + "2017-02-07 09:25:00", + "2017-02-07 09:30:00", + "2017-02-07 09:35:00", + "2017-02-07 09:40:00", + "2017-02-07 09:45:00", + "2017-02-07 09:50:00", + "2017-02-07 09:55:00", + "2017-02-07 10:00:00", + "2017-02-07 10:05:00", + "2017-02-07 10:10:00", + "2017-02-07 10:30:00", + "2017-02-07 10:35:00", + "2017-02-07 10:40:00", + "2017-02-07 10:45:00", + "2017-02-07 10:50:00", + "2017-02-07 10:55:00", + "2017-02-07 11:00:00", + "2017-02-07 11:05:00", + "2017-02-07 11:10:00", + "2017-02-07 11:15:00", + "2017-02-07 11:20:00", + "2017-02-07 11:25:00", + "2017-02-07 13:30:00", + "2017-02-07 13:35:00", + "2017-02-07 13:40:00", + "2017-02-07 13:45:00", + "2017-02-07 13:50:00", + "2017-02-07 13:55:00", + "2017-02-07 14:00:00", + "2017-02-07 14:05:00", + "2017-02-07 14:10:00", + "2017-02-07 14:15:00", + "2017-02-07 14:20:00", + "2017-02-07 14:25:00", + "2017-02-07 14:30:00", + "2017-02-07 14:35:00", + "2017-02-07 14:40:00", + "2017-02-07 14:45:00", + "2017-02-07 14:50:00", + "2017-02-07 14:55:00", + "2017-02-07 21:00:00", + "2017-02-07 21:05:00", + "2017-02-07 21:10:00", + "2017-02-07 21:15:00", + "2017-02-07 21:20:00", + "2017-02-07 21:25:00", + "2017-02-07 21:30:00", + "2017-02-07 21:35:00", + "2017-02-07 21:40:00", + "2017-02-07 21:45:00", + "2017-02-07 21:50:00", + "2017-02-07 21:55:00", + "2017-02-07 22:00:00", + "2017-02-07 22:05:00", + "2017-02-07 22:10:00", + "2017-02-07 22:15:00", + "2017-02-07 22:20:00", + "2017-02-07 22:25:00", + "2017-02-07 22:30:00", + "2017-02-07 22:35:00", + "2017-02-07 22:40:00", + "2017-02-07 22:45:00", + "2017-02-07 22:50:00", + "2017-02-07 22:55:00", + "2017-02-07 23:00:00", + "2017-02-07 23:05:00", + "2017-02-07 23:10:00", + "2017-02-07 23:15:00", + "2017-02-07 23:20:00", + "2017-02-07 23:25:00", + "2017-02-08 09:00:00", + "2017-02-08 09:05:00", + "2017-02-08 09:10:00", + "2017-02-08 09:15:00", + "2017-02-08 09:20:00", + "2017-02-08 09:25:00", + "2017-02-08 09:30:00", + "2017-02-08 09:35:00", + "2017-02-08 09:40:00", + "2017-02-08 09:45:00", + "2017-02-08 09:50:00", + "2017-02-08 09:55:00", + "2017-02-08 10:00:00", + "2017-02-08 10:05:00", + "2017-02-08 10:10:00", + "2017-02-08 10:30:00", + "2017-02-08 10:35:00", + "2017-02-08 10:40:00", + "2017-02-08 10:45:00", + "2017-02-08 10:50:00", + "2017-02-08 10:55:00", + "2017-02-08 11:00:00", + "2017-02-08 11:05:00", + "2017-02-08 11:10:00", + "2017-02-08 11:15:00", + "2017-02-08 11:20:00", + "2017-02-08 11:25:00", + "2017-02-08 13:30:00", + "2017-02-08 13:35:00", + "2017-02-08 13:40:00", + "2017-02-08 13:45:00", + "2017-02-08 13:50:00", + "2017-02-08 13:55:00", + "2017-02-08 14:00:00", + "2017-02-08 14:05:00", + "2017-02-08 14:10:00", + "2017-02-08 14:15:00", + "2017-02-08 14:20:00", + "2017-02-08 14:25:00", + "2017-02-08 14:30:00", + "2017-02-08 14:35:00", + "2017-02-08 14:40:00", + "2017-02-08 14:45:00", + "2017-02-08 14:50:00", + "2017-02-08 14:55:00", + "2017-02-08 21:00:00", + "2017-02-08 21:05:00", + "2017-02-08 21:10:00", + "2017-02-08 21:15:00", + "2017-02-08 21:20:00", + "2017-02-08 21:25:00", + "2017-02-08 21:30:00", + "2017-02-08 21:35:00", + "2017-02-08 21:40:00", + "2017-02-08 21:45:00", + "2017-02-08 21:50:00", + "2017-02-08 21:55:00", + "2017-02-08 22:00:00", + "2017-02-08 22:05:00", + "2017-02-08 22:10:00", + "2017-02-08 22:15:00", + "2017-02-08 22:20:00", + "2017-02-08 22:25:00", + "2017-02-08 22:30:00", + "2017-02-08 22:35:00", + "2017-02-08 22:40:00", + "2017-02-08 22:45:00", + "2017-02-08 22:50:00", + "2017-02-08 22:55:00", + "2017-02-08 23:00:00", + "2017-02-08 23:05:00", + "2017-02-08 23:10:00", + "2017-02-08 23:15:00", + "2017-02-08 23:20:00", + "2017-02-08 23:25:00", + "2017-02-09 09:00:00", + "2017-02-09 09:05:00", + "2017-02-09 09:10:00", + "2017-02-09 09:15:00", + "2017-02-09 09:20:00", + "2017-02-09 09:25:00", + "2017-02-09 09:30:00", + "2017-02-09 09:35:00", + "2017-02-09 09:40:00", + "2017-02-09 09:45:00", + "2017-02-09 09:50:00", + "2017-02-09 09:55:00", + "2017-02-09 10:00:00", + "2017-02-09 10:05:00", + "2017-02-09 10:10:00", + "2017-02-09 10:30:00", + "2017-02-09 10:35:00", + "2017-02-09 10:40:00", + "2017-02-09 10:45:00", + "2017-02-09 10:50:00", + "2017-02-09 10:55:00", + "2017-02-09 11:00:00", + "2017-02-09 11:05:00", + "2017-02-09 11:10:00", + "2017-02-09 11:15:00", + "2017-02-09 11:20:00", + "2017-02-09 11:25:00", + "2017-02-09 13:30:00", + "2017-02-09 13:35:00", + "2017-02-09 13:40:00", + "2017-02-09 13:45:00", + "2017-02-09 13:50:00", + "2017-02-09 13:55:00", + "2017-02-09 14:00:00", + "2017-02-09 14:05:00", + "2017-02-09 14:10:00", + "2017-02-09 14:15:00", + "2017-02-09 14:20:00", + "2017-02-09 14:25:00", + "2017-02-09 14:30:00", + "2017-02-09 14:35:00", + "2017-02-09 14:40:00", + "2017-02-09 14:45:00", + "2017-02-09 14:50:00", + "2017-02-09 21:00:00", + "2017-02-09 21:05:00", + "2017-02-09 21:10:00", + "2017-02-09 21:15:00", + "2017-02-09 21:20:00", + "2017-02-09 21:25:00", + "2017-02-09 21:30:00", + "2017-02-09 21:35:00", + "2017-02-09 21:40:00", + "2017-02-09 21:45:00", + "2017-02-09 21:50:00", + "2017-02-09 21:55:00", + "2017-02-09 22:00:00", + "2017-02-09 22:05:00", + "2017-02-09 22:10:00", + "2017-02-09 22:15:00", + "2017-02-09 22:20:00", + "2017-02-09 22:25:00", + "2017-02-09 22:30:00", + "2017-02-09 22:35:00", + "2017-02-09 22:40:00", + "2017-02-09 22:45:00", + "2017-02-09 22:50:00", + "2017-02-09 22:55:00", + "2017-02-09 23:00:00", + "2017-02-09 23:05:00", + "2017-02-09 23:10:00", + "2017-02-09 23:15:00", + "2017-02-09 23:20:00", + "2017-02-09 23:25:00", + "2017-02-10 09:00:00", + "2017-02-10 09:05:00", + "2017-02-10 09:10:00", + "2017-02-10 09:15:00", + "2017-02-10 09:20:00", + "2017-02-10 09:25:00", + "2017-02-10 09:30:00", + "2017-02-10 09:35:00", + "2017-02-10 09:40:00", + "2017-02-10 09:45:00", + "2017-02-10 09:50:00", + "2017-02-10 09:55:00", + "2017-02-10 10:00:00", + "2017-02-10 10:05:00", + "2017-02-10 10:10:00", + "2017-02-10 10:30:00", + "2017-02-10 10:35:00", + "2017-02-10 10:40:00", + "2017-02-10 10:45:00", + "2017-02-10 10:50:00", + "2017-02-10 10:55:00", + "2017-02-10 11:00:00", + "2017-02-10 11:05:00", + "2017-02-10 11:10:00", + "2017-02-10 11:15:00", + "2017-02-10 11:20:00", + "2017-02-10 11:25:00", + "2017-02-10 13:30:00", + "2017-02-10 13:35:00", + "2017-02-10 13:40:00", + "2017-02-10 13:45:00", + "2017-02-10 13:50:00", + "2017-02-10 13:55:00", + "2017-02-10 14:00:00", + "2017-02-10 14:05:00", + "2017-02-10 14:10:00", + "2017-02-10 14:15:00", + "2017-02-10 14:20:00", + "2017-02-10 14:25:00", + "2017-02-10 14:30:00", + "2017-02-10 14:35:00", + "2017-02-10 14:40:00", + "2017-02-10 14:45:00", + "2017-02-10 14:50:00", + "2017-02-10 14:55:00", + "2017-02-10 21:00:00", + "2017-02-10 21:05:00", + "2017-02-10 21:10:00", + "2017-02-10 21:15:00", + "2017-02-10 21:20:00", + "2017-02-10 21:25:00", + "2017-02-10 21:30:00", + "2017-02-10 21:35:00", + "2017-02-10 21:40:00", + "2017-02-10 21:45:00", + "2017-02-10 21:50:00", + "2017-02-10 21:55:00", + "2017-02-10 22:00:00", + "2017-02-10 22:05:00", + "2017-02-10 22:10:00", + "2017-02-10 22:15:00", + "2017-02-10 22:20:00", + "2017-02-10 22:25:00", + "2017-02-10 22:30:00", + "2017-02-10 22:35:00", + "2017-02-10 22:40:00", + "2017-02-10 22:45:00", + "2017-02-10 22:50:00", + "2017-02-10 22:55:00", + "2017-02-10 23:00:00", + "2017-02-10 23:05:00", + "2017-02-10 23:10:00", + "2017-02-10 23:15:00", + "2017-02-10 23:20:00", + "2017-02-10 23:25:00", + "2017-02-10 23:25:00", + "2017-02-13 09:00:00", + "2017-02-13 09:05:00", + "2017-02-13 09:10:00", + "2017-02-13 09:15:00", + "2017-02-13 09:20:00", + "2017-02-13 09:25:00", + "2017-02-13 09:30:00", + "2017-02-13 09:35:00", + "2017-02-13 09:40:00", + "2017-02-13 09:45:00", + "2017-02-13 09:50:00", + "2017-02-13 09:55:00", + "2017-02-13 10:00:00", + "2017-02-13 10:05:00", + "2017-02-13 10:10:00", + "2017-02-13 10:30:00", + "2017-02-13 10:35:00", + "2017-02-13 10:40:00", + "2017-02-13 10:45:00", + "2017-02-13 10:50:00", + "2017-02-13 10:55:00", + "2017-02-13 11:00:00", + "2017-02-13 11:05:00", + "2017-02-13 11:10:00", + "2017-02-13 11:15:00", + "2017-02-13 11:20:00", + "2017-02-13 11:25:00", + "2017-02-13 13:30:00", + "2017-02-13 13:35:00", + "2017-02-13 13:40:00", + "2017-02-13 13:45:00", + "2017-02-13 13:50:00", + "2017-02-13 13:55:00", + "2017-02-13 14:00:00", + "2017-02-13 14:05:00", + "2017-02-13 14:10:00", + "2017-02-13 14:15:00", + "2017-02-13 14:20:00", + "2017-02-13 14:25:00", + "2017-02-13 14:30:00", + "2017-02-13 14:35:00", + "2017-02-13 14:40:00", + "2017-02-13 14:45:00", + "2017-02-13 14:50:00", + "2017-02-13 14:55:00" + ], + "y": [ + null, + 6980, + 6980, + 6980, + 6979.04, + 6976.5568, + 6974.272256, + 6972.17047552, + 6971, + 6970, + 6968.24, + 6968, + 6948, + 6948.38, + 6948.7524, + 6949.117352, + 6949.475004960001, + 6950.216004761601, + 6950.927364571136, + 6952.371722696868, + 6953.729419335056, + 6955.5110657882515, + 6957.150180525191, + 6959.135162472672, + 6977, + 6976.66, + 6976.3268, + 6976.000264, + 6975.68025872, + 6975.3666535456, + 6975.059320474687, + 6975, + 6973.96, + 6972.9616, + 6972.003135999999, + 6971.08301056, + 6970.1996901376, + 6969.351702532095, + 6968.5376344308115, + 6967.756129053579, + 6967.005883891436, + 6966.285648535778, + 6965.594222594347, + 6964.930453690573, + 6964.29323554295, + 6949, + 6949.34, + 6950.4464, + 6952.6396159999995, + 6954.70123904, + 6956.6391646976, + 6958.460814815744, + 6960.1731659268, + 6961.782775971192, + 6963.29580941292, + 6964.718060848145, + 6966.054977197256, + 6967.311678565421, + 6968.492977851496, + 6969, + 6970, + 6971, + 6971.96, + 6972.8624, + 6973.710656, + 6974.50801664, + 6987, + 6986.76, + 6986.5248, + 6986.294304, + 6985.76253184, + 6985.252030566399, + 6984.761949343743, + 6984.291471369994, + 6983.493983087794, + 6982.414464440771, + 6979.273017996694, + 6974.44025583709, + 6970.18742513664, + 6966.4449341202435, + 6963.151542025815, + 6958.510326142201, + 6953.628673959449, + 6949.528086125937, + 6946.083592345787, + 6943.190217570461, + 6940.759782759187, + 6938.718217517717, + 6937.003302714882, + 6935.562774280501, + 6925, + 6925, + 6925.52, + 6926.019200000001, + 6926.498432, + 6926.95849472, + 6927.4001549312, + 6927.824148733952, + 6928.914699809915, + 6929.9398178213205, + 6931.304632395615, + 6932.974169156054, + 6948, + 6947.72, + 6947.4456, + 6947.176688, + 6945.64962048, + 6944.1836356608, + 6942.776290234368, + 6941.425238624994, + 6940.128229079994, + 6938.883099916794, + 6937.6877759201225, + 6936.540264883318, + 6935.438654287985, + 6934.381108116465, + 6933.365863791806, + 6932.391229240134, + 6931.455580070528, + 6930.557356867707, + 6929.695062592999, + 6928.86726008928, + 6928.072569685708, + 6909, + 6909.42, + 6909.8316, + 6910.234968000001, + 6910.63026864, + 6911.0176632672, + 6911.397310001856, + 6911.769363801818, + 6912.133976525782, + 6912.491296995266, + 6912.841471055361, + 6913.184641634253, + 6913.520948801568, + 6913.850529825537, + 6914.173519229026, + 6914.4900488444455, + 6914.800247867556, + 6915.104242910205, + 6915.402158052001, + 6915.694114890961, + 6915.980232593141, + 6916.2606279412785, + 6916.970202823627, + 6917.651394710682, + 6918.305338922255, + 6918.9331253653645, + 6919, + 6921.28, + 6924.6975999999995, + 6927.841791999999, + 6930.73444864, + 6933.3956927488, + 6935.844037328896, + 6938.096514342584, + 6940.168793195177, + 6942.075289739563, + 6943.8292665603985, + 6964, + 6963.56, + 6963.1288, + 6962.7062240000005, + 6962.29209952, + 6961.8862575296, + 6961.488532379008, + 6961.098761731428, + 6960.716786496799, + 6960.342450766862, + 6959.975601751526, + 6959.6160897164955, + 6959.263767922165, + 6958.918492563722, + 6958.5801227124475, + 6958.248520258198, + 6957.923549853034, + 6957.605078855973, + 6957.292977278854, + 6956.987117733277, + 6956.687375378611, + 6956.393627871039, + 6956.105755313618, + 6955.221525101073, + 6953.888233595008, + 6952.634939579308, + 6951.456843204549, + 6950.349432612276, + 6949.30846665554, + 6948.329958656207, + 6947.410161136835, + 6946.545551468625, + 6945.7328183805075, + 6944.968849277677, + 6944.250718321016, + 6933, + 6933.22, + 6933.435600000001, + 6933.646888000001, + 6934.261012480001, + 6934.850571980801, + 6936.059537661953, + 6937.195965402236, + 6938.2642074781015, + 6939.268355029415, + 6940.21225372765, + 6941.099518503991, + 6941.933547393752, + 6942.717534550126, + 6943.454482477119, + 6955, + 6954.62, + 6953.5952, + 6949.539487999999, + 6944.376328959999, + 6939.626222643199, + 6935.256124831743, + 6931.235634845204, + 6927.536784057587, + 6924.13384133298, + 6921.003134026342, + 6918.122883304235, + 6915.473052639896, + 6913.035208428704, + 6910.792391754408, + 6909, + 6909, + 6905.9, + 6878, + 6878.74, + 6879.4652, + 6880.175896, + 6880.87237808, + 6881.5549305184, + 6882.2238319080325, + 6882.879355269872, + 6883.521768164474, + 6884.151332801185, + 6884.768306145162, + 6885.372940022258, + 6885.965481221813, + 6886.546171597377, + 6887.11524816543, + 6887.672943202121, + 6888.2194843380785, + 6888.7550946513165, + 6889.27999275829, + 6889.794392903124, + 6890.298505045062, + 6890.79253494416, + 6891.2766842452775, + 6891.751150560372, + 6892.761104537956, + 6893.730660356438, + 6894.661433942181, + 6895.554976584494, + 6917, + 6916.46, + 6915.3216, + 6914.228736, + 6913.17958656, + 6912.1724030976, + 6911.205506973696, + 6910.277286694748, + 6909.386195226958, + 6908.53074741788, + 6907.709517521164, + 6906.921136820318, + 6906.164291347505, + 6888, + 6888.42, + 6888.8316, + 6889.234968000001, + 6889.63026864, + 6890.0176632672, + 6890.397310001856, + 6890.769363801818, + 6891, + 6891.36, + 6891.712799999999, + 6892.0585439999995, + 6892.397373119999, + 6892.7294256576, + 6893.054837144447, + 6893.89264365867, + 6894.696937912323, + 6895.46906039583, + 6896.2102979799965, + 6896.921886060797, + 6897.605010618365, + 6898.26081019363, + 6898.890377785885, + 6900.396955118732, + 6901.813137811608, + 6903.144349542911, + 6904.3956885703365, + 6924, + 6923.62, + 6923.2476, + 6922.882648, + 6922.00734208, + 6920.2069015552, + 6918.514487461887, + 6916.923618214174, + 6915.428201121324, + 6914.022509054044, + 6912.701158510802, + 6911.459089000154, + 6892, + 6892.42, + 6892.8316, + 6893.234968000001, + 6893.63026864, + 6894.0176632672, + 6894.397310001856, + 6894.769363801818, + 6895.133976525782, + 6895.491296995266, + 6896.391645115455, + 6898.108146408527, + 6899.721657624015, + 6901.2383581665745, + 6902.66405667658, + 6904.004213275985, + 6925, + 6924.6, + 6924.2080000000005, + 6923.823840000001, + 6923.447363200001, + 6923.078415936001, + 6905, + 6905.36, + 6905.712799999999, + 6906.0585439999995, + 6906.397373119999, + 6908.061478195199, + 6912.6777895034875, + 6917.0171221332785, + 6921.096094805282, + 6924.9303291169645, + 6928.534509369947, + 6931.92243880775, + 6935.107092479285, + 6939.338525080942, + 6943.231443074467, + 6946.81292762851, + 6950.107893418229, + 6953.139261944771, + 6955.928120989189, + 6958.493871310054, + 6960.854361605249, + 6963.026012676829, + 6964, + 6965.92, + 6967.6864000000005, + 6988, + 6987.56, + 6986.6176000000005, + 6985.712896000001, + 6984.350122240001, + 6982.082112460801, + 6978.173901214721, + 6974.656511093249, + 6971.490859983924, + 6968.6417739855315, + 6966.077596586978, + 6963.76983692828, + 6961.692853235452, + 6959.823567911907, + 6943, + 6943.32, + 6943.9872, + 6944.6277119999995, + 6945.73004928, + 6946.7662463232 + ] + } + ], + "layout": { + "xaxis": { + "tickformat": "%d %b %H:%M", + "tickfont": {"size": 8}, + "breaks": [ + { + "pattern": "%w", + "bounds": [6, 0], + "operation": "[]" + }, + { + "pattern": "%H", + "bounds": [0, 9], + "operation": "()" + }, + { + "pattern": "%H", + "bounds": [12, 13], + "operation": "()" + }, + { + "pattern": "%H", + "bounds": [15, 21], + "operation": "()" + } + ], + "rangeslider": { "visible": true } + }, + "legend": { + "x": 0, + "xanchor": "left", + "y": 1.05, + "yanchor": "bottom" + } + } +} diff --git a/test/jasmine/tests/range_slider_test.js b/test/jasmine/tests/range_slider_test.js index 36343fd0106..00ec969caa0 100644 --- a/test/jasmine/tests/range_slider_test.js +++ b/test/jasmine/tests/range_slider_test.js @@ -201,6 +201,40 @@ describe('Visible rangesliders', function() { .then(done); }); + it('should update correctly when moving slider on an axis with breaks', function(done) { + var start = 250; + var end = 300; + + Plotly.plot(gd, [{ + mode: 'lines', + x: [0, 10, 50, 90, 100, 150, 190, 200] + }], { + xaxis: { + breaks: [ + {bounds: [11, 89]}, + {bounds: [101, 189]} + ], + rangeslider: {visible: true} + }, + width: 800, + hieght: 500 + }) + .then(function() { + var bb = getRangeSlider().getBoundingClientRect(); + sliderY = bb.top + bb.height / 2; + }) + .then(function() { + expect(gd._fullLayout.xaxis.range).withContext('base xrng').toEqual([0, 200]); + }) + .then(function() { return slide(start, sliderY, end, sliderY); }) + .then(function() { + // x range would be ~ [15.625, 200] w/o breaks + expect(gd._fullLayout.xaxis.range).withContext('after xrng').toEqual([2.65625, 200]); + }) + .catch(failTest) + .then(done); + }); + it('should resize the main plot when rangeslider has moved', function(done) { var start = 300; var end = 400; From 3957d95423dff77be8054a3e60c274d2e6f1cf3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 4 Mar 2020 16:13:32 -0500 Subject: [PATCH 13/23] during l2p(v) when v falls into breaks, pick offset closest to it ... that way, positions that include some sort of offset (e.g. bar x0/x1, ohlc xo/xc) have the adequate px position. --- src/plots/cartesian/set_convert.js | 14 +- test/image/baselines/axes_breaks-bars.png | Bin 0 -> 21729 bytes test/image/baselines/axes_breaks-finance.png | Bin 0 -> 16363 bytes test/image/mocks/axes_breaks-bars.json | 30 ++ test/image/mocks/axes_breaks-finance.json | 391 +++++++++++++++++++ 5 files changed, 433 insertions(+), 2 deletions(-) create mode 100644 test/image/baselines/axes_breaks-bars.png create mode 100644 test/image/baselines/axes_breaks-finance.png create mode 100644 test/image/mocks/axes_breaks-bars.json create mode 100644 test/image/mocks/axes_breaks-finance.json diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index f65f7ed4740..a1b20afab11 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -198,7 +198,12 @@ module.exports = function setConvert(ax, fullLayout) { for(var i = 0; i < ax._breaks.length; i++) { var brk = ax._breaks[i]; if(v <= brk.min) b = ax._B[i + 1]; - else if(v > brk.max) break; + else if(v > brk.min && v < brk.max) { + // when v falls into break, pick offset 'closest' to it + if(v - brk.min <= brk.max - v) b = ax._B[i + 1]; + else b = ax._B[i]; + break; + } else if(v > brk.max) break; } return _l2p(v, -ax._m2, b); }; @@ -223,7 +228,12 @@ module.exports = function setConvert(ax, fullLayout) { for(var i = 0; i < ax._breaks.length; i++) { var brk = ax._breaks[i]; if(v >= brk.max) b = ax._B[i + 1]; - else if(v < brk.min) break; + else if(v > brk.min && v < brk.max) { + // when v falls into break, pick offset 'closest' to it + if(v - brk.min <= brk.max - v) b = ax._B[i]; + else b = ax._B[i + 1]; + break; + } else if(v < brk.min) break; } return _l2p(v, ax._m2, b); }; diff --git a/test/image/baselines/axes_breaks-bars.png b/test/image/baselines/axes_breaks-bars.png new file mode 100644 index 0000000000000000000000000000000000000000..1890e54008ca520b92df290a8c7631f785d0922c GIT binary patch literal 21729 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 Zj_D4|{=%0BKH|rclTvshould show bars even though pos -/+ dPos falls within break", + "x": 0, + "xref": "paper", + "font": {"size": 12} + }, + "yaxis": { + "breaks": [ + { + "bounds": [ 0, 2 ], + "operation": "()" + } + ] + } + } +} diff --git a/test/image/mocks/axes_breaks-finance.json b/test/image/mocks/axes_breaks-finance.json new file mode 100644 index 00000000000..0bb9daa882d --- /dev/null +++ b/test/image/mocks/axes_breaks-finance.json @@ -0,0 +1,391 @@ +{ + "data": [ + { + "type": "ohlc", + "x": [ + "2017-01-04", + "2017-01-05", + "2017-01-06", + "2017-01-09", + "2017-01-10", + "2017-01-11", + "2017-01-12", + "2017-01-13", + "2017-01-17", + "2017-01-18", + "2017-01-19", + "2017-01-20", + "2017-01-23", + "2017-01-24", + "2017-01-25", + "2017-01-26", + "2017-01-27", + "2017-01-30", + "2017-01-31", + "2017-02-01", + "2017-02-02", + "2017-02-03", + "2017-02-06", + "2017-02-07", + "2017-02-08", + "2017-02-09", + "2017-02-10", + "2017-02-13", + "2017-02-14", + "2017-02-15" + ], + "close": [ + 116.019997, + 116.610001, + 117.910004, + 118.989998, + 119.110001, + 119.75, + 119.25, + 119.040001, + 120, + 119.989998, + 119.779999, + 120, + 120.080002, + 119.970001, + 121.879997, + 121.940002, + 121.949997, + 121.629997, + 121.349998, + 128.75, + 128.529999, + 129.080002, + 130.289993, + 131.529999, + 132.039993, + 132.419998, + 132.119995, + 133.289993, + 135.020004, + 135.509995 + ], + "decreasing": { + "line": { + "color": "#7F7F7F" + } + }, + "high": [ + 116.510002, + 116.860001, + 118.160004, + 119.43, + 119.379997, + 119.93, + 119.300003, + 119.620003, + 120.239998, + 120.5, + 120.089996, + 120.449997, + 120.809998, + 120.099998, + 122.099998, + 122.440002, + 122.349998, + 121.629997, + 121.389999, + 130.490005, + 129.389999, + 129.190002, + 130.5, + 132.089996, + 132.220001, + 132.449997, + 132.940002, + 133.820007, + 135.089996, + 136.270004 + ], + "increasing": { + "line": { + "color": "#17BECF" + } + }, + "line": { + "color": "rgba(31,119,180,1)" + }, + "low": [ + 115.75, + 115.809998, + 116.470001, + 117.940002, + 118.300003, + 118.599998, + 118.209999, + 118.809998, + 118.220001, + 119.709999, + 119.370003, + 119.730003, + 119.769997, + 119.5, + 120.279999, + 121.599998, + 121.599998, + 120.660004, + 120.620003, + 127.010002, + 127.779999, + 128.160004, + 128.899994, + 130.449997, + 131.220001, + 131.119995, + 132.050003, + 132.75, + 133.25, + 134.619995 + ], + "open": [ + 115.849998, + 115.919998, + 116.779999, + 117.949997, + 118.769997, + 118.739998, + 118.900002, + 119.110001, + 118.339996, + 120, + 119.400002, + 120.449997, + 120, + 119.550003, + 120.419998, + 121.669998, + 122.139999, + 120.93, + 121.150002, + 127.029999, + 127.980003, + 128.309998, + 129.130005, + 130.539993, + 131.350006, + 131.649994, + 132.460007, + 133.080002, + 133.470001, + 135.520004 + ] + }, + { + "type": "candlestick", + "x": [ + "2017-01-04", + "2017-01-05", + "2017-01-06", + "2017-01-09", + "2017-01-10", + "2017-01-11", + "2017-01-12", + "2017-01-13", + "2017-01-17", + "2017-01-18", + "2017-01-19", + "2017-01-20", + "2017-01-23", + "2017-01-24", + "2017-01-25", + "2017-01-26", + "2017-01-27", + "2017-01-30", + "2017-01-31", + "2017-02-01", + "2017-02-02", + "2017-02-03", + "2017-02-06", + "2017-02-07", + "2017-02-08", + "2017-02-09", + "2017-02-10", + "2017-02-13", + "2017-02-14", + "2017-02-15" + ], + "close": [ + 116.019997, + 116.610001, + 117.910004, + 118.989998, + 119.110001, + 119.75, + 119.25, + 119.040001, + 120, + 119.989998, + 119.779999, + 120, + 120.080002, + 119.970001, + 121.879997, + 121.940002, + 121.949997, + 121.629997, + 121.349998, + 128.75, + 128.529999, + 129.080002, + 130.289993, + 131.529999, + 132.039993, + 132.419998, + 132.119995, + 133.289993, + 135.020004, + 135.509995 + ], + "decreasing": { + "line": { + "color": "#7F7F7F" + } + }, + "high": [ + 116.510002, + 116.860001, + 118.160004, + 119.43, + 119.379997, + 119.93, + 119.300003, + 119.620003, + 120.239998, + 120.5, + 120.089996, + 120.449997, + 120.809998, + 120.099998, + 122.099998, + 122.440002, + 122.349998, + 121.629997, + 121.389999, + 130.490005, + 129.389999, + 129.190002, + 130.5, + 132.089996, + 132.220001, + 132.449997, + 132.940002, + 133.820007, + 135.089996, + 136.270004 + ], + "increasing": { + "line": { + "color": "#17BECF" + } + }, + "line": { + "color": "rgba(31,119,180,1)" + }, + "low": [ + 115.75, + 115.809998, + 116.470001, + 117.940002, + 118.300003, + 118.599998, + 118.209999, + 118.809998, + 118.220001, + 119.709999, + 119.370003, + 119.730003, + 119.769997, + 119.5, + 120.279999, + 121.599998, + 121.599998, + 120.660004, + 120.620003, + 127.010002, + 127.779999, + 128.160004, + 128.899994, + 130.449997, + 131.220001, + 131.119995, + 132.050003, + 132.75, + 133.25, + 134.619995 + ], + "open": [ + 115.849998, + 115.919998, + 116.779999, + 117.949997, + 118.769997, + 118.739998, + 118.900002, + 119.110001, + 118.339996, + 120, + 119.400002, + 120.449997, + 120, + 119.550003, + 120.419998, + 121.669998, + 122.139999, + 120.93, + 121.150002, + 127.029999, + 127.980003, + 128.309998, + 129.130005, + 130.539993, + 131.350006, + 131.649994, + 132.460007, + 133.080002, + 133.470001, + 135.520004 + ], + "xaxis": "x2", + "yaxis": "y2" + } + ], + "layout": { + "margin": { "r": 10, "t": 25, "b": 40, "l": 60 }, + "grid": {"rows": 1, "columns": 2, "pattern": "independent"}, + "showlegend": false, + "xaxis": { + "rangeslider": { "visible": true }, + "breaks": [ + { + "pattern": "%w", + "bounds": [ 6, 0 ], + "operation": "[]" + }, + { + "values": ["2017-01-16"] + } + ] + }, + "xaxis2": { + "rangeslider": { "visible": true }, + "breaks": [ + { + "pattern": "%w", + "bounds": [ 6, 0 ], + "operation": "[]" + }, + { + "values": ["2017-01-16"] + } + ] + }, + "width": 600, + "height": 300 + } +} From 76a265e75e7f6f67169710ec292b625ef9b8e172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 5 Mar 2020 09:58:58 -0500 Subject: [PATCH 14/23] fix typo in break `bounds` description --- src/plots/cartesian/layout_attributes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 160bc62acbb..fbb78ad2d01 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -271,7 +271,7 @@ module.exports = { description: [ 'Sets the lower and upper bounds of this axis break.', 'Can be used with `operation` to determine the behavior at the bounds.', - 'On *date* axes, it can be used `pattern`.' + 'On *date* axes, it can be used with `pattern`.' ].join(' ') }, From e00af902ca4fdb3a0cb6d4a5a62cfda3b93abc8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 5 Mar 2020 15:40:29 -0500 Subject: [PATCH 15/23] Handle breaks on date axes only for now - revise dvalue dflt - fixup tests --- src/plots/cartesian/axis_defaults.js | 31 +- src/plots/cartesian/layout_attributes.js | 12 +- src/plots/cartesian/set_convert.js | 5 +- test/image/baselines/axes_breaks-bars.png | Bin 21729 -> 27016 bytes test/image/baselines/axes_breaks-tickvals.png | Bin 28126 -> 33388 bytes test/image/baselines/axes_breaks.png | Bin 37140 -> 45049 bytes test/image/mocks/axes_breaks-bars.json | 10 +- test/image/mocks/axes_breaks-tickvals.json | 35 +- test/image/mocks/axes_breaks.json | 64 +++- test/jasmine/tests/axes_test.js | 339 +++++++++++++----- test/jasmine/tests/cartesian_interact_test.js | 98 ++++- test/jasmine/tests/hover_label_test.js | 68 +++- test/jasmine/tests/range_slider_test.js | 31 +- 13 files changed, 517 insertions(+), 176 deletions(-) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index 6a437234fcf..66f3db01ecf 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -21,8 +21,6 @@ var handleCategoryOrderDefaults = require('./category_order_defaults'); var handleLineGridDefaults = require('./line_grid_defaults'); var setConvert = require('./set_convert'); -var ONEDAY = require('../../constants/numerical').ONEDAY; - /** * options: object containing: * @@ -121,17 +119,16 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, } } - // TODO - // - does this make sense for 'log', 'category' and 'multicategory' axis types ?? - - var breaks = containerIn.breaks; - if(Array.isArray(breaks) && breaks.length) { - handleArrayContainerDefaults(containerIn, containerOut, { - name: 'breaks', - inclusionAttr: 'enabled', - handleItemDefaults: breaksDefaults - }); - setConvert(containerOut, layoutOut); + if(containerOut.type === 'date') { + var breaks = containerIn.breaks; + if(Array.isArray(breaks) && breaks.length) { + handleArrayContainerDefaults(containerIn, containerOut, { + name: 'breaks', + inclusionAttr: 'enabled', + handleItemDefaults: breaksDefaults + }); + setConvert(containerOut, layoutOut); + } } return containerOut; @@ -145,8 +142,6 @@ function breaksDefaults(itemIn, itemOut, containerOut) { var enabled = coerce('enabled'); if(enabled) { - var isDateAxis = containerOut.type === 'date'; - var bnds = coerce('bounds'); if(bnds && bnds.length >= 2) { @@ -169,14 +164,12 @@ function breaksDefaults(itemIn, itemOut, containerOut) { } } - if(isDateAxis) { - coerce('pattern'); - } + coerce('pattern'); } else { var values = coerce('values'); if(values && values.length) { - coerce('dvalue', isDateAxis ? ONEDAY : 1); + coerce('dvalue'); } else { itemOut.enabled = false; return; diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index fbb78ad2d01..138ed6cb441 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -16,7 +16,7 @@ var templatedArray = require('../../plot_api/plot_template').templatedArray; var FORMAT_LINK = require('../../constants/docs').FORMAT_LINK; var DATE_FORMAT_LINK = require('../../constants/docs').DATE_FORMAT_LINK; - +var ONEDAY = require('../../constants/numerical').ONEDAY; var constants = require('./constants'); module.exports = { @@ -256,7 +256,8 @@ module.exports = { dflt: true, editType: 'calc', description: [ - 'Determines whether this axis break is enabled or disabled.' + 'Determines whether this axis break is enabled or disabled.', + 'Please note that `breaks` only work for *date* axis type.' ].join(' ') }, @@ -271,7 +272,7 @@ module.exports = { description: [ 'Sets the lower and upper bounds of this axis break.', 'Can be used with `operation` to determine the behavior at the bounds.', - 'On *date* axes, it can be used with `pattern`.' + 'Can be used with `pattern`.' ].join(' ') }, @@ -283,7 +284,6 @@ module.exports = { role: 'info', editType: 'calc', description: [ - 'Only coerced on *date* axes.', 'Determines a pattern on the time line that generates breaks.', 'If *%w* - Sunday-based weekday as a decimal number [0, 6].', 'If *%H* - hour (24-hour clock) as a decimal number [0, 23].', @@ -319,10 +319,10 @@ module.exports = { role: 'info', editType: 'calc', min: 0, + dflt: ONEDAY, description: [ 'Sets the spread of each `values` item.', - 'For *linear* axes, the default is *1*.', - 'For *date* axes, the default is one day in milliseconds.' + 'The default is one day in milliseconds.' ].join(' ') }, diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index a1b20afab11..1033795deda 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -640,7 +640,9 @@ module.exports = function setConvert(ax, fullLayout) { vb = (new Date(v)).getUTCHours(); if(bnds[0] > bnds[1]) doesCrossPeriod = true; break; - default: + case '': + // N.B. should work on date axes as well! + // e.g. { bounds: ['2020-01-04', '2020-01-05 23:59'] } bnds = Lib.simpleMap(brk.bounds, ax.d2c); if(bnds[0] <= bnds[1]) { b0 = bnds[0]; @@ -650,6 +652,7 @@ module.exports = function setConvert(ax, fullLayout) { b1 = bnds[0]; } vb = v; + break; } if(doesCrossPeriod) { diff --git a/test/image/baselines/axes_breaks-bars.png b/test/image/baselines/axes_breaks-bars.png index 1890e54008ca520b92df290a8c7631f785d0922c..11469ee14a618da189beac173e86d523f14d2052 100644 GIT binary patch literal 27016 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 literal 28126 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 diff --git a/test/image/baselines/axes_breaks.png b/test/image/baselines/axes_breaks.png index 97f4217d55d58972868a1b7738cfb29e52cd6367..0b819065907b4b9eee9c455f1735f4698773a2b7 100644 GIT binary patch literal 45049 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 literal 37140 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 diff --git a/test/image/mocks/axes_breaks-bars.json b/test/image/mocks/axes_breaks-bars.json index 4aab5c78d32..12dc70110ce 100644 --- a/test/image/mocks/axes_breaks-bars.json +++ b/test/image/mocks/axes_breaks-bars.json @@ -2,7 +2,10 @@ "data": [ { "type": "bar", - "y": [ 0, 2 ], + "y": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.002" + ], "x": [ 1, 2 ], "orientation": "h", "marker": { @@ -21,7 +24,10 @@ "yaxis": { "breaks": [ { - "bounds": [ 0, 2 ], + "bounds": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.002" + ], "operation": "()" } ] diff --git a/test/image/mocks/axes_breaks-tickvals.json b/test/image/mocks/axes_breaks-tickvals.json index 5157c692281..c68d40e8440 100644 --- a/test/image/mocks/axes_breaks-tickvals.json +++ b/test/image/mocks/axes_breaks-tickvals.json @@ -1,16 +1,43 @@ { "data": [ { - "x": [ -20, 0, 10, 50, 90, 100, 150, 190, 200 ] + "x": [ + "1969-12-31 23:59:59.980", + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" + ] } ], "layout": { "xaxis": { "breaks": [ - { "bounds": [ -1, 90 ] }, - { "bounds": [ 101, 189 ] } + {"bounds": [ + "1969-12-31 23:59:59.999", + "1970-01-01 00:00:00.090" + ]}, + {"bounds": [ + "1970-01-01 00:00:00.101", + "1970-01-01 00:00:00.189" + ]} + ], + "tickvals": [ + "1969-12-31 23:59:59.980", + "1969-12-31 23:59:59.990", + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" ], - "tickvals": [ -20, -10, 0, 10, 50, 90, 100, 150, 190, 200 ], "ticktext": [ "(-20)", "(10)", "(0)" ], "zeroline": true }, diff --git a/test/image/mocks/axes_breaks.json b/test/image/mocks/axes_breaks.json index 491d966927a..0b2ac05a290 100644 --- a/test/image/mocks/axes_breaks.json +++ b/test/image/mocks/axes_breaks.json @@ -1,22 +1,58 @@ { "data": [ { - "y": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "y": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" + ], "xaxis": "x", "yaxis": "y" }, { - "y": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "y": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" + ], "xaxis": "x2", "yaxis": "y2" }, { - "x": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "x": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" + ], "xaxis": "x3", "yaxis": "y3" }, { - "x": [ 0, 10, 50, 90, 100, 150, 190, 200 ], + "x": [ + "1970-01-01 00:00:00.000", + "1970-01-01 00:00:00.010", + "1970-01-01 00:00:00.050", + "1970-01-01 00:00:00.090", + "1970-01-01 00:00:00.100", + "1970-01-01 00:00:00.150", + "1970-01-01 00:00:00.190", + "1970-01-01 00:00:00.200" + ], "xaxis": "x4", "yaxis": "y4" } @@ -25,14 +61,26 @@ "grid": { "rows": 2, "columns": 2, "pattern": "independent" }, "yaxis": { "breaks": [ - { "bounds": [ 11, 89 ] }, - { "bounds": [ 101, 189 ] } + {"bounds": [ + "1970-01-01 00:00:00.011", + "1970-01-01 00:00:00.089" + ]}, + { "bounds": [ + "1970-01-01 00:00:00.101", + "1970-01-01 00:00:00.189" + ]} ] }, "xaxis3": { "breaks": [ - { "bounds": [ 11, 89 ] }, - { "bounds": [ 101, 189 ] } + {"bounds": [ + "1970-01-01 00:00:00.011", + "1970-01-01 00:00:00.089" + ]}, + {"bounds": [ + "1970-01-01 00:00:00.101", + "1970-01-01 00:00:00.189" + ]} ] }, "shapes": [ diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index beb22c2b45b..c09add75104 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -1019,12 +1019,34 @@ describe('Test axes', function() { expect(layoutOut.yaxis2.range).withContext('yaxis2 range').toEqual([0, 4]); }); + it('should coerce *breaks* container only on a date axis', function() { + var bounds = ['2020-01-10', '2020-01-11']; + layoutIn = { + xaxis: {breaks: [{bounds: bounds}], type: 'date'}, + xaxis2: {breaks: [{bounds: bounds}], type: '-'}, + xaxis3: {breaks: [{bounds: bounds}], type: 'linear'}, + xaxis4: {breaks: [{bounds: bounds}], type: 'log'}, + xaxis5: {breaks: [{bounds: bounds}], type: 'category'}, + xaxis6: {breaks: [{bounds: bounds}], type: 'multicategory'} + }; + layoutOut._subplots.xaxis.push('x2', 'x3', 'x4', 'x5', 'x6'); + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + + expect(Array.isArray(layoutOut.xaxis.breaks) && layoutOut.xaxis.breaks.length) + .toBe(1, 'xaxis.breaks is array of length 1'); + expect(layoutOut.xaxis2.breaks).toBeUndefined(); + expect(layoutOut.xaxis3.breaks).toBeUndefined(); + expect(layoutOut.xaxis4.breaks).toBeUndefined(); + expect(layoutOut.xaxis5.breaks).toBeUndefined(); + expect(layoutOut.xaxis6.breaks).toBeUndefined(); + }); + it('should coerce *breaks* container only when it is a non-empty array', function() { layoutIn = { - xaxis: {breaks: [{bounds: [0, 1]}]}, - xaxis2: {breaks: []}, - xaxis3: {breaks: false}, - xaxis4: {} + xaxis: {type: 'date', breaks: [{bounds: ['2020-01-10', '2020-01-11']}]}, + xaxis2: {type: 'date', breaks: []}, + xaxis3: {type: 'date', breaks: false}, + xaxis4: {type: 'date'} }; layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); supplyLayoutDefaults(layoutIn, layoutOut, fullData); @@ -1038,10 +1060,10 @@ describe('Test axes', function() { it('should set *breaks* to *enabled:false* when *bounds* have less than 2 items', function() { layoutIn = { - xaxis: {breaks: [{bounds: [0]}]}, - xaxis2: {breaks: [{bounds: [0], values: [1]}]}, - xaxis3: {breaks: [{bounds: [0], values: {}}]}, - xaxis4: {breaks: [{bounds: [0, 1, 2]}]} + xaxis: {type: 'date', breaks: [{bounds: ['2020-01-10']}]}, + xaxis2: {type: 'date', breaks: [{bounds: ['2020-01-10'], values: ['2020-01-11']}]}, + xaxis3: {type: 'date', breaks: [{bounds: ['2020-01-10'], values: {}}]}, + xaxis4: {type: 'date', breaks: [{bounds: ['2020-01-10', '2020-01-11', '2020-01-12']}]} }; layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); supplyLayoutDefaults(layoutIn, layoutOut, fullData); @@ -1050,15 +1072,15 @@ describe('Test axes', function() { expect(layoutOut.xaxis2.breaks[0].enabled).toBe(true, 'invalid *bounds*, valid *values*'); expect(layoutOut.xaxis3.breaks[0].enabled).toBe(false, 'invalid *bounds*, invalid *values*'); expect(layoutOut.xaxis4.breaks[0].enabled && layoutOut.xaxis4.breaks[0].bounds) - .withContext('valid *bounds*, sliced to length=2').toEqual([0, 1]); + .withContext('valid *bounds*, sliced to length=2').toEqual(['2020-01-10', '2020-01-11']); }); it('if *breaks* *bounds* are bigger than the set *range*, disable break', function() { layoutIn = { - xaxis: {range: [0, 4], breaks: [{bounds: [1, 2]}]}, - xaxis2: {range: [1, 2], breaks: [{bounds: [0, 4]}]}, - xaxis3: {range: [4, 0], breaks: [{bounds: [2, 1]}]}, - xaxis4: {range: [2, 1], breaks: [{bounds: [4, 0]}]} + xaxis: {type: 'date', range: ['2020-01-10', '2020-01-14'], breaks: [{bounds: ['2020-01-11', '2020-01-12']}]}, + xaxis2: {type: 'date', range: ['2020-01-11', '2020-01-12'], breaks: [{bounds: ['2020-01-10', '2020-01-14']}]}, + xaxis3: {type: 'date', range: ['2020-01-14', '2020-01-10'], breaks: [{bounds: ['2020-01-12', '2020-01-11']}]}, + xaxis4: {type: 'date', range: ['2020-01-12', '2020-01-11'], breaks: [{bounds: ['2020-01-14', '2020-01-10']}]} }; layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); supplyLayoutDefaults(layoutIn, layoutOut, fullData); @@ -1071,61 +1093,47 @@ describe('Test axes', function() { it('should coerce *breaks* *bounds* over *values*/*dvalue* if both are present', function() { layoutIn = { - xaxis: {breaks: [{bounds: [0, 1]}]}, - xaxis2: {breaks: [{values: [0, 2, 4], dvalue: 2}]}, - xaxis3: {breaks: [{bounds: [0, 1], values: [0, 2, 4], dvalue: 2}]}, - xaxis4: {breaks: [{bounds: false, values: [0, 2, 4], dvalue: 2}]}, + xaxis: {type: 'date', breaks: [{bounds: ['2020-01-10', '2020-01-11']}]}, + xaxis2: {type: 'date', breaks: [{values: ['2020-01-10', '2020-01-12', '2020-01-14'], dvalue: 2}]}, + xaxis3: {type: 'date', breaks: [{bounds: ['2020-01-10', '2020-01-11'], values: ['2020-01-10', '2020-01-12', '2020-01-14'], dvalue: 2}]}, + xaxis4: {type: 'date', breaks: [{bounds: false, values: ['2020-01-10', '2020-01-12', '2020-01-14'], dvalue: 2}]}, }; layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); supplyLayoutDefaults(layoutIn, layoutOut, fullData); var xaBreak = layoutOut.xaxis.breaks[0]; - expect(xaBreak.bounds).withContext('valid *bounds*').toEqual([0, 1]); + expect(xaBreak.bounds).withContext('valid *bounds*').toEqual(['2020-01-10', '2020-01-11']); expect(xaBreak.values).toBe(undefined, 'not coerced'); expect(xaBreak.dvalue).toBe(undefined, 'not coerced'); xaBreak = layoutOut.xaxis2.breaks[0]; expect(xaBreak.bounds).toBe(undefined, 'not set, not coerced'); - expect(xaBreak.values).withContext('valid *values*').toEqual([0, 2, 4]); + expect(xaBreak.values).withContext('valid *values*').toEqual(['2020-01-10', '2020-01-12', '2020-01-14']); expect(xaBreak.dvalue).toBe(2, 'valid *dvalue*'); xaBreak = layoutOut.xaxis3.breaks[0]; - expect(xaBreak.bounds).withContext('set to valid, coerced').toEqual([0, 1]); + expect(xaBreak.bounds).withContext('set to valid, coerced').toEqual(['2020-01-10', '2020-01-11']); expect(xaBreak.values).toBe(undefined, 'not coerced'); expect(xaBreak.dvalue).toBe(undefined, 'not coerced'); xaBreak = layoutOut.xaxis4.breaks[0]; expect(xaBreak.bounds).toBe(undefined, 'set but invalid, not coerced'); - expect(xaBreak.values).withContext('valid *values*').toEqual([0, 2, 4]); + expect(xaBreak.values).withContext('valid *values*').toEqual(['2020-01-10', '2020-01-12', '2020-01-14']); expect(xaBreak.dvalue).toBe(2, 'valid *dvalue*'); }); - it('should only coerce breaks *pattern* on date axes with *bounds*', function() { + it('should only coerce breaks *pattern* with *bounds*', function() { layoutIn = { - xaxis: {type: 'linear', breaks: [{bounds: [0, 1], pattern: 'not-gonna-work'}]}, - xaxis2: {type: 'date', breaks: [{bounds: ['2020-01-04', '2020-01-05']}]}, - xaxis3: {type: 'date', breaks: [{bounds: [6, 0], pattern: '%w'}]}, - xaxis4: {type: 'date', breaks: [{values: ['2020-01-04', '2020-01-05'], pattern: 'NOP'}]}, + xaxis: {type: 'date', breaks: [{bounds: ['2020-01-04', '2020-01-05']}]}, + xaxis2: {type: 'date', breaks: [{bounds: [6, 0], pattern: '%w'}]}, + xaxis3: {type: 'date', breaks: [{values: ['2020-01-04', '2020-01-05'], pattern: 'NOP'}]}, }; - layoutOut._subplots.xaxis.push('x2', 'x3', 'x4'); - supplyLayoutDefaults(layoutIn, layoutOut, fullData); - - expect(layoutOut.xaxis.breaks[0].pattern).toBe(undefined, 'not coerced, on linear axis'); - expect(layoutOut.xaxis2.breaks[0].pattern).toBe('', 'coerced to dflt value'); - expect(layoutOut.xaxis3.breaks[0].pattern).toBe('%w', 'coerced'); - expect(layoutOut.xaxis4.breaks[0].pattern).toBe(undefined, 'not coerce, using *values*'); - }); - - it('should only coerce *dvalue* with correct smart dflt', function() { - layoutIn = { - xaxis: {type: 'linear', breaks: [{values: [1]}]}, - xaxis2: {type: 'date', breaks: [{values: ['2020-01-04']}]}, - }; - layoutOut._subplots.xaxis.push('x2'); + layoutOut._subplots.xaxis.push('x2', 'x3'); supplyLayoutDefaults(layoutIn, layoutOut, fullData); - expect(layoutOut.xaxis.breaks[0].dvalue).toBe(1, 'type:linear dflt'); - expect(layoutOut.xaxis2.breaks[0].dvalue).toBe(24 * 60 * 60 * 1000, 'type:date dflt'); + expect(layoutOut.xaxis.breaks[0].pattern).toBe('', 'coerced to dflt value'); + expect(layoutOut.xaxis2.breaks[0].pattern).toBe('%w', 'coerced'); + expect(layoutOut.xaxis3.breaks[0].pattern).toBe(undefined, 'not coerce, using *values*'); }); }); @@ -4014,6 +4022,8 @@ describe('Test axes', function() { }); describe('*breaks*', function() { + // TODO adapt `type: 'date'` requirement !! + describe('during doCalcdata', function() { var gd; @@ -4030,37 +4040,66 @@ describe('Test axes', function() { } it('should discard coords within break bounds', function() { + var x = [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ]; + _calc({ - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: x }, { xaxis: { breaks: [ - {'operation': '()', bounds: [10, 90]}, - {'operation': '()', bounds: [100, 190]} + {'operation': '()', bounds: [ + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.090' + ]}, + {'operation': '()', bounds: [ + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.190' + ]} ] } }); _assert('with operation:()', [0, 10, BADNUM, 90, 100, BADNUM, 190, 200]); _calc({ - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: x }, { xaxis: { breaks: [ - {operation: '[]', bounds: [10, 90]}, - {operation: '[]', bounds: [100, 190]} + {'operation': '[]', bounds: [ + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.090' + ]}, + {'operation': '[]', bounds: [ + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.190' + ]} ] } }); _assert('with operation:[]', [0, BADNUM, BADNUM, BADNUM, BADNUM, BADNUM, BADNUM, 200]); _calc({ - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: x }, { xaxis: { breaks: [ - {operation: '[)', bounds: [10, 90]}, - {operation: '(]', bounds: [100, 190]} + {'operation': '[)', bounds: [ + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.090' + ]}, + {'operation': '(]', bounds: [ + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.190' + ]} ] } }); @@ -4189,10 +4228,19 @@ describe('Test axes', function() { it('should discard coords equal to two consecutive open values bounds', function() { _calc({ - x: [1, 2, 3, 4, 5] + x: [ + '1970-01-01 00:00:00.001', + '1970-01-01 00:00:00.002', + '1970-01-01 00:00:00.003', + '1970-01-01 00:00:00.004', + '1970-01-01 00:00:00.005' + ] }, { xaxis: { - breaks: [{ values: [2, 3], dvalue: 1, operation: '()' }] + breaks: [{ values: [ + '1970-01-01 00:00:00.002', + '1970-01-01 00:00:00.003' + ], dvalue: 1, operation: '()' }] } }); _assert('', [1, 2, BADNUM, 4, 5]); @@ -4200,13 +4248,16 @@ describe('Test axes', function() { it('should adapt coords generated from x0/dx about breaks', function() { _calc({ - x0: 1, + x0: '1970-01-01 00:00:00.001', dx: 0.5, y: [1, 3, 5, 2, 4] }, { xaxis: { breaks: [ - {bounds: [2, 3]} + {bounds: [ + '1970-01-01 00:00:00.002', + '1970-01-01 00:00:00.003' + ]} ] } }); @@ -4231,18 +4282,33 @@ describe('Test axes', function() { it('should adapt padding about axis breaks length', function(done) { Plotly.plot(gd, [{ mode: 'markers', - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] } }) .then(function() { _assert('mode:markers (i.e. with padding)', { - xrng: [-2.1849529780564265, 202.18495297805643], + xrng: ['1969-12-31 23:59:59.9978', '1970-01-01 00:00:00.2022'], lBreaks: 166 }); }) @@ -4252,7 +4318,7 @@ describe('Test axes', function() { }) .then(function() { _assert('mode:lines (i.e. no padding)', { - xrng: [0, 200], + xrng: ['1970-01-01', '1970-01-01 00:00:00.2'], lBreaks: 166 }); }) @@ -4263,7 +4329,7 @@ describe('Test axes', function() { }) .then(function() { _assert('mode:markers | one of two breaks enabled', { - xrng: [-7.197492163009405, 207.1974921630094], + xrng: ['1969-12-31 23:59:59.9928', '1970-01-01 00:00:00.2072'], lBreaks: 88 }); }) @@ -4273,7 +4339,7 @@ describe('Test axes', function() { }) .then(function() { _assert('mode:markers | no breaks enabled', { - xrng: [-12.852664576802507, 212.8526645768025], + xrng: ['1969-12-31 23:59:59.9871', '1970-01-01 00:00:00.2129'], lBreaks: 0 }); }) @@ -4312,7 +4378,16 @@ describe('Test axes', function() { it('should locate breaks & compute l <-> p parameters - x-axis case', function(done) { Plotly.plot(gd, [{ - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: {} }) @@ -4321,72 +4396,102 @@ describe('Test axes', function() { }) .then(function() { gd.layout.xaxis.breaks = [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('2 disjoint breaks within range', 'x', { breaks: [[11, 89], [101, 189]], - m2: 14.073529411764703, - B: [30.749, -1066.985, -2305.455] + m2: 14.062499999998405, + B: [30.937, -1065.937, -2303.437] }); }) .then(function() { gd.layout.xaxis.breaks = [ - {bounds: [11, 89]}, - {bounds: [70, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.070', + '1970-01-01 00:00:00.189' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('2 overlapping breaks within range', 'x', { breaks: [[11, 189]], - m2: 21.749999999999986, - B: [30.749, -3840.749] + m2: 21.7741935483922, + B: [30.483, -3845.322] }); }) .then(function() { gd.layout.xaxis.breaks = [ - {bounds: [-10, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1969-12-31 23:59:59.990', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('break beyond xaxis.range[0]', 'x', { - breaks: [[88.58620689655173, 89], [101, 189]], - m2: 22.118644067796602, - B: [-1959.406, -1968.559, -3914.999] + breaks: [[88.6, 89], [101, 189]], + m2: 22.1311475409836, + B: [-1960.819, -1969.672, -3917.213] }); }) .then(function() { gd.layout.xaxis.breaks = [ - {bounds: [11, 89]}, - {bounds: [101, 300]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.300' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('break beyond xaxis.range[1]', 'x', { - breaks: [[11, 89], [101, 101.41379310344827]], - m2: 22.118644067796616, - B: [31.271, -1693.983, -1703.135] + breaks: [[11, 89], [101, 101.4]], + m2: 22.131147540988888, + B: [30.983, -1695.245, -1704.098] }); }) .then(function() { gd.layout.xaxis.breaks = [ - {bounds: [-11, 90]}, - {bounds: [101, 300]} + {bounds: [ + '1969-12-31 23:59:59.989', + '1970-01-01 00:00:00.090' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.300' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('both breaks beyond xaxis.range', 'x', { - breaks: [[89.35736677115987, 90]], - m2: 50.73932253313696, - B: [-4533.9322, -4566.539] + breaks: [[89.4, 90]], + m2: 50.943396226415125, + B: [-4554.339622641512, -4584.9056603773615] }); }) .catch(failTest) @@ -4395,7 +4500,16 @@ describe('Test axes', function() { it('should locate breaks & compute l <-> p parameters - y-axis case', function(done) { Plotly.plot(gd, [{ - y: [0, 10, 50, 90, 100, 150, 190, 200] + y: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { yaxis: {} }) @@ -4404,30 +4518,42 @@ describe('Test axes', function() { }) .then(function() { gd.layout.yaxis.breaks = [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('2 disjoint breaks within range', 'y', { breaks: [[101, 189], [11, 89]], - m2: 6.926470588235295, - B: [1402.544, 793.0147, 252.75] + m2: 6.923076923076923, + B: [1401.923, 792.692, 252.692] }); }) .then(function() { gd.layout.yaxis.breaks = [ - {bounds: [11, 89]}, - {bounds: [70, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.070', + '1970-01-01 00:00:00.189' + ]} ]; return Plotly.react(gd, gd.data, gd.layout); }) .then(function() { _assert('2 overlapping breaks within range', 'y', { breaks: [[11, 189]], - m2: 10.70454545454546, - B: [2158.1590, 252.75] + m2: 10.714285714283243, + B: [2160, 252.857] }); }) .catch(failTest) @@ -4660,7 +4786,16 @@ describe('Test axes', function() { it('should not include ticks that fall within breaks', function(done) { Plotly.plot(gd, [{ - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: {}, width: 500, @@ -4674,8 +4809,14 @@ describe('Test axes', function() { .then(function() { gd.layout.xaxis = { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] }; return Plotly.react(gd, gd.data, gd.layout); diff --git a/test/jasmine/tests/cartesian_interact_test.js b/test/jasmine/tests/cartesian_interact_test.js index a045bc1baf6..91cb61395f9 100644 --- a/test/jasmine/tests/cartesian_interact_test.js +++ b/test/jasmine/tests/cartesian_interact_test.js @@ -2038,26 +2038,61 @@ describe('axis zoom/pan and main plot zoom', function() { Plotly.plot(gd, [{ mode: 'lines', - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] }, dragmode: 'zoom' }) - .then(function() { _assert('base', [0, 200]); }) + .then(function() { + _assert('base', [ + '1970-01-01', + '1970-01-01 00:00:00.2' + ]); + }) .then(doDrag('xy', 'nsew', 50, 0)) // x range would be ~ [100, 118] w/o breaks - .then(function() { _assert('after x-only zoombox', [95, 98.148]); }) + .then(function() { + _assert('after x-only zoombox', [ + '1970-01-01 00:00:00.095', + '1970-01-01 00:00:00.0981' + ]); + }) .then(doDblClick('xy', 'nsew')) - .then(function() { _assert('back to base', [0, 200]); }) + .then(function() { + _assert('back to base', [ + '1970-01-01', + '1970-01-01 00:00:00.2' + ]); + }) .then(function() { return Plotly.relayout(gd, 'dragmode', 'pan'); }) .then(doDrag('xy', 'nsew', 50, 0)) // x range would be ~ [-18, 181] w/o breaks - .then(function() { _assert('after x-only pan', [-3.148, 196.851]); }) + .then(function() { + _assert('after x-only pan', [ + '1969-12-31 23:59:59.9969', + '1970-01-01 00:00:00.1969' + ]); + }) .catch(failTest) .then(done); }); @@ -2069,26 +2104,61 @@ describe('axis zoom/pan and main plot zoom', function() { Plotly.plot(gd, [{ mode: 'lines', - y: [0, 10, 50, 90, 100, 150, 190, 200] + y: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { yaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] }, dragmode: 'zoom' }) - .then(function() { _assert('base', [-1.888, 201.888]); }) + .then(function() { + _assert('base', [ + '1969-12-31 23:59:59.9981', + '1970-01-01 00:00:00.2019' + ]); + }) .then(doDrag('xy', 'nsew', 0, 50)) // y range would be ~ [62, 100] w/o breaks - .then(function() { _assert('after y-only zoombox', [10.004, 95.00]); }) + .then(function() { + _assert('after y-only zoombox', [ + '1970-01-01 00:00:00.01', + '1970-01-01 00:00:00.095' + ]); + }) .then(doDblClick('xy', 'nsew')) - .then(function() { _assert('back to base', [-1.888, 201.888]); }) + .then(function() { + _assert('back to base', [ + '1969-12-31 23:59:59.9981', + '1970-01-01 00:00:00.2019' + ]); + }) .then(function() { return Plotly.relayout(gd, 'dragmode', 'pan'); }) .then(doDrag('xy', 'nsew', 0, 50)) // y range would be ~ [35, 239] w/o breaks - .then(function() { _assert('after y-only pan', [5.106, 208.884]); }) + .then(function() { + _assert('after y-only pan', [ + '1970-01-01 00:00:00.0051', + '1970-01-01 00:00:00.2089' + ]); + }) .catch(failTest) .then(done); }); diff --git a/test/jasmine/tests/hover_label_test.js b/test/jasmine/tests/hover_label_test.js index d6de235f11a..e9b95979540 100644 --- a/test/jasmine/tests/hover_label_test.js +++ b/test/jasmine/tests/hover_label_test.js @@ -2707,12 +2707,28 @@ describe('Hover on axes with breaks', function() { it('should work when breaks are present on x-axis', function(done) { Plotly.plot(gd, [{ mode: 'lines', // i.e. no autorange padding - x: [0, 10, 50, 90, 95, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.095', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] }, width: 400, @@ -2729,8 +2745,8 @@ describe('Hover on axes with breaks', function() { .then(function() { _assert('leftmost interval', { nums: '0', - axis: '0', - x: 0, + axis: 'Jan 1, 1970', + x: '1970-01-01', y: 0 }); }) @@ -2738,8 +2754,8 @@ describe('Hover on axes with breaks', function() { .then(function() { _assert('middle interval', { nums: '4', - axis: '95', - x: 95, + axis: 'Jan 1, 1970, 00:00:00.095', + x: '1970-01-01 00:00:00.095', y: 4 }); }) @@ -2747,8 +2763,8 @@ describe('Hover on axes with breaks', function() { .then(function() { _assert('rightmost interval', { nums: '8', - axis: '200', - x: 200, + axis: 'Jan 1, 1970, 00:00:00.2', + x: '1970-01-01 00:00:00.2', y: 8 }); }) @@ -2759,12 +2775,28 @@ describe('Hover on axes with breaks', function() { it('should work when breaks are present on y-axis', function(done) { Plotly.plot(gd, [{ mode: 'lines', // i.e. no autorange padding - y: [0, 10, 50, 90, 95, 100, 150, 190, 200] + y: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.095', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { yaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ] }, width: 400, @@ -2781,27 +2813,27 @@ describe('Hover on axes with breaks', function() { .then(function() { _assert('topmost interval', { nums: '8', - axis: '200', + axis: 'Jan 1, 1970, 00:00:00.2', x: 8, - y: 200 + y: '1970-01-01 00:00:00.2' }); }) .then(function() { _hover(200, 200); }) .then(function() { _assert('middle interval', { nums: '4', - axis: '95', + axis: 'Jan 1, 1970, 00:00:00.095', x: 4, - y: 95 + y: '1970-01-01 00:00:00.095' }); }) .then(function() { _hover(11, 370); }) .then(function() { _assert('bottom interval', { nums: '0', - axis: '0', + axis: 'Jan 1, 1970', x: 0, - y: 0 + y: '1970-01-01' }); }) .catch(failTest) diff --git a/test/jasmine/tests/range_slider_test.js b/test/jasmine/tests/range_slider_test.js index 00ec969caa0..c719d0576dd 100644 --- a/test/jasmine/tests/range_slider_test.js +++ b/test/jasmine/tests/range_slider_test.js @@ -207,12 +207,27 @@ describe('Visible rangesliders', function() { Plotly.plot(gd, [{ mode: 'lines', - x: [0, 10, 50, 90, 100, 150, 190, 200] + x: [ + '1970-01-01 00:00:00.000', + '1970-01-01 00:00:00.010', + '1970-01-01 00:00:00.050', + '1970-01-01 00:00:00.090', + '1970-01-01 00:00:00.100', + '1970-01-01 00:00:00.150', + '1970-01-01 00:00:00.190', + '1970-01-01 00:00:00.200' + ] }], { xaxis: { breaks: [ - {bounds: [11, 89]}, - {bounds: [101, 189]} + {bounds: [ + '1970-01-01 00:00:00.011', + '1970-01-01 00:00:00.089' + ]}, + {bounds: [ + '1970-01-01 00:00:00.101', + '1970-01-01 00:00:00.189' + ]} ], rangeslider: {visible: true} }, @@ -224,12 +239,18 @@ describe('Visible rangesliders', function() { sliderY = bb.top + bb.height / 2; }) .then(function() { - expect(gd._fullLayout.xaxis.range).withContext('base xrng').toEqual([0, 200]); + expect(gd._fullLayout.xaxis.range).withContext('base xrng').toEqual([ + '1970-01-01', + '1970-01-01 00:00:00.2' + ]); }) .then(function() { return slide(start, sliderY, end, sliderY); }) .then(function() { // x range would be ~ [15.625, 200] w/o breaks - expect(gd._fullLayout.xaxis.range).withContext('after xrng').toEqual([2.65625, 200]); + expect(gd._fullLayout.xaxis.range).withContext('after xrng').toEqual([ + '1970-01-01 00:00:00.0027', + '1970-01-01 00:00:00.2' + ]); }) .catch(failTest) .then(done); From 53196e59d38f574416d8be2dc9877d265f84d30d Mon Sep 17 00:00:00 2001 From: archmoj Date: Mon, 9 Mar 2020 09:21:25 -0400 Subject: [PATCH 16/23] simplify logic - breaks are on date axes only --- src/plots/cartesian/set_convert.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index 1033795deda..22c13419d9e 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -693,16 +693,11 @@ module.exports = function setConvert(ax, fullLayout) { var breaksOut = []; if(!ax.breaks) return breaksOut; - var breaksIn; - if(ax.type === 'date') { - breaksIn = ax.breaks.slice().sort(function(a, b) { - if(a.pattern === '%w' && b.pattern === '%H') return -1; - else if(b.pattern === '%w' && a.pattern === '%H') return 1; - return 0; - }); - } else { - breaksIn = ax.breaks; - } + var breaksIn = ax.breaks.slice().sort(function(a, b) { + if(a.pattern === '%w' && b.pattern === '%H') return -1; + else if(b.pattern === '%w' && a.pattern === '%H') return 1; + return 0; + }); var addBreak = function(min, max) { min = Lib.constrain(min, r0, r1); From 493bb4eb508a2716e422208a6d804521ddbc7379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 5 Mar 2020 16:04:52 -0500 Subject: [PATCH 17/23] Handle axis breaks on reversed ranges - add mock with reversed autoranges on horizontal and vertical bars --- src/components/rangeslider/draw.js | 2 + src/plots/cartesian/set_convert.js | 15 +- ...xes_breaks-weekends_autorange-reversed.png | Bin 0 -> 55701 bytes ...es_breaks-weekends_autorange-reversed.json | 185 ++++++++++++++++++ 4 files changed, 199 insertions(+), 3 deletions(-) create mode 100644 test/image/baselines/axes_breaks-weekends_autorange-reversed.png create mode 100644 test/image/mocks/axes_breaks-weekends_autorange-reversed.json diff --git a/src/components/rangeslider/draw.js b/src/components/rangeslider/draw.js index 991484bc8c7..28bd04b09c9 100644 --- a/src/components/rangeslider/draw.js +++ b/src/components/rangeslider/draw.js @@ -148,6 +148,8 @@ module.exports = function(gd) { lBreaks += (brk.max - brk.min); } + // TODO fix for reversed-range axes !!! + // compute slope and piecewise offsets var m2 = opts._width / (rl1 - rl0 - lBreaks); var _B = [-m2 * rl0]; diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index 22c13419d9e..61bf8ce3d26 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -571,7 +571,11 @@ module.exports = function setConvert(ax, fullLayout) { if(ax.breaks) { var i, brk; - ax._breaks = ax.locateBreaks(rl0, rl1); + ax._breaks = ax.locateBreaks( + Math.min(rl0, rl1), + Math.max(rl0, rl1) + ); + var signAx = rl0 > rl1 ? -1 : 1; if(ax._breaks.length) { for(i = 0; i < ax._breaks.length; i++) { @@ -579,7 +583,7 @@ module.exports = function setConvert(ax, fullLayout) { ax._lBreaks += (brk.max - brk.min); } - ax._m2 = ax._length / (rl1 - rl0 - ax._lBreaks); + ax._m2 = ax._length / (rl1 - rl0 - ax._lBreaks * signAx); if(axLetter === 'y') { ax._breaks.reverse(); @@ -591,7 +595,11 @@ module.exports = function setConvert(ax, fullLayout) { for(i = 0; i < ax._breaks.length; i++) { brk = ax._breaks[i]; - ax._B.push(ax._B[ax._B.length - 1] - ax._m2 * (brk.max - brk.min)); + ax._B.push(ax._B[ax._B.length - 1] - ax._m2 * (brk.max - brk.min) * signAx); + } + + if(signAx === -1) { + ax._B.reverse(); } // fill pixel (i.e. 'p') min/max here, @@ -651,6 +659,7 @@ module.exports = function setConvert(ax, fullLayout) { b0 = bnds[1]; b1 = bnds[0]; } + // TODO should work with reversed-range axes vb = v; break; } diff --git a/test/image/baselines/axes_breaks-weekends_autorange-reversed.png b/test/image/baselines/axes_breaks-weekends_autorange-reversed.png new file mode 100644 index 0000000000000000000000000000000000000000..3c36378c7c2e1b68d1aebbaec06f3069817b4e29 GIT binary patch literal 55701 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 tBsZ79X3mj_f0O&S?EY;i|IfW*o$D^;_WkGLck Date: Tue, 10 Mar 2020 12:24:22 -0400 Subject: [PATCH 18/23] replace 'spread' -> 'size' in attr descriptions --- src/plots/cartesian/layout_attributes.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/layout_attributes.js b/src/plots/cartesian/layout_attributes.js index 138ed6cb441..7be688013fe 100644 --- a/src/plots/cartesian/layout_attributes.js +++ b/src/plots/cartesian/layout_attributes.js @@ -310,7 +310,7 @@ module.exports = { description: [ 'Sets the coordinate values corresponding to the breaks.', 'An alternative to `bounds`.', - 'Use `dvalue` to set the spread of the values along the axis.' + 'Use `dvalue` to set the size of the values along the axis.' ].join(' ') }, dvalue: { @@ -321,7 +321,7 @@ module.exports = { min: 0, dflt: ONEDAY, description: [ - 'Sets the spread of each `values` item.', + 'Sets the size of each `values` item.', 'The default is one day in milliseconds.' ].join(' ') }, From dcceb7693ed2a68264a295b9dca22c2e2ec65224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Tue, 10 Mar 2020 15:38:10 -0400 Subject: [PATCH 19/23] fix %H maskBreaks for values greater but on the same hour ... as the lower break bound --- src/plots/cartesian/set_convert.js | 7 ++++++- test/jasmine/tests/axes_test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/plots/cartesian/set_convert.js b/src/plots/cartesian/set_convert.js index 61bf8ce3d26..b7989f9b6fa 100644 --- a/src/plots/cartesian/set_convert.js +++ b/src/plots/cartesian/set_convert.js @@ -645,7 +645,12 @@ module.exports = function setConvert(ax, fullLayout) { bnds = Lib.simpleMap(brk.bounds, cleanNumber); b0 = bnds[0]; b1 = bnds[1]; - vb = (new Date(v)).getUTCHours(); + var vDate = new Date(v); + vb = vDate.getUTCHours() + ( + vDate.getUTCMinutes() * ONEMIN + + vDate.getUTCSeconds() * ONESEC + + vDate.getUTCMilliseconds() + ) / ONEDAY; if(bnds[0] > bnds[1]) doesCrossPeriod = true; break; case '': diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index c09add75104..0fcce6533e6 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4195,6 +4195,35 @@ describe('Test axes', function() { ]); }); + it('should discard coords within break bounds - date %H / high precision case', function() { + _calc({ + x: [ + '2020-01-03 17:00', + '2020-01-03 17:15', + '2020-01-03 17:30', + '2020-01-06 7:45', + '2020-01-06 8:00', + '2020-01-06 8:15', + '2020-01-06 8:30' + ] + }, { + xaxis: { + breaks: [ + {pattern: '%H', bounds: [17, 8]} + ] + } + }); + _assert('with dflt operation', [ + Lib.dateTime2ms('2020-01-03 17:00'), + BADNUM, + BADNUM, + BADNUM, + Lib.dateTime2ms('2020-01-06 8:00'), + Lib.dateTime2ms('2020-01-06 8:15'), + Lib.dateTime2ms('2020-01-06 8:30') + ]); + }); + it('should discard coords within [values[i], values[i] + dvalue] bounds', function() { var x = [ // Thursday From 28c328dfd3f9f31c83b727b610f4329f2b0c6149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Wed, 11 Mar 2020 16:57:04 -0400 Subject: [PATCH 20/23] increase dtick on axes with breaks ... ... when too many ticks fall into breaks. Update axes_breaks-finance baseline which is now showing ticks (!) --- src/plots/cartesian/axes.js | 72 +++++++++++-------- test/image/baselines/axes_breaks-finance.png | Bin 16363 -> 24905 bytes test/jasmine/tests/axes_test.js | 42 +++++++++++ 3 files changed, 85 insertions(+), 29 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 3f51a3f7367..769d2eea244 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -574,7 +574,6 @@ axes.calcTicks = function calcTicks(ax) { if((ax._tmin < startTick) !== axrev) return []; // return the full set of tick vals - var tickVals = []; if(ax.type === 'category' || ax.type === 'multicategory') { endTick = (axrev) ? Math.max(-0.5, endTick) : Math.min(ax._categories.length - 0.5, endTick); @@ -582,46 +581,66 @@ axes.calcTicks = function calcTicks(ax) { var isDLog = (ax.type === 'log') && !(isNumeric(ax.dtick) || ax.dtick.charAt(0) === 'L'); - var xPrevious = null; - var maxTicks = Math.max(1000, ax._length || 0); - for(var x = ax._tmin; - (axrev) ? (x >= endTick) : (x <= endTick); - x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar)) { - // prevent infinite loops - no more than one tick per pixel, - // and make sure each value is different from the previous - if(tickVals.length > maxTicks || x === xPrevious) break; - xPrevious = x; + var tickVals; + function generateTicks() { + var xPrevious = null; + var maxTicks = Math.max(1000, ax._length || 0); + tickVals = []; + for(var x = ax._tmin; + (axrev) ? (x >= endTick) : (x <= endTick); + x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar)) { + // prevent infinite loops - no more than one tick per pixel, + // and make sure each value is different from the previous + if(tickVals.length > maxTicks || x === xPrevious) break; + xPrevious = x; + + var minor = false; + if(isDLog && (x !== (x | 0))) { + minor = true; + } - var minor = false; - if(isDLog && (x !== (x | 0))) { - minor = true; + tickVals.push({ + minor: minor, + value: x + }); } - - tickVals.push({ - minor: minor, - value: x - }); } - // If same angle over a full circle, the last tick vals is a duplicate. - // TODO must do something similar for angular date axes. - if(isAngular(ax) && Math.abs(rng[1] - rng[0]) === 360) { - tickVals.pop(); - } + generateTicks(); if(ax.breaks) { + var nTicksBefore = tickVals.length; + // remove ticks falling inside breaks tickVals = tickVals.filter(function(d) { return ax.maskBreaks(d.value) !== BADNUM; }); - // TODO what to do with "overlapping" ticks? + // if 'numerous' ticks get placed into breaks, + // increase dtick to generate more ticks, + // so that some hopefully fall between breaks + if(ax.tickmode === 'auto' && tickVals.length < nTicksBefore / 6) { + ax.dtick /= 2; + ax._tmin = axes.tickFirst(ax); + generateTicks(); + tickVals = tickVals.filter(function(d) { + return ax.maskBreaks(d.value) !== BADNUM; + }); + } + + // remove "overlapping" ticks (e.g. on either side of a break) var tf2 = ax.tickfont ? 1.5 * ax.tickfont.size : 0; tickVals = tickVals.filter(function(d, i, self) { return !(i && Math.abs(ax.c2p(d.value) - ax.c2p(self[i - 1].value)) < tf2); }); } + // If same angle over a full circle, the last tick vals is a duplicate. + // TODO must do something similar for angular date axes. + if(isAngular(ax) && Math.abs(rng[1] - rng[0]) === 360) { + tickVals.pop(); + } + // save the last tick as well as first, so we can // show the exponent only on the last one ax._tmax = (tickVals[tickVals.length - 1] || {}).value; @@ -739,8 +758,6 @@ axes.autoTicks = function(ax, roughDTick) { // being > half of the final unit - so precalculate twice the rough val var roughX2 = 2 * roughDTick; - // TODO find way to have 'better' first tick on axes with breaks - if(roughX2 > ONEAVGYEAR) { roughDTick /= ONEAVGYEAR; base = getBase(10); @@ -799,9 +816,6 @@ axes.autoTicks = function(ax, roughDTick) { ax.tick0 = 0; base = getBase(10); ax.dtick = roundDTick(roughDTick, base, roundBase10); - - // TODO having tick0 = 0 being insider a breaks does not seem - // to matter ... } // prevent infinite loops diff --git a/test/image/baselines/axes_breaks-finance.png b/test/image/baselines/axes_breaks-finance.png index 87cc73e48cdb95d3bfb471a0d4b3b03f47b97b9d..e0cbac2516a44e7f415ad79c51d170709d9f5f1a 100644 GIT binary patch literal 24905 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 literal 16363 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 Zj_D4|{=%0BKH|rclTv Date: Thu, 12 Mar 2020 16:10:02 -0400 Subject: [PATCH 21/23] fix scale when panning on breaks --- src/plots/cartesian/dragbox.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plots/cartesian/dragbox.js b/src/plots/cartesian/dragbox.js index 98e02a31faf..74e3c801c91 100644 --- a/src/plots/cartesian/dragbox.js +++ b/src/plots/cartesian/dragbox.js @@ -1014,9 +1014,15 @@ function dragAxList(axList, pix) { var axi = axList[i]; if(!axi.fixedrange) { if(axi.breaks) { + var p0 = 0; + var p1 = axi._length; + var d0 = axi.p2l(p0 + pix) - axi.p2l(p0); + var d1 = axi.p2l(p1 + pix) - axi.p2l(p1); + var delta = (d0 + d1) / 2; + axi.range = [ - axi.l2r(axi._rl[0] - (axi.p2l(pix) - axi.p2l(0))), - axi.l2r(axi._rl[1] - (axi.p2l(axi._length + pix) - axi.p2l(axi._length))) + axi.l2r(axi._rl[0] - delta), + axi.l2r(axi._rl[1] - delta) ]; } else { axi.range = [ From 1b55b42f5ce3c6986774c3866d70630a72d6721a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 12 Mar 2020 16:13:35 -0400 Subject: [PATCH 22/23] fix 'increase dtick' lgoic for cases with dtick value starting 'M' --- src/plots/cartesian/axes.js | 7 +++++-- test/image/baselines/axes_breaks-finance.png | Bin 24905 -> 25052 bytes test/jasmine/tests/axes_test.js | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/plots/cartesian/axes.js b/src/plots/cartesian/axes.js index 769d2eea244..d1f58fa77a1 100644 --- a/src/plots/cartesian/axes.js +++ b/src/plots/cartesian/axes.js @@ -526,7 +526,9 @@ axes.prepTicks = function(ax) { // have explicit tickvals without tick text if(ax.tickmode === 'array') nt *= 100; - axes.autoTicks(ax, (Math.abs(rng[1] - rng[0]) - (ax._lBreaks || 0)) / nt); + + ax._roughDTick = (Math.abs(rng[1] - rng[0]) - (ax._lBreaks || 0)) / nt; + axes.autoTicks(ax, ax._roughDTick); // check for a forced minimum dtick if(ax._minDtick > 0 && ax.dtick < ax._minDtick * 2) { @@ -620,7 +622,8 @@ axes.calcTicks = function calcTicks(ax) { // increase dtick to generate more ticks, // so that some hopefully fall between breaks if(ax.tickmode === 'auto' && tickVals.length < nTicksBefore / 6) { - ax.dtick /= 2; + axes.autoTicks(ax, ax._roughDTick / 3); + autoTickRound(ax); ax._tmin = axes.tickFirst(ax); generateTicks(); tickVals = tickVals.filter(function(d) { diff --git a/test/image/baselines/axes_breaks-finance.png b/test/image/baselines/axes_breaks-finance.png index e0cbac2516a44e7f415ad79c51d170709d9f5f1a..b1d0bf56e9fff6e748e693f4d8e546b8f3848b31 100644 GIT binary patch literal 25052 zcmdSBbyQW|`!9;H(G7@{gb31Iih+W3cL{8IQz{)2(z5B0?nY8_gGko~loC|Bk&^E2 zGq>;ieShz{=iGb7Ib+;A#{El&F6LTutvR3PQ37yqA%VWYtqiSAJh0)bV4>U`K|?{zxYl5;a! z#_J2)+`CUg5?|j3K!_l;Y z?MnXVU%-E>KqKL*g#WsZ@F6B6>;YEy2od^c{{9b0DDOXihZ6cE649bU?x-|{|26QR zix^?C|M~%Fdl&|e=C^mdPXD?WE$YL~KTq=4sI)I3GDzd=v1JVZJYo2CkNfAM z2Mi(z(ubKI)c=}?43ZV=U!w-yxkg-^cx`d*?`Qq^opPCx)z(gWWHb5n<*2V=wfO+^ z7}Cf$HX-50tE$c@)0rx(G5WQUvINZ%9qmd^ww((g_)~Mch zE|`(j`SkLArS-&I_`ERgV2ZPHV#->+U|WqHw?P zFFr!F*p=KJF4gBK(XEcZj!y}B{P=Kb#`~(VzoR$#ap=X=+pL}@vo%5-G91lyOl5>5 zg0x;`$Da*+)OCNlE`KwXA{nF%5@DK?lU|=1=HC#_fTBmSvq?tH_eI0Uur}55W8hKn zF?k!Jc*kdVWRdIGA-aB(^py$e=RC3qGhr!iCw?$^eB%O{k!(Ut6r{%>6FuU3F3XiX z7$G7`K1~VS){LiC64t+H%805UXC>w&=5$}_x{79m9hxlsPi_GT1>?BwHZ$VHUr^Kz zt}w#DmC?F>O!`Vv;75JHBR)rbc3e?Q;x!A|U;ZgB^`6p9_?Ss08q(txslVz-T-?eC zR;UcD1m`ban9K zs!qzA?}A#)N~r~<*g?^MUfNj{1B#s!fsK6~v8edu^41}-i6${*scOO|=5S-8=UdW4 z(ysoMgAv07!NXDU70%At#0Mq|$(E&2o`+-7({5{ANqn~Hr@FBc2(yUvzn_sK%>c2G z1fGr=rczfku#uZ!pypy|j;C3-^4PSK&~-U0a8S^SK`Kn8sHeb%yEZiptO2=LND&fB z#;KLK27BeZB!zAF zuyb&bu!8 zITS+5VS0YN<1noKs%tiorqoe$G`7+PY9SrH$Fb7H^zjH`_on3TeVbB8UNY<-9mna+ zQC6o<&gU0*`>GF?(hT{gT$j=cyX?gK*@_L=-{O(^9nMDx$LrcQYG6oI+f1##r%6?y zdHd_y%8xAHUs$)FpiuajD+su#t2pZ{Yl?(ih3zzfEU`6#+pB0#yu!OC0p;=*lZe%h zK>qaw0=I;#XF^IcPjap{Y?~9ZXt-lE-{0*Ls(%!-BPbv{L)NRV;cm^FeHInrhk?z

(GkBGU&b-%G1P(N6sBvZqh-y!ZfmnCxAs8EXxVU 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 z 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 IRjtYY0xnmlDF6Tf literal 24905 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 diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index 84e8bb46efd..d613caa7e98 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4880,8 +4880,8 @@ describe('Test axes', function() { .then(function() { _assert('with breaks enabled on x-axis', { tickVals: [ - 1483531200000, 1484136000000, 1484740800000, 1485345600000, - 1485950400000, 1486555200000, 1487160000000 + 1483574400000, 1484092800000, 1484611200000, 1484870400000, + 1485388800000, 1485907200000, 1486425600000, 1486684800000 ] }); }) From 49b40534107c1d5cf91b9765e38e2a79064e776c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20T=C3=A9treault-Pinard?= Date: Thu, 12 Mar 2020 16:27:38 -0400 Subject: [PATCH 23/23] set scattergl and splom traces to visible:false on axis with breaks - this will be dealt with in https://github.com/plotly/plotly.js/issues/4630 --- src/plots/cartesian/axis_defaults.js | 12 +++++++++++ test/jasmine/tests/axes_test.js | 32 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/plots/cartesian/axis_defaults.js b/src/plots/cartesian/axis_defaults.js index 66f3db01ecf..d0bb2060038 100644 --- a/src/plots/cartesian/axis_defaults.js +++ b/src/plots/cartesian/axis_defaults.js @@ -128,6 +128,18 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, handleItemDefaults: breaksDefaults }); setConvert(containerOut, layoutOut); + + if(layoutOut._has('scattergl') || layoutOut._has('splom')) { + for(var i = 0; i < options.data.length; i++) { + var trace = options.data[i]; + if(trace.type === 'scattergl' || trace.type === 'splom') { + trace.visible = false; + Lib.warn(trace.type + + ' traces do not work on axes with breaks.' + + ' Setting trace ' + trace.index + ' to `visible: false`.'); + } + } + } } } diff --git a/test/jasmine/tests/axes_test.js b/test/jasmine/tests/axes_test.js index d613caa7e98..9b023fb0eb6 100644 --- a/test/jasmine/tests/axes_test.js +++ b/test/jasmine/tests/axes_test.js @@ -4901,6 +4901,38 @@ describe('Test axes', function() { .then(done); }); }); + + it('should set visible:false in scattergl traces on axis with breaks', function(done) { + var gd = createGraphDiv(); + + spyOn(Lib, 'warn'); + + Plotly.plot(gd, [{ + type: 'scattergl', + x: [ + '2020-01-02 08:00', '2020-01-02 17:00', + '2020-01-03 08:00', '2020-01-03 17:00', + '2020-01-04 08:00', '2020-01-04 17:00', + '2020-01-05 08:00', '2020-01-05 17:00', + '2020-01-06 08:00', '2020-01-06 17:00', + '2020-01-07 08:00', '2020-01-07 17:00' + ] + }], { + xaxis: { + breaks: [{pattern: '%H', bounds: [17, 8]}] + } + }) + .then(function() { + expect(gd._fullData[0].visible).toBe(false, 'sets visible:false'); + expect(Lib.warn).toHaveBeenCalledTimes(1); + expect(Lib.warn).toHaveBeenCalledWith('scattergl traces do not work on axes with breaks. Setting trace 0 to `visible: false`.'); + }) + .catch(failTest) + .then(function() { + destroyGraphDiv(); + done(); + }); + }); }); });