@tidepool/viz 1.53.0-web-3234-pdf-loop-settings.4 → 1.54.0-web-4151-copy-text.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data.js +1 -1
- package/dist/data.js.map +1 -1
- package/dist/getAGPFigures.js +1 -1
- package/dist/getAGPFigures.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/print.js +1 -1
- package/dist/print.js.map +1 -1
- package/package.json +1 -1
package/dist/data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","mappings":"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","sources":["webpack://@tidepool/viz/./src/utils/AggregationUtil.js","webpack://@tidepool/viz/./src/utils/DataUtil.js","webpack://@tidepool/viz/./src/utils/StatUtil.js","webpack://@tidepool/viz/./src/utils/basal.js","webpack://@tidepool/viz/./src/utils/bloodglucose.js","webpack://@tidepool/viz/./src/utils/bolus.js","webpack://@tidepool/viz/./src/utils/constants.js","webpack://@tidepool/viz/./src/utils/datetime.js","webpack://@tidepool/viz/./src/utils/device.js","webpack://@tidepool/viz/./src/utils/format.js","webpack://@tidepool/viz/./src/utils/settings/data.js","webpack://@tidepool/viz/./src/utils/stat.js","webpack://@tidepool/viz/./src/utils/validation/schema.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/array.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/filter.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/identity.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/null.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/zero.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/heap.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/heapselect.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/bisect.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/permute.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/reduce.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/result.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/index.js","webpack://@tidepool/viz/./node_modules/@ranfdev/deepobj/dist/deepobj.m.js","webpack://@tidepool/viz/external commonjs \"bows\"","webpack://@tidepool/viz/external commonjs \"d3-array\"","webpack://@tidepool/viz/external commonjs \"d3-format\"","webpack://@tidepool/viz/external commonjs \"d3-time-format\"","webpack://@tidepool/viz/external commonjs \"fastest-validator\"","webpack://@tidepool/viz/external commonjs \"i18next\"","webpack://@tidepool/viz/external commonjs \"lodash\"","webpack://@tidepool/viz/external commonjs \"moment\"","webpack://@tidepool/viz/external commonjs \"moment-timezone\"","webpack://@tidepool/viz/external commonjs \"react\"","webpack://@tidepool/viz/external commonjs \"reductio\"","webpack://@tidepool/viz/external commonjs \"sundial\"","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://@tidepool/viz/webpack/bootstrap","webpack://@tidepool/viz/webpack/runtime/define property getters","webpack://@tidepool/viz/webpack/runtime/hasOwnProperty shorthand","webpack://@tidepool/viz/webpack/runtime/make namespace object","webpack://@tidepool/viz/./src/modules/data/index.js"],"sourcesContent":["import _ from 'lodash';\nimport bows from 'bows';\nimport moment from 'moment';\nimport reductio from 'reductio';\n\nimport {\n countAutomatedBasalEvents,\n countDistinctSuspends,\n} from './basal';\n\nimport { formatLocalizedFromUTC } from './datetime';\nimport { classifyBgValue } from './bloodglucose';\nimport { MS_IN_DAY } from './constants';\n\nexport class AggregationUtil {\n /**\n * @param {Object} dataUtil - a DataUtil instance\n */\n constructor(dataUtil) {\n this.log = bows('AggregationUtil');\n this.init(dataUtil);\n }\n\n init = (dataUtil) => {\n this.dataUtil = dataUtil;\n this.bgBounds = _.get(dataUtil, 'bgPrefs.bgBounds');\n this.bgUnits = _.get(dataUtil, 'bgPrefs.bgUnits');\n this.timezoneName = _.get(dataUtil, 'timePrefs.timezoneName', 'UTC');\n this.initialActiveEndpoints = _.cloneDeep(this.dataUtil.activeEndpoints);\n this.excludedDevices = _.get(dataUtil, 'excludedDevices', []);\n\n reductio.registerPostProcessor('postProcessBasalAggregations', this.postProcessBasalAggregations);\n reductio.registerPostProcessor('postProcessBolusAggregations', this.postProcessBolusAggregations);\n reductio.registerPostProcessor('postProcessCalibrationAggregations', this.postProcessCalibrationAggregations);\n reductio.registerPostProcessor('postProcessAutoSuspendAggregations', this.postProcessAutoSuspendAggregations);\n reductio.registerPostProcessor('postProcessSiteChangeAggregations', this.postProcessSiteChangeAggregations);\n reductio.registerPostProcessor('postProcessSMBGAggregations', this.postProcessSMBGAggregations);\n reductio.registerPostProcessor('postProcessDataByDateAggregations', this.postProcessDataByDateAggregations);\n reductio.registerPostProcessor('postProcessStatsByDateAggregations', this.postProcessStatsByDateAggregations);\n };\n\n aggregateBasals = group => {\n this.dataUtil.filter.byType('basal');\n\n let reducer = reductio();\n reducer.dataList(true);\n\n let tags = [\n 'suspend',\n 'temp',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'basal', reducer));\n\n reducer(group);\n\n const result = {\n basal: group.post().postProcessBasalAggregations()(),\n };\n\n this.dataUtil.filter.byType('deviceEvent');\n\n reducer = reductio();\n reducer.dataList(true);\n\n tags = [\n 'automatedSuspend',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n result.automatedSuspend = group.post().postProcessAutoSuspendAggregations()();\n return result;\n };\n\n aggregateBoluses = group => {\n this.dataUtil.filter.byType('bolus');\n\n const reducer = reductio();\n reducer.dataList(true);\n\n const tags = [\n 'automated',\n 'correction',\n 'extended',\n 'interrupted',\n 'manual',\n 'oneButton',\n 'override',\n 'underride',\n 'wizard',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'bolus', reducer));\n\n reducer(group);\n\n return group.post().postProcessBolusAggregations()();\n };\n\n aggregateFingersticks = group => {\n this.dataUtil.filter.byType('smbg');\n\n let reducer = reductio();\n reducer.dataList(true);\n\n let tags = [\n 'manual',\n 'meter',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'smbg', reducer));\n\n const bgClasses = [\n 'veryLow',\n 'low',\n 'high',\n 'veryHigh',\n ];\n\n _.each(bgClasses, bgClass => this.reduceByBgClassification(bgClass, 'smbg', reducer));\n\n reducer(group);\n\n const result = {\n smbg: group.post().postProcessSMBGAggregations()(),\n };\n\n this.dataUtil.filter.byType('deviceEvent');\n\n reducer = reductio();\n reducer.dataList(true);\n\n tags = [\n 'calibration',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n result.calibration = group.post().postProcessCalibrationAggregations()();\n\n return result;\n };\n\n aggregateSiteChanges = group => {\n this.dataUtil.filter.byType('deviceEvent');\n\n const reducer = reductio();\n reducer.dataList(true);\n\n const tags = [\n 'cannulaPrime',\n 'reservoirChange',\n 'tubingPrime',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n return group.post().postProcessSiteChangeAggregations()();\n };\n\n aggregateDataByDate = group => {\n const types = _.map(this.dataUtil.types, d => d.type);\n this.dataUtil.filter.byTypes(types);\n\n const reducer = reductio();\n reducer.dataList(true);\n\n reducer(group);\n\n return group.post().postProcessDataByDateAggregations()();\n };\n\n aggregateStatsByDate = group => {\n const reducer = reductio();\n reducer.dataList(true);\n\n reducer(group);\n\n return group.post().postProcessStatsByDateAggregations()();\n };\n\n /**\n * postProcessBasalAggregations\n *\n * Post processor for crossfilter reductio basal aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for basal aggregations\n */\n postProcessBasalAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n suspend,\n temp,\n },\n } = dataForDay;\n\n _.each(dataList, this.dataUtil.normalizeDatumOut);\n\n const total = _.reduce([suspend, temp], (acc, { count = 0 }) => acc + count, 0);\n\n processedData[dataForDay.key] = {\n data: _.sortBy(dataList, this.dataUtil.activeTimeField),\n total,\n subtotals: {\n suspend: suspend.count,\n temp: temp.count,\n },\n };\n\n _.assign(\n processedData[dataForDay.key],\n countAutomatedBasalEvents(processedData[dataForDay.key])\n );\n\n _.assign(\n processedData[dataForDay.key],\n countDistinctSuspends(processedData[dataForDay.key])\n );\n\n if (processedData[dataForDay.key].total === 0) {\n // If there's no events for the day, we don't need to return it\n delete processedData[dataForDay.key].data;\n } else {\n // No need to return the data - we only want the aggregations\n delete processedData[dataForDay.key].data;\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessBolusAggregations\n *\n * Post processor for crossfilter reductio bolus aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for bolus aggregations\n */\n postProcessBolusAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n automated,\n correction,\n dataList,\n extended,\n interrupted,\n manual,\n oneButton,\n override,\n underride,\n wizard,\n },\n } = dataForDay;\n\n // Exclude automated boluses from total so that total and average per day only include\n // patient-initiated boluses\n const total = dataList.length - automated.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n automated: automated.count,\n correction: correction.count,\n extended: extended.count,\n interrupted: interrupted.count,\n manual: manual.count,\n oneButton: oneButton.count,\n override: override.count,\n underride: underride.count,\n wizard: wizard.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessCalibrationAggregations\n *\n * Post processor for crossfilter reductio calibration aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for calibration aggregations\n */\n postProcessCalibrationAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n calibration,\n },\n } = dataForDay;\n\n const total = calibration.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n calibration: calibration.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessAutoSuspendAggregations\n *\n * Post processor for crossfilter reductio automatedSuspend aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for automatedSuspend aggregations\n */\n postProcessAutoSuspendAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n automatedSuspend,\n },\n } = dataForDay;\n\n const total = automatedSuspend.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n automatedSuspend: automatedSuspend.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessSiteChangeAggregations\n *\n * Post processor for crossfilter reductio siteChange aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for siteChange aggregations\n */\n postProcessSiteChangeAggregations = priorResults => () => {\n const data = _.filter(\n _.cloneDeep(priorResults()),\n ({ value: { dataList } }) => _.some(\n dataList,\n d => _.includes(['prime', 'reservoirChange'], d.subType)\n )\n );\n\n const siteChangeTypes = [\n 'cannulaPrime',\n 'reservoirChange',\n 'tubingPrime',\n ];\n\n const processedData = {};\n let previousSiteChangeDates;\n\n if (data.length) {\n const firstDatum = _.first(\n _.sortBy(\n _.filter(data[0].value.dataList, d => _.includes(['prime', 'reservoirChange'], d.subType)),\n this.dataUtil.activeTimeField\n )\n );\n\n const previousSiteChangeDatums = this.dataUtil.getPreviousSiteChangeDatums(firstDatum);\n const dateFormat = 'YYYY-MM-DD';\n\n previousSiteChangeDates = {};\n\n _.each(siteChangeTypes, type => {\n if (previousSiteChangeDatums[type]) {\n previousSiteChangeDates[type] = formatLocalizedFromUTC(\n previousSiteChangeDatums[type][this.dataUtil.activeTimeField],\n this.dataUtil.timePrefs,\n dateFormat\n );\n }\n });\n }\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n cannulaPrime,\n reservoirChange,\n tubingPrime,\n },\n } = dataForDay;\n\n const datums = _.sortBy(dataList, this.dataUtil.activeTimeField);\n _.each(datums, this.dataUtil.normalizeDatumOut);\n\n processedData[dataForDay.key] = {\n data: datums,\n summary: {\n daysSince: {},\n },\n subtotals: {\n cannulaPrime: cannulaPrime.count,\n reservoirChange: reservoirChange.count,\n tubingPrime: tubingPrime.count,\n },\n };\n\n _.each(siteChangeTypes, type => {\n if (processedData[dataForDay.key].subtotals[type]) {\n if (previousSiteChangeDates[type]) {\n const dateDiff = Date.parse(dataForDay.key) - Date.parse(previousSiteChangeDates[type]);\n processedData[dataForDay.key].summary.daysSince[type] = dateDiff / MS_IN_DAY;\n } else {\n processedData[dataForDay.key].summary.daysSince[type] = NaN;\n }\n\n previousSiteChangeDates[type] = dataForDay.key;\n }\n });\n });\n\n return {\n byDate: processedData,\n };\n };\n\n /**\n * postProcessSMBGAggregations\n *\n * Post processor for crossfilter reductio smbg aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for smbg aggregations\n */\n postProcessSMBGAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n manual,\n meter,\n veryHigh,\n veryLow,\n high,\n low\n },\n } = dataForDay;\n\n const total = dataList.length;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n manual: manual.count,\n meter: meter.count,\n veryHigh: veryHigh.count,\n veryLow: veryLow.count,\n high: high.count,\n low: low.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessDataByDateAggregations\n *\n * Post processor for crossfilter reductio data by date aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted data by date aggregations for all types\n */\n postProcessDataByDateAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const datesWithData = _.map(data, 'key');\n const processedData = {};\n\n const activeRangeDates = _.map(_.range(this.initialActiveEndpoints.days || 0), (val, index) => (\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName)).subtract(index + 1, 'days').format('YYYY-MM-DD')\n );\n\n _.each(activeRangeDates, (date, index) => {\n if (_.includes(datesWithData, date)) {\n const dataForDay = _.find(data, { key: date });\n\n const {\n value: {\n dataList,\n },\n } = dataForDay;\n\n // Set the endpoints to filter current data for day\n this.dataUtil.activeEndpoints = {\n range: [\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index + 1, 'days').valueOf(),\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index, 'days').valueOf(),\n ],\n days: 1,\n activeDays: 1,\n };\n\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n const sortedData = _.sortBy(dataList, this.dataUtil.activeTimeField);\n const groupedData = _.groupBy(sortedData, 'type');\n const groupedBasals = _.cloneDeep(groupedData.basal || []);\n\n // Filter cgm data by the currently-set sample interval range.\n this.dataUtil.filter.bySampleIntervalRange(...(this.dataUtil.cgmSampleIntervalRange || this.dataUtil.defaultCgmSampleIntervalRange));\n\n const cbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const deduplicatedCbgData = this.dataUtil.getDeduplicatedCBGData(cbgData);\n\n groupedData.cbg = cbgData;\n groupedData.cbgDeduplicated = deduplicatedCbgData;\n\n // Clear the previous byType and bySampleInterval filters so as to not affect the next aggregations\n this.dataUtil.dimension.byType.filterAll();\n this.dataUtil.dimension.bySampleInterval.filterAll();\n\n const groupedPumpSettingsOverrides = _.filter(\n _.cloneDeep(groupedData.deviceEvent || []),\n { subType: 'pumpSettingsOverride' }\n );\n\n const initialGroupedPumpSettingsOverridesLength = groupedPumpSettingsOverrides.length;\n\n this.dataUtil.addBasalOverlappingStart(groupedBasals);\n this.dataUtil.addPumpSettingsOverrideOverlappingStart(groupedPumpSettingsOverrides);\n\n _.each(groupedData, typeData => _.each(typeData, d => this.dataUtil.normalizeDatumOut(d, ['*'])));\n\n if (groupedBasals.length > _.get(groupedData, 'basal.length', 0)) {\n if (!_.isArray(groupedData.basal)) groupedData.basal = [];\n groupedData.basal.unshift(groupedBasals[0]);\n }\n\n if (groupedPumpSettingsOverrides.length > initialGroupedPumpSettingsOverridesLength) {\n if (!_.isArray(groupedData.deviceEvent)) groupedData.deviceEvent = [];\n groupedData.deviceEvent.unshift(groupedPumpSettingsOverrides[0]);\n }\n\n processedData[dataForDay.key] = groupedData;\n }\n });\n\n // Reset the activeEndpoints to it's initial value\n this.dataUtil.activeEndpoints = _.cloneDeep(this.initialActiveEndpoints);\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n return processedData;\n };\n\n /**\n * postProcessStatsByDateAggregations\n *\n * Post processor for crossfilter reductio stats by date aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted stats by date aggregations\n */\n postProcessStatsByDateAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const datesWithData = _.map(data, 'key');\n const processedData = {};\n\n const activeRangeDates = _.map(_.range(this.initialActiveEndpoints.days || 0), (val, index) => (\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName)).subtract(index + 1, 'days').format('YYYY-MM-DD')\n );\n\n _.each(activeRangeDates, (date, index) => {\n if (_.includes(datesWithData, date)) {\n // Set the endpoints to filter current data for day\n this.dataUtil.activeEndpoints = {\n range: [\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index + 1, 'days').valueOf(),\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index, 'days').valueOf(),\n ],\n days: 1,\n activeDays: 1,\n };\n\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n // Fetch the stats with endpoints and activeDays set for the day\n processedData[date] = this.dataUtil.getStats(this.dataUtil.stats);\n }\n });\n\n // Reset the activeEndpoints to it's initial value\n this.dataUtil.activeEndpoints = _.cloneDeep(this.initialActiveEndpoints);\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n return processedData;\n };\n\n filterByActiveRange = results => {\n const [start, end] = this.initialActiveEndpoints.range;\n\n const startMoment = moment.utc(start).tz(this.timezoneName);\n const endMoment = moment.utc(end).tz(this.timezoneName);\n\n // If query ends at midnight, we only want to include data up to the previous whole calendar day\n if (endMoment.format('HH:mm') === '00:00') {\n endMoment.subtract(1, 'day').endOf('day');\n }\n\n // Select all data that between the two specified calendar days (inclusive)\n const startDate = startMoment.format('YYYY-MM-DD');\n const endDate = endMoment.format('YYYY-MM-DD');\n\n return _.filter(_.cloneDeep(results), result => result.key >= startDate && result.key <= endDate);\n };\n\n /* eslint-disable lodash/prefer-lodash-method */\n reduceByTag = (tag, type, reducer) => {\n reducer\n .value(tag)\n .count(true)\n .filter(d => d.type === type && d.tags[tag]);\n };\n /* eslint-enable lodash/prefer-lodash-method */\n\n /* eslint-disable lodash/prefer-lodash-method */\n reduceByBgClassification = (bgClass, type, reducer) => {\n reducer\n .value(bgClass)\n .count(true)\n .filter(d => {\n if (d.type !== type) return false;\n const datum = _.clone(d);\n this.dataUtil.normalizeDatumBgUnits(datum);\n return classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay') === bgClass;\n });\n };\n /* eslint-enable lodash/prefer-lodash-method */\n\n summarizeProcessedData = (processedData, days = this.dataUtil.activeEndpoints.activeDays) => {\n const total = _.sumBy(_.values(processedData), dateData => dateData.total);\n const avgPerDay = total / days;\n return {\n summary: {\n avgPerDay,\n total,\n subtotals: _.reduce(_.map(_.values(processedData), 'subtotals'), (acc, subtotals) => {\n const tags = _.keysIn(subtotals);\n _.each(tags, tag => {\n const count = _.get(acc, [tag, 'count'], 0) + subtotals[tag];\n const percentage = count / total;\n acc[tag] = {\n count,\n percentage,\n };\n });\n return acc;\n }, {}),\n },\n byDate: processedData,\n };\n };\n}\n\nexport default AggregationUtil;\n","import bows from 'bows';\nimport crossfilter from 'crossfilter'; // eslint-disable-line import/no-unresolved\nimport moment from 'moment-timezone';\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport sundial from 'sundial';\n\nimport {\n getLatestPumpUpload,\n getLastManualBasalSchedule,\n isControlIQ,\n isLoop,\n isAutomatedBasalDevice,\n isAutomatedBolusDevice,\n isSettingsOverrideDevice,\n isDIYLoop,\n isTidepoolLoop,\n isTwiistLoop,\n isOneMinCGMSampleIntervalDevice,\n isLibreViewAPI,\n} from './device';\n\nimport {\n hasExtended,\n isAutomated,\n isCorrection,\n isInterruptedBolus,\n isOneButton,\n isOverride,\n isUnderride,\n} from './bolus';\n\nimport { convertToMGDL } from './bloodglucose';\n\nimport {\n BGM_DATA_KEY,\n CGM_DATA_KEY,\n DEFAULT_BG_BOUNDS,\n DIABETES_DATA_TYPES,\n MS_IN_DAY,\n MS_IN_HOUR,\n MS_IN_MIN,\n MGDL_UNITS,\n DIY_LOOP,\n TIDEPOOL_LOOP,\n TWIIST_LOOP,\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE,\n ALARM,\n ALARM_NO_INSULIN,\n ALARM_NO_POWER,\n ALARM_OCCLUSION,\n EVENT,\n EVENT_PUMP_SHUTDOWN,\n} from './constants';\n\nimport {\n getMsPer24,\n getOffset,\n getTimezoneFromTimePrefs,\n} from './datetime';\n\n\nimport StatUtil from './StatUtil';\nimport AggregationUtil from './AggregationUtil';\nimport { commonStats, statFetchMethods } from './stat';\nimport SchemaValidator from './validation/schema';\n\nconst t = i18next.t.bind(i18next);\n\n/* global __DEV__ */\n\nexport class DataUtil {\n /**\n * @param {Array} data Raw Tidepool data\n */\n constructor(Validator = SchemaValidator) {\n this.log = bows('DataUtil');\n\n /* eslint-disable no-console */\n this.startTimer = __DEV__ ? name => console.time(name) : _.noop;\n this.endTimer = __DEV__ ? name => console.timeEnd(name) : _.noop;\n /* eslint-enable no-console */\n\n this.validator = Validator;\n this.init();\n }\n\n init = () => {\n this.startTimer('init total');\n this.data = crossfilter([]);\n this.queryDataCount = 0;\n this.defaultCgmSampleInterval = 5 * MS_IN_MIN;\n this.defaultCgmSampleIntervalRange = [this.defaultCgmSampleInterval, Infinity];\n this.setCgmSampleIntervalRange();\n\n this.buildDimensions();\n this.buildFilters();\n this.buildSorts();\n this.initFilterChangeHandler();\n this.endTimer('init total');\n };\n\n addData = (rawData = [], patientId, returnData = false) => {\n this.startTimer('addData');\n\n this.bolusDatumsByIdMap = this.bolusDatumsByIdMap || {};\n this.bolusToWizardIdMap = this.bolusToWizardIdMap || {};\n this.deviceUploadMap = this.deviceUploadMap || {};\n this.latestDatumByType = this.latestDatumByType || {};\n this.pumpSettingsDatumsByIdMap = this.pumpSettingsDatumsByIdMap || {};\n this.wizardDatumsByIdMap = this.wizardDatumsByIdMap || {};\n this.wizardToBolusIdMap = this.wizardToBolusIdMap || {};\n this.loopDataSetsByIdMap = this.loopDataSetsByIdMap || {};\n this.bolusDosingDecisionDatumsByIdMap = this.bolusDosingDecisionDatumsByIdMap || {};\n this.matchedDevices = this.matchedDevices || {};\n this.dataAnnotations = this.dataAnnotations || {};\n\n if (_.isEmpty(rawData) || !patientId) return {};\n\n // First, we check to see if we already have data for a different patient stored. If so, we\n // clear all data so that we never mix patient data.\n if (this.patientId && this.patientId !== patientId) {\n this.removeData();\n }\n this.patientId = patientId;\n\n // We first clone the raw data so we don't mutate it at the source\n this.startTimer('cloneRawData');\n const data = _.cloneDeep(rawData);\n this.endTimer('cloneRawData');\n\n this.startTimer('normalizeDataIn');\n _.each(data, this.normalizeDatumIn);\n this.endTimer('normalizeDataIn');\n\n // Join wizard and bolus datums\n this.startTimer('joinWizardAndBolus');\n _.each(data, this.joinWizardAndBolus);\n this.endTimer('joinWizardAndBolus');\n\n // Join bolus and dosingDecision datums\n this.startTimer('joinBolusAndDosingDecision');\n _.each(data, this.joinBolusAndDosingDecision);\n this.endTimer('joinBolusAndDosingDecision');\n\n // Add missing suppressed basals to select basal datums\n this.startTimer('addMissingSuppressedBasals');\n this.addMissingSuppressedBasals(data);\n this.endTimer('addMissingSuppressedBasals');\n\n // Filter out any data that failed validation, and any duplicates by `id`\n this.startTimer('filterValidData');\n this.clearFilters();\n const validData = _.uniqBy(data, 'id');\n const rejectedData = _.remove(validData, d => d.reject || this.filter.byId(d.id).top(1).length);\n this.endTimer('filterValidData');\n\n this.startTimer('tagData');\n _.each(validData, this.tagDatum);\n this.endTimer('tagData');\n\n this.startTimer('addValidData');\n this.data.add(validData);\n this.endTimer('addValidData');\n\n this.log('validData', validData.length, 'of', data.length);\n if (rejectedData.length) this.log('rejectedData', rejectedData);\n\n this.setMetaData();\n this.endTimer('addData');\n\n const result = {\n metaData: this.getMetaData([\n 'bgSources',\n 'latestDatumByType',\n 'latestPumpUpload',\n 'latestTimeZone',\n 'patientId',\n 'size',\n 'queryDataCount',\n ]),\n };\n\n if (returnData) {\n _.each(validData, d => this.normalizeDatumOut(d, '*'));\n result.data = validData;\n }\n\n return result;\n };\n\n /* eslint-disable no-param-reassign */\n normalizeDatumIn = d => {\n // Pre-process datums by type\n if (d.type === 'basal') {\n if (!d.rate && d.deliveryType === 'suspend') {\n d.rate = 0.0;\n }\n\n if (d.suppressed) {\n this.normalizeSuppressedBasal(d);\n }\n\n // Prevent ongoing basals with unknown durations from extending into the future\n if (_.isFinite(d.duration) && _.includes(_.map(d.annotations, 'code'), 'basal/unknown-duration')) {\n const currentTime = Date.parse(moment.utc().toISOString());\n const maxDuration = currentTime - Date.parse(d.time);\n d.duration = _.min([d.duration, maxDuration]);\n if (_.isFinite(d.suppressed?.duration)) d.suppressed.duration = d.duration;\n }\n }\n\n if (d.type === 'upload' && d.dataSetType === 'continuous') {\n if (isLoop(d)) this.loopDataSetsByIdMap[d.id] = d;\n if (!d.time) d.time = moment.utc().toISOString();\n }\n\n if (d.messagetext) {\n d.type = 'message';\n d.messageText = d.messagetext;\n d.parentMessage = d.parentmessage || null;\n d.time = d.timestamp;\n }\n\n if (d.type === 'cbg' && !d.sampleInterval) {\n // Legacy CGM data does not include sampleInterval, so we need to add it if unavailable, since\n // we rely on it for stat calculations and data filtering from the frontend queries.\n let sampleInterval = this.defaultCgmSampleInterval;\n\n if (isLibreViewAPI(d)) {\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'cbg/unknown-sample-interval' });\n } else if (d.deviceId?.indexOf('AbbottFreeStyleLibre') === 0 && d.deviceId.indexOf('AbbottFreeStyleLibre3') !== 0) {\n // The Abbott FreeStyle Libre 3 uses the default interval of 5 minutes, while the original\n // uses 15. FreeStyle Libre 2 data comes with the sampleInterval, so we don't need to set it here.\n sampleInterval = 15 * MS_IN_MIN;\n }\n\n d.sampleInterval = sampleInterval;\n }\n\n if (d.type === 'dosingDecision') {\n // Use `normal` instead of deprecated `amount` for requestedBolus\n if (d.requestedBolus?.normal == null && d.requestedBolus?.amount != null) {\n d.requestedBolus.normal = d.requestedBolus.amount;\n delete d.requestedBolus.amount;\n }\n\n // Use `amount` field for recommendedBolus if not present, but normal/extended are\n if (\n d.recommendedBolus &&\n d.recommendedBolus.amount == null &&\n (d.recommendedBolus.normal != null || d.recommendedBolus.extended != null)\n ) {\n // Both normal and extended can be zero, so check for null/undefined only\n d.recommendedBolus.amount =\n (d.recommendedBolus.normal ?? 0) + (d.recommendedBolus.extended ?? 0);\n delete d.recommendedBolus.normal;\n delete d.recommendedBolus.extended;\n delete d.recommendedBolus.duration;\n }\n }\n\n // We validate datums before converting the time and deviceTime to hammerTime integers,\n // as we want to validate that they are valid ISO date strings\n this.validateDatumIn(d);\n if (d.reject) return;\n\n // Convert the time and deviceTime properties to hammertime,\n // which improves dimension filtering performance significantly over using ISO strings.\n // We store the original time strings, with labels prefaced with underscores, however,\n // for easier reference when debugging.\n /* eslint-disable no-underscore-dangle */\n d._time = d.time;\n d._deviceTime = d.deviceTime || d.time;\n /* eslint-enable no-underscore-dangle */\n d.time = Date.parse(d.time);\n d.deviceTime = d.deviceTime ? Date.parse(d.deviceTime) : d.time;\n\n // Generate a map of latest datums by type\n if (d.time > _.get(this.latestDatumByType, [d.type, 'time'], 0)) this.latestDatumByType[d.type] = d;\n\n // Also add timeChange deviceEvents to latest datums map to help determine a recommended timezone\n if (d.type === 'deviceEvent' && d.subType === 'timeChange') {\n if (d.time > _.get(this.latestDatumByType, ['timeChange', 'time'], 0)) this.latestDatumByType.timeChange = d;\n }\n\n // Populate mappings to be used for 2-way join of boluses and wizards\n if (d.type === 'wizard' && _.isString(d.bolus)) {\n this.wizardDatumsByIdMap[d.id] = d;\n this.bolusToWizardIdMap[d.bolus] = d.id;\n this.wizardToBolusIdMap[d.id] = d.bolus;\n }\n\n // Populate mappings to be used for 2-way join of boluses and dosing decisions\n if (d.type === 'dosingDecision' && _.includes(['normalBolus', 'simpleBolus', 'watchBolus', 'oneButtonBolus'], d.reason)) {\n this.bolusDosingDecisionDatumsByIdMap[d.id] = d;\n }\n\n if (d.type === 'bolus') {\n this.bolusDatumsByIdMap[d.id] = d;\n }\n\n if (d.type === 'pumpSettings') {\n this.pumpSettingsDatumsByIdMap[d.id] = d;\n }\n\n // Generate a map of devices by deviceId\n if (!d.deviceId && _.get(d, 'origin.name') === 'com.apple.HealthKit') {\n const HKdeviceId = ['HealthKit'];\n if (_.get(d, 'origin.payload.sourceRevision.source.name')) {\n HKdeviceId.push(_.get(d, 'origin.payload.sourceRevision.source.name'));\n }\n HKdeviceId.push(d.uploadId.slice(0, 6));\n d.deviceId = HKdeviceId.join(' ');\n }\n if (!d.deviceId && _.get(d, 'payload.transmitterId', false)) {\n const dexDeviceId = ['Dexcom', d.uploadId.slice(0, 6)];\n d.deviceId = dexDeviceId.join(' ');\n }\n if (d.deviceId && !this.deviceUploadMap[d.deviceId]) {\n this.deviceUploadMap[d.deviceId] = d.uploadId;\n }\n };\n\n joinWizardAndBolus = d => {\n if (_.includes(['bolus', 'wizard'], d.type)) {\n const isWizard = d.type === 'wizard';\n const fieldToPopulate = isWizard ? 'bolus' : 'wizard';\n const idMap = isWizard ? this.wizardToBolusIdMap : this.bolusToWizardIdMap;\n const datumMap = isWizard ? this.bolusDatumsByIdMap : this.wizardDatumsByIdMap;\n\n if (idMap[d.id]) {\n const datumToPopulate = _.omit(datumMap[idMap[d.id]], d.type);\n\n if (isWizard && d.uploadId !== datumToPopulate.uploadId) {\n // Due to an issue stemming from a fix for wizard datums in Uploader >= v2.35.0, we have a\n // possibility of duplicates of older wizard datums from previous uploads. The boluses and\n // corrected wizards should both reference the same uploadId, so we can safely reject\n // wizards that don't reference the same upload as the bolus it's referencing.\n d.reject = true;\n d.rejectReason = ['Upload ID does not match referenced bolus'];\n } else {\n d[fieldToPopulate] = datumToPopulate;\n }\n }\n }\n };\n\n joinBolusAndDosingDecision = d => {\n if (d.type === 'bolus' && !!this.loopDataSetsByIdMap[d.uploadId]) {\n const timeThreshold = MS_IN_MIN;\n\n // Find the dosing decision that matches the bolus by checking if there is a definitive association\n d.dosingDecision = _.find(\n _.mapValues(this.bolusDosingDecisionDatumsByIdMap),\n ({ associations = [] }) => _.some(associations, { reason: 'bolus', id: d.id })\n );\n\n // If no definitive dosing decision association is provided, such as can be the case with Tidepool\n // and DIY Loop, we look for the closest dosing decision within a time threshold\n if (!d.dosingDecision) {\n const proximateDosingDecisions = _.filter(\n _.mapValues(this.bolusDosingDecisionDatumsByIdMap),\n ({ time, associations }) => {\n // If there is a definitive association, we skip this decision, as it would have been\n // associated with the bolus already in the code above if the id matched\n if (_.some(associations, { reason: 'bolus' })) return false;\n\n const timeOffset = Math.abs(time - d.time);\n return timeOffset <= timeThreshold;\n }\n );\n\n const sortedProximateDosingDecisions = _.orderBy(proximateDosingDecisions, ({ time }) => Math.abs(time - d.time), 'asc');\n const dosingDecisionWithMatchingNormal = _.find(sortedProximateDosingDecisions, dosingDecision => dosingDecision.requestedBolus?.normal === d.normal);\n\n // Set the best-matching dosing decision, if available, or the first one within the time threshold\n d.dosingDecision = dosingDecisionWithMatchingNormal || sortedProximateDosingDecisions[0];\n\n if (d.dosingDecision) {\n // Set the assocation to this bolus so that we don't risk associating it again if other proximate matches occur\n this.bolusDosingDecisionDatumsByIdMap[d.dosingDecision.id].associations = [\n ...d.dosingDecision.associations || [],\n { reason: 'bolus', id: d.id },\n ];\n }\n }\n\n if (d.dosingDecision) {\n // attach associated pump settings to dosingDecisions\n const associatedPumpSettingsId = _.find(d.dosingDecision.associations, { reason: 'pumpSettings' })?.id;\n d.dosingDecision.pumpSettings = this.pumpSettingsDatumsByIdMap[associatedPumpSettingsId];\n\n // Translate relevant dosing decision data onto expected bolus fields\n d.carbInput = d.dosingDecision.originalFood?.nutrition?.carbohydrate?.net ??\n d.dosingDecision.food?.nutrition?.carbohydrate?.net; // use originalFood if present, as this is the original value present at time of bolus\n d.bgInput = d?.dosingDecision?.smbg?.value || _.last(d.dosingDecision.bgHistorical || [])?.value;\n d.insulinOnBoard = d.dosingDecision.insulinOnBoard?.amount;\n\n // Loop interrupted boluses may not have expectedNormal set,\n // so we set it to the requested normal from the dosing decision\n const requestedNormal = d.dosingDecision.requestedBolus?.normal;\n\n if ((!d.expectedNormal && requestedNormal) && (d.normal !== requestedNormal)) {\n d.expectedNormal = requestedNormal;\n }\n }\n }\n };\n\n addMissingSuppressedBasals = data => {\n // Mapping function to get the basal schedules for a given pumpSettings datum,\n // ordered by start time in descending order for easier comparison with basals\n const getOrderedPumpSettingsSchedules = ({ activeSchedule, basalSchedules, deviceId, time }) => ({\n basalSchedule: _.orderBy(basalSchedules?.[activeSchedule], 'start', 'desc'),\n time,\n deviceId,\n });\n\n const shouldGenerateSuppressedBasal = (d) => (\n d.type === 'basal' &&\n !d.suppressed &&\n _.includes(['automated', 'temp'], d.deliveryType) &&\n isTwiistLoop(d)\n );\n\n // Get the pump settings datums ordered by start time in descending order\n const pumpSettingsByStartTimes = _.orderBy(\n _.map(_.values(this.pumpSettingsDatumsByIdMap), getOrderedPumpSettingsSchedules),\n 'time',\n 'desc'\n );\n\n // We will need add additional basals when we split existing basals that overlap with pump settings schedules\n const basalsToAdd = [];\n\n _.each(data, d => {\n if (shouldGenerateSuppressedBasal(d)) {\n // Get the pump settings datum that is active at the time of the basal by grabbing the first\n // datum with a time less than or equal to the basal's time\n const pumpSettingsDatum = _.find(pumpSettingsByStartTimes, ps => ps.deviceId === d.deviceId && ps.time <= d.time);\n const activeSchedule = pumpSettingsDatum?.basalSchedule;\n\n if (!activeSchedule?.length) {\n // No schedule available, skip this basal\n return;\n }\n\n // Calculate the end time of the basal\n const basalEndTime = d.time + (d.duration || 0);\n\n // Get the msPer24 for the utc start and end times of the basal datum, then adjust for timezone offset\n const timezoneOffsetMs = (d.timezoneOffset || 0) * MS_IN_MIN;\n const basalMsPer24WithOffset = {\n start: getMsPer24(d.time) + timezoneOffsetMs,\n end: getMsPer24(basalEndTime) + timezoneOffsetMs,\n };\n\n // If the offset msPer24 is negative, as can happen with negative timezone offsets,\n // we need to add a day to adjust it to be within the 24-hour range\n if (basalMsPer24WithOffset.start < 0) basalMsPer24WithOffset.start += MS_IN_DAY;\n if (basalMsPer24WithOffset.end < 0) basalMsPer24WithOffset.end += MS_IN_DAY;\n\n // If end time crosses midnight (is less than start), extend it to next day\n if (basalMsPer24WithOffset.end < basalMsPer24WithOffset.start) {\n basalMsPer24WithOffset.end += MS_IN_DAY;\n }\n\n // Find all schedule segments that this basal overlaps\n const currentDaySegments = [];\n const nextDaySegments = [];\n\n // Sort schedule by start time ascending for easier processing\n const sortedSchedule = _.sortBy(activeSchedule, 'start');\n\n for (let i = 0; i < sortedSchedule.length; i++) {\n const segment = sortedSchedule[i];\n const nextSegment = sortedSchedule[i + 1];\n\n const segmentStart = segment.start;\n const segmentEnd = nextSegment ? nextSegment.start : MS_IN_DAY;\n\n // Check if basal overlaps with this segment in the current day\n const basalOverlapsCurrentDay = (\n basalMsPer24WithOffset.start < segmentEnd &&\n basalMsPer24WithOffset.end > segmentStart\n );\n\n if (basalOverlapsCurrentDay) {\n currentDaySegments.push({\n ...segment,\n segmentEnd,\n overlapStart: Math.max(basalMsPer24WithOffset.start, segmentStart),\n overlapEnd: Math.min(basalMsPer24WithOffset.end, segmentEnd)\n });\n }\n\n // Also check if basal overlaps with this segment when extended to next day\n // This handles cases where the basal crosses midnight\n if (basalMsPer24WithOffset.end > MS_IN_DAY) {\n const extendedSegmentStart = segmentStart + MS_IN_DAY;\n const extendedSegmentEnd = segmentEnd + MS_IN_DAY;\n\n const basalOverlapsNextDay = (\n basalMsPer24WithOffset.start < extendedSegmentEnd &&\n basalMsPer24WithOffset.end > extendedSegmentStart\n );\n\n if (basalOverlapsNextDay) {\n nextDaySegments.push({\n ...segment,\n segmentEnd: extendedSegmentEnd,\n overlapStart: Math.max(basalMsPer24WithOffset.start, extendedSegmentStart),\n overlapEnd: Math.min(basalMsPer24WithOffset.end, extendedSegmentEnd)\n });\n }\n }\n }\n\n // Combine segments in chronological order: current day first, then next day\n const overlappingSegments = [...currentDaySegments, ...nextDaySegments];\n\n // It's expected that a basal will overlap with at least one segment\n if (overlappingSegments.length === 1) {\n // Simple case: basal is within a single schedule segment\n const segment = overlappingSegments[0];\n d.suppressed = {\n ...d,\n id: `${d.id}_suppressed`,\n deliveryType: 'scheduled',\n rate: segment.rate || 0,\n };\n } else if (overlappingSegments.length > 1) {\n // Complex case: basal crosses schedule boundaries, need to split\n const originalDuration = d.duration || 0;\n const basalDurationMs24 = basalMsPer24WithOffset.end - basalMsPer24WithOffset.start;\n\n // Update the original basal to cover only the first segment\n const firstSegment = overlappingSegments[0];\n const firstSegmentMs24Duration = firstSegment.overlapEnd - firstSegment.overlapStart;\n const firstSegmentDuration = (firstSegmentMs24Duration / basalDurationMs24) * originalDuration;\n\n d.duration = firstSegmentDuration;\n d.suppressed = {\n ...d,\n id: `${d.id}_suppressed`,\n deliveryType: 'scheduled',\n rate: firstSegment.rate || 0,\n duration: firstSegmentDuration,\n time: d.time, // Keep original time\n };\n\n // Create additional basal datums for the remaining segments\n let cumulativeDuration = firstSegmentDuration;\n\n for (let i = 1; i < overlappingSegments.length; i++) {\n const segment = overlappingSegments[i];\n const segmentMs24Duration = segment.overlapEnd - segment.overlapStart;\n const segmentDuration = (segmentMs24Duration / basalDurationMs24) * originalDuration;\n\n const newBasal = {\n ...d,\n id: `${d.id}_split_${i}`,\n time: d.time + cumulativeDuration,\n duration: segmentDuration,\n suppressed: {\n ...d,\n id: `${d.id}_suppressed_split_${i}`,\n deliveryType: 'scheduled',\n rate: segment.rate || 0,\n duration: segmentDuration,\n time: d.time + cumulativeDuration,\n }\n };\n\n // Update deviceTime if it exists\n if (d.deviceTime) {\n newBasal.deviceTime = d.deviceTime + cumulativeDuration;\n newBasal.suppressed.deviceTime = newBasal.deviceTime;\n }\n\n basalsToAdd.push(newBasal);\n cumulativeDuration += segmentDuration;\n }\n } else {\n // Fallback: no overlapping segments found (shouldn't happen normally)\n this.log('Warning: No overlapping segments found for basal', d.id);\n }\n }\n });\n\n // Add the new split basal datums to the data array\n data.push(...basalsToAdd);\n };\n\n /**\n * Medtronic 5 and 7 series (which always have a deviceId starting with 'MedT-') carb exchange\n * data is converted to carbs at a rounded 1:15 ratio in the uploader, and needs to be\n * de-converted back into exchanges.\n */\n needsCarbToExchangeConversion = d => {\n const annotations = _.get(d, 'annotations', []);\n\n return (d.deviceId && d.deviceId.indexOf('MedT-') === 0)\n && d.carbUnits === 'exchanges'\n && _.isFinite(d.carbInput)\n && _.findIndex(annotations, { code: 'medtronic/wizard/carb-to-exchange-ratio-deconverted' }) === -1;\n };\n\n /**\n * When deconverting the carbs to exchanges, we use a 15:1 ratio, and round to the nearest 0.5,\n * since that is the increment used when entering exchange values in the pump\n */\n getDeconvertedCarbExchange = d => {\n const deconvertedCarbInput = d.carbInput / 15;\n const increment = 0.5;\n const inverse = 1 / increment;\n return Math.round(deconvertedCarbInput * inverse) / inverse;\n };\n\n tagDatum = d => {\n if (d.type === 'basal') {\n d.tags = {\n suspend: d.deliveryType === 'suspend',\n temp: d.deliveryType === 'temp',\n };\n }\n\n if (d.type === 'bolus') {\n const isWizardOrDosingDecision = d.wizard || d.dosingDecision?.food?.nutrition?.carbohydrate?.net;\n\n d.tags = {\n automated: isAutomated(d),\n correction: isCorrection(d),\n extended: hasExtended(d),\n interrupted: isInterruptedBolus(d),\n manual: !isWizardOrDosingDecision && !isAutomated(d),\n override: isOverride(d),\n underride: isUnderride(d),\n wizard: !!isWizardOrDosingDecision,\n loop: !!this.loopDataSetsByIdMap[d.uploadId],\n oneButton: isOneButton(d),\n };\n }\n\n if (d.type === 'wizard') {\n d.tags = {\n extended: hasExtended(d),\n interrupted: isInterruptedBolus(d),\n override: isOverride(d),\n underride: isUnderride(d),\n };\n }\n\n if (d.type === 'smbg') {\n d.tags = {\n manual: d.subType === 'manual',\n meter: d.subType !== 'manual',\n };\n }\n\n if (d.type === 'food') {\n d.tags = {\n loop: !!this.loopDataSetsByIdMap[d.uploadId],\n };\n }\n\n if (d.type === 'deviceEvent') {\n const isReservoirChange = d.subType === 'reservoirChange';\n const isPrime = d.subType === 'prime';\n\n d.tags = {\n automatedSuspend: (\n d.subType === 'status'\n && d.status === 'suspended'\n && d.reason?.suspended === 'automatic'\n && d.payload?.suspended?.reason === 'Auto suspend by PLGS'\n ),\n calibration: d.subType === 'calibration',\n [SITE_CHANGE]: isReservoirChange || isPrime,\n [SITE_CHANGE_RESERVOIR]: isReservoirChange,\n [SITE_CHANGE_CANNULA]: isPrime && d.primeTarget === 'cannula',\n [SITE_CHANGE_TUBING]: isPrime && d.primeTarget === 'tubing',\n };\n\n if (isTwiistLoop(d)) {\n const recognizedAlarmTypes = [\n ALARM_NO_INSULIN,\n ALARM_NO_POWER,\n ALARM_OCCLUSION,\n ];\n\n d.tags = {\n ...d.tags,\n [ALARM]: d.subType === 'alarm' && _.includes(recognizedAlarmTypes, d.alarmType),\n ..._.reduce(recognizedAlarmTypes, (acc, type) => {\n acc[type] = d.alarmType === type;\n return acc;\n }, {}),\n };\n }\n }\n\n // Events can appear on any datum type.\n // We only display one event per datum, so we set the event tag to the highest priority event that applies.\n // Currently, the only event we tag is pump shutdowns on Control-IQ pumps, but we anticipate adding more in the future.\n const prioritizedEventTypes = [\n EVENT_PUMP_SHUTDOWN,\n ];\n\n const events = {\n [EVENT_PUMP_SHUTDOWN]: isControlIQ(d) && _.some(d.annotations, { code: 'pump-shutdown' }),\n };\n\n const eventType = _.find(prioritizedEventTypes, type => events[type]);\n\n if (eventType) {\n d.tags = {\n ...d.tags || {},\n [EVENT]: eventType,\n };\n }\n };\n\n validateDatumIn = d => {\n let validator = this.validator[d.type] || this.validator.common;\n if (_.isFunction(validator)) validator = { validator };\n\n // Run all validators and store the results in an array\n const validateResult = [];\n _.each(_.values(validator), (validationMethod, i) => {\n // only run validationMethod if it's the first or previous validations have all failed\n if (i === 0 || validateResult.indexOf(true) === -1) {\n validateResult.push(validationMethod(d));\n }\n });\n\n // Reject datum if none of the validators pass\n if (validateResult.indexOf(true) === -1) {\n d.reject = true;\n d.rejectReason = validateResult;\n }\n };\n\n normalizeDatumOut = (d, fields = []) => {\n if (this.returnRawData) {\n /* eslint-disable no-underscore-dangle */\n if (d._time) {\n d.time = d._time;\n delete d._time;\n }\n\n if (d._deviceTime) {\n d.deviceTime = d._deviceTime;\n delete d._deviceTime;\n }\n\n delete d.tags;\n\n if (_.includes(['bolus', 'wizard'], d.type)) {\n const isWizard = d.type === 'wizard';\n const fieldToRestore = isWizard ? 'bolus' : 'wizard';\n if (_.get(d, [fieldToRestore, 'id'])) d[fieldToRestore] = d[fieldToRestore].id;\n }\n\n if (d.type === 'message') {\n delete d.type;\n delete d.messageText;\n delete d.parentMessage;\n delete d.time;\n }\n\n return;\n /* eslint-enable no-underscore-dangle */\n }\n\n const { timezoneName } = this.timePrefs || {};\n const normalizeAllFields = fields[0] === '*';\n\n // Normal time post-processing\n this.normalizeDatumOutTime(d, fields);\n\n // Add source and serial number metadata\n if (d.uploadId && (normalizeAllFields || _.includes(fields, 'deviceSerialNumber'))) {\n d.deviceSerialNumber = _.get(this.uploadMap, [d.uploadId, 'deviceSerialNumber']);\n }\n if (!d.source) d.source = _.get(this.uploadMap, [d.uploadId, 'source'], 'Unspecified Data Source');\n\n // Additional post-processing by type\n if (d.type === 'basal') {\n d.normalEnd = d.normalTime + d.duration;\n d.subType = d.deliveryType;\n\n // Annotate any incomplete suspends\n if (normalizeAllFields || _.includes(fields, 'annotations')) {\n const intersectsIncompleteSuspend = _.some(\n this.incompleteSuspends,\n suspend => {\n const suspendStart = suspend[this.activeTimeField];\n return d.normalTime <= suspendStart && suspendStart <= d.normalEnd;\n }\n );\n\n if (intersectsIncompleteSuspend) {\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'basal/intersects-incomplete-suspend' });\n this.log('intersectsIncompleteSuspend', d.id);\n }\n }\n\n // Recurse as needed for suppressed basals\n if (d.suppressed && (normalizeAllFields || _.includes(fields, 'suppressed'))) this.normalizeDatumOut(d.suppressed, fields);\n }\n\n if (d.type === 'cbg' || d.type === 'smbg') {\n this.normalizeDatumBgUnits(d);\n\n if (normalizeAllFields || _.includes(fields, 'msPer24')) {\n d.msPer24 = getMsPer24(d.normalTime, timezoneName);\n }\n\n if (normalizeAllFields || _.includes(fields, 'localDate')) {\n d.localDate = moment.utc(d[this.activeTimeField]).tz(timezoneName || 'UTC').format('YYYY-MM-DD');\n }\n }\n\n if (d.type === 'pumpSettings') {\n this.normalizeDatumBgUnits(d, [], ['bgSafetyLimit']);\n this.normalizeDatumBgUnits(d, ['bgTarget', 'bgTargets'], ['target', 'range', 'low', 'high']);\n this.normalizeDatumBgUnits(d, ['bgTargetPreprandial', 'bgTargetPhysicalActivity'], ['low', 'high']);\n this.normalizeDatumBgUnits(d, ['insulinSensitivity', 'insulinSensitivities'], ['amount']);\n // Set basalSchedules object to an array sorted by name: 'standard' first, then alphabetical\n if (normalizeAllFields || _.includes(fields, 'basalSchedules')) {\n d.basalSchedules = _.flatten(_.partition(\n _.sortBy(_.map(d.basalSchedules, (value, name) => ({ name, value })), 'name'),\n ({ name }) => (name === 'standard')\n ));\n }\n }\n\n if (d.type === 'wizard') {\n this.normalizeDatumBgUnits(d, [], ['bgInput']);\n this.normalizeDatumBgUnits(d, ['bgTarget'], ['target', 'range', 'low', 'high']);\n this.normalizeDatumBgUnits(d, [], ['insulinSensitivity']);\n\n if (_.isObject(d.bolus)) this.normalizeDatumOut(d.bolus, fields);\n\n if (this.needsCarbToExchangeConversion(d)) {\n d.carbInput = this.getDeconvertedCarbExchange(d);\n d.insulinCarbRatio = _.round(15 / d.insulinCarbRatio, 1);\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'medtronic/wizard/carb-to-exchange-ratio-deconverted' });\n }\n }\n\n if (d.type === 'dosingDecision') {\n this.normalizeDatumBgUnits(d, ['bgTargetSchedule'], ['low', 'high']);\n this.normalizeDatumBgUnits(d, ['bgForecast'], ['value']);\n this.normalizeDatumBgUnits(d, ['bgHistorical'], ['value']);\n this.normalizeDatumBgUnits(d, ['smbg'], ['value']);\n if (_.isObject(d.pumpSettings)) this.normalizeDatumOut(d.pumpSettings, fields);\n }\n\n if (d.type === 'bolus') {\n this.normalizeDatumBgUnits(d, [], ['bgInput']);\n if (_.isObject(d.wizard)) this.normalizeDatumOut(d.wizard, fields);\n if (_.isObject(d.dosingDecision)) this.normalizeDatumOut(d.dosingDecision, fields);\n }\n\n if (d.type === 'deviceEvent') {\n this.normalizeDatumBgUnits(d, ['bgTarget'], ['low', 'high']);\n const isOverrideEvent = d.subType === 'pumpSettingsOverride';\n\n if (_.isFinite(d.duration)) {\n // DIY and Tidepool Loop are reporting these durations in seconds instead of the milliseconds.\n // For now, until a fix is present, we'll convert for Tidepool Loop and DIY Loop.\n // Once a fix is present, we will only convert for DIY and Tidepool Loop versions prior to the fix.\n if (isOverrideEvent && (isTidepoolLoop(d) || isDIYLoop(d))) d.duration = d.duration * 1000;\n d.normalEnd = d.normalTime + d.duration;\n\n // If the provided duration extends into the future, we truncate the normalEnd to the\n // latest diabetes datum end and recalculate the duration\n const currentTime = Date.parse(moment.utc().toISOString());\n if (d.normalEnd > currentTime) {\n d.normalEnd = this.latestDiabetesDatumEnd;\n d.duration = d.normalEnd - d.normalTime;\n }\n } else if (isOverrideEvent && _.isFinite(this.latestDiabetesDatumEnd)) {\n // Ongoing pump settings overrides will not have a duration with which to determine\n // normalEnd, so we will set it to the latest diabetes datum end.\n d.normalEnd = this.latestDiabetesDatumEnd;\n d.duration = d.normalEnd - d.normalTime;\n }\n }\n\n if (d.type === 'fill') {\n const localTime = d.normalTime + d.displayOffset * MS_IN_MIN;\n const normalTimeISO = moment.utc(d.normalTime).toISOString();\n\n d.normalEnd = d.normalTime + d.duration;\n d.msPer24 = getMsPer24(d.normalTime, timezoneName);\n d.hourOfDay = d.msPer24 / MS_IN_HOUR;\n d.fillDate = moment.utc(localTime).toISOString().slice(0, 10);\n d.id = `fill_${normalTimeISO.replace(/[^\\w\\s]|_/g, '')}`;\n }\n\n this.setDataAnnotations(d);\n };\n\n normalizeDatumOutTime = d => {\n const { timezoneName } = this.timePrefs || {};\n\n if (timezoneName) {\n d.normalTime = d.time;\n d.displayOffset = -getOffset(d.time, timezoneName);\n } else {\n // TimezoneOffset is an optional attribute according to the Tidepool data model\n if (d.timezoneOffset != null && d.conversionOffset != null) {\n d.normalTime = d.time + (d.timezoneOffset * MS_IN_MIN + d.conversionOffset);\n } else {\n d.normalTime = !_.isEmpty(d.deviceTime) ? d.deviceTime : d.time;\n }\n\n // DisplayOffset always 0 when not timezoneAware\n d.displayOffset = 0;\n if (d.deviceTime && d.normalTime !== d.deviceTime) {\n d.warning = 'Combining `time` and `timezoneOffset` does not yield `deviceTime`.';\n }\n }\n };\n\n normalizeDatumBgUnits = (d, keysPaths = [], keys = ['value']) => {\n const units = _.get(this.bgPrefs, 'bgUnits');\n\n if (units && d.units) {\n d.units = _.isPlainObject(d.units) ? {\n ...d.units,\n bg: units,\n } : units;\n }\n\n // BG units are always stored in mmol/L in the backend, so we only need to convert to mg/dL\n if (units === MGDL_UNITS) {\n if (d.units) {\n d.units = _.isPlainObject(d.units) ? {\n ...d.units,\n bg: MGDL_UNITS,\n } : MGDL_UNITS;\n }\n\n const normalizeAtPath = path => {\n const pathValue = path ? _.get(d, path) : d;\n\n if (_.isPlainObject(pathValue) && _.keys(pathValue).length) {\n _.each(keys, (key) => {\n if (_.isNumber(pathValue[key])) {\n const setPath = _.reject([path, key], _.isEmpty);\n // in some cases, a path could be converted more than once, especially if a dosing decision\n // was shared with multple boluses due to proximity. We need to track which paths have\n // already been converted so we don't do it multiple times.\n if (d.bgNormalized?.[setPath.join('|')]) return;\n _.set(d, setPath, convertToMGDL(pathValue[key]));\n\n d.bgNormalized = {\n ...(d.bgNormalized || {}),\n [setPath.join('|')]: true,\n };\n } else if (path && _.isPlainObject(pathValue)) {\n // We sometimes need match the specified field keys within unknown object paths,\n // such as within Tandem pumpSettings datums, where the keys we want to target for\n // conversion are nested under object keys that match the user-provided schedule names\n // In these cases, we expect that a keyPath will be provided (via the `path` argumement),\n // which prevents accidentally changing the units of unintended paths.\n _.each(_.keys(pathValue), nestedKey => {\n let nestedValue = _.get(pathValue, [nestedKey]);\n\n if (_.isArray(nestedValue) || _.isPlainObject(nestedValue)) {\n // Wrap plain objects in array to be able to handle them the same as collections\n if (_.isPlainObject(nestedValue)) nestedValue = [nestedValue];\n\n // Check each collection item for matches that need conversion\n _.each(nestedValue, value => {\n if (_.get(value, [key])) {\n // we only recurse when a nested path object contains a matching key\n this.normalizeDatumBgUnits(value, [], [key]);\n }\n });\n }\n });\n }\n });\n } else if (_.isArray(pathValue)) {\n _.each(pathValue, (item) => {\n this.normalizeDatumBgUnits(item, [], keys);\n });\n }\n };\n\n if (keysPaths.length) {\n _.each(keysPaths, normalizeAtPath);\n } else {\n normalizeAtPath();\n }\n }\n };\n\n normalizeSuppressedBasal = d => {\n if (d.suppressed.deliveryType === 'temp' && !d.suppressed.rate) {\n if (d.suppressed.percent && d.suppressed.suppressed &&\n d.suppressed.suppressed.deliveryType === 'scheduled' &&\n d.suppressed.suppressed.rate >= 0) {\n d.suppressed.rate = d.suppressed.percent * d.suppressed.suppressed.rate;\n }\n }\n\n // A suppressed should share these attributes with its parent\n d.suppressed.duration = d.duration;\n d.suppressed.time = Date.parse(d.time);\n if (d.deviceTime) d.suppressed.deviceTime = Date.parse(d.deviceTime);\n\n // Recurse as needed\n if (d.suppressed.suppressed) {\n this.normalizeSuppressedBasal(d.suppressed);\n }\n };\n /* eslint-enable no-param-reassign */\n\n deduplicateCBGData = (data = []) => {\n const cbgData = this.sort.byTime(_.cloneDeep(data));\n\n // Iterate through the time-ordered list of glucose data. For each datum, we set a blackout\n // window for the time span it occupies - e.g. if a datum has a time of 14:30 and duration\n // of 5 min, then any OTHER datums occuring between 14:30 to 14:35 should be discarded.\n\n const OVERLAP_TOLERANCE = MS_IN_MIN / 6; // tolerate up to 10 seconds of overlap\n\n let blackoutUntil = 0; // end of current blackout window (unix timestamp)\n\n const output = [];\n\n for (let i = 0; i < cbgData.length; i++) {\n const currentRecord = cbgData[i];\n\n // If current record occured within the current blackout window, discard the record.\n if (currentRecord.time < blackoutUntil) continue; // eslint-disable-line\n\n // Otherwise, if the record is past the blackout window, we include the record.\n // Then, set a new blackout window based on the current record's time window\n output.push(currentRecord);\n blackoutUntil = currentRecord.time + currentRecord.sampleInterval - OVERLAP_TOLERANCE;\n }\n\n return output;\n };\n\n // memoize deduplicateCBGData and only recompute if first/last ids change or units change\n getDeduplicatedCBGData = _.memoize(\n this.deduplicateCBGData,\n data => {\n const firstDatumId = _.first(data)?.id;\n const lastDatumId = _.last(data)?.id;\n const units = this.bgPrefs?.bgUnits || 'unknown';\n\n return `${firstDatumId}_${lastDatumId}_${units}`;\n }\n );\n\n /* eslint-disable no-param-reassign */\n removeData = (predicate = null) => {\n if (predicate) {\n this.log('Removing data where', predicate);\n if (_.isPlainObject(predicate)) predicate = _.matches(predicate);\n this.clearFilters();\n this.data.remove(predicate);\n } else {\n this.log('Reinitializing');\n this.bolusToWizardIdMap = {};\n this.bolusDatumsByIdMap = {};\n this.wizardDatumsByIdMap = {};\n this.latestDatumByType = {};\n this.deviceUploadMap = {};\n this.clearMatchedDevices();\n this.clearDataAnnotations();\n delete this.bgSources;\n delete this.bgPrefs;\n delete this.timePrefs;\n delete this.latestPumpUpload;\n delete this.devices;\n delete this.excludedDevices;\n this.init();\n }\n };\n /* eslint-enable no-param-reassign */\n\n updateDatum = updatedDatum => {\n this.log('Updating Datum', updatedDatum);\n this.clearFilters();\n\n const existingDatum = this.filter.byId(updatedDatum.id).top(1)[0];\n const updateDatumClone = _.cloneDeep(updatedDatum);\n\n // Attempt to update existing datum with normalized and validated update datum\n this.normalizeDatumIn(updateDatumClone);\n if (existingDatum && !updateDatumClone.reject) _.assign(existingDatum, updateDatumClone);\n\n // Reset the byId filter\n this.dimension.byId.filterAll();\n\n // Update the byTime dimension in case the time field was changed\n this.buildByTimeDimension();\n\n const resultingDatum = _.cloneDeep(existingDatum);\n this.normalizeDatumOut(resultingDatum, '*');\n\n return {\n datum: resultingDatum,\n };\n };\n\n buildByDayOfWeekDimension = () => {\n this.dimension.byDayOfWeek = this.data.dimension(\n d => moment.utc(d[this.activeTimeField || 'time']).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).day()\n );\n };\n\n buildByDateDimension = () => {\n this.dimension.byDate = this.data.dimension(\n d => moment.utc(d[this.activeTimeField || 'time']).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).format('YYYY-MM-DD')\n );\n };\n\n buildByIdDimension = () => {\n this.dimension.byId = this.data.dimension(d => d.id);\n };\n\n buildBySubTypeDimension = () => {\n this.dimension.bySubType = this.data.dimension(d => d.subType || '');\n };\n\n buildByTimeDimension = () => {\n this.dimension.byTime = this.data.dimension(d => d[this.activeTimeField || 'time']);\n };\n\n buildByTypeDimension = () => {\n this.dimension.byType = this.data.dimension(d => d.type);\n };\n\n buildByDeviceIdDimension = () => {\n this.dimension.byDeviceId = this.data.dimension(d => d.deviceId || '');\n };\n\n buildBySampleIntervalDimension = () => {\n this.dimension.bySampleInterval = this.data.dimension(d => d.sampleInterval || '');\n };\n\n // N.B. May need to become smarter about creating and removing dimensions if we get above 8,\n // which would introduce additional performance overhead as per crossfilter docs.\n buildDimensions = () => {\n this.startTimer('buildDimensions');\n this.dimension = {};\n this.buildByDayOfWeekDimension();\n this.buildByDateDimension();\n this.buildByIdDimension();\n this.buildBySubTypeDimension();\n this.buildByTimeDimension();\n this.buildByTypeDimension();\n this.buildByDeviceIdDimension();\n this.buildBySampleIntervalDimension();\n this.endTimer('buildDimensions');\n };\n\n buildFilters = () => {\n this.startTimer('buildFilters');\n this.filter = {};\n\n this.filter.byActiveDays = activeDays => this.dimension.byDayOfWeek\n .filterFunction(d => _.includes(activeDays, d));\n\n this.filter.byEndpoints = endpoints => this.dimension.byTime.filterRange(endpoints);\n this.filter.byDeviceIds = (excludedDeviceIds = []) => this.dimension.byDeviceId.filterFunction(deviceId => !_.includes(excludedDeviceIds, deviceId));\n this.filter.byId = id => this.dimension.byId.filterExact(id);\n\n this.filter.bySampleIntervalRange = (min = this.defaultCgmSampleIntervalRange[0], max = this.defaultCgmSampleIntervalRange[1]) => {\n if (min === max) {\n return this.dimension.bySampleInterval.filterExact(min);\n } else {\n return this.dimension.bySampleInterval.filterRange([min, max]);\n }\n };\n\n this.filter.bySubType = subType => {\n this.activeSubType = subType;\n return this.dimension.bySubType.filterExact(subType);\n };\n\n this.filter.byType = type => {\n this.activeType = type;\n return this.dimension.byType.filterExact(type);\n };\n\n this.filter.byTypes = (types = []) => {\n delete this.activeType;\n return this.dimension.byType.filterFunction(type => _.includes(types, type));\n };\n\n this.endTimer('buildFilters');\n };\n\n buildSorts = () => {\n this.startTimer('buildSorts');\n this.sort = {};\n this.sort.byTime = array => {\n const timeField = _.get(this, 'timePrefs.timezoneAware') ? 'time' : 'deviceTime';\n return array.sort((a, b) => a[timeField] - b[timeField]);\n };\n this.endTimer('buildSorts');\n };\n\n initFilterChangeHandler = () => {\n this.data.onChange(eventType => {\n if (eventType === 'filtered' && this.matchDevices) {\n if (_.includes([\n 'basal',\n 'bolus',\n 'smbg',\n 'cbg',\n 'wizard',\n 'food',\n ], this.dimension.byType.currentFilter())) {\n _.each(this.dimension.byDeviceId.top(Infinity), datum => {\n const { deviceId, origin } = datum;\n\n if (deviceId) {\n const version = origin?.version || '0.0';\n const deviceName = origin?.name || deviceId;\n const deviceVersionId = `${deviceName}_${version}`;\n if (!this.matchedDevices[deviceId]) this.matchedDevices[deviceId] = {};\n if (!this.matchedDevices[deviceId][deviceVersionId]) this.matchedDevices[deviceId][deviceVersionId] = true;\n }\n });\n }\n }\n });\n };\n\n clearFilters = () => {\n this.startTimer('clearFilters');\n this.dimension.byTime.filterAll();\n this.dimension.byType.filterAll();\n this.dimension.bySubType.filterAll();\n this.dimension.byId.filterAll();\n this.dimension.byDayOfWeek.filterAll();\n this.dimension.byDeviceId.filterAll();\n this.dimension.bySampleInterval.filterAll();\n this.endTimer('clearFilters');\n };\n\n setBgSources = current => {\n this.startTimer('setBgSources');\n this.clearFilters();\n\n const bgSources = {\n cbg: this.filter.byType(CGM_DATA_KEY).top(Infinity).length > 0,\n smbg: this.filter.byType(BGM_DATA_KEY).top(Infinity).length > 0,\n current: _.includes([CGM_DATA_KEY, BGM_DATA_KEY], current) ? current : undefined,\n };\n\n if (!bgSources.current) {\n if (_.get(this, 'bgSources.current')) {\n bgSources.current = this.bgSources.current;\n } else if (bgSources.cbg) {\n bgSources.current = CGM_DATA_KEY;\n } else if (bgSources.smbg) {\n bgSources.current = BGM_DATA_KEY;\n }\n }\n\n this.bgSources = bgSources;\n this.endTimer('setBgSources');\n };\n\n setCgmSampleIntervalRange = (cgmSampleIntervalRange = this.defaultCgmSampleIntervalRange) => {\n this.cgmSampleIntervalRange = _.compact(cgmSampleIntervalRange);\n };\n\n setLatestPumpUpload = () => {\n this.startTimer('setLatestPumpUpload');\n this.clearFilters();\n\n const uploadData = this.sort.byTime(this.filter.byType('upload').top(Infinity));\n const latestPumpUpload = _.cloneDeep(getLatestPumpUpload(uploadData));\n\n if (latestPumpUpload) {\n const latestUploadSource = _.get(this.uploadMap[latestPumpUpload.uploadId], 'source', '').toLowerCase();\n const manufacturer = latestUploadSource === 'carelink' ? 'medtronic' : latestUploadSource;\n const deviceModel = _.get(latestPumpUpload, 'deviceModel', '');\n\n const latestPumpSettings = _.cloneDeep(this.latestDatumByType.pumpSettings);\n const latestPumpSettingsOrUpload = latestPumpSettings || latestPumpUpload;\n const pumpIsAutomatedBasalDevice = isAutomatedBasalDevice(manufacturer, latestPumpSettingsOrUpload, deviceModel);\n const pumpIsAutomatedBolusDevice = isAutomatedBolusDevice(manufacturer, latestPumpSettingsOrUpload);\n const pumpIsSettingsOverrideDevice = isSettingsOverrideDevice(manufacturer, latestPumpSettingsOrUpload);\n\n if (latestPumpSettings && pumpIsAutomatedBasalDevice) {\n const basalData = this.sort.byTime(this.filter.byType('basal').top(Infinity));\n latestPumpSettings.lastManualBasalSchedule = getLastManualBasalSchedule(basalData);\n }\n\n this.latestPumpUpload = {\n deviceModel,\n isAutomatedBasalDevice: pumpIsAutomatedBasalDevice,\n isAutomatedBolusDevice: pumpIsAutomatedBolusDevice,\n isSettingsOverrideDevice: pumpIsSettingsOverrideDevice,\n manufacturer,\n settings: latestPumpSettings,\n };\n }\n this.endTimer('setLatestPumpUpload');\n };\n\n setUploadMap = () => {\n this.startTimer('setUploadMap');\n this.clearFilters();\n const uploadData = this.filter.byType('upload').top(Infinity);\n const pumpSettingsData = this.filter.byType('pumpSettings').top(Infinity);\n this.uploadMap = {};\n\n _.each(uploadData, upload => {\n const pumpSettings = _.find(pumpSettingsData, { uploadId: upload.uploadId });\n let source = 'Unknown';\n\n if (_.get(upload, 'source')) {\n source = upload.source;\n } else if (_.isArray(upload.deviceManufacturers) && !_.isEmpty(upload.deviceManufacturers)) {\n if (upload.deviceManufacturers[0] === 'Medtronic' && _.filter(pumpSettingsData, {\n uploadId: upload.uploadId,\n source: 'carelink',\n }).length) {\n // Uploader does not specify `source` for CareLink uploads, so they incorrectly get set to\n // `Medtronic`, which should only be used for Medtronic Direct uploads. Check if\n // manufacturer equals Medtronic, then check pumpSettings array for uploads with that upload\n // ID and a source of `carelink`, then override appropriately.\n source = 'carelink';\n } else if (upload.deviceManufacturers[0] === 'Sequel' && _.filter(pumpSettingsData, {\n uploadId: upload.uploadId,\n model: 'twiist',\n }).length) {\n // Beginning with `client.version >= 3.0.0`, sequel twiist uploads include the deviceManufacturers\n // field, which contains `Sequel`. We treat these as `twiist` uploads for rendering purposes.\n source = TWIIST_LOOP.toLowerCase();\n } else {\n source = upload.deviceManufacturers[0];\n }\n } else if (isTidepoolLoop(pumpSettings)) {\n source = TIDEPOOL_LOOP.toLowerCase();\n } else if (isDIYLoop(pumpSettings)) {\n source = DIY_LOOP.toLowerCase();\n } else if (isTwiistLoop(upload)) {\n // We still need to check here for pre-3.0.0 uploads, which do not include the deviceManufacturers array\n source = TWIIST_LOOP.toLowerCase();\n }\n\n this.uploadMap[upload.uploadId] = {\n source,\n deviceSerialNumber: upload.deviceSerialNumber || upload.serialNumber || pumpSettings?.serialNumber || 'Unknown',\n };\n });\n this.endTimer('setUploadMap');\n };\n\n setIncompleteSuspends = () => {\n this.startTimer('setIncompleteSuspends');\n this.clearFilters();\n const deviceEventData = this.sort.byTime(this.filter.byType('deviceEvent').top(Infinity));\n this.incompleteSuspends = _.filter(\n deviceEventData,\n ({ annotations = [] }) => _.find(annotations, { code: 'status/incomplete-tuple' })\n );\n this.endTimer('setIncompleteSuspends');\n };\n\n setSize = () => {\n this.startTimer('setSize');\n this.size = this.data.size();\n this.endTimer('setSize');\n };\n\n setLatestDiabetesDatumEnd = () => {\n const latestDiabetesDatum = _.maxBy(\n _.filter(\n _.values(this.latestDatumByType),\n ({ type }) => _.includes(DIABETES_DATA_TYPES, type)\n ),\n d => (d.duration ? d.time + d.duration : d.time)\n );\n\n this.latestDiabetesDatumEnd = latestDiabetesDatum ? latestDiabetesDatum.time + (latestDiabetesDatum.duration || 0) : null;\n };\n\n setLatestTimeZone = () => {\n let latestTimeZone;\n const latestUpload = this.latestDatumByType.upload;\n const latestTimeChangeEvent = this.latestDatumByType.timeChange;\n\n const latestTimeZoneOffsetDatum = _.maxBy(\n _.filter(\n _.values(this.latestDatumByType || {}),\n ({ timezoneOffset, type }) => _.includes([...DIABETES_DATA_TYPES, 'dosingDecision'], type) && _.isFinite(timezoneOffset)\n ),\n 'time'\n );\n\n const createLatestTimeZone = (name, d, type) => {\n try {\n sundial.checkTimezoneName(name);\n const localizedTime = moment.utc(d.time).tz(name).format();\n latestTimeZone = { name, type: d.type, time: d.time };\n latestTimeZone.message = t('Defaulting to display in the timezone of most recent {{type}} at {{localizedTime}}', { localizedTime, type: type || d.type });\n } catch (e) {\n this.log('Invalid latest time zone:', name);\n }\n };\n\n if (latestTimeZoneOffsetDatum) {\n let { timezone } = latestTimeZoneOffsetDatum;\n\n if (!timezone) {\n // We calculate the nearest 'Etc/GMT' timezone from the timezone offset of the latest diabetes datum.\n // GMT offsets signs in Etc/GMT timezone names are reversed from the actual offset\n const offsetSign = Math.sign(latestTimeZoneOffsetDatum.timezoneOffset) === -1 ? '+' : '-';\n const offsetDuration = moment.duration(Math.abs(latestTimeZoneOffsetDatum.timezoneOffset), 'minutes');\n let offsetHours = offsetDuration.hours();\n const offsetMinutes = offsetDuration.minutes();\n if (offsetMinutes >= 30) offsetHours += 1;\n timezone = `Etc/GMT${offsetSign}${offsetHours}`;\n }\n\n createLatestTimeZone(timezone, latestTimeZoneOffsetDatum);\n\n // If the timeone on the latest upload record at the time of the latest diabetes datum has the\n // same UTC offset, we use that, since it will also have DST changeover info available.\n // We will also use the latest upload timezone if it's more recent than the diabetes datum.\n if (!_.isEmpty(latestUpload?.timezone)) {\n const uploadTimezoneOffsetAtLatestDiabetesTime = moment.utc(latestTimeZoneOffsetDatum.time).tz(latestUpload.timezone).utcOffset();\n\n if (\n uploadTimezoneOffsetAtLatestDiabetesTime === latestTimeZoneOffsetDatum.timezoneOffset ||\n latestUpload.time >= latestTimeZoneOffsetDatum.time\n ) {\n createLatestTimeZone(latestUpload.timezone, latestUpload);\n }\n }\n } else if (latestTimeChangeEvent?.to?.timeZoneName) {\n // Tidepool Mobile data only sends timezone info on `timeChange` device events, so for\n // accounts with only TM data, this is our best bet\n createLatestTimeZone(latestTimeChangeEvent.to.timeZoneName, latestTimeChangeEvent, 'time change');\n } else if (!_.isEmpty(latestUpload?.timezone)) {\n // Fallback to latest upload timezone if there is no diabetes data with timezone offsets\n createLatestTimeZone(latestUpload.timezone, latestUpload);\n }\n\n this.latestTimeZone = latestTimeZone;\n };\n\n /* eslint-disable no-param-reassign */\n setDevices = () => {\n this.startTimer('setDevices');\n const uploadsById = _.keyBy(this.sort.byTime(this.filter.byType('upload').top(Infinity)), 'uploadId');\n\n this.devices = _.reduce(this.deviceUploadMap, (result, value, key) => {\n const upload = uploadsById[value];\n let device = { id: key };\n\n if (upload) {\n const isContinuous = _.get(upload, 'dataSetType') === 'continuous';\n const deviceManufacturer = _.get(upload, 'deviceManufacturers.0', '');\n const deviceModel = _.get(upload, 'deviceModel', '');\n let label = key;\n\n if (deviceManufacturer || deviceModel) {\n if (deviceManufacturer === 'Dexcom' && isContinuous) {\n label = t('Dexcom API');\n } else if (deviceManufacturer === 'Abbott' && isContinuous) {\n label = t('FreeStyle Libre (from LibreView)');\n } else if (deviceManufacturer === 'Sequel' && isContinuous) {\n label = t('twiist');\n } else {\n label = _.reject([deviceManufacturer, deviceModel], _.isEmpty).join(' ');\n }\n }\n\n if (key.indexOf('tandemCIQ') === 0) label = [label, `(${t('Control-IQ')})`].join(' ');\n\n device = {\n bgm: _.includes(upload.deviceTags, 'bgm'),\n cgm: _.includes(upload.deviceTags, 'cgm'),\n oneMinCgmSampleInterval: isOneMinCGMSampleIntervalDevice(upload),\n id: key,\n label,\n pump: _.includes(upload.deviceTags, 'insulin-pump'),\n serialNumber: upload.deviceSerialNumber,\n };\n }\n\n result.push(device);\n return result;\n }, []);\n\n const allDeviceIds = _.keys(this.deviceUploadMap);\n const excludedDevices = this.excludedDevices || [];\n\n _.each(this.devices, device => {\n if (device.id.indexOf('tandemCIQ') === 0) {\n // Exclude pre-control-iq tandem uploads by default if we have data from the same device\n // from a version of uploader supports control-iq data. Otherwise, we have duplicate data.\n const preCIQDeviceID = device.id.replace('tandemCIQ', 'tandem');\n if (_.includes(allDeviceIds, preCIQDeviceID)) excludedDevices.push(preCIQDeviceID);\n }\n });\n\n this.setExcludedDevices(_.uniq(excludedDevices));\n\n this.endTimer('setDevices');\n };\n /* eslint-enable no-param-reassign */\n\n setDataAnnotations = d => {\n if (this.trackDataAnnotations && d.annotations?.length) {\n // Set any new annotation by code to the dataAnnotations metaData map\n _.each(d.annotations, (annotation) => {\n if (!this.dataAnnotations[annotation.code]) this.dataAnnotations[annotation.code] = annotation;\n });\n }\n };\n\n setMetaData = () => {\n this.startTimer('setMetaData');\n this.setSize();\n if (!this.bgPrefs) this.setBgPrefs();\n this.setBgSources();\n if (!this.timePrefs) this.setTimePrefs();\n this.setEndpoints();\n this.setActiveDays();\n this.setTypes();\n this.setUploadMap();\n this.setDevices();\n this.setLatestPumpUpload();\n this.setIncompleteSuspends();\n this.setLatestDiabetesDatumEnd();\n this.setLatestTimeZone();\n this.endTimer('setMetaData');\n };\n\n setEndpoints = (endpoints, nextDays = 0, prevDays = 0) => {\n this.startTimer('setEndpoints');\n this.endpoints = {\n current: { range: [0, Infinity] },\n };\n\n if (endpoints) {\n const { timezoneName } = this.timePrefs;\n const days = moment.utc(endpoints[1]).diff(moment.utc(endpoints[0])) / MS_IN_DAY;\n\n this.endpoints.current = {\n range: _.map(endpoints, e => moment.utc(e).valueOf()),\n days,\n activeDays: days,\n };\n\n if (nextDays > 0) {\n this.endpoints.next = {\n range: [\n this.endpoints.current.range[1],\n moment.utc(endpoints[1]).add(nextDays, 'days').valueOf(),\n ],\n days: nextDays,\n activeDays: nextDays,\n };\n\n if (timezoneName) {\n const nextStartIsDST = moment.utc(this.endpoints.next.range[0]).tz(timezoneName).isDST();\n const nextEndIsDST = moment.utc(this.endpoints.next.range[1]).tz(timezoneName).isDST();\n const nextOverlapsDSTChangeover = nextStartIsDST !== nextEndIsDST;\n\n if (nextOverlapsDSTChangeover) {\n const offset = nextEndIsDST ? -MS_IN_HOUR : MS_IN_HOUR;\n this.endpoints.next.range[1] = this.endpoints.next.range[1] + offset;\n }\n }\n }\n\n if (prevDays > 0) {\n this.endpoints.prev = {\n range: [\n moment.utc(endpoints[0]).subtract(prevDays, 'days').valueOf(),\n this.endpoints.current.range[0],\n ],\n days: prevDays,\n activeDays: prevDays,\n };\n\n if (timezoneName) {\n const prevStartIsDST = moment.utc(this.endpoints.prev.range[0]).tz(timezoneName).isDST();\n const prevEndIsDST = moment.utc(this.endpoints.prev.range[1]).tz(timezoneName).isDST();\n const prevOverlapsDSTChangeover = prevStartIsDST !== prevEndIsDST;\n\n if (prevOverlapsDSTChangeover) {\n const offset = prevStartIsDST ? -MS_IN_HOUR : MS_IN_HOUR;\n this.endpoints.prev.range[0] = this.endpoints.prev.range[0] + offset;\n }\n }\n }\n }\n this.endTimer('setEndpoints');\n };\n\n setActiveDays = activeDays => {\n this.startTimer('setActiveDays');\n this.activeDays = activeDays || [0, 1, 2, 3, 4, 5, 6];\n\n _.each(_.keys(this.endpoints), range => {\n if (this.endpoints[range].days) {\n this.log('this.endpoints[range].days', this.endpoints[range].days);\n this.endpoints[range].activeDays = _.filter(\n _.reduce([\n this.endpoints[range].range[0],\n ...(new Array(Math.round(this.endpoints[range].days) - 1)),\n ], (acc, date, index) => {\n let day;\n if (index === 0) {\n day = moment.utc(date).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).day();\n } else {\n const nextDay = acc[index - 1] + 1;\n day = nextDay > 6 ? nextDay - 7 : nextDay;\n }\n acc.push(day);\n return acc;\n }, []),\n dayOfWeek => _.includes(this.activeDays, dayOfWeek)\n ).length;\n }\n });\n this.endTimer('setActiveDays');\n };\n\n setStats = (stats = []) => {\n this.stats = _.isString(stats) ? _.map(stats.split(','), _.trim) : stats;\n };\n\n setTypes = types => {\n this.startTimer('setTypes');\n this.types = _.isArray(types) ? types : [];\n\n if (_.isPlainObject(types)) {\n this.types = _.map(types, (value, type) => ({\n type,\n ...value,\n }));\n } else if (types === '*') {\n const groupByType = this.dimension.byType.group();\n\n this.types = _.map(groupByType.all(), group => ({\n type: group.key,\n select: '*',\n sort: `${this.activeTimeField},asc`,\n }));\n\n groupByType.dispose();\n }\n\n if (this.types.length) this.queryDataCount += 1;\n this.endTimer('setTypes');\n };\n\n setTimePrefs = (timePrefs = {}) => {\n this.startTimer('setTimePrefs');\n const {\n timezoneAware = false,\n } = timePrefs;\n\n let timezoneName = timePrefs.timezoneName || undefined;\n\n if (timezoneAware) {\n timezoneName = getTimezoneFromTimePrefs(timePrefs);\n }\n\n const prevTimezoneName = _.get(this, 'timePrefs.timezoneName');\n const timezoneNameChanged = timezoneName !== prevTimezoneName;\n\n const prevTimezoneAware = _.get(this, 'timePrefs.timezoneAware');\n const timezoneAwareChanged = timezoneAware !== prevTimezoneAware;\n\n this.timePrefs = {\n timezoneAware,\n timezoneName,\n };\n\n const prevActiveTimeField = this.activeTimeField;\n this.activeTimeField = timezoneAware ? 'time' : 'deviceTime';\n const activeTimeFieldChanged = this.activeTimeField !== prevActiveTimeField;\n\n // Recreate the byTime, byDayOfWeek and byDayOfYear dimensions as needed\n // to index on the proper time field.\n const dimensionUpdates = {\n byDate: timezoneNameChanged || timezoneAwareChanged || activeTimeFieldChanged,\n byDayOfWeek: timezoneNameChanged || timezoneAwareChanged || activeTimeFieldChanged,\n byTime: timezoneAwareChanged || activeTimeFieldChanged,\n };\n\n if (dimensionUpdates.byDate) this.buildByDateDimension();\n if (dimensionUpdates.byDayOfWeek) this.buildByDayOfWeekDimension();\n if (dimensionUpdates.byTime) this.buildByTimeDimension();\n this.endTimer('setTimePrefs');\n };\n\n setBgPrefs = (bgPrefs = {}) => {\n this.startTimer('setBgPrefs');\n const {\n bgBounds = DEFAULT_BG_BOUNDS[MGDL_UNITS],\n bgClasses = {},\n bgUnits = MGDL_UNITS,\n ...rest\n } = bgPrefs;\n\n // bgClasses required for legacy tideline charts until we deprecate them\n _.defaults(bgClasses, {\n 'very-low': { boundary: DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold },\n low: { boundary: DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound },\n target: { boundary: DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound },\n high: { boundary: DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold },\n });\n\n this.bgPrefs = {\n bgBounds,\n bgClasses,\n bgUnits,\n ...rest,\n };\n this.endTimer('setBgPrefs');\n };\n\n setReturnRawData = (returnRaw = false) => {\n this.returnRawData = returnRaw;\n };\n\n setExcludedDevices = (deviceIds = this.excludedDevices) => {\n this.startTimer('setExcludedDevices');\n this.excludedDevices = deviceIds;\n this.endTimer('setExcludedDevices');\n };\n\n clearMatchedDevices = () => {\n this.matchedDevices = {};\n };\n\n clearDataAnnotations = () => {\n this.dataAnnotations = {};\n };\n\n query = (query = {}) => {\n this.log('Query', query);\n\n this.startTimer('query total');\n const {\n activeDays,\n aggregationsByDate,\n bgPrefs,\n bgSource,\n cgmSampleIntervalRange,\n endpoints,\n excludedDevices,\n fillData,\n metaData,\n nextDays,\n prevDays,\n raw,\n stats,\n timePrefs,\n types,\n } = query;\n\n // N.B. Must ensure that we get the desired endpoints in UTC time so that when we display in\n // the desired time zone, we have all the data.\n\n // Clear all previous filters\n this.clearFilters();\n\n // Clear matchedDevices metaData if the current endpoints change\n const activeDaysChanged = activeDays && !_.isEqual(activeDays, this.activeDays);\n const bgSourceChanged = bgSource !== this.bgSources?.current;\n const endpointsChanged = endpoints && !_.isEqual(endpoints, this.endpoints?.current?.range);\n const excludedDevicesChanged = excludedDevices && !_.isEqual(excludedDevices, this.excludedDevices);\n\n if (activeDaysChanged || bgSourceChanged || endpointsChanged || excludedDevicesChanged) {\n this.clearMatchedDevices();\n }\n\n this.setReturnRawData(raw);\n this.setBgSources(bgSource);\n this.setCgmSampleIntervalRange(cgmSampleIntervalRange);\n this.setTypes(types);\n this.setStats(stats);\n if (bgPrefs) this.setBgPrefs(bgPrefs);\n if (timePrefs) this.setTimePrefs(timePrefs);\n this.setEndpoints(endpoints, nextDays, prevDays);\n this.setActiveDays(activeDays);\n this.setExcludedDevices(excludedDevices);\n\n const data = {};\n\n _.each(this.endpoints, (rangeEndpoints, rangeKey) => {\n this.activeRange = rangeKey;\n this.activeEndpoints = rangeEndpoints;\n this.matchDevices = false;\n this.trackDataAnnotations = false;\n data[rangeKey] = {};\n\n // Filter the data set by date range\n this.filter.byEndpoints(this.activeEndpoints.range);\n\n // Filter out any inactive days of the week\n this.filter.byActiveDays(this.activeDays);\n\n // Filter out any excluded devices\n this.filter.byDeviceIds(this.excludedDevices);\n\n if (rangeKey === 'current') {\n this.matchDevices = true;\n const requestedMetaData = _.isString(metaData) ? _.map(metaData.split(','), _.trim) : metaData;\n const dataAnnotationsRequested = _.includes(requestedMetaData, 'dataAnnotations');\n\n // We generate annotations metaData only when typed data is requested, or certain stats are\n // being requested that may be inaccurate when certain annotations are present in the data.\n this.trackDataAnnotations = dataAnnotationsRequested && (\n this.types.length || _.intersection(this.stats, [commonStats.sensorUsage, commonStats.timeInRange]).length\n );\n\n // Clear previous dataAnnotations metaData so we can track annotations for only the current data\n if (this.trackDataAnnotations) this.clearDataAnnotations();\n\n // Generate the aggregations for current range\n if (aggregationsByDate) {\n data[rangeKey].aggregationsByDate = this.getAggregationsByDate(aggregationsByDate);\n }\n\n // Generate the stats for current range\n if (this.stats.length) {\n data[rangeKey].stats = this.getStats(this.stats);\n }\n }\n\n data[rangeKey].endpoints = this.activeEndpoints;\n\n // Generate the requested data\n if (this.types.length) {\n data[rangeKey].data = this.getTypeData(this.types);\n }\n\n // Generate the requested fillData\n if (fillData) {\n data[rangeKey].data = data[rangeKey].data || {};\n data[rangeKey].data.fill = this.getFillData(this.activeEndpoints.range, fillData);\n }\n });\n this.endTimer('query total');\n\n const result = {\n data,\n timePrefs: this.timePrefs,\n bgPrefs: this.bgPrefs,\n query,\n };\n\n if (metaData) result.metaData = this.getMetaData(metaData);\n\n // Always reset `returnRawData`, `matchDevices` and `trackDataAnnotations` to `false` after each query\n this.setReturnRawData(false);\n this.matchDevices = false;\n this.trackDataAnnotations = false;\n\n this.log('Result', result);\n\n return result;\n };\n\n getStats = stats => {\n this.startTimer('generate stats');\n const generatedStats = {};\n\n this.statUtil = new StatUtil(this);\n _.each(stats, stat => {\n const method = statFetchMethods[stat];\n // Reset the byType and bySampleInterval filters prior to each stat calculation.\n // Stats that need to filter by these will do so internally within the statUtil.\n this.dimension.byType.filterAll();\n this.dimension.bySampleInterval.filterAll();\n\n if (_.isFunction(this.statUtil[method])) {\n this.startTimer(`stat | ${stat}`);\n generatedStats[stat] = this.statUtil[method]();\n this.endTimer(`stat | ${stat}`);\n }\n });\n delete this.statUtil;\n this.endTimer('generate stats');\n return generatedStats;\n };\n\n getAggregationsByDate = aggregationsByDate => {\n this.startTimer('generate aggregationsByDate');\n const selectedAggregationsByDate = _.isString(aggregationsByDate) ? _.map(aggregationsByDate.split(','), _.trim) : aggregationsByDate;\n const generatedAggregationsByDate = {};\n const groupByDate = this.dimension.byDate.group();\n\n const aggregationMethods = {\n basals: 'aggregateBasals',\n boluses: 'aggregateBoluses',\n fingersticks: 'aggregateFingersticks',\n siteChanges: 'aggregateSiteChanges',\n dataByDate: 'aggregateDataByDate',\n statsByDate: 'aggregateStatsByDate',\n };\n\n this.aggregationUtil = new AggregationUtil(this);\n\n _.each(selectedAggregationsByDate, aggregationType => {\n const method = aggregationMethods[aggregationType];\n\n if (_.isFunction(this.aggregationUtil[method])) {\n this.startTimer(`aggregation | ${aggregationType}`);\n generatedAggregationsByDate[aggregationType] = this.aggregationUtil[method](groupByDate);\n this.endTimer(`aggregation | ${aggregationType}`);\n }\n });\n\n groupByDate.dispose();\n delete this.aggregationUtil;\n\n this.endTimer('generate aggregationsByDate');\n return generatedAggregationsByDate;\n };\n\n getFillData = (endpoints, opts = {}) => {\n this.startTimer('generate fillData');\n const timezone = _.get(this, 'timePrefs.timezoneName', 'UTC');\n const days = this.activeEndpoints.days;\n const fillHours = 3;\n const fillBinCount = (24 / fillHours) * days;\n const duration = fillHours * MS_IN_HOUR;\n\n const start = moment.utc(endpoints[0]).tz(timezone).startOf('day').valueOf();\n\n const hourlyStarts = [start];\n for (let index = 1; index < 24 * days; index++) {\n hourlyStarts.push(hourlyStarts[index - 1] + MS_IN_HOUR);\n }\n\n const fillData = [];\n let prevFill = null;\n\n _.each(hourlyStarts, startTime => {\n const fill = {\n duration,\n time: startTime,\n type: 'fill',\n };\n this.normalizeDatumOut(fill);\n\n if (fill.hourOfDay % fillHours === 0) {\n if (opts.adjustForDSTChanges) {\n if (prevFill && fill.normalTime !== prevFill.normalEnd) {\n if (fill.normalTime > prevFill.normalEnd) {\n // Adjust for Fall Back gap\n prevFill.normalEnd = fill.normalTime;\n } else if (fill.normalTime < prevFill.normalEnd) {\n // Adjust for Spring Forward overlap\n prevFill.normalEnd = fill.normalTime;\n }\n\n fillData.splice(-1, 1, prevFill);\n }\n }\n\n if (fillData.length < fillBinCount) fillData.push(fill);\n prevFill = fill;\n }\n });\n\n this.endTimer('generate fillData');\n return fillData;\n };\n\n getMetaData = metaData => {\n this.startTimer('generate metaData');\n const allowedMetaData = [\n 'bgSources',\n 'latestDatumByType',\n 'latestPumpUpload',\n 'latestTimeZone',\n 'patientId',\n 'size',\n 'devices',\n 'excludedDevices',\n 'matchedDevices',\n 'dataAnnotations',\n 'queryDataCount',\n ];\n\n const requestedMetaData = _.isString(metaData) ? _.map(metaData.split(','), _.trim) : metaData;\n\n const selectedMetaData = _.cloneDeep(_.pick(\n this,\n _.intersection(allowedMetaData, requestedMetaData)\n ));\n\n _.each(selectedMetaData.latestDatumByType, d => this.normalizeDatumOut(d, ['*']));\n\n if (_.get(selectedMetaData, 'latestPumpUpload.settings')) {\n this.normalizeDatumOut(selectedMetaData.latestPumpUpload.settings, ['*']);\n }\n\n this.endTimer('generate metaData');\n return selectedMetaData;\n };\n\n getPreviousSiteChangeDatums = datum => {\n const prevFilters = {\n byType: this.activeType,\n bySubType: this.activeSubType,\n };\n\n // We need to ensure all the days of the week are active to ensure we get all siteChanges\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter catch all previous datums\n this.filter.byEndpoints([\n 0,\n datum[this.activeTimeField],\n ]);\n\n this.filter.byType('deviceEvent');\n\n // Fetch previous prime and reservoirChange data\n const previousPrimeData = this.sort\n .byTime(_.cloneDeep(this.filter.bySubType('prime').top(Infinity)))\n .reverse();\n\n const previousReservoirChangeData = this.sort\n .byTime(_.cloneDeep(this.filter.bySubType('reservoirChange').top(Infinity)))\n .reverse();\n\n const previousSiteChangeDatums = {\n cannulaPrime: _.find(previousPrimeData, { primeTarget: 'cannula' }),\n tubingPrime: _.find(previousPrimeData, { primeTarget: 'tubing' }),\n reservoirChange: previousReservoirChangeData[0],\n };\n\n // Reset the endpoints, activeDays, type, and subType filters to the back to what they were\n this.filter.byActiveDays(this.activeDays);\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byType(prevFilters.byType);\n this.filter.bySubType(prevFilters.bySubType);\n\n return previousSiteChangeDatums;\n };\n\n getTypeData = types => {\n const generatedData = {};\n\n _.each(types, ({ type, select = '*', sort = {} }) => {\n const fields = _.isString(select) ? _.map(select.split(','), _.trim) : select;\n const returnAllFields = fields[0] === '*';\n\n // Clear any previous byType and bySampleInterval filters\n this.dimension.byType.filterAll();\n this.dimension.bySampleInterval.filterAll();\n\n // Filter cgm data by the currently-set sample interval range.\n if (type === CGM_DATA_KEY) {\n this.filter.bySampleIntervalRange(...(this.cgmSampleIntervalRange || this.defaultCgmSampleIntervalRange));\n }\n\n // Filter data by the requested type\n let typeData = _.cloneDeep(this.filter.byType(type).top(Infinity));\n _.each(typeData, d => this.normalizeDatumOut(d, fields));\n\n // Normalize data\n this.startTimer(`normalize | ${type} | ${this.activeRange}`);\n if (_.includes(['basal', 'deviceEvent'], type)) {\n typeData = this.sort.byTime(typeData);\n\n const trimOverlappingStart = () => {\n // Normalize the data data and add any datums overlapping the start\n let data = _.cloneDeep(typeData || []);\n if (type === 'deviceEvent') data = _.filter(data, { subType: 'pumpSettingsOverride' });\n\n const initalDataLength = data.length;\n\n data = type === 'deviceEvent'\n ? this.addPumpSettingsOverrideOverlappingStart(data, fields)\n : this.addBasalOverlappingStart(data, fields);\n\n if (data.length > initalDataLength) typeData.unshift(data[0]);\n\n // Trim the first datum if it overlaps the start\n if (typeData.length && _.isFinite(typeData[0].duration)) {\n typeData[0].normalTime = _.max([\n typeData[0].normalTime,\n this.activeEndpoints.range[0],\n ]);\n }\n };\n\n const trimOverlappingEnd = () => {\n // Trim last datum if it has a duration that overlaps the range end\n const indexOfLastDurationDatum = _.findLastIndex(typeData, d => _.isFinite(d.duration));\n if (indexOfLastDurationDatum > -1) {\n typeData[indexOfLastDurationDatum].normalEnd = _.min([\n typeData[indexOfLastDurationDatum].normalEnd,\n this.activeEndpoints.range[1],\n ]);\n }\n };\n\n if (this.activeRange === 'prev') {\n trimOverlappingStart();\n } else if (this.activeRange === 'next') {\n trimOverlappingEnd();\n } else if (this.activeRange === 'current') {\n if (!this.endpoints.prev) trimOverlappingStart();\n if (!this.endpoints.next) trimOverlappingEnd();\n }\n }\n this.endTimer(`normalize | ${type} | ${this.activeRange}`);\n\n // Sort data\n this.startTimer(`sort | ${type} | ${this.activeRange}`);\n let sortOpts = sort;\n if (_.isString(sortOpts)) {\n const sortArray = _.map(sort.split(','), _.trim);\n sortOpts = {\n field: sortArray[0],\n order: sortArray[1],\n };\n }\n\n if (sortOpts.field) {\n typeData = _.sortBy(typeData, [sortOpts.field]);\n }\n\n if (sortOpts.order === 'desc') typeData.reverse();\n this.endTimer(`sort | ${type} | ${this.activeRange}`);\n\n // Pick selected fields\n this.startTimer(`select fields | ${type} | ${this.activeRange}`);\n if (!returnAllFields) typeData = _.map(typeData, d => _.pick(d, fields));\n this.endTimer(`select fields | ${type} | ${this.activeRange}`);\n\n generatedData[type] = typeData;\n });\n\n return generatedData;\n };\n\n addBasalOverlappingStart = (basalData = [], normalizeFields) => {\n _.each(basalData, d => {\n if (!d.normalTime) this.normalizeDatumOut(d, normalizeFields);\n });\n\n // We need to ensure all the days of the week are active to ensure we get all basals\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter get all previous basal datums\n this.filter.byEndpoints([\n 0,\n this.activeEndpoints.range[0],\n ]);\n\n // Fetch previous basal datum\n const previousBasalDatum = this.sort\n .byTime(this.filter.byType('basal').top(Infinity))\n .reverse()[0];\n\n if (previousBasalDatum) {\n this.normalizeDatumOut(previousBasalDatum, normalizeFields);\n\n // Add to top of basal data array if it overlaps the start endpoint\n const datumOverlapsStart = previousBasalDatum.normalTime < this.activeEndpoints.range[0]\n && previousBasalDatum.normalEnd > this.activeEndpoints.range[0];\n\n if (datumOverlapsStart) {\n basalData.unshift(previousBasalDatum);\n }\n }\n\n // Reset the endpoints and activeDays filters to the back to what they were\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byActiveDays(this.activeDays);\n\n return basalData;\n };\n\n addPumpSettingsOverrideOverlappingStart = (pumpSettingsOverrideData = [], normalizeFields) => {\n _.each(pumpSettingsOverrideData, d => {\n if (!d.normalTime) this.normalizeDatumOut(d, normalizeFields);\n });\n\n // We need to ensure all the days of the week are active to ensure we get all override datums\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter get all previous override datums\n this.filter.byEndpoints([\n 0,\n this.activeEndpoints.range[0],\n ]);\n\n // Fetch previous override datum\n const previousPumpSettingsOverrideDatum = _.cloneDeep(_.filter(\n this.sort.byTime(this.filter.byType('deviceEvent').top(Infinity)),\n { subType: 'pumpSettingsOverride' }\n ).reverse()[0]);\n\n if (previousPumpSettingsOverrideDatum) {\n this.normalizeDatumOut(previousPumpSettingsOverrideDatum, normalizeFields);\n\n\n // Add to top of pumpSettingsOverride data array if it overlaps the start endpoint\n const datumOverlapsStart = previousPumpSettingsOverrideDatum.normalTime < this.activeEndpoints.range[0]\n && previousPumpSettingsOverrideDatum.normalEnd > this.activeEndpoints.range[0];\n\n if (datumOverlapsStart) {\n pumpSettingsOverrideData.unshift(previousPumpSettingsOverrideDatum);\n }\n }\n\n // Reset the endpoints and activeDays filters to the back to what they were\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byActiveDays(this.activeDays);\n\n return pumpSettingsOverrideData;\n };\n}\n\nexport default DataUtil;\n","import _ from 'lodash';\nimport bows from 'bows';\nimport moment from 'moment-timezone';\n\nimport { getTotalBasalFromEndpoints, getBasalGroupDurationsFromEndpoints } from './basal';\nimport { getTotalBolus } from './bolus';\nimport { classifyBgValue } from './bloodglucose';\nimport { BGM_DATA_KEY, CGM_DATA_KEY, MGDL_UNITS, MGDL_PER_MMOLL, MS_IN_DAY, MS_IN_MIN } from './constants';\nimport { formatLocalizedFromUTC } from './datetime';\n\n/* eslint-disable lodash/prefer-lodash-method, no-underscore-dangle, no-param-reassign */\n\nexport class StatUtil {\n /**\n * @param {Object} dataUtil - a DataUtil instance\n */\n constructor(dataUtil) {\n this.log = bows('StatUtil');\n this.init(dataUtil);\n }\n\n init = (dataUtil) => {\n this.dataUtil = dataUtil;\n this.bgBounds = _.get(dataUtil, 'bgPrefs.bgBounds');\n this.bgUnits = _.get(dataUtil, 'bgPrefs.bgUnits');\n this.bgSource = _.get(dataUtil, 'bgSources.current', BGM_DATA_KEY);\n this.activeDays = dataUtil.activeEndpoints.activeDays;\n this.endpoints = dataUtil.activeEndpoints.range;\n this.timePrefs = _.get(dataUtil, 'timePrefs');\n\n this.log('activeDays', this.activeDays);\n this.log('bgSource', this.bgSource);\n this.log('bgPrefs', { bgBounds: this.bgBounds, bgUnits: this.bgUnits });\n };\n\n filterCBGDataByDefaultSampleInterval = () => {\n this.dataUtil.filter.bySampleIntervalRange(...this.dataUtil.defaultCgmSampleIntervalRange);\n };\n\n getAverageGlucoseData = (returnBgData = false) => {\n if (this.bgSource === CGM_DATA_KEY) this.filterCBGDataByDefaultSampleInterval();\n\n let bgData = _.cloneDeep(this.dataUtil.filter.byType(this.bgSource).top(Infinity));\n\n if (this.bgSource === CGM_DATA_KEY) {\n bgData = this.dataUtil.getDeduplicatedCBGData(bgData);\n }\n\n _.each(bgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const data = {\n averageGlucose: _.meanBy(bgData, 'value'),\n total: bgData.length,\n };\n\n if (returnBgData) {\n data.bgData = bgData;\n }\n\n return data;\n };\n\n getBgExtentsData = () => {\n if (this.bgSource === CGM_DATA_KEY) this.filterCBGDataByDefaultSampleInterval();\n\n let bgData = _.cloneDeep(this.dataUtil.filter.byType(this.bgSource).top(Infinity));\n\n if (this.bgSource === CGM_DATA_KEY) {\n bgData = this.dataUtil.getDeduplicatedCBGData(bgData);\n }\n\n _.each(bgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const rawBgData = this.dataUtil.sort.byTime(_.cloneDeep(bgData));\n const newestDatum = _.cloneDeep(_.last(rawBgData));\n const oldestDatum = _.cloneDeep(_.first(rawBgData));\n if (newestDatum) this.dataUtil.normalizeDatumOut(newestDatum, ['msPer24', 'localDate']);\n if (oldestDatum) this.dataUtil.normalizeDatumOut(oldestDatum, ['msPer24', 'localDate']);\n\n let bgDaysWorn;\n\n if (rawBgData.length < 2) {\n bgDaysWorn = rawBgData.length;\n } else {\n bgDaysWorn = moment.utc(newestDatum?.localDate).diff(moment.utc(oldestDatum?.localDate), 'days', true) + 1;\n }\n\n const data = {\n bgMax: _.get(_.maxBy(bgData, 'value'), 'value', null),\n bgMin: _.get(_.minBy(bgData, 'value'), 'value', null),\n bgDaysWorn,\n newestDatum,\n oldestDatum,\n };\n\n return data;\n };\n\n getBasalBolusData = () => {\n const bolusData = this.dataUtil.filter.byType('bolus').top(Infinity);\n const rawBasalData = this.dataUtil.sort.byTime(this.dataUtil.filter.byType('basal').top(Infinity));\n const basalData = this.dataUtil.addBasalOverlappingStart(_.cloneDeep(rawBasalData));\n\n // Create a list of all dates for which we have at least one datum\n const uniqueDatumDates = new Set([\n ...bolusData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ...rawBasalData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ]);\n\n const activeDaysWithInsulinData = uniqueDatumDates.size;\n\n const basalBolusData = {\n basal: basalData.length\n ? parseFloat(getTotalBasalFromEndpoints(basalData, this.endpoints))\n : NaN,\n bolus: bolusData.length ? getTotalBolus(bolusData) : NaN,\n };\n\n if (this.activeDays > 1 && activeDaysWithInsulinData > 1) {\n basalBolusData.basal = basalBolusData.basal / activeDaysWithInsulinData;\n basalBolusData.bolus = basalBolusData.bolus / activeDaysWithInsulinData;\n }\n\n return basalBolusData;\n };\n\n getCarbsData = () => {\n const wizardData = this.dataUtil.filter.byType('wizard').top(Infinity);\n const foodData = this.dataUtil.filter.byType('food').top(Infinity);\n\n // Create a list of all dates for which we have at least one datum\n const uniqueDatumDates = new Set([\n ...wizardData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ...foodData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ]);\n\n const activeDaysWithCarbData = uniqueDatumDates.size;\n\n const wizardCarbs = _.reduce(\n wizardData,\n (result, datum) => {\n const units = _.get(datum, 'carbUnits', 'grams');\n\n const carbInput = this.dataUtil.needsCarbToExchangeConversion(datum)\n ? this.dataUtil.getDeconvertedCarbExchange(datum)\n : _.get(datum, 'carbInput', 0);\n\n return {\n ...result,\n [units]: result[units] + carbInput,\n };\n },\n {\n grams: 0,\n exchanges: 0,\n }\n );\n\n const foodCarbs = _.reduce(\n foodData,\n (result, datum) => result + _.get(datum, 'nutrition.carbohydrate.net', 0),\n 0\n );\n\n let carbs = {\n grams: wizardCarbs.grams + foodCarbs,\n exchanges: wizardCarbs.exchanges,\n };\n\n if (this.activeDays > 1 && activeDaysWithCarbData > 1) {\n carbs = {\n grams: carbs.grams / activeDaysWithCarbData,\n exchanges: carbs.exchanges / activeDaysWithCarbData,\n };\n }\n\n return {\n carbs,\n total: wizardData.length + foodData.length,\n };\n };\n\n getCoefficientOfVariationData = () => {\n const {\n averageGlucose,\n insufficientData,\n standardDeviation,\n total,\n } = this.getStandardDevData();\n\n const coefficientOfVariationData = {\n coefficientOfVariation: standardDeviation / averageGlucose * 100,\n total,\n };\n\n if (insufficientData) {\n coefficientOfVariationData.insufficientData = true;\n }\n\n return coefficientOfVariationData;\n };\n\n getDailyAverageSums = data => {\n const clone = _.clone(data);\n\n _.each(clone, (value, key) => {\n if (key !== 'total') {\n clone[key] = value / this.activeDays;\n }\n });\n\n return clone;\n };\n\n getDailyAverageDurations = data => {\n const clone = _.clone(data);\n const total = data.total || _.sum(_.values(data));\n\n _.each(clone, (value, key) => {\n if (key !== 'total') {\n clone[key] = (value / total) * MS_IN_DAY;\n }\n });\n\n return clone;\n };\n\n getGlucoseManagementIndicatorData = () => {\n const { averageGlucose, bgData, total } = this.getAverageGlucoseData(true);\n\n const getTotalCbgDuration = () => _.reduce(\n bgData,\n (result, datum) => {\n result += datum.sampleInterval;\n return result;\n },\n 0\n );\n\n const insufficientData = this.bgSource === 'smbg'\n || this.activeDays < 14\n || getTotalCbgDuration() < 14 * MS_IN_DAY * 0.7;\n\n const meanInMGDL = this.bgUnits === MGDL_UNITS\n ? averageGlucose\n : averageGlucose * MGDL_PER_MMOLL;\n\n const glucoseManagementIndicator = (3.31 + 0.02392 * meanInMGDL);\n const glucoseManagementIndicatorAGP = glucoseManagementIndicator;\n\n if (insufficientData) {\n // We still return values for AGP reports where the data sufficiency requirements are\n // different from ours and are checked at time of report generation\n return {\n glucoseManagementIndicator: NaN,\n glucoseManagementIndicatorAGP,\n insufficientData: true,\n };\n }\n\n return {\n glucoseManagementIndicator,\n glucoseManagementIndicatorAGP,\n total,\n };\n };\n\n getReadingsInRangeData = () => {\n const smbgData = _.cloneDeep(this.dataUtil.filter.byType('smbg').top(Infinity));\n _.each(smbgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const initialValue = {\n counts: {\n low: 0,\n target: 0,\n high: 0,\n total: 0,\n },\n };\n\n if (_.isNumber(this.bgBounds.veryLowThreshold)) {\n initialValue.counts.veryLow = 0;\n }\n\n if (_.isNumber(this.bgBounds.veryHighThreshold)) {\n initialValue.counts.veryHigh = 0;\n }\n\n const readingsInRangeData = _.reduce(\n smbgData,\n (result, datum) => {\n const classification = classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay');\n result.counts[classification]++;\n result.counts.total++;\n return result;\n },\n initialValue\n );\n\n if (this.activeDays > 1) {\n readingsInRangeData.dailyAverages = this.getDailyAverageSums(readingsInRangeData.counts);\n }\n\n return readingsInRangeData;\n };\n\n getSensorUsage = () => {\n this.filterCBGDataByDefaultSampleInterval();\n const rawCbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const cbgData = this.dataUtil.getDeduplicatedCBGData(rawCbgData);\n\n let sensorUsage = 0;\n for (let i = 0; i < cbgData.length; i++) {\n const datum = cbgData[i];\n this.dataUtil.setDataAnnotations(datum);\n\n sensorUsage += datum.sampleInterval;\n }\n\n const count = cbgData.length;\n const total = this.activeDays * MS_IN_DAY;\n\n const { newestDatum, oldestDatum } = this.getBgExtentsData();\n const sampleInterval = newestDatum?.sampleInterval || this.dataUtil.defaultCgmSampleInterval;\n if (newestDatum) this.dataUtil.normalizeDatumOut(newestDatum, ['msPer24', 'localDate']);\n if (oldestDatum) this.dataUtil.normalizeDatumOut(oldestDatum, ['msPer24', 'localDate']);\n\n let cgmMinutesWorn;\n\n if (cbgData.length < 2) {\n cgmMinutesWorn = cbgData.length === 1 ? sampleInterval : 0;\n } else {\n cgmMinutesWorn = Math.ceil(moment.utc(newestDatum?.time).diff(moment.utc(oldestDatum?.time), 'minutes', true));\n }\n\n const sensorUsageAGP = (\n count /\n ((cgmMinutesWorn / (sampleInterval / MS_IN_MIN)) + 1)\n ) * 100;\n\n return {\n sensorUsage,\n sensorUsageAGP,\n sampleInterval,\n count,\n total,\n };\n };\n\n getStandardDevData = () => {\n const { averageGlucose, bgData, total } = this.getAverageGlucoseData(true);\n\n if (bgData.length < 3) {\n return {\n averageGlucose,\n insufficientData: true,\n standardDeviation: NaN,\n total,\n };\n }\n\n const squaredDiffs = _.map(bgData, d => (d.value - averageGlucose) ** 2);\n const standardDeviation = Math.sqrt(_.sum(squaredDiffs) / (bgData.length - 1));\n\n return {\n averageGlucose,\n standardDeviation,\n total,\n };\n };\n\n getTimeInAutoData = () => {\n const rawBasalData = this.dataUtil.sort.byTime(this.dataUtil.filter.byType('basal').top(Infinity));\n const basalData = this.dataUtil.addBasalOverlappingStart(_.cloneDeep(rawBasalData));\n\n let durations = basalData.length\n ? _.transform(\n getBasalGroupDurationsFromEndpoints(basalData, this.endpoints),\n (result, value, key) => {\n result[key] = value;\n return result;\n },\n {}\n )\n : NaN;\n\n if (this.activeDays > 1 && !_.isNaN(durations)) {\n durations = this.getDailyAverageDurations(durations);\n }\n\n return durations;\n };\n\n getTimeInOverrideData = () => {\n const deviceEventData = _.cloneDeep(this.dataUtil.sort.byTime(this.dataUtil.filter.byType('deviceEvent').top(Infinity)));\n const rawPumpSettingsOverrideData = _.filter(deviceEventData, { subType: 'pumpSettingsOverride' });\n\n const pumpSettingsOverrideData = this.dataUtil\n .addPumpSettingsOverrideOverlappingStart(rawPumpSettingsOverrideData);\n\n let durations = pumpSettingsOverrideData.length\n ? _.transform(\n _.groupBy(pumpSettingsOverrideData, 'overrideType'),\n (result, data, key) => {\n const trimmedDurationData = _.map(data, datum => {\n const normalTime = _.max([this.endpoints[0], datum.normalTime]);\n const normalEnd = _.min([this.endpoints[1], (datum.normalEnd || this.dataUtil.latestDiabetesDatumEnd)]);\n const duration = normalEnd - normalTime;\n\n return {\n ...datum,\n normalTime,\n normalEnd,\n duration,\n };\n });\n\n result[key] = _.sumBy(trimmedDurationData, 'duration');\n return result;\n },\n {}\n )\n : NaN;\n\n if (this.activeDays > 1 && !_.isNaN(durations)) {\n durations.total = this.activeDays * MS_IN_DAY;\n durations = this.getDailyAverageDurations(durations);\n delete durations.total;\n }\n\n return durations;\n };\n\n getTimeInRangeData = () => {\n this.filterCBGDataByDefaultSampleInterval();\n const rawCbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const cbgData = this.dataUtil.getDeduplicatedCBGData(rawCbgData);\n _.each(cbgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const initialValue = {\n durations: { low: 0, target: 0, high: 0, total: 0 },\n counts: { low: 0, target: 0, high: 0, total: 0 },\n };\n\n if (_.isNumber(this.bgBounds.veryLowThreshold)) {\n initialValue.durations.veryLow = 0;\n initialValue.counts.veryLow = 0;\n }\n\n if (_.isNumber(this.bgBounds.veryHighThreshold)) {\n initialValue.durations.veryHigh = 0;\n initialValue.counts.veryHigh = 0;\n }\n\n const timeInRangeData = _.reduce(\n cbgData,\n (result, datum) => {\n this.dataUtil.setDataAnnotations(datum);\n const classification = classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay');\n const duration = datum.sampleInterval;\n result.durations[classification] += duration;\n result.durations.total += duration;\n result.counts[classification]++;\n result.counts.total++;\n return result;\n },\n initialValue\n );\n\n if (this.activeDays > 1) {\n timeInRangeData.durations = this.getDailyAverageDurations(timeInRangeData.durations);\n }\n\n return timeInRangeData;\n };\n\n getTotalInsulinData = () => {\n const { basal, bolus } = this.getBasalBolusData();\n\n const totalInsulin = _.reduce([basal, bolus], (result, value) => {\n const delivered = _.isNaN(value) ? 0 : value || 0;\n return result + delivered;\n }, 0);\n\n return {\n totalInsulin,\n };\n };\n}\n\nexport default StatUtil;\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\n\nimport { formatInsulin, precisionRound } from './format';\nimport { ONE_HR } from './datetime';\n\n/**\n* getBasalSequences\n* @param {Array} basals - Array of preprocessed Tidepool basal objects\n*\n* @return {Array} Array of Arrays where each component Array is a sequence of basals\n* of the same subType to be rendered as a unit\n*/\nexport function getBasalSequences(basals) {\n const basalSequences = [];\n let currentBasal = basals[0];\n let seq = [basals[0]];\n\n let idx = 1;\n while (idx <= basals.length - 1) {\n const nextBasal = basals[idx];\n const basalTypeChange = nextBasal.subType !== currentBasal.subType;\n\n if (basalTypeChange || currentBasal.discontinuousEnd || nextBasal.rate === 0) {\n basalSequences.push(seq);\n seq = [];\n }\n\n seq.push(nextBasal);\n currentBasal = nextBasal;\n ++idx;\n }\n basalSequences.push(seq);\n\n return basalSequences;\n}\n\n/**\n * getBasalPathGroupType\n * @param {Object} basal - single basal datum\n * @return {String} the path group type\n */\nexport function getBasalPathGroupType(datum = {}) {\n const deliveryType = _.get(datum, 'subType', datum.deliveryType);\n const suppressedDeliveryType = _.get(\n datum.suppressed,\n 'subType',\n _.get(datum.suppressed, 'deliveryType')\n );\n return _.includes([deliveryType, suppressedDeliveryType], 'automated') ? 'automated' : 'manual';\n}\n\n/**\n * getBasalPathGroups\n * @param {Array} basals - Array of preprocessed Tidepool basal objects\n * @return {Array} groups of alternating 'automated' and 'manual' datums\n */\nexport function getBasalPathGroups(basals) {\n const basalPathGroups = [];\n let currentPathType;\n _.each(basals, datum => {\n const pathType = getBasalPathGroupType(datum);\n if (pathType !== currentPathType) {\n currentPathType = pathType;\n basalPathGroups.push([]);\n }\n _.last(basalPathGroups).push(datum);\n });\n\n return basalPathGroups;\n}\n\n/**\n * Get the start and end indexes and datetimes of basal datums within a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {String} s ISO date string for the start of the range\n * @param {String} e ISO date string for the end of the range\n * @param {Boolean} optionalExtents If true, allow basal gaps at start and end extents of the range.\n * @returns {Object} The start and end datetimes and indexes\n */\nexport function getEndpoints(data, s, e, optionalExtents = false) {\n const start = new Date(s);\n const end = new Date(e);\n\n const startIndex = _.findIndex(\n data,\n segment => (optionalExtents || new Date(segment.normalTime).valueOf() <= start)\n && (start <= new Date(segment.normalEnd).valueOf())\n );\n\n const endIndex = _.findLastIndex(\n data,\n segment => (new Date(segment.normalTime).valueOf() <= end)\n && (optionalExtents || end <= new Date(segment.normalEnd).valueOf())\n );\n\n return {\n start: {\n datetime: start.toISOString(),\n index: startIndex,\n },\n end: {\n datetime: end.toISOString(),\n index: endIndex,\n },\n };\n}\n\n/**\n * Get durations of basal groups within a given span of time\n * @param {Array} data Array of Tidepool basal data\n * @param {String} s ISO date string for the start of the range\n * @param {String} e ISO date string for the end of the range\n * @returns {Object} The durations (in ms) keyed by basal group type\n */\nexport function getGroupDurations(data, s, e) {\n const endpoints = getEndpoints(data, s, e, true);\n\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n if ((endpoints.start.index >= 0) && (endpoints.end.index >= 0)) {\n const start = new Date(endpoints.start.datetime);\n const end = new Date(endpoints.end.datetime);\n\n // handle first segment, which may have started before the start endpoint\n let segment = data[endpoints.start.index];\n const initialSegmentDuration = _.min([new Date(segment.normalEnd) - start, segment.duration]);\n durations[getBasalPathGroupType(segment)] = initialSegmentDuration;\n\n // add the durations of all subsequent basals, minus the last\n let i = endpoints.start.index + 1;\n while (i < endpoints.end.index) {\n segment = data[i];\n durations[getBasalPathGroupType(segment)] += segment.duration;\n i++;\n }\n\n // handle last segment, which may go past the end endpoint\n segment = data[endpoints.end.index];\n durations[getBasalPathGroupType(segment)] += _.min([\n end - new Date(segment.normalTime),\n segment.duration,\n ]);\n }\n\n return durations;\n}\n\n/**\n * Calculate the total insulin dose delivered in a given basal segment\n * @param {Number} duration Duration of segment in milliseconds\n * @param {Number} rate Basal rate of segment\n */\nexport function getSegmentDose(duration, rate) {\n const hours = duration / ONE_HR;\n return parseFloat(precisionRound(hours * rate, 3));\n}\n\n/**\n * Get the duration of a basal datum within a given time range\n * @param {Object} datum A single basal datum\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @returns {Number} Duration of the basal datum falling within the range in milliseconds\n */\nexport function getBasalDurationWithinRange(datum, endpoints) {\n const rangeStart = new Date(endpoints[0]).valueOf();\n const rangeEnd = new Date(endpoints[1]).valueOf();\n const datumStart = new Date(datum.normalTime).valueOf();\n const datumEnd = new Date(datum.normalEnd).valueOf();\n\n const datumStartIsWithinRange = rangeStart <= datumStart && datumStart < rangeEnd;\n const datumEndIsWithinRange = rangeStart < datumEnd && datumEnd <= rangeEnd;\n const datumEncompassesRange = rangeStart >= datumStart && datumEnd >= rangeEnd;\n\n const trimmedStart = _.max([rangeStart, datumStart]);\n const trimmedEnd = _.min([rangeEnd, datumEnd]);\n\n if (datumStartIsWithinRange || datumEndIsWithinRange || datumEncompassesRange) {\n return trimmedEnd - trimmedStart;\n }\n\n return 0;\n}\n\n/**\n * Get total basal delivered for a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @return {Number} Formatted total insulin dose\n */\nexport function getTotalBasalFromEndpoints(data, endpoints) {\n let dose = 0;\n\n _.each(data, datum => {\n dose += getSegmentDose(getBasalDurationWithinRange(datum, endpoints), datum.rate);\n });\n\n return formatInsulin(dose);\n}\n\n/**\n * Get automated and manual basal delivery time for a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @return {Number} Formatted total insulin dose\n */\nexport function getBasalGroupDurationsFromEndpoints(data, endpoints) {\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n _.each(data, datum => {\n durations[getBasalPathGroupType(datum)] += getBasalDurationWithinRange(datum, endpoints);\n });\n\n return durations;\n}\n\nexport const countAutomatedBasalEvents = (data) => {\n const returnData = _.cloneDeep(data);\n\n // Get the path groups, and remove the first group, as we only want to\n // track changes into and out of automated delivery\n const basalPathGroups = getBasalPathGroups(returnData.data);\n basalPathGroups.shift();\n\n const events = {\n automatedStop: 0,\n };\n\n _.reduce(basalPathGroups, (acc, group) => {\n const subType = _.get(group[0], 'subType', group[0].deliveryType);\n const event = subType === 'automated' ? 'automatedStart' : 'automatedStop';\n // For now, we're only tracking `automatedStop` events\n if (event === 'automatedStop') {\n acc[event]++;\n }\n return acc;\n }, events);\n\n _.assign(returnData.subtotals, events);\n returnData.total += events.automatedStop;\n\n return returnData;\n};\n\nexport const countDistinctSuspends = (data) => {\n const returnData = _.cloneDeep(data);\n\n const suspends = _.filter(returnData.data, d => d.deliveryType === 'suspend');\n\n const result = {\n prev: {},\n distinct: 0,\n skipped: 0,\n };\n\n _.reduce(suspends, (acc, datum) => {\n // We only want to track non-contiguous suspends as distinct\n if (_.get(acc.prev, 'normalEnd') === datum.normalTime) {\n acc.skipped++;\n } else {\n acc.distinct++;\n }\n acc.prev = datum;\n return acc;\n }, result);\n\n returnData.subtotals.suspend = result.distinct;\n returnData.total -= result.skipped;\n\n return returnData;\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport { max, mean, median, min, quantile, range } from 'd3-array';\n\nimport { BG_DISPLAY_MINIMUM_INCREMENTS, DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MGDL_UNITS, MMOLL_UNITS, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { bankersRound, formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Number} bgValue - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {String} classificationType - 'threeWay' or 'fiveWay'\n *\n * @return {String} bgClassification - low, target, high\n */\nexport function classifyBgValue(bgBounds, bgUnits, bgValue, classificationType = 'threeWay') {\n if (_.isEmpty(bgBounds) ||\n !_.isNumber(_.get(bgBounds, 'targetLowerBound')) ||\n !_.isNumber(_.get(bgBounds, 'targetUpperBound'))) {\n throw new Error(\n 'You must provide a `bgBounds` object with a `targetLowerBound` and a `targetUpperBound`!'\n );\n }\n if (!_.isNumber(bgValue) || !_.gt(bgValue, 0)) {\n throw new Error('You must provide a positive, numerical blood glucose value to categorize!');\n }\n if (!_.includes([MMOLL_UNITS, MGDL_UNITS], bgUnits)) {\n throw new Error('Must provide a valid blood glucose unit of measure!');\n }\n\n const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n\n const precision = bgUnits === MMOLL_UNITS ? 1 : 0;\n const roundedValue = bankersRound(bgValue, precision);\n\n // fiveWay\n if (classificationType === 'fiveWay') {\n if (_.isNumber(veryLowThreshold) && roundedValue < veryLowThreshold) {\n return 'veryLow';\n } else if (_.isNumber(veryHighThreshold) && roundedValue > veryHighThreshold) {\n return 'veryHigh';\n } else if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n\n return 'target';\n }\n\n // threeWay\n if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n return 'target';\n}\n\n/**\n * classifyCvValue\n * @param {number} value - integer or float coefficient of variation (CV) value\n * @return {String} cvClassification - target, high\n */\nexport function classifyCvValue(value) {\n if (value <= 36) {\n return 'target';\n } else {\n return 'high';\n }\n}\n\n/**\n * convertToMmolL\n * @param {Number} bgVal - blood glucose value in mg/dL\n *\n * @return {Number} convertedBgVal - blood glucose value in mmol/L, unrounded\n */\nexport function convertToMmolL(val) {\n return (val / MGDL_PER_MMOLL);\n}\n\n/**\n * convertToMGDL\n * @param {Number} bgVal - blood glucose value in mmol/L\n *\n * @return {Number} convertedBgVal - blood glucose value in mg/dL, unrounded\n */\nexport function convertToMGDL(val) {\n return (val * MGDL_PER_MMOLL);\n}\n\n/**\n * reshapeBgClassesToBgBounds\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {Object} bgBounds - @tidepool/viz-style bgBounds\n */\nexport function reshapeBgClassesToBgBounds(bgPrefs) {\n const { bgClasses, bgUnits } = bgPrefs;\n\n const bgBounds = {\n veryHighThreshold: _.get(bgClasses, 'high.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold),\n targetUpperBound: _.get(bgClasses, 'target.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound),\n targetLowerBound: _.get(bgClasses, 'low.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound),\n veryLowThreshold: _.get(bgClasses, 'very-low.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold),\n extremeHighThreshold: DEFAULT_BG_BOUNDS[bgUnits].extremeHighThreshold,\n clampThreshold: DEFAULT_BG_BOUNDS[bgUnits].clampThreshold,\n };\n\n return bgBounds;\n}\n\n/**\n * Generate BG Range Labels for a given set of bg prefs\n *\n * @export\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n * @returns {Object} bgRangeLabels - map of labels keyed by bgClassification\n */\nexport function generateBgRangeLabels(bgPrefs, opts = {}) {\n const { bgBounds, bgUnits } = bgPrefs;\n const minimumIncrement = BG_DISPLAY_MINIMUM_INCREMENTS[bgUnits];\n\n const thresholds = _.mapValues(\n bgBounds,\n threshold => (_.isNumber(threshold) ? formatBgValue(threshold, bgPrefs) : null)\n );\n\n thresholds.highLowerBound = formatBgValue(bgBounds.targetUpperBound + minimumIncrement, bgPrefs);\n thresholds.lowUpperBound = formatBgValue(bgBounds.targetLowerBound - minimumIncrement, bgPrefs);\n\n const {\n veryLowThreshold,\n lowUpperBound,\n targetLowerBound,\n targetUpperBound,\n highLowerBound,\n veryHighThreshold,\n extremeHighThreshold,\n } = thresholds;\n\n if (opts.condensed) {\n return {\n veryLow: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n low: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n anyLow: `<${targetLowerBound}`,\n target: `${targetLowerBound}-${targetUpperBound}`,\n high: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n anyHigh: `>${targetUpperBound}`,\n veryHigh: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n extremeHigh: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n suffix: bgUnits,\n value: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n },\n anyLow: {\n suffix: bgUnits,\n value: `<${targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${targetLowerBound}-${targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n },\n anyHigh: {\n suffix: bgUnits,\n value: `>${targetUpperBound}`,\n },\n veryHigh: {\n suffix: bgUnits,\n value: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n },\n extremeHigh: {\n suffix: bgUnits,\n value: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n },\n };\n }\n\n return {\n veryLow: !!veryLowThreshold ? `below ${veryLowThreshold} ${bgUnits}` : null,\n low: !!veryLowThreshold ? `between ${veryLowThreshold} - ${lowUpperBound} ${bgUnits}` : `below ${targetLowerBound} ${bgUnits}`,\n anyLow: `below ${targetLowerBound} ${bgUnits}`,\n target: `between ${targetLowerBound} - ${targetUpperBound} ${bgUnits}`,\n high: !!veryHighThreshold ? `between ${highLowerBound} - ${veryHighThreshold} ${bgUnits}` : `above ${targetUpperBound} ${bgUnits}`,\n anyHigh: `above ${targetUpperBound} ${bgUnits}`,\n veryHigh: !!veryHighThreshold ? `above ${veryHighThreshold} ${bgUnits}` : null,\n extremeHigh: !!extremeHighThreshold ? `above ${extremeHighThreshold} ${bgUnits}` : null,\n };\n}\n\n/**\n * getOutOfRangeThreshold\n * @param {Object} bgDatum\n * @return Object containing out of range threshold or null\n */\nexport function getOutOfRangeThreshold(bgDatum) {\n const outOfRangeAnnotation = _.find(\n bgDatum.annotations || [], (annotation) => (annotation.code === 'bg/out-of-range')\n );\n return outOfRangeAnnotation ?\n { [outOfRangeAnnotation.value]: outOfRangeAnnotation.threshold } : null;\n}\n\n/**\n * Get the adjusted count of expected CGM data points for devices that do not sample at the default\n * 5 minute interval, such as the Abbot FreeStyle Libre, which samples every 15 mins\n *\n * @param {Array} data - cgm data\n * @return {Integer} count - the weighted count\n */\nexport function weightedCGMCount(data) {\n return _.reduce(data, (total, datum) => {\n const sampleInterval = _.get(datum, 'sampleInterval', 5 * MS_IN_MIN);\n const sampleIntervalInMinutes = sampleInterval / MS_IN_MIN;\n const datumWeight = sampleIntervalInMinutes / 5; // Default weight is 1, for 5 minute samples\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Determine if a patient is using a custom target bg range\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n */\nexport function isCustomBgRange(bgPrefs) {\n const { bgBounds, bgUnits } = bgPrefs;\n return bgBounds.targetUpperBound !== DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound\n || bgBounds.targetLowerBound !== DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound;\n}\n\n/**\n * determineRangeBoundaries\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} highAndLowThresholds - Object with high and low keys\n */\nexport function determineRangeBoundaries(outOfRange) {\n const lowThresholds = _.filter(outOfRange, { value: 'low' });\n const highThresholds = _.filter(outOfRange, { value: 'high' });\n const boundaries = {};\n if (!_.isEmpty(lowThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= higher) threshold for lows\n boundaries.low = max(lowThresholds, (d) => (d.threshold));\n }\n if (!_.isEmpty(highThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= lower) threshold for highs\n boundaries.high = min(highThresholds, (d) => (d.threshold));\n }\n return boundaries;\n}\n\n/**\n * findBinForTimeOfDay\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Number} msPer24 - natural number milliseconds into a twenty-four hour day\n *\n * @return {Number} bin\n */\nexport function findBinForTimeOfDay(binSize, msPer24) {\n if (msPer24 < 0 || msPer24 >= TWENTY_FOUR_HRS) {\n throw new Error('`msPer24` < 0 or >= 86400000 is invalid!');\n }\n\n return Math.floor(msPer24 / binSize) * binSize + (binSize / 2);\n}\n\n/**\n * findOutOfRangeAnnotations\n * @param {Array} data - Array of `cbg` or `smbg` events\n *\n * @return {Array} thresholds - Array of objects with unique `threshold`\n * (and `value` of 'low' or 'high')\n */\nexport function findOutOfRangeAnnotations(data) {\n const isOutOfRangeAnnotation = (annotation) => (annotation.code === 'bg/out-of-range');\n const eventsAnnotatedAsOutOfRange = _.filter(\n data,\n (d) => (_.some(d.annotations || [], isOutOfRangeAnnotation))\n );\n const annotations = _.map(eventsAnnotatedAsOutOfRange, (d) => (_.pick(\n _.find(d.annotations || [], isOutOfRangeAnnotation),\n ['threshold', 'value']\n )));\n // the numerical `threshold` is our determiner of uniqueness\n return _.uniqBy(annotations, (d) => (d.threshold));\n}\n\n/**\n * calculateCbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of cbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n *\n * @return {Object} calculatedCbgStats\n */\nexport function calculateCbgStatsForBin(binKey, binSize, data, outOfRange, outerQuantiles = []) {\n const [\n lowerQuantile = 0.1,\n upperQuantile = 0.9,\n ] = outerQuantiles;\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n lowerQuantile: quantile(sorted, lowerQuantile),\n firstQuartile: quantile(sorted, 0.25),\n median: median(sorted),\n thirdQuartile: quantile(sorted, 0.75),\n upperQuantile: quantile(sorted, upperQuantile),\n max: max(sorted),\n msX: centerOfBinMs,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * calculateSmbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} calculatedSmbgStats\n */\nexport function calculateSmbgStatsForBin(binKey, binSize, data, outOfRange) {\n const minDatums = {\n quantile: 5,\n median: 3,\n };\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n mean: mean(sorted),\n max: max(sorted),\n msX: centerOfBinMs,\n firstQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.25) : undefined,\n median: data.length >= minDatums.median ? median(sorted) : undefined,\n thirdQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.75) : undefined,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * mungeBGDataBins\n * @param {String} bgType - String - one of [smbg|cbg]\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n * @returns munged bg bin data\n */\nexport function mungeBGDataBins(bgType, binSize, data, outerQuantiles) {\n const binned = _.groupBy(data, (d) => (findBinForTimeOfDay(binSize, d.msPer24)));\n const outOfRanges = findOutOfRangeAnnotations(data);\n // we need *all* possible keys for TransitionMotion to work on enter/exit\n // and the range starts with binSize/2 because the keys are centered in each bin\n const binKeys = _.map(range(binSize / 2, TWENTY_FOUR_HRS, binSize), (d) => String(d));\n\n const binCalculator = bgType === 'smbg' ? calculateSmbgStatsForBin : calculateCbgStatsForBin;\n const valueExtractor = (d) => (d.value);\n const mungedData = [];\n for (let i = 0; i < binKeys.length; ++i) {\n const values = _.map(_.get(binned, binKeys[i], []), valueExtractor);\n mungedData.push(binCalculator(binKeys[i], binSize, values, outOfRanges, outerQuantiles));\n }\n return mungedData;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/* the logic here (and the tests) are a port of tideline's\n js/plot/util/commonbolus.js */\n\nimport _ from 'lodash';\n\nimport { formatDecimalNumber, formatPercentage } from './format';\n\n/**\n * fixFloatingPoint\n * @param {Number} numeric value\n *\n * @return {Number} numeric value rounded to 3 decimal places\n */\nfunction fixFloatingPoint(n) {\n return parseFloat(formatDecimalNumber(n, 3));\n}\n\n/**\n * getBolusFromInsulinEvent\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Object} a Tidepool bolus object\n */\nexport function getBolusFromInsulinEvent(insulinEvent) {\n let bolus = insulinEvent;\n if (insulinEvent.bolus) {\n bolus = insulinEvent.bolus;\n }\n return bolus;\n}\n\n/**\n * getWizardFromInsulinEvent\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Object} a Tidepool wizard object\n */\nexport function getWizardFromInsulinEvent(insulinEvent) {\n let wizard = insulinEvent;\n if (insulinEvent.wizard) {\n wizard = insulinEvent.wizard;\n }\n return wizard;\n}\n\n/**\n * getCarbs\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Number} grams of carbs input into bolus calculator\n * NaN if bolus calculator not used; null if no carbInput\n */\nexport function getCarbs(insulinEvent) {\n if (insulinEvent.type !== 'wizard' && !insulinEvent.wizard && !insulinEvent.dosingDecision) {\n return NaN;\n }\n return _.get(getWizardFromInsulinEvent(insulinEvent), 'carbInput', null);\n}\n\n/**\n * getProgrammed\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} value of insulin programmed for delivery in the given insulinEvent\n */\nexport function getProgrammed(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!_.inRange(bolus.normal, Infinity) && !_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n }\n if (bolus.extended != null && bolus.expectedExtended != null) {\n if (bolus.normal != null) {\n if (bolus.expectedNormal != null) {\n return fixFloatingPoint(bolus.expectedNormal + bolus.expectedExtended);\n }\n return fixFloatingPoint(bolus.normal + bolus.expectedExtended);\n }\n return bolus.expectedExtended;\n } else if (bolus.extended != null) {\n if (bolus.normal != null) {\n if (bolus.expectedNormal != null) {\n // this situation should not exist!\n throw new Error(\n 'Combo bolus found with a cancelled `normal` portion and non-cancelled `extended`!'\n );\n }\n return fixFloatingPoint(bolus.normal + bolus.extended);\n }\n return bolus.extended;\n }\n return bolus.expectedNormal || bolus.normal;\n}\n\n/**\n * getRecommended\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} total recommended insulin dose\n */\nexport function getRecommended(insulinEvent) {\n let event = insulinEvent;\n\n if (_.get(insulinEvent, 'type') === 'bolus') {\n event = event.dosingDecision || getWizardFromInsulinEvent(insulinEvent);\n }\n\n // a simple manual/\"quick\" bolus won't have a `recommended` field\n if (!event.recommendedBolus && !event.recommended) {\n return NaN;\n }\n\n const netRecommendation = event.recommendedBolus\n ? _.get(event, ['recommendedBolus', 'amount'], null)\n : _.get(event, ['recommended', 'net'], null);\n\n if (netRecommendation !== null) {\n return netRecommendation;\n }\n\n let rec = 0;\n rec += _.get(event, ['recommended', 'carb'], 0);\n rec += _.get(event, ['recommended', 'correction'], 0);\n\n return fixFloatingPoint(rec);\n}\n\n/**\n * getDelivered\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} units of insulin delivered in this insulinEvent\n */\nexport function getDelivered(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!_.inRange(bolus.normal, Infinity) && !_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n }\n if (bolus.extended != null) {\n if (bolus.normal != null) {\n return fixFloatingPoint(bolus.extended + bolus.normal);\n }\n return bolus.extended;\n }\n return bolus.normal;\n}\n\n/**\n * getDuration\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} duration value in milliseconds\n */\nexport function getDuration(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n // don't want truthiness here because want to return duration\n // from a bolus interrupted immediately (duration = 0)\n if (!_.inRange(bolus.duration, Infinity)) {\n return NaN;\n }\n return bolus.duration;\n}\n\n/**\n * getExtended\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Number} units of insulin delivered over an extended duration\n */\nexport function getExtended(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n // don't want truthiness here because want to return expectedExtended\n // from a bolus interrupted immediately (extended = 0)\n if (!_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n\n return bolus.extended;\n}\n\n/**\n * getExtendedPercentage\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {String} percentage of combo bolus delivered later\n */\nexport function getExtendedPercentage(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n if (!bolus.normal || !(bolus.extended || bolus.expectedExtended)) {\n return NaN;\n }\n const extended = bolus.expectedExtended || bolus.extended;\n const programmed = getProgrammed(bolus);\n return formatPercentage(extended / programmed);\n}\n\n/**\n * getMaxDuration\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} duration value in milliseconds\n */\nexport function getMaxDuration(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n // don't want truthiness here because want to return expectedDuration\n // from a bolus interrupted immediately (duration = 0)\n if (!_.inRange(bolus.duration, Infinity)) {\n return NaN;\n }\n return bolus.expectedDuration || bolus.duration;\n}\n\n/**\n * getMaxValue\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} max programmed or recommended value wrt the insulinEvent\n */\nexport function getMaxValue(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!bolus.normal && !bolus.extended) {\n return NaN;\n }\n }\n const programmed = getProgrammed(bolus);\n const recommended = getRecommended(insulinEvent) || 0;\n return (recommended > programmed) ? recommended : programmed;\n}\n\n/**\n * getNormalPercentage\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {String} percentage of combo bolus delivered immediately\n */\nexport function getNormalPercentage(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n if (!(bolus.normal || bolus.expectedNormal) || !(bolus.extended || bolus.expectedExtended)) {\n return NaN;\n }\n const normal = bolus.expectedNormal || bolus.normal;\n const programmed = getProgrammed(bolus);\n return formatPercentage(normal / programmed);\n}\n\n/**\n * getTotalBolus\n * @param {Array} insulinEvents - Array of Tidepool bolus or wizard objects\n *\n * @return {Number} total bolus insulin in units\n */\nexport function getTotalBolus(insulinEvents) {\n return _.reduce(insulinEvents, (result, insulinEvent) => (\n result + getDelivered(insulinEvent)\n ), 0);\n}\n\n/**\n * hasExtended\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus has an extended delivery portion\n */\nexport function hasExtended(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n // NB: intentionally invoking truthiness here\n // a bolus with `extended` value 0 and `expectedExtended` value 0 is pointless to render\n return Boolean(bolus.extended || bolus.expectedExtended) || false;\n}\n\n/**\n * isInterruptedBolus\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus was interrupted or not\n */\nexport function isInterruptedBolus(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n const cancelledDuringNormal = (\n _.isFinite(bolus.normal) &&\n _.isFinite(bolus.expectedNormal) &&\n bolus.normal < bolus.expectedNormal\n );\n\n const cancelledDuringExtended = (\n _.isFinite(bolus.extended) &&\n _.isFinite(bolus.expectedExtended) &&\n bolus.extended < bolus.expectedExtended\n );\n\n if (_.inRange(bolus.normal, Infinity)) {\n if (!_.isFinite(bolus.extended)) {\n return cancelledDuringNormal;\n }\n return cancelledDuringNormal || cancelledDuringExtended;\n }\n return cancelledDuringExtended;\n}\n\n/**\n * isOverride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} Whether the programmed amount is both significantly different (beyond 2 decimal places) from and larger than the recommended amount.\n */\nexport function isOverride(insulinEvent) {\n const MINIMUM_THRESHOLD = 0.01;\n const amountRecommended = getRecommended(insulinEvent.wizard || insulinEvent.dosingDecision || insulinEvent);\n const amountProgrammed = getProgrammed(insulinEvent);\n\n return (amountProgrammed - amountRecommended) >= MINIMUM_THRESHOLD;\n}\n\n/**\n * isUnderride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} Whether the programmed amount is both significantly different (beyond 2 decimal places) from and smaller than the recommended amount.\n */\nexport function isUnderride(insulinEvent) {\n const MINIMUM_THRESHOLD = 0.01;\n const amountRecommended = getRecommended(insulinEvent.wizard || insulinEvent.dosingDecision || insulinEvent);\n const amountProgrammed = getProgrammed(insulinEvent);\n\n return (amountRecommended - amountProgrammed) >= MINIMUM_THRESHOLD;\n}\n\n/**\n * isCorrection\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus programmed a recommended bg correction without carb entry\n */\nexport function isCorrection(insulinEvent) {\n const recommended = insulinEvent.dosingDecision\n ? {\n correction: _.get(insulinEvent, 'dosingDecision.recommendedBolus.amount'),\n carb: _.get(insulinEvent, 'dosingDecision.food.nutrition.carbohydrate.net', 0),\n }\n : _.get(insulinEvent, 'wizard.recommended', insulinEvent.recommended);\n return !!(recommended && recommended.correction > 0 && recommended.carb === 0);\n}\n\n/**\n * isAutomated\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus was automated\n */\nexport function isAutomated(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n return _.get(bolus, 'subType') === 'automated';\n}\n\n/**\n * isOneButton\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus has a one-button delivery context\n */\nexport function isOneButton(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n return _.get(bolus, 'deliveryContext') === 'oneButton' || _.get(bolus, 'dosingDecision.reason') === 'oneButtonBolus';\n}\n\n/**\n * getAnnoations\n * @param {Object} insulinEvent - a Tidebool bolus or wizard object\n *\n * @returns {Array} array of annotations for the bolus or an empty array\n */\nexport function getAnnotations(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n const annotations = _.get(bolus, 'annotations', []);\n return annotations;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const BG_HIGH = t('High');\nexport const BG_LOW = t('Low');\n\nconst STIFFNESS = 180;\nconst DAMPING = 40;\nconst PRECISION = 0.1;\n\nexport const springConfig = { stiffness: STIFFNESS, damping: DAMPING, precision: PRECISION };\n\nexport const MGDL_CLAMP_TOP = 400;\nexport const MMOLL_CLAMP_TOP = 22.5;\n\nexport const MGDL_UNITS = t('mg/dL');\nexport const MMOLL_UNITS = t('mmol/L');\nexport const MGDL_PER_MMOLL = 18.01559;\n\nexport const BG_DISPLAY_MINIMUM_INCREMENTS = {\n [MGDL_UNITS]: 1,\n [MMOLL_UNITS]: 0.1,\n};\n\nexport const GLYCEMIC_RANGES_PRESET = {\n ADA_STANDARD: 'adaStandard',\n ADA_OLDER_HIGH_RISK: 'adaHighRisk',\n ADA_PREGNANCY_T1: 'adaPregnancyType1',\n ADA_GESTATIONAL_T2: 'adaPregnancyType2',\n};\n\nexport const GLYCEMIC_RANGES_TYPE = {\n PRESET: 'preset',\n CUSTOM: 'custom',\n};\n\nexport const DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: 350,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: 19.4,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_STANDARD_BG_BOUNDS = DEFAULT_BG_BOUNDS;\n\nexport const ADA_OLDER_HIGH_RISK_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_PREGNANCY_T1_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 63,\n targetUpperBound: 140,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.5,\n targetUpperBound: 7.8,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_GESTATIONAL_T2_BG_BOUNDS = ADA_PREGNANCY_T1_BG_BOUNDS;\n\nexport const LBS_PER_KG = 2.2046226218;\n\nconst ONE_WEEK = 7;\nconst TWO_WEEKS = 14;\nconst FOUR_WEEKS = 28;\n\nexport const trends = { extentSizes: { ONE_WEEK, TWO_WEEKS, FOUR_WEEKS } };\n\nexport const MS_IN_DAY = 864e5;\nexport const MS_IN_HOUR = 864e5 / 24;\nexport const MS_IN_MIN = MS_IN_HOUR / 60;\n\nexport const CGM_READINGS_ONE_DAY = 288;\nexport const CGM_DATA_KEY = 'cbg';\nexport const BGM_DATA_KEY = 'smbg';\n\nexport const NO_SITE_CHANGE = 'noSiteChange';\nexport const SITE_CHANGE = 'siteChange';\nexport const SITE_CHANGE_RESERVOIR = 'reservoirChange';\nexport const SITE_CHANGE_TUBING = 'tubingPrime';\nexport const SITE_CHANGE_CANNULA = 'cannulaPrime';\n\nexport const ALARM = 'alarm';\nexport const ALARM_NO_DELIVERY = 'no_delivery';\nexport const ALARM_AUTO_OFF = 'auto_off';\nexport const ALARM_NO_INSULIN = 'no_insulin';\nexport const ALARM_NO_POWER = 'no_power';\nexport const ALARM_OCCLUSION = 'occlusion';\nexport const ALARM_OVER_LIMIT = 'over_limit';\n\nexport const EVENT = 'event';\nexport const EVENT_PUMP_SHUTDOWN = 'pump_shutdown';\n\nexport const AUTOMATED_BOLUS = 'automatedBolus';\nexport const AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const AUTOMATED_MODE_EXITED = 'automatedModeExited';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const PREPRANDIAL = 'preprandial';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\nexport const ONE_BUTTON_BOLUS = 'oneButtonBolus';\nexport const INSULIN_DURATION = 'insulinDuration';\n\nexport const SITE_CHANGE_TYPE_UNDECLARED = 'undeclared';\n\nexport const INSULET = 'Insulet';\nexport const TANDEM = 'Tandem';\nexport const ANIMAS = 'Animas';\nexport const TIDEPOOL_LOOP = 'Tidepool Loop';\nexport const DIY_LOOP = 'DIY Loop';\nexport const TWIIST_LOOP = 'twiist';\nexport const MEDTRONIC = 'Medtronic';\nexport const MICROTECH = 'Microtech';\n\nexport const pumpVocabulary = {\n [ANIMAS]: {\n [SITE_CHANGE_RESERVOIR]: t('Go Rewind'),\n [SITE_CHANGE_TUBING]: t('Go Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Pod Change'),\n [SITE_CHANGE_TUBING]: t('Pod Activate'),\n [SITE_CHANGE_CANNULA]: t('Prime'),\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Max Basal Rate'),\n [INSULIN_DURATION]: t('Duration of Insulin Action'),\n },\n [MEDTRONIC]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n [AUTOMATED_DELIVERY]: t('Auto Mode'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Active Insulin Time'),\n },\n [MICROTECH]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Reservoir Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Activity'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [MAX_BOLUS]: t('Max Bolus'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n [TIDEPOOL_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n [TWIIST_LOOP]: {\n [SITE_CHANGE_RESERVOIR]: t('Cassette Change'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n [ALARM_NO_INSULIN]: t('Cassette Empty'),\n [ALARM_OCCLUSION]: t('Line Blocked'),\n },\n [DIY_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n default: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_BOLUS]: t('Automated'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\n [AUTOMATED_MODE_EXITED]: t('Exited'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Settings Override'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [PREPRANDIAL]: { label: t('Pre-Meal'), marker: t('P') },\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n [ONE_BUTTON_BOLUS]: t('One-Button Bolus'),\n [ALARM_NO_DELIVERY]: t('Insulin Delivery Stopped'),\n [ALARM_AUTO_OFF]: t('Pump Auto-Off'),\n [ALARM_NO_INSULIN]: t('Reservoir Empty'),\n [ALARM_NO_POWER]: t('Battery Empty'),\n [ALARM_OCCLUSION]: t('Occlusion Detected'),\n [ALARM_OVER_LIMIT]: t('Insulin Delivery Limit Exceeded'),\n [EVENT_PUMP_SHUTDOWN]: t('Pump Shutdown'),\n },\n};\n\nexport const settingsOverrides = {\n [TANDEM]: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n ],\n [TIDEPOOL_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [TWIIST_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [DIY_LOOP]: [\n PREPRANDIAL,\n ],\n default: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\nexport const BG_DATA_TYPES = [\n 'cbg',\n 'smbg',\n];\n\nexport const DIABETES_DATA_TYPES = [\n ...BG_DATA_TYPES,\n 'basal',\n 'bolus',\n 'wizard',\n 'food',\n];\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/datetime.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n *\n * 2. Function naming scheme: the two main verbs here are `get` and `format`.\n * 2a. If the function returns any kind of datetime (JavaScript Date, hammertime, ISO 8601 String),\n * then the function name should start with `get`.\n * 2b. If the function returns a _formatted_ String that will be **surfaced to the end user**,\n * then the function name should start with `format`.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz, unless ESLint\n * complains about an undefined (e.g., getTimezoneFromTimePrefs must be at the top).\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `timePrefs`) rather than a named timezone\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\n// using d3-time-format because time is time of data access in\n// user’s browser time, not PwD’s configured timezone\nimport { utcFormat, timeFormat } from 'd3-time-format';\nimport moment from 'moment-timezone';\nimport sundial from 'sundial';\nimport i18next from 'i18next';\n\nconst t = i18next.t.bind(i18next);\n\nexport const THIRTY_MINS = 1800000;\nexport const ONE_HR = 3600000;\nexport const THREE_HRS = 10800000;\nexport const TWENTY_FOUR_HRS = 86400000;\n\n/**\n * getMsPer24\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n * @returns\n */\nexport function getMsPer24(utc, timezoneName = 'UTC') {\n const localized = moment.utc(utc).tz(timezoneName);\n const hrsToMs = localized.hours() * 1000 * 60 * 60;\n const minToMs = localized.minutes() * 1000 * 60;\n const secToMs = localized.seconds() * 1000;\n const ms = localized.milliseconds();\n return hrsToMs + minToMs + secToMs + ms;\n}\n\n/**\n * getOffset\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n *\n * @return {Object} a JavaScript Date, the closest (future) midnight according to timePrefs;\n * if utc is already local midnight, returns utc\n */\nexport function getOffset(utc, timezoneName) {\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n return moment.tz.zone(timezoneName).utcOffset(utcHammertime);\n}\n\n/**\n * getBrowserTimezone\n * @returns {String} browser-determined timezone name\n */\nexport function getBrowserTimezone() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * getTimezoneFromTimePrefs\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n *\n * @return {String} timezoneName from timePrefs, browser, or fallback to 'UTC'\n */\nexport function getTimezoneFromTimePrefs(timePrefs = {}) {\n const { timezoneAware, timezoneName } = timePrefs;\n try {\n let timezone = getBrowserTimezone() || 'UTC';\n if (timezoneAware && timezoneName) {\n timezone = timezoneName;\n }\n sundial.checkTimezoneName(timezone);\n return timezone;\n } catch (err) {\n return 'UTC';\n }\n}\n\n/**\n * formatBirthdate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted birthdate, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatBirthdate(patient) {\n const bday = _.get(patient, ['profile', 'patient', 'birthday'], '');\n if (bday) {\n return utcFormat('%b %-d, %Y')(Date.parse(bday));\n }\n return '';\n}\n\n/**\n * formatClocktimeFromMsPer24\n * @param {Number} duration - positive integer representing a time of day\n * in milliseconds within a 24-hr day\n * @param {String} [format] - optional moment display format string; default is 'h:mm a'\n *\n * @return {String} formatted clocktime, e.g., '12:05 pm'\n */\nexport function formatClocktimeFromMsPer24(milliseconds, format = 'h:mm a') {\n if (_.isNull(milliseconds) || _.isUndefined(milliseconds) ||\n milliseconds < 0 || milliseconds > TWENTY_FOUR_HRS || milliseconds instanceof Date) {\n throw new Error('First argument must be a value in milliseconds per twenty-four hour day!');\n }\n return moment.utc(milliseconds).format(format);\n}\n\n/**\n * formatCurrentDate\n * @return {String} formatted current date, e.g., 'Jul 4, 2017';\n */\nexport function formatCurrentDate() {\n return timeFormat('%b %-d, %Y')(new Date());\n}\n\n/**\n * formatDiagnosisDate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted diagnosis date, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatDiagnosisDate(patient) {\n const diagnosis = _.get(patient, ['profile', 'patient', 'diagnosisDate'], '');\n if (diagnosis) {\n return utcFormat('%b %-d, %Y')(Date.parse(diagnosis));\n }\n return '';\n}\n\n/**\n * formatDateRange\n * @param {String|Date} startDate - A moment-compatible date object or string\n * @param {String|Date} endDate - A moment-compatible date object or string\n * @param {String} format - Optional. The moment format string to parse startDate and endDate with\n */\nexport function formatDateRange(startDate, endDate, dateParseFormat, monthFormat = 'MMM') {\n const start = moment.utc(startDate, dateParseFormat);\n const end = moment.utc(endDate, dateParseFormat);\n\n const isSameYear = start.isSame(end, 'year');\n const isSameDay = start.isSame(end, 'day');\n const startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = isSameDay ? endFormat : `${startFormat} - ${endFormat}`;\n\n return formattedRange;\n}\n\n/**\n * formatDuration\n * @param {Number} duration - positive integer duration in milliseconds\n * @param {String} format - one of [hoursFractional, condensed]\n * @return {String} formatted duration, e.g., '1¼ hr'\n */\nexport function formatDuration(duration, opts = {}) {\n const momentDuration = moment.duration(duration);\n const days = momentDuration.days();\n const hours = momentDuration.hours();\n const minutes = momentDuration.minutes();\n const seconds = momentDuration.seconds();\n\n const QUARTER = opts.ascii ? ' 1/4' : '¼';\n const THIRD = opts.ascii ? ' 1/3' : '⅓';\n const HALF = opts.ascii ? ' 1/2' : '½';\n const TWO_THIRDS = opts.ascii ? ' 2/3' : '⅔';\n const THREE_QUARTERS = opts.ascii ? ' 3/4' : '¾';\n\n if (opts.condensed) {\n const formatted = {\n days: '',\n hours: '',\n minutes: '',\n seconds: '',\n };\n\n if (days + hours + minutes === 0) {\n // Less than a minute\n if (seconds > 0) {\n formatted.seconds = `${seconds}s`;\n } else {\n formatted.minutes = '0m';\n }\n } else {\n let roundedMinutes = seconds >= 30 ? minutes + 1 : minutes;\n let roundedHours = hours;\n let roundedDays = days;\n\n if (roundedMinutes >= 60) {\n roundedMinutes = roundedMinutes - 60;\n roundedHours++;\n }\n\n if (roundedHours >= 24) {\n roundedHours = roundedHours - 24;\n roundedDays++;\n }\n\n formatted.days = roundedDays !== 0 ? `${roundedDays}d ` : '';\n formatted.hours = roundedHours !== 0 ? `${roundedHours}h ` : '';\n formatted.minutes = roundedMinutes !== 0 ? `${roundedMinutes}m ` : '';\n }\n\n return `${formatted.days}${formatted.hours}${formatted.minutes}${formatted.seconds}`.trim();\n } else if (hours !== 0) {\n const suffix = (hours === 1) ? 'hr' : 'hrs';\n switch (minutes) {\n case 0:\n return `${hours} ${suffix}`;\n case 15:\n return `${hours}${QUARTER} ${suffix}`;\n case 20:\n return `${hours}${THIRD} ${suffix}`;\n case 30:\n return `${hours}${HALF} ${suffix}`;\n case 40:\n return `${hours}${TWO_THIRDS} ${suffix}`;\n case 45:\n return `${hours}${THREE_QUARTERS} ${suffix}`;\n default:\n return `${hours} ${suffix} ${minutes} min`;\n }\n } else {\n return `${minutes} min`;\n }\n}\n\n/**\n * formatLocalizedFromUTC\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} [format] - optional moment display format string; default is 'dddd, MMMM D'\n *\n * @return {String} formatted datetime, e.g., 'Sunday, January 1'\n */\nexport function formatLocalizedFromUTC(utc, timePrefs, format = 'dddd, MMMM D') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n return moment.utc(utc).tz(timezone).format(format);\n}\n\n/**\n * getLocalizedCeiling\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} period - the period to round the timestamp to the ceiling of\n *\n * @return {Object} a JavaScript Date, the start of the next closes period according timePrefs;\n * If period is 'day', this fn returns the closest future midnight\n * If period is 'hour', this fn returns the start of the closest future hour\n * if utc is already local midnight, returns utc\n */\nexport function getLocalizedCeiling(utc, timePrefs, period = 'day') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n if (!_.includes(['day', 'hour'], period)) {\n throw new Error('`period` must be either \"day\" or \"hour\"');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const startOfPeriod = moment.utc(utc)\n .tz(timezone)\n .startOf(period);\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfPeriod.valueOf() === utcHammertime) {\n return startOfPeriod.toDate();\n }\n return startOfPeriod.add(1, period).toDate();\n}\n\n/**\n * formatTimeAgo\n *\n * @param {String|Date} utc - A moment-compatible date object or string\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} format - Optional. The moment format string to use for dates beyond 30 days ago\n *\n * @return {Object} Object containing the formatted time ago string, and the calculated days ago as an integer\n */\nexport const formatTimeAgo = (utc, timePrefs, format = 'YYYY-MM-DD') => {\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const endOfToday = moment.utc(getLocalizedCeiling(new Date().toISOString(), timePrefs)).tz(timezone);\n const endOfProvidedDay = moment.utc(getLocalizedCeiling(utc, timePrefs)).tz(timezone);\n const daysAgo = endOfToday.diff(endOfProvidedDay, 'days', true);\n const minutesAgo = moment.utc().tz(timezone).diff(utc, 'minutes');\n const hoursAgo = moment.utc().tz(timezone).diff(utc, 'hours');\n const lastUploadDateMoment = moment.utc(utc).tz(timezone);\n let daysText = lastUploadDateMoment.format(format);\n\n if (daysAgo < 2) {\n daysText = (daysAgo >= 1) ? t('yesterday') : t('today');\n } else if (daysAgo <= 30) {\n daysText = t('{{days}} days ago', { days: Math.ceil(daysAgo) });\n }\n\n const hoursText = t('{{hoursAgo}} {{unit}} ago', { hoursAgo, unit: hoursAgo === 1 ? 'hour' : 'hours' });\n\n let minutesText = t('{{minutesAgo}} {{unit}} ago', { minutesAgo, unit: minutesAgo === 1 ? 'minute' : 'minutes' });\n if (minutesAgo < 1) minutesText = t('a few seconds ago');\n\n return {\n daysAgo,\n daysText,\n hoursAgo,\n hoursText,\n minutesAgo,\n minutesText,\n };\n};\n","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\n settingsOverrides,\n} from './constants';\n\nimport { deviceName } from './settings/data';\n\n/**\n * Get the latest upload datum\n * @param {Array} uploadData Array of Tidepool upload data\n * @returns {Object} The latest upload datum\n */\nexport function getLatestPumpUpload(uploadData = []) {\n return _.findLast(uploadData, { deviceTags: ['insulin-pump'] });\n}\n\n/**\n * Get the latest manual basal schedule name from an array of basal data\n * @param {Array} basalData Array of Tidepool basal data\n * @returns {Object} The latest manual basal schedule name, else undefined\n */\nexport function getLastManualBasalSchedule(basalData = []) {\n const lastManualBasal = _.findLast(basalData, { deliveryType: 'scheduled' });\n return _.get(lastManualBasal, 'scheduleName');\n}\n\n/**\n * Check to see if datum is from DIY Loop\n */\nexport function isDIYLoop(datum = {}) {\n return (/^com\\.[a-zA-Z0-9]*\\.?loopkit\\.Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Tidepool Loop\n*/\nexport function isTidepoolLoop(datum = {}) {\n return (/^org\\.tidepool\\.[a-zA-Z0-9]*\\.?Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Twiist Loop\n*/\nexport function isTwiistLoop(datum = {}) {\n if (datum.type === 'upload') {\n const majorVersion = parseInt(_.get(datum, 'client.version', '0').split('.')[0], 10);\n return (/^com.sequelmedtech.tidepool-service/).test(_.get(datum, 'client.name', '')) && majorVersion >= 2;\n }\n return (/^com.dekaresearch.twiist/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Control-IQ\n */\nexport function isControlIQ(datum = {}) {\n return _.get(datum, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check to see if datum is from LibreView API\n */\nexport function isLibreViewAPI(datum = {}) {\n const TARGET = 'org.tidepool.abbott.libreview.partner.api';\n return datum?.client?.name === TARGET || datum?.origin?.name === TARGET;\n}\n\n/**\n * Check to see if datum is from a known Loop device\n */\nexport function isLoop(datum = {}) {\n return datum.tags?.loop || isDIYLoop(datum) || isTidepoolLoop(datum) || isTwiistLoop(datum);\n}\n\n/**\n * Check if the provided datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettingsOrUpload = {}, deviceModel) {\n return _.includes(_.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []), deviceModel)\n || (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isDIYLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a 1-minute CGM sample interval device\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isOneMinCGMSampleIntervalDevice(pumpSettingsOrUpload = {}) {\n return isTwiistLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Get the uppercased manufacturer name\n * @param {String} manufacturer Manufacturer name\n */\nexport function getUppercasedManufacturer(manufacturer = '') {\n return _.map(manufacturer.split(' '), part => {\n switch (part) {\n case 'diy':\n return _.upperCase(part);\n case 'twiist':\n return part;\n default:\n return _.upperFirst(part);\n }\n }).join(' ');\n}\n\n/**\n * Get a list of standard settings overrides for a settings-overrideable device,\n * with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Array} settings overrides\n */\nexport function getSettingsOverrides(manufacturer) {\n return _.get(settingsOverrides, getUppercasedManufacturer(manufacturer), settingsOverrides.default);\n}\n\n/**\n * Get a pump terminology vocabulary, with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Object} pump vocabulary\n */\nexport function getPumpVocabulary(manufacturer) {\n const vocabulary = _.cloneDeep(pumpVocabulary);\n return _.defaults(\n _.get(vocabulary, getUppercasedManufacturer(manufacturer), {}),\n vocabulary.default\n );\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/format.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n * 1c. This set of utilities is ONLY for NON-datetime related formatting. Any functions\n * used for formatting dates and/or times should go in src/utils/datetime.js\n *\n * 2. Function naming scheme: the main verb here is `format`. Start all function names with that.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `bgPrefs`) rather than some (subset) of bgUnits and/or bgBounds\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\nimport { format } from 'd3-format';\nimport { convertToMmolL } from './bloodglucose';\nimport { BG_HIGH, BG_LOW, MMOLL_UNITS } from './constants';\n\n/**\n * bankersRound\n *\n * Rounding with balanced tie-breaking to reduce upward bias in rounding by rounding the midway\n * point digit (x.5) to the nearest even number, rather than always upwards.\n * ref: https://stackoverflow.com/a/49080858\n *\n * Used as default rounding in AGP reports.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function bankersRound(value, precision = 0) {\n /* eslint-disable no-nested-ternary */\n const x = value * (10 ** precision);\n const r = Math.round(x);\n const br = Math.abs(x) % 1 === 0.5 ? (r % 2 === 0 ? r : r - 1) : r;\n return br / (10 ** precision);\n /* eslint-enable no-nested-ternary */\n}\n\n/**\n * precisionRound\n *\n * Rounding numbers to desired precison.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function precisionRound(value, precision = 0) {\n const shift = precision > 0 ? 10 ** precision : 1;\n return Math.round(value * shift) / shift;\n}\n\n/**\n * formatBgValue\n * @param {Number} val - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {Object} bgPrefs - object containing bgUnits String and bgBounds Object\n * @param {Object} [outOfRangeThresholds] - optional thresholds for `low` and `high` values;\n * derived from annotations in PwD's data, so may not exist\n *\n * @return {String} formatted blood glucose value\n */\nexport function formatBgValue(val, bgPrefs, outOfRangeThresholds) {\n const units = _.get(bgPrefs, 'bgUnits', '');\n\n if (!_.isEmpty(outOfRangeThresholds)) {\n let lowThreshold = outOfRangeThresholds.low;\n let highThreshold = outOfRangeThresholds.high;\n\n if (units === MMOLL_UNITS) {\n if (lowThreshold) {\n lowThreshold = convertToMmolL(lowThreshold);\n }\n if (highThreshold) {\n highThreshold = convertToMmolL(highThreshold);\n }\n }\n if (lowThreshold && val < lowThreshold) {\n return BG_LOW;\n }\n if (highThreshold && val > highThreshold) {\n return BG_HIGH;\n }\n }\n\n if (units === MMOLL_UNITS) {\n return bankersRound(val, 1).toFixed(1);\n }\n\n return bankersRound(val).toString();\n}\n\n/**\n * formatDecimalNumber\n *\n * This (and all d3-format methods) is to format numbers for localized human display.\n * To use rounded results in calculations, use the `precisionRound` utility\n *\n * @param {Number} val - numeric value to format\n * @param {Number} [places] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {String} numeric value rounded to the desired number of decimal places\n */\nexport function formatDecimalNumber(val, places) {\n if (places === null || places === undefined) {\n return format('d')(val);\n }\n return format(`.${places}f`)(val);\n}\n\n/**\n * formatInsulin\n *\n * @export\n * @param {Number} val - numeric value to format\n * @returns {String} numeric value formatted for the precision of insulin dosing\n */\nexport function formatInsulin(val) {\n let decimalLength = 1;\n const qtyString = val.toString();\n if (qtyString.indexOf('.') !== -1) {\n const length = qtyString.split('.')[1].length;\n decimalLength = _.min([length, 3]);\n }\n return formatDecimalNumber(val, decimalLength);\n}\n\n/**\n * formatPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatPercentage(val, precision = 0, useAGPFormat) {\n if (Number.isNaN(val)) {\n return '--%';\n }\n return useAGPFormat\n ? `${bankersRound(val * 100, precision)}%`\n : format(`.${precision}%`)(val);\n}\n\n/**\n * formatStatsPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatStatsPercentage(value) {\n if (Number.isNaN(value)) return '--';\n\n const percentage = value * 100;\n\n // Round to one decimal place if below 1, and zero decimal places if above 1;\n const precision = percentage >= 1 ? 0 : 1;\n const roundedValue = bankersRound(percentage, precision);\n\n return _.toString(roundedValue);\n}\n\n/**\n * removeTrailingZeroes\n * @param {String} - formatted decimal value, may have trailing zeroes\n *\n * @return {String} - formatted decimal value w/o trailing zero-indexes\n */\nexport function removeTrailingZeroes(val) {\n return val.replace(/\\.0+$/, '');\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary, isControlIQ, isLoop } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n} from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\nconst BASAL_RATE_PRECISION_PLACES = 3;\nconst MAX_BASAL_RATE_PRECISION_PLACES = 2;\n\n/**\n * noData\n * @param {ANY} val value to check\n *\n * @return {Boolean} true if value is defined, not null, not empty string, false otherwise\n */\nexport function noData(val) {\n return val == null || (typeof val === 'string' && _.isEmpty(val));\n}\n\n/**\n * deviceName\n * @param {String} manufacturer one of: animas, insulet, medtronic, tandem, microtech, loop\n *\n * @return {String} name for given manufacturer\n */\nexport function deviceName(manufacturer) {\n const DEVICE_DISPLAY_NAME_BY_MANUFACTURER = {\n animas: 'Animas',\n insulet: 'OmniPod',\n medtronic: 'Medtronic',\n tandem: 'Tandem',\n microtech: 'Equil',\n 'diy loop': 'DIY Loop',\n 'tidepool loop': 'Tidepool Loop',\n twiist: 'twiist',\n };\n return DEVICE_DISPLAY_NAME_BY_MANUFACTURER[manufacturer] || manufacturer;\n}\n\n/**\n * getBasalRate\n * @private\n * @param {Array} scheduleData basal schedule\n * @param {Number} startTime milliseconds from start of day\n * @return {String} formatted basal rate\n */\nfunction getBasalRate(scheduleData, startTime) {\n const rate = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n ).rate;\n\n if (noData(rate)) {\n return '';\n }\n return format.formatDecimalNumber(rate, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search for\n * @param {Number} startTime milliseconds from start of day\n *\n * @return {String} value of field for startTime\n */\nfunction getValue(scheduleData, fieldName, startTime) {\n const val = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n )[fieldName];\n\n if (noData(val)) {\n return '';\n }\n return val;\n}\n\n/**\n * getBloodGlucoseValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search format\n * @param {Number} startTime milliseconds from start of day\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n *\n * @return {String} formatted blood glucose value\n */\nfunction getBloodGlucoseValue(scheduleData, fieldName, startTime, units) {\n const bgValue = getValue(scheduleData, fieldName, startTime);\n if (noData(bgValue)) {\n return '';\n }\n return format.formatBgValue(bgValue, { bgUnits: units });\n}\n\n/**\n * getStarts\n * @private\n * @param {Array} timedData array with time based data\n *\n * @return {Array} array of start times in milliseconds\n */\nfunction getStarts(timedData) {\n return _.map(timedData, 'start');\n}\n\n/**\n * getTotalBasalRates\n * @param {Array} scheduleData basal schedule data\n *\n * @return {String} formatted total of basal rates\n */\nexport function getTotalBasalRates(scheduleData) {\n const HOUR_IN_MILLISECONDS = 60 * 60 * 1000;\n const DAY_IN_MILLISECONDS = 86400000;\n\n let total = 0;\n for (let i = scheduleData.length - 1; i >= 0; i--) {\n const start = scheduleData[i].start;\n let finish = DAY_IN_MILLISECONDS;\n const next = i + 1;\n if (next < scheduleData.length) {\n finish = scheduleData[next].start;\n }\n const hrs = (finish - start) / HOUR_IN_MILLISECONDS;\n const amount = parseFloat(scheduleData[i].rate.toFixed(BASAL_RATE_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(BASAL_RATE_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getScheduleLabel\n * @param {String} scheduleName basal schedule name\n * @param {String} activeName name of active basal schedule at time of upload\n * @param {String} deviceKey one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {Boolean} noUnits whether units should be included in label object\n *\n * @return {Object} object representing basal schedule label\n */\nexport function getScheduleLabel(scheduleName, activeName, deviceKey, noUnits) {\n const CAPITALIZED = ['carelink', 'medtronic'];\n let displayName = scheduleName;\n if (_.includes(CAPITALIZED, deviceKey)) {\n displayName = _.map(scheduleName.split(' '), (part) => (_.upperFirst(part))).join(' ');\n }\n return {\n main: displayName,\n secondary: scheduleName === activeName ? 'Active at upload' : '',\n units: noUnits ? '' : 'U/hr',\n };\n}\n\n/**\n * getScheduleNames\n * @param {Object} settingsData object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function getScheduleNames(settingsData) {\n return _.keysIn(settingsData);\n}\n\n/**\n * getTimedSchedules\n * @param {Array} settingsData array of basal schedules\n *\n * @return {Array} array of {name, position} basal objects\n */\nexport function getTimedSchedules(settingsData) {\n const names = _.map(settingsData, 'name');\n const schedules = [];\n for (let i = names.length - 1; i >= 0; i--) {\n schedules.push({ name: names[i], position: i });\n }\n return schedules;\n}\n\n/**\n * getDeviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function getDeviceMeta(settingsData = {}, timePrefs) {\n const utc = settingsData.normalTime;\n const uploadedTime = utc ?\n datetime.formatLocalizedFromUTC(utc, timePrefs, 'MMM D, YYYY') :\n false;\n return {\n schedule: settingsData.activeSchedule || 'unknown',\n uploaded: uploadedTime || 'unknown',\n serial: settingsData.deviceSerialNumber || 'unknown',\n };\n}\n\n/**\n * processBasalRateData\n * @param {Object} scheduleData basal schedule object\n *\n * @return {Array} array of formatted schedule entries\n */\nexport function processBasalRateData(scheduleData) {\n const starts = getStarts(scheduleData.value);\n const noRateData = [{ start: '-', rate: '-' }];\n\n if (starts.length === 0) {\n return noRateData;\n } else if (starts.length === 1) {\n if (Number(getBasalRate(scheduleData.value, starts[0])) === 0) {\n return noRateData;\n }\n }\n\n const data = _.map(starts, (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n scheduleData.value,\n startTime\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(scheduleData.value),\n });\n return data;\n}\n\n/**\n * processBgTargetData\n * @param {Array} targetsData array of blood glucose targets\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Object} keys key names as {columnTwo, columnThree}\n *\n * @return {Array} formatted bloog glucose target data\n */\nexport function processBgTargetData(targetsData, bgUnits, keys) {\n return _.map(getStarts(targetsData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n columnTwo: getBloodGlucoseValue(\n targetsData,\n keys.columnTwo,\n startTime,\n bgUnits\n ),\n columnThree: getBloodGlucoseValue(\n targetsData,\n keys.columnThree,\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processCarbRatioData\n * @param {Array} carbRatioData array of carb ratio data\n *\n * @return {Array} array of formatted carb ratio objects\n */\nexport function processCarbRatioData(carbRatioData) {\n return _.map(getStarts(carbRatioData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getValue(\n carbRatioData,\n 'amount',\n startTime\n ),\n }));\n}\n\n/**\n * processSensitivityData\n * @param {Array} sensitivityData array of sensitivity data\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted sensitivity objects\n */\nexport function processSensitivityData(sensitivityData, bgUnits) {\n return _.map(getStarts(sensitivityData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getBloodGlucoseValue(\n sensitivityData,\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processTimedSettings\n * @param {Object} pumpSettings entire pump settings object\n * @param {Object} schedule {name, position} schedule object\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted objects with\n * {start, rate, bgTarget, carbRatio, insulinSensitivity}\n */\nexport function processTimedSettings(pumpSettings, schedule, bgUnits) {\n const data = _.map(getStarts(pumpSettings.bgTargets[schedule.name]), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n pumpSettings.basalSchedules[schedule.position].value,\n startTime\n ),\n bgTarget: getBloodGlucoseValue(\n pumpSettings.bgTargets[schedule.name],\n 'target',\n startTime,\n bgUnits\n ),\n carbRatio: getValue(\n pumpSettings.carbRatios[schedule.name],\n 'amount',\n startTime\n ),\n insulinSensitivity: getBloodGlucoseValue(\n pumpSettings.insulinSensitivities[schedule.name],\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(\n pumpSettings.basalSchedules[schedule.position].value\n ),\n bgTarget: '',\n carbRatio: '',\n insulinSensitivity: '',\n });\n return data;\n}\n\n/**\n * startTimeAndValue\n * @param {TYPE} accessor key for value displayed in this column\n *\n * @return {Array} array of objects describing table columns\n */\nexport function startTimeAndValue(valueKey) {\n return [\n { key: 'start', label: 'Start time' },\n { key: valueKey, label: 'Value' },\n ];\n}\n\n/**\n * insulinSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\n const bgUnits = settings?.units?.bg;\n const deviceLabels = getPumpVocabulary(manufacturer);\n const maxBasal = _.get(settings, scheduleName ? `basal[${scheduleName}].rateMaximum.value` : 'basal.rateMaximum.value');\n const maxBolus = _.get(settings, scheduleName ? `bolus[${scheduleName}].amountMaximum.value` : 'bolus.amountMaximum.value');\n let insulinDurationUnits = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.units` : 'bolus.calculator.insulin.units');\n let insulinDuration = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.duration` : 'bolus.calculator.insulin.duration');\n\n if (_.includes(['diy loop', 'tidepool loop', 'twiist'], manufacturer)) {\n insulinDuration = _.get(settings, 'insulinModel.actionDuration');\n insulinDurationUnits = 'milliseconds';\n }\n\n const columns = [\n { key: 'setting' },\n { key: 'value' },\n ];\n\n if (insulinDurationUnits === 'minutes') {\n const durationInHours = Math.floor(insulinDuration / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n if (insulinDurationUnits === 'milliseconds') {\n const durationInHours = Math.floor(insulinDuration / 60 / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${format.formatDecimalNumber(maxBasal, MAX_BASAL_RATE_PRECISION_PLACES)} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION] + (isControlIQ(settings) ? '*' : ''), value: insulinDuration ? `${insulinDuration} hrs` : '-' },\n ];\n\n if (isLoop(settings)) {\n const insulinModelLabels = {\n rapidAdult: t('Rapid-Acting - Adults'),\n rapidChild: t('Rapid Acting - Children'),\n fiasp: t('Fiasp'),\n lyumjev: t('Lyumjev'),\n afrezza: t('Afrezza'),\n };\n\n const insulinModel = {\n label: insulinModelLabels[settings?.insulinModel?.modelType] || settings?.insulinModel?.modelType || t('Unknown'),\n peakMinutes: _.isFinite(settings?.insulinModel?.actionPeakOffset) ? settings.insulinModel.actionPeakOffset / 60 : null,\n };\n\n const device = deviceName(manufacturer);\n\n const insulinModelAnnotations = [\n t('{{device}} assumes that the insulin it has delivered is actively working to lower your glucose for 6 hours. This setting cannot be changed.', { device }),\n ];\n\n if (insulinModel.peakMinutes) insulinModelAnnotations.push(t('The {{label}} model assumes peak activity at {{peakMinutes}} minutes.', insulinModel));\n\n rows.unshift({\n annotations: [t('{{device}} will deliver basal and recommend bolus insulin only if your glucose is predicted to be above this limit for the next three hours.', { device })],\n setting: t('Glucose Safety Limit'),\n value: `${format.formatBgValue(settings?.bgSafetyLimit, { bgUnits })} ${bgUnits}`,\n });\n\n rows.splice(3, 1, {\n annotations: insulinModelAnnotations,\n setting: t('Insulin Model'),\n value: insulinModel.label,\n });\n }\n\n // Tandem insulin settings do not have max basal\n if (manufacturer === 'tandem') rows.shift();\n\n return {\n columns,\n rows,\n };\n}\n\n/**\n * presetSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: tidepool loop, diy loop, twiist\n */\nexport function presetSettings(settings, manufacturer) {\n const deviceLabels = getPumpVocabulary(manufacturer);\n const bgUnits = settings?.units?.bg;\n const correctionRange = range => `${format.formatBgValue(range?.low, { bgUnits })}-${format.formatBgValue(range?.high, { bgUnits })}`;\n\n const columns = [\n { key: 'name', label: 'Name' },\n { key: 'value', label: `${t('Correction Range')} (${bgUnits})` },\n ];\n\n const rows = [];\n if (settings?.bgTargetPreprandial) rows.push({ name: deviceLabels[PREPRANDIAL]?.label, value: correctionRange(settings?.bgTargetPreprandial) });\n if (settings?.bgTargetPhysicalActivity) rows.push({ name: deviceLabels[PHYSICAL_ACTIVITY]?.label, value: correctionRange(settings?.bgTargetPhysicalActivity) });\n\n return {\n columns,\n rows,\n };\n}\n","import _ from 'lodash';\nimport React from 'react';\nimport i18next from 'i18next';\n\nimport {\n generateBgRangeLabels,\n classifyBgValue,\n classifyCvValue,\n reshapeBgClassesToBgBounds,\n} from './bloodglucose';\n\nimport {\n AUTOMATED_DELIVERY,\n BG_COLORS,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n} from './constants';\n\nimport { getPumpVocabulary, getSettingsOverrides } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue, formatStatsPercentage } from './format';\nimport { formatDuration } from './datetime';\n\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const dailyDoseUnitOptions = [\n {\n label: 'kg',\n value: 'kg',\n },\n {\n label: 'lb',\n value: 'lb',\n },\n];\n\nexport const statTypes = {\n barHorizontal: 'barHorizontal',\n barBg: 'barBg',\n input: 'input',\n simple: 'simple',\n};\n\nexport const statBgSourceLabels = {\n cbg: t('CGM'),\n smbg: t('BGM'),\n};\n\nexport const statFormats = {\n bgCount: 'bgCount',\n bgRange: 'bgRange',\n bgValue: 'bgValue',\n cv: 'cv',\n carbs: 'carbs',\n duration: 'duration',\n gmi: 'gmi',\n percentage: 'percentage',\n standardDevRange: 'standardDevRange',\n standardDevValue: 'standardDevValue',\n units: 'units',\n unitsPerKg: 'unitsPerKg',\n};\n\nexport const commonStats = {\n averageGlucose: 'averageGlucose',\n averageDailyDose: 'averageDailyDose',\n bgExtents: 'bgExtents',\n carbs: 'carbs',\n coefficientOfVariation: 'coefficientOfVariation',\n glucoseManagementIndicator: 'glucoseManagementIndicator',\n readingsInRange: 'readingsInRange',\n sensorUsage: 'sensorUsage',\n standardDev: 'standardDev',\n timeInAuto: 'timeInAuto',\n timeInOverride: 'timeInOverride',\n timeInRange: 'timeInRange',\n totalInsulin: 'totalInsulin',\n};\n\nexport const statFetchMethods = {\n [commonStats.averageGlucose]: 'getAverageGlucoseData',\n [commonStats.averageDailyDose]: 'getTotalInsulinData',\n [commonStats.bgExtents]: 'getBgExtentsData',\n [commonStats.carbs]: 'getCarbsData',\n [commonStats.coefficientOfVariation]: 'getCoefficientOfVariationData',\n [commonStats.glucoseManagementIndicator]: 'getGlucoseManagementIndicatorData',\n [commonStats.readingsInRange]: 'getReadingsInRangeData',\n [commonStats.sensorUsage]: 'getSensorUsage',\n [commonStats.standardDev]: 'getStandardDevData',\n [commonStats.timeInAuto]: 'getTimeInAutoData',\n [commonStats.timeInOverride]: 'getTimeInOverrideData',\n [commonStats.timeInRange]: 'getTimeInRangeData',\n [commonStats.totalInsulin]: 'getBasalBolusData',\n};\n\nexport const getSum = data => _.sum(_.map(data, d => _.max([d.value, 0])));\n\nexport const ensureNumeric = value => (_.isNil(value) || _.isNaN(value) ? -1 : parseFloat(value));\n\nexport const isRangeDefined = value => ensureNumeric(value) > -1;\n\nexport const formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = _.isFinite(datum) ? datum : datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n const {\n bgPrefs,\n data,\n useAGPFormat,\n emptyDataPlaceholder = '--',\n forcePlainTextValues = false,\n } = opts;\n\n const total = _.get(data, 'total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = emptyDataPlaceholder;\n };\n\n switch (format) {\n case statFormats.bgCount:\n if (value >= 0) {\n const precision = value < 0.05 ? 2 : 1;\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value = +value.toFixed(precision);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.bgRange:\n value = generateBgRangeLabels(bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, value, 'threeWay');\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.carbs:\n if (_.isPlainObject(value) && (value.grams > 0 || value.exchanges > 0)) {\n const { grams, exchanges } = value;\n value = [];\n suffix = [];\n if (grams > 0) {\n value.push(formatDecimalNumber(grams));\n suffix.push('g');\n }\n if (exchanges > 0) {\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value.push(+formatDecimalNumber(exchanges, 1));\n suffix.push('exch');\n }\n } else {\n disableStat();\n }\n break;\n\n case statFormats.cv:\n if (value >= 0) {\n id = classifyCvValue(value);\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.duration:\n if (value >= 0) {\n value = formatDuration(value, { condensed: true });\n } else {\n disableStat();\n }\n break;\n\n case statFormats.gmi:\n if (value >= 0) {\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value, 1);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.percentage:\n if (total && total >= 0) {\n value = _.max([value, 0]);\n value = formatStatsPercentage(value / total);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevRange:\n deviation = _.get(datum, 'deviation.value', -1);\n if (value >= 0 && deviation >= 0) {\n lowerValue = value - deviation;\n lowerColorId = lowerValue >= 0\n ? classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, lowerValue, 'threeWay')\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, upperValue, 'threeWay');\n\n lowerValue = formatBgValue(lowerValue, bgPrefs);\n upperValue = formatBgValue(upperValue, bgPrefs);\n\n value = !forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n - \n <span style={{\n color: BG_COLORS[upperColorId],\n }}>\n {upperValue}\n </span>\n </span>\n ) : `${lowerValue}-${upperValue}`;\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevValue:\n if (value >= 0) {\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.units:\n if (value >= 0) {\n value = formatDecimalNumber(value, 1);\n suffix = 'U';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.unitsPerKg:\n if (suffix === 'lb') {\n value = value * LBS_PER_KG;\n }\n suffix = 'U/kg';\n if (value > 0 && _.isFinite(value)) {\n value = formatDecimalNumber(value, 2);\n } else {\n disableStat();\n }\n break;\n\n default:\n break;\n }\n\n return {\n id,\n value,\n suffix,\n };\n};\n\nexport const getStatAnnotations = (data, type, opts = {}) => {\n const { bgSource, days, manufacturer } = opts;\n const vocabulary = getPumpVocabulary(manufacturer);\n const labels = { overrideLabel: vocabulary[SETTINGS_OVERRIDE], overrideLabelLowerCase: _.lowerCase(vocabulary[SETTINGS_OVERRIDE]) };\n\n const annotations = [];\n\n const bgStats = [\n commonStats.averageGlucose,\n commonStats.coefficientOfVariation,\n commonStats.glucoseManagementIndicator,\n commonStats.readingsInRange,\n commonStats.timeInRange,\n commonStats.standardDev,\n ];\n\n switch (type) {\n case commonStats.averageGlucose:\n annotations.push(t('**Avg. Glucose ({{bgSourceLabel}}):** All {{bgSourceLabel}} glucose values added together, divided by the number of readings.', { bgSourceLabel: statBgSourceLabels[bgSource] }));\n break;\n\n case commonStats.averageDailyDose:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data.'));\n } else {\n annotations.push(t('**Daily Insulin:** All basal and bolus insulin delivery (in Units) added together.'));\n }\n break;\n\n case commonStats.carbs:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Carbs**: All carb entries added together, then divided by the number of days in this view for which we have carb data. Note, these entries come from either bolus wizard events, or Apple Health records.'));\n } else {\n annotations.push(t('**Total Carbs**: All carb entries from bolus wizard events or Apple Health records added together.'));\n }\n annotations.push(t('Derived from _**{{total}}**_ carb entries.', { total: data.total }));\n break;\n\n case commonStats.coefficientOfVariation:\n annotations.push(t('**CV (Coefficient of Variation):** How far apart (wide) glucose values are; research suggests a target of 36% or lower.'));\n break;\n\n case commonStats.glucoseManagementIndicator:\n annotations.push(t('**GMI (Glucose Management Indicator):** Tells you what your approximate A1C level is likely to be, based on the average glucose level from your CGM readings.'));\n break;\n\n case commonStats.readingsInRange:\n annotations.push(t('**Readings In Range:** Daily average of the number of {{smbgLabel}} readings.', { smbgLabel: statBgSourceLabels.smbg }));\n break;\n\n case commonStats.sensorUsage:\n annotations.push(t('**Sensor Usage:** Time the {{cbgLabel}} collected data, divided by the total time represented in this view.', { cbgLabel: statBgSourceLabels.cbg }));\n break;\n\n case commonStats.standardDev:\n annotations.push(t('**SD (Standard Deviation):** How far values are from the average.'));\n break;\n\n case commonStats.timeInAuto:\n if (days > 1) {\n annotations.push(t('**Time In {{automatedLabel}}:** Daily average of the time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n } else {\n annotations.push(t('**Time In {{automatedLabel}}:** Time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is total duration of time in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n }\n break;\n\n case commonStats.timeInOverride:\n if (days > 1) {\n annotations.push(t('**Time In {{overrideLabel}}:** Daily average of the time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabelLowerCase}}.', labels));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabelLowerCase}}.', labels));\n }\n break;\n\n case commonStats.timeInRange:\n if (days > 1) {\n annotations.push(t('**Time In Range:** Daily average of the time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is 24 hours multiplied by % in range.'));\n } else {\n annotations.push(t('**Time In Range:** Time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is number of readings in range multiplied by the {{cbgLabel}} sample frequency.', { cbgLabel: statBgSourceLabels.cbg }));\n }\n break;\n\n case commonStats.totalInsulin:\n if (days > 1) {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data'));\n } else {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together'));\n }\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the respective total of basal or bolus delivery divided by total insulin delivered for the time period for which we have insulin data.'));\n break;\n\n default:\n break;\n }\n\n if (data.insufficientData) {\n annotations.push(t('**Why is this stat empty?**\\n\\nThere is not enough data present in this view to calculate it.'));\n } else if (_.includes(bgStats, type)) {\n if (bgSource === 'smbg') {\n annotations.push(t('Derived from _**{{total}}**_ {{smbgLabel}} readings.', { total: _.get(data, 'counts.total', data.total), smbgLabel: statBgSourceLabels.smbg }));\n }\n }\n\n return annotations;\n};\n\nexport const getStatData = (data, type, opts = {}) => {\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const settingsOverrides = getSettingsOverrides(opts.manufacturer);\n const bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\n\n const readingsInRangeDataPath = opts.days > 1 ? 'dailyAverages' : 'counts';\n\n switch (type) {\n case commonStats.averageGlucose:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.averageDailyDose:\n statData.data = [\n {\n id: 'insulin',\n input: {\n id: 'weight',\n label: 'Weight',\n suffix: {\n id: 'units',\n options: dailyDoseUnitOptions,\n value: opts.suffixValue || dailyDoseUnitOptions[0],\n },\n type: 'number',\n value: opts.inputValue ? ensureNumeric(opts.inputValue) : undefined,\n },\n output: {\n label: 'Daily Dose ÷ Weight',\n type: 'divisor',\n dataPaths: {\n dividend: 'data.0',\n },\n },\n value: ensureNumeric(data.totalInsulin),\n },\n ];\n\n statData.dataPaths = {\n input: 'data.0.input',\n output: 'data.0.output',\n summary: 'data.0',\n };\n break;\n\n case commonStats.bgExtents:\n statData.data = [\n {\n id: 'bgMax',\n value: ensureNumeric(data.bgMax),\n title: t('Max BG'),\n },\n {\n id: 'bgMin',\n value: ensureNumeric(data.bgMin),\n title: t('Min BG'),\n },\n ];\n break;\n\n case commonStats.carbs:\n statData.data = [\n {\n value: {\n grams: ensureNumeric(_.get(data, 'carbs.grams')),\n exchanges: ensureNumeric(_.get(data, 'carbs.exchanges')),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.coefficientOfVariation:\n statData.data = [\n {\n id: 'cv',\n value: ensureNumeric(data.coefficientOfVariation),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.glucoseManagementIndicator:\n statData.data = [\n {\n id: 'gmi',\n value: ensureNumeric(data.glucoseManagementIndicator),\n },\n {\n id: 'gmiAGP',\n value: ensureNumeric(data.glucoseManagementIndicatorAGP),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.readingsInRange:\n statData.data = _.filter([\n (isRangeDefined(data[readingsInRangeDataPath]?.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data[readingsInRangeDataPath].veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data[readingsInRangeDataPath].low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data[readingsInRangeDataPath].target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data[readingsInRangeDataPath].high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data[readingsInRangeDataPath]?.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data[readingsInRangeDataPath].veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n totalReadings: 'raw.counts.total',\n averageDailyReadings: 'total',\n };\n break;\n\n case commonStats.sensorUsage:\n statData.data = [\n {\n value: ensureNumeric(data.sensorUsage),\n },\n {\n value: ensureNumeric(data.sensorUsageAGP),\n },\n ];\n statData.total = { value: ensureNumeric(data.total) };\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.standardDev:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n deviation: {\n value: ensureNumeric(data.standardDeviation),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0.deviation',\n title: 'data.0',\n };\n break;\n\n case commonStats.timeInAuto:\n statData.data = [\n {\n id: 'basalAutomated',\n value: ensureNumeric(data.automated),\n title: t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }),\n legendTitle: vocabulary[AUTOMATED_DELIVERY],\n },\n {\n id: 'basal',\n value: ensureNumeric(data.manual),\n title: t('Time In {{scheduledLabel}}', { scheduledLabel: vocabulary[SCHEDULED_DELIVERY] }),\n legendTitle: vocabulary[SCHEDULED_DELIVERY],\n },\n ];\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'basalAutomated' }),\n ],\n };\n break;\n\n case commonStats.timeInOverride:\n statData.data = _.map(settingsOverrides, override => ({\n id: override,\n value: ensureNumeric(_.get(data, override, 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [override, 'label']) }),\n legendTitle: _.get(vocabulary, [override, 'label']),\n }));\n\n statData.sum = { value: getSum(statData.data) };\n statData.total = { value: MS_IN_DAY };\n statData.dataPaths = {\n summary: 'sum',\n };\n break;\n\n case commonStats.timeInRange:\n statData.data = _.filter([\n (isRangeDefined(data.durations.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data.durations.veryLow),\n title: t('Time Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data.durations.low),\n title: t('Time Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.durations.target),\n title: t('Time In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.durations.high),\n title: t('Time Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data.durations.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n };\n break;\n\n case commonStats.totalInsulin:\n statData.data = [\n {\n id: 'bolus',\n value: ensureNumeric(data.bolus),\n title: t('Bolus Insulin'),\n legendTitle: t('Bolus'),\n },\n {\n id: 'basal',\n value: ensureNumeric(data.basal),\n title: t('Basal Insulin'),\n legendTitle: t('Basal'),\n },\n ];\n\n statData.total = { id: 'insulin', value: getSum(statData.data) };\n statData.dataPaths = {\n summary: 'total',\n title: 'total',\n };\n break;\n\n default:\n statData = undefined;\n break;\n }\n\n return statData;\n};\n\nexport const getStatTitle = (type, opts = {}) => {\n const { bgSource, days } = opts;\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const bgTypeLabel = bgSource === 'cbg' ? t('Glucose') : t('BG');\n\n let title;\n\n switch (type) {\n case commonStats.averageGlucose:\n title = t('Avg. Glucose ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.averageDailyDose:\n title = (days > 1) ? t('Avg. Daily Insulin') : t('Total Insulin');\n break;\n\n case commonStats.bgExtents:\n title = t('{{bgTypeLabel}} Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource], bgTypeLabel });\n break;\n\n case commonStats.carbs:\n title = (days > 1) ? t('Avg. Daily Carbs') : t('Total Carbs');\n break;\n\n case commonStats.coefficientOfVariation:\n title = t('CV ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.glucoseManagementIndicator:\n title = t('GMI ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.readingsInRange:\n title = (days > 1) ? t('Avg. Daily Readings In Range') : t('Readings In Range');\n break;\n\n case commonStats.sensorUsage:\n title = t('Sensor Usage');\n break;\n\n case commonStats.standardDev:\n title = t('Std. Deviation ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.timeInAuto:\n title = (days > 1)\n ? t('Avg. Daily Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] })\n : t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] });\n break;\n\n case commonStats.timeInOverride:\n title = (days > 1)\n ? t('Avg. Daily Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] })\n : t('Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] });\n break;\n\n case commonStats.timeInRange:\n title = (days > 1) ? t('Avg. Daily Time In Range') : t('Time In Range');\n break;\n\n case commonStats.totalInsulin:\n title = (days > 1) ? t('Avg. Daily Total Insulin') : t('Total Insulin');\n break;\n\n default:\n title = '';\n break;\n }\n\n return title;\n};\n\nexport const getStatDefinition = (data = {}, type, opts = {}) => {\n let stat = {\n annotations: getStatAnnotations(data, type, opts),\n collapsible: _.get(opts, 'collapsible', false),\n data: getStatData(data, type, opts),\n id: type,\n title: getStatTitle(type, opts),\n type: statTypes.barHorizontal,\n };\n\n switch (type) {\n case commonStats.averageGlucose:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.averageDailyDose:\n stat.alwaysShowSummary = true;\n stat.dataFormat = {\n output: statFormats.unitsPerKg,\n summary: statFormats.units,\n };\n stat.type = statTypes.input;\n break;\n\n case commonStats.bgExtents:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.simple;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.carbs:\n stat.dataFormat = {\n summary: statFormats.carbs,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.coefficientOfVariation:\n stat.dataFormat = {\n summary: statFormats.cv,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.glucoseManagementIndicator:\n stat.dataFormat = {\n summary: statFormats.gmi,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.readingsInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.bgCount,\n tooltipTitle: statFormats.bgRange,\n count: statFormats.bgCount,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.sensorUsage:\n stat.dataFormat = {\n summary: statFormats.percentage,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.standardDev:\n stat.dataFormat = {\n label: statFormats.standardDevValue,\n summary: statFormats.standardDevValue,\n title: statFormats.standardDevRange,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.timeInAuto:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n break;\n\n case commonStats.timeInOverride:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n stat.reverseLegendOrder = true;\n break;\n\n case commonStats.timeInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n tooltipTitle: statFormats.bgRange,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.totalInsulin:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.units,\n title: statFormats.units,\n tooltip: statFormats.units,\n };\n stat.legend = true;\n break;\n\n default:\n stat = undefined;\n break;\n }\n\n return stat;\n};\n\n/**\n * statsText\n * @param {Object} stats - all stats data\n * @param {Object} textUtil - TextUtil instance\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {String} Stats data as a formatted string\n */\nexport function statsText(stats, textUtil, bgPrefs, formatFn = formatDatum) {\n _.defaults(bgPrefs, {\n bgBounds: reshapeBgClassesToBgBounds(bgPrefs),\n });\n\n let statsString = '';\n\n _.each(stats, stat => {\n const renderTable = _.includes([\n commonStats.timeInRange,\n commonStats.readingsInRange,\n commonStats.totalInsulin,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.bgExtents,\n ], stat.id);\n\n const renderSecondaryValue = _.includes([\n commonStats.readingsInRange,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.timeInRange,\n ], stat.id);\n\n const opts = { bgPrefs, data: stat.data, forcePlainTextValues: true };\n let statTitle = `${stat.title}${stat.units ? ` (${stat.units})` : ''}`;\n\n if (stat.id === 'readingsInRange' && stat.data?.raw?.total > 0) {\n statTitle += t(' from {{count}} readings', { count: stat.data.raw.total });\n }\n\n if (renderTable) {\n statsString += textUtil.buildTextTable(\n statTitle,\n _.map(_.reverse([...stat.data.data]), datum => {\n const formatted = formatFn(\n datum,\n stat.dataFormat.summary,\n opts\n );\n\n let formattedText = `${formatted.value}${formatted.suffix || ''}`;\n\n if (renderSecondaryValue) {\n const secondary = formatFn(\n datum,\n stat.dataFormat.tooltip,\n opts\n );\n\n if (stat.id === 'readingsInRange') secondary.suffix += ' readings/day';\n formattedText += ` (${secondary.value}${secondary.suffix || ''})`;\n }\n\n return {\n label: datum.legendTitle || datum.title,\n value: formattedText,\n };\n }),\n [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ],\n { showHeader: false }\n );\n } else {\n const formatted = formatFn(\n _.get(stat.data, stat.data.dataPaths.summary, {}),\n stat.dataFormat.summary,\n opts\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (formatted.value === 0) formatted.value = [formatted.value];\n if (!_.isArray(formatted.value)) formatted.value = _.compact([formatted.value]);\n if (!_.isArray(formatted.suffix)) formatted.suffix = _.compact([formatted.suffix]);\n\n statsString += '\\n';\n statsString += textUtil.buildTextLine({\n label: stat.title,\n value: _.map(formatted.value, (value, i) => `${value}${formatted.suffix[i] || (stat.units ? ` ${stat.units}` : '')}`).join(' '),\n });\n }\n });\n\n return statsString;\n}\n","import Validator from 'fastest-validator';\nimport _ from 'lodash';\nimport { MGDL_UNITS, MMOLL_UNITS, MS_IN_DAY } from '../constants.js';\n\n\nconst v = new Validator({\n messages: {\n missingFieldDependancy: \"Field(s) '{expected}' are expected when field '{field}' exists. Value(s) were {actual}\",\n },\n});\n\n/* eslint-disable no-underscore-dangle */\nv.add('withDependantFields', (value, schema, fieldName, object) => {\n let missingFields = false;\n\n _.each(schema.fields, field => {\n if (!missingFields) {\n missingFields = _.isNil(object[field]);\n }\n });\n\n if (missingFields) {\n return v.makeError('missingFieldDependancy', schema.fields, JSON.stringify(_.pick(object, schema.fields)));\n }\n\n const processedRule = v._processRule(schema.schema, null, false);\n const checkWrapper = v._checkWrapper(processedRule);\n\n return checkWrapper(object[fieldName], processedRule, fieldName);\n});\n\nv.add('objectWithUnknownKeys', (value, schema, fieldName, object) => {\n const errors = [];\n const processedRule = v._processRule(schema.schema, null, false);\n\n _.each(object[fieldName], fieldValue => {\n const checkWrapper = v._checkWrapper(processedRule);\n const result = checkWrapper(fieldValue, processedRule);\n if (result !== true) {\n _.each(result, (item, i) => {\n // Add the field name to the field path for proper error descriptions\n const fieldPath = `${fieldName}${item.field}`;\n result[i].message = item.message.replace(item.field, fieldPath);\n result[i].field = fieldPath;\n });\n\n errors.push(result);\n }\n });\n\n return errors.length ? errors : true;\n});\n/* eslint-enable no-underscore-dangle */\n\nconst patterns = {\n id: /^[A-Za-z0-9\\-_]+$/,\n ISODate: /^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,\n ISODateSince2008: /^((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,\n deviceTime: /^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d)$/,\n rejectBadDeviceStatus: /^(?!status\\/unknown-previous).*$/,\n};\n\nconst optional = { optional: true };\nconst forbidden = { type: 'forbidden' };\nconst minZero = { type: 'number', min: 0 };\nconst postiveNumber = { type: 'number', positive: true };\nconst ISODateSince2008 = {\n type: 'string',\n pattern: patterns.ISODateSince2008,\n};\n\nconst validTypes = [\n 'alert',\n 'basal',\n 'bolus',\n 'cbg',\n 'cgmSettings',\n 'controllerSettings',\n 'controllerStatus',\n 'deviceEvent',\n 'dosingDecision',\n 'food',\n 'insulin',\n 'message',\n 'physicalActivity',\n 'pumpSettings',\n 'pumpStatus',\n 'reportedState',\n 'smbg',\n 'upload',\n 'water',\n 'wizard',\n];\n\nconst common = {\n deviceId: { type: 'string', ...optional },\n deviceTime: { type: 'string', pattern: patterns.deviceTime, ...optional },\n id: { type: 'string', pattern: patterns.id },\n time: ISODateSince2008,\n type: { type: 'string', enum: validTypes },\n uploadId: { type: 'string', pattern: patterns.id },\n};\n\nconst basalCommon = {\n deliveryType: { type: 'string', enum: ['scheduled', 'suspend', 'temp', 'automated'] },\n duration: { ...postiveNumber, ...optional },\n rate: minZero,\n};\n\nconst suppressed = { type: 'object', props: basalCommon, ...optional };\n\nconst basal = {\n ...common,\n ...basalCommon,\n suppressed,\n};\n\n// allow pump-shutdown-annotated basals, even if duration is zero, so we can display them.\nconst basalPostShutdown = {\n ...basal,\n annotations: { type: 'array', items: { type: 'object', props: { code: { type: 'string', value: 'pump-shutdown' } } } },\n duration: { ...minZero, ...optional },\n suppressed: { ...suppressed, props: { ...suppressed.props, duration: { ...minZero, ...optional } } },\n};\n\nconst normalBolus = {\n ...common,\n normal: minZero,\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal'],\n ...optional,\n },\n duration: forbidden,\n extended: forbidden,\n expectedExtended: forbidden,\n subType: { type: 'string', enum: ['normal', 'automated'] },\n wizard: { type: 'string', pattern: patterns.id, ...optional },\n};\n\nconst extendedBolus = {\n ...common,\n duration: minZero,\n expectedDuration: { ...minZero, ...optional },\n extended: minZero,\n expectedExtended: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['extended', 'duration', 'expectedDuration'],\n ...optional,\n },\n normal: { ...minZero, ...optional },\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal'],\n ...optional,\n },\n subType: { type: 'string', enum: ['square'] },\n wizard: { type: 'string', pattern: patterns.id, ...optional },\n};\n\nconst combinationBolus = {\n ...extendedBolus,\n subType: { type: 'string', enum: ['dual/square'] },\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal', 'duration', 'expectedDuration', 'extended', 'expectedExtended'],\n ...optional,\n },\n};\n\nconst bg = {\n ...common,\n value: postiveNumber,\n units: { type: 'string', enum: [MGDL_UNITS, MMOLL_UNITS] },\n};\n\nconst cbg = {\n ...bg,\n sampleInterval: postiveNumber,\n};\n\nconst deviceEvent = {\n ...common,\n annotations: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n code: { type: 'string', pattern: patterns.rejectBadDeviceStatus },\n },\n },\n ...optional,\n },\n};\n\nconst message = {\n id: { type: 'string', pattern: patterns.id },\n time: ISODateSince2008,\n parentMessage: [\n { type: 'string', pattern: patterns.id, ...optional },\n { type: 'enum', values: [null], ...optional },\n ],\n};\n\nconst settingsScheduleStart = {\n start: { ...minZero, max: MS_IN_DAY },\n};\n\nconst basalSchedules = {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n rate: minZero,\n },\n },\n },\n};\n\nconst carbRatio = {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n amount: minZero,\n },\n },\n};\n\nconst insulinSensitivity = {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n amount: minZero,\n },\n },\n};\n\nconst pumpSettingsAnimas = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: minZero,\n low: forbidden,\n high: forbidden,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsMedtronic = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsOmnipod = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: forbidden,\n low: forbidden,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsTandem = {\n ...common,\n bgTargets: {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: forbidden,\n low: forbidden,\n high: forbidden,\n },\n },\n },\n },\n carbRatios: {\n type: 'objectWithUnknownKeys',\n schema: carbRatio,\n },\n insulinSensitivities: {\n type: 'objectWithUnknownKeys',\n schema: insulinSensitivity,\n },\n basalSchedules,\n};\n\nconst pumpSettingsEquil = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsLoop = {\n ...common,\n bgTargets: {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n },\n carbRatios: {\n type: 'objectWithUnknownKeys',\n schema: carbRatio,\n },\n insulinSensitivities: {\n type: 'objectWithUnknownKeys',\n schema: insulinSensitivity,\n },\n basalSchedules,\n};\n\nconst wizard = {\n ...common,\n bgInput: { ...minZero, ...optional },\n bolus: { type: 'string', pattern: patterns.id },\n carbInput: { ...minZero, ...optional },\n insulinCarbRatio: { ...minZero, ...optional },\n insulinOnBoard: { ...minZero, ...optional },\n insulinSensitivity: { ...minZero, ...optional },\n recommended: {\n type: 'object',\n props: {\n carb: { ...minZero, ...optional },\n correction: { type: 'number', ...optional },\n net: { type: 'number', ...optional },\n },\n ...optional,\n },\n};\n\nexport default {\n basal: {\n basal: v.compile(basal),\n postShutdown: v.compile(basalPostShutdown),\n },\n bolus: {\n normal: v.compile(normalBolus),\n extended: v.compile(extendedBolus),\n combination: v.compile(combinationBolus),\n },\n cbg: v.compile(cbg),\n common: v.compile(common),\n deviceEvent: v.compile(deviceEvent),\n message: v.compile(message),\n pumpSettings: {\n animas: v.compile(pumpSettingsAnimas),\n medtronic: v.compile(pumpSettingsMedtronic),\n omnipod: v.compile(pumpSettingsOmnipod),\n tandem: v.compile(pumpSettingsTandem),\n equil: v.compile(pumpSettingsEquil),\n 'diy loop': v.compile(pumpSettingsLoop),\n 'tidepool loop': v.compile(pumpSettingsLoop),\n twiist: v.compile(pumpSettingsLoop),\n },\n smbg: v.compile(bg),\n wizard: v.compile(wizard),\n};\n","let array8 = arrayUntyped,\n array16 = arrayUntyped,\n array32 = arrayUntyped,\n arrayLengthen = arrayLengthenUntyped,\n arrayWiden = arrayWidenUntyped;\nif (typeof Uint8Array !== \"undefined\") {\n array8 = function(n) { return new Uint8Array(n); };\n array16 = function(n) { return new Uint16Array(n); };\n array32 = function(n) { return new Uint32Array(n); };\n\n arrayLengthen = function(array, length) {\n if (array.length >= length) return array;\n var copy = new array.constructor(length);\n copy.set(array);\n return copy;\n };\n\n arrayWiden = function(array, width) {\n var copy;\n switch (width) {\n case 16: copy = array16(array.length); break;\n case 32: copy = array32(array.length); break;\n default: throw new Error(\"invalid array width!\");\n }\n copy.set(array);\n return copy;\n };\n}\n\nfunction arrayUntyped(n) {\n var array = new Array(n), i = -1;\n while (++i < n) array[i] = 0;\n return array;\n}\n\nfunction arrayLengthenUntyped(array, length) {\n var n = array.length;\n while (n < length) array[n++] = 0;\n return array;\n}\n\nfunction arrayWidenUntyped(array, width) {\n if (width > 32) throw new Error(\"invalid array width!\");\n return array;\n}\n\n// An arbitrarily-wide array of bitmasks\nfunction bitarray(n) {\n this.length = n;\n this.subarrays = 1;\n this.width = 8;\n this.masks = {\n 0: 0\n }\n\n this[0] = array8(n);\n}\n\nbitarray.prototype.lengthen = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i] = arrayLengthen(this[i], n);\n }\n this.length = n;\n};\n\n// Reserve a new bit index in the array, returns {offset, one}\nbitarray.prototype.add = function() {\n var m, w, one, i, len;\n\n for (i = 0, len = this.subarrays; i < len; ++i) {\n m = this.masks[i];\n w = this.width - (32 * i);\n // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0 \n one = (~m & (m + 1)) >>> 0;\n\n if (w >= 32 && !one) {\n continue;\n }\n\n if (w < 32 && (one & (1 << w))) {\n // widen this subarray\n this[i] = arrayWiden(this[i], w <<= 1);\n this.width = 32 * i + w;\n }\n\n this.masks[i] |= one;\n\n return {\n offset: i,\n one: one\n };\n }\n\n // add a new subarray\n this[this.subarrays] = array8(this.length);\n this.masks[this.subarrays] = 1;\n this.width += 8;\n return {\n offset: this.subarrays++,\n one: 1\n };\n};\n\n// Copy record from index src to index dest\nbitarray.prototype.copy = function(dest, src) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i][dest] = this[i][src];\n }\n};\n\n// Truncate the array to the given length\nbitarray.prototype.truncate = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n for (var j = this.length - 1; j >= n; j--) {\n this[i][j] = 0;\n }\n }\n this.length = n;\n};\n\n// Checks that all bits for the given index are 0\nbitarray.prototype.zero = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for possibly one\nbitarray.prototype.zeroExcept = function(n, offset, zero) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (i === offset ? this[i][n] & zero : this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for the specified mask.\n// The mask should be an array of the same size as the filter subarrays width.\nbitarray.prototype.zeroExceptMask = function(n, mask) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] & mask[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks that only the specified bit is set for the given index\nbitarray.prototype.only = function(n, offset, one) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] != (i === offset ? one : 0)) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that only the specified bit is set for the given index except for possibly one other\nbitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {\n var mask;\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n mask = this[i][n];\n if (i === offset)\n mask = (mask & zero) >>> 0;\n if (mask != (i === onlyOffset ? onlyOne : 0)) {\n return false;\n }\n }\n return true;\n};\n\nexport default {\n array8: arrayUntyped,\n array16: arrayUntyped,\n array32: arrayUntyped,\n arrayLengthen: arrayLengthenUntyped,\n arrayWiden: arrayWidenUntyped,\n bitarray: bitarray\n};\n","const filterExact = (bisect, value) => {\n return function(values) {\n var n = values.length;\n return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];\n };\n}\n\nconst filterRange = (bisect, range) => {\n var min = range[0],\n max = range[1];\n return function(values) {\n var n = values.length;\n return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];\n };\n}\n\nconst filterAll = values => {\n return [0, values.length];\n}\n\nexport default {\n filterExact,\n filterRange,\n filterAll\n};\n","export default d => {\n return d;\n};\n","export default () => {\n return null;\n}\n","export default () => {\n return 0;\n}\n","import identity from './identity';\n\nfunction heap_by(f) {\n\n // Builds a binary heap within the specified array a[lo:hi]. The heap has the\n // property such that the parent a[lo+i] is always less than or equal to its\n // two children: a[lo+2*i+1] and a[lo+2*i+2].\n function heap(a, lo, hi) {\n var n = hi - lo,\n i = (n >>> 1) + 1;\n while (--i > 0) sift(a, i, n, lo);\n return a;\n }\n\n // Sorts the specified array a[lo:hi] in descending order, assuming it is\n // already a heap.\n function sort(a, lo, hi) {\n var n = hi - lo,\n t;\n while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);\n return a;\n }\n\n // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous\n // slice of array a[lo:lo+n]. This method can also be used to update the heap\n // incrementally, without incurring the full cost of reconstructing the heap.\n function sift(a, i, n, lo) {\n var d = a[--lo + i],\n x = f(d),\n child;\n while ((child = i << 1) <= n) {\n if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;\n if (x <= f(a[lo + child])) break;\n a[lo + i] = a[lo + child];\n i = child;\n }\n a[lo + i] = d;\n }\n\n heap.sort = sort;\n return heap;\n}\n\nconst h = heap_by(identity);\nh.by = heap_by;\n\nexport default h;\n","import identity from './identity';\nimport xFilterHeap from './heap';\n\nfunction heapselect_by(f) {\n var heap = xFilterHeap.by(f);\n\n // Returns a new array containing the top k elements in the array a[lo:hi].\n // The returned array is not sorted, but maintains the heap property. If k is\n // greater than hi - lo, then fewer than k elements will be returned. The\n // order of elements in a is unchanged by this operation.\n function heapselect(a, lo, hi, k) {\n var queue = new Array(k = Math.min(hi - lo, k)),\n min,\n i,\n d;\n\n for (i = 0; i < k; ++i) queue[i] = a[lo++];\n heap(queue, 0, k);\n\n if (lo < hi) {\n min = f(queue[0]);\n do {\n if (f(d = a[lo]) > min) {\n queue[0] = d;\n min = f(heap(queue, 0, k)[0]);\n }\n } while (++lo < hi);\n }\n\n return queue;\n }\n\n return heapselect;\n}\n\n\nconst h = heapselect_by(identity);\nh.by = heapselect_by; // assign the raw function to the export as well\n\nexport default h;\n","import identity from './identity';\n\nfunction bisect_by(f) {\n\n // Locate the insertion point for x in a to maintain sorted order. The\n // arguments lo and hi may be used to specify a subset of the array which\n // should be considered; by default the entire array is used. If x is already\n // present in a, the insertion point will be before (to the left of) any\n // existing entries. The return value is suitable for use as the first\n // argument to `array.splice` assuming that a is already sorted.\n //\n // The returned insertion point i partitions the array a into two halves so\n // that all v < x for v in a[lo:i] for the left side and all v >= x for v in\n // a[i:hi] for the right side.\n function bisectLeft(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (f(a[mid]) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Similar to bisectLeft, but returns an insertion point which comes after (to\n // the right of) any existing entries of x in a.\n //\n // The returned insertion point i partitions the array into two halves so that\n // all v <= x for v in a[lo:i] for the left side and all v > x for v in\n // a[i:hi] for the right side.\n function bisectRight(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (x < f(a[mid])) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n bisectRight.right = bisectRight;\n bisectRight.left = bisectLeft;\n return bisectRight;\n}\n\nconst bisect = bisect_by(identity);\nbisect.by = bisect_by; // assign the raw function to the export as well\n\nexport default bisect;\n\n","export default (array, index, deep) => {\n for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {\n copy[i] = array[index[i]];\n }\n return copy;\n}\n","const reduceIncrement = p => {\n return p + 1;\n}\n\nconst reduceDecrement = p => {\n return p - 1;\n}\n\nconst reduceAdd = f => {\n return function(p, v) {\n return p + +f(v);\n };\n}\n\nconst reduceSubtract = f => {\n return function(p, v) {\n return p - f(v);\n };\n}\n\nexport default {\n reduceIncrement,\n reduceDecrement,\n reduceAdd,\n reduceSubtract\n};\n","import deep from \"@ranfdev/deepobj\"\n// Note(cg): result was previsouly using lodash.result, not ESM compatible.\n \nconst get = (obj, prop) => {\n const value = obj[prop];\n return (typeof value === 'function') ? value.call(obj) : value;\n}\n\n/**\n * get value of object at a deep path.\n * if the resolved value is a function,\n * it's invoked with the `this` binding of \n * its parent object and its result is returned. \n * \n * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )\n * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)\n * @return {Any} the resolved value\n */\nconst reg = /\\[([\\w\\d]+)\\]/g;\nexport default (obj, path) => {\n return deep(get, obj, path.replace(reg, '.$1'))\n}\n","import xfilterArray from './array';\nimport xfilterFilter from './filter';\nimport cr_identity from './identity';\nimport cr_null from './null';\nimport cr_zero from './zero';\nimport xfilterHeapselect from './heapselect';\nimport xfilterHeap from './heap';\nimport bisect from './bisect';\nimport permute from './permute';\nimport xfilterReduce from './reduce';\nimport result from './result';\n\n// constants\nvar REMOVED_INDEX = -1;\n\ncrossfilter.heap = xfilterHeap;\ncrossfilter.heapselect = xfilterHeapselect;\ncrossfilter.bisect = bisect;\ncrossfilter.permute = permute;\nexport default crossfilter;\n\nfunction crossfilter() {\n var crossfilter = {\n add: add,\n remove: removeData,\n dimension: dimension,\n groupAll: groupAll,\n size: size,\n all: all,\n allFiltered: allFiltered,\n onChange: onChange,\n isElementFiltered: isElementFiltered\n };\n\n var data = [], // the records\n n = 0, // the number of records; data.length\n filters, // 1 is filtered out\n filterListeners = [], // when the filters change\n dataListeners = [], // when data is added\n removeDataListeners = [], // when data is removed\n callbacks = [];\n\n filters = new xfilterArray.bitarray(0);\n\n // Adds the specified new records to this crossfilter.\n function add(newData) {\n var n0 = n,\n n1 = newData.length;\n\n // If there's actually new data to add…\n // Merge the new data into the existing data.\n // Lengthen the filter bitset to handle the new records.\n // Notify listeners (dimensions and groups) that new data is available.\n if (n1) {\n data = data.concat(newData);\n filters.lengthen(n += n1);\n dataListeners.forEach(function(l) { l(newData, n0, n1); });\n triggerOnChange('dataAdded');\n }\n\n return crossfilter;\n }\n\n // Removes all records that match the current filters, or if a predicate function is passed,\n // removes all records matching the predicate (ignoring filters).\n function removeData(predicate) {\n var // Mapping from old record indexes to new indexes (after records removed)\n newIndex = new Array(n),\n removed = [],\n usePred = typeof predicate === 'function',\n shouldRemove = function (i) {\n return usePred ? predicate(data[i], i) : filters.zero(i)\n };\n\n for (var index1 = 0, index2 = 0; index1 < n; ++index1) {\n if ( shouldRemove(index1) ) {\n removed.push(index1);\n newIndex[index1] = REMOVED_INDEX;\n } else {\n newIndex[index1] = index2++;\n }\n }\n\n // Remove all matching records from groups.\n filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });\n\n // Update indexes.\n removeDataListeners.forEach(function(l) { l(newIndex); });\n\n // Remove old filters and data by overwriting.\n for (var index3 = 0, index4 = 0; index3 < n; ++index3) {\n if ( newIndex[index3] !== REMOVED_INDEX ) {\n if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];\n ++index4;\n }\n }\n\n data.length = n = index4;\n filters.truncate(index4);\n triggerOnChange('dataRemoved');\n }\n\n function maskForDimensions(dimensions) {\n var n,\n d,\n len,\n id,\n mask = Array(filters.subarrays);\n for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }\n for (d = 0, len = dimensions.length; d < len; d++) {\n // The top bits of the ID are the subarray offset and the lower bits are the bit\n // offset of the \"one\" mask.\n id = dimensions[d].id();\n mask[id >> 7] &= ~(0x1 << (id & 0x3f));\n }\n return mask;\n }\n\n // Return true if the data element at index i is filtered IN.\n // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.\n function isElementFiltered(i, ignore_dimensions) {\n var mask = maskForDimensions(ignore_dimensions || []);\n return filters.zeroExceptMask(i,mask);\n }\n\n // Adds a new dimension with the specified value accessor function.\n function dimension(value, iterable) {\n\n if (typeof value === 'string') {\n var accessorPath = value;\n value = function(d) { return result(d, accessorPath); };\n }\n\n var dimension = {\n filter: filter,\n filterExact: filterExact,\n filterRange: filterRange,\n filterFunction: filterFunction,\n filterAll: filterAll,\n currentFilter: currentFilter,\n hasCurrentFilter: hasCurrentFilter,\n top: top,\n bottom: bottom,\n group: group,\n groupAll: groupAll,\n dispose: dispose,\n remove: dispose, // for backwards-compatibility\n accessor: value,\n id: function() { return id; }\n };\n\n var one, // lowest unset bit as mask, e.g., 00001000\n zero, // inverted one, e.g., 11110111\n offset, // offset into the filters arrays\n id, // unique ID for this dimension (reused when dimensions are disposed)\n values, // sorted, cached array\n index, // maps sorted value index -> record index (in data)\n newValues, // temporary array storing newly-added values\n newIndex, // temporary array storing newly-added index\n iterablesIndexCount,\n iterablesIndexFilterStatus,\n iterablesEmptyRows = [],\n sortRange = function(n) {\n return cr_range(n).sort(function(A, B) {\n var a = newValues[A], b = newValues[B];\n return a < b ? -1 : a > b ? 1 : A - B;\n });\n },\n refilter = xfilterFilter.filterAll, // for recomputing filter\n refilterFunction, // the custom filter function in use\n filterValue, // the value used for filtering (value, array, function or undefined)\n filterValuePresent, // true if filterValue contains something\n indexListeners = [], // when data is added\n dimensionGroups = [],\n lo0 = 0,\n hi0 = 0,\n t = 0,\n k;\n\n // Updating a dimension is a two-stage process. First, we must update the\n // associated filters for the newly-added records. Once all dimensions have\n // updated their filters, the groups are notified to update.\n dataListeners.unshift(preAdd);\n dataListeners.push(postAdd);\n\n removeDataListeners.push(removeData);\n\n // Add a new dimension in the filter bitmap and store the offset and bitmask.\n var tmp = filters.add();\n offset = tmp.offset;\n one = tmp.one;\n zero = ~one;\n\n // Create a unique ID for the dimension\n // IDs will be re-used if dimensions are disposed.\n // For internal use the ID is the subarray offset shifted left 7 bits or'd with the\n // bit offset of the set bit in the dimension's \"one\" mask.\n id = (offset << 7) | (Math.log(one) / Math.log(2));\n\n preAdd(data, 0, n);\n postAdd(data, 0, n);\n\n // Incorporates the specified new records into this dimension.\n // This function is responsible for updating filters, values, and index.\n function preAdd(newData, n0, n1) {\n var newIterablesIndexCount,\n newIterablesIndexFilterStatus;\n\n if (iterable){\n // Count all the values\n t = 0;\n j = 0;\n k = [];\n\n for (var i0 = 0; i0 < newData.length; i0++) {\n for(j = 0, k = value(newData[i0]); j < k.length; j++) {\n t++;\n }\n }\n\n newValues = [];\n newIterablesIndexCount = cr_range(newData.length);\n newIterablesIndexFilterStatus = cr_index(t,1);\n var unsortedIndex = cr_range(t);\n\n for (var l = 0, index1 = 0; index1 < newData.length; index1++) {\n k = value(newData[index1])\n //\n if(!k.length){\n newIterablesIndexCount[index1] = 0;\n iterablesEmptyRows.push(index1 + n0);\n continue;\n }\n newIterablesIndexCount[index1] = k.length\n for (j = 0; j < k.length; j++) {\n newValues.push(k[j]);\n unsortedIndex[l] = index1;\n l++;\n }\n }\n\n // Create the Sort map used to sort both the values and the valueToData indices\n var sortMap = sortRange(t);\n\n // Use the sortMap to sort the newValues\n newValues = permute(newValues, sortMap);\n\n\n // Use the sortMap to sort the unsortedIndex map\n // newIndex should be a map of sortedValue -> crossfilterData\n newIndex = permute(unsortedIndex, sortMap)\n\n } else{\n // Permute new values into natural order using a standard sorted index.\n newValues = newData.map(value);\n newIndex = sortRange(n1);\n newValues = permute(newValues, newIndex);\n }\n\n // Bisect newValues to determine which new records are selected.\n var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];\n\n var index2, index3, index4;\n if(iterable) {\n n1 = t;\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n if(--newIterablesIndexCount[newIndex[index2]] === 0) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index2] = 1;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n if(--newIterablesIndexCount[newIndex[index3]] === 0) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index3] = 1;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n if(--newIterablesIndexCount[newIndex[index4]] === 0) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index4] = 1;\n }\n }\n } else {\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n }\n }\n\n // If this dimension previously had no data, then we don't need to do the\n // more expensive merge operation; use the new values and index as-is.\n if (!n0) {\n values = newValues;\n index = newIndex;\n iterablesIndexCount = newIterablesIndexCount;\n iterablesIndexFilterStatus = newIterablesIndexFilterStatus;\n lo0 = lo1;\n hi0 = hi1;\n return;\n }\n\n\n\n var oldValues = values,\n oldIndex = index,\n oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,\n old_n0,\n i1 = 0;\n\n i0 = 0;\n\n if(iterable){\n old_n0 = n0\n n0 = oldValues.length;\n n1 = t\n }\n\n // Otherwise, create new arrays into which to merge new and old.\n values = iterable ? new Array(n0 + n1) : new Array(n);\n index = iterable ? new Array(n0 + n1) : cr_index(n, n);\n if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);\n\n // Concatenate the newIterablesIndexCount onto the old one.\n if(iterable) {\n var oldiiclength = iterablesIndexCount.length;\n iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);\n for(var j=0; j+oldiiclength < n; j++) {\n iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];\n }\n }\n\n // Merge the old and new sorted values, and old and new index.\n var index5 = 0;\n for (; i0 < n0 && i1 < n1; ++index5) {\n if (oldValues[i0] < newValues[i1]) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0++];\n } else {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);\n }\n }\n\n // Add any remaining old values.\n for (; i0 < n0; ++i0, ++index5) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0];\n }\n\n // Add any remaining new values.\n for (; i1 < n1; ++i1, ++index5) {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);\n }\n\n // Bisect again to recompute lo0 and hi0.\n bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // When all filters have updated, notify index listeners of the new values.\n function postAdd(newData, n0, n1) {\n indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });\n newValues = newIndex = null;\n }\n\n function removeData(reIndex) {\n if (iterable) {\n for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {\n if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {\n iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];\n i1++;\n }\n }\n iterablesEmptyRows.length = i1;\n for (i0 = 0, i1 = 0; i0 < n; i0++) {\n if (reIndex[i0] !== REMOVED_INDEX) {\n if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];\n i1++;\n }\n }\n iterablesIndexCount = iterablesIndexCount.slice(0, i1);\n }\n // Rewrite our index, overwriting removed values\n var n0 = values.length;\n for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {\n oldDataIndex = index[i];\n if (reIndex[oldDataIndex] !== REMOVED_INDEX) {\n if (i !== j) values[j] = values[i];\n index[j] = reIndex[oldDataIndex];\n if (iterable) {\n iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];\n }\n ++j;\n }\n }\n values.length = j;\n if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);\n while (j < n0) index[j++] = 0;\n\n // Bisect again to recompute lo0 and hi0.\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // Updates the selected values based on the specified bounds [lo, hi].\n // This implementation is used by all the public filter methods.\n function filterIndexBounds(bounds) {\n\n var lo1 = bounds[0],\n hi1 = bounds[1];\n\n if (refilterFunction) {\n refilterFunction = null;\n filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);\n lo0 = lo1;\n hi0 = hi1;\n return dimension;\n }\n\n var i,\n j,\n k,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [];\n\n\n // Fast incremental update based on previous lo index.\n if (lo1 < lo0) {\n for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (lo1 > lo0) {\n for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n // Fast incremental update based on previous hi index.\n if (hi1 > hi0) {\n for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (hi1 < hi0) {\n for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n if(!iterable) {\n // Flip filters normally.\n\n for(i=0; i<added.length; i++) {\n filters[offset][added[i]] ^= one;\n }\n\n for(i=0; i<removed.length; i++) {\n filters[offset][removed[i]] ^= one;\n }\n\n } else {\n // For iterables, we need to figure out if the row has been completely removed vs partially included\n // Only count a row as added if it is not already being aggregated. Only count a row\n // as removed if the last element being aggregated is removed.\n\n var newAdded = [];\n var newRemoved = [];\n for (i = 0; i < added.length; i++) {\n iterablesIndexCount[added[i]]++\n iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;\n if(iterablesIndexCount[added[i]] === 1) {\n filters[offset][added[i]] ^= one;\n newAdded.push(added[i]);\n }\n }\n for (i = 0; i < removed.length; i++) {\n iterablesIndexCount[removed[i]]--\n iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;\n if(iterablesIndexCount[removed[i]] === 0) {\n filters[offset][removed[i]] ^= one;\n newRemoved.push(removed[i]);\n }\n }\n\n added = newAdded;\n removed = newRemoved;\n\n // Now handle empty rows.\n if(refilter === xfilterFilter.filterAll) {\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if((filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was not in the filter, so set the filter and add\n filters[offset][k] ^= one;\n added.push(k);\n }\n }\n } else {\n // filter in place - remove empty rows if necessary\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was in the filter, so set the filter and remove\n filters[offset][k] ^= one;\n removed.push(k);\n }\n }\n }\n }\n\n lo0 = lo1;\n hi0 = hi1;\n filterListeners.forEach(function(l) { l(one, offset, added, removed); });\n triggerOnChange('filtered');\n return dimension;\n }\n\n // Filters this dimension using the specified range, value, or null.\n // If the range is null, this is equivalent to filterAll.\n // If the range is an array, this is equivalent to filterRange.\n // Otherwise, this is equivalent to filterExact.\n function filter(range) {\n return range == null\n ? filterAll() : Array.isArray(range)\n ? filterRange(range) : typeof range === \"function\"\n ? filterFunction(range)\n : filterExact(range);\n }\n\n // Filters this dimension to select the exact value.\n function filterExact(value) {\n filterValue = value;\n filterValuePresent = true;\n return filterIndexBounds((refilter = xfilterFilter.filterExact(bisect, value))(values));\n }\n\n // Filters this dimension to select the specified range [lo, hi].\n // The lower bound is inclusive, and the upper bound is exclusive.\n function filterRange(range) {\n filterValue = range;\n filterValuePresent = true;\n return filterIndexBounds((refilter = xfilterFilter.filterRange(bisect, range))(values));\n }\n\n // Clears any filters on this dimension.\n function filterAll() {\n filterValue = undefined;\n filterValuePresent = false;\n return filterIndexBounds((refilter = xfilterFilter.filterAll)(values));\n }\n\n // Filters this dimension using an arbitrary function.\n function filterFunction(f) {\n filterValue = f;\n filterValuePresent = true;\n\n refilterFunction = f;\n refilter = xfilterFilter.filterAll;\n\n filterIndexFunction(f, false);\n\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n\n return dimension;\n }\n\n function filterIndexFunction(f, filterAll) {\n var i,\n k,\n x,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [],\n indexLength = values.length;\n\n if(!iterable) {\n for (i = 0; i < indexLength; ++i) {\n if (!(filters[offset][k = index[i]] & one) ^ !!(x = f(values[i], i))) {\n if (x) added.push(k);\n else removed.push(k);\n }\n }\n }\n\n if(iterable) {\n for(i=0; i < indexLength; ++i) {\n if(f(values[i], i)) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n } else {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n }\n\n if(!iterable) {\n for(i=0; i<added.length; i++) {\n if(filters[offset][added[i]] & one) filters[offset][added[i]] &= zero;\n }\n\n for(i=0; i<removed.length; i++) {\n if(!(filters[offset][removed[i]] & one)) filters[offset][removed[i]] |= one;\n }\n } else {\n\n var newAdded = [];\n var newRemoved = [];\n for (i = 0; i < added.length; i++) {\n // First check this particular value needs to be added\n if(iterablesIndexFilterStatus[valueIndexAdded[i]] === 1) {\n iterablesIndexCount[added[i]]++\n iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;\n if(iterablesIndexCount[added[i]] === 1) {\n filters[offset][added[i]] ^= one;\n newAdded.push(added[i]);\n }\n }\n }\n for (i = 0; i < removed.length; i++) {\n // First check this particular value needs to be removed\n if(iterablesIndexFilterStatus[valueIndexRemoved[i]] === 0) {\n iterablesIndexCount[removed[i]]--\n iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;\n if(iterablesIndexCount[removed[i]] === 0) {\n filters[offset][removed[i]] ^= one;\n newRemoved.push(removed[i]);\n }\n }\n }\n\n added = newAdded;\n removed = newRemoved;\n\n // Now handle empty rows.\n if(filterAll) {\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if((filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was not in the filter, so set the filter and add\n filters[offset][k] ^= one;\n added.push(k);\n }\n }\n } else {\n // filter in place - remove empty rows if necessary\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was in the filter, so set the filter and remove\n filters[offset][k] ^= one;\n removed.push(k);\n }\n }\n }\n }\n\n filterListeners.forEach(function(l) { l(one, offset, added, removed); });\n triggerOnChange('filtered');\n }\n\n function currentFilter() {\n return filterValue;\n }\n\n function hasCurrentFilter() {\n return filterValuePresent;\n }\n\n // Returns the top K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function top(k, top_offset) {\n var array = [],\n i = hi0,\n j,\n toSkip = 0;\n\n if(top_offset && top_offset > 0) toSkip = top_offset;\n\n while (--i >= lo0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n\n if(iterable){\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n // Add row with empty iterable column at the end\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n return array;\n }\n\n // Returns the bottom K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function bottom(k, bottom_offset) {\n var array = [],\n i,\n j,\n toSkip = 0;\n\n if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;\n\n if(iterable) {\n // Add row with empty iterable column at the top\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n i = lo0;\n\n while (i < hi0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n i++;\n }\n\n return array;\n }\n\n // Adds a new group to this dimension, using the specified key function.\n function group(key) {\n var group = {\n top: top,\n all: all,\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n order: order,\n orderNatural: orderNatural,\n size: size,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n // Ensure that this group will be removed when the dimension is removed.\n dimensionGroups.push(group);\n\n var groups, // array of {key, value}\n groupIndex, // object id ↦ group id\n groupWidth = 8,\n groupCapacity = capacity(groupWidth),\n k = 0, // cardinality\n select,\n heap,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n update = cr_null,\n reset = cr_null,\n resetNeeded = true,\n groupAll = key === cr_null,\n n0old;\n\n if (arguments.length < 1) key = cr_identity;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the associated reduce values. It must also listen to\n // the parent dimension for when data is added, and compute new keys.\n filterListeners.push(update);\n indexListeners.push(add);\n removeDataListeners.push(removeData);\n\n // Incorporate any existing data into the grouping.\n add(values, index, 0, n);\n\n // Incorporates the specified new values into this group.\n // This function is responsible for updating groups and groupIndex.\n function add(newValues, newIndex, n0, n1) {\n\n if(iterable) {\n n0old = n0\n n0 = values.length - newValues.length\n n1 = newValues.length;\n }\n\n var oldGroups = groups,\n reIndex = iterable ? [] : cr_index(k, groupCapacity),\n add = reduceAdd,\n remove = reduceRemove,\n initial = reduceInitial,\n k0 = k, // old cardinality\n i0 = 0, // index of old group\n i1 = 0, // index of new record\n j, // object id\n g0, // old group\n x0, // old key\n x1, // new key\n g, // group to add\n x; // key of group to add\n\n // If a reset is needed, we don't need to update the reduce values.\n if (resetNeeded) add = initial = cr_null;\n if (resetNeeded) remove = initial = cr_null;\n\n // Reset the new groups (k is a lower bound).\n // Also, make sure that groupIndex exists and is long enough.\n groups = new Array(k), k = 0;\n if(iterable){\n groupIndex = k0 ? groupIndex : [];\n }\n else{\n groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);\n }\n\n\n // Get the first old key (x0 of g0), if it exists.\n if (k0) x0 = (g0 = oldGroups[0]).key;\n\n // Find the first new key (x1), skipping NaN keys.\n while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;\n\n // While new keys remain…\n while (i1 < n1) {\n\n // Determine the lesser of the two current keys; new and old.\n // If there are no old keys remaining, then always add the new key.\n if (g0 && x0 <= x1) {\n g = g0, x = x0;\n\n // Record the new index of the old group.\n reIndex[i0] = k;\n\n // Retrieve the next old key.\n g0 = oldGroups[++i0];\n if (g0) x0 = g0.key;\n } else {\n g = {key: x1, value: initial()}, x = x1;\n }\n\n // Add the lesser group.\n groups[k] = g;\n\n // Add any selected records belonging to the added group, while\n // advancing the new key and populating the associated group index.\n\n while (x1 <= x) {\n j = newIndex[i1] + (iterable ? n0old : n0)\n\n\n if(iterable){\n if(groupIndex[j]){\n groupIndex[j].push(k)\n }\n else{\n groupIndex[j] = [k]\n }\n }\n else{\n groupIndex[j] = k;\n }\n\n // Always add new values to groups. Only remove when not in filter.\n // This gives groups full information on data life-cycle.\n g.value = add(g.value, data[j], true);\n if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);\n if (++i1 >= n1) break;\n x1 = key(newValues[i1]);\n }\n\n groupIncrement();\n }\n\n // Add any remaining old groups that were greater th1an all new keys.\n // No incremental reduce is needed; these groups have no new records.\n // Also record the new index of the old group.\n while (i0 < k0) {\n groups[reIndex[i0] = k] = oldGroups[i0++];\n groupIncrement();\n }\n\n\n // Fill in gaps with empty arrays where there may have been rows with empty iterables\n if(iterable){\n for (var index1 = 0; index1 < n; index1++) {\n if(!groupIndex[index1]){\n groupIndex[index1] = [];\n }\n }\n }\n\n // If we added any new groups before any old groups,\n // update the group index of all the old records.\n if(k > i0){\n if(iterable){\n for (i0 = 0; i0 < n0old; ++i0) {\n for (index1 = 0; index1 < groupIndex[i0].length; index1++) {\n groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];\n }\n }\n }\n else{\n for (i0 = 0; i0 < n0; ++i0) {\n groupIndex[i0] = reIndex[groupIndex[i0]];\n }\n }\n }\n\n // Modify the update and reset behavior based on the cardinality.\n // If the cardinality is less than or equal to one, then the groupIndex\n // is not needed. If the cardinality is zero, then there are no records\n // and therefore no groups to update or reset. Note that we also must\n // change the registered listener to point to the new method.\n j = filterListeners.indexOf(update);\n if (k > 1 || iterable) {\n update = updateMany;\n reset = resetMany;\n } else {\n if (!k && groupAll) {\n k = 1;\n groups = [{key: null, value: initial()}];\n }\n if (k === 1) {\n update = updateOne;\n reset = resetOne;\n } else {\n update = cr_null;\n reset = cr_null;\n }\n groupIndex = null;\n }\n filterListeners[j] = update;\n\n // Count the number of added groups,\n // and widen the group index as needed.\n function groupIncrement() {\n if(iterable){\n k++\n return\n }\n if (++k === groupCapacity) {\n reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);\n groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);\n groupCapacity = capacity(groupWidth);\n }\n }\n }\n\n function removeData(reIndex) {\n if (k > 1 || iterable) {\n var oldK = k,\n oldGroups = groups,\n seenGroups = cr_index(oldK, oldK),\n i,\n i0,\n j;\n\n // Filter out non-matches by copying matching group index entries to\n // the beginning of the array.\n if (!iterable) {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n seenGroups[groupIndex[j] = groupIndex[i]] = 1;\n ++j;\n }\n }\n } else {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n groupIndex[j] = groupIndex[i];\n for (i0 = 0; i0 < groupIndex[j].length; i0++) {\n seenGroups[groupIndex[j][i0]] = 1;\n }\n ++j;\n }\n }\n groupIndex = groupIndex.slice(0, j);\n }\n\n // Reassemble groups including only those groups that were referred\n // to by matching group index entries. Note the new group index in\n // seenGroups.\n groups = [], k = 0;\n for (i = 0; i < oldK; ++i) {\n if (seenGroups[i]) {\n seenGroups[i] = k++;\n groups.push(oldGroups[i]);\n }\n }\n\n if (k > 1 || iterable) {\n // Reindex the group index using seenGroups to find the new index.\n if (!iterable) {\n for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];\n } else {\n for (i = 0; i < j; ++i) {\n for (i0 = 0; i0 < groupIndex[i].length; ++i0) {\n groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];\n }\n }\n }\n } else {\n groupIndex = null;\n }\n filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable\n ? (reset = resetMany, update = updateMany)\n : k === 1 ? (reset = resetOne, update = updateOne)\n : reset = update = cr_null;\n } else if (k === 1) {\n if (groupAll) return;\n for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;\n groups = [], k = 0;\n filterListeners[filterListeners.indexOf(update)] =\n update = reset = cr_null;\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is greater than 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateMany(filterOne, filterOffset, added, removed, notFilter) {\n\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n j,\n k,\n n,\n g;\n\n if(iterable){\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceAdd(g.value, data[k], false, j);\n }\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceRemove(g.value, data[k], notFilter, j);\n }\n }\n }\n return;\n }\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g = groups[groupIndex[k]];\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g = groups[groupIndex[k]];\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateOne(filterOne, filterOffset, added, removed, notFilter) {\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n k,\n n,\n g = groups[0];\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is greater than 1.\n function resetMany() {\n var i,\n j,\n g;\n\n // Reset all group values.\n for (i = 0; i < k; ++i) {\n groups[i].value = reduceInitial();\n }\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n if(iterable){\n for (i = 0; i < n; ++i) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceAdd(g.value, data[i], true, j);\n }\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceRemove(g.value, data[i], false, j);\n }\n }\n }\n return;\n }\n\n for (i = 0; i < n; ++i) {\n g = groups[groupIndex[i]];\n g.value = reduceAdd(g.value, data[i], true);\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g = groups[groupIndex[i]];\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is 1.\n function resetOne() {\n var i,\n g = groups[0];\n\n // Reset the singleton group values.\n g.value = reduceInitial();\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n for (i = 0; i < n; ++i) {\n g.value = reduceAdd(g.value, data[i], true);\n }\n\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Returns the array of group values, in the dimension's natural order.\n function all() {\n if (resetNeeded) reset(), resetNeeded = false;\n return groups;\n }\n\n // Returns a new array containing the top K group values, in reduce order.\n function top(k) {\n var top = select(all(), 0, groups.length, k);\n return heap.sort(top, 0, top.length);\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce values, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Sets the reduce order, using the specified accessor.\n function order(value) {\n select = xfilterHeapselect.by(valueOf);\n heap = xfilterHeap.by(valueOf);\n function valueOf(d) { return value(d.value); }\n return group;\n }\n\n // A convenience method for natural ordering by reduce value.\n function orderNatural() {\n return order(cr_identity);\n }\n\n // Returns the cardinality of this group, irrespective of any filters.\n function size() {\n return k;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = indexListeners.indexOf(add);\n if (i >= 0) indexListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n i = dimensionGroups.indexOf(group);\n if (i >= 0) dimensionGroups.splice(i, 1);\n return group;\n }\n\n return reduceCount().orderNatural();\n }\n\n // A convenience function for generating a singleton group.\n function groupAll() {\n var g = group(cr_null), all = g.all;\n delete g.all;\n delete g.top;\n delete g.order;\n delete g.orderNatural;\n delete g.size;\n g.value = function() { return all()[0].value; };\n return g;\n }\n\n // Removes this dimension and associated groups and event listeners.\n function dispose() {\n dimensionGroups.forEach(function(group) { group.dispose(); });\n var i = dataListeners.indexOf(preAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = dataListeners.indexOf(postAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n filters.masks[offset] &= zero;\n return filterAll();\n }\n\n return dimension;\n }\n\n // A convenience method for groupAll on a dummy dimension.\n // This implementation can be optimized since it always has cardinality 1.\n function groupAll() {\n var group = {\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n value: value,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n var reduceValue,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n resetNeeded = true;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the reduce value. It must also listen to the parent\n // dimension for when data is added.\n filterListeners.push(update);\n dataListeners.push(add);\n\n // For consistency; actually a no-op since resetNeeded is true.\n add(data, 0, n);\n\n // Incorporates the specified new values into this group.\n function add(newData, n0) {\n var i;\n\n if (resetNeeded) return;\n\n // Cycle through all the values.\n for (i = n0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n function update(filterOne, filterOffset, added, removed, notFilter) {\n var i,\n k,\n n;\n\n if (resetNeeded) return;\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zero(k = added[i])) {\n reduceValue = reduceAdd(reduceValue, data[k], notFilter);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.only(k = removed[i], filterOffset, filterOne)) {\n reduceValue = reduceRemove(reduceValue, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce value from scratch.\n function reset() {\n var i;\n\n reduceValue = reduceInitial();\n\n // Cycle through all the values.\n for (i = 0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if it is filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce value, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Returns the computed reduce value.\n function value() {\n if (resetNeeded) reset(), resetNeeded = false;\n return reduceValue;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = dataListeners.indexOf(add);\n if (i >= 0) dataListeners.splice(i, 1);\n return group;\n }\n\n return reduceCount();\n }\n\n // Returns the number of records in this crossfilter, irrespective of any filters.\n function size() {\n return n;\n }\n\n // Returns the raw row data contained in this crossfilter\n function all(){\n return data;\n }\n\n // Returns row data with all dimension filters applied, except for filters in ignore_dimensions\n function allFiltered(ignore_dimensions) {\n var array = [],\n i = 0,\n mask = maskForDimensions(ignore_dimensions || []);\n\n for (i = 0; i < n; i++) {\n if (filters.zeroExceptMask(i, mask)) {\n array.push(data[i]);\n }\n }\n\n return array;\n }\n\n function onChange(cb){\n if(typeof cb !== 'function'){\n /* eslint no-console: 0 */\n console.warn('onChange callback parameter must be a function!');\n return;\n }\n callbacks.push(cb);\n return function(){\n callbacks.splice(callbacks.indexOf(cb), 1);\n };\n }\n\n function triggerOnChange(eventName){\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](eventName);\n }\n }\n\n return arguments.length\n ? add(arguments[0])\n : crossfilter;\n}\n\n// Returns an array of size n, big enough to store ids up to m.\nfunction cr_index(n, m) {\n return (m < 0x101\n ? xfilterArray.array8 : m < 0x10001\n ? xfilterArray.array16\n : xfilterArray.array32)(n);\n}\n\n// Constructs a new array of size n, with sequential values from 0 to n - 1.\nfunction cr_range(n) {\n var range = cr_index(n, n);\n for (var i = -1; ++i < n;) range[i] = i;\n return range;\n}\n\nfunction capacity(w) {\n return w === 8\n ? 0x100 : w === 16\n ? 0x10000\n : 0x100000000;\n}\n","export default function(t,e,i,n,r){for(r in n=(i=i.split(\".\")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)};\n//# sourceMappingURL=deepobj.m.js.map\n","module.exports = require(\"bows\");","module.exports = require(\"d3-array\");","module.exports = require(\"d3-format\");","module.exports = require(\"d3-time-format\");","module.exports = require(\"fastest-validator\");","module.exports = require(\"i18next\");","module.exports = require(\"lodash\");","module.exports = require(\"moment\");","module.exports = require(\"moment-timezone\");","module.exports = require(\"react\");","module.exports = require(\"reductio\");","module.exports = require(\"sundial\");","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(e) {\n if (\"function\" != typeof WeakMap) return null;\n var r = new WeakMap(),\n t = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {\n return e ? t : r;\n })(e);\n}\nfunction _interopRequireWildcard(e, r) {\n if (!r && e && e.__esModule) return e;\n if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return {\n \"default\": e\n };\n var t = _getRequireWildcardCache(r);\n if (t && t.has(e)) return t.get(e);\n var n = {\n __proto__: null\n },\n a = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var u in e) if (\"default\" !== u && Object.prototype.hasOwnProperty.call(e, u)) {\n var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;\n i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];\n }\n return n[\"default\"] = e, t && t.set(e, n), n;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nexport default function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import DataUtil from '../../utils/DataUtil';\n\nexport {\n DataUtil,\n};\n"],"names":["_lodash","_interopRequireDefault","require","_bows","_moment","_reductio","_basal","_datetime","_bloodglucose","_constants","AggregationUtil","exports","_createClass2","dataUtil","_this","_classCallCheck2","init","bgBounds","_","get","bgUnits","timezoneName","initialActiveEndpoints","cloneDeep","activeEndpoints","excludedDevices","reductio","registerPostProcessor","postProcessBasalAggregations","postProcessBolusAggregations","postProcessCalibrationAggregations","postProcessAutoSuspendAggregations","postProcessSiteChangeAggregations","postProcessSMBGAggregations","postProcessDataByDateAggregations","postProcessStatsByDateAggregations","aggregateBasals","group","filter","byType","reducer","dataList","tags","each","tag","reduceByTag","result","basal","post","automatedSuspend","aggregateBoluses","aggregateFingersticks","bgClass","reduceByBgClassification","smbg","calibration","aggregateSiteChanges","aggregateDataByDate","types","map","d","type","byTypes","aggregateStatsByDate","priorResults","data","filterByActiveRange","processedData","dataForDay","_dataForDay$value","value","suspend","temp","normalizeDatumOut","total","reduce","acc","_ref","_ref$count","count","key","sortBy","activeTimeField","subtotals","assign","countAutomatedBasalEvents","countDistinctSuspends","summarizeProcessedData","_dataForDay$value2","automated","correction","extended","interrupted","manual","oneButton","override","underride","wizard","length","previousSiteChangeDates","_ref2","some","includes","subType","siteChangeTypes","firstDatum","first","previousSiteChangeDatums","getPreviousSiteChangeDatums","formatLocalizedFromUTC","timePrefs","_dataForDay$value3","cannulaPrime","reservoirChange","tubingPrime","datums","summary","daysSince","dateDiff","Date","parse","MS_IN_DAY","NaN","byDate","_dataForDay$value4","meter","veryHigh","veryLow","high","low","datesWithData","activeRangeDates","range","days","val","index","moment","utc","tz","subtract","format","date","_this$dataUtil$filter","find","valueOf","activeDays","byEndpoints","sortedData","groupedData","groupBy","groupedBasals","bySampleIntervalRange","apply","_toConsumableArray2","cgmSampleIntervalRange","defaultCgmSampleIntervalRange","cbgData","top","Infinity","deduplicatedCbgData","getDeduplicatedCBGData","cbg","cbgDeduplicated","dimension","filterAll","bySampleInterval","groupedPumpSettingsOverrides","deviceEvent","initialGroupedPumpSettingsOverridesLength","addBasalOverlappingStart","addPumpSettingsOverrideOverlappingStart","typeData","isArray","unshift","getStats","stats","results","_this$initialActiveEn","_slicedToArray2","start","end","startMoment","endMoment","endOf","startDate","endDate","datum","clone","normalizeDatumBgUnits","classifyBgValue","arguments","undefined","sumBy","values","dateData","avgPerDay","keysIn","percentage","this","log","bows","_crossfilter","_momentTimezone","_i18next","_sundial","_device","_bolus","_StatUtil","_AggregationUtil","_stat","_schema","_excluded","t","i18next","bind","DataUtil","Validator","SchemaValidator","startTimer","crossfilter","queryDataCount","defaultCgmSampleInterval","MS_IN_MIN","setCgmSampleIntervalRange","buildDimensions","buildFilters","buildSorts","initFilterChangeHandler","endTimer","addData","rawData","patientId","returnData","bolusDatumsByIdMap","bolusToWizardIdMap","deviceUploadMap","latestDatumByType","pumpSettingsDatumsByIdMap","wizardDatumsByIdMap","wizardToBolusIdMap","loopDataSetsByIdMap","bolusDosingDecisionDatumsByIdMap","matchedDevices","dataAnnotations","isEmpty","removeData","normalizeDatumIn","joinWizardAndBolus","joinBolusAndDosingDecision","addMissingSuppressedBasals","clearFilters","validData","uniqBy","rejectedData","remove","reject","byId","id","tagDatum","add","setMetaData","metaData","getMetaData","rate","deliveryType","suppressed","normalizeSuppressedBasal","isFinite","duration","annotations","_d$suppressed","maxDuration","toISOString","time","min","dataSetType","isLoop","messagetext","messageText","parentMessage","parentmessage","timestamp","sampleInterval","_d$deviceId","isLibreViewAPI","push","code","deviceId","indexOf","_d$requestedBolus","_d$requestedBolus2","_d$recommendedBolus$n","_d$recommendedBolus$e","requestedBolus","normal","amount","recommendedBolus","validateDatumIn","_time","_deviceTime","deviceTime","timeChange","isString","bolus","reason","HKdeviceId","uploadId","slice","join","dexDeviceId","isWizard","fieldToPopulate","idMap","datumMap","datumToPopulate","omit","rejectReason","timeThreshold","dosingDecision","mapValues","_ref$associations","associations","proximateDosingDecisions","Math","abs","sortedProximateDosingDecisions","orderBy","_ref3","dosingDecisionWithMatchingNormal","_dosingDecision$reque","concat","_$find","_d$dosingDecision$ori","_d$dosingDecision$ori2","_d$dosingDecision$ori3","_d$dosingDecision$ori4","_d$dosingDecision$foo","_d$dosingDecision$foo2","_d$dosingDecision$foo3","_d$dosingDecision","_d$dosingDecision$smb","_$last","_d$dosingDecision$ins","_d$dosingDecision$req","associatedPumpSettingsId","pumpSettings","carbInput","originalFood","nutrition","carbohydrate","net","food","bgInput","last","bgHistorical","insulinOnBoard","requestedNormal","expectedNormal","pumpSettingsByStartTimes","_ref4","activeSchedule","basalSchedules","basalSchedule","basalsToAdd","isTwiistLoop","shouldGenerateSuppressedBasal","pumpSettingsDatum","ps","basalEndTime","timezoneOffsetMs","timezoneOffset","basalMsPer24WithOffset","getMsPer24","currentDaySegments","nextDaySegments","sortedSchedule","i","segment","nextSegment","segmentStart","segmentEnd","_objectSpread5","overlapStart","max","overlapEnd","extendedSegmentStart","extendedSegmentEnd","overlappingSegments","originalDuration","basalDurationMs24","firstSegment","firstSegmentDuration","cumulativeDuration","segmentDuration","newBasal","needsCarbToExchangeConversion","carbUnits","findIndex","getDeconvertedCarbExchange","deconvertedCarbInput","round","_d$dosingDecision2","_d$dosingDecision2$fo","_d$dosingDecision2$fo2","_d$dosingDecision2$fo3","isWizardOrDosingDecision","isAutomated","isCorrection","hasExtended","isInterruptedBolus","isOverride","isUnderride","loop","isOneButton","_d$reason","_d$payload","_d$payload$suspended","_d$tags","isReservoirChange","isPrime","status","suspended","payload","_defineProperty2","SITE_CHANGE","SITE_CHANGE_RESERVOIR","SITE_CHANGE_CANNULA","primeTarget","SITE_CHANGE_TUBING","recognizedAlarmTypes","ALARM_NO_INSULIN","ALARM_NO_POWER","ALARM_OCCLUSION","ALARM","alarmType","prioritizedEventTypes","EVENT_PUMP_SHUTDOWN","events","isControlIQ","eventType","EVENT","validator","common","isFunction","validateResult","validationMethod","fields","returnRawData","fieldToRestore","normalizeAllFields","normalizeDatumOutTime","deviceSerialNumber","uploadMap","source","normalEnd","normalTime","incompleteSuspends","suspendStart","msPer24","localDate","flatten","partition","name","_ref6","isObject","insulinCarbRatio","isOverrideEvent","isTidepoolLoop","isDIYLoop","currentTime","latestDiabetesDatumEnd","localTime","displayOffset","normalTimeISO","hourOfDay","MS_IN_HOUR","fillDate","replace","setDataAnnotations","getOffset","conversionOffset","warning","keysPaths","keys","units","bgPrefs","isPlainObject","bg","MGDL_UNITS","normalizeAtPath","path","pathValue","isNumber","_d$bgNormalized","setPath","bgNormalized","set","convertToMGDL","nestedKey","nestedValue","item","percent","deduplicateCBGData","sort","byTime","OVERLAP_TOLERANCE","blackoutUntil","output","currentRecord","memoize","_$first","_$last2","_this$bgPrefs","firstDatumId","lastDatumId","predicate","matches","clearMatchedDevices","clearDataAnnotations","bgSources","latestPumpUpload","devices","updateDatum","updatedDatum","existingDatum","updateDatumClone","buildByTimeDimension","resultingDatum","buildByDayOfWeekDimension","byDayOfWeek","day","buildByDateDimension","buildByIdDimension","buildBySubTypeDimension","bySubType","buildByTypeDimension","buildByDeviceIdDimension","byDeviceId","buildBySampleIntervalDimension","byActiveDays","filterFunction","endpoints","filterRange","byDeviceIds","excludedDeviceIds","filterExact","activeSubType","activeType","array","timeField","a","b","onChange","matchDevices","currentFilter","origin","version","deviceName","deviceVersionId","setBgSources","current","CGM_DATA_KEY","BGM_DATA_KEY","compact","setLatestPumpUpload","uploadData","getLatestPumpUpload","latestUploadSource","toLowerCase","manufacturer","deviceModel","latestPumpSettings","latestPumpSettingsOrUpload","pumpIsAutomatedBasalDevice","isAutomatedBasalDevice","pumpIsAutomatedBolusDevice","isAutomatedBolusDevice","pumpIsSettingsOverrideDevice","isSettingsOverrideDevice","basalData","lastManualBasalSchedule","getLastManualBasalSchedule","settings","setUploadMap","pumpSettingsData","upload","deviceManufacturers","model","TWIIST_LOOP","TIDEPOOL_LOOP","DIY_LOOP","serialNumber","setIncompleteSuspends","deviceEventData","_ref8","_ref8$annotations","setSize","size","setLatestDiabetesDatumEnd","latestDiabetesDatum","maxBy","_ref9","DIABETES_DATA_TYPES","setLatestTimeZone","_latestTimeChangeEven","latestTimeZone","latestUpload","latestTimeChangeEvent","latestTimeZoneOffsetDatum","_ref10","createLatestTimeZone","sundial","checkTimezoneName","localizedTime","message","e","timezone","offsetSign","sign","offsetDuration","offsetHours","hours","minutes","utcOffset","to","timeZoneName","setDevices","uploadsById","keyBy","device","isContinuous","deviceManufacturer","label","bgm","deviceTags","cgm","oneMinCgmSampleInterval","isOneMinCGMSampleIntervalDevice","pump","allDeviceIds","preCIQDeviceID","setExcludedDevices","uniq","_d$annotations","trackDataAnnotations","annotation","setBgPrefs","setTimePrefs","setEndpoints","setActiveDays","setTypes","nextDays","prevDays","diff","next","nextStartIsDST","isDST","nextEndIsDST","offset","prev","prevStartIsDST","Array","nextDay","dayOfWeek","setStats","split","trim","groupByType","all","select","dispose","_timePrefs$timezoneAw","timezoneAware","getTimezoneFromTimePrefs","timezoneNameChanged","timezoneAwareChanged","prevActiveTimeField","activeTimeFieldChanged","dimensionUpdates","_bgPrefs$bgBounds","DEFAULT_BG_BOUNDS","_bgPrefs$bgClasses","bgClasses","_bgPrefs$bgUnits","rest","_objectWithoutProperties2","defaults","boundary","veryLowThreshold","targetLowerBound","target","targetUpperBound","veryHighThreshold","setReturnRawData","returnRaw","deviceIds","query","_this$bgSources","_this$endpoints","_this$endpoints$curre","aggregationsByDate","bgSource","fillData","raw","activeDaysChanged","isEqual","bgSourceChanged","endpointsChanged","excludedDevicesChanged","rangeEndpoints","rangeKey","activeRange","requestedMetaData","dataAnnotationsRequested","intersection","commonStats","sensorUsage","timeInRange","getAggregationsByDate","getTypeData","fill","getFillData","generatedStats","statUtil","StatUtil","stat","method","statFetchMethods","selectedAggregationsByDate","generatedAggregationsByDate","groupByDate","aggregationMethods","basals","boluses","fingersticks","siteChanges","dataByDate","statsByDate","aggregationUtil","aggregationType","opts","fillBinCount","hourlyStarts","startOf","prevFill","startTime","adjustForDSTChanges","splice","selectedMetaData","pick","prevFilters","previousPrimeData","reverse","previousReservoirChangeData","generatedData","_ref11","_this$filter","_ref11$select","_ref11$sort","returnAllFields","trimOverlappingStart","initalDataLength","trimOverlappingEnd","indexOfLastDurationDatum","findLastIndex","sortOpts","sortArray","field","order","normalizeFields","previousBasalDatum","pumpSettingsOverrideData","previousPumpSettingsOverrideDatum","noop","filterCBGDataByDefaultSampleInterval","getAverageGlucoseData","returnBgData","bgData","averageGlucose","meanBy","getBgExtentsData","bgDaysWorn","rawBgData","newestDatum","oldestDatum","bgMax","bgMin","minBy","getBasalBolusData","bolusData","rawBasalData","activeDaysWithInsulinData","Set","basalBolusData","parseFloat","getTotalBasalFromEndpoints","getTotalBolus","getCarbsData","wizardData","foodData","activeDaysWithCarbData","wizardCarbs","_objectSpread3","grams","exchanges","foodCarbs","carbs","getCoefficientOfVariationData","_this$getStandardDevD","getStandardDevData","insufficientData","coefficientOfVariationData","coefficientOfVariation","standardDeviation","getDailyAverageSums","getDailyAverageDurations","sum","getGlucoseManagementIndicatorData","_this$getAverageGluco","glucoseManagementIndicator","MGDL_PER_MMOLL","glucoseManagementIndicatorAGP","getReadingsInRangeData","smbgData","initialValue","counts","readingsInRangeData","classification","dailyAverages","getSensorUsage","rawCbgData","_this$getBgExtentsDat","sensorUsageAGP","ceil","_this$getAverageGluco2","squaredDiffs","pow","sqrt","getTimeInAutoData","durations","transform","getBasalGroupDurationsFromEndpoints","isNaN","getTimeInOverrideData","rawPumpSettingsOverrideData","trimmedDurationData","getTimeInRangeData","timeInRangeData","getTotalInsulinData","_this$getBasalBolusDa","totalInsulin","getBasalPathGroupType","getBasalDurationWithinRange","basalSequences","currentBasal","seq","idx","nextBasal","discontinuousEnd","s","getEndpoints","datetime","initialSegmentDuration","dose","getSegmentDose","formatInsulin","_format","suppressedDeliveryType","getBasalPathGroups","currentPathType","basalPathGroups","pathType","optionalExtents","startIndex","endIndex","ONE_HR","precisionRound","rangeStart","rangeEnd","datumStart","datumEnd","datumStartIsWithinRange","datumEndIsWithinRange","datumEncompassesRange","trimmedStart","trimmedEnd","shift","automatedStop","event","suspends","distinct","skipped","bgValue","classificationType","Error","gt","MMOLL_UNITS","precision","roundedValue","bankersRound","minimumIncrement","BG_DISPLAY_MINIMUM_INCREMENTS","thresholds","threshold","formatBgValue","highLowerBound","lowUpperBound","extremeHighThreshold","condensed","anyLow","anyHigh","extremeHigh","segmented","suffix","prefix","bgDatum","outOfRangeAnnotation","bgType","binSize","outerQuantiles","binned","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","TWENTY_FOUR_HRS","String","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","clampThreshold","_d3Array","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","binKey","_outerQuantiles","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","centerOfBinMs","parseInt","quantile","firstQuartile","median","thirdQuartile","msX","msFrom","msTo","outOfRangeThresholds","mean","insulinEvent","getBolusFromInsulinEvent","getWizardFromInsulinEvent","inRange","expectedExtended","programmed","getProgrammed","formatPercentage","expectedDuration","recommended","getRecommended","insulinEvents","getDelivered","Boolean","carb","cancelledDuringNormal","cancelledDuringExtended","amountRecommended","fixFloatingPoint","n","formatDecimalNumber","netRecommendation","rec","_BG_DISPLAY_MINIMUM_I","_DEFAULT_BG_BOUNDS","_ADA_OLDER_HIGH_RISK_","_ADA_PREGNANCY_T1_BG_","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_TIDEPOOL_LOOP","_TWIIST_LOOP","_DIY_LOOP","_default","_pumpVocabulary","_settingsOverrides","returnEmptyString","nsSeparator","stiffness","damping","ADA_STANDARD","ADA_OLDER_HIGH_RISK","ADA_PREGNANCY_T1","ADA_GESTATIONAL_T2","PRESET","CUSTOM","ADA_PREGNANCY_T1_BG_BOUNDS","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","ALARM_NO_DELIVERY","ALARM_AUTO_OFF","ALARM_OVER_LIMIT","AUTOMATED_BOLUS","AUTOMATED_DELIVERY","AUTOMATED_SUSPEND","AUTOMATED_MODE_EXITED","SCHEDULED_DELIVERY","SETTINGS_OVERRIDE","SLEEP","PHYSICAL_ACTIVITY","PREPRANDIAL","MAX_BOLUS","MAX_BASAL","ONE_BUTTON_BOLUS","INSULIN_DURATION","INSULET","TANDEM","ANIMAS","MEDTRONIC","MICROTECH","BG_DATA_TYPES","marker","patient","bday","utcFormat","milliseconds","isNull","isUndefined","timeFormat","dateParseFormat","monthFormat","isSameYear","isSame","isSameDay","startFormat","endFormat","diagnosis","momentDuration","seconds","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","formatted","roundedMinutes","roundedHours","roundedDays","localized","utcHammertime","zone","_d3TimeFormat","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","err","getLocalizedCeiling","period","startOfPeriod","toDate","endOfToday","endOfProvidedDay","daysAgo","minutesAgo","hoursAgo","daysText","hoursText","unit","minutesText","lastManualBasal","findLast","vocabulary","pumpVocabulary","getUppercasedManufacturer","settingsOverrides","pumpSettingsOrUpload","AUTOMATED_BASAL_DEVICE_MODELS","_datum$client4","_datum$origin","TARGET","client","_data","_datum$client","test","_datum$client2","_datum$client3","majorVersion","_datum$tags","part","upperCase","upperFirst","lowThreshold","highThreshold","convertToMmolL","BG_LOW","BG_HIGH","toFixed","toString","decimalLength","qtyString","useAGPFormat","Number","_d3Format","x","r","places","settingsData","uploadedTime","schedule","uploaded","serial","scheduleName","activeName","deviceKey","noUnits","displayName","main","secondary","names","schedules","position","_settings$units","deviceLabels","getPumpVocabulary","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","rows","setting","MAX_BASAL_RATE_PRECISION_PLACES","_settings$insulinMode","_settings$insulinMode2","_settings$insulinMode3","insulinModel","rapidAdult","rapidChild","fiasp","lyumjev","afrezza","modelType","peakMinutes","actionPeakOffset","insulinModelAnnotations","bgSafetyLimit","columns","_settings$units2","_deviceLabels$PREPRAN","_deviceLabels$PHYSICA","correctionRange","bgTargetPreprandial","bgTargetPhysicalActivity","scheduleData","starts","getStarts","noRateData","getBasalRate","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","getValue","sensitivityData","bgTargets","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","_interopRequireWildcard","BASAL_RATE_PRECISION_PLACES","noData","animas","insulet","medtronic","tandem","microtech","twiist","fieldName","timedData","finish","hrs","textUtil","formatFn","formatDatum","reshapeBgClassesToBgBounds","statsString","_stat$data","_stat$data$raw","renderTable","readingsInRange","timeInAuto","timeInOverride","bgExtents","renderSecondaryValue","forcePlainTextValues","statTitle","title","buildTextTable","dataFormat","formattedText","tooltip","legendTitle","showHeader","dataPaths","buildTextLine","_statFetchMethods","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","statFormats","bgCount","bgRange","cv","gmi","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","getSum","ensureNumeric","isNil","isRangeDefined","deviation","lowerValue","lowerColorId","upperValue","upperColorId","_opts$emptyDataPlaceh","emptyDataPlaceholder","_opts$forcePlainTextV","disableStat","generateBgRangeLabels","_value","classifyCvValue","formatDuration","formatStatsPercentage","createElement","style","color","BG_COLORS","LBS_PER_KG","getStatAnnotations","labels","overrideLabel","overrideLabelLowerCase","lowerCase","bgStats","bgSourceLabel","smbgLabel","cbgLabel","automatedLabel","getStatData","_data$readingsInRange","_data$readingsInRange2","getSettingsOverrides","bgRanges","statData","_objectSpread2","readingsInRangeDataPath","options","suffixValue","inputValue","dividend","summaryAGP","totalReadings","averageDailyReadings","scheduledLabel","getStatTitle","bgTypeLabel","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","legend","hideSummaryUnits","reverseLegendOrder","_fastestValidator","v","messages","missingFieldDependancy","schema","object","missingFields","makeError","JSON","stringify","processedRule","_processRule","_checkWrapper","checkWrapper","errors","fieldValue","fieldPath","patterns","ISODate","ISODateSince2008","rejectBadDeviceStatus","optional","forbidden","minZero","postiveNumber","positive","pattern","enum","basalCommon","props","basalPostShutdown","items","normalBolus","extendedBolus","combinationBolus","settingsScheduleStart","pumpSettingsAnimas","pumpSettingsMedtronic","pumpSettingsOmnipod","pumpSettingsTandem","pumpSettingsEquil","pumpSettingsLoop","compile","postShutdown","combination","omnipod","equil","array8","arrayUntyped","array16","array32","arrayLengthen","arrayLengthenUntyped","arrayWiden","arrayWidenUntyped","width","bitarray","subarrays","masks","Uint8Array","Uint16Array","Uint32Array","copy","constructor","prototype","lengthen","len","m","w","one","dest","src","truncate","j","zero","zeroExcept","zeroExceptMask","mask","only","onlyExcept","onlyOffset","onlyOne","heap_by","f","heap","lo","hi","sift","child","h","identity","by","heapselect_by","k","queue","bisect_by","bisectRight","mid","right","left","bisect","deep","p","obj","prop","call","reg","REMOVED_INDEX","heapselect","permute","filters","newIndex","removed","usePred","shouldRemove","index1","index2","filterListeners","forEach","l","removeDataListeners","index3","index4","triggerOnChange","iterable","accessorPath","newValues","iterablesIndexCount","iterablesIndexFilterStatus","refilterFunction","filterValue","filterValuePresent","hasCurrentFilter","top_offset","hi0","toSkip","lo0","iterablesEmptyRows","bottom","bottom_offset","groupAll","g","orderNatural","accessor","sortRange","cr_range","A","B","refilter","indexListeners","dimensionGroups","dataListeners","preAdd","postAdd","tmp","newData","n0","n1","newIterablesIndexCount","newIterablesIndexFilterStatus","i0","cr_index","unsortedIndex","sortMap","bounds","lo1","hi1","old_n0","oldValues","oldIndex","oldIterablesIndexFilterStatus","i1","oldiiclength","index5","reIndex","oldDataIndex","filterIndexBounds","filterIndexFunction","added","valueIndexAdded","valueIndexRemoved","newAdded","newRemoved","indexLength","groups","reduceCount","reduceSum","groupIndex","reduceAdd","reduceRemove","reduceInitial","n0old","groupWidth","groupCapacity","capacity","update","reset","resetNeeded","g0","x0","x1","oldGroups","initial","k0","groupIncrement","updateMany","resetMany","updateOne","resetOne","oldK","seenGroups","filterOne","filterOffset","notFilter","reduceValue","allFiltered","ignore_dimensions","maskForDimensions","cb","callbacks","console","warn","isElementFiltered","dimensions","eventName","module","__esModule","_typeof","_getRequireWildcardCache","WeakMap","has","__proto__","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","o","Symbol","iterator","_arrayLikeToArray","arr","arr2","_classCallCheck","instance","Constructor","TypeError","_defineProperties","descriptor","enumerable","configurable","writable","_createClass","protoProps","staticProps","_defineProperty","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptors","defineProperties","_objectWithoutProperties","excluded","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","_slicedToArray","done","unsupportedIterableToArray","_toConsumableArray","arrayLikeToArray","iter","from","_toPropertyKey","arg","prim","toPrimitive","res","hint","_unsupportedIterableToArray","minLen","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","toStringTag","_DataUtil"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"data.js","mappings":"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","sources":["webpack://@tidepool/viz/./src/utils/AggregationUtil.js","webpack://@tidepool/viz/./src/utils/DataUtil.js","webpack://@tidepool/viz/./src/utils/StatUtil.js","webpack://@tidepool/viz/./src/utils/basal.js","webpack://@tidepool/viz/./src/utils/bloodglucose.js","webpack://@tidepool/viz/./src/utils/bolus.js","webpack://@tidepool/viz/./src/utils/constants.js","webpack://@tidepool/viz/./src/utils/datetime.js","webpack://@tidepool/viz/./src/utils/device.js","webpack://@tidepool/viz/./src/utils/format.js","webpack://@tidepool/viz/./src/utils/settings/data.js","webpack://@tidepool/viz/./src/utils/stat.js","webpack://@tidepool/viz/./src/utils/validation/schema.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/array.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/filter.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/identity.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/null.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/zero.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/heap.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/heapselect.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/bisect.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/permute.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/reduce.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/result.js","webpack://@tidepool/viz/./node_modules/crossfilter2/src/index.js","webpack://@tidepool/viz/./node_modules/@ranfdev/deepobj/dist/deepobj.m.js","webpack://@tidepool/viz/external commonjs \"bows\"","webpack://@tidepool/viz/external commonjs \"d3-array\"","webpack://@tidepool/viz/external commonjs \"d3-format\"","webpack://@tidepool/viz/external commonjs \"d3-time-format\"","webpack://@tidepool/viz/external commonjs \"fastest-validator\"","webpack://@tidepool/viz/external commonjs \"i18next\"","webpack://@tidepool/viz/external commonjs \"lodash\"","webpack://@tidepool/viz/external commonjs \"moment\"","webpack://@tidepool/viz/external commonjs \"moment-timezone\"","webpack://@tidepool/viz/external commonjs \"react\"","webpack://@tidepool/viz/external commonjs \"reductio\"","webpack://@tidepool/viz/external commonjs \"sundial\"","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@tidepool/viz/./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://@tidepool/viz/webpack/bootstrap","webpack://@tidepool/viz/webpack/runtime/define property getters","webpack://@tidepool/viz/webpack/runtime/hasOwnProperty shorthand","webpack://@tidepool/viz/webpack/runtime/make namespace object","webpack://@tidepool/viz/./src/modules/data/index.js"],"sourcesContent":["import _ from 'lodash';\nimport bows from 'bows';\nimport moment from 'moment';\nimport reductio from 'reductio';\n\nimport {\n countAutomatedBasalEvents,\n countDistinctSuspends,\n} from './basal';\n\nimport { formatLocalizedFromUTC } from './datetime';\nimport { classifyBgValue } from './bloodglucose';\nimport { MS_IN_DAY } from './constants';\n\nexport class AggregationUtil {\n /**\n * @param {Object} dataUtil - a DataUtil instance\n */\n constructor(dataUtil) {\n this.log = bows('AggregationUtil');\n this.init(dataUtil);\n }\n\n init = (dataUtil) => {\n this.dataUtil = dataUtil;\n this.bgBounds = _.get(dataUtil, 'bgPrefs.bgBounds');\n this.bgUnits = _.get(dataUtil, 'bgPrefs.bgUnits');\n this.timezoneName = _.get(dataUtil, 'timePrefs.timezoneName', 'UTC');\n this.initialActiveEndpoints = _.cloneDeep(this.dataUtil.activeEndpoints);\n this.excludedDevices = _.get(dataUtil, 'excludedDevices', []);\n\n reductio.registerPostProcessor('postProcessBasalAggregations', this.postProcessBasalAggregations);\n reductio.registerPostProcessor('postProcessBolusAggregations', this.postProcessBolusAggregations);\n reductio.registerPostProcessor('postProcessCalibrationAggregations', this.postProcessCalibrationAggregations);\n reductio.registerPostProcessor('postProcessAutoSuspendAggregations', this.postProcessAutoSuspendAggregations);\n reductio.registerPostProcessor('postProcessSiteChangeAggregations', this.postProcessSiteChangeAggregations);\n reductio.registerPostProcessor('postProcessSMBGAggregations', this.postProcessSMBGAggregations);\n reductio.registerPostProcessor('postProcessDataByDateAggregations', this.postProcessDataByDateAggregations);\n reductio.registerPostProcessor('postProcessStatsByDateAggregations', this.postProcessStatsByDateAggregations);\n };\n\n aggregateBasals = group => {\n this.dataUtil.filter.byType('basal');\n\n let reducer = reductio();\n reducer.dataList(true);\n\n let tags = [\n 'suspend',\n 'temp',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'basal', reducer));\n\n reducer(group);\n\n const result = {\n basal: group.post().postProcessBasalAggregations()(),\n };\n\n this.dataUtil.filter.byType('deviceEvent');\n\n reducer = reductio();\n reducer.dataList(true);\n\n tags = [\n 'automatedSuspend',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n result.automatedSuspend = group.post().postProcessAutoSuspendAggregations()();\n return result;\n };\n\n aggregateBoluses = group => {\n this.dataUtil.filter.byType('bolus');\n\n const reducer = reductio();\n reducer.dataList(true);\n\n const tags = [\n 'automated',\n 'correction',\n 'extended',\n 'interrupted',\n 'manual',\n 'oneButton',\n 'override',\n 'underride',\n 'wizard',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'bolus', reducer));\n\n reducer(group);\n\n return group.post().postProcessBolusAggregations()();\n };\n\n aggregateFingersticks = group => {\n this.dataUtil.filter.byType('smbg');\n\n let reducer = reductio();\n reducer.dataList(true);\n\n let tags = [\n 'manual',\n 'meter',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'smbg', reducer));\n\n const bgClasses = [\n 'veryLow',\n 'low',\n 'high',\n 'veryHigh',\n ];\n\n _.each(bgClasses, bgClass => this.reduceByBgClassification(bgClass, 'smbg', reducer));\n\n reducer(group);\n\n const result = {\n smbg: group.post().postProcessSMBGAggregations()(),\n };\n\n this.dataUtil.filter.byType('deviceEvent');\n\n reducer = reductio();\n reducer.dataList(true);\n\n tags = [\n 'calibration',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n result.calibration = group.post().postProcessCalibrationAggregations()();\n\n return result;\n };\n\n aggregateSiteChanges = group => {\n this.dataUtil.filter.byType('deviceEvent');\n\n const reducer = reductio();\n reducer.dataList(true);\n\n const tags = [\n 'cannulaPrime',\n 'reservoirChange',\n 'tubingPrime',\n ];\n\n _.each(tags, tag => this.reduceByTag(tag, 'deviceEvent', reducer));\n\n reducer(group);\n\n return group.post().postProcessSiteChangeAggregations()();\n };\n\n aggregateDataByDate = group => {\n const types = _.map(this.dataUtil.types, d => d.type);\n this.dataUtil.filter.byTypes(types);\n\n const reducer = reductio();\n reducer.dataList(true);\n\n reducer(group);\n\n return group.post().postProcessDataByDateAggregations()();\n };\n\n aggregateStatsByDate = group => {\n const reducer = reductio();\n reducer.dataList(true);\n\n reducer(group);\n\n return group.post().postProcessStatsByDateAggregations()();\n };\n\n /**\n * postProcessBasalAggregations\n *\n * Post processor for crossfilter reductio basal aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for basal aggregations\n */\n postProcessBasalAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n suspend,\n temp,\n },\n } = dataForDay;\n\n _.each(dataList, this.dataUtil.normalizeDatumOut);\n\n const total = _.reduce([suspend, temp], (acc, { count = 0 }) => acc + count, 0);\n\n processedData[dataForDay.key] = {\n data: _.sortBy(dataList, this.dataUtil.activeTimeField),\n total,\n subtotals: {\n suspend: suspend.count,\n temp: temp.count,\n },\n };\n\n _.assign(\n processedData[dataForDay.key],\n countAutomatedBasalEvents(processedData[dataForDay.key])\n );\n\n _.assign(\n processedData[dataForDay.key],\n countDistinctSuspends(processedData[dataForDay.key])\n );\n\n if (processedData[dataForDay.key].total === 0) {\n // If there's no events for the day, we don't need to return it\n delete processedData[dataForDay.key].data;\n } else {\n // No need to return the data - we only want the aggregations\n delete processedData[dataForDay.key].data;\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessBolusAggregations\n *\n * Post processor for crossfilter reductio bolus aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for bolus aggregations\n */\n postProcessBolusAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n automated,\n correction,\n dataList,\n extended,\n interrupted,\n manual,\n oneButton,\n override,\n underride,\n wizard,\n },\n } = dataForDay;\n\n // Exclude automated boluses from total so that total and average per day only include\n // patient-initiated boluses\n const total = dataList.length - automated.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n automated: automated.count,\n correction: correction.count,\n extended: extended.count,\n interrupted: interrupted.count,\n manual: manual.count,\n oneButton: oneButton.count,\n override: override.count,\n underride: underride.count,\n wizard: wizard.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessCalibrationAggregations\n *\n * Post processor for crossfilter reductio calibration aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for calibration aggregations\n */\n postProcessCalibrationAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n calibration,\n },\n } = dataForDay;\n\n const total = calibration.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n calibration: calibration.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessAutoSuspendAggregations\n *\n * Post processor for crossfilter reductio automatedSuspend aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for automatedSuspend aggregations\n */\n postProcessAutoSuspendAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n automatedSuspend,\n },\n } = dataForDay;\n\n const total = automatedSuspend.count;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n automatedSuspend: automatedSuspend.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessSiteChangeAggregations\n *\n * Post processor for crossfilter reductio siteChange aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for siteChange aggregations\n */\n postProcessSiteChangeAggregations = priorResults => () => {\n const data = _.filter(\n _.cloneDeep(priorResults()),\n ({ value: { dataList } }) => _.some(\n dataList,\n d => _.includes(['prime', 'reservoirChange'], d.subType)\n )\n );\n\n const siteChangeTypes = [\n 'cannulaPrime',\n 'reservoirChange',\n 'tubingPrime',\n ];\n\n const processedData = {};\n let previousSiteChangeDates;\n\n if (data.length) {\n const firstDatum = _.first(\n _.sortBy(\n _.filter(data[0].value.dataList, d => _.includes(['prime', 'reservoirChange'], d.subType)),\n this.dataUtil.activeTimeField\n )\n );\n\n const previousSiteChangeDatums = this.dataUtil.getPreviousSiteChangeDatums(firstDatum);\n const dateFormat = 'YYYY-MM-DD';\n\n previousSiteChangeDates = {};\n\n _.each(siteChangeTypes, type => {\n if (previousSiteChangeDatums[type]) {\n previousSiteChangeDates[type] = formatLocalizedFromUTC(\n previousSiteChangeDatums[type][this.dataUtil.activeTimeField],\n this.dataUtil.timePrefs,\n dateFormat\n );\n }\n });\n }\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n cannulaPrime,\n reservoirChange,\n tubingPrime,\n },\n } = dataForDay;\n\n const datums = _.sortBy(dataList, this.dataUtil.activeTimeField);\n _.each(datums, this.dataUtil.normalizeDatumOut);\n\n processedData[dataForDay.key] = {\n data: datums,\n summary: {\n daysSince: {},\n },\n subtotals: {\n cannulaPrime: cannulaPrime.count,\n reservoirChange: reservoirChange.count,\n tubingPrime: tubingPrime.count,\n },\n };\n\n _.each(siteChangeTypes, type => {\n if (processedData[dataForDay.key].subtotals[type]) {\n if (previousSiteChangeDates[type]) {\n const dateDiff = Date.parse(dataForDay.key) - Date.parse(previousSiteChangeDates[type]);\n processedData[dataForDay.key].summary.daysSince[type] = dateDiff / MS_IN_DAY;\n } else {\n processedData[dataForDay.key].summary.daysSince[type] = NaN;\n }\n\n previousSiteChangeDates[type] = dataForDay.key;\n }\n });\n });\n\n return {\n byDate: processedData,\n };\n };\n\n /**\n * postProcessSMBGAggregations\n *\n * Post processor for crossfilter reductio smbg aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted total and subtotal data for smbg aggregations\n */\n postProcessSMBGAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const processedData = {};\n\n _.each(data, dataForDay => {\n const {\n value: {\n dataList,\n manual,\n meter,\n veryHigh,\n veryLow,\n high,\n low\n },\n } = dataForDay;\n\n const total = dataList.length;\n\n if (total) {\n processedData[dataForDay.key] = {\n total,\n subtotals: {\n manual: manual.count,\n meter: meter.count,\n veryHigh: veryHigh.count,\n veryLow: veryLow.count,\n high: high.count,\n low: low.count,\n },\n };\n }\n });\n\n return this.summarizeProcessedData(processedData);\n };\n\n /**\n * postProcessDataByDateAggregations\n *\n * Post processor for crossfilter reductio data by date aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted data by date aggregations for all types\n */\n postProcessDataByDateAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const datesWithData = _.map(data, 'key');\n const processedData = {};\n\n const activeRangeDates = _.map(_.range(this.initialActiveEndpoints.days || 0), (val, index) => (\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName)).subtract(index + 1, 'days').format('YYYY-MM-DD')\n );\n\n _.each(activeRangeDates, (date, index) => {\n if (_.includes(datesWithData, date)) {\n const dataForDay = _.find(data, { key: date });\n\n const {\n value: {\n dataList,\n },\n } = dataForDay;\n\n // Set the endpoints to filter current data for day\n this.dataUtil.activeEndpoints = {\n range: [\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index + 1, 'days').valueOf(),\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index, 'days').valueOf(),\n ],\n days: 1,\n activeDays: 1,\n };\n\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n const sortedData = _.sortBy(dataList, this.dataUtil.activeTimeField);\n const groupedData = _.groupBy(sortedData, 'type');\n const groupedBasals = _.cloneDeep(groupedData.basal || []);\n\n // Filter cgm data by the currently-set sample interval range.\n this.dataUtil.filter.bySampleIntervalRange(...(this.dataUtil.cgmSampleIntervalRange || this.dataUtil.defaultCgmSampleIntervalRange));\n\n const cbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const deduplicatedCbgData = this.dataUtil.getDeduplicatedCBGData(cbgData);\n\n groupedData.cbg = cbgData;\n groupedData.cbgDeduplicated = deduplicatedCbgData;\n\n // Clear the previous byType and bySampleInterval filters so as to not affect the next aggregations\n this.dataUtil.dimension.byType.filterAll();\n this.dataUtil.dimension.bySampleInterval.filterAll();\n\n const groupedPumpSettingsOverrides = _.filter(\n _.cloneDeep(groupedData.deviceEvent || []),\n { subType: 'pumpSettingsOverride' }\n );\n\n const initialGroupedPumpSettingsOverridesLength = groupedPumpSettingsOverrides.length;\n\n this.dataUtil.addBasalOverlappingStart(groupedBasals);\n this.dataUtil.addPumpSettingsOverrideOverlappingStart(groupedPumpSettingsOverrides);\n\n _.each(groupedData, typeData => _.each(typeData, d => this.dataUtil.normalizeDatumOut(d, ['*'])));\n\n if (groupedBasals.length > _.get(groupedData, 'basal.length', 0)) {\n if (!_.isArray(groupedData.basal)) groupedData.basal = [];\n groupedData.basal.unshift(groupedBasals[0]);\n }\n\n if (groupedPumpSettingsOverrides.length > initialGroupedPumpSettingsOverridesLength) {\n if (!_.isArray(groupedData.deviceEvent)) groupedData.deviceEvent = [];\n groupedData.deviceEvent.unshift(groupedPumpSettingsOverrides[0]);\n }\n\n processedData[dataForDay.key] = groupedData;\n }\n });\n\n // Reset the activeEndpoints to it's initial value\n this.dataUtil.activeEndpoints = _.cloneDeep(this.initialActiveEndpoints);\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n return processedData;\n };\n\n /**\n * postProcessStatsByDateAggregations\n *\n * Post processor for crossfilter reductio stats by date aggregations\n *\n * @param {Function} priorResults - returns the data from the active crossfilter reductio reducer\n * @returns {Object} formatted stats by date aggregations\n */\n postProcessStatsByDateAggregations = priorResults => () => {\n const data = this.filterByActiveRange(priorResults());\n const datesWithData = _.map(data, 'key');\n const processedData = {};\n\n const activeRangeDates = _.map(_.range(this.initialActiveEndpoints.days || 0), (val, index) => (\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName)).subtract(index + 1, 'days').format('YYYY-MM-DD')\n );\n\n _.each(activeRangeDates, (date, index) => {\n if (_.includes(datesWithData, date)) {\n // Set the endpoints to filter current data for day\n this.dataUtil.activeEndpoints = {\n range: [\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index + 1, 'days').valueOf(),\n moment.utc(this.initialActiveEndpoints.range[1]).tz(this.timezoneName).subtract(index, 'days').valueOf(),\n ],\n days: 1,\n activeDays: 1,\n };\n\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n // Fetch the stats with endpoints and activeDays set for the day\n processedData[date] = this.dataUtil.getStats(this.dataUtil.stats);\n }\n });\n\n // Reset the activeEndpoints to it's initial value\n this.dataUtil.activeEndpoints = _.cloneDeep(this.initialActiveEndpoints);\n this.dataUtil.filter.byEndpoints(this.dataUtil.activeEndpoints.range);\n\n return processedData;\n };\n\n filterByActiveRange = results => {\n const [start, end] = this.initialActiveEndpoints.range;\n\n const startMoment = moment.utc(start).tz(this.timezoneName);\n const endMoment = moment.utc(end).tz(this.timezoneName);\n\n // If query ends at midnight, we only want to include data up to the previous whole calendar day\n if (endMoment.format('HH:mm') === '00:00') {\n endMoment.subtract(1, 'day').endOf('day');\n }\n\n // Select all data that between the two specified calendar days (inclusive)\n const startDate = startMoment.format('YYYY-MM-DD');\n const endDate = endMoment.format('YYYY-MM-DD');\n\n return _.filter(_.cloneDeep(results), result => result.key >= startDate && result.key <= endDate);\n };\n\n /* eslint-disable lodash/prefer-lodash-method */\n reduceByTag = (tag, type, reducer) => {\n reducer\n .value(tag)\n .count(true)\n .filter(d => d.type === type && d.tags[tag]);\n };\n /* eslint-enable lodash/prefer-lodash-method */\n\n /* eslint-disable lodash/prefer-lodash-method */\n reduceByBgClassification = (bgClass, type, reducer) => {\n reducer\n .value(bgClass)\n .count(true)\n .filter(d => {\n if (d.type !== type) return false;\n const datum = _.clone(d);\n this.dataUtil.normalizeDatumBgUnits(datum);\n return classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay') === bgClass;\n });\n };\n /* eslint-enable lodash/prefer-lodash-method */\n\n summarizeProcessedData = (processedData, days = this.dataUtil.activeEndpoints.activeDays) => {\n const total = _.sumBy(_.values(processedData), dateData => dateData.total);\n const avgPerDay = total / days;\n return {\n summary: {\n avgPerDay,\n total,\n subtotals: _.reduce(_.map(_.values(processedData), 'subtotals'), (acc, subtotals) => {\n const tags = _.keysIn(subtotals);\n _.each(tags, tag => {\n const count = _.get(acc, [tag, 'count'], 0) + subtotals[tag];\n const percentage = count / total;\n acc[tag] = {\n count,\n percentage,\n };\n });\n return acc;\n }, {}),\n },\n byDate: processedData,\n };\n };\n}\n\nexport default AggregationUtil;\n","import bows from 'bows';\nimport crossfilter from 'crossfilter'; // eslint-disable-line import/no-unresolved\nimport moment from 'moment-timezone';\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport sundial from 'sundial';\n\nimport {\n getLatestPumpUpload,\n getLastManualBasalSchedule,\n isControlIQ,\n isLoop,\n isAutomatedBasalDevice,\n isAutomatedBolusDevice,\n isSettingsOverrideDevice,\n isDIYLoop,\n isTidepoolLoop,\n isTwiistLoop,\n isOneMinCGMSampleIntervalDevice,\n isLibreViewAPI,\n} from './device';\n\nimport {\n hasExtended,\n isAutomated,\n isCorrection,\n isInterruptedBolus,\n isOneButton,\n isOverride,\n isUnderride,\n} from './bolus';\n\nimport { convertToMGDL } from './bloodglucose';\n\nimport {\n BGM_DATA_KEY,\n CGM_DATA_KEY,\n DEFAULT_BG_BOUNDS,\n DIABETES_DATA_TYPES,\n MS_IN_DAY,\n MS_IN_HOUR,\n MS_IN_MIN,\n MGDL_UNITS,\n DIY_LOOP,\n TIDEPOOL_LOOP,\n TWIIST_LOOP,\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE,\n ALARM,\n ALARM_NO_INSULIN,\n ALARM_NO_POWER,\n ALARM_OCCLUSION,\n EVENT,\n EVENT_PUMP_SHUTDOWN,\n} from './constants';\n\nimport {\n getMsPer24,\n getOffset,\n getTimezoneFromTimePrefs,\n} from './datetime';\n\n\nimport StatUtil from './StatUtil';\nimport AggregationUtil from './AggregationUtil';\nimport { commonStats, statFetchMethods } from './stat';\nimport SchemaValidator from './validation/schema';\n\nconst t = i18next.t.bind(i18next);\n\n/* global __DEV__ */\n\nexport class DataUtil {\n /**\n * @param {Array} data Raw Tidepool data\n */\n constructor(Validator = SchemaValidator) {\n this.log = bows('DataUtil');\n\n /* eslint-disable no-console */\n this.startTimer = __DEV__ ? name => console.time(name) : _.noop;\n this.endTimer = __DEV__ ? name => console.timeEnd(name) : _.noop;\n /* eslint-enable no-console */\n\n this.validator = Validator;\n this.init();\n }\n\n init = () => {\n this.startTimer('init total');\n this.data = crossfilter([]);\n this.queryDataCount = 0;\n this.defaultCgmSampleInterval = 5 * MS_IN_MIN;\n this.defaultCgmSampleIntervalRange = [this.defaultCgmSampleInterval, Infinity];\n this.setCgmSampleIntervalRange();\n\n this.buildDimensions();\n this.buildFilters();\n this.buildSorts();\n this.initFilterChangeHandler();\n this.endTimer('init total');\n };\n\n addData = (rawData = [], patientId, returnData = false) => {\n this.startTimer('addData');\n\n this.bolusDatumsByIdMap = this.bolusDatumsByIdMap || {};\n this.bolusToWizardIdMap = this.bolusToWizardIdMap || {};\n this.deviceUploadMap = this.deviceUploadMap || {};\n this.latestDatumByType = this.latestDatumByType || {};\n this.pumpSettingsDatumsByIdMap = this.pumpSettingsDatumsByIdMap || {};\n this.wizardDatumsByIdMap = this.wizardDatumsByIdMap || {};\n this.wizardToBolusIdMap = this.wizardToBolusIdMap || {};\n this.loopDataSetsByIdMap = this.loopDataSetsByIdMap || {};\n this.bolusDosingDecisionDatumsByIdMap = this.bolusDosingDecisionDatumsByIdMap || {};\n this.matchedDevices = this.matchedDevices || {};\n this.dataAnnotations = this.dataAnnotations || {};\n\n if (_.isEmpty(rawData) || !patientId) return {};\n\n // First, we check to see if we already have data for a different patient stored. If so, we\n // clear all data so that we never mix patient data.\n if (this.patientId && this.patientId !== patientId) {\n this.removeData();\n }\n this.patientId = patientId;\n\n // We first clone the raw data so we don't mutate it at the source\n this.startTimer('cloneRawData');\n const data = _.cloneDeep(rawData);\n this.endTimer('cloneRawData');\n\n this.startTimer('normalizeDataIn');\n _.each(data, this.normalizeDatumIn);\n this.endTimer('normalizeDataIn');\n\n // Join wizard and bolus datums\n this.startTimer('joinWizardAndBolus');\n _.each(data, this.joinWizardAndBolus);\n this.endTimer('joinWizardAndBolus');\n\n // Join bolus and dosingDecision datums\n this.startTimer('joinBolusAndDosingDecision');\n _.each(data, this.joinBolusAndDosingDecision);\n this.endTimer('joinBolusAndDosingDecision');\n\n // Add missing suppressed basals to select basal datums\n this.startTimer('addMissingSuppressedBasals');\n this.addMissingSuppressedBasals(data);\n this.endTimer('addMissingSuppressedBasals');\n\n // Filter out any data that failed validation, and any duplicates by `id`\n this.startTimer('filterValidData');\n this.clearFilters();\n const validData = _.uniqBy(data, 'id');\n const rejectedData = _.remove(validData, d => d.reject || this.filter.byId(d.id).top(1).length);\n this.endTimer('filterValidData');\n\n this.startTimer('tagData');\n _.each(validData, this.tagDatum);\n this.endTimer('tagData');\n\n this.startTimer('addValidData');\n this.data.add(validData);\n this.endTimer('addValidData');\n\n this.log('validData', validData.length, 'of', data.length);\n if (rejectedData.length) this.log('rejectedData', rejectedData);\n\n this.setMetaData();\n this.endTimer('addData');\n\n const result = {\n metaData: this.getMetaData([\n 'bgSources',\n 'latestDatumByType',\n 'latestPumpUpload',\n 'latestTimeZone',\n 'patientId',\n 'size',\n 'queryDataCount',\n ]),\n };\n\n if (returnData) {\n _.each(validData, d => this.normalizeDatumOut(d, '*'));\n result.data = validData;\n }\n\n return result;\n };\n\n /* eslint-disable no-param-reassign */\n normalizeDatumIn = d => {\n // Pre-process datums by type\n if (d.type === 'basal') {\n if (!d.rate && d.deliveryType === 'suspend') {\n d.rate = 0.0;\n }\n\n if (d.suppressed) {\n this.normalizeSuppressedBasal(d);\n }\n\n // Prevent ongoing basals with unknown durations from extending into the future\n if (_.isFinite(d.duration) && _.includes(_.map(d.annotations, 'code'), 'basal/unknown-duration')) {\n const currentTime = Date.parse(moment.utc().toISOString());\n const maxDuration = currentTime - Date.parse(d.time);\n d.duration = _.min([d.duration, maxDuration]);\n if (_.isFinite(d.suppressed?.duration)) d.suppressed.duration = d.duration;\n }\n }\n\n if (d.type === 'upload' && d.dataSetType === 'continuous') {\n if (isLoop(d)) this.loopDataSetsByIdMap[d.id] = d;\n if (!d.time) d.time = moment.utc().toISOString();\n }\n\n if (d.messagetext) {\n d.type = 'message';\n d.messageText = d.messagetext;\n d.parentMessage = d.parentmessage || null;\n d.time = d.timestamp;\n }\n\n if (d.type === 'cbg' && !d.sampleInterval) {\n // Legacy CGM data does not include sampleInterval, so we need to add it if unavailable, since\n // we rely on it for stat calculations and data filtering from the frontend queries.\n let sampleInterval = this.defaultCgmSampleInterval;\n\n if (isLibreViewAPI(d)) {\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'cbg/unknown-sample-interval' });\n } else if (d.deviceId?.indexOf('AbbottFreeStyleLibre') === 0 && d.deviceId.indexOf('AbbottFreeStyleLibre3') !== 0) {\n // The Abbott FreeStyle Libre 3 uses the default interval of 5 minutes, while the original\n // uses 15. FreeStyle Libre 2 data comes with the sampleInterval, so we don't need to set it here.\n sampleInterval = 15 * MS_IN_MIN;\n }\n\n d.sampleInterval = sampleInterval;\n }\n\n if (d.type === 'dosingDecision') {\n // Use `normal` instead of deprecated `amount` for requestedBolus\n if (d.requestedBolus?.normal == null && d.requestedBolus?.amount != null) {\n d.requestedBolus.normal = d.requestedBolus.amount;\n delete d.requestedBolus.amount;\n }\n\n // Use `amount` field for recommendedBolus if not present, but normal/extended are\n if (\n d.recommendedBolus &&\n d.recommendedBolus.amount == null &&\n (d.recommendedBolus.normal != null || d.recommendedBolus.extended != null)\n ) {\n // Both normal and extended can be zero, so check for null/undefined only\n d.recommendedBolus.amount =\n (d.recommendedBolus.normal ?? 0) + (d.recommendedBolus.extended ?? 0);\n delete d.recommendedBolus.normal;\n delete d.recommendedBolus.extended;\n delete d.recommendedBolus.duration;\n }\n }\n\n // We validate datums before converting the time and deviceTime to hammerTime integers,\n // as we want to validate that they are valid ISO date strings\n this.validateDatumIn(d);\n if (d.reject) return;\n\n // Convert the time and deviceTime properties to hammertime,\n // which improves dimension filtering performance significantly over using ISO strings.\n // We store the original time strings, with labels prefaced with underscores, however,\n // for easier reference when debugging.\n /* eslint-disable no-underscore-dangle */\n d._time = d.time;\n d._deviceTime = d.deviceTime || d.time;\n /* eslint-enable no-underscore-dangle */\n d.time = Date.parse(d.time);\n d.deviceTime = d.deviceTime ? Date.parse(d.deviceTime) : d.time;\n\n // Generate a map of latest datums by type\n if (d.time > _.get(this.latestDatumByType, [d.type, 'time'], 0)) this.latestDatumByType[d.type] = d;\n\n // Also add timeChange deviceEvents to latest datums map to help determine a recommended timezone\n if (d.type === 'deviceEvent' && d.subType === 'timeChange') {\n if (d.time > _.get(this.latestDatumByType, ['timeChange', 'time'], 0)) this.latestDatumByType.timeChange = d;\n }\n\n // Populate mappings to be used for 2-way join of boluses and wizards\n if (d.type === 'wizard' && _.isString(d.bolus)) {\n this.wizardDatumsByIdMap[d.id] = d;\n this.bolusToWizardIdMap[d.bolus] = d.id;\n this.wizardToBolusIdMap[d.id] = d.bolus;\n }\n\n // Populate mappings to be used for 2-way join of boluses and dosing decisions\n if (d.type === 'dosingDecision' && _.includes(['normalBolus', 'simpleBolus', 'watchBolus', 'oneButtonBolus'], d.reason)) {\n this.bolusDosingDecisionDatumsByIdMap[d.id] = d;\n }\n\n if (d.type === 'bolus') {\n this.bolusDatumsByIdMap[d.id] = d;\n }\n\n if (d.type === 'pumpSettings') {\n this.pumpSettingsDatumsByIdMap[d.id] = d;\n }\n\n // Generate a map of devices by deviceId\n if (!d.deviceId && _.get(d, 'origin.name') === 'com.apple.HealthKit') {\n const HKdeviceId = ['HealthKit'];\n if (_.get(d, 'origin.payload.sourceRevision.source.name')) {\n HKdeviceId.push(_.get(d, 'origin.payload.sourceRevision.source.name'));\n }\n HKdeviceId.push(d.uploadId.slice(0, 6));\n d.deviceId = HKdeviceId.join(' ');\n }\n if (!d.deviceId && _.get(d, 'payload.transmitterId', false)) {\n const dexDeviceId = ['Dexcom', d.uploadId.slice(0, 6)];\n d.deviceId = dexDeviceId.join(' ');\n }\n if (d.deviceId && !this.deviceUploadMap[d.deviceId]) {\n this.deviceUploadMap[d.deviceId] = d.uploadId;\n }\n };\n\n joinWizardAndBolus = d => {\n if (_.includes(['bolus', 'wizard'], d.type)) {\n const isWizard = d.type === 'wizard';\n const fieldToPopulate = isWizard ? 'bolus' : 'wizard';\n const idMap = isWizard ? this.wizardToBolusIdMap : this.bolusToWizardIdMap;\n const datumMap = isWizard ? this.bolusDatumsByIdMap : this.wizardDatumsByIdMap;\n\n if (idMap[d.id]) {\n const datumToPopulate = _.omit(datumMap[idMap[d.id]], d.type);\n\n if (isWizard && d.uploadId !== datumToPopulate.uploadId) {\n // Due to an issue stemming from a fix for wizard datums in Uploader >= v2.35.0, we have a\n // possibility of duplicates of older wizard datums from previous uploads. The boluses and\n // corrected wizards should both reference the same uploadId, so we can safely reject\n // wizards that don't reference the same upload as the bolus it's referencing.\n d.reject = true;\n d.rejectReason = ['Upload ID does not match referenced bolus'];\n } else {\n d[fieldToPopulate] = datumToPopulate;\n }\n }\n }\n };\n\n joinBolusAndDosingDecision = d => {\n if (d.type === 'bolus' && !!this.loopDataSetsByIdMap[d.uploadId]) {\n const timeThreshold = MS_IN_MIN;\n\n // Find the dosing decision that matches the bolus by checking if there is a definitive association\n d.dosingDecision = _.find(\n _.mapValues(this.bolusDosingDecisionDatumsByIdMap),\n ({ associations = [] }) => _.some(associations, { reason: 'bolus', id: d.id })\n );\n\n // If no definitive dosing decision association is provided, such as can be the case with Tidepool\n // and DIY Loop, we look for the closest dosing decision within a time threshold\n if (!d.dosingDecision) {\n const proximateDosingDecisions = _.filter(\n _.mapValues(this.bolusDosingDecisionDatumsByIdMap),\n ({ time, associations }) => {\n // If there is a definitive association, we skip this decision, as it would have been\n // associated with the bolus already in the code above if the id matched\n if (_.some(associations, { reason: 'bolus' })) return false;\n\n const timeOffset = Math.abs(time - d.time);\n return timeOffset <= timeThreshold;\n }\n );\n\n const sortedProximateDosingDecisions = _.orderBy(proximateDosingDecisions, ({ time }) => Math.abs(time - d.time), 'asc');\n const dosingDecisionWithMatchingNormal = _.find(sortedProximateDosingDecisions, dosingDecision => dosingDecision.requestedBolus?.normal === d.normal);\n\n // Set the best-matching dosing decision, if available, or the first one within the time threshold\n d.dosingDecision = dosingDecisionWithMatchingNormal || sortedProximateDosingDecisions[0];\n\n if (d.dosingDecision) {\n // Set the assocation to this bolus so that we don't risk associating it again if other proximate matches occur\n this.bolusDosingDecisionDatumsByIdMap[d.dosingDecision.id].associations = [\n ...d.dosingDecision.associations || [],\n { reason: 'bolus', id: d.id },\n ];\n }\n }\n\n if (d.dosingDecision) {\n // attach associated pump settings to dosingDecisions\n const associatedPumpSettingsId = _.find(d.dosingDecision.associations, { reason: 'pumpSettings' })?.id;\n d.dosingDecision.pumpSettings = this.pumpSettingsDatumsByIdMap[associatedPumpSettingsId];\n\n // Translate relevant dosing decision data onto expected bolus fields\n d.carbInput = d.dosingDecision.originalFood?.nutrition?.carbohydrate?.net ??\n d.dosingDecision.food?.nutrition?.carbohydrate?.net; // use originalFood if present, as this is the original value present at time of bolus\n d.bgInput = d?.dosingDecision?.smbg?.value || _.last(d.dosingDecision.bgHistorical || [])?.value;\n d.insulinOnBoard = d.dosingDecision.insulinOnBoard?.amount;\n\n // Loop interrupted boluses may not have expectedNormal set,\n // so we set it to the requested normal from the dosing decision\n const requestedNormal = d.dosingDecision.requestedBolus?.normal;\n\n if ((!d.expectedNormal && requestedNormal) && (d.normal !== requestedNormal)) {\n d.expectedNormal = requestedNormal;\n }\n }\n }\n };\n\n addMissingSuppressedBasals = data => {\n // Mapping function to get the basal schedules for a given pumpSettings datum,\n // ordered by start time in descending order for easier comparison with basals\n const getOrderedPumpSettingsSchedules = ({ activeSchedule, basalSchedules, deviceId, time }) => ({\n basalSchedule: _.orderBy(basalSchedules?.[activeSchedule], 'start', 'desc'),\n time,\n deviceId,\n });\n\n const shouldGenerateSuppressedBasal = (d) => (\n d.type === 'basal' &&\n !d.suppressed &&\n _.includes(['automated', 'temp'], d.deliveryType) &&\n isTwiistLoop(d)\n );\n\n // Get the pump settings datums ordered by start time in descending order\n const pumpSettingsByStartTimes = _.orderBy(\n _.map(_.values(this.pumpSettingsDatumsByIdMap), getOrderedPumpSettingsSchedules),\n 'time',\n 'desc'\n );\n\n // We will need add additional basals when we split existing basals that overlap with pump settings schedules\n const basalsToAdd = [];\n\n _.each(data, d => {\n if (shouldGenerateSuppressedBasal(d)) {\n // Get the pump settings datum that is active at the time of the basal by grabbing the first\n // datum with a time less than or equal to the basal's time\n const pumpSettingsDatum = _.find(pumpSettingsByStartTimes, ps => ps.deviceId === d.deviceId && ps.time <= d.time);\n const activeSchedule = pumpSettingsDatum?.basalSchedule;\n\n if (!activeSchedule?.length) {\n // No schedule available, skip this basal\n return;\n }\n\n // Calculate the end time of the basal\n const basalEndTime = d.time + (d.duration || 0);\n\n // Get the msPer24 for the utc start and end times of the basal datum, then adjust for timezone offset\n const timezoneOffsetMs = (d.timezoneOffset || 0) * MS_IN_MIN;\n const basalMsPer24WithOffset = {\n start: getMsPer24(d.time) + timezoneOffsetMs,\n end: getMsPer24(basalEndTime) + timezoneOffsetMs,\n };\n\n // If the offset msPer24 is negative, as can happen with negative timezone offsets,\n // we need to add a day to adjust it to be within the 24-hour range\n if (basalMsPer24WithOffset.start < 0) basalMsPer24WithOffset.start += MS_IN_DAY;\n if (basalMsPer24WithOffset.end < 0) basalMsPer24WithOffset.end += MS_IN_DAY;\n\n // If end time crosses midnight (is less than start), extend it to next day\n if (basalMsPer24WithOffset.end < basalMsPer24WithOffset.start) {\n basalMsPer24WithOffset.end += MS_IN_DAY;\n }\n\n // Find all schedule segments that this basal overlaps\n const currentDaySegments = [];\n const nextDaySegments = [];\n\n // Sort schedule by start time ascending for easier processing\n const sortedSchedule = _.sortBy(activeSchedule, 'start');\n\n for (let i = 0; i < sortedSchedule.length; i++) {\n const segment = sortedSchedule[i];\n const nextSegment = sortedSchedule[i + 1];\n\n const segmentStart = segment.start;\n const segmentEnd = nextSegment ? nextSegment.start : MS_IN_DAY;\n\n // Check if basal overlaps with this segment in the current day\n const basalOverlapsCurrentDay = (\n basalMsPer24WithOffset.start < segmentEnd &&\n basalMsPer24WithOffset.end > segmentStart\n );\n\n if (basalOverlapsCurrentDay) {\n currentDaySegments.push({\n ...segment,\n segmentEnd,\n overlapStart: Math.max(basalMsPer24WithOffset.start, segmentStart),\n overlapEnd: Math.min(basalMsPer24WithOffset.end, segmentEnd)\n });\n }\n\n // Also check if basal overlaps with this segment when extended to next day\n // This handles cases where the basal crosses midnight\n if (basalMsPer24WithOffset.end > MS_IN_DAY) {\n const extendedSegmentStart = segmentStart + MS_IN_DAY;\n const extendedSegmentEnd = segmentEnd + MS_IN_DAY;\n\n const basalOverlapsNextDay = (\n basalMsPer24WithOffset.start < extendedSegmentEnd &&\n basalMsPer24WithOffset.end > extendedSegmentStart\n );\n\n if (basalOverlapsNextDay) {\n nextDaySegments.push({\n ...segment,\n segmentEnd: extendedSegmentEnd,\n overlapStart: Math.max(basalMsPer24WithOffset.start, extendedSegmentStart),\n overlapEnd: Math.min(basalMsPer24WithOffset.end, extendedSegmentEnd)\n });\n }\n }\n }\n\n // Combine segments in chronological order: current day first, then next day\n const overlappingSegments = [...currentDaySegments, ...nextDaySegments];\n\n // It's expected that a basal will overlap with at least one segment\n if (overlappingSegments.length === 1) {\n // Simple case: basal is within a single schedule segment\n const segment = overlappingSegments[0];\n d.suppressed = {\n ...d,\n id: `${d.id}_suppressed`,\n deliveryType: 'scheduled',\n rate: segment.rate || 0,\n };\n } else if (overlappingSegments.length > 1) {\n // Complex case: basal crosses schedule boundaries, need to split\n const originalDuration = d.duration || 0;\n const basalDurationMs24 = basalMsPer24WithOffset.end - basalMsPer24WithOffset.start;\n\n // Update the original basal to cover only the first segment\n const firstSegment = overlappingSegments[0];\n const firstSegmentMs24Duration = firstSegment.overlapEnd - firstSegment.overlapStart;\n const firstSegmentDuration = (firstSegmentMs24Duration / basalDurationMs24) * originalDuration;\n\n d.duration = firstSegmentDuration;\n d.suppressed = {\n ...d,\n id: `${d.id}_suppressed`,\n deliveryType: 'scheduled',\n rate: firstSegment.rate || 0,\n duration: firstSegmentDuration,\n time: d.time, // Keep original time\n };\n\n // Create additional basal datums for the remaining segments\n let cumulativeDuration = firstSegmentDuration;\n\n for (let i = 1; i < overlappingSegments.length; i++) {\n const segment = overlappingSegments[i];\n const segmentMs24Duration = segment.overlapEnd - segment.overlapStart;\n const segmentDuration = (segmentMs24Duration / basalDurationMs24) * originalDuration;\n\n const newBasal = {\n ...d,\n id: `${d.id}_split_${i}`,\n time: d.time + cumulativeDuration,\n duration: segmentDuration,\n suppressed: {\n ...d,\n id: `${d.id}_suppressed_split_${i}`,\n deliveryType: 'scheduled',\n rate: segment.rate || 0,\n duration: segmentDuration,\n time: d.time + cumulativeDuration,\n }\n };\n\n // Update deviceTime if it exists\n if (d.deviceTime) {\n newBasal.deviceTime = d.deviceTime + cumulativeDuration;\n newBasal.suppressed.deviceTime = newBasal.deviceTime;\n }\n\n basalsToAdd.push(newBasal);\n cumulativeDuration += segmentDuration;\n }\n } else {\n // Fallback: no overlapping segments found (shouldn't happen normally)\n this.log('Warning: No overlapping segments found for basal', d.id);\n }\n }\n });\n\n // Add the new split basal datums to the data array\n data.push(...basalsToAdd);\n };\n\n /**\n * Medtronic 5 and 7 series (which always have a deviceId starting with 'MedT-') carb exchange\n * data is converted to carbs at a rounded 1:15 ratio in the uploader, and needs to be\n * de-converted back into exchanges.\n */\n needsCarbToExchangeConversion = d => {\n const annotations = _.get(d, 'annotations', []);\n\n return (d.deviceId && d.deviceId.indexOf('MedT-') === 0)\n && d.carbUnits === 'exchanges'\n && _.isFinite(d.carbInput)\n && _.findIndex(annotations, { code: 'medtronic/wizard/carb-to-exchange-ratio-deconverted' }) === -1;\n };\n\n /**\n * When deconverting the carbs to exchanges, we use a 15:1 ratio, and round to the nearest 0.5,\n * since that is the increment used when entering exchange values in the pump\n */\n getDeconvertedCarbExchange = d => {\n const deconvertedCarbInput = d.carbInput / 15;\n const increment = 0.5;\n const inverse = 1 / increment;\n return Math.round(deconvertedCarbInput * inverse) / inverse;\n };\n\n tagDatum = d => {\n if (d.type === 'basal') {\n d.tags = {\n suspend: d.deliveryType === 'suspend',\n temp: d.deliveryType === 'temp',\n };\n }\n\n if (d.type === 'bolus') {\n const isWizardOrDosingDecision = d.wizard || d.dosingDecision?.food?.nutrition?.carbohydrate?.net;\n\n d.tags = {\n automated: isAutomated(d),\n correction: isCorrection(d),\n extended: hasExtended(d),\n interrupted: isInterruptedBolus(d),\n manual: !isWizardOrDosingDecision && !isAutomated(d),\n override: isOverride(d),\n underride: isUnderride(d),\n wizard: !!isWizardOrDosingDecision,\n loop: !!this.loopDataSetsByIdMap[d.uploadId],\n oneButton: isOneButton(d),\n };\n }\n\n if (d.type === 'wizard') {\n d.tags = {\n extended: hasExtended(d),\n interrupted: isInterruptedBolus(d),\n override: isOverride(d),\n underride: isUnderride(d),\n };\n }\n\n if (d.type === 'smbg') {\n d.tags = {\n manual: d.subType === 'manual',\n meter: d.subType !== 'manual',\n };\n }\n\n if (d.type === 'food') {\n d.tags = {\n loop: !!this.loopDataSetsByIdMap[d.uploadId],\n };\n }\n\n if (d.type === 'deviceEvent') {\n const isReservoirChange = d.subType === 'reservoirChange';\n const isPrime = d.subType === 'prime';\n\n d.tags = {\n automatedSuspend: (\n d.subType === 'status'\n && d.status === 'suspended'\n && d.reason?.suspended === 'automatic'\n && d.payload?.suspended?.reason === 'Auto suspend by PLGS'\n ),\n calibration: d.subType === 'calibration',\n [SITE_CHANGE]: isReservoirChange || isPrime,\n [SITE_CHANGE_RESERVOIR]: isReservoirChange,\n [SITE_CHANGE_CANNULA]: isPrime && d.primeTarget === 'cannula',\n [SITE_CHANGE_TUBING]: isPrime && d.primeTarget === 'tubing',\n };\n\n if (isTwiistLoop(d)) {\n const recognizedAlarmTypes = [\n ALARM_NO_INSULIN,\n ALARM_NO_POWER,\n ALARM_OCCLUSION,\n ];\n\n d.tags = {\n ...d.tags,\n [ALARM]: d.subType === 'alarm' && _.includes(recognizedAlarmTypes, d.alarmType),\n ..._.reduce(recognizedAlarmTypes, (acc, type) => {\n acc[type] = d.alarmType === type;\n return acc;\n }, {}),\n };\n }\n }\n\n // Events can appear on any datum type.\n // We only display one event per datum, so we set the event tag to the highest priority event that applies.\n // Currently, the only event we tag is pump shutdowns on Control-IQ pumps, but we anticipate adding more in the future.\n const prioritizedEventTypes = [\n EVENT_PUMP_SHUTDOWN,\n ];\n\n const events = {\n [EVENT_PUMP_SHUTDOWN]: isControlIQ(d) && _.some(d.annotations, { code: 'pump-shutdown' }),\n };\n\n const eventType = _.find(prioritizedEventTypes, type => events[type]);\n\n if (eventType) {\n d.tags = {\n ...d.tags || {},\n [EVENT]: eventType,\n };\n }\n };\n\n validateDatumIn = d => {\n let validator = this.validator[d.type] || this.validator.common;\n if (_.isFunction(validator)) validator = { validator };\n\n // Run all validators and store the results in an array\n const validateResult = [];\n _.each(_.values(validator), (validationMethod, i) => {\n // only run validationMethod if it's the first or previous validations have all failed\n if (i === 0 || validateResult.indexOf(true) === -1) {\n validateResult.push(validationMethod(d));\n }\n });\n\n // Reject datum if none of the validators pass\n if (validateResult.indexOf(true) === -1) {\n d.reject = true;\n d.rejectReason = validateResult;\n }\n };\n\n normalizeDatumOut = (d, fields = []) => {\n if (this.returnRawData) {\n /* eslint-disable no-underscore-dangle */\n if (d._time) {\n d.time = d._time;\n delete d._time;\n }\n\n if (d._deviceTime) {\n d.deviceTime = d._deviceTime;\n delete d._deviceTime;\n }\n\n delete d.tags;\n\n if (_.includes(['bolus', 'wizard'], d.type)) {\n const isWizard = d.type === 'wizard';\n const fieldToRestore = isWizard ? 'bolus' : 'wizard';\n if (_.get(d, [fieldToRestore, 'id'])) d[fieldToRestore] = d[fieldToRestore].id;\n }\n\n if (d.type === 'message') {\n delete d.type;\n delete d.messageText;\n delete d.parentMessage;\n delete d.time;\n }\n\n return;\n /* eslint-enable no-underscore-dangle */\n }\n\n const { timezoneName } = this.timePrefs || {};\n const normalizeAllFields = fields[0] === '*';\n\n // Normal time post-processing\n this.normalizeDatumOutTime(d, fields);\n\n // Add source and serial number metadata\n if (d.uploadId && (normalizeAllFields || _.includes(fields, 'deviceSerialNumber'))) {\n d.deviceSerialNumber = _.get(this.uploadMap, [d.uploadId, 'deviceSerialNumber']);\n }\n if (!d.source) d.source = _.get(this.uploadMap, [d.uploadId, 'source'], 'Unspecified Data Source');\n\n // Additional post-processing by type\n if (d.type === 'basal') {\n d.normalEnd = d.normalTime + d.duration;\n d.subType = d.deliveryType;\n\n // Annotate any incomplete suspends\n if (normalizeAllFields || _.includes(fields, 'annotations')) {\n const intersectsIncompleteSuspend = _.some(\n this.incompleteSuspends,\n suspend => {\n const suspendStart = suspend[this.activeTimeField];\n return d.normalTime <= suspendStart && suspendStart <= d.normalEnd;\n }\n );\n\n if (intersectsIncompleteSuspend) {\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'basal/intersects-incomplete-suspend' });\n this.log('intersectsIncompleteSuspend', d.id);\n }\n }\n\n // Recurse as needed for suppressed basals\n if (d.suppressed && (normalizeAllFields || _.includes(fields, 'suppressed'))) this.normalizeDatumOut(d.suppressed, fields);\n }\n\n if (d.type === 'cbg' || d.type === 'smbg') {\n this.normalizeDatumBgUnits(d);\n\n if (normalizeAllFields || _.includes(fields, 'msPer24')) {\n d.msPer24 = getMsPer24(d.normalTime, timezoneName);\n }\n\n if (normalizeAllFields || _.includes(fields, 'localDate')) {\n d.localDate = moment.utc(d[this.activeTimeField]).tz(timezoneName || 'UTC').format('YYYY-MM-DD');\n }\n }\n\n if (d.type === 'pumpSettings') {\n this.normalizeDatumBgUnits(d, [], ['bgSafetyLimit']);\n this.normalizeDatumBgUnits(d, ['bgTarget', 'bgTargets'], ['target', 'range', 'low', 'high']);\n this.normalizeDatumBgUnits(d, ['bgTargetPreprandial', 'bgTargetPhysicalActivity'], ['low', 'high']);\n this.normalizeDatumBgUnits(d, ['insulinSensitivity', 'insulinSensitivities'], ['amount']);\n // Set basalSchedules object to an array sorted by name: 'standard' first, then alphabetical\n if (normalizeAllFields || _.includes(fields, 'basalSchedules')) {\n d.basalSchedules = _.flatten(_.partition(\n _.sortBy(_.map(d.basalSchedules, (value, name) => ({ name, value })), 'name'),\n ({ name }) => (name === 'standard')\n ));\n }\n }\n\n if (d.type === 'wizard') {\n this.normalizeDatumBgUnits(d, [], ['bgInput']);\n this.normalizeDatumBgUnits(d, ['bgTarget'], ['target', 'range', 'low', 'high']);\n this.normalizeDatumBgUnits(d, [], ['insulinSensitivity']);\n\n if (_.isObject(d.bolus)) this.normalizeDatumOut(d.bolus, fields);\n\n if (this.needsCarbToExchangeConversion(d)) {\n d.carbInput = this.getDeconvertedCarbExchange(d);\n d.insulinCarbRatio = _.round(15 / d.insulinCarbRatio, 1);\n d.annotations = d.annotations || [];\n d.annotations.push({ code: 'medtronic/wizard/carb-to-exchange-ratio-deconverted' });\n }\n }\n\n if (d.type === 'dosingDecision') {\n this.normalizeDatumBgUnits(d, ['bgTargetSchedule'], ['low', 'high']);\n this.normalizeDatumBgUnits(d, ['bgForecast'], ['value']);\n this.normalizeDatumBgUnits(d, ['bgHistorical'], ['value']);\n this.normalizeDatumBgUnits(d, ['smbg'], ['value']);\n if (_.isObject(d.pumpSettings)) this.normalizeDatumOut(d.pumpSettings, fields);\n }\n\n if (d.type === 'bolus') {\n this.normalizeDatumBgUnits(d, [], ['bgInput']);\n if (_.isObject(d.wizard)) this.normalizeDatumOut(d.wizard, fields);\n if (_.isObject(d.dosingDecision)) this.normalizeDatumOut(d.dosingDecision, fields);\n }\n\n if (d.type === 'deviceEvent') {\n this.normalizeDatumBgUnits(d, ['bgTarget'], ['low', 'high']);\n const isOverrideEvent = d.subType === 'pumpSettingsOverride';\n\n if (_.isFinite(d.duration)) {\n // DIY and Tidepool Loop are reporting these durations in seconds instead of the milliseconds.\n // For now, until a fix is present, we'll convert for Tidepool Loop and DIY Loop.\n // Once a fix is present, we will only convert for DIY and Tidepool Loop versions prior to the fix.\n if (isOverrideEvent && (isTidepoolLoop(d) || isDIYLoop(d))) d.duration = d.duration * 1000;\n d.normalEnd = d.normalTime + d.duration;\n\n // If the provided duration extends into the future, we truncate the normalEnd to the\n // latest diabetes datum end and recalculate the duration\n const currentTime = Date.parse(moment.utc().toISOString());\n if (d.normalEnd > currentTime) {\n d.normalEnd = this.latestDiabetesDatumEnd;\n d.duration = d.normalEnd - d.normalTime;\n }\n } else if (isOverrideEvent && _.isFinite(this.latestDiabetesDatumEnd)) {\n // Ongoing pump settings overrides will not have a duration with which to determine\n // normalEnd, so we will set it to the latest diabetes datum end.\n d.normalEnd = this.latestDiabetesDatumEnd;\n d.duration = d.normalEnd - d.normalTime;\n }\n }\n\n if (d.type === 'fill') {\n const localTime = d.normalTime + d.displayOffset * MS_IN_MIN;\n const normalTimeISO = moment.utc(d.normalTime).toISOString();\n\n d.normalEnd = d.normalTime + d.duration;\n d.msPer24 = getMsPer24(d.normalTime, timezoneName);\n d.hourOfDay = d.msPer24 / MS_IN_HOUR;\n d.fillDate = moment.utc(localTime).toISOString().slice(0, 10);\n d.id = `fill_${normalTimeISO.replace(/[^\\w\\s]|_/g, '')}`;\n }\n\n this.setDataAnnotations(d);\n };\n\n normalizeDatumOutTime = d => {\n const { timezoneName } = this.timePrefs || {};\n\n if (timezoneName) {\n d.normalTime = d.time;\n d.displayOffset = -getOffset(d.time, timezoneName);\n } else {\n // TimezoneOffset is an optional attribute according to the Tidepool data model\n if (d.timezoneOffset != null && d.conversionOffset != null) {\n d.normalTime = d.time + (d.timezoneOffset * MS_IN_MIN + d.conversionOffset);\n } else {\n d.normalTime = !_.isEmpty(d.deviceTime) ? d.deviceTime : d.time;\n }\n\n // DisplayOffset always 0 when not timezoneAware\n d.displayOffset = 0;\n if (d.deviceTime && d.normalTime !== d.deviceTime) {\n d.warning = 'Combining `time` and `timezoneOffset` does not yield `deviceTime`.';\n }\n }\n };\n\n normalizeDatumBgUnits = (d, keysPaths = [], keys = ['value']) => {\n const units = _.get(this.bgPrefs, 'bgUnits');\n\n if (units && d.units) {\n d.units = _.isPlainObject(d.units) ? {\n ...d.units,\n bg: units,\n } : units;\n }\n\n // BG units are always stored in mmol/L in the backend, so we only need to convert to mg/dL\n if (units === MGDL_UNITS) {\n if (d.units) {\n d.units = _.isPlainObject(d.units) ? {\n ...d.units,\n bg: MGDL_UNITS,\n } : MGDL_UNITS;\n }\n\n const normalizeAtPath = path => {\n const pathValue = path ? _.get(d, path) : d;\n\n if (_.isPlainObject(pathValue) && _.keys(pathValue).length) {\n _.each(keys, (key) => {\n if (_.isNumber(pathValue[key])) {\n const setPath = _.reject([path, key], _.isEmpty);\n // in some cases, a path could be converted more than once, especially if a dosing decision\n // was shared with multple boluses due to proximity. We need to track which paths have\n // already been converted so we don't do it multiple times.\n if (d.bgNormalized?.[setPath.join('|')]) return;\n _.set(d, setPath, convertToMGDL(pathValue[key]));\n\n d.bgNormalized = {\n ...(d.bgNormalized || {}),\n [setPath.join('|')]: true,\n };\n } else if (path && _.isPlainObject(pathValue)) {\n // We sometimes need match the specified field keys within unknown object paths,\n // such as within Tandem pumpSettings datums, where the keys we want to target for\n // conversion are nested under object keys that match the user-provided schedule names\n // In these cases, we expect that a keyPath will be provided (via the `path` argumement),\n // which prevents accidentally changing the units of unintended paths.\n _.each(_.keys(pathValue), nestedKey => {\n let nestedValue = _.get(pathValue, [nestedKey]);\n\n if (_.isArray(nestedValue) || _.isPlainObject(nestedValue)) {\n // Wrap plain objects in array to be able to handle them the same as collections\n if (_.isPlainObject(nestedValue)) nestedValue = [nestedValue];\n\n // Check each collection item for matches that need conversion\n _.each(nestedValue, value => {\n if (_.get(value, [key])) {\n // we only recurse when a nested path object contains a matching key\n this.normalizeDatumBgUnits(value, [], [key]);\n }\n });\n }\n });\n }\n });\n } else if (_.isArray(pathValue)) {\n _.each(pathValue, (item) => {\n this.normalizeDatumBgUnits(item, [], keys);\n });\n }\n };\n\n if (keysPaths.length) {\n _.each(keysPaths, normalizeAtPath);\n } else {\n normalizeAtPath();\n }\n }\n };\n\n normalizeSuppressedBasal = d => {\n if (d.suppressed.deliveryType === 'temp' && !d.suppressed.rate) {\n if (d.suppressed.percent && d.suppressed.suppressed &&\n d.suppressed.suppressed.deliveryType === 'scheduled' &&\n d.suppressed.suppressed.rate >= 0) {\n d.suppressed.rate = d.suppressed.percent * d.suppressed.suppressed.rate;\n }\n }\n\n // A suppressed should share these attributes with its parent\n d.suppressed.duration = d.duration;\n d.suppressed.time = Date.parse(d.time);\n if (d.deviceTime) d.suppressed.deviceTime = Date.parse(d.deviceTime);\n\n // Recurse as needed\n if (d.suppressed.suppressed) {\n this.normalizeSuppressedBasal(d.suppressed);\n }\n };\n /* eslint-enable no-param-reassign */\n\n deduplicateCBGData = (data = []) => {\n const cbgData = this.sort.byTime(_.cloneDeep(data));\n\n // Iterate through the time-ordered list of glucose data. For each datum, we set a blackout\n // window for the time span it occupies - e.g. if a datum has a time of 14:30 and duration\n // of 5 min, then any OTHER datums occuring between 14:30 to 14:35 should be discarded.\n\n const OVERLAP_TOLERANCE = MS_IN_MIN / 6; // tolerate up to 10 seconds of overlap\n\n let blackoutUntil = 0; // end of current blackout window (unix timestamp)\n\n const output = [];\n\n for (let i = 0; i < cbgData.length; i++) {\n const currentRecord = cbgData[i];\n\n // If current record occured within the current blackout window, discard the record.\n if (currentRecord.time < blackoutUntil) continue; // eslint-disable-line\n\n // Otherwise, if the record is past the blackout window, we include the record.\n // Then, set a new blackout window based on the current record's time window\n output.push(currentRecord);\n blackoutUntil = currentRecord.time + currentRecord.sampleInterval - OVERLAP_TOLERANCE;\n }\n\n return output;\n };\n\n // memoize deduplicateCBGData and only recompute if first/last ids change or units change\n getDeduplicatedCBGData = _.memoize(\n this.deduplicateCBGData,\n data => {\n const firstDatumId = _.first(data)?.id;\n const lastDatumId = _.last(data)?.id;\n const units = this.bgPrefs?.bgUnits || 'unknown';\n\n return `${firstDatumId}_${lastDatumId}_${units}`;\n }\n );\n\n /* eslint-disable no-param-reassign */\n removeData = (predicate = null) => {\n if (predicate) {\n this.log('Removing data where', predicate);\n if (_.isPlainObject(predicate)) predicate = _.matches(predicate);\n this.clearFilters();\n this.data.remove(predicate);\n } else {\n this.log('Reinitializing');\n this.bolusToWizardIdMap = {};\n this.bolusDatumsByIdMap = {};\n this.wizardDatumsByIdMap = {};\n this.latestDatumByType = {};\n this.deviceUploadMap = {};\n this.clearMatchedDevices();\n this.clearDataAnnotations();\n delete this.bgSources;\n delete this.bgPrefs;\n delete this.timePrefs;\n delete this.latestPumpUpload;\n delete this.devices;\n delete this.excludedDevices;\n this.init();\n }\n };\n /* eslint-enable no-param-reassign */\n\n updateDatum = updatedDatum => {\n this.log('Updating Datum', updatedDatum);\n this.clearFilters();\n\n const existingDatum = this.filter.byId(updatedDatum.id).top(1)[0];\n const updateDatumClone = _.cloneDeep(updatedDatum);\n\n // Attempt to update existing datum with normalized and validated update datum\n this.normalizeDatumIn(updateDatumClone);\n if (existingDatum && !updateDatumClone.reject) _.assign(existingDatum, updateDatumClone);\n\n // Reset the byId filter\n this.dimension.byId.filterAll();\n\n // Update the byTime dimension in case the time field was changed\n this.buildByTimeDimension();\n\n const resultingDatum = _.cloneDeep(existingDatum);\n this.normalizeDatumOut(resultingDatum, '*');\n\n return {\n datum: resultingDatum,\n };\n };\n\n buildByDayOfWeekDimension = () => {\n this.dimension.byDayOfWeek = this.data.dimension(\n d => moment.utc(d[this.activeTimeField || 'time']).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).day()\n );\n };\n\n buildByDateDimension = () => {\n this.dimension.byDate = this.data.dimension(\n d => moment.utc(d[this.activeTimeField || 'time']).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).format('YYYY-MM-DD')\n );\n };\n\n buildByIdDimension = () => {\n this.dimension.byId = this.data.dimension(d => d.id);\n };\n\n buildBySubTypeDimension = () => {\n this.dimension.bySubType = this.data.dimension(d => d.subType || '');\n };\n\n buildByTimeDimension = () => {\n this.dimension.byTime = this.data.dimension(d => d[this.activeTimeField || 'time']);\n };\n\n buildByTypeDimension = () => {\n this.dimension.byType = this.data.dimension(d => d.type);\n };\n\n buildByDeviceIdDimension = () => {\n this.dimension.byDeviceId = this.data.dimension(d => d.deviceId || '');\n };\n\n buildBySampleIntervalDimension = () => {\n this.dimension.bySampleInterval = this.data.dimension(d => d.sampleInterval || '');\n };\n\n // N.B. May need to become smarter about creating and removing dimensions if we get above 8,\n // which would introduce additional performance overhead as per crossfilter docs.\n buildDimensions = () => {\n this.startTimer('buildDimensions');\n this.dimension = {};\n this.buildByDayOfWeekDimension();\n this.buildByDateDimension();\n this.buildByIdDimension();\n this.buildBySubTypeDimension();\n this.buildByTimeDimension();\n this.buildByTypeDimension();\n this.buildByDeviceIdDimension();\n this.buildBySampleIntervalDimension();\n this.endTimer('buildDimensions');\n };\n\n buildFilters = () => {\n this.startTimer('buildFilters');\n this.filter = {};\n\n this.filter.byActiveDays = activeDays => this.dimension.byDayOfWeek\n .filterFunction(d => _.includes(activeDays, d));\n\n this.filter.byEndpoints = endpoints => this.dimension.byTime.filterRange(endpoints);\n this.filter.byDeviceIds = (excludedDeviceIds = []) => this.dimension.byDeviceId.filterFunction(deviceId => !_.includes(excludedDeviceIds, deviceId));\n this.filter.byId = id => this.dimension.byId.filterExact(id);\n\n this.filter.bySampleIntervalRange = (min = this.defaultCgmSampleIntervalRange[0], max = this.defaultCgmSampleIntervalRange[1]) => {\n if (min === max) {\n return this.dimension.bySampleInterval.filterExact(min);\n } else {\n return this.dimension.bySampleInterval.filterRange([min, max]);\n }\n };\n\n this.filter.bySubType = subType => {\n this.activeSubType = subType;\n return this.dimension.bySubType.filterExact(subType);\n };\n\n this.filter.byType = type => {\n this.activeType = type;\n return this.dimension.byType.filterExact(type);\n };\n\n this.filter.byTypes = (types = []) => {\n delete this.activeType;\n return this.dimension.byType.filterFunction(type => _.includes(types, type));\n };\n\n this.endTimer('buildFilters');\n };\n\n buildSorts = () => {\n this.startTimer('buildSorts');\n this.sort = {};\n this.sort.byTime = array => {\n const timeField = _.get(this, 'timePrefs.timezoneAware') ? 'time' : 'deviceTime';\n return array.sort((a, b) => a[timeField] - b[timeField]);\n };\n this.endTimer('buildSorts');\n };\n\n initFilterChangeHandler = () => {\n this.data.onChange(eventType => {\n if (eventType === 'filtered' && this.matchDevices) {\n if (_.includes([\n 'basal',\n 'bolus',\n 'smbg',\n 'cbg',\n 'wizard',\n 'food',\n ], this.dimension.byType.currentFilter())) {\n _.each(this.dimension.byDeviceId.top(Infinity), datum => {\n const { deviceId, origin } = datum;\n\n if (deviceId) {\n const version = origin?.version || '0.0';\n const deviceName = origin?.name || deviceId;\n const deviceVersionId = `${deviceName}_${version}`;\n if (!this.matchedDevices[deviceId]) this.matchedDevices[deviceId] = {};\n if (!this.matchedDevices[deviceId][deviceVersionId]) this.matchedDevices[deviceId][deviceVersionId] = true;\n }\n });\n }\n }\n });\n };\n\n clearFilters = () => {\n this.startTimer('clearFilters');\n this.dimension.byTime.filterAll();\n this.dimension.byType.filterAll();\n this.dimension.bySubType.filterAll();\n this.dimension.byId.filterAll();\n this.dimension.byDayOfWeek.filterAll();\n this.dimension.byDeviceId.filterAll();\n this.dimension.bySampleInterval.filterAll();\n this.endTimer('clearFilters');\n };\n\n setBgSources = current => {\n this.startTimer('setBgSources');\n this.clearFilters();\n\n const bgSources = {\n cbg: this.filter.byType(CGM_DATA_KEY).top(Infinity).length > 0,\n smbg: this.filter.byType(BGM_DATA_KEY).top(Infinity).length > 0,\n current: _.includes([CGM_DATA_KEY, BGM_DATA_KEY], current) ? current : undefined,\n };\n\n if (!bgSources.current) {\n if (_.get(this, 'bgSources.current')) {\n bgSources.current = this.bgSources.current;\n } else if (bgSources.cbg) {\n bgSources.current = CGM_DATA_KEY;\n } else if (bgSources.smbg) {\n bgSources.current = BGM_DATA_KEY;\n }\n }\n\n this.bgSources = bgSources;\n this.endTimer('setBgSources');\n };\n\n setCgmSampleIntervalRange = (cgmSampleIntervalRange = this.defaultCgmSampleIntervalRange) => {\n this.cgmSampleIntervalRange = _.compact(cgmSampleIntervalRange);\n };\n\n setLatestPumpUpload = () => {\n this.startTimer('setLatestPumpUpload');\n this.clearFilters();\n\n const uploadData = this.sort.byTime(this.filter.byType('upload').top(Infinity));\n const latestPumpUpload = _.cloneDeep(getLatestPumpUpload(uploadData));\n\n if (latestPumpUpload) {\n const latestUploadSource = _.get(this.uploadMap[latestPumpUpload.uploadId], 'source', '').toLowerCase();\n const manufacturer = latestUploadSource === 'carelink' ? 'medtronic' : latestUploadSource;\n const deviceModel = _.get(latestPumpUpload, 'deviceModel', '');\n\n const latestPumpSettings = _.cloneDeep(this.latestDatumByType.pumpSettings);\n const latestPumpSettingsOrUpload = latestPumpSettings || latestPumpUpload;\n const pumpIsAutomatedBasalDevice = isAutomatedBasalDevice(manufacturer, latestPumpSettingsOrUpload, deviceModel);\n const pumpIsAutomatedBolusDevice = isAutomatedBolusDevice(manufacturer, latestPumpSettingsOrUpload);\n const pumpIsSettingsOverrideDevice = isSettingsOverrideDevice(manufacturer, latestPumpSettingsOrUpload);\n\n if (latestPumpSettings && pumpIsAutomatedBasalDevice) {\n const basalData = this.sort.byTime(this.filter.byType('basal').top(Infinity));\n latestPumpSettings.lastManualBasalSchedule = getLastManualBasalSchedule(basalData);\n }\n\n this.latestPumpUpload = {\n deviceModel,\n isAutomatedBasalDevice: pumpIsAutomatedBasalDevice,\n isAutomatedBolusDevice: pumpIsAutomatedBolusDevice,\n isSettingsOverrideDevice: pumpIsSettingsOverrideDevice,\n manufacturer,\n settings: latestPumpSettings,\n };\n }\n this.endTimer('setLatestPumpUpload');\n };\n\n setUploadMap = () => {\n this.startTimer('setUploadMap');\n this.clearFilters();\n const uploadData = this.filter.byType('upload').top(Infinity);\n const pumpSettingsData = this.filter.byType('pumpSettings').top(Infinity);\n this.uploadMap = {};\n\n _.each(uploadData, upload => {\n const pumpSettings = _.find(pumpSettingsData, { uploadId: upload.uploadId });\n let source = 'Unknown';\n\n if (_.get(upload, 'source')) {\n source = upload.source;\n } else if (_.isArray(upload.deviceManufacturers) && !_.isEmpty(upload.deviceManufacturers)) {\n if (upload.deviceManufacturers[0] === 'Medtronic' && _.filter(pumpSettingsData, {\n uploadId: upload.uploadId,\n source: 'carelink',\n }).length) {\n // Uploader does not specify `source` for CareLink uploads, so they incorrectly get set to\n // `Medtronic`, which should only be used for Medtronic Direct uploads. Check if\n // manufacturer equals Medtronic, then check pumpSettings array for uploads with that upload\n // ID and a source of `carelink`, then override appropriately.\n source = 'carelink';\n } else if (upload.deviceManufacturers[0] === 'Sequel' && _.filter(pumpSettingsData, {\n uploadId: upload.uploadId,\n model: 'twiist',\n }).length) {\n // Beginning with `client.version >= 3.0.0`, sequel twiist uploads include the deviceManufacturers\n // field, which contains `Sequel`. We treat these as `twiist` uploads for rendering purposes.\n source = TWIIST_LOOP.toLowerCase();\n } else {\n source = upload.deviceManufacturers[0];\n }\n } else if (isTidepoolLoop(pumpSettings)) {\n source = TIDEPOOL_LOOP.toLowerCase();\n } else if (isDIYLoop(pumpSettings)) {\n source = DIY_LOOP.toLowerCase();\n } else if (isTwiistLoop(upload)) {\n // We still need to check here for pre-3.0.0 uploads, which do not include the deviceManufacturers array\n source = TWIIST_LOOP.toLowerCase();\n }\n\n this.uploadMap[upload.uploadId] = {\n source,\n deviceSerialNumber: upload.deviceSerialNumber || upload.serialNumber || pumpSettings?.serialNumber || 'Unknown',\n };\n });\n this.endTimer('setUploadMap');\n };\n\n setIncompleteSuspends = () => {\n this.startTimer('setIncompleteSuspends');\n this.clearFilters();\n const deviceEventData = this.sort.byTime(this.filter.byType('deviceEvent').top(Infinity));\n this.incompleteSuspends = _.filter(\n deviceEventData,\n ({ annotations = [] }) => _.find(annotations, { code: 'status/incomplete-tuple' })\n );\n this.endTimer('setIncompleteSuspends');\n };\n\n setSize = () => {\n this.startTimer('setSize');\n this.size = this.data.size();\n this.endTimer('setSize');\n };\n\n setLatestDiabetesDatumEnd = () => {\n const latestDiabetesDatum = _.maxBy(\n _.filter(\n _.values(this.latestDatumByType),\n ({ type }) => _.includes(DIABETES_DATA_TYPES, type)\n ),\n d => (d.duration ? d.time + d.duration : d.time)\n );\n\n this.latestDiabetesDatumEnd = latestDiabetesDatum ? latestDiabetesDatum.time + (latestDiabetesDatum.duration || 0) : null;\n };\n\n setLatestTimeZone = () => {\n let latestTimeZone;\n const latestUpload = this.latestDatumByType.upload;\n const latestTimeChangeEvent = this.latestDatumByType.timeChange;\n\n const latestTimeZoneOffsetDatum = _.maxBy(\n _.filter(\n _.values(this.latestDatumByType || {}),\n ({ timezoneOffset, type }) => _.includes([...DIABETES_DATA_TYPES, 'dosingDecision'], type) && _.isFinite(timezoneOffset)\n ),\n 'time'\n );\n\n const createLatestTimeZone = (name, d, type) => {\n try {\n sundial.checkTimezoneName(name);\n const localizedTime = moment.utc(d.time).tz(name).format();\n latestTimeZone = { name, type: d.type, time: d.time };\n latestTimeZone.message = t('Defaulting to display in the timezone of most recent {{type}} at {{localizedTime}}', { localizedTime, type: type || d.type });\n } catch (e) {\n this.log('Invalid latest time zone:', name);\n }\n };\n\n if (latestTimeZoneOffsetDatum) {\n let { timezone } = latestTimeZoneOffsetDatum;\n\n if (!timezone) {\n // We calculate the nearest 'Etc/GMT' timezone from the timezone offset of the latest diabetes datum.\n // GMT offsets signs in Etc/GMT timezone names are reversed from the actual offset\n const offsetSign = Math.sign(latestTimeZoneOffsetDatum.timezoneOffset) === -1 ? '+' : '-';\n const offsetDuration = moment.duration(Math.abs(latestTimeZoneOffsetDatum.timezoneOffset), 'minutes');\n let offsetHours = offsetDuration.hours();\n const offsetMinutes = offsetDuration.minutes();\n if (offsetMinutes >= 30) offsetHours += 1;\n timezone = `Etc/GMT${offsetSign}${offsetHours}`;\n }\n\n createLatestTimeZone(timezone, latestTimeZoneOffsetDatum);\n\n // If the timeone on the latest upload record at the time of the latest diabetes datum has the\n // same UTC offset, we use that, since it will also have DST changeover info available.\n // We will also use the latest upload timezone if it's more recent than the diabetes datum.\n if (!_.isEmpty(latestUpload?.timezone)) {\n const uploadTimezoneOffsetAtLatestDiabetesTime = moment.utc(latestTimeZoneOffsetDatum.time).tz(latestUpload.timezone).utcOffset();\n\n if (\n uploadTimezoneOffsetAtLatestDiabetesTime === latestTimeZoneOffsetDatum.timezoneOffset ||\n latestUpload.time >= latestTimeZoneOffsetDatum.time\n ) {\n createLatestTimeZone(latestUpload.timezone, latestUpload);\n }\n }\n } else if (latestTimeChangeEvent?.to?.timeZoneName) {\n // Tidepool Mobile data only sends timezone info on `timeChange` device events, so for\n // accounts with only TM data, this is our best bet\n createLatestTimeZone(latestTimeChangeEvent.to.timeZoneName, latestTimeChangeEvent, 'time change');\n } else if (!_.isEmpty(latestUpload?.timezone)) {\n // Fallback to latest upload timezone if there is no diabetes data with timezone offsets\n createLatestTimeZone(latestUpload.timezone, latestUpload);\n }\n\n this.latestTimeZone = latestTimeZone;\n };\n\n /* eslint-disable no-param-reassign */\n setDevices = () => {\n this.startTimer('setDevices');\n const uploadsById = _.keyBy(this.sort.byTime(this.filter.byType('upload').top(Infinity)), 'uploadId');\n\n this.devices = _.reduce(this.deviceUploadMap, (result, value, key) => {\n const upload = uploadsById[value];\n let device = { id: key };\n\n if (upload) {\n const isContinuous = _.get(upload, 'dataSetType') === 'continuous';\n const deviceManufacturer = _.get(upload, 'deviceManufacturers.0', '');\n const deviceModel = _.get(upload, 'deviceModel', '');\n let label = key;\n\n if (deviceManufacturer || deviceModel) {\n if (deviceManufacturer === 'Dexcom' && isContinuous) {\n label = t('Dexcom API');\n } else if (deviceManufacturer === 'Abbott' && isContinuous) {\n label = t('FreeStyle Libre (from LibreView)');\n } else if (deviceManufacturer === 'Sequel' && isContinuous) {\n label = t('twiist');\n } else {\n label = _.reject([deviceManufacturer, deviceModel], _.isEmpty).join(' ');\n }\n }\n\n if (key.indexOf('tandemCIQ') === 0) label = [label, `(${t('Control-IQ')})`].join(' ');\n\n device = {\n bgm: _.includes(upload.deviceTags, 'bgm'),\n cgm: _.includes(upload.deviceTags, 'cgm'),\n oneMinCgmSampleInterval: isOneMinCGMSampleIntervalDevice(upload),\n id: key,\n label,\n pump: _.includes(upload.deviceTags, 'insulin-pump'),\n serialNumber: upload.deviceSerialNumber,\n };\n }\n\n result.push(device);\n return result;\n }, []);\n\n const allDeviceIds = _.keys(this.deviceUploadMap);\n const excludedDevices = this.excludedDevices || [];\n\n _.each(this.devices, device => {\n if (device.id.indexOf('tandemCIQ') === 0) {\n // Exclude pre-control-iq tandem uploads by default if we have data from the same device\n // from a version of uploader supports control-iq data. Otherwise, we have duplicate data.\n const preCIQDeviceID = device.id.replace('tandemCIQ', 'tandem');\n if (_.includes(allDeviceIds, preCIQDeviceID)) excludedDevices.push(preCIQDeviceID);\n }\n });\n\n this.setExcludedDevices(_.uniq(excludedDevices));\n\n this.endTimer('setDevices');\n };\n /* eslint-enable no-param-reassign */\n\n setDataAnnotations = d => {\n if (this.trackDataAnnotations && d.annotations?.length) {\n // Set any new annotation by code to the dataAnnotations metaData map\n _.each(d.annotations, (annotation) => {\n if (!this.dataAnnotations[annotation.code]) this.dataAnnotations[annotation.code] = annotation;\n });\n }\n };\n\n setMetaData = () => {\n this.startTimer('setMetaData');\n this.setSize();\n if (!this.bgPrefs) this.setBgPrefs();\n this.setBgSources();\n if (!this.timePrefs) this.setTimePrefs();\n this.setEndpoints();\n this.setActiveDays();\n this.setTypes();\n this.setUploadMap();\n this.setDevices();\n this.setLatestPumpUpload();\n this.setIncompleteSuspends();\n this.setLatestDiabetesDatumEnd();\n this.setLatestTimeZone();\n this.endTimer('setMetaData');\n };\n\n setEndpoints = (endpoints, nextDays = 0, prevDays = 0) => {\n this.startTimer('setEndpoints');\n this.endpoints = {\n current: { range: [0, Infinity] },\n };\n\n if (endpoints) {\n const { timezoneName } = this.timePrefs;\n const days = moment.utc(endpoints[1]).diff(moment.utc(endpoints[0])) / MS_IN_DAY;\n\n this.endpoints.current = {\n range: _.map(endpoints, e => moment.utc(e).valueOf()),\n days,\n activeDays: days,\n };\n\n if (nextDays > 0) {\n this.endpoints.next = {\n range: [\n this.endpoints.current.range[1],\n moment.utc(endpoints[1]).add(nextDays, 'days').valueOf(),\n ],\n days: nextDays,\n activeDays: nextDays,\n };\n\n if (timezoneName) {\n const nextStartIsDST = moment.utc(this.endpoints.next.range[0]).tz(timezoneName).isDST();\n const nextEndIsDST = moment.utc(this.endpoints.next.range[1]).tz(timezoneName).isDST();\n const nextOverlapsDSTChangeover = nextStartIsDST !== nextEndIsDST;\n\n if (nextOverlapsDSTChangeover) {\n const offset = nextEndIsDST ? -MS_IN_HOUR : MS_IN_HOUR;\n this.endpoints.next.range[1] = this.endpoints.next.range[1] + offset;\n }\n }\n }\n\n if (prevDays > 0) {\n this.endpoints.prev = {\n range: [\n moment.utc(endpoints[0]).subtract(prevDays, 'days').valueOf(),\n this.endpoints.current.range[0],\n ],\n days: prevDays,\n activeDays: prevDays,\n };\n\n if (timezoneName) {\n const prevStartIsDST = moment.utc(this.endpoints.prev.range[0]).tz(timezoneName).isDST();\n const prevEndIsDST = moment.utc(this.endpoints.prev.range[1]).tz(timezoneName).isDST();\n const prevOverlapsDSTChangeover = prevStartIsDST !== prevEndIsDST;\n\n if (prevOverlapsDSTChangeover) {\n const offset = prevStartIsDST ? -MS_IN_HOUR : MS_IN_HOUR;\n this.endpoints.prev.range[0] = this.endpoints.prev.range[0] + offset;\n }\n }\n }\n }\n this.endTimer('setEndpoints');\n };\n\n setActiveDays = activeDays => {\n this.startTimer('setActiveDays');\n this.activeDays = activeDays || [0, 1, 2, 3, 4, 5, 6];\n\n _.each(_.keys(this.endpoints), range => {\n if (this.endpoints[range].days) {\n this.log('this.endpoints[range].days', this.endpoints[range].days);\n this.endpoints[range].activeDays = _.filter(\n _.reduce([\n this.endpoints[range].range[0],\n ...(new Array(Math.round(this.endpoints[range].days) - 1)),\n ], (acc, date, index) => {\n let day;\n if (index === 0) {\n day = moment.utc(date).tz(_.get(this, 'timePrefs.timezoneName', 'UTC')).day();\n } else {\n const nextDay = acc[index - 1] + 1;\n day = nextDay > 6 ? nextDay - 7 : nextDay;\n }\n acc.push(day);\n return acc;\n }, []),\n dayOfWeek => _.includes(this.activeDays, dayOfWeek)\n ).length;\n }\n });\n this.endTimer('setActiveDays');\n };\n\n setStats = (stats = []) => {\n this.stats = _.isString(stats) ? _.map(stats.split(','), _.trim) : stats;\n };\n\n setTypes = types => {\n this.startTimer('setTypes');\n this.types = _.isArray(types) ? types : [];\n\n if (_.isPlainObject(types)) {\n this.types = _.map(types, (value, type) => ({\n type,\n ...value,\n }));\n } else if (types === '*') {\n const groupByType = this.dimension.byType.group();\n\n this.types = _.map(groupByType.all(), group => ({\n type: group.key,\n select: '*',\n sort: `${this.activeTimeField},asc`,\n }));\n\n groupByType.dispose();\n }\n\n if (this.types.length) this.queryDataCount += 1;\n this.endTimer('setTypes');\n };\n\n setTimePrefs = (timePrefs = {}) => {\n this.startTimer('setTimePrefs');\n const {\n timezoneAware = false,\n } = timePrefs;\n\n let timezoneName = timePrefs.timezoneName || undefined;\n\n if (timezoneAware) {\n timezoneName = getTimezoneFromTimePrefs(timePrefs);\n }\n\n const prevTimezoneName = _.get(this, 'timePrefs.timezoneName');\n const timezoneNameChanged = timezoneName !== prevTimezoneName;\n\n const prevTimezoneAware = _.get(this, 'timePrefs.timezoneAware');\n const timezoneAwareChanged = timezoneAware !== prevTimezoneAware;\n\n this.timePrefs = {\n timezoneAware,\n timezoneName,\n };\n\n const prevActiveTimeField = this.activeTimeField;\n this.activeTimeField = timezoneAware ? 'time' : 'deviceTime';\n const activeTimeFieldChanged = this.activeTimeField !== prevActiveTimeField;\n\n // Recreate the byTime, byDayOfWeek and byDayOfYear dimensions as needed\n // to index on the proper time field.\n const dimensionUpdates = {\n byDate: timezoneNameChanged || timezoneAwareChanged || activeTimeFieldChanged,\n byDayOfWeek: timezoneNameChanged || timezoneAwareChanged || activeTimeFieldChanged,\n byTime: timezoneAwareChanged || activeTimeFieldChanged,\n };\n\n if (dimensionUpdates.byDate) this.buildByDateDimension();\n if (dimensionUpdates.byDayOfWeek) this.buildByDayOfWeekDimension();\n if (dimensionUpdates.byTime) this.buildByTimeDimension();\n this.endTimer('setTimePrefs');\n };\n\n setBgPrefs = (bgPrefs = {}) => {\n this.startTimer('setBgPrefs');\n const {\n bgBounds = DEFAULT_BG_BOUNDS[MGDL_UNITS],\n bgClasses = {},\n bgUnits = MGDL_UNITS,\n ...rest\n } = bgPrefs;\n\n // bgClasses required for legacy tideline charts until we deprecate them\n _.defaults(bgClasses, {\n 'very-low': { boundary: DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold },\n low: { boundary: DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound },\n target: { boundary: DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound },\n high: { boundary: DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold },\n });\n\n this.bgPrefs = {\n bgBounds,\n bgClasses,\n bgUnits,\n ...rest,\n };\n this.endTimer('setBgPrefs');\n };\n\n setReturnRawData = (returnRaw = false) => {\n this.returnRawData = returnRaw;\n };\n\n setExcludedDevices = (deviceIds = this.excludedDevices) => {\n this.startTimer('setExcludedDevices');\n this.excludedDevices = deviceIds;\n this.endTimer('setExcludedDevices');\n };\n\n clearMatchedDevices = () => {\n this.matchedDevices = {};\n };\n\n clearDataAnnotations = () => {\n this.dataAnnotations = {};\n };\n\n query = (query = {}) => {\n this.log('Query', query);\n\n this.startTimer('query total');\n const {\n activeDays,\n aggregationsByDate,\n bgPrefs,\n bgSource,\n cgmSampleIntervalRange,\n endpoints,\n excludedDevices,\n fillData,\n metaData,\n nextDays,\n prevDays,\n raw,\n stats,\n timePrefs,\n types,\n } = query;\n\n // N.B. Must ensure that we get the desired endpoints in UTC time so that when we display in\n // the desired time zone, we have all the data.\n\n // Clear all previous filters\n this.clearFilters();\n\n // Clear matchedDevices metaData if the current endpoints change\n const activeDaysChanged = activeDays && !_.isEqual(activeDays, this.activeDays);\n const bgSourceChanged = bgSource !== this.bgSources?.current;\n const endpointsChanged = endpoints && !_.isEqual(endpoints, this.endpoints?.current?.range);\n const excludedDevicesChanged = excludedDevices && !_.isEqual(excludedDevices, this.excludedDevices);\n\n if (activeDaysChanged || bgSourceChanged || endpointsChanged || excludedDevicesChanged) {\n this.clearMatchedDevices();\n }\n\n this.setReturnRawData(raw);\n this.setBgSources(bgSource);\n this.setCgmSampleIntervalRange(cgmSampleIntervalRange);\n this.setTypes(types);\n this.setStats(stats);\n if (bgPrefs) this.setBgPrefs(bgPrefs);\n if (timePrefs) this.setTimePrefs(timePrefs);\n this.setEndpoints(endpoints, nextDays, prevDays);\n this.setActiveDays(activeDays);\n this.setExcludedDevices(excludedDevices);\n\n const data = {};\n\n _.each(this.endpoints, (rangeEndpoints, rangeKey) => {\n this.activeRange = rangeKey;\n this.activeEndpoints = rangeEndpoints;\n this.matchDevices = false;\n this.trackDataAnnotations = false;\n data[rangeKey] = {};\n\n // Filter the data set by date range\n this.filter.byEndpoints(this.activeEndpoints.range);\n\n // Filter out any inactive days of the week\n this.filter.byActiveDays(this.activeDays);\n\n // Filter out any excluded devices\n this.filter.byDeviceIds(this.excludedDevices);\n\n if (rangeKey === 'current') {\n this.matchDevices = true;\n const requestedMetaData = _.isString(metaData) ? _.map(metaData.split(','), _.trim) : metaData;\n const dataAnnotationsRequested = _.includes(requestedMetaData, 'dataAnnotations');\n\n // We generate annotations metaData only when typed data is requested, or certain stats are\n // being requested that may be inaccurate when certain annotations are present in the data.\n this.trackDataAnnotations = dataAnnotationsRequested && (\n this.types.length || _.intersection(this.stats, [commonStats.sensorUsage, commonStats.timeInRange]).length\n );\n\n // Clear previous dataAnnotations metaData so we can track annotations for only the current data\n if (this.trackDataAnnotations) this.clearDataAnnotations();\n\n // Generate the aggregations for current range\n if (aggregationsByDate) {\n data[rangeKey].aggregationsByDate = this.getAggregationsByDate(aggregationsByDate);\n }\n\n // Generate the stats for current range\n if (this.stats.length) {\n data[rangeKey].stats = this.getStats(this.stats);\n }\n }\n\n data[rangeKey].endpoints = this.activeEndpoints;\n\n // Generate the requested data\n if (this.types.length) {\n data[rangeKey].data = this.getTypeData(this.types);\n }\n\n // Generate the requested fillData\n if (fillData) {\n data[rangeKey].data = data[rangeKey].data || {};\n data[rangeKey].data.fill = this.getFillData(this.activeEndpoints.range, fillData);\n }\n });\n this.endTimer('query total');\n\n const result = {\n data,\n timePrefs: this.timePrefs,\n bgPrefs: this.bgPrefs,\n query,\n };\n\n if (metaData) result.metaData = this.getMetaData(metaData);\n\n // Always reset `returnRawData`, `matchDevices` and `trackDataAnnotations` to `false` after each query\n this.setReturnRawData(false);\n this.matchDevices = false;\n this.trackDataAnnotations = false;\n\n this.log('Result', result);\n\n return result;\n };\n\n getStats = stats => {\n this.startTimer('generate stats');\n const generatedStats = {};\n\n this.statUtil = new StatUtil(this);\n _.each(stats, stat => {\n const method = statFetchMethods[stat];\n // Reset the byType and bySampleInterval filters prior to each stat calculation.\n // Stats that need to filter by these will do so internally within the statUtil.\n this.dimension.byType.filterAll();\n this.dimension.bySampleInterval.filterAll();\n\n if (_.isFunction(this.statUtil[method])) {\n this.startTimer(`stat | ${stat}`);\n generatedStats[stat] = this.statUtil[method]();\n this.endTimer(`stat | ${stat}`);\n }\n });\n delete this.statUtil;\n this.endTimer('generate stats');\n return generatedStats;\n };\n\n getAggregationsByDate = aggregationsByDate => {\n this.startTimer('generate aggregationsByDate');\n const selectedAggregationsByDate = _.isString(aggregationsByDate) ? _.map(aggregationsByDate.split(','), _.trim) : aggregationsByDate;\n const generatedAggregationsByDate = {};\n const groupByDate = this.dimension.byDate.group();\n\n const aggregationMethods = {\n basals: 'aggregateBasals',\n boluses: 'aggregateBoluses',\n fingersticks: 'aggregateFingersticks',\n siteChanges: 'aggregateSiteChanges',\n dataByDate: 'aggregateDataByDate',\n statsByDate: 'aggregateStatsByDate',\n };\n\n this.aggregationUtil = new AggregationUtil(this);\n\n _.each(selectedAggregationsByDate, aggregationType => {\n const method = aggregationMethods[aggregationType];\n\n if (_.isFunction(this.aggregationUtil[method])) {\n this.startTimer(`aggregation | ${aggregationType}`);\n generatedAggregationsByDate[aggregationType] = this.aggregationUtil[method](groupByDate);\n this.endTimer(`aggregation | ${aggregationType}`);\n }\n });\n\n groupByDate.dispose();\n delete this.aggregationUtil;\n\n this.endTimer('generate aggregationsByDate');\n return generatedAggregationsByDate;\n };\n\n getFillData = (endpoints, opts = {}) => {\n this.startTimer('generate fillData');\n const timezone = _.get(this, 'timePrefs.timezoneName', 'UTC');\n const days = this.activeEndpoints.days;\n const fillHours = 3;\n const fillBinCount = (24 / fillHours) * days;\n const duration = fillHours * MS_IN_HOUR;\n\n const start = moment.utc(endpoints[0]).tz(timezone).startOf('day').valueOf();\n\n const hourlyStarts = [start];\n for (let index = 1; index < 24 * days; index++) {\n hourlyStarts.push(hourlyStarts[index - 1] + MS_IN_HOUR);\n }\n\n const fillData = [];\n let prevFill = null;\n\n _.each(hourlyStarts, startTime => {\n const fill = {\n duration,\n time: startTime,\n type: 'fill',\n };\n this.normalizeDatumOut(fill);\n\n if (fill.hourOfDay % fillHours === 0) {\n if (opts.adjustForDSTChanges) {\n if (prevFill && fill.normalTime !== prevFill.normalEnd) {\n if (fill.normalTime > prevFill.normalEnd) {\n // Adjust for Fall Back gap\n prevFill.normalEnd = fill.normalTime;\n } else if (fill.normalTime < prevFill.normalEnd) {\n // Adjust for Spring Forward overlap\n prevFill.normalEnd = fill.normalTime;\n }\n\n fillData.splice(-1, 1, prevFill);\n }\n }\n\n if (fillData.length < fillBinCount) fillData.push(fill);\n prevFill = fill;\n }\n });\n\n this.endTimer('generate fillData');\n return fillData;\n };\n\n getMetaData = metaData => {\n this.startTimer('generate metaData');\n const allowedMetaData = [\n 'bgSources',\n 'latestDatumByType',\n 'latestPumpUpload',\n 'latestTimeZone',\n 'patientId',\n 'size',\n 'devices',\n 'excludedDevices',\n 'matchedDevices',\n 'dataAnnotations',\n 'queryDataCount',\n ];\n\n const requestedMetaData = _.isString(metaData) ? _.map(metaData.split(','), _.trim) : metaData;\n\n const selectedMetaData = _.cloneDeep(_.pick(\n this,\n _.intersection(allowedMetaData, requestedMetaData)\n ));\n\n _.each(selectedMetaData.latestDatumByType, d => this.normalizeDatumOut(d, ['*']));\n\n if (_.get(selectedMetaData, 'latestPumpUpload.settings')) {\n this.normalizeDatumOut(selectedMetaData.latestPumpUpload.settings, ['*']);\n }\n\n this.endTimer('generate metaData');\n return selectedMetaData;\n };\n\n getPreviousSiteChangeDatums = datum => {\n const prevFilters = {\n byType: this.activeType,\n bySubType: this.activeSubType,\n };\n\n // We need to ensure all the days of the week are active to ensure we get all siteChanges\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter catch all previous datums\n this.filter.byEndpoints([\n 0,\n datum[this.activeTimeField],\n ]);\n\n this.filter.byType('deviceEvent');\n\n // Fetch previous prime and reservoirChange data\n const previousPrimeData = this.sort\n .byTime(_.cloneDeep(this.filter.bySubType('prime').top(Infinity)))\n .reverse();\n\n const previousReservoirChangeData = this.sort\n .byTime(_.cloneDeep(this.filter.bySubType('reservoirChange').top(Infinity)))\n .reverse();\n\n const previousSiteChangeDatums = {\n cannulaPrime: _.find(previousPrimeData, { primeTarget: 'cannula' }),\n tubingPrime: _.find(previousPrimeData, { primeTarget: 'tubing' }),\n reservoirChange: previousReservoirChangeData[0],\n };\n\n // Reset the endpoints, activeDays, type, and subType filters to the back to what they were\n this.filter.byActiveDays(this.activeDays);\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byType(prevFilters.byType);\n this.filter.bySubType(prevFilters.bySubType);\n\n return previousSiteChangeDatums;\n };\n\n getTypeData = types => {\n const generatedData = {};\n\n _.each(types, ({ type, select = '*', sort = {} }) => {\n const fields = _.isString(select) ? _.map(select.split(','), _.trim) : select;\n const returnAllFields = fields[0] === '*';\n\n // Clear any previous byType and bySampleInterval filters\n this.dimension.byType.filterAll();\n this.dimension.bySampleInterval.filterAll();\n\n // Filter cgm data by the currently-set sample interval range.\n if (type === CGM_DATA_KEY) {\n this.filter.bySampleIntervalRange(...(this.cgmSampleIntervalRange || this.defaultCgmSampleIntervalRange));\n }\n\n // Filter data by the requested type\n let typeData = _.cloneDeep(this.filter.byType(type).top(Infinity));\n _.each(typeData, d => this.normalizeDatumOut(d, fields));\n\n // Normalize data\n this.startTimer(`normalize | ${type} | ${this.activeRange}`);\n if (_.includes(['basal', 'deviceEvent'], type)) {\n typeData = this.sort.byTime(typeData);\n\n const trimOverlappingStart = () => {\n // Normalize the data data and add any datums overlapping the start\n let data = _.cloneDeep(typeData || []);\n if (type === 'deviceEvent') data = _.filter(data, { subType: 'pumpSettingsOverride' });\n\n const initalDataLength = data.length;\n\n data = type === 'deviceEvent'\n ? this.addPumpSettingsOverrideOverlappingStart(data, fields)\n : this.addBasalOverlappingStart(data, fields);\n\n if (data.length > initalDataLength) typeData.unshift(data[0]);\n\n // Trim the first datum if it overlaps the start\n if (typeData.length && _.isFinite(typeData[0].duration)) {\n typeData[0].normalTime = _.max([\n typeData[0].normalTime,\n this.activeEndpoints.range[0],\n ]);\n }\n };\n\n const trimOverlappingEnd = () => {\n // Trim last datum if it has a duration that overlaps the range end\n const indexOfLastDurationDatum = _.findLastIndex(typeData, d => _.isFinite(d.duration));\n if (indexOfLastDurationDatum > -1) {\n typeData[indexOfLastDurationDatum].normalEnd = _.min([\n typeData[indexOfLastDurationDatum].normalEnd,\n this.activeEndpoints.range[1],\n ]);\n }\n };\n\n if (this.activeRange === 'prev') {\n trimOverlappingStart();\n } else if (this.activeRange === 'next') {\n trimOverlappingEnd();\n } else if (this.activeRange === 'current') {\n if (!this.endpoints.prev) trimOverlappingStart();\n if (!this.endpoints.next) trimOverlappingEnd();\n }\n }\n this.endTimer(`normalize | ${type} | ${this.activeRange}`);\n\n // Sort data\n this.startTimer(`sort | ${type} | ${this.activeRange}`);\n let sortOpts = sort;\n if (_.isString(sortOpts)) {\n const sortArray = _.map(sort.split(','), _.trim);\n sortOpts = {\n field: sortArray[0],\n order: sortArray[1],\n };\n }\n\n if (sortOpts.field) {\n typeData = _.sortBy(typeData, [sortOpts.field]);\n }\n\n if (sortOpts.order === 'desc') typeData.reverse();\n this.endTimer(`sort | ${type} | ${this.activeRange}`);\n\n // Pick selected fields\n this.startTimer(`select fields | ${type} | ${this.activeRange}`);\n if (!returnAllFields) typeData = _.map(typeData, d => _.pick(d, fields));\n this.endTimer(`select fields | ${type} | ${this.activeRange}`);\n\n generatedData[type] = typeData;\n });\n\n return generatedData;\n };\n\n addBasalOverlappingStart = (basalData = [], normalizeFields) => {\n _.each(basalData, d => {\n if (!d.normalTime) this.normalizeDatumOut(d, normalizeFields);\n });\n\n // We need to ensure all the days of the week are active to ensure we get all basals\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter get all previous basal datums\n this.filter.byEndpoints([\n 0,\n this.activeEndpoints.range[0],\n ]);\n\n // Fetch previous basal datum\n const previousBasalDatum = this.sort\n .byTime(this.filter.byType('basal').top(Infinity))\n .reverse()[0];\n\n if (previousBasalDatum) {\n this.normalizeDatumOut(previousBasalDatum, normalizeFields);\n\n // Add to top of basal data array if it overlaps the start endpoint\n const datumOverlapsStart = previousBasalDatum.normalTime < this.activeEndpoints.range[0]\n && previousBasalDatum.normalEnd > this.activeEndpoints.range[0];\n\n if (datumOverlapsStart) {\n basalData.unshift(previousBasalDatum);\n }\n }\n\n // Reset the endpoints and activeDays filters to the back to what they were\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byActiveDays(this.activeDays);\n\n return basalData;\n };\n\n addPumpSettingsOverrideOverlappingStart = (pumpSettingsOverrideData = [], normalizeFields) => {\n _.each(pumpSettingsOverrideData, d => {\n if (!d.normalTime) this.normalizeDatumOut(d, normalizeFields);\n });\n\n // We need to ensure all the days of the week are active to ensure we get all override datums\n this.filter.byActiveDays([0, 1, 2, 3, 4, 5, 6]);\n\n // Set the endpoints filter get all previous override datums\n this.filter.byEndpoints([\n 0,\n this.activeEndpoints.range[0],\n ]);\n\n // Fetch previous override datum\n const previousPumpSettingsOverrideDatum = _.cloneDeep(_.filter(\n this.sort.byTime(this.filter.byType('deviceEvent').top(Infinity)),\n { subType: 'pumpSettingsOverride' }\n ).reverse()[0]);\n\n if (previousPumpSettingsOverrideDatum) {\n this.normalizeDatumOut(previousPumpSettingsOverrideDatum, normalizeFields);\n\n\n // Add to top of pumpSettingsOverride data array if it overlaps the start endpoint\n const datumOverlapsStart = previousPumpSettingsOverrideDatum.normalTime < this.activeEndpoints.range[0]\n && previousPumpSettingsOverrideDatum.normalEnd > this.activeEndpoints.range[0];\n\n if (datumOverlapsStart) {\n pumpSettingsOverrideData.unshift(previousPumpSettingsOverrideDatum);\n }\n }\n\n // Reset the endpoints and activeDays filters to the back to what they were\n this.filter.byEndpoints(this.activeEndpoints.range);\n this.filter.byActiveDays(this.activeDays);\n\n return pumpSettingsOverrideData;\n };\n}\n\nexport default DataUtil;\n","import _ from 'lodash';\nimport bows from 'bows';\nimport moment from 'moment-timezone';\n\nimport { getTotalBasalFromEndpoints, getBasalGroupDurationsFromEndpoints } from './basal';\nimport { getTotalBolus } from './bolus';\nimport { classifyBgValue } from './bloodglucose';\nimport { BGM_DATA_KEY, CGM_DATA_KEY, MGDL_UNITS, MGDL_PER_MMOLL, MS_IN_DAY, MS_IN_MIN } from './constants';\nimport { formatLocalizedFromUTC } from './datetime';\n\n/* eslint-disable lodash/prefer-lodash-method, no-underscore-dangle, no-param-reassign */\n\nexport class StatUtil {\n /**\n * @param {Object} dataUtil - a DataUtil instance\n */\n constructor(dataUtil) {\n this.log = bows('StatUtil');\n this.init(dataUtil);\n }\n\n init = (dataUtil) => {\n this.dataUtil = dataUtil;\n this.bgBounds = _.get(dataUtil, 'bgPrefs.bgBounds');\n this.bgUnits = _.get(dataUtil, 'bgPrefs.bgUnits');\n this.bgSource = _.get(dataUtil, 'bgSources.current', BGM_DATA_KEY);\n this.activeDays = dataUtil.activeEndpoints.activeDays;\n this.endpoints = dataUtil.activeEndpoints.range;\n this.timePrefs = _.get(dataUtil, 'timePrefs');\n\n this.log('activeDays', this.activeDays);\n this.log('bgSource', this.bgSource);\n this.log('bgPrefs', { bgBounds: this.bgBounds, bgUnits: this.bgUnits });\n };\n\n filterCBGDataByDefaultSampleInterval = () => {\n this.dataUtil.filter.bySampleIntervalRange(...this.dataUtil.defaultCgmSampleIntervalRange);\n };\n\n getAverageGlucoseData = (returnBgData = false) => {\n if (this.bgSource === CGM_DATA_KEY) this.filterCBGDataByDefaultSampleInterval();\n\n let bgData = _.cloneDeep(this.dataUtil.filter.byType(this.bgSource).top(Infinity));\n\n if (this.bgSource === CGM_DATA_KEY) {\n bgData = this.dataUtil.getDeduplicatedCBGData(bgData);\n }\n\n _.each(bgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const data = {\n averageGlucose: _.meanBy(bgData, 'value'),\n total: bgData.length,\n };\n\n if (returnBgData) {\n data.bgData = bgData;\n }\n\n return data;\n };\n\n getBgExtentsData = () => {\n if (this.bgSource === CGM_DATA_KEY) this.filterCBGDataByDefaultSampleInterval();\n\n let bgData = _.cloneDeep(this.dataUtil.filter.byType(this.bgSource).top(Infinity));\n\n if (this.bgSource === CGM_DATA_KEY) {\n bgData = this.dataUtil.getDeduplicatedCBGData(bgData);\n }\n\n _.each(bgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const rawBgData = this.dataUtil.sort.byTime(_.cloneDeep(bgData));\n const newestDatum = _.cloneDeep(_.last(rawBgData));\n const oldestDatum = _.cloneDeep(_.first(rawBgData));\n if (newestDatum) this.dataUtil.normalizeDatumOut(newestDatum, ['msPer24', 'localDate']);\n if (oldestDatum) this.dataUtil.normalizeDatumOut(oldestDatum, ['msPer24', 'localDate']);\n\n let bgDaysWorn;\n\n if (rawBgData.length < 2) {\n bgDaysWorn = rawBgData.length;\n } else {\n bgDaysWorn = moment.utc(newestDatum?.localDate).diff(moment.utc(oldestDatum?.localDate), 'days', true) + 1;\n }\n\n const data = {\n bgMax: _.get(_.maxBy(bgData, 'value'), 'value', null),\n bgMin: _.get(_.minBy(bgData, 'value'), 'value', null),\n bgDaysWorn,\n newestDatum,\n oldestDatum,\n };\n\n return data;\n };\n\n getBasalBolusData = () => {\n const bolusData = this.dataUtil.filter.byType('bolus').top(Infinity);\n const rawBasalData = this.dataUtil.sort.byTime(this.dataUtil.filter.byType('basal').top(Infinity));\n const basalData = this.dataUtil.addBasalOverlappingStart(_.cloneDeep(rawBasalData));\n\n // Create a list of all dates for which we have at least one datum\n const uniqueDatumDates = new Set([\n ...bolusData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ...rawBasalData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ]);\n\n const activeDaysWithInsulinData = uniqueDatumDates.size;\n\n const basalBolusData = {\n basal: basalData.length\n ? parseFloat(getTotalBasalFromEndpoints(basalData, this.endpoints))\n : NaN,\n bolus: bolusData.length ? getTotalBolus(bolusData) : NaN,\n };\n\n if (this.activeDays > 1 && activeDaysWithInsulinData > 1) {\n basalBolusData.basal = basalBolusData.basal / activeDaysWithInsulinData;\n basalBolusData.bolus = basalBolusData.bolus / activeDaysWithInsulinData;\n }\n\n return basalBolusData;\n };\n\n getCarbsData = () => {\n const wizardData = this.dataUtil.filter.byType('wizard').top(Infinity);\n const foodData = this.dataUtil.filter.byType('food').top(Infinity);\n\n // Create a list of all dates for which we have at least one datum\n const uniqueDatumDates = new Set([\n ...wizardData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ...foodData.map(datum => formatLocalizedFromUTC(datum.time, this.timePrefs, 'YYYY-MM-DD')),\n ]);\n\n const activeDaysWithCarbData = uniqueDatumDates.size;\n\n const wizardCarbs = _.reduce(\n wizardData,\n (result, datum) => {\n const units = _.get(datum, 'carbUnits', 'grams');\n\n const carbInput = this.dataUtil.needsCarbToExchangeConversion(datum)\n ? this.dataUtil.getDeconvertedCarbExchange(datum)\n : _.get(datum, 'carbInput', 0);\n\n return {\n ...result,\n [units]: result[units] + carbInput,\n };\n },\n {\n grams: 0,\n exchanges: 0,\n }\n );\n\n const foodCarbs = _.reduce(\n foodData,\n (result, datum) => result + _.get(datum, 'nutrition.carbohydrate.net', 0),\n 0\n );\n\n let carbs = {\n grams: wizardCarbs.grams + foodCarbs,\n exchanges: wizardCarbs.exchanges,\n };\n\n if (this.activeDays > 1 && activeDaysWithCarbData > 1) {\n carbs = {\n grams: carbs.grams / activeDaysWithCarbData,\n exchanges: carbs.exchanges / activeDaysWithCarbData,\n };\n }\n\n return {\n carbs,\n total: wizardData.length + foodData.length,\n };\n };\n\n getCoefficientOfVariationData = () => {\n const {\n averageGlucose,\n insufficientData,\n standardDeviation,\n total,\n } = this.getStandardDevData();\n\n const coefficientOfVariationData = {\n coefficientOfVariation: standardDeviation / averageGlucose * 100,\n total,\n };\n\n if (insufficientData) {\n coefficientOfVariationData.insufficientData = true;\n }\n\n return coefficientOfVariationData;\n };\n\n getDailyAverageSums = data => {\n const clone = _.clone(data);\n\n _.each(clone, (value, key) => {\n if (key !== 'total') {\n clone[key] = value / this.activeDays;\n }\n });\n\n return clone;\n };\n\n getDailyAverageDurations = data => {\n const clone = _.clone(data);\n const total = data.total || _.sum(_.values(data));\n\n _.each(clone, (value, key) => {\n if (key !== 'total') {\n clone[key] = (value / total) * MS_IN_DAY;\n }\n });\n\n return clone;\n };\n\n getGlucoseManagementIndicatorData = () => {\n const { averageGlucose, bgData, total } = this.getAverageGlucoseData(true);\n\n const getTotalCbgDuration = () => _.reduce(\n bgData,\n (result, datum) => {\n result += datum.sampleInterval;\n return result;\n },\n 0\n );\n\n const insufficientData = this.bgSource === 'smbg'\n || this.activeDays < 14\n || getTotalCbgDuration() < 14 * MS_IN_DAY * 0.7;\n\n const meanInMGDL = this.bgUnits === MGDL_UNITS\n ? averageGlucose\n : averageGlucose * MGDL_PER_MMOLL;\n\n const glucoseManagementIndicator = (3.31 + 0.02392 * meanInMGDL);\n const glucoseManagementIndicatorAGP = glucoseManagementIndicator;\n\n if (insufficientData) {\n // We still return values for AGP reports where the data sufficiency requirements are\n // different from ours and are checked at time of report generation\n return {\n glucoseManagementIndicator: NaN,\n glucoseManagementIndicatorAGP,\n insufficientData: true,\n };\n }\n\n return {\n glucoseManagementIndicator,\n glucoseManagementIndicatorAGP,\n total,\n };\n };\n\n getReadingsInRangeData = () => {\n const smbgData = _.cloneDeep(this.dataUtil.filter.byType('smbg').top(Infinity));\n _.each(smbgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const initialValue = {\n counts: {\n low: 0,\n target: 0,\n high: 0,\n total: 0,\n },\n };\n\n if (_.isNumber(this.bgBounds.veryLowThreshold)) {\n initialValue.counts.veryLow = 0;\n }\n\n if (_.isNumber(this.bgBounds.veryHighThreshold)) {\n initialValue.counts.veryHigh = 0;\n }\n\n const readingsInRangeData = _.reduce(\n smbgData,\n (result, datum) => {\n const classification = classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay');\n result.counts[classification]++;\n result.counts.total++;\n return result;\n },\n initialValue\n );\n\n if (this.activeDays > 1) {\n readingsInRangeData.dailyAverages = this.getDailyAverageSums(readingsInRangeData.counts);\n }\n\n return readingsInRangeData;\n };\n\n getSensorUsage = () => {\n this.filterCBGDataByDefaultSampleInterval();\n const rawCbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const cbgData = this.dataUtil.getDeduplicatedCBGData(rawCbgData);\n\n let sensorUsage = 0;\n for (let i = 0; i < cbgData.length; i++) {\n const datum = cbgData[i];\n this.dataUtil.setDataAnnotations(datum);\n\n sensorUsage += datum.sampleInterval;\n }\n\n const count = cbgData.length;\n const total = this.activeDays * MS_IN_DAY;\n\n const { newestDatum, oldestDatum } = this.getBgExtentsData();\n const sampleInterval = newestDatum?.sampleInterval || this.dataUtil.defaultCgmSampleInterval;\n if (newestDatum) this.dataUtil.normalizeDatumOut(newestDatum, ['msPer24', 'localDate']);\n if (oldestDatum) this.dataUtil.normalizeDatumOut(oldestDatum, ['msPer24', 'localDate']);\n\n let cgmMinutesWorn;\n\n if (cbgData.length < 2) {\n cgmMinutesWorn = cbgData.length === 1 ? sampleInterval : 0;\n } else {\n cgmMinutesWorn = Math.ceil(moment.utc(newestDatum?.time).diff(moment.utc(oldestDatum?.time), 'minutes', true));\n }\n\n const sensorUsageAGP = (\n count /\n ((cgmMinutesWorn / (sampleInterval / MS_IN_MIN)) + 1)\n ) * 100;\n\n return {\n sensorUsage,\n sensorUsageAGP,\n sampleInterval,\n count,\n total,\n };\n };\n\n getStandardDevData = () => {\n const { averageGlucose, bgData, total } = this.getAverageGlucoseData(true);\n\n if (bgData.length < 3) {\n return {\n averageGlucose,\n insufficientData: true,\n standardDeviation: NaN,\n total,\n };\n }\n\n const squaredDiffs = _.map(bgData, d => (d.value - averageGlucose) ** 2);\n const standardDeviation = Math.sqrt(_.sum(squaredDiffs) / (bgData.length - 1));\n\n return {\n averageGlucose,\n standardDeviation,\n total,\n };\n };\n\n getTimeInAutoData = () => {\n const rawBasalData = this.dataUtil.sort.byTime(this.dataUtil.filter.byType('basal').top(Infinity));\n const basalData = this.dataUtil.addBasalOverlappingStart(_.cloneDeep(rawBasalData));\n\n let durations = basalData.length\n ? _.transform(\n getBasalGroupDurationsFromEndpoints(basalData, this.endpoints),\n (result, value, key) => {\n result[key] = value;\n return result;\n },\n {}\n )\n : NaN;\n\n if (this.activeDays > 1 && !_.isNaN(durations)) {\n durations = this.getDailyAverageDurations(durations);\n }\n\n return durations;\n };\n\n getTimeInOverrideData = () => {\n const deviceEventData = _.cloneDeep(this.dataUtil.sort.byTime(this.dataUtil.filter.byType('deviceEvent').top(Infinity)));\n const rawPumpSettingsOverrideData = _.filter(deviceEventData, { subType: 'pumpSettingsOverride' });\n\n const pumpSettingsOverrideData = this.dataUtil\n .addPumpSettingsOverrideOverlappingStart(rawPumpSettingsOverrideData);\n\n let durations = pumpSettingsOverrideData.length\n ? _.transform(\n _.groupBy(pumpSettingsOverrideData, 'overrideType'),\n (result, data, key) => {\n const trimmedDurationData = _.map(data, datum => {\n const normalTime = _.max([this.endpoints[0], datum.normalTime]);\n const normalEnd = _.min([this.endpoints[1], (datum.normalEnd || this.dataUtil.latestDiabetesDatumEnd)]);\n const duration = normalEnd - normalTime;\n\n return {\n ...datum,\n normalTime,\n normalEnd,\n duration,\n };\n });\n\n result[key] = _.sumBy(trimmedDurationData, 'duration');\n return result;\n },\n {}\n )\n : NaN;\n\n if (this.activeDays > 1 && !_.isNaN(durations)) {\n durations.total = this.activeDays * MS_IN_DAY;\n durations = this.getDailyAverageDurations(durations);\n delete durations.total;\n }\n\n return durations;\n };\n\n getTimeInRangeData = () => {\n this.filterCBGDataByDefaultSampleInterval();\n const rawCbgData = this.dataUtil.filter.byType('cbg').top(Infinity);\n const cbgData = this.dataUtil.getDeduplicatedCBGData(rawCbgData);\n _.each(cbgData, d => this.dataUtil.normalizeDatumBgUnits(d));\n\n const initialValue = {\n durations: { low: 0, target: 0, high: 0, total: 0 },\n counts: { low: 0, target: 0, high: 0, total: 0 },\n };\n\n if (_.isNumber(this.bgBounds.veryLowThreshold)) {\n initialValue.durations.veryLow = 0;\n initialValue.counts.veryLow = 0;\n }\n\n if (_.isNumber(this.bgBounds.veryHighThreshold)) {\n initialValue.durations.veryHigh = 0;\n initialValue.counts.veryHigh = 0;\n }\n\n const timeInRangeData = _.reduce(\n cbgData,\n (result, datum) => {\n this.dataUtil.setDataAnnotations(datum);\n const classification = classifyBgValue(this.bgBounds, this.bgUnits, datum.value, 'fiveWay');\n const duration = datum.sampleInterval;\n result.durations[classification] += duration;\n result.durations.total += duration;\n result.counts[classification]++;\n result.counts.total++;\n return result;\n },\n initialValue\n );\n\n if (this.activeDays > 1) {\n timeInRangeData.durations = this.getDailyAverageDurations(timeInRangeData.durations);\n }\n\n return timeInRangeData;\n };\n\n getTotalInsulinData = () => {\n const { basal, bolus } = this.getBasalBolusData();\n\n const totalInsulin = _.reduce([basal, bolus], (result, value) => {\n const delivered = _.isNaN(value) ? 0 : value || 0;\n return result + delivered;\n }, 0);\n\n return {\n totalInsulin,\n };\n };\n}\n\nexport default StatUtil;\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\n\nimport { formatInsulin, precisionRound } from './format';\nimport { ONE_HR } from './datetime';\n\n/**\n* getBasalSequences\n* @param {Array} basals - Array of preprocessed Tidepool basal objects\n*\n* @return {Array} Array of Arrays where each component Array is a sequence of basals\n* of the same subType to be rendered as a unit\n*/\nexport function getBasalSequences(basals) {\n const basalSequences = [];\n let currentBasal = basals[0];\n let seq = [basals[0]];\n\n let idx = 1;\n while (idx <= basals.length - 1) {\n const nextBasal = basals[idx];\n const basalTypeChange = nextBasal.subType !== currentBasal.subType;\n\n if (basalTypeChange || currentBasal.discontinuousEnd || nextBasal.rate === 0) {\n basalSequences.push(seq);\n seq = [];\n }\n\n seq.push(nextBasal);\n currentBasal = nextBasal;\n ++idx;\n }\n basalSequences.push(seq);\n\n return basalSequences;\n}\n\n/**\n * getBasalPathGroupType\n * @param {Object} basal - single basal datum\n * @return {String} the path group type\n */\nexport function getBasalPathGroupType(datum = {}) {\n const deliveryType = _.get(datum, 'subType', datum.deliveryType);\n const suppressedDeliveryType = _.get(\n datum.suppressed,\n 'subType',\n _.get(datum.suppressed, 'deliveryType')\n );\n return _.includes([deliveryType, suppressedDeliveryType], 'automated') ? 'automated' : 'manual';\n}\n\n/**\n * getBasalPathGroups\n * @param {Array} basals - Array of preprocessed Tidepool basal objects\n * @return {Array} groups of alternating 'automated' and 'manual' datums\n */\nexport function getBasalPathGroups(basals) {\n const basalPathGroups = [];\n let currentPathType;\n _.each(basals, datum => {\n const pathType = getBasalPathGroupType(datum);\n if (pathType !== currentPathType) {\n currentPathType = pathType;\n basalPathGroups.push([]);\n }\n _.last(basalPathGroups).push(datum);\n });\n\n return basalPathGroups;\n}\n\n/**\n * Get the start and end indexes and datetimes of basal datums within a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {String} s ISO date string for the start of the range\n * @param {String} e ISO date string for the end of the range\n * @param {Boolean} optionalExtents If true, allow basal gaps at start and end extents of the range.\n * @returns {Object} The start and end datetimes and indexes\n */\nexport function getEndpoints(data, s, e, optionalExtents = false) {\n const start = new Date(s);\n const end = new Date(e);\n\n const startIndex = _.findIndex(\n data,\n segment => (optionalExtents || new Date(segment.normalTime).valueOf() <= start)\n && (start <= new Date(segment.normalEnd).valueOf())\n );\n\n const endIndex = _.findLastIndex(\n data,\n segment => (new Date(segment.normalTime).valueOf() <= end)\n && (optionalExtents || end <= new Date(segment.normalEnd).valueOf())\n );\n\n return {\n start: {\n datetime: start.toISOString(),\n index: startIndex,\n },\n end: {\n datetime: end.toISOString(),\n index: endIndex,\n },\n };\n}\n\n/**\n * Get durations of basal groups within a given span of time\n * @param {Array} data Array of Tidepool basal data\n * @param {String} s ISO date string for the start of the range\n * @param {String} e ISO date string for the end of the range\n * @returns {Object} The durations (in ms) keyed by basal group type\n */\nexport function getGroupDurations(data, s, e) {\n const endpoints = getEndpoints(data, s, e, true);\n\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n if ((endpoints.start.index >= 0) && (endpoints.end.index >= 0)) {\n const start = new Date(endpoints.start.datetime);\n const end = new Date(endpoints.end.datetime);\n\n // handle first segment, which may have started before the start endpoint\n let segment = data[endpoints.start.index];\n const initialSegmentDuration = _.min([new Date(segment.normalEnd) - start, segment.duration]);\n durations[getBasalPathGroupType(segment)] = initialSegmentDuration;\n\n // add the durations of all subsequent basals, minus the last\n let i = endpoints.start.index + 1;\n while (i < endpoints.end.index) {\n segment = data[i];\n durations[getBasalPathGroupType(segment)] += segment.duration;\n i++;\n }\n\n // handle last segment, which may go past the end endpoint\n segment = data[endpoints.end.index];\n durations[getBasalPathGroupType(segment)] += _.min([\n end - new Date(segment.normalTime),\n segment.duration,\n ]);\n }\n\n return durations;\n}\n\n/**\n * Calculate the total insulin dose delivered in a given basal segment\n * @param {Number} duration Duration of segment in milliseconds\n * @param {Number} rate Basal rate of segment\n */\nexport function getSegmentDose(duration, rate) {\n const hours = duration / ONE_HR;\n return parseFloat(precisionRound(hours * rate, 3));\n}\n\n/**\n * Get the duration of a basal datum within a given time range\n * @param {Object} datum A single basal datum\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @returns {Number} Duration of the basal datum falling within the range in milliseconds\n */\nexport function getBasalDurationWithinRange(datum, endpoints) {\n const rangeStart = new Date(endpoints[0]).valueOf();\n const rangeEnd = new Date(endpoints[1]).valueOf();\n const datumStart = new Date(datum.normalTime).valueOf();\n const datumEnd = new Date(datum.normalEnd).valueOf();\n\n const datumStartIsWithinRange = rangeStart <= datumStart && datumStart < rangeEnd;\n const datumEndIsWithinRange = rangeStart < datumEnd && datumEnd <= rangeEnd;\n const datumEncompassesRange = rangeStart >= datumStart && datumEnd >= rangeEnd;\n\n const trimmedStart = _.max([rangeStart, datumStart]);\n const trimmedEnd = _.min([rangeEnd, datumEnd]);\n\n if (datumStartIsWithinRange || datumEndIsWithinRange || datumEncompassesRange) {\n return trimmedEnd - trimmedStart;\n }\n\n return 0;\n}\n\n/**\n * Get total basal delivered for a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @return {Number} Formatted total insulin dose\n */\nexport function getTotalBasalFromEndpoints(data, endpoints) {\n let dose = 0;\n\n _.each(data, datum => {\n dose += getSegmentDose(getBasalDurationWithinRange(datum, endpoints), datum.rate);\n });\n\n return formatInsulin(dose);\n}\n\n/**\n * Get automated and manual basal delivery time for a given time range\n * @param {Array} data Array of Tidepool basal data\n * @param {[]String} enpoints ISO date strings for the start, end of the range, in that order\n * @return {Number} Formatted total insulin dose\n */\nexport function getBasalGroupDurationsFromEndpoints(data, endpoints) {\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n _.each(data, datum => {\n durations[getBasalPathGroupType(datum)] += getBasalDurationWithinRange(datum, endpoints);\n });\n\n return durations;\n}\n\nexport const countAutomatedBasalEvents = (data) => {\n const returnData = _.cloneDeep(data);\n\n // Get the path groups, and remove the first group, as we only want to\n // track changes into and out of automated delivery\n const basalPathGroups = getBasalPathGroups(returnData.data);\n basalPathGroups.shift();\n\n const events = {\n automatedStop: 0,\n };\n\n _.reduce(basalPathGroups, (acc, group) => {\n const subType = _.get(group[0], 'subType', group[0].deliveryType);\n const event = subType === 'automated' ? 'automatedStart' : 'automatedStop';\n // For now, we're only tracking `automatedStop` events\n if (event === 'automatedStop') {\n acc[event]++;\n }\n return acc;\n }, events);\n\n _.assign(returnData.subtotals, events);\n returnData.total += events.automatedStop;\n\n return returnData;\n};\n\nexport const countDistinctSuspends = (data) => {\n const returnData = _.cloneDeep(data);\n\n const suspends = _.filter(returnData.data, d => d.deliveryType === 'suspend');\n\n const result = {\n prev: {},\n distinct: 0,\n skipped: 0,\n };\n\n _.reduce(suspends, (acc, datum) => {\n // We only want to track non-contiguous suspends as distinct\n if (_.get(acc.prev, 'normalEnd') === datum.normalTime) {\n acc.skipped++;\n } else {\n acc.distinct++;\n }\n acc.prev = datum;\n return acc;\n }, result);\n\n returnData.subtotals.suspend = result.distinct;\n returnData.total -= result.skipped;\n\n return returnData;\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport { max, mean, median, min, quantile, range } from 'd3-array';\n\nimport { BG_DISPLAY_MINIMUM_INCREMENTS, DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MGDL_UNITS, MMOLL_UNITS, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { bankersRound, formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Number} bgValue - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {String} classificationType - 'threeWay' or 'fiveWay'\n *\n * @return {String} bgClassification - low, target, high\n */\nexport function classifyBgValue(bgBounds, bgUnits, bgValue, classificationType = 'threeWay') {\n if (_.isEmpty(bgBounds) ||\n !_.isNumber(_.get(bgBounds, 'targetLowerBound')) ||\n !_.isNumber(_.get(bgBounds, 'targetUpperBound'))) {\n throw new Error(\n 'You must provide a `bgBounds` object with a `targetLowerBound` and a `targetUpperBound`!'\n );\n }\n if (!_.isNumber(bgValue) || !_.gt(bgValue, 0)) {\n throw new Error('You must provide a positive, numerical blood glucose value to categorize!');\n }\n if (!_.includes([MMOLL_UNITS, MGDL_UNITS], bgUnits)) {\n throw new Error('Must provide a valid blood glucose unit of measure!');\n }\n\n const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n\n const precision = bgUnits === MMOLL_UNITS ? 1 : 0;\n const roundedValue = bankersRound(bgValue, precision);\n\n // fiveWay\n if (classificationType === 'fiveWay') {\n if (_.isNumber(veryLowThreshold) && roundedValue < veryLowThreshold) {\n return 'veryLow';\n } else if (_.isNumber(veryHighThreshold) && roundedValue > veryHighThreshold) {\n return 'veryHigh';\n } else if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n\n return 'target';\n }\n\n // threeWay\n if (roundedValue < targetLowerBound) {\n return 'low';\n } else if (roundedValue > targetUpperBound) {\n return 'high';\n }\n return 'target';\n}\n\n/**\n * classifyCvValue\n * @param {number} value - integer or float coefficient of variation (CV) value\n * @return {String} cvClassification - target, high\n */\nexport function classifyCvValue(value) {\n if (value <= 36) {\n return 'target';\n } else {\n return 'high';\n }\n}\n\n/**\n * convertToMmolL\n * @param {Number} bgVal - blood glucose value in mg/dL\n *\n * @return {Number} convertedBgVal - blood glucose value in mmol/L, unrounded\n */\nexport function convertToMmolL(val) {\n return (val / MGDL_PER_MMOLL);\n}\n\n/**\n * convertToMGDL\n * @param {Number} bgVal - blood glucose value in mmol/L\n *\n * @return {Number} convertedBgVal - blood glucose value in mg/dL, unrounded\n */\nexport function convertToMGDL(val) {\n return (val * MGDL_PER_MMOLL);\n}\n\n/**\n * reshapeBgClassesToBgBounds\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {Object} bgBounds - @tidepool/viz-style bgBounds\n */\nexport function reshapeBgClassesToBgBounds(bgPrefs) {\n const { bgClasses, bgUnits } = bgPrefs;\n\n const bgBounds = {\n veryHighThreshold: _.get(bgClasses, 'high.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryHighThreshold),\n targetUpperBound: _.get(bgClasses, 'target.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound),\n targetLowerBound: _.get(bgClasses, 'low.boundary', DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound),\n veryLowThreshold: _.get(bgClasses, 'very-low.boundary', DEFAULT_BG_BOUNDS[bgUnits].veryLowThreshold),\n extremeHighThreshold: DEFAULT_BG_BOUNDS[bgUnits].extremeHighThreshold,\n clampThreshold: DEFAULT_BG_BOUNDS[bgUnits].clampThreshold,\n };\n\n return bgBounds;\n}\n\n/**\n * Generate BG Range Labels for a given set of bg prefs\n *\n * @export\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n * @returns {Object} bgRangeLabels - map of labels keyed by bgClassification\n */\nexport function generateBgRangeLabels(bgPrefs, opts = {}) {\n const { bgBounds, bgUnits } = bgPrefs;\n const minimumIncrement = BG_DISPLAY_MINIMUM_INCREMENTS[bgUnits];\n\n const thresholds = _.mapValues(\n bgBounds,\n threshold => (_.isNumber(threshold) ? formatBgValue(threshold, bgPrefs) : null)\n );\n\n thresholds.highLowerBound = formatBgValue(bgBounds.targetUpperBound + minimumIncrement, bgPrefs);\n thresholds.lowUpperBound = formatBgValue(bgBounds.targetLowerBound - minimumIncrement, bgPrefs);\n\n const {\n veryLowThreshold,\n lowUpperBound,\n targetLowerBound,\n targetUpperBound,\n highLowerBound,\n veryHighThreshold,\n extremeHighThreshold,\n } = thresholds;\n\n if (opts.condensed) {\n return {\n veryLow: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n low: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n anyLow: `<${targetLowerBound}`,\n target: `${targetLowerBound}-${targetUpperBound}`,\n high: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n anyHigh: `>${targetUpperBound}`,\n veryHigh: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n extremeHigh: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n suffix: bgUnits,\n value: !!veryLowThreshold ? `<${veryLowThreshold}` : null,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryLowThreshold ? `${veryLowThreshold}-${lowUpperBound}` : `<${targetLowerBound}`,\n },\n anyLow: {\n suffix: bgUnits,\n value: `<${targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${targetLowerBound}-${targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: !!veryHighThreshold ? `${highLowerBound}-${veryHighThreshold}` : `>${targetUpperBound}`,\n },\n anyHigh: {\n suffix: bgUnits,\n value: `>${targetUpperBound}`,\n },\n veryHigh: {\n suffix: bgUnits,\n value: !!veryHighThreshold ? `>${veryHighThreshold}` : null,\n },\n extremeHigh: {\n suffix: bgUnits,\n value: !!extremeHighThreshold ? `>${extremeHighThreshold}` : null,\n },\n };\n }\n\n return {\n veryLow: !!veryLowThreshold ? `below ${veryLowThreshold} ${bgUnits}` : null,\n low: !!veryLowThreshold ? `between ${veryLowThreshold} - ${lowUpperBound} ${bgUnits}` : `below ${targetLowerBound} ${bgUnits}`,\n anyLow: `below ${targetLowerBound} ${bgUnits}`,\n target: `between ${targetLowerBound} - ${targetUpperBound} ${bgUnits}`,\n high: !!veryHighThreshold ? `between ${highLowerBound} - ${veryHighThreshold} ${bgUnits}` : `above ${targetUpperBound} ${bgUnits}`,\n anyHigh: `above ${targetUpperBound} ${bgUnits}`,\n veryHigh: !!veryHighThreshold ? `above ${veryHighThreshold} ${bgUnits}` : null,\n extremeHigh: !!extremeHighThreshold ? `above ${extremeHighThreshold} ${bgUnits}` : null,\n };\n}\n\n/**\n * getOutOfRangeThreshold\n * @param {Object} bgDatum\n * @return Object containing out of range threshold or null\n */\nexport function getOutOfRangeThreshold(bgDatum) {\n const outOfRangeAnnotation = _.find(\n bgDatum.annotations || [], (annotation) => (annotation.code === 'bg/out-of-range')\n );\n return outOfRangeAnnotation ?\n { [outOfRangeAnnotation.value]: outOfRangeAnnotation.threshold } : null;\n}\n\n/**\n * Get the adjusted count of expected CGM data points for devices that do not sample at the default\n * 5 minute interval, such as the Abbot FreeStyle Libre, which samples every 15 mins\n *\n * @param {Array} data - cgm data\n * @return {Integer} count - the weighted count\n */\nexport function weightedCGMCount(data) {\n return _.reduce(data, (total, datum) => {\n const sampleInterval = _.get(datum, 'sampleInterval', 5 * MS_IN_MIN);\n const sampleIntervalInMinutes = sampleInterval / MS_IN_MIN;\n const datumWeight = sampleIntervalInMinutes / 5; // Default weight is 1, for 5 minute samples\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Determine if a patient is using a custom target bg range\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds and the bgUnits\n */\nexport function isCustomBgRange(bgPrefs) {\n const { bgBounds, bgUnits } = bgPrefs;\n return bgBounds.targetUpperBound !== DEFAULT_BG_BOUNDS[bgUnits].targetUpperBound\n || bgBounds.targetLowerBound !== DEFAULT_BG_BOUNDS[bgUnits].targetLowerBound;\n}\n\n/**\n * determineRangeBoundaries\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} highAndLowThresholds - Object with high and low keys\n */\nexport function determineRangeBoundaries(outOfRange) {\n const lowThresholds = _.filter(outOfRange, { value: 'low' });\n const highThresholds = _.filter(outOfRange, { value: 'high' });\n const boundaries = {};\n if (!_.isEmpty(lowThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= higher) threshold for lows\n boundaries.low = max(lowThresholds, (d) => (d.threshold));\n }\n if (!_.isEmpty(highThresholds)) {\n // if there is data from multiple devices present with different thresholds\n // we want to use the more conservative (= lower) threshold for highs\n boundaries.high = min(highThresholds, (d) => (d.threshold));\n }\n return boundaries;\n}\n\n/**\n * findBinForTimeOfDay\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Number} msPer24 - natural number milliseconds into a twenty-four hour day\n *\n * @return {Number} bin\n */\nexport function findBinForTimeOfDay(binSize, msPer24) {\n if (msPer24 < 0 || msPer24 >= TWENTY_FOUR_HRS) {\n throw new Error('`msPer24` < 0 or >= 86400000 is invalid!');\n }\n\n return Math.floor(msPer24 / binSize) * binSize + (binSize / 2);\n}\n\n/**\n * findOutOfRangeAnnotations\n * @param {Array} data - Array of `cbg` or `smbg` events\n *\n * @return {Array} thresholds - Array of objects with unique `threshold`\n * (and `value` of 'low' or 'high')\n */\nexport function findOutOfRangeAnnotations(data) {\n const isOutOfRangeAnnotation = (annotation) => (annotation.code === 'bg/out-of-range');\n const eventsAnnotatedAsOutOfRange = _.filter(\n data,\n (d) => (_.some(d.annotations || [], isOutOfRangeAnnotation))\n );\n const annotations = _.map(eventsAnnotatedAsOutOfRange, (d) => (_.pick(\n _.find(d.annotations || [], isOutOfRangeAnnotation),\n ['threshold', 'value']\n )));\n // the numerical `threshold` is our determiner of uniqueness\n return _.uniqBy(annotations, (d) => (d.threshold));\n}\n\n/**\n * calculateCbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of cbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n *\n * @return {Object} calculatedCbgStats\n */\nexport function calculateCbgStatsForBin(binKey, binSize, data, outOfRange, outerQuantiles = []) {\n const [\n lowerQuantile = 0.1,\n upperQuantile = 0.9,\n ] = outerQuantiles;\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n lowerQuantile: quantile(sorted, lowerQuantile),\n firstQuartile: quantile(sorted, 0.25),\n median: median(sorted),\n thirdQuartile: quantile(sorted, 0.75),\n upperQuantile: quantile(sorted, upperQuantile),\n max: max(sorted),\n msX: centerOfBinMs,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * calculateSmbgStatsForBin\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outOfRange - Array of out-of-range objects w/threshold and value\n *\n * @return {Object} calculatedSmbgStats\n */\nexport function calculateSmbgStatsForBin(binKey, binSize, data, outOfRange) {\n const minDatums = {\n quantile: 5,\n median: 3,\n };\n\n const sorted = _.sortBy(data, d => d);\n const centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(sorted),\n mean: mean(sorted),\n max: max(sorted),\n msX: centerOfBinMs,\n firstQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.25) : undefined,\n median: data.length >= minDatums.median ? median(sorted) : undefined,\n thirdQuartile: data.length >= minDatums.quantile ? quantile(sorted, 0.75) : undefined,\n msFrom: centerOfBinMs - (binSize / 2),\n msTo: centerOfBinMs + (binSize / 2),\n };\n if (!_.isEmpty(outOfRange)) {\n const thresholds = determineRangeBoundaries(outOfRange);\n stats.outOfRangeThresholds = thresholds;\n }\n return stats;\n}\n\n/**\n * mungeBGDataBins\n * @param {String} bgType - String - one of [smbg|cbg]\n * @param {String} binKey - String of natural number milliseconds bin\n * @param {Number} binSize - natural number duration in milliseconds\n * @param {Array} data - Array of smbg values in mg/dL or mmol/L\n * @param {Array} outerQuantiles - Array of values to use for lower and upper quantiles\n * @returns munged bg bin data\n */\nexport function mungeBGDataBins(bgType, binSize, data, outerQuantiles) {\n const binned = _.groupBy(data, (d) => (findBinForTimeOfDay(binSize, d.msPer24)));\n const outOfRanges = findOutOfRangeAnnotations(data);\n // we need *all* possible keys for TransitionMotion to work on enter/exit\n // and the range starts with binSize/2 because the keys are centered in each bin\n const binKeys = _.map(range(binSize / 2, TWENTY_FOUR_HRS, binSize), (d) => String(d));\n\n const binCalculator = bgType === 'smbg' ? calculateSmbgStatsForBin : calculateCbgStatsForBin;\n const valueExtractor = (d) => (d.value);\n const mungedData = [];\n for (let i = 0; i < binKeys.length; ++i) {\n const values = _.map(_.get(binned, binKeys[i], []), valueExtractor);\n mungedData.push(binCalculator(binKeys[i], binSize, values, outOfRanges, outerQuantiles));\n }\n return mungedData;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2017, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/* the logic here (and the tests) are a port of tideline's\n js/plot/util/commonbolus.js */\n\nimport _ from 'lodash';\n\nimport { formatDecimalNumber, formatPercentage } from './format';\n\n/**\n * fixFloatingPoint\n * @param {Number} numeric value\n *\n * @return {Number} numeric value rounded to 3 decimal places\n */\nfunction fixFloatingPoint(n) {\n return parseFloat(formatDecimalNumber(n, 3));\n}\n\n/**\n * getBolusFromInsulinEvent\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Object} a Tidepool bolus object\n */\nexport function getBolusFromInsulinEvent(insulinEvent) {\n let bolus = insulinEvent;\n if (insulinEvent.bolus) {\n bolus = insulinEvent.bolus;\n }\n return bolus;\n}\n\n/**\n * getWizardFromInsulinEvent\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Object} a Tidepool wizard object\n */\nexport function getWizardFromInsulinEvent(insulinEvent) {\n let wizard = insulinEvent;\n if (insulinEvent.wizard) {\n wizard = insulinEvent.wizard;\n }\n return wizard;\n}\n\n/**\n * getCarbs\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Number} grams of carbs input into bolus calculator\n * NaN if bolus calculator not used; null if no carbInput\n */\nexport function getCarbs(insulinEvent) {\n if (insulinEvent.type !== 'wizard' && !insulinEvent.wizard && !insulinEvent.dosingDecision) {\n return NaN;\n }\n return _.get(getWizardFromInsulinEvent(insulinEvent), 'carbInput', null);\n}\n\n/**\n * getProgrammed\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} value of insulin programmed for delivery in the given insulinEvent\n */\nexport function getProgrammed(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!_.inRange(bolus.normal, Infinity) && !_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n }\n if (bolus.extended != null && bolus.expectedExtended != null) {\n if (bolus.normal != null) {\n if (bolus.expectedNormal != null) {\n return fixFloatingPoint(bolus.expectedNormal + bolus.expectedExtended);\n }\n return fixFloatingPoint(bolus.normal + bolus.expectedExtended);\n }\n return bolus.expectedExtended;\n } else if (bolus.extended != null) {\n if (bolus.normal != null) {\n if (bolus.expectedNormal != null) {\n // this situation should not exist!\n throw new Error(\n 'Combo bolus found with a cancelled `normal` portion and non-cancelled `extended`!'\n );\n }\n return fixFloatingPoint(bolus.normal + bolus.extended);\n }\n return bolus.extended;\n }\n return bolus.expectedNormal || bolus.normal;\n}\n\n/**\n * getRecommended\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} total recommended insulin dose\n */\nexport function getRecommended(insulinEvent) {\n let event = insulinEvent;\n\n if (_.get(insulinEvent, 'type') === 'bolus') {\n event = event.dosingDecision || getWizardFromInsulinEvent(insulinEvent);\n }\n\n // a simple manual/\"quick\" bolus won't have a `recommended` field\n if (!event.recommendedBolus && !event.recommended) {\n return NaN;\n }\n\n const netRecommendation = event.recommendedBolus\n ? _.get(event, ['recommendedBolus', 'amount'], null)\n : _.get(event, ['recommended', 'net'], null);\n\n if (netRecommendation !== null) {\n return netRecommendation;\n }\n\n let rec = 0;\n rec += _.get(event, ['recommended', 'carb'], 0);\n rec += _.get(event, ['recommended', 'correction'], 0);\n\n return fixFloatingPoint(rec);\n}\n\n/**\n * getDelivered\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} units of insulin delivered in this insulinEvent\n */\nexport function getDelivered(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!_.inRange(bolus.normal, Infinity) && !_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n }\n if (bolus.extended != null) {\n if (bolus.normal != null) {\n return fixFloatingPoint(bolus.extended + bolus.normal);\n }\n return bolus.extended;\n }\n return bolus.normal;\n}\n\n/**\n * getDuration\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} duration value in milliseconds\n */\nexport function getDuration(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n // don't want truthiness here because want to return duration\n // from a bolus interrupted immediately (duration = 0)\n if (!_.inRange(bolus.duration, Infinity)) {\n return NaN;\n }\n return bolus.duration;\n}\n\n/**\n * getExtended\n * @param {Object} insulinEvent - a Tidepool wizard or bolus object\n *\n * @return {Number} units of insulin delivered over an extended duration\n */\nexport function getExtended(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n // don't want truthiness here because want to return expectedExtended\n // from a bolus interrupted immediately (extended = 0)\n if (!_.inRange(bolus.extended, Infinity)) {\n return NaN;\n }\n\n return bolus.extended;\n}\n\n/**\n * getExtendedPercentage\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {String} percentage of combo bolus delivered later\n */\nexport function getExtendedPercentage(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n if (!bolus.normal || !(bolus.extended || bolus.expectedExtended)) {\n return NaN;\n }\n const extended = bolus.expectedExtended || bolus.extended;\n const programmed = getProgrammed(bolus);\n return formatPercentage(extended / programmed);\n}\n\n/**\n * getMaxDuration\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} duration value in milliseconds\n */\nexport function getMaxDuration(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n // don't want truthiness here because want to return expectedDuration\n // from a bolus interrupted immediately (duration = 0)\n if (!_.inRange(bolus.duration, Infinity)) {\n return NaN;\n }\n return bolus.expectedDuration || bolus.duration;\n}\n\n/**\n * getMaxValue\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Number} max programmed or recommended value wrt the insulinEvent\n */\nexport function getMaxValue(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n if (!bolus.normal && !bolus.extended) {\n return NaN;\n }\n }\n const programmed = getProgrammed(bolus);\n const recommended = getRecommended(insulinEvent) || 0;\n return (recommended > programmed) ? recommended : programmed;\n}\n\n/**\n * getNormalPercentage\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {String} percentage of combo bolus delivered immediately\n */\nexport function getNormalPercentage(insulinEvent) {\n let bolus = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'wizard') {\n bolus = getBolusFromInsulinEvent(insulinEvent);\n }\n if (!(bolus.normal || bolus.expectedNormal) || !(bolus.extended || bolus.expectedExtended)) {\n return NaN;\n }\n const normal = bolus.expectedNormal || bolus.normal;\n const programmed = getProgrammed(bolus);\n return formatPercentage(normal / programmed);\n}\n\n/**\n * getTotalBolus\n * @param {Array} insulinEvents - Array of Tidepool bolus or wizard objects\n *\n * @return {Number} total bolus insulin in units\n */\nexport function getTotalBolus(insulinEvents) {\n return _.reduce(insulinEvents, (result, insulinEvent) => (\n result + getDelivered(insulinEvent)\n ), 0);\n}\n\n/**\n * hasExtended\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus has an extended delivery portion\n */\nexport function hasExtended(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n // NB: intentionally invoking truthiness here\n // a bolus with `extended` value 0 and `expectedExtended` value 0 is pointless to render\n return Boolean(bolus.extended || bolus.expectedExtended) || false;\n}\n\n/**\n * isInterruptedBolus\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus was interrupted or not\n */\nexport function isInterruptedBolus(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n\n const cancelledDuringNormal = (\n _.isFinite(bolus.normal) &&\n _.isFinite(bolus.expectedNormal) &&\n bolus.normal < bolus.expectedNormal\n );\n\n const cancelledDuringExtended = (\n _.isFinite(bolus.extended) &&\n _.isFinite(bolus.expectedExtended) &&\n bolus.extended < bolus.expectedExtended\n );\n\n if (_.inRange(bolus.normal, Infinity)) {\n if (!_.isFinite(bolus.extended)) {\n return cancelledDuringNormal;\n }\n return cancelledDuringNormal || cancelledDuringExtended;\n }\n return cancelledDuringExtended;\n}\n\n/**\n * isOverride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} Whether the programmed amount is both significantly different (beyond 2 decimal places) from and larger than the recommended amount.\n */\nexport function isOverride(insulinEvent) {\n const MINIMUM_THRESHOLD = 0.01;\n const amountRecommended = getRecommended(insulinEvent.wizard || insulinEvent.dosingDecision || insulinEvent);\n const amountProgrammed = getProgrammed(insulinEvent);\n\n return (amountProgrammed - amountRecommended) >= MINIMUM_THRESHOLD;\n}\n\n/**\n * isUnderride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} Whether the programmed amount is both significantly different (beyond 2 decimal places) from and smaller than the recommended amount.\n */\nexport function isUnderride(insulinEvent) {\n const MINIMUM_THRESHOLD = 0.01;\n const amountRecommended = getRecommended(insulinEvent.wizard || insulinEvent.dosingDecision || insulinEvent);\n const amountProgrammed = getProgrammed(insulinEvent);\n\n return (amountRecommended - amountProgrammed) >= MINIMUM_THRESHOLD;\n}\n\n/**\n * isCorrection\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus programmed a recommended bg correction without carb entry\n */\nexport function isCorrection(insulinEvent) {\n const recommended = insulinEvent.dosingDecision\n ? {\n correction: _.get(insulinEvent, 'dosingDecision.recommendedBolus.amount'),\n carb: _.get(insulinEvent, 'dosingDecision.food.nutrition.carbohydrate.net', 0),\n }\n : _.get(insulinEvent, 'wizard.recommended', insulinEvent.recommended);\n return !!(recommended && recommended.correction > 0 && recommended.carb === 0);\n}\n\n/**\n * isAutomated\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus was automated\n */\nexport function isAutomated(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n return _.get(bolus, 'subType') === 'automated';\n}\n\n/**\n * isOneButton\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus has a one-button delivery context\n */\nexport function isOneButton(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n return _.get(bolus, 'deliveryContext') === 'oneButton' || _.get(bolus, 'dosingDecision.reason') === 'oneButtonBolus';\n}\n\n/**\n * getAnnoations\n * @param {Object} insulinEvent - a Tidebool bolus or wizard object\n *\n * @returns {Array} array of annotations for the bolus or an empty array\n */\nexport function getAnnotations(insulinEvent) {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n const annotations = _.get(bolus, 'annotations', []);\n return annotations;\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const BG_HIGH = t('High');\nexport const BG_LOW = t('Low');\n\nconst STIFFNESS = 180;\nconst DAMPING = 40;\nconst PRECISION = 0.1;\n\nexport const springConfig = { stiffness: STIFFNESS, damping: DAMPING, precision: PRECISION };\n\nexport const MGDL_CLAMP_TOP = 400;\nexport const MMOLL_CLAMP_TOP = 22.5;\n\nexport const MGDL_UNITS = t('mg/dL');\nexport const MMOLL_UNITS = t('mmol/L');\nexport const MGDL_PER_MMOLL = 18.01559;\n\nexport const BG_DISPLAY_MINIMUM_INCREMENTS = {\n [MGDL_UNITS]: 1,\n [MMOLL_UNITS]: 0.1,\n};\n\nexport const GLYCEMIC_RANGES_PRESET = {\n ADA_STANDARD: 'adaStandard',\n ADA_OLDER_HIGH_RISK: 'adaHighRisk',\n ADA_PREGNANCY_T1: 'adaPregnancyType1',\n ADA_GESTATIONAL_T2: 'adaPregnancyType2',\n};\n\nexport const GLYCEMIC_RANGES_TYPE = {\n PRESET: 'preset',\n CUSTOM: 'custom',\n};\n\nexport const DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: 350,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: 19.4,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_STANDARD_BG_BOUNDS = DEFAULT_BG_BOUNDS;\n\nexport const ADA_OLDER_HIGH_RISK_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: null,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_PREGNANCY_T1_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 63,\n targetUpperBound: 140,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.5,\n targetUpperBound: 7.8,\n veryHighThreshold: null,\n extremeHighThreshold: null,\n clampThreshold: 33.3,\n },\n};\n\nexport const ADA_GESTATIONAL_T2_BG_BOUNDS = ADA_PREGNANCY_T1_BG_BOUNDS;\n\nexport const LBS_PER_KG = 2.2046226218;\n\nconst ONE_WEEK = 7;\nconst TWO_WEEKS = 14;\nconst FOUR_WEEKS = 28;\n\nexport const trends = { extentSizes: { ONE_WEEK, TWO_WEEKS, FOUR_WEEKS } };\n\nexport const MS_IN_DAY = 864e5;\nexport const MS_IN_HOUR = 864e5 / 24;\nexport const MS_IN_MIN = MS_IN_HOUR / 60;\n\nexport const CGM_READINGS_ONE_DAY = 288;\nexport const CGM_DATA_KEY = 'cbg';\nexport const BGM_DATA_KEY = 'smbg';\n\nexport const NO_SITE_CHANGE = 'noSiteChange';\nexport const SITE_CHANGE = 'siteChange';\nexport const SITE_CHANGE_RESERVOIR = 'reservoirChange';\nexport const SITE_CHANGE_TUBING = 'tubingPrime';\nexport const SITE_CHANGE_CANNULA = 'cannulaPrime';\n\nexport const ALARM = 'alarm';\nexport const ALARM_NO_DELIVERY = 'no_delivery';\nexport const ALARM_AUTO_OFF = 'auto_off';\nexport const ALARM_NO_INSULIN = 'no_insulin';\nexport const ALARM_NO_POWER = 'no_power';\nexport const ALARM_OCCLUSION = 'occlusion';\nexport const ALARM_OVER_LIMIT = 'over_limit';\n\nexport const EVENT = 'event';\nexport const EVENT_PUMP_SHUTDOWN = 'pump_shutdown';\n\nexport const AUTOMATED_BOLUS = 'automatedBolus';\nexport const AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const AUTOMATED_MODE_EXITED = 'automatedModeExited';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const PREPRANDIAL = 'preprandial';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\nexport const ONE_BUTTON_BOLUS = 'oneButtonBolus';\nexport const INSULIN_DURATION = 'insulinDuration';\n\nexport const SITE_CHANGE_TYPE_UNDECLARED = 'undeclared';\n\nexport const INSULET = 'Insulet';\nexport const TANDEM = 'Tandem';\nexport const ANIMAS = 'Animas';\nexport const TIDEPOOL_LOOP = 'Tidepool Loop';\nexport const DIY_LOOP = 'DIY Loop';\nexport const TWIIST_LOOP = 'twiist';\nexport const MEDTRONIC = 'Medtronic';\nexport const MICROTECH = 'Microtech';\n\nexport const pumpVocabulary = {\n [ANIMAS]: {\n [SITE_CHANGE_RESERVOIR]: t('Go Rewind'),\n [SITE_CHANGE_TUBING]: t('Go Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Pod Change'),\n [SITE_CHANGE_TUBING]: t('Pod Activate'),\n [SITE_CHANGE_CANNULA]: t('Prime'),\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Max Basal Rate'),\n [INSULIN_DURATION]: t('Duration of Insulin Action'),\n },\n [MEDTRONIC]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n [AUTOMATED_DELIVERY]: t('Auto Mode'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Active Insulin Time'),\n },\n [MICROTECH]: {\n [SITE_CHANGE_RESERVOIR]: t('Rewind'),\n [SITE_CHANGE_TUBING]: t('Reservoir Prime'),\n [SITE_CHANGE_CANNULA]: t('Cannula Prime'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Activity'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [MAX_BOLUS]: t('Max Bolus'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n [TIDEPOOL_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n [TWIIST_LOOP]: {\n [SITE_CHANGE_RESERVOIR]: t('Cassette Change'),\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n [ALARM_NO_INSULIN]: t('Cassette Empty'),\n [ALARM_OCCLUSION]: t('Line Blocked'),\n },\n [DIY_LOOP]: {\n [AUTOMATED_DELIVERY]: t('Automation'),\n [AUTOMATED_MODE_EXITED]: t('Off'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Preset'),\n [PHYSICAL_ACTIVITY]: { label: t('Workout'), marker: t('W') },\n [MAX_BOLUS]: t('Maximum Bolus'),\n [MAX_BASAL]: t('Maximum Basal Rate'),\n },\n default: {\n [SITE_CHANGE_RESERVOIR]: t('Cartridge Change'),\n [SITE_CHANGE_TUBING]: t('Tubing Fill'),\n [SITE_CHANGE_CANNULA]: t('Cannula Fill'),\n [AUTOMATED_BOLUS]: t('Automated'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\n [AUTOMATED_MODE_EXITED]: t('Exited'),\n [SCHEDULED_DELIVERY]: t('Manual'),\n [SETTINGS_OVERRIDE]: t('Settings Override'),\n [SLEEP]: { label: t('Sleep'), marker: t('Z') },\n [PHYSICAL_ACTIVITY]: { label: t('Exercise'), marker: t('E') },\n [PREPRANDIAL]: { label: t('Premeal'), marker: t('P') },\n [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n [ONE_BUTTON_BOLUS]: t('One-Button Bolus'),\n [ALARM_NO_DELIVERY]: t('Insulin Delivery Stopped'),\n [ALARM_AUTO_OFF]: t('Pump Auto-Off'),\n [ALARM_NO_INSULIN]: t('Reservoir Empty'),\n [ALARM_NO_POWER]: t('Battery Empty'),\n [ALARM_OCCLUSION]: t('Occlusion Detected'),\n [ALARM_OVER_LIMIT]: t('Insulin Delivery Limit Exceeded'),\n [EVENT_PUMP_SHUTDOWN]: t('Pump Shutdown'),\n },\n};\n\nexport const settingsOverrides = {\n [TANDEM]: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n ],\n [TIDEPOOL_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [TWIIST_LOOP]: [\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n [DIY_LOOP]: [\n PREPRANDIAL,\n ],\n default: [\n SLEEP,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n ],\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\nexport const BG_DATA_TYPES = [\n 'cbg',\n 'smbg',\n];\n\nexport const DIABETES_DATA_TYPES = [\n ...BG_DATA_TYPES,\n 'basal',\n 'bolus',\n 'wizard',\n 'food',\n];\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/datetime.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n *\n * 2. Function naming scheme: the two main verbs here are `get` and `format`.\n * 2a. If the function returns any kind of datetime (JavaScript Date, hammertime, ISO 8601 String),\n * then the function name should start with `get`.\n * 2b. If the function returns a _formatted_ String that will be **surfaced to the end user**,\n * then the function name should start with `format`.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz, unless ESLint\n * complains about an undefined (e.g., getTimezoneFromTimePrefs must be at the top).\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `timePrefs`) rather than a named timezone\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\n// using d3-time-format because time is time of data access in\n// user’s browser time, not PwD’s configured timezone\nimport { utcFormat, timeFormat } from 'd3-time-format';\nimport moment from 'moment-timezone';\nimport sundial from 'sundial';\nimport i18next from 'i18next';\n\nconst t = i18next.t.bind(i18next);\n\nexport const THIRTY_MINS = 1800000;\nexport const ONE_HR = 3600000;\nexport const THREE_HRS = 10800000;\nexport const TWENTY_FOUR_HRS = 86400000;\n\n/**\n * getMsPer24\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n * @returns\n */\nexport function getMsPer24(utc, timezoneName = 'UTC') {\n const localized = moment.utc(utc).tz(timezoneName);\n const hrsToMs = localized.hours() * 1000 * 60 * 60;\n const minToMs = localized.minutes() * 1000 * 60;\n const secToMs = localized.seconds() * 1000;\n const ms = localized.milliseconds();\n return hrsToMs + minToMs + secToMs + ms;\n}\n\n/**\n * getOffset\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezoneName - valid timezoneName String\n *\n * @return {Object} a JavaScript Date, the closest (future) midnight according to timePrefs;\n * if utc is already local midnight, returns utc\n */\nexport function getOffset(utc, timezoneName) {\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n return moment.tz.zone(timezoneName).utcOffset(utcHammertime);\n}\n\n/**\n * getBrowserTimezone\n * @returns {String} browser-determined timezone name\n */\nexport function getBrowserTimezone() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\n/**\n * getTimezoneFromTimePrefs\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n *\n * @return {String} timezoneName from timePrefs, browser, or fallback to 'UTC'\n */\nexport function getTimezoneFromTimePrefs(timePrefs = {}) {\n const { timezoneAware, timezoneName } = timePrefs;\n try {\n let timezone = getBrowserTimezone() || 'UTC';\n if (timezoneAware && timezoneName) {\n timezone = timezoneName;\n }\n sundial.checkTimezoneName(timezone);\n return timezone;\n } catch (err) {\n return 'UTC';\n }\n}\n\n/**\n * formatBirthdate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted birthdate, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatBirthdate(patient) {\n const bday = _.get(patient, ['profile', 'patient', 'birthday'], '');\n if (bday) {\n return utcFormat('%b %-d, %Y')(Date.parse(bday));\n }\n return '';\n}\n\n/**\n * formatClocktimeFromMsPer24\n * @param {Number} duration - positive integer representing a time of day\n * in milliseconds within a 24-hr day\n * @param {String} [format] - optional moment display format string; default is 'h:mm a'\n *\n * @return {String} formatted clocktime, e.g., '12:05 pm'\n */\nexport function formatClocktimeFromMsPer24(milliseconds, format = 'h:mm a') {\n if (_.isNull(milliseconds) || _.isUndefined(milliseconds) ||\n milliseconds < 0 || milliseconds > TWENTY_FOUR_HRS || milliseconds instanceof Date) {\n throw new Error('First argument must be a value in milliseconds per twenty-four hour day!');\n }\n return moment.utc(milliseconds).format(format);\n}\n\n/**\n * formatCurrentDate\n * @return {String} formatted current date, e.g., 'Jul 4, 2017';\n */\nexport function formatCurrentDate() {\n return timeFormat('%b %-d, %Y')(new Date());\n}\n\n/**\n * formatDiagnosisDate\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} formatted diagnosis date, e.g., 'Jul 4, 1975'; empty String if none found\n */\nexport function formatDiagnosisDate(patient) {\n const diagnosis = _.get(patient, ['profile', 'patient', 'diagnosisDate'], '');\n if (diagnosis) {\n return utcFormat('%b %-d, %Y')(Date.parse(diagnosis));\n }\n return '';\n}\n\n/**\n * formatDateRange\n * @param {String|Date} startDate - A moment-compatible date object or string\n * @param {String|Date} endDate - A moment-compatible date object or string\n * @param {String} format - Optional. The moment format string to parse startDate and endDate with\n */\nexport function formatDateRange(startDate, endDate, dateParseFormat, monthFormat = 'MMM') {\n const start = moment.utc(startDate, dateParseFormat);\n const end = moment.utc(endDate, dateParseFormat);\n\n const isSameYear = start.isSame(end, 'year');\n const isSameDay = start.isSame(end, 'day');\n const startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = isSameDay ? endFormat : `${startFormat} - ${endFormat}`;\n\n return formattedRange;\n}\n\n/**\n * formatDuration\n * @param {Number} duration - positive integer duration in milliseconds\n * @param {String} format - one of [hoursFractional, condensed]\n * @return {String} formatted duration, e.g., '1¼ hr'\n */\nexport function formatDuration(duration, opts = {}) {\n const momentDuration = moment.duration(duration);\n const days = momentDuration.days();\n const hours = momentDuration.hours();\n const minutes = momentDuration.minutes();\n const seconds = momentDuration.seconds();\n\n const QUARTER = opts.ascii ? ' 1/4' : '¼';\n const THIRD = opts.ascii ? ' 1/3' : '⅓';\n const HALF = opts.ascii ? ' 1/2' : '½';\n const TWO_THIRDS = opts.ascii ? ' 2/3' : '⅔';\n const THREE_QUARTERS = opts.ascii ? ' 3/4' : '¾';\n\n if (opts.condensed) {\n const formatted = {\n days: '',\n hours: '',\n minutes: '',\n seconds: '',\n };\n\n if (days + hours + minutes === 0) {\n // Less than a minute\n if (seconds > 0) {\n formatted.seconds = `${seconds}s`;\n } else {\n formatted.minutes = '0m';\n }\n } else {\n let roundedMinutes = seconds >= 30 ? minutes + 1 : minutes;\n let roundedHours = hours;\n let roundedDays = days;\n\n if (roundedMinutes >= 60) {\n roundedMinutes = roundedMinutes - 60;\n roundedHours++;\n }\n\n if (roundedHours >= 24) {\n roundedHours = roundedHours - 24;\n roundedDays++;\n }\n\n formatted.days = roundedDays !== 0 ? `${roundedDays}d ` : '';\n formatted.hours = roundedHours !== 0 ? `${roundedHours}h ` : '';\n formatted.minutes = roundedMinutes !== 0 ? `${roundedMinutes}m ` : '';\n }\n\n return `${formatted.days}${formatted.hours}${formatted.minutes}${formatted.seconds}`.trim();\n } else if (hours !== 0) {\n const suffix = (hours === 1) ? 'hr' : 'hrs';\n switch (minutes) {\n case 0:\n return `${hours} ${suffix}`;\n case 15:\n return `${hours}${QUARTER} ${suffix}`;\n case 20:\n return `${hours}${THIRD} ${suffix}`;\n case 30:\n return `${hours}${HALF} ${suffix}`;\n case 40:\n return `${hours}${TWO_THIRDS} ${suffix}`;\n case 45:\n return `${hours}${THREE_QUARTERS} ${suffix}`;\n default:\n return `${hours} ${suffix} ${minutes} min`;\n }\n } else {\n return `${minutes} min`;\n }\n}\n\n/**\n * formatLocalizedFromUTC\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} [format] - optional moment display format string; default is 'dddd, MMMM D'\n *\n * @return {String} formatted datetime, e.g., 'Sunday, January 1'\n */\nexport function formatLocalizedFromUTC(utc, timePrefs, format = 'dddd, MMMM D') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n return moment.utc(utc).tz(timezone).format(format);\n}\n\n/**\n * getLocalizedCeiling\n * @param {String} utc - Zulu timestamp (Integer hammertime also OK)\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} period - the period to round the timestamp to the ceiling of\n *\n * @return {Object} a JavaScript Date, the start of the next closes period according timePrefs;\n * If period is 'day', this fn returns the closest future midnight\n * If period is 'hour', this fn returns the start of the closest future hour\n * if utc is already local midnight, returns utc\n */\nexport function getLocalizedCeiling(utc, timePrefs, period = 'day') {\n if (utc instanceof Date) {\n throw new Error('`utc` must be a ISO-formatted String timestamp or integer hammertime!');\n }\n if (!_.includes(['day', 'hour'], period)) {\n throw new Error('`period` must be either \"day\" or \"hour\"');\n }\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const startOfPeriod = moment.utc(utc)\n .tz(timezone)\n .startOf(period);\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfPeriod.valueOf() === utcHammertime) {\n return startOfPeriod.toDate();\n }\n return startOfPeriod.add(1, period).toDate();\n}\n\n/**\n * formatTimeAgo\n *\n * @param {String|Date} utc - A moment-compatible date object or string\n * @param {Object} timePrefs - object containing timezoneAware Boolean and timezoneName String\n * @param {String} format - Optional. The moment format string to use for dates beyond 30 days ago\n *\n * @return {Object} Object containing the formatted time ago string, and the calculated days ago as an integer\n */\nexport const formatTimeAgo = (utc, timePrefs, format = 'YYYY-MM-DD') => {\n const timezone = getTimezoneFromTimePrefs(timePrefs);\n const endOfToday = moment.utc(getLocalizedCeiling(new Date().toISOString(), timePrefs)).tz(timezone);\n const endOfProvidedDay = moment.utc(getLocalizedCeiling(utc, timePrefs)).tz(timezone);\n const daysAgo = endOfToday.diff(endOfProvidedDay, 'days', true);\n const minutesAgo = moment.utc().tz(timezone).diff(utc, 'minutes');\n const hoursAgo = moment.utc().tz(timezone).diff(utc, 'hours');\n const lastUploadDateMoment = moment.utc(utc).tz(timezone);\n let daysText = lastUploadDateMoment.format(format);\n\n if (daysAgo < 2) {\n daysText = (daysAgo >= 1) ? t('yesterday') : t('today');\n } else if (daysAgo <= 30) {\n daysText = t('{{days}} days ago', { days: Math.ceil(daysAgo) });\n }\n\n const hoursText = t('{{hoursAgo}} {{unit}} ago', { hoursAgo, unit: hoursAgo === 1 ? 'hour' : 'hours' });\n\n let minutesText = t('{{minutesAgo}} {{unit}} ago', { minutesAgo, unit: minutesAgo === 1 ? 'minute' : 'minutes' });\n if (minutesAgo < 1) minutesText = t('a few seconds ago');\n\n return {\n daysAgo,\n daysText,\n hoursAgo,\n hoursText,\n minutesAgo,\n minutesText,\n };\n};\n","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\n settingsOverrides,\n} from './constants';\n\nimport { deviceName } from './settings/data';\n\n/**\n * Get the latest upload datum\n * @param {Array} uploadData Array of Tidepool upload data\n * @returns {Object} The latest upload datum\n */\nexport function getLatestPumpUpload(uploadData = []) {\n return _.findLast(uploadData, { deviceTags: ['insulin-pump'] });\n}\n\n/**\n * Get the latest manual basal schedule name from an array of basal data\n * @param {Array} basalData Array of Tidepool basal data\n * @returns {Object} The latest manual basal schedule name, else undefined\n */\nexport function getLastManualBasalSchedule(basalData = []) {\n const lastManualBasal = _.findLast(basalData, { deliveryType: 'scheduled' });\n return _.get(lastManualBasal, 'scheduleName');\n}\n\n/**\n * Check to see if datum is from DIY Loop\n */\nexport function isDIYLoop(datum = {}) {\n return (/^com\\.[a-zA-Z0-9]*\\.?loopkit\\.Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Tidepool Loop\n*/\nexport function isTidepoolLoop(datum = {}) {\n return (/^org\\.tidepool\\.[a-zA-Z0-9]*\\.?Loop/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Twiist Loop\n*/\nexport function isTwiistLoop(datum = {}) {\n if (datum.type === 'upload') {\n const majorVersion = parseInt(_.get(datum, 'client.version', '0').split('.')[0], 10);\n return (/^com.sequelmedtech.tidepool-service/).test(_.get(datum, 'client.name', '')) && majorVersion >= 2;\n }\n return (/^com.dekaresearch.twiist/).test(_.get(datum, 'origin.name', datum?.client?.name || ''));\n}\n\n/**\n * Check to see if datum is from Control-IQ\n */\nexport function isControlIQ(datum = {}) {\n return _.get(datum, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check to see if datum is from LibreView API\n */\nexport function isLibreViewAPI(datum = {}) {\n const TARGET = 'org.tidepool.abbott.libreview.partner.api';\n return datum?.client?.name === TARGET || datum?.origin?.name === TARGET;\n}\n\n/**\n * Check to see if datum is from a known Loop device\n */\nexport function isLoop(datum = {}) {\n return datum.tags?.loop || isDIYLoop(datum) || isTidepoolLoop(datum) || isTwiistLoop(datum);\n}\n\n/**\n * Check if the provided datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettingsOrUpload = {}, deviceModel) {\n return _.includes(_.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []), deviceModel)\n || (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isDIYLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettingsOrUpload = {}) {\n return (manufacturer === 'tandem' && isControlIQ(pumpSettingsOrUpload))\n || isLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Check if the provided datum was for a 1-minute CGM sample interval device\n * @param {Object} pumpSettingsOrUpload Tidepool pumpSettings or upload datum\n * @returns {Boolean}\n */\nexport function isOneMinCGMSampleIntervalDevice(pumpSettingsOrUpload = {}) {\n return isTwiistLoop(pumpSettingsOrUpload);\n}\n\n/**\n * Get the uppercased manufacturer name\n * @param {String} manufacturer Manufacturer name\n */\nexport function getUppercasedManufacturer(manufacturer = '') {\n return _.map(manufacturer.split(' '), part => {\n switch (part) {\n case 'diy':\n return _.upperCase(part);\n case 'twiist':\n return part;\n default:\n return _.upperFirst(part);\n }\n }).join(' ');\n}\n\n/**\n * Get a list of standard settings overrides for a settings-overrideable device,\n * with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Array} settings overrides\n */\nexport function getSettingsOverrides(manufacturer) {\n return _.get(settingsOverrides, getUppercasedManufacturer(manufacturer), settingsOverrides.default);\n}\n\n/**\n * Get a pump terminology vocabulary, with default fallbacks for missing keys\n * @param {String} manufacturer Manufacturer name\n * @returns {Object} pump vocabulary\n */\nexport function getPumpVocabulary(manufacturer) {\n const vocabulary = _.cloneDeep(pumpVocabulary);\n return _.defaults(\n _.get(vocabulary, getUppercasedManufacturer(manufacturer), {}),\n vocabulary.default\n );\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\n/*\n * Guidelines for these utilities:\n *\n * 1. Only \"workhorse\" functions used in 2+ places should be here.\n * 1a. A function used in multiple components for one view should live\n * in view-specific utils: src/utils/[view]/format.js\n * 1b. A function used in only one component should just be part of that component,\n * potentially as a named export if tests are deemed important to have.\n * 1c. This set of utilities is ONLY for NON-datetime related formatting. Any functions\n * used for formatting dates and/or times should go in src/utils/datetime.js\n *\n * 2. Function naming scheme: the main verb here is `format`. Start all function names with that.\n *\n * 3. Function organizational scheme in this file and tests file: alphabetical plz\n *\n * 4. Try to be consistent in how params are used:\n * (e.g., always pass in `bgPrefs`) rather than some (subset) of bgUnits and/or bgBounds\n * and try to copy & paste JSDoc @param descriptions for common params.\n *\n */\n\nimport _ from 'lodash';\nimport { format } from 'd3-format';\nimport { convertToMmolL } from './bloodglucose';\nimport { BG_HIGH, BG_LOW, MMOLL_UNITS } from './constants';\n\n/**\n * bankersRound\n *\n * Rounding with balanced tie-breaking to reduce upward bias in rounding by rounding the midway\n * point digit (x.5) to the nearest even number, rather than always upwards.\n * ref: https://stackoverflow.com/a/49080858\n *\n * Used as default rounding in AGP reports.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function bankersRound(value, precision = 0) {\n /* eslint-disable no-nested-ternary */\n const x = value * (10 ** precision);\n const r = Math.round(x);\n const br = Math.abs(x) % 1 === 0.5 ? (r % 2 === 0 ? r : r - 1) : r;\n return br / (10 ** precision);\n /* eslint-enable no-nested-ternary */\n}\n\n/**\n * precisionRound\n *\n * Rounding numbers to desired precison.\n *\n * @param {Number} value - numeric value to format\n * @param {Number} [precision] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {Number} numeric value rounded to the desired number of decimal places\n */\nexport function precisionRound(value, precision = 0) {\n const shift = precision > 0 ? 10 ** precision : 1;\n return Math.round(value * shift) / shift;\n}\n\n/**\n * formatBgValue\n * @param {Number} val - integer or float blood glucose value in either mg/dL or mmol/L\n * @param {Object} bgPrefs - object containing bgUnits String and bgBounds Object\n * @param {Object} [outOfRangeThresholds] - optional thresholds for `low` and `high` values;\n * derived from annotations in PwD's data, so may not exist\n *\n * @return {String} formatted blood glucose value\n */\nexport function formatBgValue(val, bgPrefs, outOfRangeThresholds) {\n const units = _.get(bgPrefs, 'bgUnits', '');\n\n if (!_.isEmpty(outOfRangeThresholds)) {\n let lowThreshold = outOfRangeThresholds.low;\n let highThreshold = outOfRangeThresholds.high;\n\n if (units === MMOLL_UNITS) {\n if (lowThreshold) {\n lowThreshold = convertToMmolL(lowThreshold);\n }\n if (highThreshold) {\n highThreshold = convertToMmolL(highThreshold);\n }\n }\n if (lowThreshold && val < lowThreshold) {\n return BG_LOW;\n }\n if (highThreshold && val > highThreshold) {\n return BG_HIGH;\n }\n }\n\n if (units === MMOLL_UNITS) {\n return bankersRound(val, 1).toFixed(1);\n }\n\n return bankersRound(val).toString();\n}\n\n/**\n * formatDecimalNumber\n *\n * This (and all d3-format methods) is to format numbers for localized human display.\n * To use rounded results in calculations, use the `precisionRound` utility\n *\n * @param {Number} val - numeric value to format\n * @param {Number} [places] - optional number of decimal places to display;\n * if not provided, will display as integer (0 decimal places)\n *\n * @return {String} numeric value rounded to the desired number of decimal places\n */\nexport function formatDecimalNumber(val, places) {\n if (places === null || places === undefined) {\n return format('d')(val);\n }\n return format(`.${places}f`)(val);\n}\n\n/**\n * formatInsulin\n *\n * @export\n * @param {Number} val - numeric value to format\n * @returns {String} numeric value formatted for the precision of insulin dosing\n */\nexport function formatInsulin(val) {\n let decimalLength = 1;\n const qtyString = val.toString();\n if (qtyString.indexOf('.') !== -1) {\n const length = qtyString.split('.')[1].length;\n decimalLength = _.min([length, 3]);\n }\n return formatDecimalNumber(val, decimalLength);\n}\n\n/**\n * formatPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatPercentage(val, precision = 0, useAGPFormat) {\n if (Number.isNaN(val)) {\n return '--%';\n }\n return useAGPFormat\n ? `${bankersRound(val * 100, precision)}%`\n : format(`.${precision}%`)(val);\n}\n\n/**\n * formatStatsPercentage\n * @param {Number} val - raw decimal proportion, range of 0.0 to 1.0\n *\n * @return {String} percentage\n */\nexport function formatStatsPercentage(value) {\n if (Number.isNaN(value)) return '--';\n\n const percentage = value * 100;\n\n // Round to one decimal place if below 1, and zero decimal places if above 1;\n const precision = percentage >= 1 ? 0 : 1;\n const roundedValue = bankersRound(percentage, precision);\n\n return _.toString(roundedValue);\n}\n\n/**\n * removeTrailingZeroes\n * @param {String} - formatted decimal value, may have trailing zeroes\n *\n * @return {String} - formatted decimal value w/o trailing zero-indexes\n */\nexport function removeTrailingZeroes(val) {\n return val.replace(/\\.0+$/, '');\n}\n","/*\n * == BSD2 LICENSE ==\n * Copyright (c) 2016, Tidepool Project\n *\n * This program is free software; you can redistribute it and/or modify it under\n * the terms of the associated License, which is identical to the BSD 2-Clause\n * License as published by the Open Source Initiative at opensource.org.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n * FOR A PARTICULAR PURPOSE. See the License for more details.\n *\n * You should have received a copy of the License along with this program; if\n * not, you can obtain one from Tidepool Project at tidepool.org.\n * == BSD2 LICENSE ==\n */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary, isControlIQ, isLoop } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n PHYSICAL_ACTIVITY,\n PREPRANDIAL,\n} from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\nconst BASAL_RATE_PRECISION_PLACES = 3;\nconst MAX_BASAL_RATE_PRECISION_PLACES = 2;\n\n/**\n * noData\n * @param {ANY} val value to check\n *\n * @return {Boolean} true if value is defined, not null, not empty string, false otherwise\n */\nexport function noData(val) {\n return val == null || (typeof val === 'string' && _.isEmpty(val));\n}\n\n/**\n * deviceName\n * @param {String} manufacturer one of: animas, insulet, medtronic, tandem, microtech, loop\n *\n * @return {String} name for given manufacturer\n */\nexport function deviceName(manufacturer) {\n const DEVICE_DISPLAY_NAME_BY_MANUFACTURER = {\n animas: 'Animas',\n insulet: 'OmniPod',\n medtronic: 'Medtronic',\n tandem: 'Tandem',\n microtech: 'Equil',\n 'diy loop': 'DIY Loop',\n 'tidepool loop': 'Tidepool Loop',\n twiist: 'twiist',\n };\n return DEVICE_DISPLAY_NAME_BY_MANUFACTURER[manufacturer] || manufacturer;\n}\n\n/**\n * getBasalRate\n * @private\n * @param {Array} scheduleData basal schedule\n * @param {Number} startTime milliseconds from start of day\n * @return {String} formatted basal rate\n */\nfunction getBasalRate(scheduleData, startTime) {\n const rate = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n ).rate;\n\n if (noData(rate)) {\n return '';\n }\n return format.formatDecimalNumber(rate, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search for\n * @param {Number} startTime milliseconds from start of day\n *\n * @return {String} value of field for startTime\n */\nfunction getValue(scheduleData, fieldName, startTime) {\n const val = _.find(scheduleData, (schedule) =>\n schedule.start === startTime\n )[fieldName];\n\n if (noData(val)) {\n return '';\n }\n return val;\n}\n\n/**\n * getBloodGlucoseValue\n * @private\n * @param {Array} scheduleData scheduleData\n * @param {String} fieldName field to search format\n * @param {Number} startTime milliseconds from start of day\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n *\n * @return {String} formatted blood glucose value\n */\nfunction getBloodGlucoseValue(scheduleData, fieldName, startTime, units) {\n const bgValue = getValue(scheduleData, fieldName, startTime);\n if (noData(bgValue)) {\n return '';\n }\n return format.formatBgValue(bgValue, { bgUnits: units });\n}\n\n/**\n * getStarts\n * @private\n * @param {Array} timedData array with time based data\n *\n * @return {Array} array of start times in milliseconds\n */\nfunction getStarts(timedData) {\n return _.map(timedData, 'start');\n}\n\n/**\n * getTotalBasalRates\n * @param {Array} scheduleData basal schedule data\n *\n * @return {String} formatted total of basal rates\n */\nexport function getTotalBasalRates(scheduleData) {\n const HOUR_IN_MILLISECONDS = 60 * 60 * 1000;\n const DAY_IN_MILLISECONDS = 86400000;\n\n let total = 0;\n for (let i = scheduleData.length - 1; i >= 0; i--) {\n const start = scheduleData[i].start;\n let finish = DAY_IN_MILLISECONDS;\n const next = i + 1;\n if (next < scheduleData.length) {\n finish = scheduleData[next].start;\n }\n const hrs = (finish - start) / HOUR_IN_MILLISECONDS;\n const amount = parseFloat(scheduleData[i].rate.toFixed(BASAL_RATE_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(BASAL_RATE_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, BASAL_RATE_PRECISION_PLACES);\n}\n\n/**\n * getScheduleLabel\n * @param {String} scheduleName basal schedule name\n * @param {String} activeName name of active basal schedule at time of upload\n * @param {String} deviceKey one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {Boolean} noUnits whether units should be included in label object\n *\n * @return {Object} object representing basal schedule label\n */\nexport function getScheduleLabel(scheduleName, activeName, deviceKey, noUnits) {\n const CAPITALIZED = ['carelink', 'medtronic'];\n let displayName = scheduleName;\n if (_.includes(CAPITALIZED, deviceKey)) {\n displayName = _.map(scheduleName.split(' '), (part) => (_.upperFirst(part))).join(' ');\n }\n return {\n main: displayName,\n secondary: scheduleName === activeName ? 'Active at upload' : '',\n units: noUnits ? '' : 'U/hr',\n };\n}\n\n/**\n * getScheduleNames\n * @param {Object} settingsData object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function getScheduleNames(settingsData) {\n return _.keysIn(settingsData);\n}\n\n/**\n * getTimedSchedules\n * @param {Array} settingsData array of basal schedules\n *\n * @return {Array} array of {name, position} basal objects\n */\nexport function getTimedSchedules(settingsData) {\n const names = _.map(settingsData, 'name');\n const schedules = [];\n for (let i = names.length - 1; i >= 0; i--) {\n schedules.push({ name: names[i], position: i });\n }\n return schedules;\n}\n\n/**\n * getDeviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function getDeviceMeta(settingsData = {}, timePrefs) {\n const utc = settingsData.normalTime;\n const uploadedTime = utc ?\n datetime.formatLocalizedFromUTC(utc, timePrefs, 'MMM D, YYYY') :\n false;\n return {\n schedule: settingsData.activeSchedule || 'unknown',\n uploaded: uploadedTime || 'unknown',\n serial: settingsData.deviceSerialNumber || 'unknown',\n };\n}\n\n/**\n * processBasalRateData\n * @param {Object} scheduleData basal schedule object\n *\n * @return {Array} array of formatted schedule entries\n */\nexport function processBasalRateData(scheduleData) {\n const starts = getStarts(scheduleData.value);\n const noRateData = [{ start: '-', rate: '-' }];\n\n if (starts.length === 0) {\n return noRateData;\n } else if (starts.length === 1) {\n if (Number(getBasalRate(scheduleData.value, starts[0])) === 0) {\n return noRateData;\n }\n }\n\n const data = _.map(starts, (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n scheduleData.value,\n startTime\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(scheduleData.value),\n });\n return data;\n}\n\n/**\n * processBgTargetData\n * @param {Array} targetsData array of blood glucose targets\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n * @param {Object} keys key names as {columnTwo, columnThree}\n *\n * @return {Array} formatted bloog glucose target data\n */\nexport function processBgTargetData(targetsData, bgUnits, keys) {\n return _.map(getStarts(targetsData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n columnTwo: getBloodGlucoseValue(\n targetsData,\n keys.columnTwo,\n startTime,\n bgUnits\n ),\n columnThree: getBloodGlucoseValue(\n targetsData,\n keys.columnThree,\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processCarbRatioData\n * @param {Array} carbRatioData array of carb ratio data\n *\n * @return {Array} array of formatted carb ratio objects\n */\nexport function processCarbRatioData(carbRatioData) {\n return _.map(getStarts(carbRatioData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getValue(\n carbRatioData,\n 'amount',\n startTime\n ),\n }));\n}\n\n/**\n * processSensitivityData\n * @param {Array} sensitivityData array of sensitivity data\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted sensitivity objects\n */\nexport function processSensitivityData(sensitivityData, bgUnits) {\n return _.map(getStarts(sensitivityData), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n amount: getBloodGlucoseValue(\n sensitivityData,\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n}\n\n/**\n * processTimedSettings\n * @param {Object} pumpSettings entire pump settings object\n * @param {Object} schedule {name, position} schedule object\n * @param {String} bgUnits MGDL_UNITS or MMOLL_UNITS\n *\n * @return {Array} array of formatted objects with\n * {start, rate, bgTarget, carbRatio, insulinSensitivity}\n */\nexport function processTimedSettings(pumpSettings, schedule, bgUnits) {\n const data = _.map(getStarts(pumpSettings.bgTargets[schedule.name]), (startTime) => ({\n start: datetime.formatClocktimeFromMsPer24(\n startTime\n ),\n rate: getBasalRate(\n pumpSettings.basalSchedules[schedule.position].value,\n startTime\n ),\n bgTarget: getBloodGlucoseValue(\n pumpSettings.bgTargets[schedule.name],\n 'target',\n startTime,\n bgUnits\n ),\n carbRatio: getValue(\n pumpSettings.carbRatios[schedule.name],\n 'amount',\n startTime\n ),\n insulinSensitivity: getBloodGlucoseValue(\n pumpSettings.insulinSensitivities[schedule.name],\n 'amount',\n startTime,\n bgUnits\n ),\n }));\n\n data.push({\n start: 'Total',\n rate: getTotalBasalRates(\n pumpSettings.basalSchedules[schedule.position].value\n ),\n bgTarget: '',\n carbRatio: '',\n insulinSensitivity: '',\n });\n return data;\n}\n\n/**\n * startTimeAndValue\n * @param {TYPE} accessor key for value displayed in this column\n *\n * @return {Array} array of objects describing table columns\n */\nexport function startTimeAndValue(valueKey) {\n return [\n { key: 'start', label: 'Start time' },\n { key: valueKey, label: 'Value' },\n ];\n}\n\n/**\n * insulinSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, tandem, microtech, tidepool loop, diy loop, twiist\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\n const bgUnits = settings?.units?.bg;\n const deviceLabels = getPumpVocabulary(manufacturer);\n const maxBasal = _.get(settings, scheduleName ? `basal[${scheduleName}].rateMaximum.value` : 'basal.rateMaximum.value');\n const maxBolus = _.get(settings, scheduleName ? `bolus[${scheduleName}].amountMaximum.value` : 'bolus.amountMaximum.value');\n let insulinDurationUnits = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.units` : 'bolus.calculator.insulin.units');\n let insulinDuration = _.get(settings, scheduleName ? `bolus[${scheduleName}].calculator.insulin.duration` : 'bolus.calculator.insulin.duration');\n\n if (_.includes(['diy loop', 'tidepool loop', 'twiist'], manufacturer)) {\n insulinDuration = _.get(settings, 'insulinModel.actionDuration');\n insulinDurationUnits = 'milliseconds';\n }\n\n const columns = [\n { key: 'setting' },\n { key: 'value' },\n ];\n\n if (insulinDurationUnits === 'minutes') {\n const durationInHours = Math.floor(insulinDuration / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n if (insulinDurationUnits === 'milliseconds') {\n const durationInHours = Math.floor(insulinDuration / 60 / 60);\n const minutesRemainder = insulinDuration % 60;\n\n insulinDuration = (minutesRemainder > 0)\n ? `${durationInHours}:${_.padStart(minutesRemainder, 2, '0')}`\n : durationInHours;\n }\n\n const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${format.formatDecimalNumber(maxBasal, MAX_BASAL_RATE_PRECISION_PLACES)} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION] + (isControlIQ(settings) ? '*' : ''), value: insulinDuration ? `${insulinDuration} hrs` : '-' },\n ];\n\n if (isLoop(settings)) {\n const insulinModelLabels = {\n rapidAdult: t('Rapid-Acting - Adults'),\n rapidChild: t('Rapid Acting - Children'),\n fiasp: t('Fiasp'),\n lyumjev: t('Lyumjev'),\n afrezza: t('Afrezza'),\n };\n\n const insulinModel = {\n label: insulinModelLabels[settings?.insulinModel?.modelType] || settings?.insulinModel?.modelType || t('Unknown'),\n peakMinutes: _.isFinite(settings?.insulinModel?.actionPeakOffset) ? settings.insulinModel.actionPeakOffset / 60 : null,\n };\n\n const device = deviceName(manufacturer);\n\n const insulinModelAnnotations = [\n t('{{device}} assumes that the insulin it has delivered is actively working to lower your glucose for 6 hours. This setting cannot be changed.', { device }),\n ];\n\n if (insulinModel.peakMinutes) insulinModelAnnotations.push(t('The {{label}} model assumes peak activity at {{peakMinutes}} minutes.', insulinModel));\n\n rows.unshift({\n annotations: [t('{{device}} will deliver basal and recommend bolus insulin only if your glucose is predicted to be above this limit for the next three hours.', { device })],\n setting: t('Glucose Safety Limit'),\n value: `${format.formatBgValue(settings?.bgSafetyLimit, { bgUnits })} ${bgUnits}`,\n });\n\n rows.splice(3, 1, {\n annotations: insulinModelAnnotations,\n setting: t('Insulin Model'),\n value: insulinModel.label,\n });\n }\n\n // Tandem insulin settings do not have max basal\n if (manufacturer === 'tandem') rows.shift();\n\n return {\n columns,\n rows,\n };\n}\n\n/**\n * presetSettings\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: tidepool loop, diy loop, twiist\n */\nexport function presetSettings(settings, manufacturer) {\n const deviceLabels = getPumpVocabulary(manufacturer);\n const bgUnits = settings?.units?.bg;\n const correctionRange = range => `${format.formatBgValue(range?.low, { bgUnits })}-${format.formatBgValue(range?.high, { bgUnits })}`;\n\n const columns = [\n { key: 'name', label: 'Name' },\n { key: 'value', label: `${t('Correction Range')} (${bgUnits})` },\n ];\n\n const rows = [];\n if (settings?.bgTargetPreprandial) rows.push({ name: deviceLabels[PREPRANDIAL]?.label, value: correctionRange(settings?.bgTargetPreprandial) });\n if (settings?.bgTargetPhysicalActivity) rows.push({ name: deviceLabels[PHYSICAL_ACTIVITY]?.label, value: correctionRange(settings?.bgTargetPhysicalActivity) });\n\n return {\n columns,\n rows,\n };\n}\n","import _ from 'lodash';\nimport React from 'react';\nimport i18next from 'i18next';\n\nimport {\n generateBgRangeLabels,\n classifyBgValue,\n classifyCvValue,\n reshapeBgClassesToBgBounds,\n} from './bloodglucose';\n\nimport {\n AUTOMATED_DELIVERY,\n BG_COLORS,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n} from './constants';\n\nimport { getPumpVocabulary, getSettingsOverrides } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue, formatStatsPercentage } from './format';\nimport { formatDuration } from './datetime';\n\nconst t = i18next.t.bind(i18next);\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nexport const dailyDoseUnitOptions = [\n {\n label: 'kg',\n value: 'kg',\n },\n {\n label: 'lb',\n value: 'lb',\n },\n];\n\nexport const statTypes = {\n barHorizontal: 'barHorizontal',\n barBg: 'barBg',\n input: 'input',\n simple: 'simple',\n};\n\nexport const statBgSourceLabels = {\n cbg: t('CGM'),\n smbg: t('BGM'),\n};\n\nexport const statFormats = {\n bgCount: 'bgCount',\n bgRange: 'bgRange',\n bgValue: 'bgValue',\n cv: 'cv',\n carbs: 'carbs',\n duration: 'duration',\n gmi: 'gmi',\n percentage: 'percentage',\n standardDevRange: 'standardDevRange',\n standardDevValue: 'standardDevValue',\n units: 'units',\n unitsPerKg: 'unitsPerKg',\n};\n\nexport const commonStats = {\n averageGlucose: 'averageGlucose',\n averageDailyDose: 'averageDailyDose',\n bgExtents: 'bgExtents',\n carbs: 'carbs',\n coefficientOfVariation: 'coefficientOfVariation',\n glucoseManagementIndicator: 'glucoseManagementIndicator',\n readingsInRange: 'readingsInRange',\n sensorUsage: 'sensorUsage',\n standardDev: 'standardDev',\n timeInAuto: 'timeInAuto',\n timeInOverride: 'timeInOverride',\n timeInRange: 'timeInRange',\n totalInsulin: 'totalInsulin',\n};\n\nexport const statFetchMethods = {\n [commonStats.averageGlucose]: 'getAverageGlucoseData',\n [commonStats.averageDailyDose]: 'getTotalInsulinData',\n [commonStats.bgExtents]: 'getBgExtentsData',\n [commonStats.carbs]: 'getCarbsData',\n [commonStats.coefficientOfVariation]: 'getCoefficientOfVariationData',\n [commonStats.glucoseManagementIndicator]: 'getGlucoseManagementIndicatorData',\n [commonStats.readingsInRange]: 'getReadingsInRangeData',\n [commonStats.sensorUsage]: 'getSensorUsage',\n [commonStats.standardDev]: 'getStandardDevData',\n [commonStats.timeInAuto]: 'getTimeInAutoData',\n [commonStats.timeInOverride]: 'getTimeInOverrideData',\n [commonStats.timeInRange]: 'getTimeInRangeData',\n [commonStats.totalInsulin]: 'getBasalBolusData',\n};\n\nexport const getSum = data => _.sum(_.map(data, d => _.max([d.value, 0])));\n\nexport const ensureNumeric = value => (_.isNil(value) || _.isNaN(value) ? -1 : parseFloat(value));\n\nexport const isRangeDefined = value => ensureNumeric(value) > -1;\n\nexport const formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = _.isFinite(datum) ? datum : datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n const {\n bgPrefs,\n data,\n useAGPFormat,\n emptyDataPlaceholder = '--',\n forcePlainTextValues = false,\n } = opts;\n\n const total = _.get(data, 'total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = emptyDataPlaceholder;\n };\n\n switch (format) {\n case statFormats.bgCount:\n if (value >= 0) {\n const precision = value < 0.05 ? 2 : 1;\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value = +value.toFixed(precision);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.bgRange:\n value = generateBgRangeLabels(bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, value, 'threeWay');\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.carbs:\n if (_.isPlainObject(value) && (value.grams > 0 || value.exchanges > 0)) {\n const { grams, exchanges } = value;\n value = [];\n suffix = [];\n if (grams > 0) {\n value.push(formatDecimalNumber(grams));\n suffix.push('g');\n }\n if (exchanges > 0) {\n // Note: the + converts the rounded, fixed string back to a number\n // This allows 2.67777777 to render as 2.7 and 3.0000001 to render as 3 (not 3.0)\n value.push(+formatDecimalNumber(exchanges, 1));\n suffix.push('exch');\n }\n } else {\n disableStat();\n }\n break;\n\n case statFormats.cv:\n if (value >= 0) {\n id = classifyCvValue(value);\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.duration:\n if (value >= 0) {\n value = formatDuration(value, { condensed: true });\n } else {\n disableStat();\n }\n break;\n\n case statFormats.gmi:\n if (value >= 0) {\n value = useAGPFormat\n ? bankersRound(value, 1).toString()\n : formatDecimalNumber(value, 1);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.percentage:\n if (total && total >= 0) {\n value = _.max([value, 0]);\n value = formatStatsPercentage(value / total);\n suffix = '%';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevRange:\n deviation = _.get(datum, 'deviation.value', -1);\n if (value >= 0 && deviation >= 0) {\n lowerValue = value - deviation;\n lowerColorId = lowerValue >= 0\n ? classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, lowerValue, 'threeWay')\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(bgPrefs, 'bgBounds'), bgPrefs?.bgUnits, upperValue, 'threeWay');\n\n lowerValue = formatBgValue(lowerValue, bgPrefs);\n upperValue = formatBgValue(upperValue, bgPrefs);\n\n value = !forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n - \n <span style={{\n color: BG_COLORS[upperColorId],\n }}>\n {upperValue}\n </span>\n </span>\n ) : `${lowerValue}-${upperValue}`;\n } else {\n disableStat();\n }\n break;\n\n case statFormats.standardDevValue:\n if (value >= 0) {\n value = formatBgValue(value, bgPrefs);\n } else {\n disableStat();\n }\n break;\n\n case statFormats.units:\n if (value >= 0) {\n value = formatDecimalNumber(value, 1);\n suffix = 'U';\n } else {\n disableStat();\n }\n break;\n\n case statFormats.unitsPerKg:\n if (suffix === 'lb') {\n value = value * LBS_PER_KG;\n }\n suffix = 'U/kg';\n if (value > 0 && _.isFinite(value)) {\n value = formatDecimalNumber(value, 2);\n } else {\n disableStat();\n }\n break;\n\n default:\n break;\n }\n\n return {\n id,\n value,\n suffix,\n };\n};\n\nexport const getStatAnnotations = (data, type, opts = {}) => {\n const { bgSource, days, manufacturer } = opts;\n const vocabulary = getPumpVocabulary(manufacturer);\n const labels = { overrideLabel: vocabulary[SETTINGS_OVERRIDE], overrideLabelLowerCase: _.lowerCase(vocabulary[SETTINGS_OVERRIDE]) };\n\n const annotations = [];\n\n const bgStats = [\n commonStats.averageGlucose,\n commonStats.coefficientOfVariation,\n commonStats.glucoseManagementIndicator,\n commonStats.readingsInRange,\n commonStats.timeInRange,\n commonStats.standardDev,\n ];\n\n switch (type) {\n case commonStats.averageGlucose:\n annotations.push(t('**Avg. Glucose ({{bgSourceLabel}}):** All {{bgSourceLabel}} glucose values added together, divided by the number of readings.', { bgSourceLabel: statBgSourceLabels[bgSource] }));\n break;\n\n case commonStats.averageDailyDose:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data.'));\n } else {\n annotations.push(t('**Daily Insulin:** All basal and bolus insulin delivery (in Units) added together.'));\n }\n break;\n\n case commonStats.carbs:\n if (days > 1) {\n annotations.push(t('**Avg. Daily Carbs**: All carb entries added together, then divided by the number of days in this view for which we have carb data. Note, these entries come from either bolus wizard events, or Apple Health records.'));\n } else {\n annotations.push(t('**Total Carbs**: All carb entries from bolus wizard events or Apple Health records added together.'));\n }\n annotations.push(t('Derived from _**{{total}}**_ carb entries.', { total: data.total }));\n break;\n\n case commonStats.coefficientOfVariation:\n annotations.push(t('**CV (Coefficient of Variation):** How far apart (wide) glucose values are; research suggests a target of 36% or lower.'));\n break;\n\n case commonStats.glucoseManagementIndicator:\n annotations.push(t('**GMI (Glucose Management Indicator):** Tells you what your approximate A1C level is likely to be, based on the average glucose level from your CGM readings.'));\n break;\n\n case commonStats.readingsInRange:\n annotations.push(t('**Readings In Range:** Daily average of the number of {{smbgLabel}} readings.', { smbgLabel: statBgSourceLabels.smbg }));\n break;\n\n case commonStats.sensorUsage:\n annotations.push(t('**Sensor Usage:** Time the {{cbgLabel}} collected data, divided by the total time represented in this view.', { cbgLabel: statBgSourceLabels.cbg }));\n break;\n\n case commonStats.standardDev:\n annotations.push(t('**SD (Standard Deviation):** How far values are from the average.'));\n break;\n\n case commonStats.timeInAuto:\n if (days > 1) {\n annotations.push(t('**Time In {{automatedLabel}}:** Daily average of the time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n } else {\n annotations.push(t('**Time In {{automatedLabel}}:** Time spent in automated basal delivery.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{automatedLabel}} divided by the total duration of basals for this time period.\\n\\n**(time)** is total duration of time in {{automatedLabel}}.', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }));\n }\n break;\n\n case commonStats.timeInOverride:\n if (days > 1) {\n annotations.push(t('**Time In {{overrideLabel}}:** Daily average of the time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabelLowerCase}}.', labels));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in {{overrideLabelLowerCase}}.', labels));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabelLowerCase}} divided by the total duration for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabelLowerCase}}.', labels));\n }\n break;\n\n case commonStats.timeInRange:\n if (days > 1) {\n annotations.push(t('**Time In Range:** Daily average of the time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is 24 hours multiplied by % in range.'));\n } else {\n annotations.push(t('**Time In Range:** Time spent in range, based on {{cbgLabel}} readings.', { cbgLabel: statBgSourceLabels.cbg }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the number of readings in range divided by all readings for this time period.\\n\\n**(time)** is number of readings in range multiplied by the {{cbgLabel}} sample frequency.', { cbgLabel: statBgSourceLabels.cbg }));\n }\n break;\n\n case commonStats.totalInsulin:\n if (days > 1) {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together, divided by the number of days in this view for which we have insulin data'));\n } else {\n annotations.push(t('**Total Insulin:** All basal and bolus insulin delivery (in Units) added together'));\n }\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the respective total of basal or bolus delivery divided by total insulin delivered for the time period for which we have insulin data.'));\n break;\n\n default:\n break;\n }\n\n if (data.insufficientData) {\n annotations.push(t('**Why is this stat empty?**\\n\\nThere is not enough data present in this view to calculate it.'));\n } else if (_.includes(bgStats, type)) {\n if (bgSource === 'smbg') {\n annotations.push(t('Derived from _**{{total}}**_ {{smbgLabel}} readings.', { total: _.get(data, 'counts.total', data.total), smbgLabel: statBgSourceLabels.smbg }));\n }\n }\n\n return annotations;\n};\n\nexport const getStatData = (data, type, opts = {}) => {\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const settingsOverrides = getSettingsOverrides(opts.manufacturer);\n const bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\n\n const readingsInRangeDataPath = opts.days > 1 ? 'dailyAverages' : 'counts';\n\n switch (type) {\n case commonStats.averageGlucose:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.averageDailyDose:\n statData.data = [\n {\n id: 'insulin',\n input: {\n id: 'weight',\n label: 'Weight',\n suffix: {\n id: 'units',\n options: dailyDoseUnitOptions,\n value: opts.suffixValue || dailyDoseUnitOptions[0],\n },\n type: 'number',\n value: opts.inputValue ? ensureNumeric(opts.inputValue) : undefined,\n },\n output: {\n label: 'Daily Dose ÷ Weight',\n type: 'divisor',\n dataPaths: {\n dividend: 'data.0',\n },\n },\n value: ensureNumeric(data.totalInsulin),\n },\n ];\n\n statData.dataPaths = {\n input: 'data.0.input',\n output: 'data.0.output',\n summary: 'data.0',\n };\n break;\n\n case commonStats.bgExtents:\n statData.data = [\n {\n id: 'bgMax',\n value: ensureNumeric(data.bgMax),\n title: t('Max BG'),\n },\n {\n id: 'bgMin',\n value: ensureNumeric(data.bgMin),\n title: t('Min BG'),\n },\n ];\n break;\n\n case commonStats.carbs:\n statData.data = [\n {\n value: {\n grams: ensureNumeric(_.get(data, 'carbs.grams')),\n exchanges: ensureNumeric(_.get(data, 'carbs.exchanges')),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.coefficientOfVariation:\n statData.data = [\n {\n id: 'cv',\n value: ensureNumeric(data.coefficientOfVariation),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n };\n break;\n\n case commonStats.glucoseManagementIndicator:\n statData.data = [\n {\n id: 'gmi',\n value: ensureNumeric(data.glucoseManagementIndicator),\n },\n {\n id: 'gmiAGP',\n value: ensureNumeric(data.glucoseManagementIndicatorAGP),\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.readingsInRange:\n statData.data = _.filter([\n (isRangeDefined(data[readingsInRangeDataPath]?.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data[readingsInRangeDataPath].veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data[readingsInRangeDataPath].low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data[readingsInRangeDataPath].target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data[readingsInRangeDataPath].high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data[readingsInRangeDataPath]?.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data[readingsInRangeDataPath].veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n totalReadings: 'raw.counts.total',\n averageDailyReadings: 'total',\n };\n break;\n\n case commonStats.sensorUsage:\n statData.data = [\n {\n value: ensureNumeric(data.sensorUsage),\n },\n {\n value: ensureNumeric(data.sensorUsageAGP),\n },\n ];\n statData.total = { value: ensureNumeric(data.total) };\n statData.dataPaths = {\n summary: 'data.0',\n summaryAGP: 'data.1',\n };\n break;\n\n case commonStats.standardDev:\n statData.data = [\n {\n value: ensureNumeric(data.averageGlucose),\n deviation: {\n value: ensureNumeric(data.standardDeviation),\n },\n },\n ];\n\n statData.dataPaths = {\n summary: 'data.0.deviation',\n title: 'data.0',\n };\n break;\n\n case commonStats.timeInAuto:\n statData.data = [\n {\n id: 'basalAutomated',\n value: ensureNumeric(data.automated),\n title: t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] }),\n legendTitle: vocabulary[AUTOMATED_DELIVERY],\n },\n {\n id: 'basal',\n value: ensureNumeric(data.manual),\n title: t('Time In {{scheduledLabel}}', { scheduledLabel: vocabulary[SCHEDULED_DELIVERY] }),\n legendTitle: vocabulary[SCHEDULED_DELIVERY],\n },\n ];\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'basalAutomated' }),\n ],\n };\n break;\n\n case commonStats.timeInOverride:\n statData.data = _.map(settingsOverrides, override => ({\n id: override,\n value: ensureNumeric(_.get(data, override, 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [override, 'label']) }),\n legendTitle: _.get(vocabulary, [override, 'label']),\n }));\n\n statData.sum = { value: getSum(statData.data) };\n statData.total = { value: MS_IN_DAY };\n statData.dataPaths = {\n summary: 'sum',\n };\n break;\n\n case commonStats.timeInRange:\n statData.data = _.filter([\n (isRangeDefined(data.durations.veryLow) && ({\n id: 'veryLow',\n value: ensureNumeric(data.durations.veryLow),\n title: t('Time Below Range'),\n legendTitle: bgRanges.veryLow,\n })),\n {\n id: 'low',\n value: ensureNumeric(data.durations.low),\n title: t('Time Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.durations.target),\n title: t('Time In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.durations.high),\n title: t('Time Above Range'),\n legendTitle: bgRanges.high,\n },\n (isRangeDefined(data.durations.veryHigh) && ({\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n })),\n ], Boolean);\n\n statData.total = { value: getSum(statData.data) };\n statData.dataPaths = {\n summary: [\n 'data',\n _.findIndex(statData.data, { id: 'target' }),\n ],\n };\n break;\n\n case commonStats.totalInsulin:\n statData.data = [\n {\n id: 'bolus',\n value: ensureNumeric(data.bolus),\n title: t('Bolus Insulin'),\n legendTitle: t('Bolus'),\n },\n {\n id: 'basal',\n value: ensureNumeric(data.basal),\n title: t('Basal Insulin'),\n legendTitle: t('Basal'),\n },\n ];\n\n statData.total = { id: 'insulin', value: getSum(statData.data) };\n statData.dataPaths = {\n summary: 'total',\n title: 'total',\n };\n break;\n\n default:\n statData = undefined;\n break;\n }\n\n return statData;\n};\n\nexport const getStatTitle = (type, opts = {}) => {\n const { bgSource, days } = opts;\n const vocabulary = getPumpVocabulary(opts.manufacturer);\n const bgTypeLabel = bgSource === 'cbg' ? t('Glucose') : t('BG');\n\n let title;\n\n switch (type) {\n case commonStats.averageGlucose:\n title = t('Avg. Glucose ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.averageDailyDose:\n title = (days > 1) ? t('Avg. Daily Insulin') : t('Total Insulin');\n break;\n\n case commonStats.bgExtents:\n title = t('{{bgTypeLabel}} Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource], bgTypeLabel });\n break;\n\n case commonStats.carbs:\n title = (days > 1) ? t('Avg. Daily Carbs') : t('Total Carbs');\n break;\n\n case commonStats.coefficientOfVariation:\n title = t('CV ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.glucoseManagementIndicator:\n title = t('GMI ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.readingsInRange:\n title = (days > 1) ? t('Avg. Daily Readings In Range') : t('Readings In Range');\n break;\n\n case commonStats.sensorUsage:\n title = t('Sensor Usage');\n break;\n\n case commonStats.standardDev:\n title = t('Std. Deviation ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\n break;\n\n case commonStats.timeInAuto:\n title = (days > 1)\n ? t('Avg. Daily Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] })\n : t('Time In {{automatedLabel}}', { automatedLabel: vocabulary[AUTOMATED_DELIVERY] });\n break;\n\n case commonStats.timeInOverride:\n title = (days > 1)\n ? t('Avg. Daily Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] })\n : t('Time In {{overrideLabel}}', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] });\n break;\n\n case commonStats.timeInRange:\n title = (days > 1) ? t('Avg. Daily Time In Range') : t('Time In Range');\n break;\n\n case commonStats.totalInsulin:\n title = (days > 1) ? t('Avg. Daily Total Insulin') : t('Total Insulin');\n break;\n\n default:\n title = '';\n break;\n }\n\n return title;\n};\n\nexport const getStatDefinition = (data = {}, type, opts = {}) => {\n let stat = {\n annotations: getStatAnnotations(data, type, opts),\n collapsible: _.get(opts, 'collapsible', false),\n data: getStatData(data, type, opts),\n id: type,\n title: getStatTitle(type, opts),\n type: statTypes.barHorizontal,\n };\n\n switch (type) {\n case commonStats.averageGlucose:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.averageDailyDose:\n stat.alwaysShowSummary = true;\n stat.dataFormat = {\n output: statFormats.unitsPerKg,\n summary: statFormats.units,\n };\n stat.type = statTypes.input;\n break;\n\n case commonStats.bgExtents:\n stat.dataFormat = {\n label: statFormats.bgValue,\n summary: statFormats.bgValue,\n };\n stat.type = statTypes.simple;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.carbs:\n stat.dataFormat = {\n summary: statFormats.carbs,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.coefficientOfVariation:\n stat.dataFormat = {\n summary: statFormats.cv,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.glucoseManagementIndicator:\n stat.dataFormat = {\n summary: statFormats.gmi,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.readingsInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.bgCount,\n tooltipTitle: statFormats.bgRange,\n count: statFormats.bgCount,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.sensorUsage:\n stat.dataFormat = {\n summary: statFormats.percentage,\n };\n stat.type = statTypes.simple;\n break;\n\n case commonStats.standardDev:\n stat.dataFormat = {\n label: statFormats.standardDevValue,\n summary: statFormats.standardDevValue,\n title: statFormats.standardDevRange,\n };\n stat.type = statTypes.barBg;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.timeInAuto:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n break;\n\n case commonStats.timeInOverride:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n };\n stat.legend = true;\n stat.reverseLegendOrder = true;\n break;\n\n case commonStats.timeInRange:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.percentage,\n tooltip: statFormats.duration,\n tooltipTitle: statFormats.bgRange,\n };\n stat.legend = true;\n stat.hideSummaryUnits = true;\n stat.reverseLegendOrder = true;\n stat.units = _.get(opts, 'bgPrefs.bgUnits');\n break;\n\n case commonStats.totalInsulin:\n stat.alwaysShowTooltips = true;\n stat.dataFormat = {\n label: statFormats.percentage,\n summary: statFormats.units,\n title: statFormats.units,\n tooltip: statFormats.units,\n };\n stat.legend = true;\n break;\n\n default:\n stat = undefined;\n break;\n }\n\n return stat;\n};\n\n/**\n * statsText\n * @param {Object} stats - all stats data\n * @param {Object} textUtil - TextUtil instance\n * @param {Object} bgPrefs - bgPrefs object from blip containing tideline-style bgClasses\n *\n * @return {String} Stats data as a formatted string\n */\nexport function statsText(stats, textUtil, bgPrefs, formatFn = formatDatum) {\n _.defaults(bgPrefs, {\n bgBounds: reshapeBgClassesToBgBounds(bgPrefs),\n });\n\n let statsString = '';\n\n _.each(stats, stat => {\n const renderTable = _.includes([\n commonStats.timeInRange,\n commonStats.readingsInRange,\n commonStats.totalInsulin,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.bgExtents,\n ], stat.id);\n\n const renderSecondaryValue = _.includes([\n commonStats.readingsInRange,\n commonStats.timeInAuto,\n commonStats.timeInOverride,\n commonStats.timeInRange,\n ], stat.id);\n\n const opts = { bgPrefs, data: stat.data, forcePlainTextValues: true };\n let statTitle = `${stat.title}${stat.units ? ` (${stat.units})` : ''}`;\n\n if (stat.id === 'readingsInRange' && stat.data?.raw?.total > 0) {\n statTitle += t(' from {{count}} readings', { count: stat.data.raw.total });\n }\n\n if (renderTable) {\n statsString += textUtil.buildTextTable(\n statTitle,\n _.map(_.reverse([...stat.data.data]), datum => {\n const formatted = formatFn(\n datum,\n stat.dataFormat.summary,\n opts\n );\n\n let formattedText = `${formatted.value}${formatted.suffix || ''}`;\n\n if (renderSecondaryValue) {\n const secondary = formatFn(\n datum,\n stat.dataFormat.tooltip,\n opts\n );\n\n if (stat.id === 'readingsInRange') secondary.suffix += ' readings/day';\n formattedText += ` (${secondary.value}${secondary.suffix || ''})`;\n }\n\n return {\n label: datum.legendTitle || datum.title,\n value: formattedText,\n };\n }),\n [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ],\n { showHeader: false }\n );\n } else {\n const formatted = formatFn(\n _.get(stat.data, stat.data.dataPaths.summary, {}),\n stat.dataFormat.summary,\n opts\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (formatted.value === 0) formatted.value = [formatted.value];\n if (!_.isArray(formatted.value)) formatted.value = _.compact([formatted.value]);\n if (!_.isArray(formatted.suffix)) formatted.suffix = _.compact([formatted.suffix]);\n\n statsString += '\\n';\n statsString += textUtil.buildTextLine({\n label: stat.title,\n value: _.map(formatted.value, (value, i) => `${value}${formatted.suffix[i] || (stat.units ? ` ${stat.units}` : '')}`).join(' '),\n });\n }\n });\n\n return statsString;\n}\n","import Validator from 'fastest-validator';\nimport _ from 'lodash';\nimport { MGDL_UNITS, MMOLL_UNITS, MS_IN_DAY } from '../constants.js';\n\n\nconst v = new Validator({\n messages: {\n missingFieldDependancy: \"Field(s) '{expected}' are expected when field '{field}' exists. Value(s) were {actual}\",\n },\n});\n\n/* eslint-disable no-underscore-dangle */\nv.add('withDependantFields', (value, schema, fieldName, object) => {\n let missingFields = false;\n\n _.each(schema.fields, field => {\n if (!missingFields) {\n missingFields = _.isNil(object[field]);\n }\n });\n\n if (missingFields) {\n return v.makeError('missingFieldDependancy', schema.fields, JSON.stringify(_.pick(object, schema.fields)));\n }\n\n const processedRule = v._processRule(schema.schema, null, false);\n const checkWrapper = v._checkWrapper(processedRule);\n\n return checkWrapper(object[fieldName], processedRule, fieldName);\n});\n\nv.add('objectWithUnknownKeys', (value, schema, fieldName, object) => {\n const errors = [];\n const processedRule = v._processRule(schema.schema, null, false);\n\n _.each(object[fieldName], fieldValue => {\n const checkWrapper = v._checkWrapper(processedRule);\n const result = checkWrapper(fieldValue, processedRule);\n if (result !== true) {\n _.each(result, (item, i) => {\n // Add the field name to the field path for proper error descriptions\n const fieldPath = `${fieldName}${item.field}`;\n result[i].message = item.message.replace(item.field, fieldPath);\n result[i].field = fieldPath;\n });\n\n errors.push(result);\n }\n });\n\n return errors.length ? errors : true;\n});\n/* eslint-enable no-underscore-dangle */\n\nconst patterns = {\n id: /^[A-Za-z0-9\\-_]+$/,\n ISODate: /^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,\n ISODateSince2008: /^((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|((200[89]|20[1-9]\\d)-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))$/,\n deviceTime: /^(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d)$/,\n rejectBadDeviceStatus: /^(?!status\\/unknown-previous).*$/,\n};\n\nconst optional = { optional: true };\nconst forbidden = { type: 'forbidden' };\nconst minZero = { type: 'number', min: 0 };\nconst postiveNumber = { type: 'number', positive: true };\nconst ISODateSince2008 = {\n type: 'string',\n pattern: patterns.ISODateSince2008,\n};\n\nconst validTypes = [\n 'alert',\n 'basal',\n 'bolus',\n 'cbg',\n 'cgmSettings',\n 'controllerSettings',\n 'controllerStatus',\n 'deviceEvent',\n 'dosingDecision',\n 'food',\n 'insulin',\n 'message',\n 'physicalActivity',\n 'pumpSettings',\n 'pumpStatus',\n 'reportedState',\n 'smbg',\n 'upload',\n 'water',\n 'wizard',\n];\n\nconst common = {\n deviceId: { type: 'string', ...optional },\n deviceTime: { type: 'string', pattern: patterns.deviceTime, ...optional },\n id: { type: 'string', pattern: patterns.id },\n time: ISODateSince2008,\n type: { type: 'string', enum: validTypes },\n uploadId: { type: 'string', pattern: patterns.id },\n};\n\nconst basalCommon = {\n deliveryType: { type: 'string', enum: ['scheduled', 'suspend', 'temp', 'automated'] },\n duration: { ...postiveNumber, ...optional },\n rate: minZero,\n};\n\nconst suppressed = { type: 'object', props: basalCommon, ...optional };\n\nconst basal = {\n ...common,\n ...basalCommon,\n suppressed,\n};\n\n// allow pump-shutdown-annotated basals, even if duration is zero, so we can display them.\nconst basalPostShutdown = {\n ...basal,\n annotations: { type: 'array', items: { type: 'object', props: { code: { type: 'string', value: 'pump-shutdown' } } } },\n duration: { ...minZero, ...optional },\n suppressed: { ...suppressed, props: { ...suppressed.props, duration: { ...minZero, ...optional } } },\n};\n\nconst normalBolus = {\n ...common,\n normal: minZero,\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal'],\n ...optional,\n },\n duration: forbidden,\n extended: forbidden,\n expectedExtended: forbidden,\n subType: { type: 'string', enum: ['normal', 'automated'] },\n wizard: { type: 'string', pattern: patterns.id, ...optional },\n};\n\nconst extendedBolus = {\n ...common,\n duration: minZero,\n expectedDuration: { ...minZero, ...optional },\n extended: minZero,\n expectedExtended: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['extended', 'duration', 'expectedDuration'],\n ...optional,\n },\n normal: { ...minZero, ...optional },\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal'],\n ...optional,\n },\n subType: { type: 'string', enum: ['square'] },\n wizard: { type: 'string', pattern: patterns.id, ...optional },\n};\n\nconst combinationBolus = {\n ...extendedBolus,\n subType: { type: 'string', enum: ['dual/square'] },\n expectedNormal: {\n type: 'withDependantFields',\n schema: { ...minZero, ...optional },\n fields: ['normal', 'duration', 'expectedDuration', 'extended', 'expectedExtended'],\n ...optional,\n },\n};\n\nconst bg = {\n ...common,\n value: postiveNumber,\n units: { type: 'string', enum: [MGDL_UNITS, MMOLL_UNITS] },\n};\n\nconst cbg = {\n ...bg,\n sampleInterval: postiveNumber,\n};\n\nconst deviceEvent = {\n ...common,\n annotations: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n code: { type: 'string', pattern: patterns.rejectBadDeviceStatus },\n },\n },\n ...optional,\n },\n};\n\nconst message = {\n id: { type: 'string', pattern: patterns.id },\n time: ISODateSince2008,\n parentMessage: [\n { type: 'string', pattern: patterns.id, ...optional },\n { type: 'enum', values: [null], ...optional },\n ],\n};\n\nconst settingsScheduleStart = {\n start: { ...minZero, max: MS_IN_DAY },\n};\n\nconst basalSchedules = {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n rate: minZero,\n },\n },\n },\n};\n\nconst carbRatio = {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n amount: minZero,\n },\n },\n};\n\nconst insulinSensitivity = {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n amount: minZero,\n },\n },\n};\n\nconst pumpSettingsAnimas = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: minZero,\n low: forbidden,\n high: forbidden,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsMedtronic = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsOmnipod = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: forbidden,\n low: forbidden,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsTandem = {\n ...common,\n bgTargets: {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: minZero,\n range: forbidden,\n low: forbidden,\n high: forbidden,\n },\n },\n },\n },\n carbRatios: {\n type: 'objectWithUnknownKeys',\n schema: carbRatio,\n },\n insulinSensitivities: {\n type: 'objectWithUnknownKeys',\n schema: insulinSensitivity,\n },\n basalSchedules,\n};\n\nconst pumpSettingsEquil = {\n ...common,\n bgTarget: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n carbRatio,\n insulinSensitivity,\n basalSchedules,\n};\n\nconst pumpSettingsLoop = {\n ...common,\n bgTargets: {\n type: 'objectWithUnknownKeys',\n schema: {\n type: 'array',\n items: {\n type: 'object',\n props: {\n ...settingsScheduleStart,\n target: forbidden,\n range: forbidden,\n low: minZero,\n high: minZero,\n },\n },\n },\n },\n carbRatios: {\n type: 'objectWithUnknownKeys',\n schema: carbRatio,\n },\n insulinSensitivities: {\n type: 'objectWithUnknownKeys',\n schema: insulinSensitivity,\n },\n basalSchedules,\n};\n\nconst wizard = {\n ...common,\n bgInput: { ...minZero, ...optional },\n bolus: { type: 'string', pattern: patterns.id },\n carbInput: { ...minZero, ...optional },\n insulinCarbRatio: { ...minZero, ...optional },\n insulinOnBoard: { ...minZero, ...optional },\n insulinSensitivity: { ...minZero, ...optional },\n recommended: {\n type: 'object',\n props: {\n carb: { ...minZero, ...optional },\n correction: { type: 'number', ...optional },\n net: { type: 'number', ...optional },\n },\n ...optional,\n },\n};\n\nexport default {\n basal: {\n basal: v.compile(basal),\n postShutdown: v.compile(basalPostShutdown),\n },\n bolus: {\n normal: v.compile(normalBolus),\n extended: v.compile(extendedBolus),\n combination: v.compile(combinationBolus),\n },\n cbg: v.compile(cbg),\n common: v.compile(common),\n deviceEvent: v.compile(deviceEvent),\n message: v.compile(message),\n pumpSettings: {\n animas: v.compile(pumpSettingsAnimas),\n medtronic: v.compile(pumpSettingsMedtronic),\n omnipod: v.compile(pumpSettingsOmnipod),\n tandem: v.compile(pumpSettingsTandem),\n equil: v.compile(pumpSettingsEquil),\n 'diy loop': v.compile(pumpSettingsLoop),\n 'tidepool loop': v.compile(pumpSettingsLoop),\n twiist: v.compile(pumpSettingsLoop),\n },\n smbg: v.compile(bg),\n wizard: v.compile(wizard),\n};\n","let array8 = arrayUntyped,\n array16 = arrayUntyped,\n array32 = arrayUntyped,\n arrayLengthen = arrayLengthenUntyped,\n arrayWiden = arrayWidenUntyped;\nif (typeof Uint8Array !== \"undefined\") {\n array8 = function(n) { return new Uint8Array(n); };\n array16 = function(n) { return new Uint16Array(n); };\n array32 = function(n) { return new Uint32Array(n); };\n\n arrayLengthen = function(array, length) {\n if (array.length >= length) return array;\n var copy = new array.constructor(length);\n copy.set(array);\n return copy;\n };\n\n arrayWiden = function(array, width) {\n var copy;\n switch (width) {\n case 16: copy = array16(array.length); break;\n case 32: copy = array32(array.length); break;\n default: throw new Error(\"invalid array width!\");\n }\n copy.set(array);\n return copy;\n };\n}\n\nfunction arrayUntyped(n) {\n var array = new Array(n), i = -1;\n while (++i < n) array[i] = 0;\n return array;\n}\n\nfunction arrayLengthenUntyped(array, length) {\n var n = array.length;\n while (n < length) array[n++] = 0;\n return array;\n}\n\nfunction arrayWidenUntyped(array, width) {\n if (width > 32) throw new Error(\"invalid array width!\");\n return array;\n}\n\n// An arbitrarily-wide array of bitmasks\nfunction bitarray(n) {\n this.length = n;\n this.subarrays = 1;\n this.width = 8;\n this.masks = {\n 0: 0\n }\n\n this[0] = array8(n);\n}\n\nbitarray.prototype.lengthen = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i] = arrayLengthen(this[i], n);\n }\n this.length = n;\n};\n\n// Reserve a new bit index in the array, returns {offset, one}\nbitarray.prototype.add = function() {\n var m, w, one, i, len;\n\n for (i = 0, len = this.subarrays; i < len; ++i) {\n m = this.masks[i];\n w = this.width - (32 * i);\n // isolate the rightmost zero bit and return it as an unsigned int of 32 bits, if NaN or -1, return a 0 \n one = (~m & (m + 1)) >>> 0;\n\n if (w >= 32 && !one) {\n continue;\n }\n\n if (w < 32 && (one & (1 << w))) {\n // widen this subarray\n this[i] = arrayWiden(this[i], w <<= 1);\n this.width = 32 * i + w;\n }\n\n this.masks[i] |= one;\n\n return {\n offset: i,\n one: one\n };\n }\n\n // add a new subarray\n this[this.subarrays] = array8(this.length);\n this.masks[this.subarrays] = 1;\n this.width += 8;\n return {\n offset: this.subarrays++,\n one: 1\n };\n};\n\n// Copy record from index src to index dest\nbitarray.prototype.copy = function(dest, src) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n this[i][dest] = this[i][src];\n }\n};\n\n// Truncate the array to the given length\nbitarray.prototype.truncate = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n for (var j = this.length - 1; j >= n; j--) {\n this[i][j] = 0;\n }\n }\n this.length = n;\n};\n\n// Checks that all bits for the given index are 0\nbitarray.prototype.zero = function(n) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for possibly one\nbitarray.prototype.zeroExcept = function(n, offset, zero) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (i === offset ? this[i][n] & zero : this[i][n]) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that all bits for the given index are 0 except for the specified mask.\n// The mask should be an array of the same size as the filter subarrays width.\nbitarray.prototype.zeroExceptMask = function(n, mask) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] & mask[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks that only the specified bit is set for the given index\nbitarray.prototype.only = function(n, offset, one) {\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n if (this[i][n] != (i === offset ? one : 0)) {\n return false;\n }\n }\n return true;\n};\n\n// Checks that only the specified bit is set for the given index except for possibly one other\nbitarray.prototype.onlyExcept = function(n, offset, zero, onlyOffset, onlyOne) {\n var mask;\n var i, len;\n for (i = 0, len = this.subarrays; i < len; ++i) {\n mask = this[i][n];\n if (i === offset)\n mask = (mask & zero) >>> 0;\n if (mask != (i === onlyOffset ? onlyOne : 0)) {\n return false;\n }\n }\n return true;\n};\n\nexport default {\n array8: arrayUntyped,\n array16: arrayUntyped,\n array32: arrayUntyped,\n arrayLengthen: arrayLengthenUntyped,\n arrayWiden: arrayWidenUntyped,\n bitarray: bitarray\n};\n","const filterExact = (bisect, value) => {\n return function(values) {\n var n = values.length;\n return [bisect.left(values, value, 0, n), bisect.right(values, value, 0, n)];\n };\n}\n\nconst filterRange = (bisect, range) => {\n var min = range[0],\n max = range[1];\n return function(values) {\n var n = values.length;\n return [bisect.left(values, min, 0, n), bisect.left(values, max, 0, n)];\n };\n}\n\nconst filterAll = values => {\n return [0, values.length];\n}\n\nexport default {\n filterExact,\n filterRange,\n filterAll\n};\n","export default d => {\n return d;\n};\n","export default () => {\n return null;\n}\n","export default () => {\n return 0;\n}\n","import identity from './identity';\n\nfunction heap_by(f) {\n\n // Builds a binary heap within the specified array a[lo:hi]. The heap has the\n // property such that the parent a[lo+i] is always less than or equal to its\n // two children: a[lo+2*i+1] and a[lo+2*i+2].\n function heap(a, lo, hi) {\n var n = hi - lo,\n i = (n >>> 1) + 1;\n while (--i > 0) sift(a, i, n, lo);\n return a;\n }\n\n // Sorts the specified array a[lo:hi] in descending order, assuming it is\n // already a heap.\n function sort(a, lo, hi) {\n var n = hi - lo,\n t;\n while (--n > 0) t = a[lo], a[lo] = a[lo + n], a[lo + n] = t, sift(a, 1, n, lo);\n return a;\n }\n\n // Sifts the element a[lo+i-1] down the heap, where the heap is the contiguous\n // slice of array a[lo:lo+n]. This method can also be used to update the heap\n // incrementally, without incurring the full cost of reconstructing the heap.\n function sift(a, i, n, lo) {\n var d = a[--lo + i],\n x = f(d),\n child;\n while ((child = i << 1) <= n) {\n if (child < n && f(a[lo + child]) > f(a[lo + child + 1])) child++;\n if (x <= f(a[lo + child])) break;\n a[lo + i] = a[lo + child];\n i = child;\n }\n a[lo + i] = d;\n }\n\n heap.sort = sort;\n return heap;\n}\n\nconst h = heap_by(identity);\nh.by = heap_by;\n\nexport default h;\n","import identity from './identity';\nimport xFilterHeap from './heap';\n\nfunction heapselect_by(f) {\n var heap = xFilterHeap.by(f);\n\n // Returns a new array containing the top k elements in the array a[lo:hi].\n // The returned array is not sorted, but maintains the heap property. If k is\n // greater than hi - lo, then fewer than k elements will be returned. The\n // order of elements in a is unchanged by this operation.\n function heapselect(a, lo, hi, k) {\n var queue = new Array(k = Math.min(hi - lo, k)),\n min,\n i,\n d;\n\n for (i = 0; i < k; ++i) queue[i] = a[lo++];\n heap(queue, 0, k);\n\n if (lo < hi) {\n min = f(queue[0]);\n do {\n if (f(d = a[lo]) > min) {\n queue[0] = d;\n min = f(heap(queue, 0, k)[0]);\n }\n } while (++lo < hi);\n }\n\n return queue;\n }\n\n return heapselect;\n}\n\n\nconst h = heapselect_by(identity);\nh.by = heapselect_by; // assign the raw function to the export as well\n\nexport default h;\n","import identity from './identity';\n\nfunction bisect_by(f) {\n\n // Locate the insertion point for x in a to maintain sorted order. The\n // arguments lo and hi may be used to specify a subset of the array which\n // should be considered; by default the entire array is used. If x is already\n // present in a, the insertion point will be before (to the left of) any\n // existing entries. The return value is suitable for use as the first\n // argument to `array.splice` assuming that a is already sorted.\n //\n // The returned insertion point i partitions the array a into two halves so\n // that all v < x for v in a[lo:i] for the left side and all v >= x for v in\n // a[i:hi] for the right side.\n function bisectLeft(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (f(a[mid]) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n // Similar to bisectLeft, but returns an insertion point which comes after (to\n // the right of) any existing entries of x in a.\n //\n // The returned insertion point i partitions the array into two halves so that\n // all v <= x for v in a[lo:i] for the left side and all v > x for v in\n // a[i:hi] for the right side.\n function bisectRight(a, x, lo, hi) {\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (x < f(a[mid])) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n\n bisectRight.right = bisectRight;\n bisectRight.left = bisectLeft;\n return bisectRight;\n}\n\nconst bisect = bisect_by(identity);\nbisect.by = bisect_by; // assign the raw function to the export as well\n\nexport default bisect;\n\n","export default (array, index, deep) => {\n for (var i = 0, n = index.length, copy = deep ? JSON.parse(JSON.stringify(array)) : new Array(n); i < n; ++i) {\n copy[i] = array[index[i]];\n }\n return copy;\n}\n","const reduceIncrement = p => {\n return p + 1;\n}\n\nconst reduceDecrement = p => {\n return p - 1;\n}\n\nconst reduceAdd = f => {\n return function(p, v) {\n return p + +f(v);\n };\n}\n\nconst reduceSubtract = f => {\n return function(p, v) {\n return p - f(v);\n };\n}\n\nexport default {\n reduceIncrement,\n reduceDecrement,\n reduceAdd,\n reduceSubtract\n};\n","import deep from \"@ranfdev/deepobj\"\n// Note(cg): result was previsouly using lodash.result, not ESM compatible.\n \nconst get = (obj, prop) => {\n const value = obj[prop];\n return (typeof value === 'function') ? value.call(obj) : value;\n}\n\n/**\n * get value of object at a deep path.\n * if the resolved value is a function,\n * it's invoked with the `this` binding of \n * its parent object and its result is returned. \n * \n * @param {Object} obj the object (e.g. { 'a': [{ 'b': { 'c1': 3, 'c2': 4} }], 'd': {e:1} }; )\n * @param {String} path deep path (e.g. `d.e`` or `a[0].b.c1`. Dot notation (a.0.b)is also supported)\n * @return {Any} the resolved value\n */\nconst reg = /\\[([\\w\\d]+)\\]/g;\nexport default (obj, path) => {\n return deep(get, obj, path.replace(reg, '.$1'))\n}\n","import xfilterArray from './array';\nimport xfilterFilter from './filter';\nimport cr_identity from './identity';\nimport cr_null from './null';\nimport cr_zero from './zero';\nimport xfilterHeapselect from './heapselect';\nimport xfilterHeap from './heap';\nimport bisect from './bisect';\nimport permute from './permute';\nimport xfilterReduce from './reduce';\nimport result from './result';\n\n// constants\nvar REMOVED_INDEX = -1;\n\ncrossfilter.heap = xfilterHeap;\ncrossfilter.heapselect = xfilterHeapselect;\ncrossfilter.bisect = bisect;\ncrossfilter.permute = permute;\nexport default crossfilter;\n\nfunction crossfilter() {\n var crossfilter = {\n add: add,\n remove: removeData,\n dimension: dimension,\n groupAll: groupAll,\n size: size,\n all: all,\n allFiltered: allFiltered,\n onChange: onChange,\n isElementFiltered: isElementFiltered\n };\n\n var data = [], // the records\n n = 0, // the number of records; data.length\n filters, // 1 is filtered out\n filterListeners = [], // when the filters change\n dataListeners = [], // when data is added\n removeDataListeners = [], // when data is removed\n callbacks = [];\n\n filters = new xfilterArray.bitarray(0);\n\n // Adds the specified new records to this crossfilter.\n function add(newData) {\n var n0 = n,\n n1 = newData.length;\n\n // If there's actually new data to add…\n // Merge the new data into the existing data.\n // Lengthen the filter bitset to handle the new records.\n // Notify listeners (dimensions and groups) that new data is available.\n if (n1) {\n data = data.concat(newData);\n filters.lengthen(n += n1);\n dataListeners.forEach(function(l) { l(newData, n0, n1); });\n triggerOnChange('dataAdded');\n }\n\n return crossfilter;\n }\n\n // Removes all records that match the current filters, or if a predicate function is passed,\n // removes all records matching the predicate (ignoring filters).\n function removeData(predicate) {\n var // Mapping from old record indexes to new indexes (after records removed)\n newIndex = new Array(n),\n removed = [],\n usePred = typeof predicate === 'function',\n shouldRemove = function (i) {\n return usePred ? predicate(data[i], i) : filters.zero(i)\n };\n\n for (var index1 = 0, index2 = 0; index1 < n; ++index1) {\n if ( shouldRemove(index1) ) {\n removed.push(index1);\n newIndex[index1] = REMOVED_INDEX;\n } else {\n newIndex[index1] = index2++;\n }\n }\n\n // Remove all matching records from groups.\n filterListeners.forEach(function(l) { l(-1, -1, [], removed, true); });\n\n // Update indexes.\n removeDataListeners.forEach(function(l) { l(newIndex); });\n\n // Remove old filters and data by overwriting.\n for (var index3 = 0, index4 = 0; index3 < n; ++index3) {\n if ( newIndex[index3] !== REMOVED_INDEX ) {\n if (index3 !== index4) filters.copy(index4, index3), data[index4] = data[index3];\n ++index4;\n }\n }\n\n data.length = n = index4;\n filters.truncate(index4);\n triggerOnChange('dataRemoved');\n }\n\n function maskForDimensions(dimensions) {\n var n,\n d,\n len,\n id,\n mask = Array(filters.subarrays);\n for (n = 0; n < filters.subarrays; n++) { mask[n] = ~0; }\n for (d = 0, len = dimensions.length; d < len; d++) {\n // The top bits of the ID are the subarray offset and the lower bits are the bit\n // offset of the \"one\" mask.\n id = dimensions[d].id();\n mask[id >> 7] &= ~(0x1 << (id & 0x3f));\n }\n return mask;\n }\n\n // Return true if the data element at index i is filtered IN.\n // Optionally, ignore the filters of any dimensions in the ignore_dimensions list.\n function isElementFiltered(i, ignore_dimensions) {\n var mask = maskForDimensions(ignore_dimensions || []);\n return filters.zeroExceptMask(i,mask);\n }\n\n // Adds a new dimension with the specified value accessor function.\n function dimension(value, iterable) {\n\n if (typeof value === 'string') {\n var accessorPath = value;\n value = function(d) { return result(d, accessorPath); };\n }\n\n var dimension = {\n filter: filter,\n filterExact: filterExact,\n filterRange: filterRange,\n filterFunction: filterFunction,\n filterAll: filterAll,\n currentFilter: currentFilter,\n hasCurrentFilter: hasCurrentFilter,\n top: top,\n bottom: bottom,\n group: group,\n groupAll: groupAll,\n dispose: dispose,\n remove: dispose, // for backwards-compatibility\n accessor: value,\n id: function() { return id; }\n };\n\n var one, // lowest unset bit as mask, e.g., 00001000\n zero, // inverted one, e.g., 11110111\n offset, // offset into the filters arrays\n id, // unique ID for this dimension (reused when dimensions are disposed)\n values, // sorted, cached array\n index, // maps sorted value index -> record index (in data)\n newValues, // temporary array storing newly-added values\n newIndex, // temporary array storing newly-added index\n iterablesIndexCount,\n iterablesIndexFilterStatus,\n iterablesEmptyRows = [],\n sortRange = function(n) {\n return cr_range(n).sort(function(A, B) {\n var a = newValues[A], b = newValues[B];\n return a < b ? -1 : a > b ? 1 : A - B;\n });\n },\n refilter = xfilterFilter.filterAll, // for recomputing filter\n refilterFunction, // the custom filter function in use\n filterValue, // the value used for filtering (value, array, function or undefined)\n filterValuePresent, // true if filterValue contains something\n indexListeners = [], // when data is added\n dimensionGroups = [],\n lo0 = 0,\n hi0 = 0,\n t = 0,\n k;\n\n // Updating a dimension is a two-stage process. First, we must update the\n // associated filters for the newly-added records. Once all dimensions have\n // updated their filters, the groups are notified to update.\n dataListeners.unshift(preAdd);\n dataListeners.push(postAdd);\n\n removeDataListeners.push(removeData);\n\n // Add a new dimension in the filter bitmap and store the offset and bitmask.\n var tmp = filters.add();\n offset = tmp.offset;\n one = tmp.one;\n zero = ~one;\n\n // Create a unique ID for the dimension\n // IDs will be re-used if dimensions are disposed.\n // For internal use the ID is the subarray offset shifted left 7 bits or'd with the\n // bit offset of the set bit in the dimension's \"one\" mask.\n id = (offset << 7) | (Math.log(one) / Math.log(2));\n\n preAdd(data, 0, n);\n postAdd(data, 0, n);\n\n // Incorporates the specified new records into this dimension.\n // This function is responsible for updating filters, values, and index.\n function preAdd(newData, n0, n1) {\n var newIterablesIndexCount,\n newIterablesIndexFilterStatus;\n\n if (iterable){\n // Count all the values\n t = 0;\n j = 0;\n k = [];\n\n for (var i0 = 0; i0 < newData.length; i0++) {\n for(j = 0, k = value(newData[i0]); j < k.length; j++) {\n t++;\n }\n }\n\n newValues = [];\n newIterablesIndexCount = cr_range(newData.length);\n newIterablesIndexFilterStatus = cr_index(t,1);\n var unsortedIndex = cr_range(t);\n\n for (var l = 0, index1 = 0; index1 < newData.length; index1++) {\n k = value(newData[index1])\n //\n if(!k.length){\n newIterablesIndexCount[index1] = 0;\n iterablesEmptyRows.push(index1 + n0);\n continue;\n }\n newIterablesIndexCount[index1] = k.length\n for (j = 0; j < k.length; j++) {\n newValues.push(k[j]);\n unsortedIndex[l] = index1;\n l++;\n }\n }\n\n // Create the Sort map used to sort both the values and the valueToData indices\n var sortMap = sortRange(t);\n\n // Use the sortMap to sort the newValues\n newValues = permute(newValues, sortMap);\n\n\n // Use the sortMap to sort the unsortedIndex map\n // newIndex should be a map of sortedValue -> crossfilterData\n newIndex = permute(unsortedIndex, sortMap)\n\n } else{\n // Permute new values into natural order using a standard sorted index.\n newValues = newData.map(value);\n newIndex = sortRange(n1);\n newValues = permute(newValues, newIndex);\n }\n\n // Bisect newValues to determine which new records are selected.\n var bounds = refilter(newValues), lo1 = bounds[0], hi1 = bounds[1];\n\n var index2, index3, index4;\n if(iterable) {\n n1 = t;\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n if(--newIterablesIndexCount[newIndex[index2]] === 0) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index2] = 1;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n if(--newIterablesIndexCount[newIndex[index3]] === 0) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index3] = 1;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n if(--newIterablesIndexCount[newIndex[index4]] === 0) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n newIterablesIndexFilterStatus[index4] = 1;\n }\n }\n } else {\n if (refilterFunction) {\n for (index2 = 0; index2 < n1; ++index2) {\n if (!refilterFunction(newValues[index2], index2)) {\n filters[offset][newIndex[index2] + n0] |= one;\n }\n }\n } else {\n for (index3 = 0; index3 < lo1; ++index3) {\n filters[offset][newIndex[index3] + n0] |= one;\n }\n for (index4 = hi1; index4 < n1; ++index4) {\n filters[offset][newIndex[index4] + n0] |= one;\n }\n }\n }\n\n // If this dimension previously had no data, then we don't need to do the\n // more expensive merge operation; use the new values and index as-is.\n if (!n0) {\n values = newValues;\n index = newIndex;\n iterablesIndexCount = newIterablesIndexCount;\n iterablesIndexFilterStatus = newIterablesIndexFilterStatus;\n lo0 = lo1;\n hi0 = hi1;\n return;\n }\n\n\n\n var oldValues = values,\n oldIndex = index,\n oldIterablesIndexFilterStatus = iterablesIndexFilterStatus,\n old_n0,\n i1 = 0;\n\n i0 = 0;\n\n if(iterable){\n old_n0 = n0\n n0 = oldValues.length;\n n1 = t\n }\n\n // Otherwise, create new arrays into which to merge new and old.\n values = iterable ? new Array(n0 + n1) : new Array(n);\n index = iterable ? new Array(n0 + n1) : cr_index(n, n);\n if(iterable) iterablesIndexFilterStatus = cr_index(n0 + n1, 1);\n\n // Concatenate the newIterablesIndexCount onto the old one.\n if(iterable) {\n var oldiiclength = iterablesIndexCount.length;\n iterablesIndexCount = xfilterArray.arrayLengthen(iterablesIndexCount, n);\n for(var j=0; j+oldiiclength < n; j++) {\n iterablesIndexCount[j+oldiiclength] = newIterablesIndexCount[j];\n }\n }\n\n // Merge the old and new sorted values, and old and new index.\n var index5 = 0;\n for (; i0 < n0 && i1 < n1; ++index5) {\n if (oldValues[i0] < newValues[i1]) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0++];\n } else {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1++] + (iterable ? old_n0 : n0);\n }\n }\n\n // Add any remaining old values.\n for (; i0 < n0; ++i0, ++index5) {\n values[index5] = oldValues[i0];\n if(iterable) iterablesIndexFilterStatus[index5] = oldIterablesIndexFilterStatus[i0];\n index[index5] = oldIndex[i0];\n }\n\n // Add any remaining new values.\n for (; i1 < n1; ++i1, ++index5) {\n values[index5] = newValues[i1];\n if(iterable) iterablesIndexFilterStatus[index5] = newIterablesIndexFilterStatus[i1];\n index[index5] = newIndex[i1] + (iterable ? old_n0 : n0);\n }\n\n // Bisect again to recompute lo0 and hi0.\n bounds = refilter(values), lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // When all filters have updated, notify index listeners of the new values.\n function postAdd(newData, n0, n1) {\n indexListeners.forEach(function(l) { l(newValues, newIndex, n0, n1); });\n newValues = newIndex = null;\n }\n\n function removeData(reIndex) {\n if (iterable) {\n for (var i0 = 0, i1 = 0; i0 < iterablesEmptyRows.length; i0++) {\n if (reIndex[iterablesEmptyRows[i0]] !== REMOVED_INDEX) {\n iterablesEmptyRows[i1] = reIndex[iterablesEmptyRows[i0]];\n i1++;\n }\n }\n iterablesEmptyRows.length = i1;\n for (i0 = 0, i1 = 0; i0 < n; i0++) {\n if (reIndex[i0] !== REMOVED_INDEX) {\n if (i1 !== i0) iterablesIndexCount[i1] = iterablesIndexCount[i0];\n i1++;\n }\n }\n iterablesIndexCount = iterablesIndexCount.slice(0, i1);\n }\n // Rewrite our index, overwriting removed values\n var n0 = values.length;\n for (var i = 0, j = 0, oldDataIndex; i < n0; ++i) {\n oldDataIndex = index[i];\n if (reIndex[oldDataIndex] !== REMOVED_INDEX) {\n if (i !== j) values[j] = values[i];\n index[j] = reIndex[oldDataIndex];\n if (iterable) {\n iterablesIndexFilterStatus[j] = iterablesIndexFilterStatus[i];\n }\n ++j;\n }\n }\n values.length = j;\n if (iterable) iterablesIndexFilterStatus = iterablesIndexFilterStatus.slice(0, j);\n while (j < n0) index[j++] = 0;\n\n // Bisect again to recompute lo0 and hi0.\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n }\n\n // Updates the selected values based on the specified bounds [lo, hi].\n // This implementation is used by all the public filter methods.\n function filterIndexBounds(bounds) {\n\n var lo1 = bounds[0],\n hi1 = bounds[1];\n\n if (refilterFunction) {\n refilterFunction = null;\n filterIndexFunction(function(d, i) { return lo1 <= i && i < hi1; }, bounds[0] === 0 && bounds[1] === values.length);\n lo0 = lo1;\n hi0 = hi1;\n return dimension;\n }\n\n var i,\n j,\n k,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [];\n\n\n // Fast incremental update based on previous lo index.\n if (lo1 < lo0) {\n for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (lo1 > lo0) {\n for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n // Fast incremental update based on previous hi index.\n if (hi1 > hi0) {\n for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n }\n } else if (hi1 < hi0) {\n for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n\n if(!iterable) {\n // Flip filters normally.\n\n for(i=0; i<added.length; i++) {\n filters[offset][added[i]] ^= one;\n }\n\n for(i=0; i<removed.length; i++) {\n filters[offset][removed[i]] ^= one;\n }\n\n } else {\n // For iterables, we need to figure out if the row has been completely removed vs partially included\n // Only count a row as added if it is not already being aggregated. Only count a row\n // as removed if the last element being aggregated is removed.\n\n var newAdded = [];\n var newRemoved = [];\n for (i = 0; i < added.length; i++) {\n iterablesIndexCount[added[i]]++\n iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;\n if(iterablesIndexCount[added[i]] === 1) {\n filters[offset][added[i]] ^= one;\n newAdded.push(added[i]);\n }\n }\n for (i = 0; i < removed.length; i++) {\n iterablesIndexCount[removed[i]]--\n iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;\n if(iterablesIndexCount[removed[i]] === 0) {\n filters[offset][removed[i]] ^= one;\n newRemoved.push(removed[i]);\n }\n }\n\n added = newAdded;\n removed = newRemoved;\n\n // Now handle empty rows.\n if(refilter === xfilterFilter.filterAll) {\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if((filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was not in the filter, so set the filter and add\n filters[offset][k] ^= one;\n added.push(k);\n }\n }\n } else {\n // filter in place - remove empty rows if necessary\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was in the filter, so set the filter and remove\n filters[offset][k] ^= one;\n removed.push(k);\n }\n }\n }\n }\n\n lo0 = lo1;\n hi0 = hi1;\n filterListeners.forEach(function(l) { l(one, offset, added, removed); });\n triggerOnChange('filtered');\n return dimension;\n }\n\n // Filters this dimension using the specified range, value, or null.\n // If the range is null, this is equivalent to filterAll.\n // If the range is an array, this is equivalent to filterRange.\n // Otherwise, this is equivalent to filterExact.\n function filter(range) {\n return range == null\n ? filterAll() : Array.isArray(range)\n ? filterRange(range) : typeof range === \"function\"\n ? filterFunction(range)\n : filterExact(range);\n }\n\n // Filters this dimension to select the exact value.\n function filterExact(value) {\n filterValue = value;\n filterValuePresent = true;\n return filterIndexBounds((refilter = xfilterFilter.filterExact(bisect, value))(values));\n }\n\n // Filters this dimension to select the specified range [lo, hi].\n // The lower bound is inclusive, and the upper bound is exclusive.\n function filterRange(range) {\n filterValue = range;\n filterValuePresent = true;\n return filterIndexBounds((refilter = xfilterFilter.filterRange(bisect, range))(values));\n }\n\n // Clears any filters on this dimension.\n function filterAll() {\n filterValue = undefined;\n filterValuePresent = false;\n return filterIndexBounds((refilter = xfilterFilter.filterAll)(values));\n }\n\n // Filters this dimension using an arbitrary function.\n function filterFunction(f) {\n filterValue = f;\n filterValuePresent = true;\n\n refilterFunction = f;\n refilter = xfilterFilter.filterAll;\n\n filterIndexFunction(f, false);\n\n var bounds = refilter(values);\n lo0 = bounds[0], hi0 = bounds[1];\n\n return dimension;\n }\n\n function filterIndexFunction(f, filterAll) {\n var i,\n k,\n x,\n added = [],\n removed = [],\n valueIndexAdded = [],\n valueIndexRemoved = [],\n indexLength = values.length;\n\n if(!iterable) {\n for (i = 0; i < indexLength; ++i) {\n if (!(filters[offset][k = index[i]] & one) ^ !!(x = f(values[i], i))) {\n if (x) added.push(k);\n else removed.push(k);\n }\n }\n }\n\n if(iterable) {\n for(i=0; i < indexLength; ++i) {\n if(f(values[i], i)) {\n added.push(index[i]);\n valueIndexAdded.push(i);\n } else {\n removed.push(index[i]);\n valueIndexRemoved.push(i);\n }\n }\n }\n\n if(!iterable) {\n for(i=0; i<added.length; i++) {\n if(filters[offset][added[i]] & one) filters[offset][added[i]] &= zero;\n }\n\n for(i=0; i<removed.length; i++) {\n if(!(filters[offset][removed[i]] & one)) filters[offset][removed[i]] |= one;\n }\n } else {\n\n var newAdded = [];\n var newRemoved = [];\n for (i = 0; i < added.length; i++) {\n // First check this particular value needs to be added\n if(iterablesIndexFilterStatus[valueIndexAdded[i]] === 1) {\n iterablesIndexCount[added[i]]++\n iterablesIndexFilterStatus[valueIndexAdded[i]] = 0;\n if(iterablesIndexCount[added[i]] === 1) {\n filters[offset][added[i]] ^= one;\n newAdded.push(added[i]);\n }\n }\n }\n for (i = 0; i < removed.length; i++) {\n // First check this particular value needs to be removed\n if(iterablesIndexFilterStatus[valueIndexRemoved[i]] === 0) {\n iterablesIndexCount[removed[i]]--\n iterablesIndexFilterStatus[valueIndexRemoved[i]] = 1;\n if(iterablesIndexCount[removed[i]] === 0) {\n filters[offset][removed[i]] ^= one;\n newRemoved.push(removed[i]);\n }\n }\n }\n\n added = newAdded;\n removed = newRemoved;\n\n // Now handle empty rows.\n if(filterAll) {\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if((filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was not in the filter, so set the filter and add\n filters[offset][k] ^= one;\n added.push(k);\n }\n }\n } else {\n // filter in place - remove empty rows if necessary\n for(i = 0; i < iterablesEmptyRows.length; i++) {\n if(!(filters[offset][k = iterablesEmptyRows[i]] & one)) {\n // Was in the filter, so set the filter and remove\n filters[offset][k] ^= one;\n removed.push(k);\n }\n }\n }\n }\n\n filterListeners.forEach(function(l) { l(one, offset, added, removed); });\n triggerOnChange('filtered');\n }\n\n function currentFilter() {\n return filterValue;\n }\n\n function hasCurrentFilter() {\n return filterValuePresent;\n }\n\n // Returns the top K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function top(k, top_offset) {\n var array = [],\n i = hi0,\n j,\n toSkip = 0;\n\n if(top_offset && top_offset > 0) toSkip = top_offset;\n\n while (--i >= lo0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n\n if(iterable){\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n // Add row with empty iterable column at the end\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n return array;\n }\n\n // Returns the bottom K selected records based on this dimension's order.\n // Note: observes this dimension's filter, unlike group and groupAll.\n function bottom(k, bottom_offset) {\n var array = [],\n i,\n j,\n toSkip = 0;\n\n if(bottom_offset && bottom_offset > 0) toSkip = bottom_offset;\n\n if(iterable) {\n // Add row with empty iterable column at the top\n for(i = 0; i < iterablesEmptyRows.length && k > 0; i++) {\n if(filters.zero(j = iterablesEmptyRows[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n }\n }\n\n i = lo0;\n\n while (i < hi0 && k > 0) {\n if (filters.zero(j = index[i])) {\n if(toSkip > 0) {\n //skip matching row\n --toSkip;\n } else {\n array.push(data[j]);\n --k;\n }\n }\n i++;\n }\n\n return array;\n }\n\n // Adds a new group to this dimension, using the specified key function.\n function group(key) {\n var group = {\n top: top,\n all: all,\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n order: order,\n orderNatural: orderNatural,\n size: size,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n // Ensure that this group will be removed when the dimension is removed.\n dimensionGroups.push(group);\n\n var groups, // array of {key, value}\n groupIndex, // object id ↦ group id\n groupWidth = 8,\n groupCapacity = capacity(groupWidth),\n k = 0, // cardinality\n select,\n heap,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n update = cr_null,\n reset = cr_null,\n resetNeeded = true,\n groupAll = key === cr_null,\n n0old;\n\n if (arguments.length < 1) key = cr_identity;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the associated reduce values. It must also listen to\n // the parent dimension for when data is added, and compute new keys.\n filterListeners.push(update);\n indexListeners.push(add);\n removeDataListeners.push(removeData);\n\n // Incorporate any existing data into the grouping.\n add(values, index, 0, n);\n\n // Incorporates the specified new values into this group.\n // This function is responsible for updating groups and groupIndex.\n function add(newValues, newIndex, n0, n1) {\n\n if(iterable) {\n n0old = n0\n n0 = values.length - newValues.length\n n1 = newValues.length;\n }\n\n var oldGroups = groups,\n reIndex = iterable ? [] : cr_index(k, groupCapacity),\n add = reduceAdd,\n remove = reduceRemove,\n initial = reduceInitial,\n k0 = k, // old cardinality\n i0 = 0, // index of old group\n i1 = 0, // index of new record\n j, // object id\n g0, // old group\n x0, // old key\n x1, // new key\n g, // group to add\n x; // key of group to add\n\n // If a reset is needed, we don't need to update the reduce values.\n if (resetNeeded) add = initial = cr_null;\n if (resetNeeded) remove = initial = cr_null;\n\n // Reset the new groups (k is a lower bound).\n // Also, make sure that groupIndex exists and is long enough.\n groups = new Array(k), k = 0;\n if(iterable){\n groupIndex = k0 ? groupIndex : [];\n }\n else{\n groupIndex = k0 > 1 ? xfilterArray.arrayLengthen(groupIndex, n) : cr_index(n, groupCapacity);\n }\n\n\n // Get the first old key (x0 of g0), if it exists.\n if (k0) x0 = (g0 = oldGroups[0]).key;\n\n // Find the first new key (x1), skipping NaN keys.\n while (i1 < n1 && !((x1 = key(newValues[i1])) >= x1)) ++i1;\n\n // While new keys remain…\n while (i1 < n1) {\n\n // Determine the lesser of the two current keys; new and old.\n // If there are no old keys remaining, then always add the new key.\n if (g0 && x0 <= x1) {\n g = g0, x = x0;\n\n // Record the new index of the old group.\n reIndex[i0] = k;\n\n // Retrieve the next old key.\n g0 = oldGroups[++i0];\n if (g0) x0 = g0.key;\n } else {\n g = {key: x1, value: initial()}, x = x1;\n }\n\n // Add the lesser group.\n groups[k] = g;\n\n // Add any selected records belonging to the added group, while\n // advancing the new key and populating the associated group index.\n\n while (x1 <= x) {\n j = newIndex[i1] + (iterable ? n0old : n0)\n\n\n if(iterable){\n if(groupIndex[j]){\n groupIndex[j].push(k)\n }\n else{\n groupIndex[j] = [k]\n }\n }\n else{\n groupIndex[j] = k;\n }\n\n // Always add new values to groups. Only remove when not in filter.\n // This gives groups full information on data life-cycle.\n g.value = add(g.value, data[j], true);\n if (!filters.zeroExcept(j, offset, zero)) g.value = remove(g.value, data[j], false);\n if (++i1 >= n1) break;\n x1 = key(newValues[i1]);\n }\n\n groupIncrement();\n }\n\n // Add any remaining old groups that were greater th1an all new keys.\n // No incremental reduce is needed; these groups have no new records.\n // Also record the new index of the old group.\n while (i0 < k0) {\n groups[reIndex[i0] = k] = oldGroups[i0++];\n groupIncrement();\n }\n\n\n // Fill in gaps with empty arrays where there may have been rows with empty iterables\n if(iterable){\n for (var index1 = 0; index1 < n; index1++) {\n if(!groupIndex[index1]){\n groupIndex[index1] = [];\n }\n }\n }\n\n // If we added any new groups before any old groups,\n // update the group index of all the old records.\n if(k > i0){\n if(iterable){\n for (i0 = 0; i0 < n0old; ++i0) {\n for (index1 = 0; index1 < groupIndex[i0].length; index1++) {\n groupIndex[i0][index1] = reIndex[groupIndex[i0][index1]];\n }\n }\n }\n else{\n for (i0 = 0; i0 < n0; ++i0) {\n groupIndex[i0] = reIndex[groupIndex[i0]];\n }\n }\n }\n\n // Modify the update and reset behavior based on the cardinality.\n // If the cardinality is less than or equal to one, then the groupIndex\n // is not needed. If the cardinality is zero, then there are no records\n // and therefore no groups to update or reset. Note that we also must\n // change the registered listener to point to the new method.\n j = filterListeners.indexOf(update);\n if (k > 1 || iterable) {\n update = updateMany;\n reset = resetMany;\n } else {\n if (!k && groupAll) {\n k = 1;\n groups = [{key: null, value: initial()}];\n }\n if (k === 1) {\n update = updateOne;\n reset = resetOne;\n } else {\n update = cr_null;\n reset = cr_null;\n }\n groupIndex = null;\n }\n filterListeners[j] = update;\n\n // Count the number of added groups,\n // and widen the group index as needed.\n function groupIncrement() {\n if(iterable){\n k++\n return\n }\n if (++k === groupCapacity) {\n reIndex = xfilterArray.arrayWiden(reIndex, groupWidth <<= 1);\n groupIndex = xfilterArray.arrayWiden(groupIndex, groupWidth);\n groupCapacity = capacity(groupWidth);\n }\n }\n }\n\n function removeData(reIndex) {\n if (k > 1 || iterable) {\n var oldK = k,\n oldGroups = groups,\n seenGroups = cr_index(oldK, oldK),\n i,\n i0,\n j;\n\n // Filter out non-matches by copying matching group index entries to\n // the beginning of the array.\n if (!iterable) {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n seenGroups[groupIndex[j] = groupIndex[i]] = 1;\n ++j;\n }\n }\n } else {\n for (i = 0, j = 0; i < n; ++i) {\n if (reIndex[i] !== REMOVED_INDEX) {\n groupIndex[j] = groupIndex[i];\n for (i0 = 0; i0 < groupIndex[j].length; i0++) {\n seenGroups[groupIndex[j][i0]] = 1;\n }\n ++j;\n }\n }\n groupIndex = groupIndex.slice(0, j);\n }\n\n // Reassemble groups including only those groups that were referred\n // to by matching group index entries. Note the new group index in\n // seenGroups.\n groups = [], k = 0;\n for (i = 0; i < oldK; ++i) {\n if (seenGroups[i]) {\n seenGroups[i] = k++;\n groups.push(oldGroups[i]);\n }\n }\n\n if (k > 1 || iterable) {\n // Reindex the group index using seenGroups to find the new index.\n if (!iterable) {\n for (i = 0; i < j; ++i) groupIndex[i] = seenGroups[groupIndex[i]];\n } else {\n for (i = 0; i < j; ++i) {\n for (i0 = 0; i0 < groupIndex[i].length; ++i0) {\n groupIndex[i][i0] = seenGroups[groupIndex[i][i0]];\n }\n }\n }\n } else {\n groupIndex = null;\n }\n filterListeners[filterListeners.indexOf(update)] = k > 1 || iterable\n ? (reset = resetMany, update = updateMany)\n : k === 1 ? (reset = resetOne, update = updateOne)\n : reset = update = cr_null;\n } else if (k === 1) {\n if (groupAll) return;\n for (var index3 = 0; index3 < n; ++index3) if (reIndex[index3] !== REMOVED_INDEX) return;\n groups = [], k = 0;\n filterListeners[filterListeners.indexOf(update)] =\n update = reset = cr_null;\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is greater than 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateMany(filterOne, filterOffset, added, removed, notFilter) {\n\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n j,\n k,\n n,\n g;\n\n if(iterable){\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceAdd(g.value, data[k], false, j);\n }\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n for (j = 0; j < groupIndex[k].length; j++) {\n g = groups[groupIndex[k][j]];\n g.value = reduceRemove(g.value, data[k], notFilter, j);\n }\n }\n }\n return;\n }\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g = groups[groupIndex[k]];\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g = groups[groupIndex[k]];\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n // This function is only used when the cardinality is 1.\n // notFilter indicates a crossfilter.add/remove operation.\n function updateOne(filterOne, filterOffset, added, removed, notFilter) {\n if ((filterOne === one && filterOffset === offset) || resetNeeded) return;\n\n var i,\n k,\n n,\n g = groups[0];\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zeroExcept(k = added[i], offset, zero)) {\n g.value = reduceAdd(g.value, data[k], false);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.onlyExcept(k = removed[i], offset, zero, filterOffset, filterOne)) {\n g.value = reduceRemove(g.value, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is greater than 1.\n function resetMany() {\n var i,\n j,\n g;\n\n // Reset all group values.\n for (i = 0; i < k; ++i) {\n groups[i].value = reduceInitial();\n }\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n if(iterable){\n for (i = 0; i < n; ++i) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceAdd(g.value, data[i], true, j);\n }\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n for (j = 0; j < groupIndex[i].length; j++) {\n g = groups[groupIndex[i][j]];\n g.value = reduceRemove(g.value, data[i], false, j);\n }\n }\n }\n return;\n }\n\n for (i = 0; i < n; ++i) {\n g = groups[groupIndex[i]];\n g.value = reduceAdd(g.value, data[i], true);\n }\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g = groups[groupIndex[i]];\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Recomputes the group reduce values from scratch.\n // This function is only used when the cardinality is 1.\n function resetOne() {\n var i,\n g = groups[0];\n\n // Reset the singleton group values.\n g.value = reduceInitial();\n\n // We add all records and then remove filtered records so that reducers\n // can build an 'unfiltered' view even if there are already filters in\n // place on other dimensions.\n for (i = 0; i < n; ++i) {\n g.value = reduceAdd(g.value, data[i], true);\n }\n\n for (i = 0; i < n; ++i) {\n if (!filters.zeroExcept(i, offset, zero)) {\n g.value = reduceRemove(g.value, data[i], false);\n }\n }\n }\n\n // Returns the array of group values, in the dimension's natural order.\n function all() {\n if (resetNeeded) reset(), resetNeeded = false;\n return groups;\n }\n\n // Returns a new array containing the top K group values, in reduce order.\n function top(k) {\n var top = select(all(), 0, groups.length, k);\n return heap.sort(top, 0, top.length);\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce values, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Sets the reduce order, using the specified accessor.\n function order(value) {\n select = xfilterHeapselect.by(valueOf);\n heap = xfilterHeap.by(valueOf);\n function valueOf(d) { return value(d.value); }\n return group;\n }\n\n // A convenience method for natural ordering by reduce value.\n function orderNatural() {\n return order(cr_identity);\n }\n\n // Returns the cardinality of this group, irrespective of any filters.\n function size() {\n return k;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = indexListeners.indexOf(add);\n if (i >= 0) indexListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n i = dimensionGroups.indexOf(group);\n if (i >= 0) dimensionGroups.splice(i, 1);\n return group;\n }\n\n return reduceCount().orderNatural();\n }\n\n // A convenience function for generating a singleton group.\n function groupAll() {\n var g = group(cr_null), all = g.all;\n delete g.all;\n delete g.top;\n delete g.order;\n delete g.orderNatural;\n delete g.size;\n g.value = function() { return all()[0].value; };\n return g;\n }\n\n // Removes this dimension and associated groups and event listeners.\n function dispose() {\n dimensionGroups.forEach(function(group) { group.dispose(); });\n var i = dataListeners.indexOf(preAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = dataListeners.indexOf(postAdd);\n if (i >= 0) dataListeners.splice(i, 1);\n i = removeDataListeners.indexOf(removeData);\n if (i >= 0) removeDataListeners.splice(i, 1);\n filters.masks[offset] &= zero;\n return filterAll();\n }\n\n return dimension;\n }\n\n // A convenience method for groupAll on a dummy dimension.\n // This implementation can be optimized since it always has cardinality 1.\n function groupAll() {\n var group = {\n reduce: reduce,\n reduceCount: reduceCount,\n reduceSum: reduceSum,\n value: value,\n dispose: dispose,\n remove: dispose // for backwards-compatibility\n };\n\n var reduceValue,\n reduceAdd,\n reduceRemove,\n reduceInitial,\n resetNeeded = true;\n\n // The group listens to the crossfilter for when any dimension changes, so\n // that it can update the reduce value. It must also listen to the parent\n // dimension for when data is added.\n filterListeners.push(update);\n dataListeners.push(add);\n\n // For consistency; actually a no-op since resetNeeded is true.\n add(data, 0, n);\n\n // Incorporates the specified new values into this group.\n function add(newData, n0) {\n var i;\n\n if (resetNeeded) return;\n\n // Cycle through all the values.\n for (i = n0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Reduces the specified selected or deselected records.\n function update(filterOne, filterOffset, added, removed, notFilter) {\n var i,\n k,\n n;\n\n if (resetNeeded) return;\n\n // Add the added values.\n for (i = 0, n = added.length; i < n; ++i) {\n if (filters.zero(k = added[i])) {\n reduceValue = reduceAdd(reduceValue, data[k], notFilter);\n }\n }\n\n // Remove the removed values.\n for (i = 0, n = removed.length; i < n; ++i) {\n if (filters.only(k = removed[i], filterOffset, filterOne)) {\n reduceValue = reduceRemove(reduceValue, data[k], notFilter);\n }\n }\n }\n\n // Recomputes the group reduce value from scratch.\n function reset() {\n var i;\n\n reduceValue = reduceInitial();\n\n // Cycle through all the values.\n for (i = 0; i < n; ++i) {\n\n // Add all values all the time.\n reduceValue = reduceAdd(reduceValue, data[i], true);\n\n // Remove the value if it is filtered.\n if (!filters.zero(i)) {\n reduceValue = reduceRemove(reduceValue, data[i], false);\n }\n }\n }\n\n // Sets the reduce behavior for this group to use the specified functions.\n // This method lazily recomputes the reduce value, waiting until needed.\n function reduce(add, remove, initial) {\n reduceAdd = add;\n reduceRemove = remove;\n reduceInitial = initial;\n resetNeeded = true;\n return group;\n }\n\n // A convenience method for reducing by count.\n function reduceCount() {\n return reduce(xfilterReduce.reduceIncrement, xfilterReduce.reduceDecrement, cr_zero);\n }\n\n // A convenience method for reducing by sum(value).\n function reduceSum(value) {\n return reduce(xfilterReduce.reduceAdd(value), xfilterReduce.reduceSubtract(value), cr_zero);\n }\n\n // Returns the computed reduce value.\n function value() {\n if (resetNeeded) reset(), resetNeeded = false;\n return reduceValue;\n }\n\n // Removes this group and associated event listeners.\n function dispose() {\n var i = filterListeners.indexOf(update);\n if (i >= 0) filterListeners.splice(i, 1);\n i = dataListeners.indexOf(add);\n if (i >= 0) dataListeners.splice(i, 1);\n return group;\n }\n\n return reduceCount();\n }\n\n // Returns the number of records in this crossfilter, irrespective of any filters.\n function size() {\n return n;\n }\n\n // Returns the raw row data contained in this crossfilter\n function all(){\n return data;\n }\n\n // Returns row data with all dimension filters applied, except for filters in ignore_dimensions\n function allFiltered(ignore_dimensions) {\n var array = [],\n i = 0,\n mask = maskForDimensions(ignore_dimensions || []);\n\n for (i = 0; i < n; i++) {\n if (filters.zeroExceptMask(i, mask)) {\n array.push(data[i]);\n }\n }\n\n return array;\n }\n\n function onChange(cb){\n if(typeof cb !== 'function'){\n /* eslint no-console: 0 */\n console.warn('onChange callback parameter must be a function!');\n return;\n }\n callbacks.push(cb);\n return function(){\n callbacks.splice(callbacks.indexOf(cb), 1);\n };\n }\n\n function triggerOnChange(eventName){\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](eventName);\n }\n }\n\n return arguments.length\n ? add(arguments[0])\n : crossfilter;\n}\n\n// Returns an array of size n, big enough to store ids up to m.\nfunction cr_index(n, m) {\n return (m < 0x101\n ? xfilterArray.array8 : m < 0x10001\n ? xfilterArray.array16\n : xfilterArray.array32)(n);\n}\n\n// Constructs a new array of size n, with sequential values from 0 to n - 1.\nfunction cr_range(n) {\n var range = cr_index(n, n);\n for (var i = -1; ++i < n;) range[i] = i;\n return range;\n}\n\nfunction capacity(w) {\n return w === 8\n ? 0x100 : w === 16\n ? 0x10000\n : 0x100000000;\n}\n","export default function(t,e,i,n,r){for(r in n=(i=i.split(\".\")).splice(-1,1),i)e=e[i[r]]=e[i[r]]||{};return t(e,n)};\n//# sourceMappingURL=deepobj.m.js.map\n","module.exports = require(\"bows\");","module.exports = require(\"d3-array\");","module.exports = require(\"d3-format\");","module.exports = require(\"d3-time-format\");","module.exports = require(\"fastest-validator\");","module.exports = require(\"i18next\");","module.exports = require(\"lodash\");","module.exports = require(\"moment\");","module.exports = require(\"moment-timezone\");","module.exports = require(\"react\");","module.exports = require(\"reductio\");","module.exports = require(\"sundial\");","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(e) {\n if (\"function\" != typeof WeakMap) return null;\n var r = new WeakMap(),\n t = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(e) {\n return e ? t : r;\n })(e);\n}\nfunction _interopRequireWildcard(e, r) {\n if (!r && e && e.__esModule) return e;\n if (null === e || \"object\" != _typeof(e) && \"function\" != typeof e) return {\n \"default\": e\n };\n var t = _getRequireWildcardCache(r);\n if (t && t.has(e)) return t.get(e);\n var n = {\n __proto__: null\n },\n a = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var u in e) if (\"default\" !== u && Object.prototype.hasOwnProperty.call(e, u)) {\n var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;\n i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];\n }\n return n[\"default\"] = e, t && t.set(e, n), n;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nexport default function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","export default function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import DataUtil from '../../utils/DataUtil';\n\nexport {\n DataUtil,\n};\n"],"names":["_lodash","_interopRequireDefault","require","_bows","_moment","_reductio","_basal","_datetime","_bloodglucose","_constants","AggregationUtil","exports","_createClass2","dataUtil","_this","_classCallCheck2","init","bgBounds","_","get","bgUnits","timezoneName","initialActiveEndpoints","cloneDeep","activeEndpoints","excludedDevices","reductio","registerPostProcessor","postProcessBasalAggregations","postProcessBolusAggregations","postProcessCalibrationAggregations","postProcessAutoSuspendAggregations","postProcessSiteChangeAggregations","postProcessSMBGAggregations","postProcessDataByDateAggregations","postProcessStatsByDateAggregations","aggregateBasals","group","filter","byType","reducer","dataList","tags","each","tag","reduceByTag","result","basal","post","automatedSuspend","aggregateBoluses","aggregateFingersticks","bgClass","reduceByBgClassification","smbg","calibration","aggregateSiteChanges","aggregateDataByDate","types","map","d","type","byTypes","aggregateStatsByDate","priorResults","data","filterByActiveRange","processedData","dataForDay","_dataForDay$value","value","suspend","temp","normalizeDatumOut","total","reduce","acc","_ref","_ref$count","count","key","sortBy","activeTimeField","subtotals","assign","countAutomatedBasalEvents","countDistinctSuspends","summarizeProcessedData","_dataForDay$value2","automated","correction","extended","interrupted","manual","oneButton","override","underride","wizard","length","previousSiteChangeDates","_ref2","some","includes","subType","siteChangeTypes","firstDatum","first","previousSiteChangeDatums","getPreviousSiteChangeDatums","formatLocalizedFromUTC","timePrefs","_dataForDay$value3","cannulaPrime","reservoirChange","tubingPrime","datums","summary","daysSince","dateDiff","Date","parse","MS_IN_DAY","NaN","byDate","_dataForDay$value4","meter","veryHigh","veryLow","high","low","datesWithData","activeRangeDates","range","days","val","index","moment","utc","tz","subtract","format","date","_this$dataUtil$filter","find","valueOf","activeDays","byEndpoints","sortedData","groupedData","groupBy","groupedBasals","bySampleIntervalRange","apply","_toConsumableArray2","cgmSampleIntervalRange","defaultCgmSampleIntervalRange","cbgData","top","Infinity","deduplicatedCbgData","getDeduplicatedCBGData","cbg","cbgDeduplicated","dimension","filterAll","bySampleInterval","groupedPumpSettingsOverrides","deviceEvent","initialGroupedPumpSettingsOverridesLength","addBasalOverlappingStart","addPumpSettingsOverrideOverlappingStart","typeData","isArray","unshift","getStats","stats","results","_this$initialActiveEn","_slicedToArray2","start","end","startMoment","endMoment","endOf","startDate","endDate","datum","clone","normalizeDatumBgUnits","classifyBgValue","arguments","undefined","sumBy","values","dateData","avgPerDay","keysIn","percentage","this","log","bows","_crossfilter","_momentTimezone","_i18next","_sundial","_device","_bolus","_StatUtil","_AggregationUtil","_stat","_schema","_excluded","t","i18next","bind","DataUtil","Validator","SchemaValidator","startTimer","crossfilter","queryDataCount","defaultCgmSampleInterval","MS_IN_MIN","setCgmSampleIntervalRange","buildDimensions","buildFilters","buildSorts","initFilterChangeHandler","endTimer","addData","rawData","patientId","returnData","bolusDatumsByIdMap","bolusToWizardIdMap","deviceUploadMap","latestDatumByType","pumpSettingsDatumsByIdMap","wizardDatumsByIdMap","wizardToBolusIdMap","loopDataSetsByIdMap","bolusDosingDecisionDatumsByIdMap","matchedDevices","dataAnnotations","isEmpty","removeData","normalizeDatumIn","joinWizardAndBolus","joinBolusAndDosingDecision","addMissingSuppressedBasals","clearFilters","validData","uniqBy","rejectedData","remove","reject","byId","id","tagDatum","add","setMetaData","metaData","getMetaData","rate","deliveryType","suppressed","normalizeSuppressedBasal","isFinite","duration","annotations","_d$suppressed","maxDuration","toISOString","time","min","dataSetType","isLoop","messagetext","messageText","parentMessage","parentmessage","timestamp","sampleInterval","_d$deviceId","isLibreViewAPI","push","code","deviceId","indexOf","_d$requestedBolus","_d$requestedBolus2","_d$recommendedBolus$n","_d$recommendedBolus$e","requestedBolus","normal","amount","recommendedBolus","validateDatumIn","_time","_deviceTime","deviceTime","timeChange","isString","bolus","reason","HKdeviceId","uploadId","slice","join","dexDeviceId","isWizard","fieldToPopulate","idMap","datumMap","datumToPopulate","omit","rejectReason","timeThreshold","dosingDecision","mapValues","_ref$associations","associations","proximateDosingDecisions","Math","abs","sortedProximateDosingDecisions","orderBy","_ref3","dosingDecisionWithMatchingNormal","_dosingDecision$reque","concat","_$find","_d$dosingDecision$ori","_d$dosingDecision$ori2","_d$dosingDecision$ori3","_d$dosingDecision$ori4","_d$dosingDecision$foo","_d$dosingDecision$foo2","_d$dosingDecision$foo3","_d$dosingDecision","_d$dosingDecision$smb","_$last","_d$dosingDecision$ins","_d$dosingDecision$req","associatedPumpSettingsId","pumpSettings","carbInput","originalFood","nutrition","carbohydrate","net","food","bgInput","last","bgHistorical","insulinOnBoard","requestedNormal","expectedNormal","pumpSettingsByStartTimes","_ref4","activeSchedule","basalSchedules","basalSchedule","basalsToAdd","isTwiistLoop","shouldGenerateSuppressedBasal","pumpSettingsDatum","ps","basalEndTime","timezoneOffsetMs","timezoneOffset","basalMsPer24WithOffset","getMsPer24","currentDaySegments","nextDaySegments","sortedSchedule","i","segment","nextSegment","segmentStart","segmentEnd","_objectSpread5","overlapStart","max","overlapEnd","extendedSegmentStart","extendedSegmentEnd","overlappingSegments","originalDuration","basalDurationMs24","firstSegment","firstSegmentDuration","cumulativeDuration","segmentDuration","newBasal","needsCarbToExchangeConversion","carbUnits","findIndex","getDeconvertedCarbExchange","deconvertedCarbInput","round","_d$dosingDecision2","_d$dosingDecision2$fo","_d$dosingDecision2$fo2","_d$dosingDecision2$fo3","isWizardOrDosingDecision","isAutomated","isCorrection","hasExtended","isInterruptedBolus","isOverride","isUnderride","loop","isOneButton","_d$reason","_d$payload","_d$payload$suspended","_d$tags","isReservoirChange","isPrime","status","suspended","payload","_defineProperty2","SITE_CHANGE","SITE_CHANGE_RESERVOIR","SITE_CHANGE_CANNULA","primeTarget","SITE_CHANGE_TUBING","recognizedAlarmTypes","ALARM_NO_INSULIN","ALARM_NO_POWER","ALARM_OCCLUSION","ALARM","alarmType","prioritizedEventTypes","EVENT_PUMP_SHUTDOWN","events","isControlIQ","eventType","EVENT","validator","common","isFunction","validateResult","validationMethod","fields","returnRawData","fieldToRestore","normalizeAllFields","normalizeDatumOutTime","deviceSerialNumber","uploadMap","source","normalEnd","normalTime","incompleteSuspends","suspendStart","msPer24","localDate","flatten","partition","name","_ref6","isObject","insulinCarbRatio","isOverrideEvent","isTidepoolLoop","isDIYLoop","currentTime","latestDiabetesDatumEnd","localTime","displayOffset","normalTimeISO","hourOfDay","MS_IN_HOUR","fillDate","replace","setDataAnnotations","getOffset","conversionOffset","warning","keysPaths","keys","units","bgPrefs","isPlainObject","bg","MGDL_UNITS","normalizeAtPath","path","pathValue","isNumber","_d$bgNormalized","setPath","bgNormalized","set","convertToMGDL","nestedKey","nestedValue","item","percent","deduplicateCBGData","sort","byTime","OVERLAP_TOLERANCE","blackoutUntil","output","currentRecord","memoize","_$first","_$last2","_this$bgPrefs","firstDatumId","lastDatumId","predicate","matches","clearMatchedDevices","clearDataAnnotations","bgSources","latestPumpUpload","devices","updateDatum","updatedDatum","existingDatum","updateDatumClone","buildByTimeDimension","resultingDatum","buildByDayOfWeekDimension","byDayOfWeek","day","buildByDateDimension","buildByIdDimension","buildBySubTypeDimension","bySubType","buildByTypeDimension","buildByDeviceIdDimension","byDeviceId","buildBySampleIntervalDimension","byActiveDays","filterFunction","endpoints","filterRange","byDeviceIds","excludedDeviceIds","filterExact","activeSubType","activeType","array","timeField","a","b","onChange","matchDevices","currentFilter","origin","version","deviceName","deviceVersionId","setBgSources","current","CGM_DATA_KEY","BGM_DATA_KEY","compact","setLatestPumpUpload","uploadData","getLatestPumpUpload","latestUploadSource","toLowerCase","manufacturer","deviceModel","latestPumpSettings","latestPumpSettingsOrUpload","pumpIsAutomatedBasalDevice","isAutomatedBasalDevice","pumpIsAutomatedBolusDevice","isAutomatedBolusDevice","pumpIsSettingsOverrideDevice","isSettingsOverrideDevice","basalData","lastManualBasalSchedule","getLastManualBasalSchedule","settings","setUploadMap","pumpSettingsData","upload","deviceManufacturers","model","TWIIST_LOOP","TIDEPOOL_LOOP","DIY_LOOP","serialNumber","setIncompleteSuspends","deviceEventData","_ref8","_ref8$annotations","setSize","size","setLatestDiabetesDatumEnd","latestDiabetesDatum","maxBy","_ref9","DIABETES_DATA_TYPES","setLatestTimeZone","_latestTimeChangeEven","latestTimeZone","latestUpload","latestTimeChangeEvent","latestTimeZoneOffsetDatum","_ref10","createLatestTimeZone","sundial","checkTimezoneName","localizedTime","message","e","timezone","offsetSign","sign","offsetDuration","offsetHours","hours","minutes","utcOffset","to","timeZoneName","setDevices","uploadsById","keyBy","device","isContinuous","deviceManufacturer","label","bgm","deviceTags","cgm","oneMinCgmSampleInterval","isOneMinCGMSampleIntervalDevice","pump","allDeviceIds","preCIQDeviceID","setExcludedDevices","uniq","_d$annotations","trackDataAnnotations","annotation","setBgPrefs","setTimePrefs","setEndpoints","setActiveDays","setTypes","nextDays","prevDays","diff","next","nextStartIsDST","isDST","nextEndIsDST","offset","prev","prevStartIsDST","Array","nextDay","dayOfWeek","setStats","split","trim","groupByType","all","select","dispose","_timePrefs$timezoneAw","timezoneAware","getTimezoneFromTimePrefs","timezoneNameChanged","timezoneAwareChanged","prevActiveTimeField","activeTimeFieldChanged","dimensionUpdates","_bgPrefs$bgBounds","DEFAULT_BG_BOUNDS","_bgPrefs$bgClasses","bgClasses","_bgPrefs$bgUnits","rest","_objectWithoutProperties2","defaults","boundary","veryLowThreshold","targetLowerBound","target","targetUpperBound","veryHighThreshold","setReturnRawData","returnRaw","deviceIds","query","_this$bgSources","_this$endpoints","_this$endpoints$curre","aggregationsByDate","bgSource","fillData","raw","activeDaysChanged","isEqual","bgSourceChanged","endpointsChanged","excludedDevicesChanged","rangeEndpoints","rangeKey","activeRange","requestedMetaData","dataAnnotationsRequested","intersection","commonStats","sensorUsage","timeInRange","getAggregationsByDate","getTypeData","fill","getFillData","generatedStats","statUtil","StatUtil","stat","method","statFetchMethods","selectedAggregationsByDate","generatedAggregationsByDate","groupByDate","aggregationMethods","basals","boluses","fingersticks","siteChanges","dataByDate","statsByDate","aggregationUtil","aggregationType","opts","fillBinCount","hourlyStarts","startOf","prevFill","startTime","adjustForDSTChanges","splice","selectedMetaData","pick","prevFilters","previousPrimeData","reverse","previousReservoirChangeData","generatedData","_ref11","_this$filter","_ref11$select","_ref11$sort","returnAllFields","trimOverlappingStart","initalDataLength","trimOverlappingEnd","indexOfLastDurationDatum","findLastIndex","sortOpts","sortArray","field","order","normalizeFields","previousBasalDatum","pumpSettingsOverrideData","previousPumpSettingsOverrideDatum","noop","filterCBGDataByDefaultSampleInterval","getAverageGlucoseData","returnBgData","bgData","averageGlucose","meanBy","getBgExtentsData","bgDaysWorn","rawBgData","newestDatum","oldestDatum","bgMax","bgMin","minBy","getBasalBolusData","bolusData","rawBasalData","activeDaysWithInsulinData","Set","basalBolusData","parseFloat","getTotalBasalFromEndpoints","getTotalBolus","getCarbsData","wizardData","foodData","activeDaysWithCarbData","wizardCarbs","_objectSpread3","grams","exchanges","foodCarbs","carbs","getCoefficientOfVariationData","_this$getStandardDevD","getStandardDevData","insufficientData","coefficientOfVariationData","coefficientOfVariation","standardDeviation","getDailyAverageSums","getDailyAverageDurations","sum","getGlucoseManagementIndicatorData","_this$getAverageGluco","glucoseManagementIndicator","MGDL_PER_MMOLL","glucoseManagementIndicatorAGP","getReadingsInRangeData","smbgData","initialValue","counts","readingsInRangeData","classification","dailyAverages","getSensorUsage","rawCbgData","_this$getBgExtentsDat","sensorUsageAGP","ceil","_this$getAverageGluco2","squaredDiffs","pow","sqrt","getTimeInAutoData","durations","transform","getBasalGroupDurationsFromEndpoints","isNaN","getTimeInOverrideData","rawPumpSettingsOverrideData","trimmedDurationData","getTimeInRangeData","timeInRangeData","getTotalInsulinData","_this$getBasalBolusDa","totalInsulin","getBasalPathGroupType","getBasalDurationWithinRange","basalSequences","currentBasal","seq","idx","nextBasal","discontinuousEnd","s","getEndpoints","datetime","initialSegmentDuration","dose","getSegmentDose","formatInsulin","_format","suppressedDeliveryType","getBasalPathGroups","currentPathType","basalPathGroups","pathType","optionalExtents","startIndex","endIndex","ONE_HR","precisionRound","rangeStart","rangeEnd","datumStart","datumEnd","datumStartIsWithinRange","datumEndIsWithinRange","datumEncompassesRange","trimmedStart","trimmedEnd","shift","automatedStop","event","suspends","distinct","skipped","bgValue","classificationType","Error","gt","MMOLL_UNITS","precision","roundedValue","bankersRound","minimumIncrement","BG_DISPLAY_MINIMUM_INCREMENTS","thresholds","threshold","formatBgValue","highLowerBound","lowUpperBound","extremeHighThreshold","condensed","anyLow","anyHigh","extremeHigh","segmented","suffix","prefix","bgDatum","outOfRangeAnnotation","bgType","binSize","outerQuantiles","binned","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","TWENTY_FOUR_HRS","String","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","clampThreshold","_d3Array","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","binKey","_outerQuantiles","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","centerOfBinMs","parseInt","quantile","firstQuartile","median","thirdQuartile","msX","msFrom","msTo","outOfRangeThresholds","mean","insulinEvent","getBolusFromInsulinEvent","getWizardFromInsulinEvent","inRange","expectedExtended","programmed","getProgrammed","formatPercentage","expectedDuration","recommended","getRecommended","insulinEvents","getDelivered","Boolean","carb","cancelledDuringNormal","cancelledDuringExtended","amountRecommended","fixFloatingPoint","n","formatDecimalNumber","netRecommendation","rec","_BG_DISPLAY_MINIMUM_I","_DEFAULT_BG_BOUNDS","_ADA_OLDER_HIGH_RISK_","_ADA_PREGNANCY_T1_BG_","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_TIDEPOOL_LOOP","_TWIIST_LOOP","_DIY_LOOP","_default","_pumpVocabulary","_settingsOverrides","returnEmptyString","nsSeparator","stiffness","damping","ADA_STANDARD","ADA_OLDER_HIGH_RISK","ADA_PREGNANCY_T1","ADA_GESTATIONAL_T2","PRESET","CUSTOM","ADA_PREGNANCY_T1_BG_BOUNDS","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","ALARM_NO_DELIVERY","ALARM_AUTO_OFF","ALARM_OVER_LIMIT","AUTOMATED_BOLUS","AUTOMATED_DELIVERY","AUTOMATED_SUSPEND","AUTOMATED_MODE_EXITED","SCHEDULED_DELIVERY","SETTINGS_OVERRIDE","SLEEP","PHYSICAL_ACTIVITY","PREPRANDIAL","MAX_BOLUS","MAX_BASAL","ONE_BUTTON_BOLUS","INSULIN_DURATION","INSULET","TANDEM","ANIMAS","MEDTRONIC","MICROTECH","BG_DATA_TYPES","marker","patient","bday","utcFormat","milliseconds","isNull","isUndefined","timeFormat","dateParseFormat","monthFormat","isSameYear","isSame","isSameDay","startFormat","endFormat","diagnosis","momentDuration","seconds","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","formatted","roundedMinutes","roundedHours","roundedDays","localized","utcHammertime","zone","_d3TimeFormat","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","err","getLocalizedCeiling","period","startOfPeriod","toDate","endOfToday","endOfProvidedDay","daysAgo","minutesAgo","hoursAgo","daysText","hoursText","unit","minutesText","lastManualBasal","findLast","vocabulary","pumpVocabulary","getUppercasedManufacturer","settingsOverrides","pumpSettingsOrUpload","AUTOMATED_BASAL_DEVICE_MODELS","_datum$client4","_datum$origin","TARGET","client","_data","_datum$client","test","_datum$client2","_datum$client3","majorVersion","_datum$tags","part","upperCase","upperFirst","lowThreshold","highThreshold","convertToMmolL","BG_LOW","BG_HIGH","toFixed","toString","decimalLength","qtyString","useAGPFormat","Number","_d3Format","x","r","places","settingsData","uploadedTime","schedule","uploaded","serial","scheduleName","activeName","deviceKey","noUnits","displayName","main","secondary","names","schedules","position","_settings$units","deviceLabels","getPumpVocabulary","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","rows","setting","MAX_BASAL_RATE_PRECISION_PLACES","_settings$insulinMode","_settings$insulinMode2","_settings$insulinMode3","insulinModel","rapidAdult","rapidChild","fiasp","lyumjev","afrezza","modelType","peakMinutes","actionPeakOffset","insulinModelAnnotations","bgSafetyLimit","columns","_settings$units2","_deviceLabels$PREPRAN","_deviceLabels$PHYSICA","correctionRange","bgTargetPreprandial","bgTargetPhysicalActivity","scheduleData","starts","getStarts","noRateData","getBasalRate","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","getValue","sensitivityData","bgTargets","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","_interopRequireWildcard","BASAL_RATE_PRECISION_PLACES","noData","animas","insulet","medtronic","tandem","microtech","twiist","fieldName","timedData","finish","hrs","textUtil","formatFn","formatDatum","reshapeBgClassesToBgBounds","statsString","_stat$data","_stat$data$raw","renderTable","readingsInRange","timeInAuto","timeInOverride","bgExtents","renderSecondaryValue","forcePlainTextValues","statTitle","title","buildTextTable","dataFormat","formattedText","tooltip","legendTitle","showHeader","dataPaths","buildTextLine","_statFetchMethods","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","statFormats","bgCount","bgRange","cv","gmi","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","getSum","ensureNumeric","isNil","isRangeDefined","deviation","lowerValue","lowerColorId","upperValue","upperColorId","_opts$emptyDataPlaceh","emptyDataPlaceholder","_opts$forcePlainTextV","disableStat","generateBgRangeLabels","_value","classifyCvValue","formatDuration","formatStatsPercentage","createElement","style","color","BG_COLORS","LBS_PER_KG","getStatAnnotations","labels","overrideLabel","overrideLabelLowerCase","lowerCase","bgStats","bgSourceLabel","smbgLabel","cbgLabel","automatedLabel","getStatData","_data$readingsInRange","_data$readingsInRange2","getSettingsOverrides","bgRanges","statData","_objectSpread2","readingsInRangeDataPath","options","suffixValue","inputValue","dividend","summaryAGP","totalReadings","averageDailyReadings","scheduledLabel","getStatTitle","bgTypeLabel","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","legend","hideSummaryUnits","reverseLegendOrder","_fastestValidator","v","messages","missingFieldDependancy","schema","object","missingFields","makeError","JSON","stringify","processedRule","_processRule","_checkWrapper","checkWrapper","errors","fieldValue","fieldPath","patterns","ISODate","ISODateSince2008","rejectBadDeviceStatus","optional","forbidden","minZero","postiveNumber","positive","pattern","enum","basalCommon","props","basalPostShutdown","items","normalBolus","extendedBolus","combinationBolus","settingsScheduleStart","pumpSettingsAnimas","pumpSettingsMedtronic","pumpSettingsOmnipod","pumpSettingsTandem","pumpSettingsEquil","pumpSettingsLoop","compile","postShutdown","combination","omnipod","equil","array8","arrayUntyped","array16","array32","arrayLengthen","arrayLengthenUntyped","arrayWiden","arrayWidenUntyped","width","bitarray","subarrays","masks","Uint8Array","Uint16Array","Uint32Array","copy","constructor","prototype","lengthen","len","m","w","one","dest","src","truncate","j","zero","zeroExcept","zeroExceptMask","mask","only","onlyExcept","onlyOffset","onlyOne","heap_by","f","heap","lo","hi","sift","child","h","identity","by","heapselect_by","k","queue","bisect_by","bisectRight","mid","right","left","bisect","deep","p","obj","prop","call","reg","REMOVED_INDEX","heapselect","permute","filters","newIndex","removed","usePred","shouldRemove","index1","index2","filterListeners","forEach","l","removeDataListeners","index3","index4","triggerOnChange","iterable","accessorPath","newValues","iterablesIndexCount","iterablesIndexFilterStatus","refilterFunction","filterValue","filterValuePresent","hasCurrentFilter","top_offset","hi0","toSkip","lo0","iterablesEmptyRows","bottom","bottom_offset","groupAll","g","orderNatural","accessor","sortRange","cr_range","A","B","refilter","indexListeners","dimensionGroups","dataListeners","preAdd","postAdd","tmp","newData","n0","n1","newIterablesIndexCount","newIterablesIndexFilterStatus","i0","cr_index","unsortedIndex","sortMap","bounds","lo1","hi1","old_n0","oldValues","oldIndex","oldIterablesIndexFilterStatus","i1","oldiiclength","index5","reIndex","oldDataIndex","filterIndexBounds","filterIndexFunction","added","valueIndexAdded","valueIndexRemoved","newAdded","newRemoved","indexLength","groups","reduceCount","reduceSum","groupIndex","reduceAdd","reduceRemove","reduceInitial","n0old","groupWidth","groupCapacity","capacity","update","reset","resetNeeded","g0","x0","x1","oldGroups","initial","k0","groupIncrement","updateMany","resetMany","updateOne","resetOne","oldK","seenGroups","filterOne","filterOffset","notFilter","reduceValue","allFiltered","ignore_dimensions","maskForDimensions","cb","callbacks","console","warn","isElementFiltered","dimensions","eventName","module","__esModule","_typeof","_getRequireWildcardCache","WeakMap","has","__proto__","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","o","Symbol","iterator","_arrayLikeToArray","arr","arr2","_classCallCheck","instance","Constructor","TypeError","_defineProperties","descriptor","enumerable","configurable","writable","_createClass","protoProps","staticProps","_defineProperty","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptors","defineProperties","_objectWithoutProperties","excluded","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","_slicedToArray","done","unsupportedIterableToArray","_toConsumableArray","arrayLikeToArray","iter","from","_toPropertyKey","arg","prim","toPrimitive","res","hint","_unsupportedIterableToArray","minLen","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","toStringTag","_DataUtil"],"sourceRoot":""}
|