@tidepool/viz 1.34.0 → 1.35.0-rc.2

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/print.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"react\"","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack:///./src/modules/print/utils/AGPConstants.js","webpack:///external \"text-table\"","webpack:///./src/utils/datetime.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack:///./node_modules/babel-preset-react-app/node_modules/regenerator-runtime/runtime.js","webpack:///./src/modules/print/utils/AGPUtils.js","webpack:///./src/utils/basics/data.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack:///external \"i18next\"","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack:///./src/modules/print/images/tidepool-logo-408x46.png","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack:///./src/utils/bloodglucose.js","webpack:///./src/utils/format.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./src/utils/device.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./src/utils/stat.js","webpack:///./src/utils/settings/data.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread.js","webpack:///external \"d3-array\"","webpack:///external \"moment-timezone\"","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./src/modules/print/index.js","webpack:///external \"bluebird\"","webpack:///external \"voilab-pdf-table\"","webpack:///./node_modules/voilab-pdf-table/plugins/fitcolumn.js","webpack:///./node_modules/svg-to-pdfkit/source.js","webpack:///./src/modules/print/BasicsPrintView.js","webpack:///./src/modules/print/images/sitechange-cannula.png","webpack:///./src/modules/print/images/sitechange-reservoir.png","webpack:///./src/modules/print/images/sitechange-tubing.png","webpack:///./src/modules/print/DailyPrintView.js","webpack:///./src/modules/render/basal.js","webpack:///./src/modules/render/bolus.js","webpack:///./src/utils/print/data.js","webpack:///./src/modules/print/BgLogPrintView.js","webpack:///./src/modules/print/SettingsPrintView.js","webpack:///./src/modules/print/AGPPrintView.js","webpack:///./src/modules/print/images/capturAGP-logo.png","webpack:///external \"moment\"","webpack:///external \"lodash\"","webpack:///external \"d3-scale\"","webpack:///./src/utils/text/TextUtil.js","webpack:///./src/utils/bolus.js","webpack:///./src/utils/basal.js","webpack:///./src/modules/print/utils/constants.js","webpack:///./src/utils/constants.js","webpack:///external \"d3-time-format\"","webpack:///./src/modules/print/PrintView.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack:///external \"d3-format\"","webpack:///external \"sundial\"","webpack:///./src/utils/misc.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/get.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack:///./src/utils/settings/nonTandemData.js","webpack:///./src/utils/settings/tandemData.js","webpack:///(webpack)/buildin/module.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","_typeof","_getRequireWildcardCache","WeakMap","cache","obj","default","has","newObj","hasPropertyDescriptor","getOwnPropertyDescriptor","desc","set","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","arguments","apply","err","undefined","__webpack_exports__","_lodash","_interopRequireDefault","_i18next","_constants","i18next","_","init","returnEmptyString","nsSeparator","AGP_FOOTER_Y_PADDING","DPI","AGP_SECTION_HEADER_HEIGHT","AGP_SECTION_DESCRIPTION_HEIGHT","text","reportHeader","reportSubHeader","reportFooter","reportInsuffienctData","timeInRanges","title","subtitle","reportInfo","dob","mrn","glucoseMetrics","averageGlucose","label","goal","mgdl","mmoll","glucoseManagementIndicator","coefficientOfVariation","subLabel","ambulatoryGlucoseProfile","description","targetRange","insufficientData","dailyGlucoseProfiles","bgRanges","veryHigh","high","target","low","veryLow","goals","highCombined","lowCombined","subLabels","TIRtarget","TIRminutes","section","values","ticks","summaries","bgUnits","labels","hourlyTicks","bgTicks","percentileTicks","timeTicks","weekdayTicks","calendarDates","black","colors","bg","dailyProfileBg","hour","percentile","line","range","dailyProfileTarget","divider","white","lightGrey","mediumGrey","darkGrey","background","shaded","bgRange","lowShaded","highShaded","empty","median","interQuartile","outerQuantile","fill","utc","timezoneName","length","localized","moment","tz","hrsToMs","hours","minToMs","minutes","secToMs","seconds","ms","milliseconds","utcHammertime","Date","parse","zone","utcOffset","patient","bday","_d3TimeFormat","utcFormat","format","isNull","isUndefined","TWENTY_FOUR_HRS","Error","timeFormat","diagnosis","startDate","endDate","dateParseFormat","monthFormat","start","end","startFormat","isSame","concat","endFormat","duration","opts","momentDuration","days","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","condensed","formatted","roundedMinutes","roundedHours","roundedDays","trim","suffix","timePrefs","timezone","getTimezoneFromTimePrefs","startOfDay","startOf","valueOf","toDate","add","_momentTimezone","_sundial","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","timezoneAware","sundial","checkTimezoneName","_defineProperty","configurable","writable","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","GenStateSuspendedStart","method","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","unwrapped","TypeError","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","constructor","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","toString","keys","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","_AGPConstants","_format","_datetime","_bloodglucose","_constants2","_moment","boldText","textString","String","chartScaleToPixels","paperPixelDimension","scaleValue","pixelsToChartScale","pixels","pointsToPixels","points","createAnnotation","options","defaultsDeep","arrowside","font","color","family","AGP_FONT_FAMILY","showarrow","calculateDataSufficiency","_data$data","_data$data$current","_data$data2","_data$data2$current","_data$data2$current$s","data","statsByDate","current","aggregationsByDate","_ref2","stats","sensorUsage","cgmDaysWorn","count","newestDatum","sampleFrequency","sensorUsageAGP","sufficiencyBySection","hoursOfCGMData","MS_IN_HOUR","sufficencyMet","cgmCalendarDays","map","max","val","index","time","subtract","sensorUsageByDate","date","_statsByDate$date","_ref3","countForDate","sampleFrequencyForDate","_ref3$newestDatum","newestDatumForDate","_ref3$oldestDatum","oldestDatum","oldestDatumForDate","sufficiencyMet","minCount","maxPossibleReadings","bankersRound","MS_IN_DAY","msPer24","sufficientDays","filter","topSevenSufficientDays","orderBy","topSevenDaysSensorUsageMean","meanBy","reportInfoAndMetricsWidth","chartRenderAreaTop","rightEdge","MARGINS","left","WIDTH","chartRenderAreaBottom","top","HEIGHT","bottom","sectionGap","sections","dataSufficiency","x","y","width","height","bordered","sufficientData","dailyGlucoseProfilesHeight","stat","bgPrefs","chartAreaWidth","chartAreaHeight","AGP_SECTION_BORDER_RADIUS","plotMarginX","plotMarginTop","plotMarginBottom","paperWidth","paperHeight","barWidth","yScale","xScale","statTotal","_bgPrefs$bgBounds","_bgPrefs$bgBounds2","_bgPrefs$bgBounds3","_bgPrefs$bgBounds4","rawCounts","statDatums","id","chartData","reduce","res","datum","toNumber","renderedValue","AGP_TIR_MIN_HEIGHT","rawById","raw","rendered","yScaleCorrection","last","marker","bgBounds","veryLowThreshold","targetLowerBound","targetUpperBound","veryHighThreshold","tick","align","size","fontSizes","formatBgValue","xanchor","xshift","yanchor","getBracketPosValues","posX","posX2","posY","posY2","minBracketYOffSet","isNumber","maxSubBracketYOffset","subBracketXOffset","subBracketYOffset","min","targetBracketAllowedYRange","barSeparatorPixelWidth","bracketYPos","bracketXExtents","bracketPos","_toConsumableArray2","brackets","pos","path","radiusX","radiusY","join","createBracketSVG","yref","leaderYPos","leaderXExtents","leaderPos","leaders","isLowLeader","rangePosY","rangeLabels","rangeValues","formatPercentage","rangeSummaryPosY","combinedRangeSummaryValues","rangeSummaryValues","yshift","goalsPos","_objectSpread10","subLabelsPos","xref","rangeAnnotations","lowSummary","highSummary","layout","barmode","showlegend","margin","b","xaxis","showgrid","showline","showticklabels","zeroline","yaxis","annotations","shapes","cbgData","plotMarginY","_bgPrefs$bgBounds5","_bgPrefs$bgBounds6","_bgPrefs$bgBounds7","_bgPrefs$bgBounds8","yClamp","MGDL_UNITS","AGP_BG_CLAMP_MGDL","AGP_BG_CLAMP_MMOLL","mungeBGDataBins","ONE_HR","AGP_LOWER_QUANTILE","AGP_UPPER_QUANTILE","quantileKeys","firstDatum","lastDatum","smoothedChartData","_chartData","_chartData2","curr","sum","smoothDatum","firstSmoothedDatum","lastSmoothedDatum","unshift","msX","quantileBand","upperKey","lowerKey","fillcolor","simplify","shape","smoothing","bgTickAnnotations","isTarget","includes","bgTargetMarkers","posXLeft","posYTop","posYBottom","createbgTargetMarkerSVG","xsizemode","ysizemode","bgGridLines","isClamp","isZero","layer","x0","x1","y0","y1","percentileLabels","percentileTickYPositions","percentileTickShiftedYPositions","medianYPos","minGap","percentileTickYShifts","shiftedYPos","percentileTickAnnotations","visible","percentileTickLines","quarterDayTicks","hourlyTicksAnnotations","yAxes","each","yAxis","domain","linecolor","mirror","gridcolor","tickvals","xaxis2","overlaying","tickcolor","ticklen","axis","mean","dateLabelFormat","plotHeight","_bgPrefs$bgBounds9","_bgPrefs$bgBounds10","halfDayTicks","halfDayTickAnnotations","calendarDays","flatten","calendarDayAnnotations","combinedData","dayData","isLow","first","fillYExentRangeIndex","textangle","manufacturer","pumpUpload","bgLabels","generateBgRangeLabels","upperFirst","deviceLabels","_device","getPumpVocabulary","dimensions","summaryTitle","perRow","primary","automatedLabel","AUTOMATED_DELIVERY","hideEmpty","AUTOMATED_SUSPEND","_dimensions","average","percentage","selectorIndex","isAutomatedBolusDevice","firstDay","day","dow","aggregations","aggregationData","cloneDeep","hasDataInRange","processedData","byDate","aggregation","disabled","_aggregationData$type","_aggregationData$type2","hasBasal","basal","hasAutomatedSuspend","automatedSuspend","_aggregationData$type3","_aggregationData$type4","hasSMBG","smbg","hasCalibrations","calibration","source","getSiteChangeSource","SITE_CHANGE_TYPE_UNDECLARED","subTitle","getSiteChangeSourceLabel","emptyText","aggregationKey","getEmptyText","rangeStartDate","rangeEndDate","currentDate","endOf","dateObj","timestamp","isInteger","_data$data$aggregatio","_data$data$current$en","endpoints","query","textUtil","utils","TextUtil","basicsString","buildDocumentHeader","buildDocumentDates","buildTextLine","statsText","getSummaryTableData","statData","header","rows","dimension","pathValue","split","Math","round","columns","fingersticks","buildTextTable","showHeader","boluses","siteChanges","infusionSiteData","siteChangeSource","valuesIn","daysSince","getSiteChangesTableData","basals","_TextUtil","_stat","reshapeBgClassesToBgBounds","settings","ANIMAS","MEDTRONIC","TANDEM","lowerCase","allowedSources","SITE_CHANGE_CANNULA","SITE_CHANGE_TUBING","INSULET","MICROTECH","SITE_CHANGE_RESERVOIR","fallbackSubtitle","pumpVocabulary","_classCallCheck","instance","Constructor","_getPrototypeOf","_defineProperties","props","descriptor","_createClass","protoProps","staticProps","_possibleConstructorReturn","_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__","_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__","_setPrototypeOf","_inherits","subClass","superClass","bgValue","classificationType","isEmpty","gt","MGDL_PER_MMOLL","bgClasses","DEFAULT_BG_BOUNDS","clampThreshold","thresholds","mapValues","threshold","segmented","prefix","bgDatum","outOfRangeAnnotation","find","annotation","code","_defineProperty2","total","datumWeight","deviceId","indexOf","MS_IN_MIN","bgType","binSize","outerQuantiles","binned","groupBy","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","_d3Array","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","some","pick","uniqBy","binKey","_outerQuantiles","_slicedToArray2","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","sortBy","centerOfBinMs","parseInt","quantile","firstQuartile","thirdQuartile","msFrom","msTo","outOfRangeThresholds","useAGPFormat","units","lowThreshold","highThreshold","MMOLL_UNITS","convertToMmolL","BG_LOW","BG_HIGH","toFixed","_d3Format","decimalLength","qtyString","formatDecimalNumber","precision","Number","replace","pow","abs","places","_assertThisInitialized","ReferenceError","uploadData","findLast","deviceTags","basalData","lastManualBasal","deliveryType","pumpSettings","deviceModel","AUTOMATED_BASAL_DEVICE_MODELS","_data","deviceName","vocabulary","defaults","formatFn","formatDatum","statsString","_stat$data","_stat$data$raw","renderTable","commonStats","timeInRange","readingsInRange","totalInsulin","timeInAuto","timeInOverride","bgExtents","renderSecondaryValue","forcePlainTextValues","statTitle","dataFormat","summary","formattedText","secondary","tooltip","legendTitle","dataPaths","isArray","compact","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","cbg","statFormats","bgCount","cv","carbs","gmi","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","statFetchMethods","_statFetchMethods","getSum","ensureNumeric","isNil","parseFloat","deviation","lowerValue","lowerColorId","upperValue","upperColorId","emptyDataPlaceholder","disableStat","classifyBgValue","isPlainObject","grams","exchanges","_value","classifyCvValue","formatDuration","createElement","style","BG_COLORS","LBS_PER_KG","isFinite","getStatAnnotations","bgSource","bgStats","bgSourceLabel","smbgLabel","cbgLabel","overrideLabel","SETTINGS_OVERRIDE","getStatData","_objectSpread3","suffixValue","inputValue","output","dividend","bgMax","bgMin","glucoseManagementIndicatorAGP","summaryAGP","findIndex","standardDeviation","automated","manual","scheduledLabel","SCHEDULED_DELIVERY","PHYSICAL_ACTIVITY","SLEEP","durations","bolus","getStatTitle","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","legend","hideSummaryUnits","reverseLegendOrder","animas","insulet","medtronic","tandem","microtech","scheduleName","activeName","deviceKey","noUnits","part","main","settingsData","keysIn","names","schedules","position","normalTime","uploadedTime","datetime","formatLocalizedFromUTC","schedule","activeSchedule","uploaded","serial","deviceSerialNumber","scheduleData","starts","getStarts","noRateData","rate","getBasalRate","startTime","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","amount","getValue","sensitivityData","bgTargets","basalSchedules","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","setting","MAX_BASAL","MAX_BOLUS","INSULIN_DURATION","shift","_interopRequireWildcard","DISPLAY_PRECISION_PLACES","noData","fieldName","timedData","hrs","_objectSpread","_defineProperty__WEBPACK_IMPORTED_MODULE_0__","ownKeys","getOwnPropertySymbols","sym","_toConsumableArray","arr","Array","arr2","_arrayWithoutHoles","from","_iterableToArray","_nonIterableSpread","_bluebird","_PrintView","_BasicsPrintView","_DailyPrintView","_BgLogPrintView","_SettingsPrintView","_AGPPrintView","constants","PDFDocument","PDFDocumentStub","_classCallCheck2","blobStream","PrintView","BasicsPrintView","DailyPrintView","BgLogPrintView","SettingsPrintView","AGPPrintView","createPrintView","doc","Renderer","svgDataURLS","renderOpts","debug","defaultFontSize","DEFAULT_FONT_SIZE","dpi","footerFontSize","FOOTER_FONT_SIZE","headerFontSize","HEADER_FONT_SIZE","margins","smallFontSize","SMALL_FONT_SIZE","assign","chartsPerPage","summaryHeaderFontSize","summaryWidthAsPercentage","createPrintPDFPackage","_opts$basics","basics","_opts$daily","daily","_opts$bgLog","bgLog","_opts$settings","_opts$agp","agp","changeLanguage","preferences","displayLanguageCode","pdfOpts","_ref","_asyncToGenerator2","_regenerator","_callee","DocLib","streamLib","stream","_context","autoFirstPage","bufferPages","MARGIN","pipe","render","renderPageNumbers","on","pdf","blob","toBlob","url","toBlobURL","_x","_x2","lodash","PdfTableFitColumn","conf","merge","column","maxWidth","calculatedWidth","clone","configure","table","onBodyAdd","setWidth","onColumnAdded","onColumnPropertyChanged","reinitWidth","prop","resetWidth","page","content_width","sumBy","getColumns","right","setColumnWidth","svg","NamedColors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","DefaultColors","transparent","Entities","quot","amp","lt","apos","OElig","oelig","Scaron","scaron","Yuml","circ","tilde","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","permil","lsaquo","rsaquo","euro","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","fnof","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","bull","hellip","prime","Prime","oline","frasl","weierp","image","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","exist","nabla","isin","notin","ni","prod","minus","lowast","radic","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams","PathArguments","A","a","C","H","h","L","M","Q","q","S","T","V","v","Z","z","PathFlags","A3","A4","a3","a4","Properties","inherit","initial","visibility","hidden","collapse","stroke","stop-color","fill-opacity","stroke-opacity","stop-opacity","fill-rule","nonzero","evenodd","clip-rule","stroke-width","stroke-dasharray","stroke-dashoffset","stroke-miterlimit","stroke-linejoin","miter","bevel","stroke-linecap","butt","square","font-size","xx-small","x-small","small","medium","large","x-large","xx-large","font-family","font-weight","600","700","800","900","bold","bolder","500","400","300","200","100","normal","lighter","font-style","italic","oblique","text-anchor","middle","direction","ltr","rtl","dominant-baseline","auto","baseline","before-edge","text-before-edge","central","after-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical","alignment-baseline","baseline-shift","super","word-spacing","letter-spacing","text-decoration","none","underline","overline","line-through","xml:space","css","preserve","pre","pre-line","pre-wrap","nowrap","marker-start","marker-mid","marker-end","opacity","transform","display","inline","block","clip-path","mask","overflow","scroll","docBeginGroup","bbox","group","_groupCount","resources","ref","xobj","Type","Subtype","FormType","BBox","Group","CS","I","K","Resources","write","savedMatrix","_ctm","savedPage","groupStack","fonts","xobjects","ext_gstates","patterns","docEndGroup","Font","XObject","ExtGState","Pattern","docInsertGroup","addContent","docApplyMask","clip","_maskCount","gstate","CA","ca","BM","SMask","G","BC","docUsePattern","pattern","_patternCount","PatternType","PaintType","TilingType","dx","dy","XStep","YStep","Matrix","multiplyMatrix","matrix","ProcSet","temp","docBeginText","docSetTextMatrix","e","f","validateNumber","docSetTextMode","docWriteGlyph","glyph","docFillColor","fillOpacity","fillColor","docStrokeColor","strokeOpacity","strokeColor","parseXml","xml","SvgNode","tag","nodeName","nodeValue","nodeType","attributes","childNodes","parentNode","textContent","classList","getAttribute","attr","getElementById","recursive","node","getElementsByTagName","child","parser","StringParser","match","decodeEntities","warningCallback","matchAll","str","mt","m0","m1","m2","fromCharCode","parseColor","colorCallback","opacityToColor","isMask","newColor","newOpacity","multiply","transformPoint","getGlobalMatrix","ctm","getPageBBox","SvgShape","inverseMatrix","getBoundingBox","dt","validateMatrix","m3","m4","m5","isNotEqual","solveEquation","curve","isEqual","sqrt","getCurveValue","number","parseTranform","temp2","func","nums","parser2","matchNumber","matchSeparator","PI","cos","sin","parseAspectRatio","aspectRatio","availWidth","availHeight","elemWidth","elemHeight","initAlign","ratioType","xAlign","yAlign","scaleX","scaleY","Min","Mid","Max","parseStyleAttr","fontFamily","fontSize","fontStyle","fontWeight","fontVariant","parts","parseSelector","ids","classes","tags","specificity","parseStyleSheet","rule","rules","selectors","selector","matchesSelector","elem","combineArrays","array1","array2","getAscent","ascender","maxY","scale","getDescent","descender","minY","getTextPos","encoded","encode","hex","unicode","charCodeAt","advanceWidth","xOffset","yOffset","xAdvance","yAdvance","createSVGElement","inherits","SvgElemUse","SvgElemSymbol","SvgElemGroup","SvgElemLink","SvgElemSvg","SVGElemImage","SvgElemRect","SvgElemCircle","SvgElemEllipse","SvgElemLine","SvgElemPolyline","SvgElemPolygon","SvgElemPath","SvgElemText","SvgElemTspan","SvgElemTextPath","SvgElemTextNode","SvgElem","exp","all","substring","matchSpace","matchLengthUnit","LineSegment","p1x","p1y","p2x","p2y","totalLength","startPoint","atan2","endPoint","getPointAtLength","pathCommands","pathSegments","lastCom","lastCtrlX","lastCtrlY","startX","startY","currX","currY","move","segment","c1x","c1y","c2x","c2y","divisions","equationX","equationY","derivativeX","derivativeY","lengthMap","minX","maxX","rootsX","rootsY","l1","l2","close","addCommand","hasStart","hasEnd","cx","cy","rx","ry","fi","fa","fs","x2","y2","th1","th2","segms","ceil","th3","th4","endX","endY","command","Infinity","addBounds","bbox1","j","mergeShape","insertInDocument","moveTo","lineTo","bezierCurveTo","closePath","getSubPaths","subPaths","getMarkers","markers","subPath","subPathMarkers","startMarker","prevEndMarker","endMarker","styleCache","childrenCache","isOuterElement","stack","useCSS","getComputedStyle","specificities","styleRules","getStyle","allowedChildren","resolveUrl","file","svgObj","documentCallback","svgs","documentCache","isArrayLike","computeUnits","unit","percent","isFontSize","getViewport","em","ex","","px","pt","cm","mm","in","pc","computeLength","temp1","computeLengthList","strict","getLength","getLengthList","getUrl","getNumberList","getViewbox","viewBox","getPercent","chooseValue","keyInfo","parsed","fallbackColor","SvgElemGradient","SvgElemPattern","dasharray","getChildren","children","getParentVWidth","getVWidth","viewportWidth","getParentVHeight","getVHeight","viewportHeight","getParentViewport","getBoundingShape","SvgElemStylable","getTransformation","SvgElemClipPath","useMask","SvgElemMask","getFill","isClip","getPaint","getStroke","SvgElemHasChildren","childShape","drawChildren","drawInDocument","SvgElemContainer","drawContent","clipped","masked","save","restore","link","addLink","isText","w","Rect","Border","URI","links","docInsertLink","preserveAspectRatio","imageCallback","openImage","rect","translate","fallback","_attr","_getChildren","bBox","gOpacity","bBoxUnitsPattern","bBoxUnitsContent","aspectRatioMatrix","docCreatePattern","stopColor","grad","r2","bBoxUnits","spread","nAfter","nBefore","nTotal","multiplier","inv","corner1","corner2","corner3","corner4","linearGradient","radialGradient","offset","inOrder","_colorSpace","setTransform","SvgElemBasicShape","dashScale","lineWidth","lineCap","circle","dashArray","dashOffset","miterLimit","lineJoin","dash","phase","fillAndStroke","markerStart","markerMid","markerEnd","markersPos","SvgElemMarker","drawMarker","pathLength","posArray","strokeWidth","orient","rotate","refX","refY","SvgElemTextContainer","_pos","dx0","ascent","dy0","dx1","descent","dy1","dx2","dy2","drawTextInDocument","decorate","_font","fauxBold","childElem","skew","fauxItalic","linePosition","pathObject","pathScale","pathElem","textParentElem","currentAnchor","currentDirection","processedText","remainingText","textPaths","currentChunk","currentX","currentY","doAnchoring","anchordx","startltr","middleltr","endltr","startrtl","middlertl","endrtl","textOnPath","currentElem","textOffset","charMidX","pointOnPath","continuous","parentElem","_y","_dx","_dy","_rot","_defRot","fontOptions","fontNameorLink","fontCallback","_index","textLength","spacingAndGlyphs","wordSpacing","letterSpacing","textAnchor","textDirection","xHeight","getXHeight","getBaseline","words","rawText","renderedText","xAttr","yAttr","dxAttr","dyAttr","rotAttr","firstChar","lastChar","textScale","spaceDiff","adjustLength","pxToPt","assumePt","SVGElement","console","warn","_registeredFonts","styles","savedFillColor","_fillColor","_PrintView2","siteChangeCannulaImage","siteChangeReservoirImage","siteChangeTubingImage","siteChangeImages","_siteChangeImages","_this","_possibleConstructorReturn2","_getPrototypeOf2","processBasicsAggregations","defineBasicsAggregations","latestPumpUpload","renderCalendarCell","_assertThisInitialized2","addPage","initLayout","_get2","getDateRange","_this2","columnWidth","getActiveColumnWidth","calendar","findBasicsDays","generateCalendarDayLabels","headerHeight","renderer","headerBorder","headerPadding","padding","setLayoutColumns","chartArea","gutter","widths","renderStats","renderCalendars","RenderCalendarSummaries","goToPage","goToLayoutColumnPosition","renderAggregatedStats","initCalendar","renderCalendarSection","subText","siteChangesSubTitle","bottomMargin","renderCalendarSummary","_readingsInRange$data","_readingsInRange$data2","_this$stats","renderHorizontalBarStat","heading","note","secondaryFormatKey","renderSimpleStat","hasCarbGramsData","hasCarbExchangeData","_opts$height","_opts$labelWidth","labelWidth","_opts$valueWidth","valueWidth","_opts$statFont","statFont","_opts$statFontSize","statFontSize","_opts$valueFont","valueFont","boldFont","_opts$valueFontSize","valueFontSize","_opts$labelHeader","labelHeader","_opts$valueHeader","valueHeader","renderCustomTextCell","tableSettings","borderWidth","headerAlign","border","valign","tableColumns","defineStatColumns","setFill","showHeaders","_this3","primaryFormatKey","statHasData","renderTableHeading","columnDefaults","noteFontSize","moveDown","largeFontSize","secondaryValue","_fillStripe","_this4","_opts$bottomMargin","headingMoveDown","renderSectionHeading","renderEmptyText","isSiteChange","priorToFirstSiteChange","_ref$summary","chunkedDayMap","chunk","dateLabelMask","dayType","SITE_CHANGE","NO_SITE_CHANGE","dayOfWeek","week","headingHeight","heightOfString","headingYPos","currentYPos","pageIndex","currentPageIndex","rowHeight","bottomEdge","totalPages","topEdge","lockFillandStroke","unlockFillandStroke","tb","draw","_data$column$id","xPos","yPos","isExcludedBolusDay","extraSmallFontSize","gridHeight","gridWidth","siteChangeTypes","setStroke","isFirst","linePos","dotPos","daysSinceLabel","imageWidth","imagePadding","gridPos","renderCountGrid","resetText","_this5","renderCount","diameter","radius","grid","row","col","countArray","extrasArray","splice","colCount","gridSpaces","gridValues","space","chunkedGridValues","rowIndex","colIndex","dot","renderColumn","primaryDimension","valueObj","headerFont","zebra","headerFill","headerRenderer","_d3Scale","_basal","_bolus","_basal2","_bolus2","_this$pumpSettingsOve","isAutomatedBasalDevice","hasCarbExchanges","carbUnits","basalGroupLabels","pumpSettingsOverrideLabels","bgAxisFontSize","carbsFontSize","numDays","activeDays","bolusWidth","carbRadius","cbgRadius","markerRadius","extendedLineThickness","interruptedLineThickness","smbgRadius","triangleHeight","axes","delivered","extendedPath","extendedExpectationPath","extendedTriangle","extendedTriangleInterrupted","interrupted","overrideTriangle","programmed","undelivered","underride","underrideTriangle","carbExchanges","lightDividers","gapBtwnSummaryAndChartAsPercentage","leftEdge","initialChartArea","summaryArea","processBgRange","dataByDate","bolusRange","processBolusRange","basalRange","processBasalRange","dates","sort","selectedDates","chartsByDate","initialChartsByDate","dateData","bounds","utcBounds","getOffset","processBasalSequencesForDate","chartsPlaced","initialChartsPlaced","chartIndex","initialChartIndex","setHeaderSize","setFooterSize","calculateChartMinimums","calculateDateChartHeight","placeChartsOnPage","dateChart","makeScales","charts","chart","head","renderLegend","legendHeight","currentLineHeight","totalHeight","perChart","chartMinimums","notesEtc","bgEtcChart","bolusDetails","basalChart","belowBasal","paddingBelow","lineHeight","threeHrBinnedBoluses","getBolusFromInsulinEvent","threeHrBin","maxBolusStack","lines","insulinEvent","extended","expectedExtended","_this$chartMinimums","bolusDetailsHeight","totalGivenMaxBolusStack","minBolusDetails","chartHeight","_this$chartMinimums2","bgScaleYLimit","bgScale","scaleLinear","clamp","bolusScale","basalScale","_this$chartArea","totalChartHeight","startingIndexThisPage","chartsOnThisPage","limit","thisChartHeight","subType","renderSummary","renderXAxes","renderYAxes","renderCbgs","renderSmbgs","renderInsulinEvents","renderFoodCarbs","renderBolusDetails","renderBasalPaths","renderBasalRates","renderPumpSettingsOverrides","renderChartDivider","smallIndent","widthWithoutIndent","bgPrecision","statsData","forOwn","statType","getStatDefinition","_$get","totalCbgDuration","_$get4","totalBasal","totalBolus","update","lineGap","_this$bgBounds","upperTarget","lowerTarget","indent","continued","_primary","_secondary","ratioTitle","ratio","percentages","_$get5","totalBasalDuration","formattedCarbs","carbValues","carbSuffixes","_this$chartMinimums3","bottomOfBgEtcChart","bottomOfBolusDetails","bottomOfBasalChart","_ref4","threeHrLocs","bolusDetailPositions","bolusDetailWidths","renderedBounds","pickBy","bound","bgTick","undash","_this6","_ref5","cbgs","_this7","_ref6","smbgs","getOutOfRangeThreshold","widthOfString","labelStartX","labelEndX","lineBreak","_this8","_ref7","insulinEvents","paths","renderEventPath","getCarbs","carbFillColor","getWizardFromInsulinEvent","carbsX","carbsY","getMaxValue","_this9","_ref8","food","foodEvent","_this10","_ref9","topOfBolusDetails","grouped","binOfBoluses","groupWidth","groupXPos","displayTime","removeTrailingZeroes","getDelivered","normalPercentage","getNormalPercentage","extendedPercentage","getExtendedPercentage","durationText","getMaxDuration","percentagesText","_this11","currentSchedule","labeledSchedules","_this12","_ref10","_ref10$data","sequences","basalSequences","sequence","getBasalSequencePaths","basalType","basalAutomated","renderType","basalPathGroups","getBasalPathGroups","isAutomated","getBasalPathGroupType","wholeDateDeliveredPath","calculateBasalPath","endAtZero","flushBottomOffset","isFilled","startAtZero","flushWithBottomOfScale","_this13","_ref11","deviceEvent","overrideData","isFabricatedNewDayOverride","stitchedData","prevDatum","normalEnd","overrideStart","overrideEnd","bottomOfScale","overrideType","toUpperCase","_ref12","isLastChartOnPage","_this14","legendTop","legendVerticalMiddle","legendTextMiddle","legendItemLeftOffset","legendItemLabelOffset","cursor","vertOffsetAdjustments","pair","_pair","horizOffset","adjustedVertOffset","smbgPositions","bolusOpts","legendBolusYScale","normalBolusXScale","normalPaths","automatedPaths","rideBolusXScale","overridePaths","recommended","net","carb","correction","underridePaths","interruptedBolusXScale","interruptedPaths","expectedNormal","extendedBolusXScale","extendedPaths","carbsYPos","exchangesYPos","legendBasalYScale","legendBasalXScale","dynamicBasalType","scheduled1","negTemp","suppressed","scheduled2","posTemp","suspend","basalSequence","types","uniq","isString","discontinuousEnd","discontinuousStart","suppresseds","undeliveredType","_ref$flushBottomOffse","zeroBasal","handleDiscontinuousEnd","every","thisBasalY","handleDiscontinuousStart","bolusUtils","bolusBottom","bolusCenter","isNonTrivialUnderride","isUnderride","isNonTrivialOverride","isOverride","isInterruptedBolus","undeliveredY","edges","getBolusEdges","formatBolusRectPath","programmedY","getProgrammed","deliveredY","recommendedY","getRecommended","hasExtended","extendedVal","getExtended","triangleSize","halfTriangle","startOfTriangle","extendedY","interruptedExtended","startOfInterrupted","getDuration","halfInterrupted","bottomOfInterruptedLine","pathCopy","bolusHeight","halfWidth","bgs","extent","_dateData$basal","nextBasal","getBasalSequences","chartDates","getBGLabelYOffset","getBgChartColumns","getBgChartRow","renderBgCell","bgChart","headers","smbgHeader","dateMoment","isWeekend","timeSlots","smbgByTimeSlot","slot","_fill","zebraEven","renderBGChart","renderSummaryTable","datumsRendered","THREE_HRS","skipDraw","totalDays","totalReadings","avgReadingsPerDay","averageGlucoseText","summaryTable","avgBg","_data$id","_data$id$smbg","labelOffsetX","labelOffsetY","chartLeftEdge","_nonTandemData","_tandemData","isTandem","deviceMeta","getDeviceMeta","uploadDate","renderDeviceMeta","renderTandemProfiles","renderPumpSettings","renderBasalSchedules","renderWizardSettings","device","sortedSchedules","profile","zebraHeader","firstColumnWidth","fills","headerFills","columnDef","_bold","flexColumn","renderInsulinSettings","_insulinSettings","insulinSettings","tableRows","updateLayoutColumnPosition","layoutColumns","activeIndex","_this$latestPumpUploa","lastManualBasalSchedule","startTimeAndValue","isValue","automatedScheduleShowing","columnIndex","activeColumn","getShortestLayoutColumn","scheduleLabel","toLowerCase","getLongestLayoutColumn","bolusTitle","renderSensitivity","renderTarget","renderRatio","renderWizardSetting","sensitivity","_AGPUtils","_misc","agpLogo","tidepoolLogo","generateChartSections","renderReportInfo","renderInsufficientData","renderGlucoseMetrics","renderTimeInRanges","renderAmbulatoryGlucoseProfile","renderDailyGlucoseProfiles","agpLogoWidth","tidepoolLogoWidth","logoX","logoY","_section$text","_section$text3","_section$text4","roundedRect","_section$text2","titleXPos","titleYPos","subtitleXPos","insufficientDataXPos","insufficientDataYPos","descriptionXPos","descriptionYPos","_this$patient","_this$patient2","_this$patient2$profil","_this$patient2$profil2","_this$stats$sensorUsa","_this$stats$sensorUsa2","renderSectionContainer","patientName","truncate","getPatientFullName","patientBirthdate","formatBirthdate","patientMRN","clinicPatientMRN","_ref$cgmDaysWorn","cgmDaysWornText","renderInfoRow","mainText","subTextLabel","subTextWidth","lineYPos","moveUp","activeTime","paddingX","xExtents","glucoseStats","_stat$data$dataPaths","statWidth","isAverageGlucose","isShaded","_formatDatum","paddingY","valueYShift","unitsFontSize","unitsYShift","valueXShift","bgUnitsKey","chartAreaX","chartAreaY","renderSVGImage","_this$svgDataURLS","_this$svgDataURLS2","_this$svgDataURLS3","_this$svgDataURLS3$da","_this$svgDataURLS4","_this$svgDataURLS4$da","_textTable","fullname","formatDiagnosisDate","diagnosisText","mrnText","exported","formatCurrentDate","formatDateRange","tableText","getTable","getTableHeader","content","getTableRows","getTableRow","rowData","wizard","NaN","inRange","expectedDuration","Boolean","cancelledDuringNormal","cancelledDuringExtended","fixFloatingPoint","netRecommendation","rec","currentBasal","seq","idx","basalTypeChange","getEndpoints","initialSegmentDuration","dose","getSegmentDose","formatInsulin","suppressedDeliveryType","currentPathType","pathType","optionalExtents","startIndex","endIndex","findLastIndex","toISOString","returnData","events","automatedStop","acc","event","subtotals","suspends","distinct","skipped","springConfig","stiffness","damping","_DEFAULT_BG_BOUNDS","trends","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","_pumpVocabulary","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_default","_voilabPdfTable","_fitcolumn","_svgToPdfkit","logo","addSVG","SVGtoPDF","LARGE_FONT_SIZE","EXTRA_SMALL_FONT_SIZE","patientInfoBox","_objectSpread4","sleep","physicalActivity","bolusAutomated","siteChange","basalHeader","bolusHeader","tableHeader","zebraOdd","initialTotalPages","bufferedPageRange","newPage","setNewPageTablePosition","removeAllListeners","dateText","renderDebugGrid","currentFont","renderHeader","renderFooter","_opts$activeIndex","_opts$columns","_opts$count","_opts$gutter","_opts$type","_opts$width","_opts$widths","availableWidth","combinedWidths","switchToPage","shortest","shortestIndex","longest","longestIndex","dateRange","fillLocked","strokeLocked","_opts$xPos","_opts$yPos","_opts$font","_opts$fontSize","_opts$subTextFont","subTextFont","_opts$subTextFontSize","subTextFontSize","_opts$moveDown","subTextYOffset","isHeader","fillStripeKey","fillKey","heightKey","stripe","fillStripe","stripeDefined","stripeWidth","stripeHeight","_$get$text","_$get$subText","alignKey","renderCellStripe","stripeOffset","boldRow","fontKey","textRightPadding","cellHeight","Table","PdfTable","FitColumn","borderColor","addPlugin","onPageAdd","onPageAdded","onCellBackgroundAdd","onCellBackgroundAdded","onCellBorderAdd","onCellBorderAdded","onRowAdd","onRowAdded","onBodyAdded","setColumnsDefaults","addColumns","addBody","ev","cancel","addHeader","isEven","defaultOpacity","_row$_fill","patientNameWidth","patientDOB","birthdate","patientBirthdayWidth","patientMRNWidth","patientMRNText","dividerWidth","titleWidth","logoWidth","thisLineYPos","numMinorLines","innerLinePos","thisLineXPos","renderPatientInfo","renderTitle","renderLogo","renderDateText","helpText","printDateText","printDateWidth","pageCountWidth","innerWidth","svgDataURL","svgDataURLArr","rawChartSVG","decodeURIComponent","pageCount","_slicedToArray","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","_iterableToArrayLimit","_nonIterableRest","_typeof2","patientInfo","isOtherPerson","fullName","get_get","receiver","Reflect","base","_superPropBase","getScheduleNames","lookupKey","activeAtUpload","activeScheduleName","getScheduleLabel","processBasalRateData","basalRows","sensitivityTitle","processSensitivityData","sensitivityRows","processCarbRatioData","ratioRows","targetTitle","targetColumns","processBgTargetData","targetRows","getTimedSchedules","className","basalScheduleHeader","bolusSettingsHeader","basalColumns","processTimedSettings","webpackPolyfill","deprecate"],"mappings":"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AAC,OAAA,IAAAC,KAAA,IAAAC,IAAA,IAAAC,KAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,IAAA,IAAAC,KAAA,IAAAC,IAAA,IAAAC,OAAA,IAAAC,KAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IACAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,IAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,OAAA,IACAC,MAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,IAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,KAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IACAC,OAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,MAAA,IAAAC,QAAA,IAAAC,KAAA,IAAAC,IAAA,IAAAC,MAAA,IAAAC,KAAA,IAAAC,MAAA,IAAAC,OAAA,IAAAC,GAAA,IAAAC,GAAA,IAAAC,GAAA,IAAAC,QAAA,IAAAC,GAAA,IAAAC,IAAA,IAAAC,MAAA,IAA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","file":"print.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 432);\n","module.exports = require(\"react\");","var _typeof = require(\"../helpers/typeof\");\n\nfunction _getRequireWildcardCache() {\n if (typeof WeakMap !== \"function\") return null;\n var cache = new WeakMap();\n\n _getRequireWildcardCache = function _getRequireWildcardCache() {\n return cache;\n };\n\n return cache;\n}\n\nfunction _interopRequireWildcard(obj) {\n if (obj && obj.__esModule) {\n return obj;\n }\n\n if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n return {\n \"default\": obj\n };\n }\n\n var cache = _getRequireWildcardCache();\n\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n\n newObj[\"default\"] = obj;\n\n if (cache) {\n cache.set(obj, newObj);\n }\n\n return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;","module.exports = require(\"regenerator-runtime\");\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","import _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nimport { DPI } from './constants';\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 AGP_BG_CLAMP_MGDL = 350;\nexport const AGP_BG_CLAMP_MMOLL = 19.4;\nexport const AGP_FOOTER_Y_PADDING = DPI * 0.25;\nexport const AGP_TIR_MIN_HEIGHT = 5;\nexport const AGP_SECTION_BORDER_RADIUS = 8;\nexport const AGP_SECTION_HEADER_HEIGHT = DPI * 0.25;\nexport const AGP_SECTION_DESCRIPTION_HEIGHT = DPI * 0.25;\nexport const AGP_LOWER_QUANTILE = 0.05;\nexport const AGP_UPPER_QUANTILE = 0.95;\n\n// Preferring Helvetica instead of Arial since we don't have license and PDFkit doesn't include it\nexport const AGP_FONT_FAMILY = 'Helvetica, Arial, Sans-Serif';\n\nexport const text = {\n reportHeader: t('AGP Report:'),\n reportSubHeader: t('Continuous glucose monitoring'),\n reportFooter: t('Patent pending \\u2013 HealthPartners Institute dba International Diabetes Center \\u2013 All Rights Reserved. \\u00A92022'),\n reportInsuffienctData: t('Insufficient data to generate an AGP Report.'),\n timeInRanges: {\n title: t('Time in Ranges'),\n subtitle: t('Goals for Type 1 and Type 2 Diabetes'),\n },\n reportInfo: {\n dob: t('DOB:'),\n mrn: t('MRN:'),\n },\n glucoseMetrics: {\n title: t('Glucose metrics'),\n averageGlucose: {\n label: t('Average Glucose'),\n goal: {\n mgdl: t('Goal: <154 mg/dL'),\n mmoll: t('Goal: <8.6 mmol/L'),\n },\n },\n glucoseManagementIndicator: {\n label: t('Glucose Management Indicator (GMI)'),\n goal: t('Goal: <7%'),\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n },\n ambulatoryGlucoseProfile: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient CGM data to generate AGP graph'),\n },\n dailyGlucoseProfiles: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period.'),\n },\n bgRanges: {\n veryHigh: t('Very High'),\n high: t('High'),\n target: t('Target'),\n low: t('Low'),\n veryLow: t('Very Low'),\n },\n goals: {\n veryHigh: t('Goal: <5%'),\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n subLabels: {\n TIRtarget: t('Each 5% increase is clinically beneficial'),\n TIRminutes: t('Each 1% time in range = about 15 minutes'),\n },\n};\n\nexport const fontSizes = {\n reportHeader: 14,\n reportSubHeader: 14,\n reportFooter: 7,\n reportInfo: {\n default: 10,\n label: 8,\n },\n section: {\n title: 9,\n subtitle: 8,\n description: 7,\n insufficientData: 7,\n },\n timeInRanges: {\n values: 9,\n ticks: 7,\n summaries: 12,\n goals: 7,\n subLabels: 7,\n },\n glucoseMetrics: {\n values: 12,\n bgUnits: 8,\n labels: 9,\n subLabels: 8,\n goals: 8,\n },\n ambulatoryGlucoseProfile: {\n hourlyTicks: 7,\n bgTicks: 9,\n percentileTicks: 8,\n bgUnits: 7,\n targetRange: 9,\n },\n dailyGlucoseProfiles: {\n bgTicks: 7,\n bgUnits: 7,\n timeTicks: 7,\n weekdayTicks: 8,\n calendarDates: 8,\n },\n};\n\nconst black = '#000000';\nconst white = '#FFFFFF';\nconst lightGrey = '#D9D9D9';\nconst mediumGrey = '#7A7A7A';\nconst darkGrey = '#626267';\n\nexport const colors = {\n text: {\n reportHeader: '#522398',\n label: darkGrey,\n reportFooter: black,\n section: {\n title: black,\n subtitle: darkGrey,\n description: black,\n insufficientData: black,\n },\n reportInfo: black,\n calendarDates: darkGrey,\n goals: {\n veryHigh: darkGrey,\n highCombined: mediumGrey,\n target: mediumGrey,\n lowCombined: mediumGrey,\n veryLow: darkGrey,\n glucoseMetrics: darkGrey,\n },\n subLabels: {\n TIRtarget: darkGrey,\n TIRminutes: black,\n glucoseMetrics: darkGrey,\n },\n ticks: {\n bg: darkGrey,\n dailyProfileBg: black,\n hour: darkGrey,\n percentile: darkGrey,\n },\n },\n line: {\n default: darkGrey,\n ticks: lightGrey,\n range: {\n target: '#00AA51',\n dailyProfileTarget: black,\n default: lightGrey,\n divider: white,\n },\n },\n white,\n black,\n lightGrey,\n mediumGrey,\n darkGrey,\n background: {\n shaded: lightGrey,\n },\n bgRange: {\n veryLow: '#CC0019',\n low: '#FF0000',\n lowShaded: '#FF8080',\n target: '#0BAD5A',\n high: '#FFBF00',\n highShaded: '#FFD180',\n veryHigh: '#FF6900',\n empty: darkGrey,\n },\n ambulatoryGlucoseProfile: {\n median: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#00AA51',\n high: '#FFA600',\n veryHigh: '#FF7538',\n },\n interQuartile: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#8BCD9E',\n high: '#FFC966',\n veryHigh: '#FFB380',\n },\n outerQuantile: {\n veryLow: '#A30014',\n low: '#FF8080',\n target: '#BEE1C6',\n high: '#FFE6B3',\n veryHigh: '#FFD9BF',\n },\n },\n dailyGlucoseProfiles: {\n low: {\n line: '#FF0000',\n fill: '#FF8080',\n },\n target: {\n line: '#00AA51',\n fill: lightGrey,\n },\n high: {\n line: '#FFA600',\n fill: '#FFD180',\n },\n },\n};\n","module.exports = require(\"text-table\");","/*\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';\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 startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = `${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 *\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 getLocalizedCeiling(utc, timePrefs) {\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 const startOfDay = moment.utc(utc)\n .tz(timezone)\n .startOf('day');\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfDay.valueOf() === utcHammertime) {\n return startOfDay.toDate();\n }\n return startOfDay.add(1, 'day').toDate();\n}\n","export default function _defineProperty(obj, key, value) {\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\n return obj;\n}","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import _ from 'lodash';\n\nimport {\n AGP_BG_CLAMP_MGDL,\n AGP_BG_CLAMP_MMOLL,\n AGP_FONT_FAMILY,\n AGP_FOOTER_Y_PADDING,\n AGP_LOWER_QUANTILE,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n AGP_TIR_MIN_HEIGHT,\n AGP_UPPER_QUANTILE,\n colors,\n fontSizes,\n text,\n} from './AGPConstants';\n\nimport { DPI, MARGINS, WIDTH, HEIGHT } from './constants';\nimport { bankersRound, formatBgValue, formatPercentage } from '../../../utils/format';\nimport { ONE_HR, getTimezoneFromTimePrefs } from '../../../utils/datetime';\nimport { mungeBGDataBins } from '../../../utils/bloodglucose';\nimport { MGDL_UNITS, MS_IN_DAY, MS_IN_HOUR } from '../../../utils/constants';\nimport moment from 'moment';\n\nexport const boldText = textString => `<b>${String(textString)}</b>`;\nexport const chartScaleToPixels = (paperPixelDimension, scaleValue) => scaleValue * paperPixelDimension;\nexport const pixelsToChartScale = (paperPixelDimension, pixels) => pixels / paperPixelDimension;\nexport const pointsToPixels = points => points * 0.75;\n\nexport const createAnnotation = options => {\n const annotation = _.defaultsDeep(options, {\n arrowside: 'none',\n font: {\n color: colors.black,\n family: AGP_FONT_FAMILY,\n },\n showarrow: false,\n });\n\n return annotation;\n};\n\nexport const calculateDataSufficiency = (data = {}) => {\n const { statsByDate } = data.data?.current?.aggregationsByDate;\n\n const {\n cgmDaysWorn,\n count,\n newestDatum,\n sampleFrequency,\n sensorUsageAGP,\n } = data.data?.current?.stats?.sensorUsage || {};\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: true,\n dailyGlucoseProfiles: true,\n glucoseMetrics: true,\n timeInRanges: true,\n };\n\n const hoursOfCGMData = (count * sampleFrequency) / MS_IN_HOUR;\n\n if (hoursOfCGMData < 24) {\n // Show nothing if <24 hours total cgm time\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: false,\n glucoseMetrics: false,\n timeInRanges: false,\n };\n } else if (hoursOfCGMData === 24) {\n // Hide agp if only 24 hours total cgm time, but show other sections conditional on sufficiency\n const sufficencyMet = sensorUsageAGP >= 70;\n\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: sufficencyMet,\n glucoseMetrics: sufficencyMet,\n timeInRanges: sufficencyMet,\n };\n }\n\n const cgmCalendarDays = _.map(_.range(_.max([cgmDaysWorn, 7])), (val, index) => (\n moment.utc(newestDatum.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse();\n\n const sensorUsageByDate = _.map(cgmCalendarDays, (date, index) => {\n const {\n count: countForDate,\n sampleFrequency: sampleFrequencyForDate,\n newestDatum: newestDatumForDate = {},\n oldestDatum: oldestDatumForDate = {},\n } = statsByDate[date]?.sensorUsage || {};\n\n if (!sampleFrequencyForDate || !countForDate) {\n return { sufficiencyMet: false, sensorUsage: 0 };\n }\n\n const minCount = MS_IN_HOUR / sampleFrequencyForDate;\n\n let maxPossibleReadings = 0;\n if (index === 0) {\n maxPossibleReadings = bankersRound((MS_IN_DAY - oldestDatumForDate.msPer24) / sampleFrequencyForDate);\n } else if (index === cgmCalendarDays.length - 1) {\n maxPossibleReadings = bankersRound(newestDatumForDate.msPer24 / sampleFrequencyForDate);\n } else {\n maxPossibleReadings = bankersRound(MS_IN_DAY / sampleFrequencyForDate);\n }\n\n const sensorUsage = maxPossibleReadings > 0 ? countForDate / maxPossibleReadings * 100 : 0;\n const sufficiencyMet = countForDate >= minCount;\n\n return ({ count: countForDate, date, maxPossibleReadings, sensorUsage, sufficiencyMet });\n });\n\n // AGP section requires that each day in the top 7 have at least an hour of data, and an average\n // sensore usage of 70%\n const sufficientDays = _.filter(sensorUsageByDate, { sufficiencyMet: true });\n const topSevenSufficientDays = _.slice(_.orderBy(sufficientDays, ['sensorUsage'], ['desc']), 0, 7);\n\n if (topSevenSufficientDays.length < 7) {\n sufficiencyBySection.ambulatoryGlucoseProfile = false;\n } else {\n const topSevenDaysSensorUsageMean = _.meanBy(topSevenSufficientDays, 'sensorUsage');\n sufficiencyBySection.ambulatoryGlucoseProfile = topSevenDaysSensorUsageMean >= 70;\n }\n\n return sufficiencyBySection;\n};\n\nexport const generateChartSections = (data) => {\n const reportInfoAndMetricsWidth = DPI * 3.375;\n const chartRenderAreaTop = DPI * 0.75;\n const rightEdge = MARGINS.left + WIDTH;\n const bottomEdge = MARGINS.top + HEIGHT;\n const chartRenderAreaBottom = bottomEdge - (DPI * 0.75 - MARGINS.bottom);\n const sectionGap = DPI * 0.25;\n const sections = {};\n const dataSufficiency = calculateDataSufficiency(data);\n\n sections.timeInRanges = {\n x: MARGINS.left,\n y: chartRenderAreaTop,\n width: DPI * 3.875,\n height: DPI * 3,\n bordered: true,\n text: text.timeInRanges,\n sufficientData: dataSufficiency.timeInRanges,\n };\n\n sections.reportInfo = {\n x: rightEdge - reportInfoAndMetricsWidth,\n y: chartRenderAreaTop,\n width: reportInfoAndMetricsWidth,\n height: DPI * 0.875,\n text: text.reportInfo,\n };\n\n sections.glucoseMetrics = {\n x: rightEdge - reportInfoAndMetricsWidth,\n y: sections.reportInfo.y + sections.reportInfo.height + sectionGap,\n width: reportInfoAndMetricsWidth,\n height: DPI * 1.875,\n bordered: true,\n text: text.glucoseMetrics,\n sufficientData: dataSufficiency.glucoseMetrics,\n };\n\n sections.ambulatoryGlucoseProfile = {\n x: MARGINS.left,\n y: DPI * 4,\n width: WIDTH,\n height: DPI * 3.5,\n bordered: true,\n text: text.ambulatoryGlucoseProfile,\n sufficientData: dataSufficiency.ambulatoryGlucoseProfile,\n };\n\n const dailyGlucoseProfilesHeight = DPI * 2.25;\n sections.dailyGlucoseProfiles = {\n x: MARGINS.left,\n y: chartRenderAreaBottom - dailyGlucoseProfilesHeight - AGP_FOOTER_Y_PADDING,\n width: WIDTH,\n height: dailyGlucoseProfilesHeight,\n bordered: true,\n text: text.dailyGlucoseProfiles,\n sufficientData: dataSufficiency.dailyGlucoseProfiles,\n };\n\n return sections;\n};\n\n/**\n * Generates the Plotly figure for the AGP Time In Ranges chart\n * @param {*} section\n * @param {*} stat\n * @param {*} bgPrefs\n * @returns\n */\nexport const generateTimeInRangesFigure = (section, stat, bgPrefs) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - DPI * 0.25 - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.425;\n const plotMarginBottom = DPI * 0.3;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginTop + plotMarginBottom);\n const barWidth = DPI * 0.35;\n const barSeparatorPixelWidth = 2;\n const yScale = pixelsToChartScale.bind(null, paperHeight);\n const xScale = pixelsToChartScale.bind(null, paperWidth);\n\n const statTotal = _.get(stat, 'data.raw.counts.total', 0);\n if (section.sufficientData) {\n const rawCounts = _.get(stat, 'data.raw.counts', {});\n\n const statDatums = [\n { id: 'veryLow', value: rawCounts.veryLow },\n { id: 'low', value: rawCounts.low },\n { id: 'target', value: rawCounts.target },\n { id: 'high', value: rawCounts.high },\n { id: 'veryHigh', value: rawCounts.veryHigh },\n ];\n\n const chartData = _.reduce(statDatums, (res, datum, i) => {\n const value = _.toNumber(datum.value) / statTotal * 1;\n const renderedValue = _.max([value, AGP_TIR_MIN_HEIGHT / 100]);\n res.rawById[datum.id] = value;\n res.raw.push(value);\n res.rendered.push(renderedValue);\n res.ticks.push((res.ticks[i - 1] || 0) + renderedValue);\n return res;\n }, { rawById: {}, raw: [], rendered: [], ticks: [] });\n\n // Needs y-scale correction since we may exceed y domain limits due to minimum bar height\n const yScaleCorrection = 1 / _.last(chartData.ticks);\n chartData.rendered = _.map(chartData.rendered, value => value * yScaleCorrection);\n chartData.ticks = _.map(chartData.ticks, value => value * yScaleCorrection);\n\n const data = _.map(statDatums, (datum, index) => ({\n x: [stat.id],\n y: [chartData.rendered[index]],\n name: datum.id,\n type: 'bar',\n width: barWidth / paperWidth * 2,\n marker: {\n color: _.toNumber(datum.value) > 0 ? colors.bgRange[datum.id] : colors.bgRange.empty,\n line: {\n color: colors.line.range.divider,\n width: barSeparatorPixelWidth,\n },\n },\n }));\n\n const bgTicks = _.map([\n bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n bgPrefs?.bgBounds?.veryHighThreshold,\n bgPrefs?.bgUnits,\n ], (tick, index) => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.timeInRanges.ticks,\n },\n text: index === 4 // bgUnits label\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n x: 0,\n xanchor: 'right',\n xshift: -2,\n y: index === 4 // bgUnits label\n ? chartData.ticks[1] + ((chartData.ticks[2] - chartData.ticks[1]) / 2)\n : chartData.ticks[index],\n yanchor: 'middle',\n }));\n\n /* eslint-disable no-param-reassign */\n const getBracketPosValues = (posX, posX2, posY, posY2) => {\n const minBracketYOffSet = yScale(13);\n\n if (_.isNumber(posY2)) {\n const maxSubBracketYOffset = yScale(24);\n if (posY - posY2 < minBracketYOffSet) posY2 = posY - minBracketYOffSet;\n const subBracketXOffset = (posX2 - posX) / 2;\n const subBracketYOffset = _.min([(posY - posY2) / 2, maxSubBracketYOffset]);\n\n return {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n };\n }\n\n // Only a single Ypos is passed for the target bracket\n // We need to ensure it's not too close to the range enxtents to avoid potential crowding\n const targetBracketAllowedYRange = [\n yScale(AGP_TIR_MIN_HEIGHT) * 3 + yScale(barSeparatorPixelWidth * 5),\n 1 - (yScale(AGP_TIR_MIN_HEIGHT) * 3 + yScale(barSeparatorPixelWidth * 5)),\n ];\n\n if (posY < targetBracketAllowedYRange[0]) posY = targetBracketAllowedYRange[0];\n if (posY > targetBracketAllowedYRange[1]) posY = targetBracketAllowedYRange[1];\n\n return { posX, posX2, posY };\n };\n /* eslint-enable no-param-reassign */\n\n const createBracketSVG = (pos) => {\n const {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n } = pos;\n\n if (_.isNumber(posY2)) {\n const radiusX = xScale(5);\n const radiusY = yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX + subBracketXOffset - radiusX}`,\n `Q ${posX + subBracketXOffset} ${posY} ${posX + subBracketXOffset} ${posY - radiusY}`,\n `V ${posY2 + radiusY}`,\n `Q ${posX + subBracketXOffset} ${posY2} ${posX + subBracketXOffset - radiusX} ${posY2}`,\n `H ${posX}`,\n `M ${posX + subBracketXOffset} ${posY2 + subBracketYOffset}`,\n `H ${posX2}`,\n ].join(' ');\n }\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const bracketYPos = [\n // Low Brackets\n chartData.ticks[0],\n yScale(-11),\n\n // Target Bracket\n chartData.ticks[1] + ((chartData.ticks[2] - chartData.ticks[1]) / 2),\n\n // High Brackets\n chartData.ticks[4],\n chartData.ticks[2] + ((chartData.ticks[3] - chartData.ticks[2]) / 2),\n ];\n\n const bracketXExtents = [xScale(barWidth + 5), xScale(paperWidth - barWidth)];\n\n const bracketPos = {\n low: getBracketPosValues(...bracketXExtents, ...bracketYPos.slice(0, 2)),\n target: getBracketPosValues(...bracketXExtents, bracketYPos[2]),\n high: getBracketPosValues(...bracketXExtents, ...bracketYPos.slice(3)),\n };\n\n const brackets = _.map(_.values(bracketPos), pos => ({\n type: 'path',\n path: createBracketSVG(pos),\n line: { color: colors.line.default, width: 0.5 },\n yref: 'paper',\n }));\n\n const createLeaderSVG = (posX, posX2, posY, posY2) => {\n const isLowLeader = posY > posY2;\n const radiusX = xScale(5);\n const radiusY = isLowLeader ? yScale(-5) : yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY2 - radiusY}`,\n `Q ${posX} ${posY2} ${posX + radiusX} ${posY2}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const leaderYPos = [\n // Very Low Leader\n 0,\n bracketPos.low.posY2 + yScale(6),\n\n // Very High Leader\n 1,\n bracketPos.high.posY + yScale(6),\n ];\n\n const leaderXExtents = [xScale(barWidth / 2), xScale(barWidth + 2)];\n\n const leaderPos = {\n veryLow: [...leaderXExtents, ...leaderYPos.slice(0, 2)],\n veryHigh: [...leaderXExtents, ...leaderYPos.slice(2)],\n };\n\n const leaders = _.map(_.values(leaderPos), pos => ({\n type: 'path',\n path: createLeaderSVG(...pos),\n line: { color: colors.black, width: 0.5 },\n yref: 'paper',\n }));\n\n const rangePosY = {\n veryLow: bracketPos.low.posY2,\n low: bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: bracketPos.high.posY2,\n veryHigh: bracketPos.high.posY,\n };\n\n const rangePosYOrderedKeys = [\n 'veryLow',\n 'low',\n 'target',\n 'high',\n 'veryHigh',\n ];\n\n const rangeLabels = _.map(rangePosYOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.timeInRanges.values,\n },\n text: boldText(text.bgRanges[range]),\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n }));\n\n const rangeValuesOrderedKeys = [\n 'veryLow',\n 'low',\n 'high',\n 'veryHigh',\n ];\n\n const rangeValues = _.map(rangeValuesOrderedKeys, range => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.timeInRanges.values,\n },\n text: boldText(formatPercentage(chartData.rawById[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'right',\n xshift: -4,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n }));\n\n const rangeSummaryPosY = {\n low: bracketPos.low.posY2 + bracketPos.low.subBracketYOffset,\n target: bracketPos.target.posY,\n high: bracketPos.high.posY2 + bracketPos.high.subBracketYOffset,\n };\n\n const combinedRangeSummaryValues = {\n low: chartData.rawById.veryLow + chartData.rawById.low,\n target: chartData.rawById.target,\n high: chartData.rawById.veryHigh + chartData.rawById.high,\n };\n\n const rangeSummaryOrderedKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const rangeSummaryValues = _.map(rangeSummaryOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.timeInRanges.summaries,\n },\n text: boldText(formatPercentage(combinedRangeSummaryValues[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: 3,\n y: rangeSummaryPosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const goalsPos = {\n veryLow: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.low.posY2,\n yshift: -12,\n },\n lowCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.low.posY2 + bracketPos.low.subBracketYOffset,\n yshift: 1,\n },\n target: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.target.posY,\n yshift: 1,\n },\n highCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.high.posY2 + bracketPos.high.subBracketYOffset,\n yshift: 1,\n },\n veryHigh: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.high.posY,\n yshift: 11,\n },\n };\n\n const goalsOrderedKeys = [\n 'veryLow',\n 'lowCombined',\n 'target',\n 'highCombined',\n 'veryHigh',\n ];\n\n const goals = _.map(goalsOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.goals[range],\n size: fontSizes.timeInRanges.goals,\n },\n text: text.goals[range],\n yanchor: 'bottom',\n yref: 'paper',\n ...goalsPos[range],\n }));\n\n const subLabelsPos = {\n TIRtarget: {\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: -20,\n y: bracketPos.target.posY,\n yshift: -12,\n },\n TIRminutes: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 7,\n y: bracketPos.low.posY2,\n yshift: -12,\n },\n };\n\n const subLabelsOrderedKeys = [\n 'TIRtarget',\n 'TIRminutes',\n ];\n\n const subLabels = _.map(subLabelsOrderedKeys, label => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.subLabels[label],\n size: fontSizes.timeInRanges.subLabels,\n },\n text: text.subLabels[label],\n yanchor: 'bottom',\n yref: 'paper',\n ...subLabelsPos[label],\n }));\n\n const rangeAnnotations = {\n veryLow: [\n rangeLabels[0],\n rangeValues[0],\n goals[0],\n ],\n low: [\n rangeLabels[1],\n rangeValues[1],\n ],\n lowSummary: [\n rangeSummaryValues[0],\n goals[1],\n ],\n target: [\n rangeLabels[2],\n rangeSummaryValues[1],\n goals[2],\n subLabels[0],\n ],\n high: [\n rangeLabels[3],\n rangeValues[2],\n ],\n veryHigh: [\n rangeLabels[4],\n rangeValues[3],\n goals[4],\n ],\n highSummary: [\n rangeSummaryValues[2],\n goals[3],\n ],\n };\n\n const layout = {\n barmode: 'stack',\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n yaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n annotations: [\n ...bgTicks,\n ...rangeAnnotations.veryHigh,\n ...rangeAnnotations.high,\n ...rangeAnnotations.highSummary,\n ...rangeAnnotations.target,\n ...rangeAnnotations.low,\n ...rangeAnnotations.veryLow,\n ...rangeAnnotations.lowSummary,\n subLabels[1],\n ],\n\n shapes: [\n ...brackets,\n ...leaders,\n ],\n };\n\n const figure = { data, layout };\n return figure;\n }\n\n return null;\n};\n\nexport const generateAmbulatoryGlucoseProfileFigure = (section, cbgData, bgPrefs) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginY = DPI * 0.2;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginY * 2);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n const chartData = mungeBGDataBins('cbg', ONE_HR, cbgData, [AGP_LOWER_QUANTILE, AGP_UPPER_QUANTILE]);\n\n // Smooth all bin quantiles according to AGP spec\n const quantileKeys = [\n 'lowerQuantile',\n 'firstQuartile',\n 'median',\n 'thirdQuartile',\n 'upperQuantile',\n ];\n\n const firstDatum = chartData[0];\n const lastDatum = chartData[chartData.length - 1];\n\n const smoothDatum = (prev, curr, next) => {\n // return with current value if current bin, or both adjacent bins, are empty\n if ((!prev && !next) || !curr) {\n return curr;\n } else if (!prev || !next) {\n // Weight at 0-4-1 or 1-4-0 respectively if one of the adjacent bins is empty\n return _.sum([prev || 0, curr * 4, next || 0]) / 5;\n }\n // Weight at 1-4-1\n return _.sum([prev, curr * 4, next]) / 6;\n };\n\n const smoothedChartData = _.map(chartData, (datum, index) => ({\n ...datum,\n ..._.reduce(quantileKeys, (result, key) => {\n result[key] = smoothDatum( // eslint-disable-line no-param-reassign\n chartData[index - 1]?.[key] || lastDatum[key],\n datum[key],\n chartData[index + 1]?.[key] || firstDatum[key]\n );\n return result;\n }, {}),\n }));\n\n // Prepend/append extent datums to opposite ends to allow fully cyclic traces across the entire\n // X axis. Otherwise, the first and last 1/2 hours will not be rendered.\n const firstSmoothedDatum = smoothedChartData[0];\n const lastSmoothedDatum = smoothedChartData[smoothedChartData.length - 1];\n smoothedChartData.unshift({ ...lastSmoothedDatum, msX: firstSmoothedDatum.msX - ONE_HR });\n smoothedChartData.push({ ...firstSmoothedDatum, msX: lastSmoothedDatum.msX + ONE_HR });\n\n const quantileBand = (upperKey, lowerKey, key, bgRange, index) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(smoothedChartData, 'msX'), ..._.map(_.reverse([...smoothedChartData]), 'msX')],\n y: [..._.map(smoothedChartData, upperKey), ..._.map(_.reverse([...smoothedChartData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'tozerox',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'spline',\n smoothing: 0.5,\n },\n });\n\n const bgRangeKeys = [\n 'veryLow',\n 'low',\n 'target',\n 'high',\n 'veryHigh',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n bgPrefs?.bgBounds?.veryHighThreshold,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(bgTicks, (tick, index) => {\n const isTarget = _.includes([2, 3], index);\n let yshift = 0;\n if (index === 0) yshift = 4;\n if (index === 1) yshift = -2;\n\n return createAnnotation({\n align: 'right',\n font: {\n color: isTarget ? colors.white : colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgTicks,\n },\n height: 9,\n text: index === 0\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift,\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n });\n });\n\n const createbgTargetMarkerSVG = (posX, posY) => {\n const radiusX = 2;\n const radiusY = 2;\n const width = 22;\n const height = 10;\n const posXLeft = posX - width;\n const posYTop = posY + height / 2;\n const posYBottom = posY - height / 2;\n const arrowHeight = height / 2 - 1;\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY - 1}`,\n `L ${posX - arrowHeight} ${posYBottom}`,\n `H ${posXLeft + radiusX}`,\n `Q ${posXLeft} ${posYBottom} ${posXLeft} ${posYBottom + radiusY}`,\n `V ${posYTop - radiusY}`,\n `Q ${posXLeft} ${posYTop} ${posXLeft + radiusX} ${posYTop}`,\n `H ${posX - arrowHeight}`,\n `L ${posX} ${posY + 1}`,\n `V ${posY}`,\n ].join(' ');\n };\n\n const bgTargetMarkers = _.map(_.slice(bgTicks, 2, 4), tick => ({\n fillcolor: colors.line.range.target,\n line: {\n width: 0,\n },\n tick,\n path: createbgTargetMarkerSVG(-1, tick / yClamp * paperHeight),\n type: 'path',\n xanchor: 0,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0,\n yref: 'paper',\n ysizemode: 'pixel',\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 5;\n const isTarget = _.includes([2, 3], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.target : colors.line.range.default,\n width: isTarget ? 2 : 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const percentileTicks = _.map(quantileKeys, key => {\n if (firstSmoothedDatum[key] && lastSmoothedDatum[key]) {\n return (firstSmoothedDatum[key] + lastSmoothedDatum[key]) / 2;\n }\n return firstSmoothedDatum[key] || lastSmoothedDatum[key];\n });\n\n const percentileLabels = ['5%', '25%', '50%', '75%', '95%'];\n\n // Ensure that percentile ticks and annotations don't crowd\n const percentileTickYPositions = _.map(percentileTicks, tick => chartScaleToPixels(paperHeight, tick / yClamp));\n const percentileTickShiftedYPositions = [...percentileTickYPositions];\n const medianYPos = percentileTickYPositions[2];\n const minGap = pointsToPixels(fontSizes.ambulatoryGlucoseProfile.percentileTicks) + 2;\n percentileTickShiftedYPositions[1] = _.min([medianYPos - minGap, percentileTickShiftedYPositions[1]]);\n percentileTickShiftedYPositions[0] = _.min([percentileTickShiftedYPositions[1] - minGap, percentileTickShiftedYPositions[0]]);\n percentileTickShiftedYPositions[3] = _.max([medianYPos + minGap, percentileTickShiftedYPositions[3]]);\n percentileTickShiftedYPositions[4] = _.max([percentileTickShiftedYPositions[3] + minGap, percentileTickShiftedYPositions[4]]);\n const percentileTickYShifts = _.map(percentileTickShiftedYPositions, (shiftedYPos, index) => (shiftedYPos - percentileTickYPositions[index]));\n\n const percentileTickAnnotations = _.map(percentileTicks, (tick, index) => createAnnotation({\n align: 'left',\n font: {\n color: index === 2 ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n text: boldText(percentileLabels[index]),\n visible: tick / yClamp <= 1,\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: percentileTickYShifts[index],\n xanchor: 'left',\n xref: 'x',\n xshift: 5,\n x: MS_IN_DAY,\n }));\n\n const percentileTickLines = _.map(percentileTicks, (tick, index) => ({\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n type: 'line',\n visible: tick / yClamp <= 1,\n x0: paperWidth,\n x1: paperWidth + 5,\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp + pixelsToChartScale(paperHeight, percentileTickYShifts[index]),\n yref: 'paper',\n }));\n\n const quarterDayTicks = _.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 6);\n\n const hourlyTicks = _.filter(\n _.range(0, MS_IN_DAY + 1, MS_IN_HOUR),\n tick => ((tick / MS_IN_HOUR) % 12 !== 0)\n );\n\n const hourlyTicksAnnotations = _.map(_.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 3), tick => createAnnotation({\n align: 'center',\n font: {\n color: (tick / MS_IN_HOUR) % 12 === 0 ? colors.black : colors.darkGrey,\n size: fontSizes.ambulatoryGlucoseProfile.hourlyTicks,\n },\n text: boldText(moment.utc(tick).format('ha')),\n y: 0,\n yanchor: 'top',\n yref: 'y',\n yshift: 0,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const data = [];\n const yAxes = [];\n\n _.each(bgRangeKeys, (bgRange, index) => {\n data.push(quantileBand('upperQuantile', 'lowerQuantile', 'outerQuantile', bgRange, index));\n data.push(quantileBand('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index));\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(smoothedChartData, 'msX'),\n y: _.map(smoothedChartData, 'median'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n simplify: false,\n shape: 'spline',\n width: 3,\n smoothing: 0.5,\n },\n });\n\n const range = [bgTicks[index], bgTicks[index + 1]];\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n const layout = {\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginY,\n t: plotMarginY,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: quarterDayTicks,\n zeroline: false,\n },\n\n // secondary axis for hourly ticks\n xaxis2: {\n range: [0, MS_IN_DAY],\n overlaying: 'x',\n showgrid: false,\n showline: false,\n showticklabels: false,\n ticks: 'inside',\n tickcolor: colors.lightGrey,\n ticklen: 5,\n tickvals: hourlyTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...percentileTickAnnotations,\n ...hourlyTicksAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: bgPrefs?.bgUnits,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: bgTicks[5] / yClamp,\n yanchor: 'top',\n yref: 'paper',\n yshift: -4,\n }),\n\n createAnnotation({\n font: {\n color: colors.black,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: boldText(text.ambulatoryGlucoseProfile.targetRange),\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: _.mean(_.slice(bgTicks, 2, 4)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...bgTargetMarkers,\n ...percentileTickLines,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n { visible: false, xaxis: 'x2' },\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n\nexport const generateDailyGlucoseProfilesFigure = (section, cbgData, bgPrefs, dateLabelFormat) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.2;\n const plotMarginBottom = 1;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n\n const bgRangeKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(_.slice(bgTicks, 1, 3), tick => createAnnotation({\n align: 'right',\n font: {\n color: colors.text.ticks.dailyProfileBg,\n size: fontSizes.dailyGlucoseProfiles.bgTicks,\n },\n text: boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 3;\n const isTarget = _.includes([1, 2], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.dailyProfileTarget : colors.line.range.default,\n width: 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const halfDayTicks = _.range(0, MS_IN_DAY * 7 + 1, MS_IN_HOUR * 12);\n\n const halfDayTickAnnotations = _.map(_.filter(halfDayTicks, (tick, index) => index % 2 !== 0), (tick, index) => createAnnotation({\n align: 'center',\n font: {\n color: colors.black,\n size: dateLabelFormat === 'ha'\n ? fontSizes.dailyGlucoseProfiles.timeTicks\n : fontSizes.dailyGlucoseProfiles.weekdayTicks,\n },\n text: dateLabelFormat === 'ha'\n ? boldText(moment.utc(tick).format(dateLabelFormat))\n : boldText(moment.utc(String(cbgData[index][0])).format(dateLabelFormat)),\n y: 1,\n yanchor: 'bottom',\n yref: 'paper',\n yshift: 1,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const calendarDays = _.flatten(_.map(cbgData, (d) => d[0]));\n\n const calendarDayAnnotations = _.map(calendarDays, (date, index) => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.calendarDates,\n size: fontSizes.dailyGlucoseProfiles.calendarDates,\n },\n text: boldText(moment.utc(date).format('D')),\n y: 1,\n yanchor: 'top',\n yref: 'paper',\n yshift: 0,\n xanchor: 'left',\n xref: 'x',\n xshift: 0,\n x: index * MS_IN_DAY,\n }));\n\n const data = [];\n const yAxes = [];\n\n const combinedData = _.flatten(_.map(cbgData, (d, index) => (_.map(d[1], dayData => ({\n ...dayData,\n msPer24: dayData.msPer24 + MS_IN_DAY * index,\n })))));\n\n _.each(bgRangeKeys, (bgRange, index) => {\n const isLow = index === 0;\n const isTarget = index === 1;\n const firstDatum = _.first(combinedData);\n const lastDatum = _.last(combinedData);\n const range = [bgTicks[index], bgTicks[index + 1]];\n const fillYExentRangeIndex = isLow ? 1 : 0;\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: isTarget\n ? [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0]\n : [firstDatum?.msPer24, ..._.map(combinedData, 'msPer24'), lastDatum?.msPer24, firstDatum?.msPer24],\n y: isTarget\n ? [range[1], range[1], range[0], range[0]]\n : [range[fillYExentRangeIndex], ..._.map(combinedData, 'value'), range[fillYExentRangeIndex], range[fillYExentRangeIndex]],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles[bgRange].fill,\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(combinedData, 'msPer24'),\n y: _.map(combinedData, 'value'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n const layout = {\n width: chartAreaWidth,\n height: plotHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY * 7],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: halfDayTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...halfDayTickAnnotations,\n ...calendarDayAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.dailyGlucoseProfiles.bgUnits,\n },\n text: boldText(bgPrefs?.bgUnits),\n textangle: 270,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -18,\n y: _.mean(_.slice(bgTicks, 1, 3)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: 0,\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ],\n };\n\n const figure = {\n data,\n layout,\n };\n\n return figure;\n }\n\n return null;\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 moment from 'moment';\nimport i18next from 'i18next';\n\nimport { getPumpVocabulary } from '../device';\nimport {\n generateBgRangeLabels,\n reshapeBgClassesToBgBounds,\n} from '../bloodglucose';\n\nimport {\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE_TYPE_UNDECLARED,\n AUTOMATED_DELIVERY,\n AUTOMATED_SUSPEND,\n INSULET,\n TANDEM,\n ANIMAS,\n MEDTRONIC,\n MICROTECH,\n pumpVocabulary,\n} from '../constants';\n\nimport TextUtil from '../text/TextUtil';\nimport { statsText } from '../stat';\n\nconst t = i18next.t.bind(i18next);\n\n// Exporting utils for easy stubbing in tests\nexport const utils = {\n reshapeBgClassesToBgBounds,\n statsText,\n TextUtil,\n};\n\n/**\n * Define sections and dimensions used in the basics view\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpUpload Tidepool latest pump upload datum\n * @returns {Object} sections\n */\nexport function defineBasicsAggregations(bgPrefs, manufacturer, pumpUpload = {}) {\n const bgLabels = generateBgRangeLabels(bgPrefs);\n bgLabels.veryLow = _.upperFirst(bgLabels.veryLow);\n bgLabels.veryHigh = _.upperFirst(bgLabels.veryHigh);\n\n const deviceLabels = getPumpVocabulary(manufacturer);\n\n const sectionNames = [\n 'basals',\n 'boluses',\n 'fingersticks',\n 'siteChanges',\n ];\n\n const sections = {};\n\n _.each(sectionNames, section => {\n let type = section;\n let dimensions;\n let title = '';\n let summaryTitle;\n let perRow = 3;\n\n switch (section) {\n case 'basals':\n title = 'Basals';\n summaryTitle = t('Total basal events');\n dimensions = [\n { path: 'basal.summary', key: 'total', label: t('Basal Events'), primary: true },\n { path: 'basal.summary.subtotals', key: 'temp', label: t('Temp Basals') },\n { path: 'basal.summary.subtotals', key: 'suspend', label: t('Suspends') },\n {\n path: 'basal.summary.subtotals',\n key: 'automatedStop',\n label: t('{{automatedLabel}} Exited', {\n automatedLabel: deviceLabels[AUTOMATED_DELIVERY],\n }),\n hideEmpty: true,\n },\n {\n path: 'automatedSuspend.summary.subtotals',\n key: 'automatedSuspend',\n label: deviceLabels[AUTOMATED_SUSPEND],\n hideEmpty: true,\n },\n ];\n perRow = 4;\n break;\n\n case 'boluses':\n title = t('Bolusing');\n summaryTitle = t('Avg boluses / day');\n dimensions = [\n { path: 'summary', key: 'total', label: t('Avg per day'), average: true, primary: true },\n { path: 'summary.subtotals', key: 'wizard', label: t('Calculator'), percentage: true, selectorIndex: 0 },\n { path: 'summary.subtotals', key: 'correction', label: t('Correction'), percentage: true, selectorIndex: 1 },\n { path: 'summary.subtotals', key: 'extended', label: t('Extended'), percentage: true, selectorIndex: 4 },\n { path: 'summary.subtotals', key: 'interrupted', label: t('Interrupted'), percentage: true, selectorIndex: 5 },\n { path: 'summary.subtotals', key: 'override', label: t('Override'), percentage: true, selectorIndex: 2 },\n { path: 'summary.subtotals', key: 'underride', label: t('Underride'), percentage: true, selectorIndex: 6 },\n ];\n\n if (pumpUpload.isAutomatedBolusDevice) {\n dimensions.push(...[\n { path: 'summary.subtotals', key: 'manual', label: t('Manual'), percentage: true, selectorIndex: 3 },\n { path: 'summary.subtotals', key: 'automated', label: t('Automated'), percentage: false, selectorIndex: 7 },\n ]);\n perRow = 4;\n }\n break;\n\n case 'fingersticks':\n title = t('BG readings');\n summaryTitle = t('Avg BG readings / day');\n dimensions = [\n { path: 'smbg.summary', key: 'total', label: t('Avg per day'), average: true, primary: true },\n { path: 'smbg.summary.subtotals', key: 'meter', label: t('Meter'), percentage: true },\n { path: 'smbg.summary.subtotals', key: 'manual', label: t('Manual'), percentage: true },\n { path: 'calibration.summary.subtotals', key: 'calibration', label: t('Calibrations'), hideEmpty: true },\n { path: 'smbg.summary.subtotals', key: 'veryLow', label: bgLabels.veryLow, percentage: true },\n { path: 'smbg.summary.subtotals', key: 'veryHigh', label: bgLabels.veryHigh, percentage: true },\n ];\n break;\n\n case 'siteChanges':\n title = t('Infusion site changes');\n break;\n\n default:\n type = false;\n break;\n }\n\n sections[section] = {\n dimensions,\n perRow,\n summaryTitle,\n title,\n type,\n };\n });\n\n return sections;\n}\n\n/**\n * Generate the day labels based on the days supplied by the processed basics view data\n *\n * @export\n * @param {Array} days - supplied by the processed basics view data\n * @returns {Array} labels - formatted day labels. I.E. [Mon, Tues, Wed, ...]\n */\nexport function generateCalendarDayLabels(days) {\n const firstDay = moment.utc(days[0].date).day();\n\n return _.map(_.range(firstDay, firstDay + 7), dow => (\n moment.utc().day(dow).format('ddd')\n ));\n}\n\n/**\n * Determine the site change source for the patient\n * @param {Object} patient\n * @param {String} manufacturer\n */\nexport function getSiteChangeSource(patient = {}, manufacturer) {\n const {\n settings,\n } = patient;\n\n let siteChangeSource = SITE_CHANGE_TYPE_UNDECLARED;\n\n if (_.includes(_.map([ANIMAS, MEDTRONIC, TANDEM], _.lowerCase), manufacturer)) {\n siteChangeSource = _.get(settings, 'siteChangeSource');\n const allowedSources = [SITE_CHANGE_CANNULA, SITE_CHANGE_TUBING];\n\n if (!_.includes(allowedSources, siteChangeSource)) {\n siteChangeSource = SITE_CHANGE_TYPE_UNDECLARED;\n }\n } else if (_.includes(_.map([INSULET, MICROTECH], _.lowerCase), manufacturer)) {\n siteChangeSource = SITE_CHANGE_RESERVOIR;\n }\n\n return siteChangeSource;\n}\n\n/**\n * Get the device-specific label for the site change source\n * @param {String} siteChangeSource\n * @param {String} manufacturer\n */\nexport function getSiteChangeSourceLabel(siteChangeSource, manufacturer) {\n const fallbackSubtitle = siteChangeSource !== SITE_CHANGE_TYPE_UNDECLARED\n ? pumpVocabulary.default[SITE_CHANGE_RESERVOIR]\n : null;\n\n return _.get(\n pumpVocabulary,\n [_.upperFirst(manufacturer), siteChangeSource],\n fallbackSubtitle,\n );\n}\n\n/**\n * Set the availability of basics sections\n *\n * @export\n * @param {Object} Provided data with empty sections disabled and empty text statements provided\n */\nexport function processBasicsAggregations(aggregations, data, patient, manufacturer) {\n /* eslint-disable no-param-reassign, max-len */\n const aggregationData = _.cloneDeep(data);\n\n const hasDataInRange = processedData => (\n processedData && (_.keys(processedData.byDate).length > 0)\n );\n\n const getEmptyText = (aggregation, aggregationKey) => {\n /* eslint-disable max-len */\n let emptyText;\n\n switch (aggregationKey) {\n case 'basals':\n case 'boluses':\n emptyText = t(\"This section requires data from an insulin pump, so there's nothing to display.\");\n break;\n\n case 'siteChanges':\n emptyText = hasDataInRange(aggregationData[aggregationKey])\n ? t(\"Please choose a preferred site change source from the 'Basics' web view to view this data.\")\n : t(\"This section requires data from an insulin pump, so there's nothing to display.\");\n break;\n\n case 'fingersticks':\n emptyText = t(\"This section requires data from a blood-glucose meter, so there's nothing to display.\");\n break;\n\n default:\n emptyText = t('Why is this grey? There is not enough data to show this statistic.');\n break;\n }\n\n return emptyText;\n /* eslint-enable max-len */\n };\n\n _.each(aggregations, (aggregation, key) => {\n const type = aggregation.type;\n let disabled = false;\n\n if (type === 'boluses') {\n disabled = !hasDataInRange(aggregationData[type]);\n } else if (type === 'basals') {\n const hasBasal = hasDataInRange(aggregationData[type]?.basal);\n const hasAutomatedSuspend = hasDataInRange(aggregationData[type]?.automatedSuspend);\n disabled = !hasBasal && !hasAutomatedSuspend;\n } else if (type === 'fingersticks') {\n const hasSMBG = hasDataInRange(aggregationData[type]?.smbg);\n const hasCalibrations = hasDataInRange(aggregationData[type]?.calibration);\n disabled = !hasSMBG && !hasCalibrations;\n } else if (type === 'siteChanges') {\n aggregations[key].source = getSiteChangeSource(patient, manufacturer);\n aggregations[key].manufacturer = manufacturer;\n disabled = aggregations[key].source === SITE_CHANGE_TYPE_UNDECLARED;\n if (!disabled) {\n aggregations[key].subTitle = getSiteChangeSourceLabel(\n aggregations[key].source,\n manufacturer\n );\n }\n }\n\n if (disabled) {\n aggregations[key].emptyText = getEmptyText(aggregation, key);\n }\n\n aggregations[key].disabled = disabled;\n });\n /* eslint-enable no-param-reassign */\n\n return aggregations;\n}\n\n/**\n * Get a keyed list of dates in range, designated as future, past, or most recent\n * @param {Array} range - The start and end points (Zulu timestamp or integer hammertime)\n * @param {String} timezone - A valid timezone, UTC if undefined\n * @returns {Object} Map of objects keyed by date\n */\nexport function findBasicsDays(range, timezone = 'UTC') {\n const days = [];\n const rangeStartDate = moment.utc(range[0]).tz(timezone).format('YYYY-MM-DD');\n const rangeEndDate = moment.utc(range[1]).tz(timezone).subtract(1, 'ms').format('YYYY-MM-DD');\n let currentDate = moment.utc(range[0]).tz(timezone).startOf('isoWeek').toDate();\n while (currentDate < moment.utc(range[1]).tz(timezone).endOf('isoWeek')) {\n const date = moment.utc(currentDate).tz(timezone).format('YYYY-MM-DD');\n const dateObj = { date };\n if (date < rangeStartDate || date > rangeEndDate) {\n dateObj.type = 'outOfRange';\n } else {\n dateObj.type = 'inRange';\n }\n days.push(dateObj);\n currentDate = moment.utc(currentDate).tz(timezone).add(1, 'days').toDate();\n }\n return days;\n}\n\n/**\n * Find the appropriate start endpoint for basics calendars given the timestamp of the latest datum\n * @param {String} timestamp - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezone - A valid timezone, UTC if undefined\n * @returns {String} ISO date string relative to provided timezone\n */\nexport function findBasicsStart(timestamp, timezone = 'UTC') {\n return moment.utc(_.isInteger(timestamp) ? timestamp : Date.parse(timestamp)).tz(timezone)\n .startOf('isoWeek')\n .subtract(14, 'days')\n .toDate();\n}\n\n/**\n * basicsText\n * @param {Object} patient - the patient object that contains the profile\n * @param {Object} data - DataUtil data object\n * @param {Array} stats - Processed stats array\n * @param {Object} stats - Processed aggregations object\n *\n * @return {String} Basics data as a formatted string\n */\nexport function basicsText(patient, data, stats, aggregations) {\n const {\n data: {\n aggregationsByDate = {},\n current: {\n endpoints = {},\n },\n },\n bgPrefs,\n timePrefs,\n query,\n } = data;\n\n const textUtil = new utils.TextUtil(patient, endpoints.range, timePrefs);\n\n let basicsString = textUtil.buildDocumentHeader('Basics');\n basicsString += textUtil.buildDocumentDates();\n\n if (_.get(query, 'excludeDaysWithoutBolus')) {\n basicsString += textUtil.buildTextLine(t('Days with no boluses have been excluded from bolus calculations'));\n }\n\n basicsString += utils.statsText(stats, textUtil, bgPrefs);\n\n const getSummaryTableData = (dimensions, statData, header) => {\n const rows = [];\n const columns = [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ];\n\n _.each(dimensions, dimension => {\n const pathValue = _.get(statData, [...dimension.path.split('.'), dimension.key]);\n\n const value = dimension.average\n ? Math.round(_.get(statData, [...dimension.path.split('.'), 'avgPerDay']))\n : _.get(pathValue, 'count', pathValue || 0);\n\n const stat = {\n label: dimension.label,\n value: value.toString(),\n };\n\n if (dimension.primary) {\n stat.label = header;\n rows.unshift(stat);\n } else {\n if (value === 0 && dimension.hideEmpty) {\n return;\n }\n rows.push(stat);\n }\n });\n\n return { rows, columns };\n };\n\n const getSiteChangesTableData = (infusionSiteData, siteChangeSource) => {\n const rows = [];\n const columns = [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ];\n\n _.each(_.valuesIn(infusionSiteData), datum => {\n const daysSince = _.get(datum, ['summary', 'daysSince', siteChangeSource]);\n if (daysSince) rows.push(daysSince);\n });\n\n return {\n columns,\n rows: [\n { label: 'Mean Duration', value: `${Math.round(_.mean(rows) * 10) / 10} days` },\n { label: 'Longest Duration', value: `${_.max(rows)} days` },\n ],\n };\n };\n\n if (!aggregations.fingersticks.disabled) {\n const fingersticks = getSummaryTableData(\n aggregations.fingersticks.dimensions,\n aggregationsByDate.fingersticks,\n aggregations.fingersticks.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n fingersticks.rows,\n fingersticks.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.boluses.disabled) {\n const boluses = getSummaryTableData(\n aggregations.boluses.dimensions,\n aggregationsByDate.boluses,\n aggregations.boluses.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n boluses.rows,\n boluses.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.siteChanges.disabled) {\n const siteChanges = getSiteChangesTableData(\n _.get(aggregationsByDate, 'siteChanges.byDate', {}),\n aggregations.siteChanges.source,\n );\n\n basicsString += textUtil.buildTextTable(\n `${aggregations.siteChanges.title} from '${aggregations.siteChanges.subTitle}'`,\n siteChanges.rows,\n siteChanges.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.basals.disabled) {\n const basals = getSummaryTableData(\n aggregations.basals.dimensions,\n aggregationsByDate.basals,\n aggregations.basals.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n basals.rows,\n basals.columns,\n { showHeader: false }\n );\n }\n\n return basicsString;\n}\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}","module.exports = require(\"i18next\");","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","module.exports = \"data:image/png;base64,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\"","function _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, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","import _typeof from \"../../helpers/esm/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\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 { DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\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, 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 const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n if (classificationType === 'fiveWay') {\n if (bgValue < veryLowThreshold) {\n return 'veryLow';\n } else if (bgValue >= veryLowThreshold && bgValue < targetLowerBound) {\n return 'low';\n } else if (bgValue > targetUpperBound && bgValue <= veryHighThreshold) {\n return 'high';\n } else if (bgValue > veryHighThreshold) {\n return 'veryHigh';\n }\n return 'target';\n }\n if (bgValue < targetLowerBound) {\n return 'low';\n } else if (bgValue > 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 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 thresholds = _.mapValues(bgBounds, threshold => formatBgValue(threshold, bgPrefs));\n\n if (opts.condensed) {\n return {\n veryLow: `<${thresholds.veryLowThreshold}`,\n low: `${thresholds.veryLowThreshold}-${thresholds.targetLowerBound}`,\n target: `${thresholds.targetLowerBound}-${thresholds.targetUpperBound}`,\n high: `${thresholds.targetUpperBound}-${thresholds.veryHighThreshold}`,\n veryHigh: `>${thresholds.veryHighThreshold}`,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n prefix: 'below',\n suffix: bgUnits,\n value: `${thresholds.veryLowThreshold}`,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.veryLowThreshold}-${thresholds.targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.targetLowerBound}-${thresholds.targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.targetUpperBound}-${thresholds.veryHighThreshold}`,\n },\n veryHigh: {\n prefix: 'above',\n suffix: bgUnits,\n value: `${thresholds.veryHighThreshold}`,\n },\n };\n }\n\n return {\n veryLow: `below ${thresholds.veryLowThreshold} ${bgUnits}`,\n low: `between ${thresholds.veryLowThreshold} - ${thresholds.targetLowerBound} ${bgUnits}`,\n target: `between ${thresholds.targetLowerBound} - ${thresholds.targetUpperBound} ${bgUnits}`,\n high: `between ${thresholds.targetUpperBound} - ${thresholds.veryHighThreshold} ${bgUnits}`,\n veryHigh: `above ${thresholds.veryHighThreshold} ${bgUnits}`,\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 let datumWeight = 1;\n const deviceId = _.get(datum, 'deviceId', '');\n\n // Because our decision as to whether or not there's enough cgm data to warrant using\n // it to calculate average BGs is based on the expected number of readings in a day,\n // we need to adjust the weight of a for the Freestyle Libre datum, as it only\n // collects BG samples every 15 minutes as opposed the default 5 minutes from dexcom.\n if (datum.type === 'cbg' && deviceId.indexOf('AbbottFreeStyleLibre') === 0) {\n datumWeight = 3;\n }\n\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Get the CGM sample frequency in milliseconds from a CGM data point. Most devices default at a\n * 5 minute interval, but others, such as the Abbot FreeStyle Libre, sample every 15 mins\n *\n * @param {Array} datum - a cgm data point\n */\nexport function cgmSampleFrequency(datum) {\n const deviceId = _.get(datum, 'deviceId', '');\n if (deviceId.indexOf('AbbottFreeStyleLibre3') === 0) {\n return 5 * MS_IN_MIN;\n }\n\n if (deviceId.indexOf('AbbottFreeStyleLibre') === 0) {\n return 15 * MS_IN_MIN;\n }\n\n return 5 * MS_IN_MIN;\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 centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(data),\n mean: mean(data),\n max: max(data),\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 * 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) 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 * 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, useAGPFormat) {\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 useAGPFormat\n ? bankersRound(val, 1).toFixed(1)\n : format('.1f')(val);\n }\n\n return useAGPFormat\n ? bankersRound(val).toString()\n : format('d')(val);\n}\n\n/**\n * formatDecimalNumber\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 * 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","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\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 if the provided upload datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettings = {}, deviceModel) {\n return _.includes(\n _.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []),\n deviceModel\n ) || (manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0);\n}\n\n/**\n * Check if the provided upload datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettings = {}) {\n return manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check if the provided upload datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettings = {}) {\n return manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0;\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, _.upperFirst(manufacturer), {}),\n vocabulary.default\n );\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;","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 PHYSICAL_ACTIVITY,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n SLEEP,\n} from './constants';\n\nimport { getPumpVocabulary } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue } 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 formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n _.defaults(opts, {\n emptyDataPlaceholder: '--',\n forcePlainTextValues: false,\n });\n\n const total = _.get(opts, 'data.total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = opts.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(opts.bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(opts.bgPrefs, 'bgBounds'), value);\n value = formatBgValue(value, opts.bgPrefs, undefined, opts.useAGPFormat);\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 = opts.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 = opts.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 const percentage = (value / total) * 100;\n let precision = 0;\n // We want to show extra precision on very small percentages so that we avoid showing 0%\n // when there is some data there.\n if (percentage > 0 && percentage < 0.5) {\n precision = percentage < 0.05 ? 2 : 1;\n }\n value = formatDecimalNumber(percentage, precision);\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(opts.bgPrefs, 'bgBounds'), lowerValue)\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(opts.bgPrefs, 'bgBounds'), upperValue);\n\n lowerValue = formatBgValue(lowerValue, opts.bgPrefs);\n upperValue = formatBgValue(upperValue, opts.bgPrefs);\n\n value = !opts.forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n &nbsp;-&nbsp;\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, opts.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\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.'));\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. 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 a settings override.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabel}} divided by the total duration of settings overrides for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabel}}.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in a settings override.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabel}} divided by the total duration of settings overrides for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabel}}.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\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'));\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 this time period.'));\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: 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 bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\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\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 = [\n {\n id: 'veryLow',\n value: ensureNumeric(data.veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n },\n {\n id: 'low',\n value: ensureNumeric(data.low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n {\n id: 'veryHigh',\n value: ensureNumeric(data.veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n },\n ];\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.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 = [\n {\n id: 'physicalActivity',\n value: ensureNumeric(_.get(data, 'physicalActivity', 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [PHYSICAL_ACTIVITY, 'label']) }),\n legendTitle: _.get(vocabulary, [PHYSICAL_ACTIVITY, 'label']),\n },\n {\n id: 'sleep',\n value: ensureNumeric(_.get(data, 'sleep', 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [SLEEP, 'label']) }),\n legendTitle: _.get(vocabulary, [SLEEP, 'label']),\n },\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 = [\n {\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 {\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n },\n ];\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\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('BG Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\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 };\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 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","/*\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';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n} from '../../utils/constants';\n\nconst DISPLAY_PRECISION_PLACES = 3;\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\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 };\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, DISPLAY_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(DISPLAY_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(DISPLAY_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, DISPLAY_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\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\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\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 const 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 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 const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${maxBasal} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION], value: insulinDuration ? `${insulinDuration} hrs` : '-' },\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","import defineProperty from \"./defineProperty\";\nexport default function _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(Object(source));\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}","module.exports = require(\"d3-array\");","module.exports = require(\"moment-timezone\");","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();\n}","export default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n }\n}","export default function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\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/* global PDFDocument, blobStream */\nimport Promise from 'bluebird';\nimport _ from 'lodash';\n\nimport i18next from 'i18next';\nimport PrintView from './PrintView';\nimport BasicsPrintView from './BasicsPrintView';\nimport DailyPrintView from './DailyPrintView';\nimport BgLogPrintView from './BgLogPrintView';\nimport SettingsPrintView from './SettingsPrintView';\nimport AGPPrintView from './AGPPrintView';\n\nimport * as constants from './utils/constants';\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nconst t = i18next.t.bind(i18next);\n\n// Exporting utils for easy stubbing in tests\nexport const utils = {\n PDFDocument: class PDFDocumentStub {},\n blobStream: function blobStreamStub() {},\n PrintView,\n BasicsPrintView,\n DailyPrintView,\n BgLogPrintView,\n SettingsPrintView,\n AGPPrintView,\n};\n\n/**\n * createPrintView\n * @param {Object} doc - PDFKit document instance\n * @param {Object} data - pre-munged data for the daily print view\n * @param {Object} bgPrefs - user's blood glucose thresholds & targets\n * @param {Object} timePrefs - object containing timezoneAware Boolean, timezoneName String or null\n * @param {Number} numDays - number of days of daily view to include in printout\n * @param {Object} patient - full tidepool patient object\n *\n * @return {Object} dailyPrintView instance\n */\nexport function createPrintView(type, data, opts, doc) {\n const {\n patient,\n svgDataURLS,\n } = opts;\n\n let Renderer;\n let renderOpts = {\n // TODO: set this up as a Webpack Define plugin to pull from env variable\n // maybe that'll be tricky through React Storybook?\n debug: false,\n defaultFontSize: constants.DEFAULT_FONT_SIZE,\n dpi: constants.DPI,\n footerFontSize: constants.FOOTER_FONT_SIZE,\n headerFontSize: constants.HEADER_FONT_SIZE,\n height: constants.HEIGHT,\n margins: constants.MARGINS,\n patient,\n smallFontSize: constants.SMALL_FONT_SIZE,\n svgDataURLS,\n width: constants.WIDTH,\n };\n\n switch (type) {\n case 'daily':\n Renderer = utils.DailyPrintView;\n\n renderOpts = _.assign(renderOpts, {\n chartsPerPage: 3,\n summaryHeaderFontSize: 10,\n summaryWidthAsPercentage: 0.18,\n title: t('Daily Charts'),\n });\n break;\n\n case 'basics':\n Renderer = utils.BasicsPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('The Basics'),\n });\n break;\n\n case 'bgLog':\n Renderer = utils.BgLogPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('BG Log'),\n });\n break;\n\n case 'settings':\n Renderer = utils.SettingsPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('Pump Settings'),\n });\n break;\n\n case 'agp':\n Renderer = utils.AGPPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('AGP Charts'),\n });\n break;\n\n default:\n return null;\n }\n\n return new Renderer(doc, data, renderOpts);\n}\n\n/**\n * createPrintPDFPackage\n * @param {Array} data - Object of tideline-preprocessed Tidepool diabetes data & notes;\n * grouped by type\n * @param {Object} opts - an object of print options (see destructured param below)\n *\n * @return {Promise} - Promise that resolves with an object containing the pdf blob and url\n */\nexport function createPrintPDFPackage(data, opts) {\n const {\n patient,\n basics = {},\n daily = {},\n bgLog = {},\n settings = {},\n agp = {},\n } = opts;\n\n if (_.get(patient, 'preferences.displayLanguageCode')) {\n i18next.changeLanguage(patient.preferences.displayLanguageCode);\n }\n\n const pdfOpts = _.cloneDeep(opts);\n\n return new Promise(async (resolve, reject) => {\n const DocLib = typeof PDFDocument !== 'undefined' ? PDFDocument : utils.PDFDocument;\n const streamLib = typeof blobStream !== 'undefined' ? blobStream : utils.blobStream;\n\n /* NB: if you don't set the `margin` (or `margins` if not all are the same)\n then when you are using the .text() command a new page will be added if you specify\n coordinates outside of the default margin (or outside of the margins you've specified)\n */\n const doc = new DocLib({ autoFirstPage: false, bufferPages: true, margin: constants.MARGIN });\n const stream = doc.pipe(streamLib());\n\n if (!basics.disabled) createPrintView('basics', data.basics, pdfOpts, doc).render();\n if (!daily.disabled) createPrintView('daily', data.daily, pdfOpts, doc).render();\n if (!bgLog.disabled) createPrintView('bgLog', data.bgLog, pdfOpts, doc).render();\n if (!settings.disabled) createPrintView('settings', data.settings, pdfOpts, doc).render();\n if (!agp.disabled) await createPrintView('agp', data.agp, pdfOpts, doc).render();\n\n PrintView.renderPageNumbers(doc);\n\n doc.end();\n\n stream.on('finish', () => {\n const pdf = {\n blob: stream.toBlob(),\n url: stream.toBlobURL('application/pdf'),\n };\n return resolve(pdf);\n });\n\n stream.on('error', (error) => {\n stream.end();\n return reject(error);\n });\n });\n}\n\nexport default createPrintPDFPackage;\n","module.exports = require(\"bluebird\");","module.exports = require(\"voilab-pdf-table\");","/*jslint node: true, unparam: true, nomen: true */\n'use strict';\n\nvar lodash = require('lodash'),\n\n /**\n * Plugin constructor. Configuration may take parameters listed below.\n *\n * @param {String} column stretched column index\n * @param {Number} maxWidth table max width. Default to page width minus\n * margins\n */\n PdfTableFitColumn = function (conf) {\n lodash.merge(this, {\n\n id: 'fitcolumn',\n\n /**\n * Stretched column index\n * @var {String}\n */\n column: null,\n\n /**\n * Table max width. Default to page width minus margins\n * @var {Number}\n */\n maxWidth: null,\n\n /**\n * Calculated width at EV_BODY_ADD event\n * @var {Number}\n */\n calculatedWidth: null\n\n }, lodash.clone(conf || {}));\n };\n\nlodash.assign(PdfTableFitColumn.prototype, {\n\n /**\n * Configure plugin by attaching functions to table events\n *\n * @param {PdfTable}\n * @return {void}\n */\n configure: function (table) {\n table\n .onBodyAdd(this.setWidth.bind(this))\n .onColumnAdded(this.onColumnAdded.bind(this))\n .onColumnPropertyChanged(this.onColumnPropertyChanged.bind(this));\n },\n\n /**\n * Reinit width after a column is added\n *\n * @param {PdfTable}\n * @return {PdfTableFitColumn}\n */\n onColumnAdded: function (table) {\n return this.reinitWidth(table);\n },\n\n /**\n * Reinit width after width or hidden property changed\n *\n * @param {PdfTable} table\n * @param {Object} column\n * @param {String} prop\n * @return {PdfTableFitColumn}\n */\n onColumnPropertyChanged: function (table, column, prop) {\n // manage width changes and show/hide changes\n if (prop !== 'width' && prop !== 'hidden') {\n return this;\n }\n return this.reinitWidth(table);\n },\n\n /**\n * Reset width, so calculation can be re-executed\n *\n * @return {PdfTableFitColumn}\n */\n resetWidth: function () {\n this.calculatedWidth = null;\n return this;\n },\n\n /**\n * Reinit width\n *\n * @param {PdfTable} table\n * @return {PdfTableFitColumn}\n */\n reinitWidth: function (table) {\n return this\n .resetWidth()\n .setWidth(table);\n },\n\n /**\n * Check the max width of the stretched column. This method is called just\n * before we start to add data rows\n *\n * @param {PdfTable} table\n * @return {void}\n */\n setWidth: function (table) {\n if (!table.pdf.page) {\n return;\n }\n if (this.calculatedWidth === null) {\n var self = this,\n content_width = this.maxWidth,\n width = lodash.sumBy(table.getColumns(), function (column) {\n return column.id !== self.column ? column.width : 0;\n });\n\n if (!content_width) {\n content_width = table.pdf.page.width\n - table.pdf.page.margins.left\n - table.pdf.page.margins.right;\n }\n\n this.calculatedWidth = content_width - width;\n if (this.calculatedWidth < 0) {\n this.calculatedWidth = 0;\n }\n }\n table.setColumnWidth(this.column, this.calculatedWidth, true);\n }\n\n});\n\nmodule.exports = PdfTableFitColumn;\n","var SVGtoPDF = function(doc, svg, x, y, options) {\r\n \"use strict\";\r\n\r\n const NamedColors = {aliceblue: [240,248,255], antiquewhite: [250,235,215], aqua: [0,255,255], aquamarine: [127,255,212], azure: [240,255,255], beige: [245,245,220], bisque: [255,228,196], black: [0,0,0], blanchedalmond: [255,235,205], blue: [0,0,255], blueviolet: [138,43,226], brown: [165,42,42], burlywood: [222,184,135], cadetblue: [95,158,160], chartreuse: [127,255,0],\r\n chocolate: [210,105,30], coral: [255,127,80], cornflowerblue: [100,149,237], cornsilk: [255,248,220], crimson: [220,20,60], cyan: [0,255,255], darkblue: [0,0,139], darkcyan: [0,139,139], darkgoldenrod: [184,134,11], darkgray: [169,169,169], darkgrey: [169,169,169], darkgreen: [0,100,0], darkkhaki: [189,183,107], darkmagenta: [139,0,139], darkolivegreen: [85,107,47],\r\n darkorange: [255,140,0], darkorchid: [153,50,204], darkred: [139,0,0], darksalmon: [233,150,122], darkseagreen: [143,188,143], darkslateblue: [72,61,139], darkslategray: [47,79,79], darkslategrey: [47,79,79], darkturquoise: [0,206,209], darkviolet: [148,0,211], deeppink: [255,20,147], deepskyblue: [0,191,255], dimgray: [105,105,105], dimgrey: [105,105,105],\r\n dodgerblue: [30,144,255], firebrick: [178,34,34], floralwhite: [255,250,240], forestgreen: [34,139,34], fuchsia: [255,0,255], gainsboro: [220,220,220], ghostwhite: [248,248,255], gold: [255,215,0], goldenrod: [218,165,32], gray: [128,128,128], grey: [128,128,128], green: [0,128,0], greenyellow: [173,255,47], honeydew: [240,255,240], hotpink: [255,105,180],\r\n indianred: [205,92,92], indigo: [75,0,130], ivory: [255,255,240], khaki: [240,230,140], lavender: [230,230,250], lavenderblush: [255,240,245], lawngreen: [124,252,0], lemonchiffon: [255,250,205], lightblue: [173,216,230], lightcoral: [240,128,128], lightcyan: [224,255,255], lightgoldenrodyellow: [250,250,210], lightgray: [211,211,211], lightgrey: [211,211,211],\r\n lightgreen: [144,238,144], lightpink: [255,182,193], lightsalmon: [255,160,122], lightseagreen: [32,178,170], lightskyblue: [135,206,250], lightslategray: [119,136,153], lightslategrey: [119,136,153], lightsteelblue: [176,196,222], lightyellow: [255,255,224], lime: [0,255,0], limegreen: [50,205,50], linen: [250,240,230], magenta: [255,0,255], maroon: [128,0,0],\r\n mediumaquamarine: [102,205,170], mediumblue: [0,0,205], mediumorchid: [186,85,211], mediumpurple: [147,112,219], mediumseagreen: [60,179,113], mediumslateblue: [123,104,238], mediumspringgreen: [0,250,154], mediumturquoise: [72,209,204], mediumvioletred: [199,21,133], midnightblue: [25,25,112], mintcream: [245,255,250], mistyrose: [255,228,225], moccasin: [255,228,181],\r\n navajowhite: [255,222,173], navy: [0,0,128], oldlace: [253,245,230], olive: [128,128,0], olivedrab: [107,142,35], orange: [255,165,0], orangered: [255,69,0], orchid: [218,112,214], palegoldenrod: [238,232,170], palegreen: [152,251,152], paleturquoise: [175,238,238], palevioletred: [219,112,147], papayawhip: [255,239,213], peachpuff: [255,218,185], peru: [205,133,63],\r\n pink: [255,192,203], plum: [221,160,221], powderblue: [176,224,230], purple: [128,0,128], rebeccapurple: [102,51,153], red: [255,0,0], rosybrown: [188,143,143], royalblue: [65,105,225], saddlebrown: [139,69,19], salmon: [250,128,114], sandybrown: [244,164,96], seagreen: [46,139,87], seashell: [255,245,238], sienna: [160,82,45], silver: [192,192,192], skyblue: [135,206,235],\r\n slateblue: [106,90,205], slategray: [112,128,144], slategrey: [112,128,144], snow: [255,250,250], springgreen: [0,255,127], steelblue: [70,130,180], tan: [210,180,140], teal: [0,128,128], thistle: [216,191,216], tomato: [255,99,71], turquoise: [64,224,208], violet: [238,130,238], wheat: [245,222,179], white: [255,255,255], whitesmoke: [245,245,245], yellow: [255,255,0]};\r\n const DefaultColors = {black: [NamedColors.black, 1], white: [NamedColors.white, 1], transparent: [NamedColors.black, 0]};\r\n const Entities = {quot: 34, amp: 38, lt: 60, gt: 62, apos: 39, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, circ: 710, tilde: 732, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, permil: 8240, lsaquo: 8249,\r\n rsaquo: 8250, euro: 8364, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169, ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174, macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190,\r\n iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221,\r\n THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252,\r\n yacute: 253, thorn: 254, yuml: 255, fnof: 402, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949,\r\n zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, bull: 8226, hellip: 8230, prime: 8242, Prime: 8243, oline: 8254, frasl: 8260, weierp: 8472, image: 8465, real: 8476,\r\n trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744,\r\n cap: 8745, cup: 8746, int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830};\r\n const PathArguments = {A: 7, a: 7, C: 6, c: 6, H: 1, h: 1, L: 2, l: 2, M: 2, m: 2, Q: 4, q: 4, S: 4, s: 4, T: 2, t: 2, V: 1, v: 1, Z: 0, z: 0};\r\n const PathFlags = {A3: true, A4: true, a3: true, a4: true};\r\n const Properties = {\r\n 'color': {inherit: true, initial: undefined},\r\n 'visibility': {inherit: true, initial: 'visible', values: {'hidden': 'hidden', 'collapse': 'hidden', 'visible':'visible'}},\r\n 'fill': {inherit: true, initial: DefaultColors.black},\r\n 'stroke': {inherit: true, initial: 'none'},\r\n 'stop-color': {inherit: false, initial: DefaultColors.black},\r\n 'fill-opacity': {inherit: true, initial: 1},\r\n 'stroke-opacity': {inherit: true, initial: 1},\r\n 'stop-opacity': {inherit: false, initial: 1},\r\n 'fill-rule': {inherit: true, initial: 'nonzero', values: {'nonzero':'nonzero', 'evenodd':'evenodd'}},\r\n 'clip-rule': {inherit: true, initial: 'nonzero', values: {'nonzero':'nonzero', 'evenodd':'evenodd'}},\r\n 'stroke-width': {inherit: true, initial: 1},\r\n 'stroke-dasharray': {inherit: true, initial: []},\r\n 'stroke-dashoffset': {inherit: true, initial: 0},\r\n 'stroke-miterlimit': {inherit: true, initial: 4},\r\n 'stroke-linejoin': {inherit: true, initial: 'miter', values: {'miter':'miter', 'round':'round', 'bevel':'bevel'}},\r\n 'stroke-linecap': {inherit: true, initial: 'butt', values: {'butt':'butt', 'round':'round', 'square':'square'}},\r\n 'font-size': {inherit: true, initial: 16, values: {'xx-small':9, 'x-small':10, 'small':13, 'medium':16, 'large':18, 'x-large':24, 'xx-large':32}},\r\n 'font-family': {inherit: true, initial: 'sans-serif'},\r\n 'font-weight': {inherit: true, initial: 'normal', values: {'600':'bold', '700':'bold', '800':'bold', '900':'bold', 'bold':'bold', 'bolder':'bold', '500':'normal', '400':'normal', '300':'normal', '200':'normal', '100':'normal', 'normal':'normal', 'lighter':'normal'}},\r\n 'font-style': {inherit: true, initial: 'normal', values: {'italic':'italic', 'oblique':'italic', 'normal':'normal'}},\r\n 'text-anchor': {inherit: true, initial: 'start', values: {'start':'start', 'middle':'middle', 'end':'end'}},\r\n 'direction': {inherit: true, initial: 'ltr', values: {'ltr':'ltr', 'rtl':'rtl'}},\r\n 'dominant-baseline': {inherit: true, initial: 'baseline', values: {'auto':'baseline', 'baseline':'baseline', 'before-edge':'before-edge', 'text-before-edge':'before-edge', 'middle':'middle', 'central':'central', 'after-edge':'after-edge', 'text-after-edge':'after-edge', 'ideographic':'ideographic', 'alphabetic':'alphabetic', 'hanging':'hanging', 'mathematical':'mathematical'}},\r\n 'alignment-baseline': {inherit: false, initial: undefined, values: {'auto':'baseline', 'baseline':'baseline', 'before-edge':'before-edge', 'text-before-edge':'before-edge', 'middle':'middle', 'central':'central', 'after-edge':'after-edge', 'text-after-edge':'after-edge', 'ideographic':'ideographic', 'alphabetic':'alphabetic', 'hanging':'hanging', 'mathematical':'mathematical'}},\r\n 'baseline-shift': {inherit: true, initial: 'baseline', values: {'baseline':'baseline', 'sub':'sub', 'super':'super'}},\r\n 'word-spacing': {inherit: true, initial: 0, values: {normal:0}},\r\n 'letter-spacing': {inherit: true, initial: 0, values: {normal:0}},\r\n 'text-decoration': {inherit: false, initial: 'none', values: {'none':'none', 'underline':'underline', 'overline':'overline', 'line-through':'line-through'}},\r\n 'xml:space': {inherit: true, initial: 'default', css: 'white-space', values: {'preserve':'preserve', 'default':'default', 'pre':'preserve', 'pre-line':'preserve', 'pre-wrap':'preserve', 'nowrap': 'default'}},\r\n 'marker-start': {inherit: true, initial: 'none'},\r\n 'marker-mid': {inherit: true, initial: 'none'},\r\n 'marker-end': {inherit: true, initial: 'none'},\r\n 'opacity': {inherit: false, initial: 1},\r\n 'transform': {inherit: false, initial: [1, 0, 0, 1, 0, 0]},\r\n 'display': {inherit: false, initial: 'inline', values: {'none':'none', 'inline':'inline', 'block':'inline'}},\r\n 'clip-path': {inherit: false, initial: 'none'},\r\n 'mask': {inherit: false, initial: 'none'},\r\n 'overflow': {inherit: false, initial: 'hidden', values: {'hidden':'hidden', 'scroll':'hidden', 'visible':'visible'}}\r\n };\r\n\r\n function docBeginGroup(bbox) {\r\n let group = new (function PDFGroup() {})();\r\n group.name = 'G' + (doc._groupCount = (doc._groupCount || 0) + 1);\r\n group.resources = doc.ref();\r\n group.xobj = doc.ref({\r\n Type: 'XObject',\r\n Subtype: 'Form',\r\n FormType: 1,\r\n BBox: bbox,\r\n Group: {S: 'Transparency', CS: 'DeviceRGB', I: true, K: false},\r\n Resources: group.resources\r\n });\r\n group.xobj.write('');\r\n group.savedMatrix = doc._ctm;\r\n group.savedPage = doc.page;\r\n groupStack.push(group);\r\n doc._ctm = [1, 0, 0, 1, 0, 0];\r\n doc.page = {\r\n width: doc.page.width, height: doc.page.height,\r\n write: function(data) {group.xobj.write(data);},\r\n fonts: {}, xobjects: {}, ext_gstates: {}, patterns: {}\r\n };\r\n return group;\r\n }\r\n function docEndGroup(group) {\r\n if (group !== groupStack.pop()) {throw('Group not matching');}\r\n if (Object.keys(doc.page.fonts).length) {group.resources.data.Font = doc.page.fonts;}\r\n if (Object.keys(doc.page.xobjects).length) {group.resources.data.XObject = doc.page.xobjects;}\r\n if (Object.keys(doc.page.ext_gstates).length) {group.resources.data.ExtGState = doc.page.ext_gstates;}\r\n if (Object.keys(doc.page.patterns).length) {group.resources.data.Pattern = doc.page.patterns;}\r\n group.resources.end();\r\n group.xobj.end();\r\n doc._ctm = group.savedMatrix;\r\n doc.page = group.savedPage;\r\n }\r\n function docInsertGroup(group) {\r\n doc.page.xobjects[group.name] = group.xobj;\r\n doc.addContent('/' + group.name + ' Do');\r\n }\r\n function docApplyMask(group, clip) {\r\n let name = 'M' + (doc._maskCount = (doc._maskCount || 0) + 1);\r\n let gstate = doc.ref({\r\n Type: 'ExtGState', CA: 1, ca: 1, BM: 'Normal',\r\n SMask: {S: 'Luminosity', G: group.xobj, BC: (clip ? [0, 0, 0] : [1, 1, 1])}\r\n });\r\n gstate.end();\r\n doc.page.ext_gstates[name] = gstate;\r\n doc.addContent('/' + name + ' gs');\r\n }\r\n function docCreatePattern(group, dx, dy, matrix) {\r\n let pattern = new (function PDFPattern() {})();\r\n pattern.group = group;\r\n pattern.dx = dx;\r\n pattern.dy = dy;\r\n pattern.matrix = matrix || [1, 0, 0, 1, 0, 0];\r\n return pattern;\r\n }\r\n function docUsePattern(pattern, stroke) {\r\n let name = 'P' + (doc._patternCount = (doc._patternCount || 0) + 1);\r\n let ref = doc.ref({\r\n Type: 'Pattern', PatternType: 1, PaintType: 1, TilingType: 2,\r\n BBox: [0, 0, pattern.dx, pattern.dy], XStep: pattern.dx, YStep: pattern.dy,\r\n Matrix: multiplyMatrix(doc._ctm, pattern.matrix),\r\n Resources: {\r\n ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],\r\n XObject: (function() {let temp = {}; temp[pattern.group.name] = pattern.group.xobj; return temp;})()\r\n }\r\n });\r\n ref.write('/' + pattern.group.name + ' Do');\r\n ref.end();\r\n doc.page.patterns[name] = ref;\r\n if (stroke) {\r\n doc.addContent('/Pattern CS');\r\n doc.addContent('/' + name + ' SCN');\r\n } else {\r\n doc.addContent('/Pattern cs');\r\n doc.addContent('/' + name + ' scn');\r\n }\r\n }\r\n function docBeginText(font, size) {\r\n if (!doc.page.fonts[font.id]) {doc.page.fonts[font.id] = font.ref();}\r\n doc.addContent('BT').addContent('/' + font.id + ' ' + size + ' Tf');\r\n }\r\n function docSetTextMatrix(a, b, c, d, e, f) {\r\n doc.addContent(validateNumber(a) + ' ' + validateNumber(b) + ' ' + validateNumber(-c) + ' ' + validateNumber(-d) + ' ' + validateNumber(e) + ' ' + validateNumber(f) + ' Tm');\r\n }\r\n function docSetTextMode(fill, stroke) {\r\n let mode = fill && stroke ? 2 : stroke ? 1 : fill ? 0 : 3;\r\n doc.addContent(mode + ' Tr');\r\n }\r\n function docWriteGlyph(glyph) {\r\n doc.addContent('<' + glyph + '> Tj');\r\n }\r\n function docEndText() {\r\n doc.addContent('ET');\r\n }\r\n function docFillColor(color) {\r\n if (color[0].constructor.name === 'PDFPattern') {\r\n doc.fillOpacity(color[1]);\r\n docUsePattern(color[0], false);\r\n } else {\r\n doc.fillColor(color[0], color[1]);\r\n }\r\n }\r\n function docStrokeColor(color) {\r\n if (color[0].constructor.name === 'PDFPattern') {\r\n doc.strokeOpacity(color[1]);\r\n docUsePattern(color[0], true);\r\n } else {\r\n doc.strokeColor(color[0], color[1]);\r\n }\r\n }\r\n function docInsertLink(x, y, w, h, url) {\r\n let ref = doc.ref({\r\n Type: 'Annot',\r\n Subtype: 'Link',\r\n Rect: [x, y, w, h],\r\n Border: [0, 0, 0],\r\n A: {\r\n S: 'URI',\r\n URI: new String(url)\r\n }\r\n });\r\n ref.end();\r\n links.push(ref);\r\n }\r\n function parseXml(xml) {\r\n let SvgNode = function(tag, type, value, error) {\r\n this.error = error;\r\n this.nodeName = tag;\r\n this.nodeValue = value;\r\n this.nodeType = type;\r\n this.attributes = Object.create(null);\r\n this.childNodes = [];\r\n this.parentNode = null;\r\n this.id = '';\r\n this.textContent = '';\r\n this.classList = [];\r\n };\r\n SvgNode.prototype.getAttribute = function(attr) {\r\n return this.attributes[attr] != null ? this.attributes[attr] : null;\r\n };\r\n SvgNode.prototype.getElementById = function(id) {\r\n let result = null;\r\n (function recursive(node) {\r\n if (result) {return;}\r\n if (node.nodeType === 1) {\r\n if (node.id === id) {result = node;}\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n recursive(node.childNodes[i]);\r\n }\r\n }\r\n })(this);\r\n return result;\r\n };\r\n SvgNode.prototype.getElementsByTagName = function(tag) {\r\n let result = [];\r\n (function recursive(node) {\r\n if (node.nodeType === 1) {\r\n if (node.nodeName === tag) {result.push(node);}\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n recursive(node.childNodes[i]);\r\n }\r\n }\r\n })(this);\r\n return result;\r\n };\r\n let parser = new StringParser(xml.trim()), result, child, error = false; \r\n let recursive = function() {\r\n let temp, child;\r\n if (temp = parser.match(/^<([\\w:.-]+)\\s*/, true)) { // Opening tag\r\n let node = new SvgNode(temp[1], 1, null, error);\r\n while (temp = parser.match(/^([\\w:.-]+)(?:\\s*=\\s*\"([^\"]*)\"|\\s*=\\s*'([^']*)')?\\s*/, true)) { // Attribute\r\n let attr = temp[1], value = decodeEntities(temp[2] || temp[3] || '');\r\n if (!node.attributes[attr]) {\r\n node.attributes[attr] = value;\r\n if (attr === 'id') {node.id = value;}\r\n if (attr === 'class') {node.classList = value.split(' ');}\r\n } else {\r\n warningCallback('parseXml: duplicate attribute \"' + attr + '\"');\r\n error = true;\r\n }\r\n }\r\n if (parser.match(/^>/)) { // End of opening tag\r\n while (child = recursive()) {\r\n node.childNodes.push(child);\r\n child.parentNode = node;\r\n node.textContent += (child.nodeType === 3 || child.nodeType === 4 ? child.nodeValue : child.textContent);\r\n }\r\n if (temp = parser.match(/^<\\/([\\w:.-]+)\\s*>/, true)) { // Closing tag\r\n if (temp[1] === node.nodeName) {\r\n return node;\r\n } else {\r\n warningCallback('parseXml: tag not matching, opening \"' + node.nodeName + '\" & closing \"' + temp[1] + '\"');\r\n error = true;\r\n return node;\r\n }\r\n } else {\r\n warningCallback('parseXml: tag not matching, opening \"' + node.nodeName + '\" & not closing');\r\n error = true;\r\n return node;\r\n }\r\n } else if (parser.match(/^\\/>/)) { // Self-closing tag\r\n return node;\r\n } else {\r\n warningCallback('parseXml: tag could not be parsed \"' + node.nodeName + '\"');\r\n error = true;\r\n }\r\n } else if (temp = parser.match(/^<!--[\\s\\S]*?-->/)) { // Comment\r\n return new SvgNode(null, 8, temp, error);\r\n } else if (temp = parser.match(/^<\\?[\\s\\S]*?\\?>/)) { // Processing instructions\r\n return new SvgNode(null, 7, temp, error);\r\n } else if (temp = parser.match(/^<!DOCTYPE\\s*([\\s\\S]*?)>/)) { // Doctype\r\n return new SvgNode(null, 10, temp, error);\r\n } else if (temp = parser.match(/^<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/, true)) { // Cdata node\r\n return new SvgNode('#cdata-section', 4, temp[1], error);\r\n } else if (temp = parser.match(/^([^<]+)/, true)) { // Text node\r\n return new SvgNode('#text', 3, decodeEntities(temp[1]), error);\r\n }\r\n };\r\n while (child = recursive()) {\r\n if (child.nodeType === 1 && !result) {\r\n result = child;\r\n } else if (child.nodeType === 1 || (child.nodeType === 3 && child.nodeValue.trim() !== '')) {\r\n warningCallback('parseXml: data after document end has been discarded');\r\n }\r\n }\r\n if (parser.matchAll()) {\r\n warningCallback('parseXml: parsing error');\r\n }\r\n return result;\r\n };\r\n function decodeEntities(str) {\r\n return(str.replace(/&(?:#([0-9]+)|#[xX]([0-9A-Fa-f]+)|([0-9A-Za-z]+));/g, function(mt, m0, m1, m2) {\r\n if (m0) {return String.fromCharCode(parseInt(m0, 10));}\r\n else if (m1) {return String.fromCharCode(parseInt(m1, 16));}\r\n else if (m2 && Entities[m2]) {return String.fromCharCode(Entities[m2]);}\r\n else {return mt;}\r\n }));\r\n }\r\n function parseColor(raw) {\r\n let temp, result;\r\n raw = (raw || '').trim();\r\n if (temp = NamedColors[raw]) {\r\n result = [temp.slice(), 1];\r\n } else if (temp = raw.match(/^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)$/i)) {\r\n temp[1] = parseInt(temp[1]); temp[2] = parseInt(temp[2]); temp[3] = parseInt(temp[3]); temp[4] = parseFloat(temp[4]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256 && temp[4] <= 1) {\r\n result = [temp.slice(1, 4), temp[4]];\r\n }\r\n } else if (temp = raw.match(/^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)$/i)) {\r\n temp[1] = parseInt(temp[1]); temp[2] = parseInt(temp[2]); temp[3] = parseInt(temp[3]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256) {\r\n result = [temp.slice(1, 4), 1];\r\n }\r\n } else if (temp = raw.match(/^rgb\\(\\s*([0-9.]+)%\\s*,\\s*([0-9.]+)%\\s*,\\s*([0-9.]+)%\\s*\\)$/i)) {\r\n temp[1] = 2.55 * parseFloat(temp[1]); temp[2] = 2.55 * parseFloat(temp[2]); temp[3] = 2.55 * parseFloat(temp[3]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256) {\r\n result = [temp.slice(1, 4), 1];\r\n }\r\n } else if (temp = raw.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)) {\r\n result = [[parseInt(temp[1], 16), parseInt(temp[2], 16), parseInt(temp[3], 16)], 1];\r\n } else if (temp = raw.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i)) {\r\n result = [[0x11 * parseInt(temp[1], 16), 0x11 * parseInt(temp[2], 16), 0x11 * parseInt(temp[3], 16)], 1];\r\n }\r\n return colorCallback ? colorCallback(result, raw) : result;\r\n }\r\n function opacityToColor(color, opacity, isMask) {\r\n let newColor = color[0].slice(),\r\n newOpacity = color[1] * opacity;\r\n if (isMask) {\r\n for (let i = 0; i < color.length; i++) {\r\n newColor[i] *= newOpacity;\r\n }\r\n return [newColor, 1];\r\n } else {\r\n return [newColor, newOpacity];\r\n }\r\n }\r\n function multiplyMatrix() {\r\n function multiply(a, b) {\r\n return [ a[0]*b[0]+a[2]*b[1], a[1]*b[0]+a[3]*b[1], a[0]*b[2]+a[2]*b[3],\r\n a[1]*b[2]+a[3]*b[3], a[0]*b[4]+a[2]*b[5]+a[4], a[1]*b[4]+a[3]*b[5]+a[5] ];\r\n }\r\n let result = arguments[0];\r\n for (let i = 1; i < arguments.length; i++) {\r\n result = multiply(result, arguments[i]);\r\n }\r\n return result;\r\n }\r\n function transformPoint(p, m) {\r\n return [m[0] * p[0] + m[2] * p[1] + m[4], m[1] * p[0] + m[3] * p[1] + m[5]];\r\n }\r\n function getGlobalMatrix() {\r\n let ctm = doc._ctm;\r\n for (let i = groupStack.length - 1; i >= 0; i--) {\r\n ctm = multiplyMatrix(groupStack[i].savedMatrix, ctm);\r\n }\r\n return ctm;\r\n }\r\n function getPageBBox() {\r\n return new SvgShape().M(0, 0).L(doc.page.width, 0).L(doc.page.width, doc.page.height).L(0, doc.page.height)\r\n .transform(inverseMatrix(getGlobalMatrix())).getBoundingBox();\r\n }\r\n function inverseMatrix(m) {\r\n let dt = m[0] * m[3] - m[1] * m[2];\r\n return [m[3] / dt, -m[1] / dt, -m[2] / dt, m[0] / dt, (m[2]*m[5] - m[3]*m[4]) / dt, (m[1]*m[4] - m[0]*m[5]) / dt];\r\n }\r\n function validateMatrix(m) {\r\n let m0 = validateNumber(m[0]), m1 = validateNumber(m[1]), m2 = validateNumber(m[2]),\r\n m3 = validateNumber(m[3]), m4 = validateNumber(m[4]), m5 = validateNumber(m[5]);\r\n if (isNotEqual(m0 * m3 - m1 * m2, 0)) {\r\n return [m0, m1, m2, m3, m4, m5];\r\n }\r\n }\r\n function solveEquation(curve) {\r\n let a = curve[2] || 0, b = curve[1] || 0, c = curve[0] || 0;\r\n if (isEqual(a, 0) && isEqual(b, 0)) {\r\n return [];\r\n } else if (isEqual(a, 0)) {\r\n return [(-c) / b];\r\n } else {\r\n let d = b * b - 4 * a * c;\r\n if (isNotEqual(d, 0) && d > 0) {\r\n return [(-b + Math.sqrt(d)) / (2 * a), (-b - Math.sqrt(d)) / (2 * a)];\r\n } else if (isEqual(d, 0)) {\r\n return [(-b) / (2 * a)];\r\n } else {\r\n return [];\r\n }\r\n }\r\n }\r\n function getCurveValue(t, curve) {\r\n return (curve[0] || 0) + (curve[1] || 0) * t + (curve[2] || 0) * t * t + (curve[3] || 0) * t * t * t;\r\n }\r\n function isEqual(number, ref) {\r\n return Math.abs(number - ref) < 1e-10;\r\n }\r\n function isNotEqual(number, ref) {\r\n return Math.abs(number - ref) >= 1e-10;\r\n }\r\n function validateNumber(n) {\r\n return n > -1e21 && n < 1e21 ? Math.round(n * 1e6) / 1e6 : 0;\r\n }\r\n function isArrayLike(v) {\r\n return typeof v === 'object' && v !== null && typeof v.length === 'number';\r\n }\r\n function parseTranform(v) {\r\n let parser = new StringParser((v || '').trim()), result = [1, 0, 0, 1, 0, 0], temp;\r\n while (temp = parser.match(/^([A-Za-z]+)\\s*[(]([^(]+)[)]/, true)) {\r\n let func = temp[1], nums = [], parser2 = new StringParser(temp[2].trim()), temp2;\r\n while (temp2 = parser2.matchNumber()) {\r\n nums.push(Number(temp2));\r\n parser2.matchSeparator();\r\n }\r\n if (func === 'matrix' && nums.length === 6) {\r\n result = multiplyMatrix(result, [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]]);\r\n } else if (func === 'translate' && nums.length === 2) {\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[0], nums[1]]);\r\n } else if (func === 'translate' && nums.length === 1) {\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[0], 0]);\r\n } else if (func === 'scale' && nums.length === 2) {\r\n result = multiplyMatrix(result, [nums[0], 0, 0, nums[1], 0, 0]);\r\n } else if (func === 'scale' && nums.length === 1) {\r\n result = multiplyMatrix(result, [nums[0], 0, 0, nums[0], 0, 0]);\r\n } else if (func === 'rotate' && nums.length === 3) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[1], nums[2]], [Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0], [1, 0, 0, 1, -nums[1], -nums[2]]);\r\n } else if (func === 'rotate' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\r\n } else if (func === 'skewX' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, 0, Math.tan(a), 1, 0, 0]);\r\n } else if (func === 'skewY' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, Math.tan(a), 0, 1, 0, 0]);\r\n } else {return;}\r\n parser.matchSeparator();\r\n }\r\n if (parser.matchAll()) {return;}\r\n return result;\r\n }\r\n function parseAspectRatio(aspectRatio, availWidth, availHeight, elemWidth, elemHeight, initAlign) {\r\n let temp = (aspectRatio || '').trim().match(/^(none)$|^x(Min|Mid|Max)Y(Min|Mid|Max)(?:\\s+(meet|slice))?$/) || [],\r\n ratioType = temp[1] || temp[4] || 'meet',\r\n xAlign = temp[2] || 'Mid',\r\n yAlign = temp[3] || 'Mid',\r\n scaleX = availWidth / elemWidth,\r\n scaleY = availHeight / elemHeight,\r\n dx = {'Min':0, 'Mid':0.5, 'Max':1}[xAlign] - (initAlign || 0),\r\n dy = {'Min':0, 'Mid':0.5, 'Max':1}[yAlign] - (initAlign || 0);\r\n if (ratioType === 'slice') {\r\n scaleY = scaleX = Math.max(scaleX, scaleY);\r\n } else if (ratioType === 'meet') {\r\n scaleY = scaleX = Math.min(scaleX, scaleY);\r\n }\r\n return [scaleX, 0, 0, scaleY, dx * (availWidth - elemWidth * scaleX), dy * (availHeight - elemHeight * scaleY)];\r\n }\r\n function parseStyleAttr(v) {\r\n let result = Object.create(null);\r\n v = (v || '').trim().split(/;/);\r\n for (let i = 0; i < v.length; i++) {\r\n let key = (v[i].split(':')[0] || '').trim(),\r\n value = (v[i].split(':')[1] || '').trim();\r\n if (key) {\r\n result[key] = value;\r\n }\r\n }\r\n if (result['marker']) {\r\n if (!result['marker-start']) {result['marker-start'] = result['marker'];}\r\n if (!result['marker-mid']) {result['marker-mid'] = result['marker'];}\r\n if (!result['marker-end']) {result['marker-end'] = result['marker'];}\r\n }\r\n if (result['font']) {\r\n let fontFamily = null, fontSize = null, fontStyle = \"normal\", fontWeight = \"normal\", fontVariant = \"normal\";\r\n let parts = result['font'].split(/\\s+/);\r\n for (let i = 0; i < parts.length; i++) {\r\n switch (parts[i]) {\r\n case \"normal\":\r\n break;\r\n case \"italic\": case \"oblique\":\r\n fontStyle = parts[i];\r\n break;\r\n case \"small-caps\":\r\n fontVariant = parts[i];\r\n break;\r\n case \"bold\": case \"bolder\": case \"lighter\": case \"100\": case \"200\": case \"300\":\r\n case \"400\": case \"500\": case \"600\": case \"700\": case \"800\": case \"900\":\r\n fontWeight = parts[i];\r\n break;\r\n default:\r\n if (!fontSize) {\r\n fontSize = parts[i].split('/')[0];\r\n } else {\r\n if (!fontFamily) {\r\n fontFamily = parts[i];\r\n } else {\r\n fontFamily += ' ' + parts[i];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (!result['font-style']) {result['font-style'] = fontStyle;}\r\n if (!result['font-variant']) {result['font-variant'] = fontVariant;}\r\n if (!result['font-weight']) {result['font-weight'] = fontWeight;}\r\n if (!result['font-size']) {result['font-size'] = fontSize;}\r\n if (!result['font-family']) {result['font-family'] = fontFamily;}\r\n }\r\n return result;\r\n }\r\n function parseSelector(v) {\r\n let parts = v.split(/(?=[.#])/g), ids = [], classes = [], tags = [], temp;\r\n for (let i = 0; i < parts.length; i++) {\r\n if (temp = parts[i].match(/^[#]([_A-Za-z0-9-]+)$/)) {\r\n ids.push(temp[1]);\r\n } else if (temp = parts[i].match(/^[.]([_A-Za-z0-9-]+)$/)) {\r\n classes.push(temp[1]);\r\n } else if (temp = parts[i].match(/^([_A-Za-z0-9-]+)$/)) {\r\n tags.push(temp[1]);\r\n } else if (parts[i] !== '*') {\r\n return;\r\n }\r\n }\r\n return {\r\n tags: tags, ids: ids, classes: classes,\r\n specificity: ids.length * 10000 + classes.length * 100 + tags.length\r\n };\r\n }\r\n function parseStyleSheet(v) {\r\n let parser = new StringParser(v.trim()), rules = [], rule;\r\n while (rule = parser.match(/^\\s*([^\\{\\}]*?)\\s*\\{([^\\{\\}]*?)\\}/, true)) {\r\n let selectors = rule[1].split(/\\s*,\\s*/g),\r\n css = parseStyleAttr(rule[2]);\r\n for (let i = 0; i < selectors.length; i++) {\r\n let selector = parseSelector(selectors[i]);\r\n if (selector) {\r\n rules.push({selector: selector, css:css});\r\n }\r\n }\r\n }\r\n return rules;\r\n }\r\n function matchesSelector(elem, selector) {\r\n if (elem.nodeType !== 1) {return false;}\r\n for (let i = 0; i < selector.tags.length; i++) {\r\n if (selector.tags[i] !== elem.nodeName) {return false;}\r\n }\r\n for (let i = 0; i < selector.ids.length; i++) {\r\n if (selector.ids[i] !== elem.id) {return false;}\r\n }\r\n for (let i = 0; i < selector.classes.length; i++) {\r\n if (elem.classList.indexOf(selector.classes[i]) === -1) {return false;}\r\n }\r\n return true;\r\n }\r\n function getStyle(elem) {\r\n let result = Object.create(null);\r\n let specificities = Object.create(null);\r\n for (let i = 0; i < styleRules.length; i++) {\r\n let rule = styleRules[i];\r\n if (matchesSelector(elem, rule.selector)) {\r\n for (let key in rule.css) {\r\n if (!(specificities[key] > rule.selector.specificity)) {\r\n result[key] = rule.css[key];\r\n specificities[key] = rule.selector.specificity;\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n function combineArrays(array1, array2) {\r\n return array1.concat(array2.slice(array1.length));\r\n }\r\n function getAscent(font, size) {\r\n return Math.max(font.ascender, (font.bbox[3] || font.bbox.maxY) * (font.scale || 1)) * size / 1000;\r\n }\r\n function getDescent(font, size) {\r\n return Math.min(font.descender, (font.bbox[1] || font.bbox.minY) * (font.scale || 1)) * size / 1000;\r\n }\r\n function getXHeight(font, size) {\r\n return (font.xHeight || 0.5 * (font.ascender - font.descender)) * size / 1000;\r\n }\r\n function getBaseline(font, size, baseline, shift) {\r\n let dy1, dy2;\r\n switch (baseline) {\r\n case 'middle': dy1 = 0.5 * getXHeight(font, size); break;\r\n case 'central': dy1 = 0.5 * (getDescent(font, size) + getAscent(font, size)); break;\r\n case 'after-edge': case 'text-after-edge': dy1 = getDescent(font, size); break;\r\n case 'alphabetic': case 'auto': case 'baseline': dy1 = 0; break;\r\n case 'mathematical': dy1 = 0.5 * getAscent(font, size); break;\r\n case 'hanging': dy1 = 0.8 * getAscent(font, size); break;\r\n case 'before-edge': case 'text-before-edge': dy1 = getAscent(font, size); break;\r\n default: dy1 = 0; break;\r\n }\r\n switch (shift) {\r\n case 'baseline': dy2 = 0; break;\r\n case 'super': dy2 = 0.6 * size; break;\r\n case 'sub': dy2 = -0.6 * size; break;\r\n default: dy2 = shift; break;\r\n }\r\n return dy1 - dy2;\r\n }\r\n function getTextPos(font, size, text) {\r\n let encoded = font.encode('' + text), hex = encoded[0], pos = encoded[1], data = [];\r\n for (let i = 0; i < hex.length; i++) {\r\n let unicode = font.unicode ? font.unicode[parseInt(hex[i], 16)] : [text.charCodeAt(i)];\r\n data.push({\r\n glyph: hex[i],\r\n unicode: unicode,\r\n width: pos[i].advanceWidth * size / 1000,\r\n xOffset: pos[i].xOffset * size / 1000,\r\n yOffset: pos[i].yOffset * size / 1000,\r\n xAdvance: pos[i].xAdvance * size / 1000,\r\n yAdvance: pos[i].yAdvance * size / 1000\r\n });\r\n }\r\n return data;\r\n }\r\n function createSVGElement(obj, inherits) {\r\n switch (obj.nodeName) {\r\n case 'use': return new SvgElemUse(obj, inherits);\r\n case 'symbol': return new SvgElemSymbol(obj, inherits);\r\n case 'g': return new SvgElemGroup(obj, inherits);\r\n case 'a': return new SvgElemLink(obj, inherits);\r\n case 'svg': return new SvgElemSvg(obj, inherits);\r\n case 'image': return new SVGElemImage(obj, inherits);\r\n case 'rect': return new SvgElemRect(obj, inherits);\r\n case 'circle': return new SvgElemCircle(obj, inherits);\r\n case 'ellipse': return new SvgElemEllipse(obj, inherits);\r\n case 'line': return new SvgElemLine(obj, inherits);\r\n case 'polyline': return new SvgElemPolyline(obj, inherits);\r\n case 'polygon': return new SvgElemPolygon(obj, inherits);\r\n case 'path': return new SvgElemPath(obj, inherits);\r\n case 'text': return new SvgElemText(obj, inherits);\r\n case 'tspan': return new SvgElemTspan(obj, inherits);\r\n case 'textPath': return new SvgElemTextPath(obj, inherits);\r\n case '#text': case '#cdata-section': return new SvgElemTextNode(obj, inherits);\r\n default: return new SvgElem(obj, inherits);\r\n }\r\n }\r\n\r\n var StringParser = function(str) {\r\n this.match = function(exp, all) {\r\n let temp = str.match(exp);\r\n if (!temp || temp.index !== 0) {return;}\r\n str = str.substring(temp[0].length);\r\n return (all ? temp : temp[0]);\r\n };\r\n this.matchSeparator = function() {\r\n return this.match(/^(?:\\s*,\\s*|\\s*|)/);\r\n };\r\n this.matchSpace = function() {\r\n return this.match(/^(?:\\s*)/);\r\n };\r\n this.matchLengthUnit = function() {\r\n return this.match(/^(?:px|pt|cm|mm|in|pc|em|ex|%|)/);\r\n };\r\n this.matchNumber = function() {\r\n return this.match(/^(?:[-+]?(?:[0-9]+[.][0-9]+|[0-9]+[.]|[.][0-9]+|[0-9]+)(?:[eE][-+]?[0-9]+)?)/);\r\n };\r\n this.matchAll = function() {\r\n return this.match(/^[\\s\\S]+/);\r\n };\r\n };\r\n\r\n var BezierSegment = function(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\r\n let divisions = 6 * precision;\r\n let equationX = [p1x, -3 * p1x + 3 * c1x, 3 * p1x - 6 * c1x + 3 * c2x, -p1x + 3 * c1x - 3 * c2x + p2x];\r\n let equationY = [p1y, -3 * p1y + 3 * c1y, 3 * p1y - 6 * c1y + 3 * c2y, -p1y + 3 * c1y - 3 * c2y + p2y];\r\n let derivativeX = [-3 * p1x + 3 * c1x, 6 * p1x - 12 * c1x + 6 * c2x, -3 * p1x + 9 * c1x - 9 * c2x + 3 * p2x];\r\n let derivativeY = [-3 * p1y + 3 * c1y, 6 * p1y - 12 * c1y + 6 * c2y, -3 * p1y + 9 * c1y - 9 * c2y + 3 * p2y];\r\n let lengthMap = [0];\r\n for (let i = 1; i <= divisions; i++) {\r\n let t = (i - 0.5) / divisions;\r\n let dx = getCurveValue(t, derivativeX) / divisions,\r\n dy = getCurveValue(t, derivativeY) / divisions,\r\n l = Math.sqrt(dx * dx + dy * dy);\r\n lengthMap[i] = lengthMap[i - 1] + l;\r\n }\r\n this.totalLength = lengthMap[divisions];\r\n this.startPoint = [p1x, p1y, isEqual(p1x, c1x) && isEqual(p1y, c1y) ? Math.atan2(c2y - c1y, c2x - c1x) : Math.atan2(c1y - p1y, c1x - p1x)];\r\n this.endPoint = [p2x, p2y, isEqual(c2x, p2x) && isEqual(c2y, p2y) ? Math.atan2(c2y - c1y, c2x - c1x) : Math.atan2(p2y - c2y, p2x - c2x)];\r\n this.getBoundingBox = function() {\r\n let temp;\r\n let minX = getCurveValue(0, equationX), minY = getCurveValue(0, equationY),\r\n maxX = getCurveValue(1, equationX), maxY = getCurveValue(1, equationY);\r\n if (minX > maxX) {temp = maxX; maxX = minX; minX = temp;}\r\n if (minY > maxY) {temp = maxY; maxY = minY; minY = temp;}\r\n let rootsX = solveEquation(derivativeX);\r\n for (let i = 0; i < rootsX.length; i++) {\r\n if (rootsX[i] >= 0 && rootsX[i] <= 1) {\r\n let x = getCurveValue(rootsX[i], equationX);\r\n if (x < minX) {minX = x;}\r\n if (x > maxX) {maxX = x;}\r\n }\r\n }\r\n let rootsY = solveEquation(derivativeY);\r\n for (let i = 0; i < rootsY.length; i++) {\r\n if (rootsY[i] >= 0 && rootsY[i] <= 1) {\r\n let y = getCurveValue(rootsY[i], equationY);\r\n if (y < minY) {minY = y;}\r\n if (y > maxY) {maxY = y;}\r\n }\r\n }\r\n return [minX, minY, maxX, maxY];\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (isEqual(l, 0)) {return this.startPoint;}\r\n if (isEqual(l, this.totalLength)) {return this.endPoint;}\r\n if (l < 0 || l > this.totalLength) {return;}\r\n for (let i = 1; i <= divisions; i++) {\r\n let l1 = lengthMap[i-1], l2 = lengthMap[i];\r\n if (l1 <= l && l <= l2) {\r\n let t = (i - (l2 - l) / (l2 - l1)) / divisions,\r\n x = getCurveValue(t, equationX), y = getCurveValue(t, equationY),\r\n dx = getCurveValue(t, derivativeX), dy = getCurveValue(t, derivativeY);\r\n return [x, y, Math.atan2(dy, dx)];\r\n }\r\n }\r\n };\r\n };\r\n\r\n var LineSegment = function(p1x, p1y, p2x, p2y) {\r\n this.totalLength = Math.sqrt((p2x - p1x) * (p2x - p1x) + (p2y - p1y) * (p2y - p1y));\r\n this.startPoint = [p1x, p1y, Math.atan2(p2y - p1y, p2x - p1x)];\r\n this.endPoint = [p2x, p2y, Math.atan2(p2y - p1y, p2x - p1x)];\r\n this.getBoundingBox = function() {\r\n return [Math.min(this.startPoint[0], this.endPoint[0]), Math.min(this.startPoint[1], this.endPoint[1]),\r\n Math.max(this.startPoint[0], this.endPoint[0]), Math.max(this.startPoint[1], this.endPoint[1])];\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (l >= 0 && l <= this.totalLength) {\r\n let r = l / this.totalLength || 0,\r\n x = this.startPoint[0] + r * (this.endPoint[0] - this.startPoint[0]),\r\n y = this.startPoint[1] + r * (this.endPoint[1] - this.startPoint[1]);\r\n return [x, y, this.startPoint[2]];\r\n }\r\n };\r\n };\r\n\r\n var SvgShape = function() {\r\n this.pathCommands = [];\r\n this.pathSegments = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.totalLength = 0;\r\n let startX = 0, startY = 0, currX = 0, currY = 0, lastCom, lastCtrlX, lastCtrlY;\r\n this.move = function(x, y) {\r\n startX = currX = x; startY = currY = y;\r\n return null;\r\n };\r\n this.line = function(x, y) {\r\n let segment = new LineSegment(currX, currY, x, y);\r\n currX = x; currY = y;\r\n return segment;\r\n };\r\n this.curve = function(c1x, c1y, c2x, c2y, x, y) {\r\n let segment = new BezierSegment(currX, currY, c1x, c1y, c2x, c2y, x, y);\r\n currX = x; currY = y;\r\n return segment;\r\n };\r\n this.close = function() {\r\n let segment = new LineSegment(currX, currY, startX, startY);\r\n currX = startX; currY = startY;\r\n return segment;\r\n };\r\n this.addCommand = function(data) {\r\n this.pathCommands.push(data);\r\n let segment = this[data[0]].apply(this, data.slice(3));\r\n if (segment) {\r\n segment.hasStart = data[1];\r\n segment.hasEnd = data[2];\r\n this.startPoint = this.startPoint || segment.startPoint;\r\n this.endPoint = segment.endPoint;\r\n this.pathSegments.push(segment);\r\n this.totalLength += segment.totalLength;\r\n }\r\n };\r\n this.M = function(x, y) {\r\n this.addCommand(['move', true, true, x, y]);\r\n lastCom = 'M';\r\n return this;\r\n };\r\n this.m = function(x, y) {\r\n return this.M(currX + x, currY + y);\r\n };\r\n this.Z = this.z = function() {\r\n this.addCommand(['close', true, true]);\r\n lastCom = 'Z';\r\n return this;\r\n };\r\n this.L = function(x, y) {\r\n this.addCommand(['line', true, true, x, y]);\r\n lastCom = 'L';\r\n return this;\r\n };\r\n this.l = function(x, y) {\r\n return this.L(currX + x, currY + y);\r\n };\r\n this.H = function(x) {\r\n return this.L(x, currY);\r\n };\r\n this.h = function(x) {\r\n return this.L(currX + x, currY);\r\n };\r\n this.V = function(y) {\r\n return this.L(currX, y);\r\n };\r\n this.v = function(y) {\r\n return this.L(currX, currY + y);\r\n };\r\n this.C = function(c1x, c1y, c2x, c2y, x, y) {\r\n this.addCommand(['curve', true, true, c1x, c1y, c2x, c2y, x, y]);\r\n lastCom = 'C'; lastCtrlX = c2x; lastCtrlY = c2y;\r\n return this;\r\n };\r\n this.c = function(c1x, c1y, c2x, c2y, x, y) {\r\n return this.C(currX + c1x, currY + c1y, currX + c2x, currY + c2y, currX + x, currY + y);\r\n };\r\n this.S = function(c1x, c1y, x, y) {\r\n return this.C(currX + (lastCom === 'C' ? currX - lastCtrlX : 0), currY + (lastCom === 'C' ? currY - lastCtrlY : 0), c1x, c1y, x, y);\r\n };\r\n this.s = function(c1x, c1y, x, y) {\r\n return this.C(currX + (lastCom === 'C' ? currX - lastCtrlX : 0), currY + (lastCom === 'C' ? currY - lastCtrlY : 0), currX + c1x, currY + c1y, currX + x, currY + y);\r\n };\r\n this.Q = function(cx, cy, x, y) {\r\n let c1x = currX + 2 / 3 * (cx - currX), c1y = currY + 2 / 3 * (cy - currY),\r\n c2x = x + 2 / 3 * (cx - x), c2y = y + 2 / 3 * (cy - y);\r\n this.addCommand(['curve', true, true, c1x, c1y, c2x, c2y, x, y]);\r\n lastCom = 'Q'; lastCtrlX = cx; lastCtrlY = cy;\r\n return this;\r\n };\r\n this.q = function(c1x, c1y, x, y) {\r\n return this.Q(currX + c1x, currY + c1y, currX + x, currY + y);\r\n };\r\n this.T = function(x, y) {\r\n return this.Q(currX + (lastCom === 'Q' ? currX - lastCtrlX : 0), currY + (lastCom === 'Q' ? currY - lastCtrlY : 0), x, y);\r\n };\r\n this.t = function(x, y) {\r\n return this.Q(currX + (lastCom === 'Q' ? currX - lastCtrlX : 0), currY + (lastCom === 'Q' ? currY - lastCtrlY : 0), currX + x, currY + y);\r\n };\r\n this.A = function(rx, ry, fi, fa, fs, x, y) {\r\n if (isEqual(rx, 0) || isEqual(ry, 0)) {\r\n this.addCommand(['line', true, true, x, y]);\r\n } else {\r\n fi = fi * (Math.PI / 180);\r\n rx = Math.abs(rx);\r\n ry = Math.abs(ry);\r\n fa = 1 * !!fa;\r\n fs = 1 * !!fs;\r\n let x1 = Math.cos(fi) * (currX - x) / 2 + Math.sin(fi) * (currY - y) / 2,\r\n y1 = Math.cos(fi) * (currY - y) / 2 - Math.sin(fi) * (currX - x) / 2,\r\n lambda = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry);\r\n if (lambda > 1) {\r\n rx *= Math.sqrt(lambda);\r\n ry *= Math.sqrt(lambda);\r\n }\r\n let r = Math.sqrt(Math.max(0, rx * rx * ry * ry - rx * rx * y1 * y1 - ry * ry * x1 * x1) / (rx * rx * y1 * y1 + ry * ry * x1 * x1)),\r\n x2 = (fa === fs ? -1 : 1) * r * rx * y1 / ry,\r\n y2 = (fa === fs ? 1 : -1) * r * ry * x1 / rx;\r\n let cx = Math.cos(fi) * x2 - Math.sin(fi) * y2 + (currX + x) / 2,\r\n cy = Math.sin(fi) * x2 + Math.cos(fi) * y2 + (currY + y) / 2,\r\n th1 = Math.atan2((y1 - y2) / ry, (x1 - x2) / rx),\r\n th2 = Math.atan2((-y1 - y2) / ry, (-x1 - x2) / rx);\r\n if (fs === 0 && th2 - th1 > 0) {\r\n th2 -= 2 * Math.PI;\r\n } else if (fs === 1 && th2 - th1 < 0) {\r\n th2 += 2 * Math.PI;\r\n }\r\n let segms = Math.ceil(Math.abs(th2 - th1) / (Math.PI / precision));\r\n for (let i = 0; i < segms; i++) {\r\n let th3 = th1 + i * (th2 - th1) / segms,\r\n th4 = th1 + (i + 1) * (th2 - th1) / segms,\r\n t = 4/3 * Math.tan((th4 - th3) / 4);\r\n let c1x = cx + Math.cos(fi) * rx * (Math.cos(th3) - t * Math.sin(th3)) - Math.sin(fi) * ry * (Math.sin(th3) + t * Math.cos(th3)),\r\n c1y = cy + Math.sin(fi) * rx * (Math.cos(th3) - t * Math.sin(th3)) + Math.cos(fi) * ry * (Math.sin(th3) + t * Math.cos(th3)),\r\n c2x = cx + Math.cos(fi) * rx * (Math.cos(th4) + t * Math.sin(th4)) - Math.sin(fi) * ry * (Math.sin(th4) - t * Math.cos(th4)),\r\n c2y = cy + Math.sin(fi) * rx * (Math.cos(th4) + t * Math.sin(th4)) + Math.cos(fi) * ry * (Math.sin(th4) - t * Math.cos(th4)),\r\n endX = cx + Math.cos(fi) * rx * Math.cos(th4) - Math.sin(fi) * ry * Math.sin(th4),\r\n endY = cy + Math.sin(fi) * rx * Math.cos(th4) + Math.cos(fi) * ry * Math.sin(th4);\r\n this.addCommand(['curve', (i === 0), (i === segms - 1), c1x, c1y, c2x, c2y, endX, endY]);\r\n }\r\n }\r\n lastCom = 'A';\r\n return this;\r\n };\r\n this.a = function(rx, ry, fi, fa, fs, x, y) {\r\n return this.A(rx, ry, fi, fa, fs, currX + x, currY + y);\r\n };\r\n this.path = function(d) {\r\n let command, value, temp,\r\n parser = new StringParser((d || '').trim());\r\n while (command = parser.match(/^[astvzqmhlcASTVZQMHLC]/)) {\r\n parser.matchSeparator();\r\n let values = [];\r\n while (value = (PathFlags[command + values.length] ? parser.match(/^[01]/) : parser.matchNumber())) {\r\n parser.matchSeparator();\r\n if (values.length === PathArguments[command]) {\r\n this[command].apply(this, values);\r\n values = [];\r\n if (command === 'M') {command = 'L';}\r\n else if (command === 'm') {command = 'l';}\r\n }\r\n values.push(Number(value));\r\n }\r\n if (values.length === PathArguments[command]) {\r\n this[command].apply(this, values);\r\n } else {\r\n warningCallback('SvgPath: command ' + command + ' with ' + values.length + ' numbers'); return;\r\n }\r\n }\r\n if (temp = parser.matchAll()) {\r\n warningCallback('SvgPath: unexpected string ' + temp);\r\n }\r\n return this;\r\n };\r\n this.getBoundingBox = function() {\r\n let bbox = [Infinity, Infinity, -Infinity, -Infinity];\r\n function addBounds(bbox1) {\r\n if (bbox1[0] < bbox[0]) {bbox[0] = bbox1[0];}\r\n if (bbox1[2] > bbox[2]) {bbox[2] = bbox1[2];}\r\n if (bbox1[1] < bbox[1]) {bbox[1] = bbox1[1];}\r\n if (bbox1[3] > bbox[3]) {bbox[3] = bbox1[3];}\r\n }\r\n for (let i = 0; i < this.pathSegments.length; i++) {\r\n addBounds(this.pathSegments[i].getBoundingBox());\r\n }\r\n if (bbox[0] === Infinity) {bbox[0] = 0;}\r\n if (bbox[1] === Infinity) {bbox[1] = 0;}\r\n if (bbox[2] === -Infinity) {bbox[2] = 0;}\r\n if (bbox[3] === -Infinity) {bbox[3] = 0;}\r\n return bbox;\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (l >= 0 && l <= this.totalLength) {\r\n let temp;\r\n for (let i = 0; i < this.pathSegments.length; i++) {\r\n if (temp = this.pathSegments[i].getPointAtLength(l)) {\r\n return temp;\r\n }\r\n l -= this.pathSegments[i].totalLength;\r\n }\r\n return this.endPoint;\r\n }\r\n };\r\n this.transform = function(m) {\r\n this.pathSegments = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.totalLength = 0;\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let data = this.pathCommands.shift();\r\n for (let j = 3; j < data.length; j+=2) {\r\n let p = transformPoint([data[j], data[j + 1]], m)\r\n data[j] = p[0];\r\n data[j + 1] = p[1];\r\n }\r\n this.addCommand(data);\r\n }\r\n return this; \r\n };\r\n this.mergeShape = function(shape) {\r\n for (let i = 0; i < shape.pathCommands.length; i++) {\r\n this.addCommand(shape.pathCommands[i].slice());\r\n }\r\n return this;\r\n };\r\n this.clone = function() {\r\n return new SvgShape().mergeShape(this);\r\n };\r\n this.insertInDocument = function() {\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let command = this.pathCommands[i][0], values = this.pathCommands[i].slice(3);\r\n switch(command) {\r\n case 'move': doc.moveTo(values[0], values[1]); break;\r\n case 'line': doc.lineTo(values[0], values[1]); break;\r\n case 'curve': doc.bezierCurveTo(values[0], values[1], values[2], values[3], values[4], values[5]); break;\r\n case 'close': doc.closePath(); break;\r\n }\r\n }\r\n };\r\n this.getSubPaths = function() {\r\n let subPaths = [], shape = new SvgShape();\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let data = this.pathCommands[i], command = this.pathCommands[i][0];\r\n if (command === 'move' && i !== 0) {\r\n subPaths.push(shape);\r\n shape = new SvgShape();\r\n }\r\n shape.addCommand(data);\r\n }\r\n subPaths.push(shape);\r\n return subPaths;\r\n };\r\n this.getMarkers = function() {\r\n let markers = [], subPaths = this.getSubPaths();\r\n for (let i = 0; i < subPaths.length; i++) {\r\n let subPath = subPaths[i], subPathMarkers = [];\r\n for (let j = 0; j < subPath.pathSegments.length; j++) {\r\n let segment = subPath.pathSegments[j];\r\n if (isNotEqual(segment.totalLength, 0) || j === 0 || j === subPath.pathSegments.length - 1) {\r\n if (segment.hasStart) {\r\n let startMarker = segment.getPointAtLength(0), prevEndMarker = subPathMarkers.pop();\r\n if (prevEndMarker) {startMarker[2] = 0.5 * (prevEndMarker[2] + startMarker[2]);}\r\n subPathMarkers.push(startMarker);\r\n }\r\n if (segment.hasEnd) {\r\n let endMarker = segment.getPointAtLength(segment.totalLength);\r\n subPathMarkers.push(endMarker);\r\n }\r\n }\r\n }\r\n markers = markers.concat(subPathMarkers);\r\n }\r\n return markers;\r\n };\r\n };\r\n\r\n var SvgElem = function(obj, inherits) {\r\n let styleCache = Object.create(null);\r\n let childrenCache = null;\r\n this.name = obj.nodeName;\r\n this.isOuterElement = obj === svg || !obj.parentNode;\r\n this.inherits = inherits || (!this.isOuterElement ? createSVGElement(obj.parentNode, null) : null);\r\n this.stack = (this.inherits ? this.inherits.stack.concat(obj) : [obj]);\r\n this.style = parseStyleAttr(typeof obj.getAttribute === 'function' && obj.getAttribute('style'));\r\n this.css = useCSS ? getComputedStyle(obj) : getStyle(obj);\r\n this.allowedChildren = [];\r\n this.attr = function(key) {\r\n if (typeof obj.getAttribute === 'function') {\r\n return obj.getAttribute(key);\r\n }\r\n };\r\n this.resolveUrl = function(value) {\r\n let temp = (value || '').match(/^\\s*(?:url\\(\"(.*)#(.*)\"\\)|url\\('(.*)#(.*)'\\)|url\\((.*)#(.*)\\)|(.*)#(.*))\\s*$/) || [];\r\n let file = temp[1] || temp[3] || temp[5] || temp[7],\r\n id = temp[2] || temp[4] || temp[6] || temp[8];\r\n if (id) {\r\n if (!file) {\r\n let svgObj = svg.getElementById(id);\r\n if (svgObj) {\r\n if (this.stack.indexOf(svgObj) === -1) {\r\n return svgObj;\r\n } else {\r\n warningCallback('SVGtoPDF: loop of circular references for id \"' + id + '\"');\r\n return;\r\n }\r\n }\r\n }\r\n if (documentCallback) {\r\n let svgs = documentCache[file];\r\n if (!svgs) {\r\n svgs = documentCallback(file);\r\n if (!isArrayLike(svgs)) {svgs = [svgs];}\r\n for (let i = 0; i < svgs.length; i++) {\r\n if (typeof svgs[i] === 'string') {svgs[i] = parseXml(svgs[i]);}\r\n }\r\n documentCache[file] = svgs;\r\n }\r\n for (let i = 0; i < svgs.length; i++) {\r\n let svgObj = svgs[i].getElementById(id);\r\n if (svgObj) {\r\n if (this.stack.indexOf(svgObj) === -1) {\r\n return svgObj;\r\n } else {\r\n warningCallback('SVGtoPDF: loop of circular references for id \"' + file + '#' + id + '\"');\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n this.computeUnits = function(value, unit, percent, isFontSize) {\r\n if (unit === '%') {\r\n return parseFloat(value) / 100 * (isFontSize || percent != null ? percent : this.getViewport());\r\n } else if (unit === 'ex' || unit === 'em') {\r\n return value * {'em':1, 'ex':0.5}[unit] * (isFontSize ? percent : this.get('font-size'));\r\n } else {\r\n return value * {'':1, 'px':1, 'pt':96/72, 'cm':96/2.54, 'mm':96/25.4, 'in':96, 'pc':96/6}[unit];\r\n }\r\n };\r\n this.computeLength = function(value, percent, initial, isFontSize) {\r\n let parser = new StringParser((value || '').trim()), temp1, temp2;\r\n if (typeof (temp1 = parser.matchNumber()) === 'string' && typeof (temp2 = parser.matchLengthUnit()) === 'string' && !parser.matchAll()) {\r\n return this.computeUnits(temp1, temp2, percent, isFontSize);\r\n }\r\n return initial;\r\n };\r\n this.computeLengthList = function(value, percent, strict) {\r\n let parser = new StringParser((value || '').trim()), result = [], temp1, temp2;\r\n while (typeof (temp1 = parser.matchNumber()) === 'string' && typeof (temp2 = parser.matchLengthUnit()) === 'string') {\r\n result.push(this.computeUnits(temp1, temp2, percent));\r\n parser.matchSeparator();\r\n }\r\n if (strict && parser.matchAll()) {return;}\r\n return result;\r\n };\r\n this.getLength = function(key, percent, initial) {\r\n return this.computeLength(this.attr(key), percent, initial);\r\n };\r\n this.getLengthList = function(key, percent) {\r\n return this.computeLengthList(this.attr(key), percent);\r\n };\r\n this.getUrl = function(key) {\r\n return this.resolveUrl(this.attr(key))\r\n };\r\n this.getNumberList = function(key) {\r\n let parser = new StringParser((this.attr(key) || '').trim()), result = [], temp;\r\n while (temp = parser.matchNumber()) {\r\n result.push(Number(temp));\r\n parser.matchSeparator();\r\n }\r\n result.error = parser.matchAll();\r\n return result;\r\n }\r\n this.getViewbox = function(key, initial) {\r\n let viewBox = this.getNumberList(key);\r\n if (viewBox.length === 4 && viewBox[2] >= 0 && viewBox[3] >= 0) {return viewBox;}\r\n return initial;\r\n };\r\n this.getPercent = function(key, initial) {\r\n let value = this.attr(key);\r\n let parser = new StringParser((value || '').trim()), temp1, temp2;\r\n let number = parser.matchNumber();\r\n if (!number) {return initial;}\r\n if (parser.match('%')) {number *= 0.01;}\r\n if (parser.matchAll()) {return initial;}\r\n return Math.max(0, Math.min(1, number));\r\n };\r\n this.chooseValue = function(args) {\r\n for (let i = 0; i < arguments.length; i++) {\r\n if (arguments[i] != null && arguments[i] === arguments[i]) {return arguments[i];}\r\n }\r\n return arguments[arguments.length - 1];\r\n };\r\n this.get = function(key) {\r\n if (styleCache[key] !== undefined) {return styleCache[key];}\r\n let keyInfo = Properties[key] || {}, value, result;\r\n for (let i = 0; i < 3; i++) {\r\n switch (i) {\r\n case 0:\r\n if (key !== 'transform') { // the CSS transform behaves strangely\r\n value = this.css[keyInfo.css || key];\r\n }\r\n break;\r\n case 1:\r\n value = this.style[key];\r\n break;\r\n case 2:\r\n value = this.attr(key);\r\n break;\r\n }\r\n if (value === 'inherit') {\r\n result = (this.inherits ? this.inherits.get(key) : keyInfo.initial);\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n if (keyInfo.values != null) {\r\n result = keyInfo.values[value];\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n if (value != null) {\r\n let parsed;\r\n switch (key) {\r\n case 'font-size':\r\n result = this.computeLength(value, this.inherits ? this.inherits.get(key) : keyInfo.initial, undefined, true);\r\n break;\r\n case 'baseline-shift':\r\n result = this.computeLength(value, this.get('font-size'));\r\n break;\r\n case 'font-family':\r\n result = value || undefined;\r\n break;\r\n case 'opacity': case 'stroke-opacity': case 'fill-opacity': case 'stop-opacity':\r\n parsed = parseFloat(value);\r\n if (!isNaN(parsed)) {\r\n result = Math.max(0, Math.min(1, parsed));\r\n }\r\n break;\r\n case 'transform':\r\n result = parseTranform(value);\r\n break;\r\n case 'stroke-dasharray':\r\n if (value === 'none') {\r\n result = [];\r\n } else if (parsed = this.computeLengthList(value, this.getViewport(), true)) {\r\n let sum = 0, error = false;\r\n for (let j = 0; j < parsed.length; j++) {\r\n if (parsed[j] < 0) {error = true;}\r\n sum += parsed[j];\r\n }\r\n if (!error) {\r\n if (parsed.length % 2 === 1) {\r\n parsed = parsed.concat(parsed);\r\n }\r\n result = (sum === 0 ? [] : parsed);\r\n }\r\n }\r\n break;\r\n case 'color':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else {\r\n result = parseColor(value);\r\n }\r\n break;\r\n case 'fill': case 'stroke':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else if (value === 'currentColor') {\r\n result = this.get('color');\r\n } else if (parsed = parseColor(value)) {\r\n return parsed;\r\n } else if (parsed = (value || '').split(' ')) {\r\n let object = this.resolveUrl(parsed[0]),\r\n fallbackColor = parseColor(parsed[1]);\r\n if (object == null) {\r\n result = fallbackColor;\r\n } else if (object.nodeName === 'linearGradient' || object.nodeName === 'radialGradient') {\r\n result = new SvgElemGradient(object, null, fallbackColor);\r\n } else if (object.nodeName === 'pattern') {\r\n result = new SvgElemPattern(object, null, fallbackColor);\r\n } else {\r\n result = fallbackColor;\r\n }\r\n }\r\n break;\r\n case 'stop-color':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else if (value === 'currentColor') {\r\n result = this.get('color');\r\n } else {\r\n result = parseColor(value);\r\n }\r\n break;\r\n case 'marker-start': case 'marker-mid': case 'marker-end': case 'clip-path': case 'mask':\r\n if (value === 'none') {\r\n result = 'none';\r\n } else {\r\n result = this.resolveUrl(value);\r\n }\r\n break;\r\n case 'stroke-width':\r\n parsed = this.computeLength(value, this.getViewport());\r\n if (parsed != null && parsed >= 0) {\r\n result = parsed;\r\n }\r\n break;\r\n case 'stroke-miterlimit':\r\n parsed = parseFloat(value);\r\n if (parsed != null && parsed >= 1) {\r\n result = parsed;\r\n }\r\n break;\r\n case 'word-spacing': case 'letter-spacing':\r\n result = this.computeLength(value, this.getViewport());\r\n break;\r\n case 'stroke-dashoffset':\r\n result = this.computeLength(value, this.getViewport());\r\n if (result != null) {\r\n if (result < 0) { // fix for crbug.com/660850\r\n let dasharray = this.get('stroke-dasharray');\r\n for (let j = 0; j < dasharray.length; j++) {result += dasharray[j];}\r\n }\r\n }\r\n break;\r\n }\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n }\r\n return styleCache[key] = (keyInfo.inherit && this.inherits ? this.inherits.get(key) : keyInfo.initial);\r\n };\r\n this.getChildren = function() {\r\n if (childrenCache != null) {return childrenCache;}\r\n let children = [];\r\n for (let i = 0; i < obj.childNodes.length; i++) {\r\n let child = obj.childNodes[i];\r\n if (!child.error && this.allowedChildren.indexOf(child.nodeName) !== -1) {\r\n children.push(createSVGElement(child, this));\r\n }\r\n }\r\n return childrenCache = children;\r\n };\r\n this.getParentVWidth = function() {\r\n return (this.inherits ? this.inherits.getVWidth(): viewportWidth);\r\n };\r\n this.getParentVHeight = function() {\r\n return (this.inherits ? this.inherits.getVHeight() : viewportHeight);\r\n };\r\n this.getParentViewport = function() {\r\n return Math.sqrt(0.5 * this.getParentVWidth() * this.getParentVWidth() + 0.5 * this.getParentVHeight() * this.getParentVHeight());\r\n };\r\n this.getVWidth = function() {\r\n return this.getParentVWidth();\r\n };\r\n this.getVHeight = function() {\r\n return this.getParentVHeight();\r\n };\r\n this.getViewport = function() {\r\n return Math.sqrt(0.5 * this.getVWidth() * this.getVWidth() + 0.5 * this.getVHeight() * this.getVHeight());\r\n };\r\n this.getBoundingBox = function() {\r\n let shape = this.getBoundingShape();\r\n return shape.getBoundingBox();\r\n };\r\n };\r\n\r\n var SvgElemStylable = function(obj, inherits) {\r\n SvgElem.call(this, obj, inherits);\r\n this.transform = function() {\r\n doc.transform.apply(doc, this.getTransformation());\r\n };\r\n this.clip = function() {\r\n if (this.get('clip-path') !== 'none') {\r\n let clipPath = new SvgElemClipPath(this.get('clip-path'), null);\r\n clipPath.useMask(this.getBoundingBox());\r\n return true;\r\n }\r\n };\r\n this.mask = function() {\r\n if (this.get('mask') !== 'none') {\r\n let mask = new SvgElemMask(this.get('mask'), null);\r\n mask.useMask(this.getBoundingBox());\r\n return true;\r\n }\r\n };\r\n this.getFill = function(isClip, isMask) {\r\n let opacity = this.get('opacity'),\r\n fill = this.get('fill'),\r\n fillOpacity = this.get('fill-opacity');\r\n if (isClip) {return DefaultColors.white;}\r\n if (fill !== 'none' && opacity && fillOpacity) {\r\n if (fill instanceof SvgElemGradient || fill instanceof SvgElemPattern) {\r\n return fill.getPaint(this.getBoundingBox(), fillOpacity * opacity, isClip, isMask);\r\n }\r\n return opacityToColor(fill, fillOpacity * opacity, isMask);\r\n }\r\n };\r\n this.getStroke = function(isClip, isMask) {\r\n let opacity = this.get('opacity'),\r\n stroke = this.get('stroke'),\r\n strokeOpacity = this.get('stroke-opacity');\r\n if (isClip || isEqual(this.get('stroke-width'), 0)) {return;}\r\n if (stroke !== 'none' && opacity && strokeOpacity) {\r\n if (stroke instanceof SvgElemGradient || stroke instanceof SvgElemPattern) {\r\n return stroke.getPaint(this.getBoundingBox(), strokeOpacity * opacity, isClip, isMask);\r\n }\r\n return opacityToColor(stroke, strokeOpacity * opacity, isMask);\r\n }\r\n };\r\n };\r\n\r\n var SvgElemHasChildren = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.allowedChildren = ['use', 'g', 'a', 'svg', 'image', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path', 'text'];\r\n this.getBoundingShape = function() {\r\n let shape = new SvgShape(),\r\n children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i].get('display') !== 'none') {\r\n if (typeof children[i].getBoundingShape === 'function') {\r\n let childShape = children[i].getBoundingShape().clone();\r\n if (typeof children[i].getTransformation === 'function') {\r\n childShape.transform(children[i].getTransformation());\r\n }\r\n shape.mergeShape(childShape);\r\n }\r\n }\r\n }\r\n return shape;\r\n };\r\n this.drawChildren = function(isClip, isMask) {\r\n let children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i].get('display') !== 'none') {\r\n if (typeof children[i].drawInDocument === 'function') {\r\n children[i].drawInDocument(isClip, isMask);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n\r\n var SvgElemContainer = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.drawContent = function(isClip, isMask) {\r\n this.transform();\r\n let clipped = this.clip(),\r\n masked = this.mask(),\r\n group;\r\n if ((this.get('opacity') < 1 || clipped || masked) && !isClip) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawChildren(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n doc.fillOpacity(this.get('opacity'));\r\n docInsertGroup(group);\r\n }\r\n };\r\n };\r\n\r\n var SvgElemUse = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n child = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (child) {child = createSVGElement(child, this);}\r\n this.getChildren = function() {\r\n return child ? [child] : [];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(this.get('transform'), [1, 0, 0, 1, x, y]);\r\n };\r\n };\r\n\r\n var SvgElemSymbol = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let width = this.getLength('width', this.getParentVWidth(), this.getParentVWidth()),\r\n height = this.getLength('height', this.getParentVHeight(), this.getParentVHeight());\r\n if (inherits instanceof SvgElemUse) {\r\n width = inherits.getLength('width', inherits.getParentVWidth(), width);\r\n height = inherits.getLength('height', inherits.getParentVHeight(), height);\r\n }\r\n let aspectRatio = (this.attr('preserveAspectRatio') || '').trim(),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3]), [1, 0, 0, 1, -viewBox[0], -viewBox[1]]);\r\n };\r\n };\r\n\r\n var SvgElemGroup = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n if (this.link && !isClip && !isMask) {this.addLink();}\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n };\r\n\r\n var SvgElemLink = function(obj, inherits) {\r\n if (inherits && inherits.isText) {\r\n SvgElemTspan.call(this, obj, inherits);\r\n this.allowedChildren = ['textPath', 'tspan', '#text', '#cdata-section', 'a'];\r\n } else {\r\n SvgElemGroup.call(this, obj, inherits);\r\n }\r\n this.link = this.attr('href') || this.attr('xlink:href');\r\n this.addLink = function() {\r\n if (this.link.match(/^(?:[a-z][a-z0-9+.-]*:|\\/\\/)?/i) && this.getChildren().length) {\r\n let bbox = this.getBoundingShape().transform(getGlobalMatrix()).getBoundingBox();\r\n docInsertLink(bbox[0], bbox[1], bbox[2], bbox[3], this.link);\r\n }\r\n }\r\n };\r\n\r\n var SvgElemSvg = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let width = this.getLength('width', this.getParentVWidth(), this.getParentVWidth()),\r\n height = this.getLength('height', this.getParentVHeight(), this.getParentVHeight()),\r\n x = this.getLength('x', this.getParentVWidth(), 0),\r\n y = this.getLength('y', this.getParentVHeight(), 0);\r\n if (inherits instanceof SvgElemUse) {\r\n width = inherits.getLength('width', inherits.getParentVWidth(), width);\r\n height = inherits.getLength('height', inherits.getParentVHeight(), height);\r\n }\r\n let aspectRatio = this.attr('preserveAspectRatio'),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n if (this.isOuterElement && preserveAspectRatio) {\r\n x = y = 0;\r\n width = viewportWidth;\r\n height = viewportHeight;\r\n aspectRatio = preserveAspectRatio;\r\n }\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n if (this.get('overflow') === 'hidden') {\r\n new SvgShape().M(x, y).L(x + width, y).L(x + width, y + height).L(x, y + height).Z()\r\n .transform(this.get('transform'))\r\n .insertInDocument();\r\n doc.clip();\r\n }\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(\r\n this.get('transform'),\r\n [1, 0, 0, 1, x, y],\r\n parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3]),\r\n [1, 0, 0, 1, -viewBox[0], -viewBox[1]]\r\n );\r\n };\r\n };\r\n\r\n var SVGElemImage = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n let link = imageCallback(this.attr('href') || this.attr('xlink:href') || ''),\r\n x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n width = this.getLength('width', this.getVWidth(), 'auto'),\r\n height = this.getLength('height', this.getVHeight(), 'auto'),\r\n image;\r\n try {\r\n image = doc.openImage(link);\r\n } catch(e) {\r\n warningCallback('SVGElemImage: failed to open image \"' + link + '\" in PDFKit');\r\n }\r\n if (image) {\r\n if (width === 'auto' && height !== 'auto') {\r\n width = height * image.width / image.height;\r\n } else if (height === 'auto' && width !== 'auto') {\r\n height = width * image.height / image.width;\r\n } else if (width === 'auto' && height === 'auto') {\r\n width = image.width;\r\n height = image.height;\r\n }\r\n }\r\n if (width === 'auto' || width < 0) {width = 0;}\r\n if (height === 'auto' || height < 0) {height = 0;}\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.getBoundingShape = function() {\r\n return new SvgShape().M(x, y).L(x + width, y).M(x + width, y + height).L(x, y + height);\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n if (this.get('visibility') === 'hidden' || !image) {return;}\r\n doc.save();\r\n this.transform();\r\n if (this.get('overflow') === 'hidden') {\r\n doc.rect(x, y, width, height).clip();\r\n }\r\n this.clip();\r\n this.mask();\r\n doc.translate(x, y);\r\n doc.transform.apply(doc, parseAspectRatio(this.attr('preserveAspectRatio'), width, height, image ? image.width : width, image ? image.height : height));\r\n if (!isClip) {\r\n doc.fillOpacity(this.get('opacity'));\r\n doc.image(image, 0, 0);\r\n } else {\r\n doc.rect(0, 0, image.width, image.height);\r\n docFillColor(DefaultColors.white).fill();\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemPattern = function(obj, inherits, fallback) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.ref = (function() {\r\n let ref = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (ref && ref.nodeName === obj.nodeName) {\r\n return new SvgElemPattern(ref, inherits, fallback);\r\n }\r\n }).call(this);\r\n let _attr = this.attr;\r\n this.attr = function(key) {\r\n let attr = _attr.call(this, key);\r\n if (attr != null || key === 'href' || key === 'xlink:href') {return attr;}\r\n return this.ref ? this.ref.attr(key) : null;\r\n };\r\n let _getChildren = this.getChildren;\r\n this.getChildren = function() {\r\n let children = _getChildren.call(this);\r\n if (children.length > 0) {return children;}\r\n return this.ref ? this.ref.getChildren() : [];\r\n };\r\n this.getPaint = function(bBox, gOpacity, isClip, isMask) {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n bBoxUnitsContent = (this.attr('patternContentUnits') === 'objectBoundingBox'),\r\n x = this.getLength('x', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0),\r\n y = this.getLength('y', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0),\r\n width = this.getLength('width', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0),\r\n height = this.getLength('height', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0);\r\n if (bBoxUnitsContent && !bBoxUnitsPattern) { // Use the same units for pattern & pattern content\r\n x = (x - bBox[0]) / (bBox[2] - bBox[0]) || 0;\r\n y = (y - bBox[1]) / (bBox[3] - bBox[1]) || 0;\r\n width = width / (bBox[2] - bBox[0]) || 0;\r\n height = height / (bBox[3] - bBox[1]) || 0;\r\n } else if (!bBoxUnitsContent && bBoxUnitsPattern) {\r\n x = bBox[0] + x * (bBox[2] - bBox[0]);\r\n y = bBox[1] + y * (bBox[3] - bBox[1]);\r\n width = width * (bBox[2] - bBox[0]);\r\n height = height * (bBox[3] - bBox[1]);\r\n }\r\n let viewBox = this.getViewbox('viewBox', [0, 0, width, height]),\r\n aspectRatio = (this.attr('preserveAspectRatio') || '').trim(),\r\n aspectRatioMatrix = multiplyMatrix(\r\n parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3], 0),\r\n [1, 0, 0, 1, -viewBox[0], -viewBox[1]]\r\n ),\r\n matrix = parseTranform(this.attr('patternTransform'));\r\n if (bBoxUnitsContent) {\r\n matrix = multiplyMatrix([bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]], matrix);\r\n }\r\n matrix = multiplyMatrix(matrix, [1, 0, 0, 1, x, y]);\r\n if ((matrix = validateMatrix(matrix)) && (aspectRatioMatrix = validateMatrix(aspectRatioMatrix)) && (width = validateNumber(width)) && (height = validateNumber(height))) {\r\n let group = docBeginGroup([0, 0, width, height]);\r\n doc.transform.apply(doc, aspectRatioMatrix);\r\n this.drawChildren(isClip, isMask);\r\n docEndGroup(group);\r\n return [docCreatePattern(group, width, height, matrix), gOpacity];\r\n } else {\r\n return fallback ? [fallback[0], fallback[1] * gOpacity] : undefined;\r\n }\r\n };\r\n this.getVWidth = function() {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n width = this.getLength('width', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0);\r\n return this.getViewbox('viewBox', [0, 0, width, 0])[2];\r\n };\r\n this.getVHeight = function() {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n height = this.getLength('height', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0);\r\n return this.getViewbox('viewBox', [0, 0, 0, height])[3];\r\n };\r\n };\r\n\r\n var SvgElemGradient = function(obj, inherits, fallback) {\r\n SvgElem.call(this, obj, inherits);\r\n this.allowedChildren = ['stop'];\r\n this.ref = (function() {\r\n let ref = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (ref && ref.nodeName === obj.nodeName) {\r\n return new SvgElemGradient(ref, inherits, fallback);\r\n }\r\n }).call(this);\r\n let _attr = this.attr;\r\n this.attr = function(key) {\r\n let attr = _attr.call(this, key);\r\n if (attr != null || key === 'href' || key === 'xlink:href') {return attr;}\r\n return this.ref ? this.ref.attr(key) : null;\r\n };\r\n let _getChildren = this.getChildren;\r\n this.getChildren = function() {\r\n let children = _getChildren.call(this);\r\n if (children.length > 0) {return children;}\r\n return this.ref ? this.ref.getChildren() : [];\r\n };\r\n this.getPaint = function(bBox, gOpacity, isClip, isMask) {\r\n let children = this.getChildren();\r\n if (children.length === 0) {return;}\r\n if (children.length === 1) {\r\n let child = children[0],\r\n stopColor = child.get('stop-color');\r\n if (stopColor === 'none') {return;}\r\n return opacityToColor(stopColor, child.get('stop-opacity') * gOpacity, isMask);\r\n }\r\n let bBoxUnits = (this.attr('gradientUnits') !== 'userSpaceOnUse'),\r\n matrix = parseTranform(this.attr('gradientTransform')),\r\n spread = this.attr('spreadMethod'),\r\n grad,\r\n x1, x2, y1, y2, r2,\r\n nAfter = 0,\r\n nBefore = 0,\r\n nTotal = 1;\r\n if (bBoxUnits) {\r\n matrix = multiplyMatrix([bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]], matrix);\r\n }\r\n if (matrix = validateMatrix(matrix)) {\r\n if (this.name === 'linearGradient') {\r\n x1 = this.getLength('x1', (bBoxUnits ? 1 : this.getVWidth()), 0);\r\n x2 = this.getLength('x2', (bBoxUnits ? 1 : this.getVWidth()), (bBoxUnits ? 1 : this.getVWidth()));\r\n y1 = this.getLength('y1', (bBoxUnits ? 1 : this.getVHeight()), 0);\r\n y2 = this.getLength('y2', (bBoxUnits ? 1 : this.getVHeight()), 0);\r\n } else {\r\n x2 = this.getLength('cx', (bBoxUnits ? 1 : this.getVWidth()), (bBoxUnits ? 0.5 : 0.5 * this.getVWidth()));\r\n y2 = this.getLength('cy', (bBoxUnits ? 1 : this.getVHeight()), (bBoxUnits ? 0.5 : 0.5 * this.getVHeight()));\r\n r2 = this.getLength('r', (bBoxUnits ? 1 : this.getViewport()), (bBoxUnits ? 0.5 : 0.5 * this.getViewport()));\r\n x1 = this.getLength('fx', (bBoxUnits ? 1 : this.getVWidth()), x2);\r\n y1 = this.getLength('fy', (bBoxUnits ? 1 : this.getVHeight()), y2);\r\n if (r2 < 0) {\r\n warningCallback('SvgElemGradient: negative r value');\r\n }\r\n let d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),\r\n multiplier = 1;\r\n if (d > r2) { // according to specification\r\n multiplier = r2 / d;\r\n x1 = x2 + (x1 - x2) * multiplier;\r\n y1 = y2 + (y1 - y2) * multiplier;\r\n }\r\n r2 = Math.max(r2, d * multiplier * (1 + 1e-6)); // fix for edge-case gradients see issue #84\r\n }\r\n if (spread === 'reflect' || spread === 'repeat') {\r\n let inv = inverseMatrix(matrix),\r\n corner1 = transformPoint([bBox[0], bBox[1]], inv),\r\n corner2 = transformPoint([bBox[2], bBox[1]], inv),\r\n corner3 = transformPoint([bBox[2], bBox[3]], inv),\r\n corner4 = transformPoint([bBox[0], bBox[3]], inv);\r\n if (this.name === 'linearGradient') { // See file 'gradient-repeat-maths.png'\r\n nAfter = Math.max((corner1[0] - x2) * (x2 - x1) + (corner1[1] - y2) * (y2 - y1),\r\n (corner2[0] - x2) * (x2 - x1) + (corner2[1] - y2) * (y2 - y1),\r\n (corner3[0] - x2) * (x2 - x1) + (corner3[1] - y2) * (y2 - y1),\r\n (corner4[0] - x2) * (x2 - x1) + (corner4[1] - y2) * (y2 - y1))\r\n / (Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\r\n nBefore = Math.max((corner1[0] - x1) * (x1 - x2) + (corner1[1] - y1) * (y1 - y2),\r\n (corner2[0] - x1) * (x1 - x2) + (corner2[1] - y1) * (y1 - y2),\r\n (corner3[0] - x1) * (x1 - x2) + (corner3[1] - y1) * (y1 - y2),\r\n (corner4[0] - x1) * (x1 - x2) + (corner4[1] - y1) * (y1 - y2))\r\n / (Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\r\n } else {\r\n nAfter = Math.sqrt(Math.max(Math.pow(corner1[0] - x2, 2) + Math.pow(corner1[1] - y2, 2),\r\n Math.pow(corner2[0] - x2, 2) + Math.pow(corner2[1] - y2, 2),\r\n Math.pow(corner3[0] - x2, 2) + Math.pow(corner3[1] - y2, 2),\r\n Math.pow(corner4[0] - x2, 2) + Math.pow(corner4[1] - y2, 2))) / r2 - 1;\r\n }\r\n nAfter = Math.ceil(nAfter + 0.5); // Add a little more because the stroke can extend outside of the bounding box\r\n nBefore = Math.ceil(nBefore + 0.5);\r\n nTotal = nBefore + 1 + nAfter; // How many times the gradient needs to be repeated to fill the object bounding box\r\n }\r\n if (this.name === 'linearGradient') {\r\n grad = doc.linearGradient(x1 - nBefore * (x2 - x1), y1 - nBefore * (y2 - y1), x2 + nAfter * (x2 - x1), y2 + nAfter * (y2 - y1));\r\n } else {\r\n grad = doc.radialGradient(x1, y1, 0, x2, y2, r2 + nAfter * r2);\r\n }\r\n for (let n = 0; n < nTotal; n++) {\r\n let offset = 0,\r\n inOrder = (spread !== 'reflect' || (n - nBefore) % 2 === 0);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[inOrder ? i : children.length - 1 - i],\r\n stopColor = child.get('stop-color');\r\n if (stopColor === 'none') {stopColor = DefaultColors.transparent;}\r\n stopColor = opacityToColor(stopColor, child.get('stop-opacity') * gOpacity, isMask);\r\n offset = Math.max(offset, inOrder ? child.getPercent('offset', 0) : 1 - child.getPercent('offset', 0));\r\n if (i === 0 && stopColor[0].length === 4) {grad._colorSpace = 'DeviceCMYK';} // Fix until PR #763 is merged into PDFKit\r\n if (i === 0 && offset > 0) {\r\n grad.stop((n + 0) / nTotal, stopColor[0], stopColor[1]);\r\n }\r\n grad.stop((n + offset) / (nAfter + nBefore + 1), stopColor[0], stopColor[1]);\r\n if (i === children.length - 1 && offset < 1) {\r\n grad.stop((n + 1) / nTotal, stopColor[0], stopColor[1]);\r\n }\r\n }\r\n }\r\n grad.setTransform.apply(grad, matrix);\r\n return [grad, 1];\r\n } else {\r\n return fallback ? [fallback[0], fallback[1] * gOpacity] : undefined;\r\n }\r\n }\r\n };\r\n\r\n var SvgElemBasicShape = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.dashScale = 1;\r\n this.getBoundingShape = function() {\r\n return this.shape;\r\n };\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n if (this.get('visibility') === 'hidden' || !this.shape) {return;}\r\n doc.save();\r\n this.transform();\r\n this.clip();\r\n if (!isClip) {\r\n let masked = this.mask(),\r\n group;\r\n if (masked) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n let subPaths = this.shape.getSubPaths(),\r\n fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask),\r\n lineWidth = this.get('stroke-width'),\r\n lineCap = this.get('stroke-linecap');\r\n if (fill || stroke) {\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke) {\r\n for (let j = 0; j < subPaths.length; j++) {\r\n if (isEqual(subPaths[j].totalLength, 0)) {\r\n if ((lineCap === 'square' || lineCap === 'round') && lineWidth > 0) {\r\n if (subPaths[j].startPoint && subPaths[j].startPoint.length > 1) {\r\n let x = subPaths[j].startPoint[0],\r\n y = subPaths[j].startPoint[1];\r\n docFillColor(stroke);\r\n if (lineCap === 'square') {\r\n doc.rect(x - 0.5 * lineWidth, y - 0.5 * lineWidth, lineWidth, lineWidth);\r\n } else if (lineCap === 'round') {\r\n doc.circle(x, y, 0.5 * lineWidth);\r\n }\r\n doc.fill();\r\n }\r\n }\r\n }\r\n }\r\n let dashArray = this.get('stroke-dasharray'),\r\n dashOffset = this.get('stroke-dashoffset');\r\n if (isNotEqual(this.dashScale, 1)) {\r\n for (let j = 0; j < dashArray.length; j++) {\r\n dashArray[j] *= this.dashScale;\r\n }\r\n dashOffset *= this.dashScale;\r\n }\r\n docStrokeColor(stroke);\r\n doc.lineWidth(lineWidth)\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(lineCap)\r\n .dash(dashArray, {phase: dashOffset});\r\n }\r\n for (let j = 0; j < subPaths.length; j++) {\r\n if (subPaths[j].totalLength > 0) {\r\n subPaths[j].insertInDocument();\r\n }\r\n }\r\n if (fill && stroke) {\r\n doc.fillAndStroke(this.get('fill-rule'));\r\n } else if (fill) {\r\n doc.fill(this.get('fill-rule'));\r\n } else if (stroke) {\r\n doc.stroke();\r\n }\r\n }\r\n let markerStart = this.get('marker-start'),\r\n markerMid = this.get('marker-mid'),\r\n markerEnd = this.get('marker-end');\r\n if (markerStart !== 'none' || markerMid !== 'none' || markerEnd !== 'none') {\r\n let markersPos = this.shape.getMarkers();\r\n if (markerStart !== 'none') {\r\n let marker = new SvgElemMarker(markerStart, null);\r\n marker.drawMarker(false, isMask, markersPos[0], lineWidth);\r\n }\r\n if (markerMid !== 'none') {\r\n for (let i = 1; i < markersPos.length - 1; i++) {\r\n let marker = new SvgElemMarker(markerMid, null);\r\n marker.drawMarker(false, isMask, markersPos[i], lineWidth);\r\n }\r\n }\r\n if (markerEnd !== 'none') {\r\n let marker = new SvgElemMarker(markerEnd, null);\r\n marker.drawMarker(false, isMask, markersPos[markersPos.length - 1], lineWidth);\r\n }\r\n }\r\n if (group) {\r\n docEndGroup(group);\r\n docInsertGroup(group);\r\n }\r\n } else {\r\n this.shape.insertInDocument();\r\n docFillColor(DefaultColors.white);\r\n doc.fill(this.get('clip-rule'));\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemRect = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n w = this.getLength('width', this.getVWidth(), 0),\r\n h = this.getLength('height', this.getVHeight(), 0),\r\n rx = this.getLength('rx', this.getVWidth()),\r\n ry = this.getLength('ry', this.getVHeight());\r\n if (rx === undefined && ry === undefined) {rx = ry = 0;}\r\n else if (rx === undefined && ry !== undefined) {rx = ry;}\r\n else if (rx !== undefined && ry === undefined) {ry = rx;}\r\n if (w > 0 && h > 0) {\r\n if (rx && ry) {\r\n rx = Math.min(rx, 0.5 * w);\r\n ry = Math.min(ry, 0.5 * h);\r\n this.shape = new SvgShape().M(x + rx, y).L(x + w - rx, y).A(rx, ry, 0, 0, 1, x + w, y + ry)\r\n .L(x + w, y + h - ry).A(rx, ry, 0, 0, 1, x + w - rx, y + h).L(x + rx, y + h)\r\n .A(rx, ry, 0, 0, 1, x, y + h - ry).L(x, y + ry).A(rx, ry, 0, 0, 1, x + rx, y).Z();\r\n } else {\r\n this.shape = new SvgShape().M(x, y).L(x + w, y).L(x + w, y + h).L(x, y + h).Z();\r\n }\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemCircle = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let cx = this.getLength('cx', this.getVWidth(), 0),\r\n cy = this.getLength('cy', this.getVHeight(), 0),\r\n r = this.getLength('r', this.getViewport(), 0);\r\n if (r > 0) {\r\n this.shape = new SvgShape().M(cx + r, cy).A(r, r, 0, 0, 1, cx - r, cy).A(r, r, 0, 0, 1, cx + r, cy).Z();\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemEllipse = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let cx = this.getLength('cx', this.getVWidth(), 0),\r\n cy = this.getLength('cy', this.getVHeight(), 0),\r\n rx = this.getLength('rx', this.getVWidth(), 0),\r\n ry = this.getLength('ry', this.getVHeight(), 0);\r\n if (rx > 0 && ry > 0) {\r\n this.shape = new SvgShape().M(cx + rx, cy).A(rx, ry, 0, 0, 1, cx - rx, cy).A(rx, ry, 0, 0, 1, cx + rx, cy).Z();\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemLine = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let x1 = this.getLength('x1', this.getVWidth(), 0),\r\n y1 = this.getLength('y1', this.getVHeight(), 0),\r\n x2 = this.getLength('x2', this.getVWidth(), 0),\r\n y2 = this.getLength('y2', this.getVHeight(), 0);\r\n this.shape = new SvgShape().M(x1, y1).L(x2, y2);\r\n };\r\n\r\n var SvgElemPolyline = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let points = this.getNumberList('points');\r\n this.shape = new SvgShape();\r\n for (let i = 0; i < points.length - 1; i += 2) {\r\n if (i === 0) {\r\n this.shape.M(points[i], points[i+1]);\r\n } else {\r\n this.shape.L(points[i], points[i+1]);\r\n }\r\n }\r\n if (points.error) {warningCallback('SvgElemPolygon: unexpected string ' + points.error);}\r\n if (points.length % 2 === 1) {warningCallback('SvgElemPolyline: uneven number of coordinates');}\r\n };\r\n\r\n var SvgElemPolygon = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let points = this.getNumberList('points');\r\n this.shape = new SvgShape();\r\n for (let i = 0; i < points.length - 1; i += 2) {\r\n if (i === 0) {\r\n this.shape.M(points[i], points[i+1]);\r\n } else {\r\n this.shape.L(points[i], points[i+1]);\r\n }\r\n }\r\n this.shape.Z();\r\n if (points.error) {warningCallback('SvgElemPolygon: unexpected string ' + points.error);}\r\n if (points.length % 2 === 1) {warningCallback('SvgElemPolygon: uneven number of coordinates');}\r\n };\r\n\r\n var SvgElemPath = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n this.shape = new SvgShape().path(this.attr('d'));\r\n let pathLength = this.getLength('pathLength', this.getViewport());\r\n this.pathLength = pathLength > 0 ? pathLength : undefined;\r\n this.dashScale = (this.pathLength !== undefined ? this.shape.totalLength / this.pathLength : 1);\r\n };\r\n\r\n var SvgElemMarker = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n let width = this.getLength('markerWidth', this.getParentVWidth(), 3),\r\n height = this.getLength('markerHeight', this.getParentVHeight(), 3),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawMarker = function(isClip, isMask, posArray, strokeWidth) {\r\n doc.save();\r\n let orient = this.attr('orient'),\r\n units = this.attr('markerUnits'),\r\n rotate = (orient === 'auto' ? posArray[2] : (parseFloat(orient) || 0) * Math.PI / 180),\r\n scale = (units === 'userSpaceOnUse' ? 1 : strokeWidth);\r\n doc.transform(Math.cos(rotate) * scale, Math.sin(rotate) * scale, -Math.sin(rotate) * scale, Math.cos(rotate) * scale, posArray[0], posArray[1]);\r\n let refX = this.getLength('refX', this.getVWidth(), 0),\r\n refY = this.getLength('refY', this.getVHeight(), 0),\r\n aspectRatioMatrix = parseAspectRatio(this.attr('preserveAspectRatio'), width, height, viewBox[2], viewBox[3], 0.5);\r\n if (this.get('overflow') === 'hidden') {\r\n doc.rect(aspectRatioMatrix[0] * (viewBox[0] + viewBox[2] / 2 - refX) - width / 2, aspectRatioMatrix[3] * (viewBox[1] + viewBox[3] / 2 - refY) - height / 2, width, height).clip();\r\n }\r\n doc.transform.apply(doc, aspectRatioMatrix);\r\n doc.translate(-refX, -refY);\r\n let group;\r\n if (this.get('opacity') < 1 && !isClip) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawChildren(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n doc.fillOpacity(this.get('opacity'));\r\n docInsertGroup(group);\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemClipPath = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.useMask = function(bBox) {\r\n let group = docBeginGroup(getPageBBox());\r\n doc.save();\r\n if (this.attr('clipPathUnits') === 'objectBoundingBox') {\r\n doc.transform(bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]);\r\n }\r\n this.clip();\r\n this.drawChildren(true, false);\r\n doc.restore();\r\n docEndGroup(group);\r\n docApplyMask(group, true);\r\n };\r\n };\r\n\r\n var SvgElemMask = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.useMask = function(bBox) {\r\n let group = docBeginGroup(getPageBBox());\r\n doc.save();\r\n let x, y, w, h;\r\n if (this.attr('maskUnits') === 'userSpaceOnUse') {\r\n x = this.getLength('x', this.getVWidth(), -0.1 * (bBox[2] - bBox[0]) + bBox[0]);\r\n y = this.getLength('y', this.getVHeight(), -0.1 * (bBox[3] - bBox[1]) + bBox[1]);\r\n w = this.getLength('width', this.getVWidth(), 1.2 * (bBox[2] - bBox[0]));\r\n h = this.getLength('height', this.getVHeight(), 1.2 * (bBox[3] - bBox[1]));\r\n } else {\r\n x = this.getLength('x', this.getVWidth(), -0.1) * (bBox[2] - bBox[0]) + bBox[0];\r\n y = this.getLength('y', this.getVHeight(), -0.1) * (bBox[3] - bBox[1]) + bBox[1];\r\n w = this.getLength('width', this.getVWidth(), 1.2) * (bBox[2] - bBox[0]);\r\n h = this.getLength('height', this.getVHeight(), 1.2) * (bBox[3] - bBox[1]);\r\n }\r\n doc.rect(x, y, w, h).clip();\r\n if (this.attr('maskContentUnits') === 'objectBoundingBox') {\r\n doc.transform(bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]);\r\n }\r\n this.clip();\r\n this.drawChildren(false, true);\r\n doc.restore();\r\n docEndGroup(group);\r\n docApplyMask(group, true);\r\n };\r\n };\r\n\r\n var SvgElemTextContainer = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.allowedChildren = ['tspan', '#text', '#cdata-section', 'a'];\r\n this.isText = true;\r\n this.getBoundingShape = function() {\r\n let shape = new SvgShape();\r\n for (let i = 0; i < this._pos.length; i++) {\r\n let pos = this._pos[i];\r\n if (!pos.hidden) {\r\n let dx0 = pos.ascent * Math.sin(pos.rotate), dy0 = -pos.ascent * Math.cos(pos.rotate),\r\n dx1 = pos.descent * Math.sin(pos.rotate), dy1 = -pos.descent * Math.cos(pos.rotate),\r\n dx2 = pos.width * Math.cos(pos.rotate), dy2 = pos.width * Math.sin(pos.rotate);\r\n shape.M(pos.x + dx0, pos.y + dy0).L(pos.x + dx0 + dx2, pos.y + dy0 + dy2)\r\n .M(pos.x + dx1 + dx2, pos.y + dy1 + dy2).L(pos.x + dx1, pos.y + dy1);\r\n }\r\n }\r\n return shape;\r\n };\r\n this.drawTextInDocument = function(isClip, isMask) {\r\n if (this.link && !isClip && !isMask) {this.addLink();}\r\n if (this.get('text-decoration') === 'underline') {\r\n this.decorate(0.05 * this._font.size, -0.075 * this._font.size, isClip, isMask);\r\n }\r\n if (this.get('text-decoration') === 'overline') {\r\n this.decorate(0.05 * this._font.size, getAscent(this._font.font, this._font.size) + 0.075 * this._font.size, isClip, isMask);\r\n }\r\n let fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask),\r\n strokeWidth = this.get('stroke-width');\r\n if (this._font.fauxBold) {\r\n if (!stroke) {\r\n stroke = fill;\r\n strokeWidth = this._font.size * 0.03;\r\n } else {\r\n strokeWidth += this._font.size * 0.03;\r\n }\r\n }\r\n let children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n let childElem = children[i];\r\n switch(childElem.name) {\r\n case 'tspan': case 'textPath': case 'a':\r\n if (childElem.get('display') !== 'none') {\r\n childElem.drawTextInDocument(isClip, isMask);\r\n }\r\n break;\r\n case '#text': case '#cdata-section':\r\n if (this.get('visibility') === 'hidden') {continue;}\r\n if (fill || stroke || isClip) {\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke && strokeWidth) {\r\n docStrokeColor(stroke);\r\n doc.lineWidth(strokeWidth)\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(this.get('stroke-linecap'))\r\n .dash(this.get('stroke-dasharray'), {phase:this.get('stroke-dashoffset')});\r\n }\r\n docBeginText(this._font.font, this._font.size);\r\n docSetTextMode(!!fill, !!stroke);\r\n for (let j = 0, pos = childElem._pos; j < pos.length; j++) {\r\n if (!pos[j].hidden && isNotEqual(pos[j].width, 0)) {\r\n let cos = Math.cos(pos[j].rotate), sin = Math.sin(pos[j].rotate), skew = (this._font.fauxItalic ? -0.25 : 0);\r\n docSetTextMatrix(cos * pos[j].scale, sin * pos[j].scale, cos * skew - sin, sin * skew + cos, pos[j].x, pos[j].y);\r\n docWriteGlyph(pos[j].glyph);\r\n }\r\n }\r\n docEndText();\r\n }\r\n break;\r\n }\r\n }\r\n if (this.get('text-decoration') === 'line-through') {\r\n this.decorate(0.05 * this._font.size, 0.5 * (getAscent(this._font.font, this._font.size) + getDescent(this._font.font, this._font.size)), isClip, isMask);\r\n }\r\n };\r\n this.decorate = function(lineWidth, linePosition, isClip, isMask) {\r\n let fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask);\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke) {\r\n docStrokeColor(stroke);\r\n doc.lineWidth(this.get('stroke-width'))\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(this.get('stroke-linecap'))\r\n .dash(this.get('stroke-dasharray'), {phase:this.get('stroke-dashoffset')});\r\n }\r\n for (let j = 0, pos = this._pos; j < pos.length; j++) {\r\n if (!pos[j].hidden && isNotEqual(pos[j].width, 0)) {\r\n let dx0 = (linePosition + lineWidth / 2) * Math.sin(pos[j].rotate),\r\n dy0 = -(linePosition + lineWidth / 2) * Math.cos(pos[j].rotate),\r\n dx1 = (linePosition - lineWidth / 2) * Math.sin(pos[j].rotate),\r\n dy1 = -(linePosition - lineWidth / 2) * Math.cos(pos[j].rotate),\r\n dx2 = pos[j].width * Math.cos(pos[j].rotate),\r\n dy2 = pos[j].width * Math.sin(pos[j].rotate);\r\n new SvgShape().M(pos[j].x + dx0, pos[j].y + dy0)\r\n .L(pos[j].x + dx0 + dx2, pos[j].y + dy0 + dy2)\r\n .L(pos[j].x + dx1 + dx2, pos[j].y + dy1 + dy2)\r\n .L(pos[j].x + dx1, pos[j].y + dy1).Z()\r\n .insertInDocument();\r\n if (fill && stroke) {\r\n doc.fillAndStroke();\r\n } else if (fill) {\r\n doc.fill();\r\n } else if (stroke) {\r\n doc.stroke();\r\n }\r\n }\r\n }\r\n };\r\n };\r\n\r\n var SvgElemTextNode = function(obj, inherits) {\r\n this.name = obj.nodeName;\r\n this.textContent = obj.nodeValue;\r\n };\r\n\r\n var SvgElemTspan = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n };\r\n\r\n var SvgElemTextPath = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n let pathObject, pathLength, temp;\r\n if ((temp = this.attr('path')) && temp.trim() !== '') {\r\n let pathLength = this.getLength('pathLength', this.getViewport());\r\n this.pathObject = new SvgShape().path(temp);\r\n this.pathLength = pathLength > 0 ? pathLength : this.pathObject.totalLength;\r\n this.pathScale = this.pathObject.totalLength / this.pathLength;\r\n } else if ((temp = this.getUrl('href') || this.getUrl('xlink:href')) && temp.nodeName === 'path') {\r\n let pathElem = new SvgElemPath(temp, this);\r\n this.pathObject = pathElem.shape.clone().transform(pathElem.get('transform'));\r\n this.pathLength = this.chooseValue(pathElem.pathLength, this.pathObject.totalLength);\r\n this.pathScale = this.pathObject.totalLength / this.pathLength;\r\n }\r\n };\r\n\r\n var SvgElemText = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n this.allowedChildren = ['textPath', 'tspan', '#text', '#cdata-section', 'a'];\r\n (function (textParentElem) {\r\n let processedText = '', remainingText = obj.textContent, textPaths = [], currentChunk = [], currentAnchor, currentDirection, currentX = 0, currentY = 0;\r\n function doAnchoring() {\r\n if (currentChunk.length) {\r\n let last = currentChunk[currentChunk.length - 1];\r\n let first = currentChunk[0]\r\n let width = last.x + last.width - first.x;\r\n let anchordx = {'startltr': 0, 'middleltr': 0.5, 'endltr': 1, 'startrtl': 1, 'middlertl': 0.5, 'endrtl': 0}[currentAnchor + currentDirection] * width || 0;\r\n for (let i = 0; i < currentChunk.length; i++) {\r\n currentChunk[i].x -= anchordx;\r\n }\r\n }\r\n currentChunk = [];\r\n }\r\n function adjustLength(pos, length, spacingAndGlyphs) {\r\n let firstChar = pos[0], lastChar = pos[pos.length - 1],\r\n startX = firstChar.x, endX = lastChar.x + lastChar.width;\r\n if (spacingAndGlyphs) {\r\n let textScale = length / (endX - startX);\r\n if (textScale > 0 && textScale < Infinity) {\r\n for (let j = 0; j < pos.length; j++) {\r\n pos[j].x = startX + textScale * (pos[j].x - startX);\r\n pos[j].scale *= textScale;\r\n pos[j].width *= textScale;\r\n }\r\n }\r\n } else {\r\n if (pos.length >= 2) {\r\n let spaceDiff = (length - (endX - startX)) / (pos.length - 1);\r\n for (let j = 0; j < pos.length; j++) {\r\n pos[j].x += j * spaceDiff;\r\n }\r\n }\r\n }\r\n currentX += length - (endX - startX);\r\n }\r\n function recursive(currentElem, parentElem) {\r\n currentElem._x = combineArrays(currentElem.getLengthList('x', currentElem.getVWidth()), (parentElem ? parentElem._x.slice(parentElem._pos.length) : []));\r\n currentElem._y = combineArrays(currentElem.getLengthList('y', currentElem.getVHeight()), (parentElem ? parentElem._y.slice(parentElem._pos.length) : []));\r\n currentElem._dx = combineArrays(currentElem.getLengthList('dx', currentElem.getVWidth()), (parentElem ? parentElem._dx.slice(parentElem._pos.length) : []));\r\n currentElem._dy = combineArrays(currentElem.getLengthList('dy', currentElem.getVHeight()), (parentElem ? parentElem._dy.slice(parentElem._pos.length) : []));\r\n currentElem._rot = combineArrays(currentElem.getNumberList('rotate'), (parentElem ? parentElem._rot.slice(parentElem._pos.length) : []));\r\n currentElem._defRot = currentElem.chooseValue(currentElem._rot[currentElem._rot.length - 1], parentElem && parentElem._defRot, 0);\r\n if (currentElem.name === 'textPath') {currentElem._y = [];}\r\n let fontOptions = {fauxItalic: false, fauxBold: false},\r\n fontNameorLink = fontCallback(currentElem.get('font-family'), currentElem.get('font-weight') === 'bold', currentElem.get('font-style') === 'italic', fontOptions);\r\n try {\r\n doc.font(fontNameorLink);\r\n } catch(e) {\r\n warningCallback('SVGElemText: failed to open font \"' + fontNameorLink + '\" in PDFKit');\r\n }\r\n currentElem._pos = [];\r\n currentElem._index = 0;\r\n currentElem._font = {font: doc._font, size: currentElem.get('font-size'), fauxItalic: fontOptions.fauxItalic, fauxBold: fontOptions.fauxBold};\r\n let textLength = currentElem.getLength('textLength', currentElem.getVWidth(), undefined),\r\n spacingAndGlyphs = currentElem.attr('lengthAdjust') === 'spacingAndGlyphs',\r\n wordSpacing = currentElem.get('word-spacing'),\r\n letterSpacing = currentElem.get('letter-spacing'),\r\n textAnchor = currentElem.get('text-anchor'),\r\n textDirection = currentElem.get('direction'),\r\n baseline = getBaseline(currentElem._font.font, currentElem._font.size, currentElem.get('alignment-baseline') || currentElem.get('dominant-baseline'), currentElem.get('baseline-shift'));\r\n if (currentElem.name === 'textPath') {\r\n doAnchoring();\r\n currentX = currentY = 0;\r\n }\r\n let children = currentElem.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n let childElem = children[i];\r\n switch(childElem.name) {\r\n case 'tspan': case 'textPath': case 'a':\r\n recursive(childElem, currentElem);\r\n break;\r\n case '#text': case '#cdata-section':\r\n let rawText = childElem.textContent, renderedText = rawText, words;\r\n childElem._font = currentElem._font;\r\n childElem._pos = [];\r\n remainingText = remainingText.substring(rawText.length);\r\n if (currentElem.get('xml:space') === 'preserve') {\r\n renderedText = renderedText.replace(/[\\s]/g, ' ');\r\n } else {\r\n renderedText = renderedText.replace(/[\\s]+/g, ' ');\r\n if (processedText.match(/[\\s]$|^$/)) {renderedText = renderedText.replace(/^[\\s]/, '');}\r\n if (remainingText.match(/^[\\s]*$/)) {renderedText = renderedText.replace(/[\\s]$/, '');}\r\n }\r\n processedText += rawText;\r\n if (wordSpacing === 0) {\r\n words = [renderedText];\r\n } else {\r\n words = renderedText.split(/(\\s)/);\r\n }\r\n for (let w = 0; w < words.length; w++) {\r\n let pos = getTextPos(currentElem._font.font, currentElem._font.size, words[w]);\r\n for (let j = 0; j < pos.length; j++) {\r\n let index = currentElem._index,\r\n xAttr = currentElem._x[index],\r\n yAttr = currentElem._y[index],\r\n dxAttr = currentElem._dx[index],\r\n dyAttr = currentElem._dy[index],\r\n rotAttr = currentElem._rot[index],\r\n continuous = !(w === 0 && j === 0);\r\n if (xAttr !== undefined) {continuous = false; doAnchoring(); currentX = xAttr;}\r\n if (yAttr !== undefined) {continuous = false; doAnchoring(); currentY = yAttr;}\r\n if (dxAttr !== undefined) {continuous = false; currentX += dxAttr;}\r\n if (dyAttr !== undefined) {continuous = false; currentY += dyAttr;}\r\n if (rotAttr !== undefined || currentElem._defRot !== 0) {continuous = false;}\r\n let position = {\r\n glyph: pos[j].glyph,\r\n rotate: (Math.PI / 180) * currentElem.chooseValue(rotAttr, currentElem._defRot),\r\n x: currentX + pos[j].xOffset,\r\n y: currentY + baseline + pos[j].yOffset,\r\n width: pos[j].width,\r\n ascent: getAscent(currentElem._font.font, currentElem._font.size),\r\n descent: getDescent(currentElem._font.font, currentElem._font.size),\r\n scale: 1,\r\n hidden: false,\r\n continuous: continuous\r\n };\r\n currentChunk.push(position);\r\n childElem._pos.push(position);\r\n currentElem._pos.push(position);\r\n currentElem._index += pos[j].unicode.length;\r\n if (currentChunk.length === 1) {\r\n currentAnchor = textAnchor;\r\n currentDirection = textDirection;\r\n }\r\n currentX += pos[j].xAdvance + letterSpacing;\r\n currentY += pos[j].yAdvance;\r\n }\r\n if (words[w] === ' ') {\r\n currentX += wordSpacing;\r\n }\r\n }\r\n break;\r\n default:\r\n remainingText = remainingText.substring(childElem.textContent.length);\r\n }\r\n }\r\n if (textLength && currentElem._pos.length) {\r\n adjustLength(currentElem._pos, textLength, spacingAndGlyphs);\r\n }\r\n if (currentElem.name === 'textPath' || currentElem.name === 'text') {\r\n doAnchoring();\r\n }\r\n if (currentElem.name === 'textPath') {\r\n textPaths.push(currentElem);\r\n let pathObject = currentElem.pathObject;\r\n if (pathObject) {\r\n currentX = pathObject.endPoint[0]; currentY = pathObject.endPoint[1];\r\n }\r\n }\r\n if (parentElem) {\r\n parentElem._pos = parentElem._pos.concat(currentElem._pos);\r\n parentElem._index += currentElem._index;\r\n }\r\n }\r\n function textOnPath(currentElem) {\r\n let pathObject = currentElem.pathObject,\r\n pathLength = currentElem.pathLength,\r\n pathScale = currentElem.pathScale;\r\n if (pathObject) {\r\n let textOffset = currentElem.getLength('startOffset', pathLength, 0);\r\n for (let j = 0; j < currentElem._pos.length; j++) {\r\n let charMidX = textOffset + currentElem._pos[j].x + 0.5 * currentElem._pos[j].width;\r\n if (charMidX > pathLength || charMidX < 0) {\r\n currentElem._pos[j].hidden = true;\r\n } else {\r\n let pointOnPath = pathObject.getPointAtLength(charMidX * pathScale);\r\n if (isNotEqual(pathScale, 1)) {\r\n currentElem._pos[j].scale *= pathScale;\r\n currentElem._pos[j].width *= pathScale;\r\n }\r\n currentElem._pos[j].x = pointOnPath[0] - 0.5 * currentElem._pos[j].width * Math.cos(pointOnPath[2]) - currentElem._pos[j].y * Math.sin(pointOnPath[2]);\r\n currentElem._pos[j].y = pointOnPath[1] - 0.5 * currentElem._pos[j].width * Math.sin(pointOnPath[2]) + currentElem._pos[j].y * Math.cos(pointOnPath[2]);\r\n currentElem._pos[j].rotate = pointOnPath[2] + currentElem._pos[j].rotate;\r\n currentElem._pos[j].continuous = false;\r\n }\r\n }\r\n } else {\r\n for (let j = 0; j < currentElem._pos.length; j++) {\r\n currentElem._pos[j].hidden = true;\r\n }\r\n }\r\n }\r\n recursive(textParentElem, null);\r\n for (let i = 0; i < textPaths.length; i++) {\r\n textOnPath(textPaths[i]);\r\n }\r\n })(this);\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.transform();\r\n this.clip();\r\n let masked = this.mask(), group;\r\n if (masked) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawTextInDocument(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n docInsertGroup(group);\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n options = options || {};\r\n var pxToPt = options.assumePt ? 1 : (72/96), // 1px = 72/96pt, but only if assumePt is false\r\n viewportWidth = (options.width || doc.page.width) / pxToPt,\r\n viewportHeight = (options.height || doc.page.height) / pxToPt,\r\n preserveAspectRatio = options.preserveAspectRatio || null, // default to null so that the attr can override if not passed\r\n useCSS = options.useCSS && typeof SVGElement !== 'undefined' && svg instanceof SVGElement && typeof getComputedStyle === 'function',\r\n warningCallback = options.warningCallback,\r\n fontCallback = options.fontCallback,\r\n imageCallback = options.imageCallback,\r\n colorCallback = options.colorCallback,\r\n documentCallback = options.documentCallback,\r\n precision = Math.ceil(Math.max(1, options.precision)) || 3,\r\n groupStack = [],\r\n documentCache = {},\r\n links = [],\r\n styleRules = [];\r\n\r\n if (typeof warningCallback !== 'function') {\r\n warningCallback = function(str) {\r\n if (typeof console !== undefined && typeof console.warn === 'function') {console.warn(str);}\r\n };\r\n }\r\n if (typeof fontCallback !== 'function') {\r\n fontCallback = function(family, bold, italic, fontOptions) {\r\n // Check if the font is already registered in the document\r\n if (bold && italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-BoldItalic')) {\r\n return family + '-BoldItalic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family + '-Italic')) {\r\n fontOptions.fauxBold = true;\r\n return family + '-Italic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family + '-Bold')) {\r\n fontOptions.fauxItalic = true;\r\n return family + '-Bold';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxBold = true;\r\n fontOptions.fauxItalic = true;\r\n return family;\r\n }\r\n }\r\n if (bold && !italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-Bold')) {\r\n return family + '-Bold';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxBold = true;\r\n return family;\r\n }\r\n }\r\n if (!bold && italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-Italic')) {\r\n return family + '-Italic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxItalic = true;\r\n return family;\r\n }\r\n }\r\n if (!bold && !italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family)) {\r\n return family;\r\n }\r\n }\r\n // Use standard fonts as fallback\r\n if (family.match(/(?:^|,)\\s*serif\\s*$/)) {\r\n if (bold && italic) {return 'Times-BoldItalic';}\r\n if (bold && !italic) {return 'Times-Bold';}\r\n if (!bold && italic) {return 'Times-Italic';}\r\n if (!bold && !italic) {return 'Times-Roman';}\r\n } else if (family.match(/(?:^|,)\\s*monospace\\s*$/)) {\r\n if (bold && italic) {return 'Courier-BoldOblique';}\r\n if (bold && !italic) {return 'Courier-Bold';}\r\n if (!bold && italic) {return 'Courier-Oblique';}\r\n if (!bold && !italic) {return 'Courier';}\r\n } else if (family.match(/(?:^|,)\\s*sans-serif\\s*$/) || true) {\r\n if (bold && italic) {return 'Helvetica-BoldOblique';}\r\n if (bold && !italic) {return 'Helvetica-Bold';}\r\n if (!bold && italic) {return 'Helvetica-Oblique';}\r\n if (!bold && !italic) {return 'Helvetica';}\r\n }\r\n };\r\n }\r\n if (typeof imageCallback !== 'function') {\r\n imageCallback = function(link) {\r\n return link.replace(/\\s+/g, '');\r\n };\r\n }\r\n if (typeof colorCallback !== 'function') {\r\n colorCallback = null;\r\n } else {\r\n for (let color in DefaultColors) {\r\n let newColor = colorCallback(DefaultColors[color]);\r\n DefaultColors[color][0] = newColor[0];\r\n DefaultColors[color][1] = newColor[1];\r\n }\r\n }\r\n if (typeof documentCallback !== 'function') {\r\n documentCallback = null;\r\n }\r\n\r\n if (typeof svg === 'string') {svg = parseXml(svg);}\r\n if (svg) {\r\n let styles = svg.getElementsByTagName('style');\r\n for (let i = 0; i < styles.length; i++) {\r\n styleRules = styleRules.concat(parseStyleSheet(styles[i].textContent));\r\n }\r\n let elem = createSVGElement(svg, null);\r\n if (typeof elem.drawInDocument === 'function') {\r\n if (options.useCSS && !useCSS) {\r\n warningCallback('SVGtoPDF: useCSS option can only be used for SVG *elements* in compatible browsers');\r\n }\r\n let savedFillColor = doc._fillColor;\r\n doc.save().translate(x || 0, y || 0).scale(pxToPt);\r\n elem.drawInDocument();\r\n for (let i = 0; i < links.length; i++) {\r\n doc.page.annotations.push(links[i]);\r\n }\r\n doc.restore();\r\n doc._fillColor = savedFillColor;\r\n } else {\r\n warningCallback('SVGtoPDF: this element can\\'t be rendered directly: ' + svg.nodeName);\r\n }\r\n } else {\r\n warningCallback('SVGtoPDF: the input does not look like a valid SVG');\r\n }\r\n\r\n};\r\n\r\nif (typeof module !== 'undefined' && module && typeof module.exports !== 'undefined') {\r\n module.exports = SVGtoPDF;\r\n}\r\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport moment from 'moment';\nimport i18next from 'i18next';\n\nimport PrintView from './PrintView';\n\nimport {\n defineBasicsAggregations,\n generateCalendarDayLabels,\n processBasicsAggregations,\n findBasicsDays,\n} from '../../utils/basics/data';\n\nimport { formatDatum, statBgSourceLabels } from '../../utils/stat';\nimport { getPumpVocabulary } from '../../utils/device';\n\nimport {\n AUTOMATED_DELIVERY,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n NO_SITE_CHANGE,\n SETTINGS_OVERRIDE,\n SITE_CHANGE,\n} from '../../utils/constants';\n\nconst siteChangeCannulaImage = require('./images/sitechange-cannula.png');\nconst siteChangeReservoirImage = require('./images/sitechange-reservoir.png');\nconst siteChangeTubingImage = require('./images/sitechange-tubing.png');\n\nconst siteChangeImages = {\n [SITE_CHANGE_CANNULA]: siteChangeCannulaImage,\n [SITE_CHANGE_RESERVOIR]: siteChangeReservoirImage,\n [SITE_CHANGE_TUBING]: siteChangeTubingImage,\n};\n\nconst t = i18next.t.bind(i18next);\n\nclass BasicsPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.sections = _.isEmpty(this.aggregationsByDate) ? {} : processBasicsAggregations(\n defineBasicsAggregations(\n this.bgPrefs,\n this.manufacturer,\n this.latestPumpUpload,\n ),\n this.aggregationsByDate,\n this.patient,\n this.manufacturer\n );\n\n // Auto-bind callback methods\n this.renderCalendarCell = this.renderCalendarCell.bind(this);\n\n this.doc.addPage();\n this.initLayout();\n }\n\n newPage() {\n super.newPage(this.getDateRange(this.endpoints.range[0], this.endpoints.range[1] - 1, undefined, t('Date range: ')));\n }\n\n initCalendar() {\n const columnWidth = this.getActiveColumnWidth();\n const calendar = {};\n\n calendar.days = findBasicsDays(this.endpoints.range, this.timePrefs.timezoneName);\n calendar.labels = generateCalendarDayLabels(calendar.days);\n\n calendar.headerHeight = 15;\n\n calendar.columns = _.map(calendar.labels, label => ({\n id: label,\n header: label,\n width: columnWidth / 7,\n height: columnWidth / 7,\n cache: false,\n renderer: this.renderCalendarCell,\n headerBorder: '',\n headerPadding: [4, 2, 0, 2],\n padding: [3, 2, 3, 2],\n }));\n\n calendar.pos = {};\n\n this.calendar = calendar;\n }\n\n initLayout() {\n this.setLayoutColumns({\n width: this.chartArea.width,\n gutter: 15,\n type: 'percentage',\n widths: [25.5, 49, 25.5],\n });\n }\n\n render() {\n this.renderStats();\n this.renderCalendars();\n this.RenderCalendarSummaries();\n }\n\n renderStats() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(0);\n this.renderAggregatedStats();\n }\n\n renderCalendars() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(1);\n this.initCalendar();\n\n this.renderCalendarSection({\n title: this.sections.fingersticks.title,\n data: this.aggregationsByDate.fingersticks.smbg.byDate,\n type: 'smbg',\n disabled: this.sections.fingersticks.disabled,\n emptyText: this.sections.fingersticks.emptyText,\n });\n\n this.renderCalendarSection({\n title: {\n text: this.sections.boluses.title,\n subText: _.get(this.data, 'query.excludeDaysWithoutBolus') ? t('(days with no boluses have been excluded)') : false,\n },\n data: this.aggregationsByDate.boluses.byDate,\n type: 'bolus',\n disabled: this.sections.boluses.disabled,\n emptyText: this.sections.boluses.emptyText,\n });\n\n const siteChangesSubTitle = this.sections.siteChanges.subTitle;\n\n this.renderCalendarSection({\n title: {\n text: this.sections.siteChanges.title,\n subText: siteChangesSubTitle ? t(\"(from '{{source}}')\", { source: this.sections.siteChanges.subTitle }) : false,\n },\n data: this.aggregationsByDate.siteChanges.byDate,\n type: 'siteChange',\n disabled: this.sections.siteChanges.disabled,\n emptyText: this.sections.siteChanges.emptyText,\n });\n\n this.renderCalendarSection({\n title: this.sections.basals.title,\n data: this.aggregationsByDate.basals.basal.byDate,\n type: 'basal',\n disabled: this.sections.basals.disabled,\n emptyText: this.sections.basals.emptyText,\n bottomMargin: 0,\n });\n }\n\n RenderCalendarSummaries() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(2);\n\n this.renderCalendarSummary({\n dimensions: this.sections.fingersticks.dimensions,\n header: this.sections.fingersticks.summaryTitle,\n data: this.aggregationsByDate.fingersticks,\n type: 'smbg',\n disabled: this.sections.fingersticks.disabled,\n });\n\n this.renderCalendarSummary({\n dimensions: this.sections.boluses.dimensions,\n header: this.sections.boluses.summaryTitle,\n data: this.aggregationsByDate.boluses,\n type: 'bolus',\n disabled: this.sections.boluses.disabled,\n });\n\n this.renderCalendarSummary({\n dimensions: this.sections.basals.dimensions,\n header: this.sections.basals.summaryTitle,\n data: this.aggregationsByDate.basals,\n type: 'basal',\n disabled: this.sections.basals.disabled,\n });\n }\n\n renderAggregatedStats() {\n const {\n averageDailyDose,\n averageGlucose,\n carbs,\n coefficientOfVariation,\n glucoseManagementIndicator,\n readingsInRange,\n sensorUsage,\n standardDev,\n timeInAuto,\n timeInOverride,\n timeInRange,\n totalInsulin,\n } = this.stats;\n\n if (timeInRange) {\n this.renderHorizontalBarStat(\n timeInRange,\n {\n heading: {\n text: 'BG Distribution',\n note: t('Showing {{source}} data', { source: statBgSourceLabels[this.bgSource] }),\n },\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (readingsInRange) {\n this.renderHorizontalBarStat(\n readingsInRange,\n {\n heading: {\n text: 'BG Distribution',\n note: t('{{source}} data from {{count}} readings', {\n source: statBgSourceLabels[this.bgSource],\n count: readingsInRange.data?.raw?.total,\n }),\n },\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (averageGlucose) this.renderSimpleStat(averageGlucose);\n if (sensorUsage) this.renderSimpleStat(sensorUsage);\n\n this.renderHorizontalBarStat(\n totalInsulin,\n {\n heading: t('Avg. Daily Insulin Ratio'),\n secondaryFormatKey: 'tooltip',\n fillOpacity: 0.5,\n }\n );\n\n if (timeInAuto) {\n const automatedLabel = getPumpVocabulary(this.manufacturer)[AUTOMATED_DELIVERY];\n this.renderHorizontalBarStat(\n timeInAuto,\n {\n heading: t('Time In {{automatedLabel}} Ratio', { automatedLabel }),\n fillOpacity: 0.5,\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (timeInOverride) {\n const overrideLabel = getPumpVocabulary(this.manufacturer)[SETTINGS_OVERRIDE];\n this.renderHorizontalBarStat(\n timeInOverride,\n {\n heading: t('Time In {{overrideLabel}}', { overrideLabel }),\n fillOpacity: 0.5,\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n const hasCarbGramsData = _.get(carbs, 'data.raw.carbs.grams', 0) > 0;\n const hasCarbExchangeData = _.get(carbs, 'data.raw.carbs.exchanges', 0) > 0;\n\n if (hasCarbGramsData && hasCarbExchangeData) {\n carbs.title = [\n carbs.title,\n t('Avg. Daily Carb Exchanges'),\n ];\n }\n\n this.renderSimpleStat(carbs);\n this.renderSimpleStat(averageDailyDose);\n if (glucoseManagementIndicator) this.renderSimpleStat(glucoseManagementIndicator);\n this.renderSimpleStat(standardDev);\n this.renderSimpleStat(coefficientOfVariation);\n }\n\n defineStatColumns(opts = {}) {\n const columnWidth = this.getActiveColumnWidth();\n\n const {\n height = 30,\n labelWidth = columnWidth * 0.65,\n valueWidth = columnWidth * 0.35,\n statFont = this.font,\n statFontSize = this.defaultFontSize,\n valueFont = this.boldFont,\n valueFontSize = this.defaultFontSize,\n labelHeader = false,\n valueHeader = false,\n } = opts;\n\n const columns = [\n {\n id: 'label',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: Math.round(labelWidth) - this.tableSettings.borderWidth,\n height,\n fontSize: statFontSize,\n font: statFont,\n align: 'left',\n headerAlign: 'left',\n border: 'TBL',\n headerBorder: 'TBL',\n valign: 'center',\n header: labelHeader,\n },\n {\n id: 'value',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: Math.round(valueWidth) - this.tableSettings.borderWidth,\n height,\n fontSize: valueFontSize,\n font: valueFont,\n align: 'right',\n headerAlign: 'right',\n border: 'TBR',\n headerBorder: 'TBR',\n valign: 'center',\n header: valueHeader,\n },\n ];\n\n return columns;\n }\n\n renderSimpleStat(stat) {\n const label = !_.isArray(stat.title) ? _.compact([stat.title]) : stat.title;\n\n const value = formatDatum(\n _.get(stat.data, _.get(stat.data, 'dataPaths.summary')),\n _.get(stat, 'dataFormat.summary'),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (value.value === 0) value.value = [value.value];\n if (!_.isArray(value.value)) value.value = _.compact([value.value]);\n if (!_.isArray(value.suffix)) value.suffix = _.compact([value.suffix]);\n\n const tableColumns = this.defineStatColumns();\n\n this.setFill(value.id === 'statDisabled' ? this.colors.lightGrey : 'black', 1);\n\n const rows = _.map(value.value, (v, i) => ({\n label: label[i] || '',\n value: {\n text: `${v}`,\n subText: `${_.get(value, ['suffix', i], '')}`,\n },\n }));\n\n this.renderTable(tableColumns, rows, {\n showHeaders: false,\n bottomMargin: 15,\n });\n\n this.setFill();\n }\n\n renderHorizontalBarStat(stat, opts = {}) {\n _.defaults(opts, {\n heading: {\n text: stat.title,\n subText: null,\n note: null,\n },\n primaryFormatKey: 'label',\n secondaryFormatKey: null,\n emptyText: t('No data available'),\n fillOpacity: 0.75,\n });\n\n const columnWidth = this.getActiveColumnWidth();\n\n const statHasData = _.get(stat, 'data.total.value') > 0;\n if (!statHasData && _.isPlainObject(opts.heading)) {\n opts.heading.note = opts.emptyText; // eslint-disable-line no-param-reassign\n }\n\n this.renderTableHeading(opts.heading, {\n columnDefaults: {\n width: columnWidth,\n noteFontSize: this.smallFontSize,\n },\n height: opts.heading.note ? 30 : 16,\n font: this.font,\n fontSize: this.defaultFontSize,\n });\n\n if (!statHasData) this.doc.moveDown(1.25);\n\n this.doc.fontSize(this.smallFontSize);\n\n if (statHasData) {\n const statDatums = _.get(stat, 'data.data', []);\n const statTotal = _.get(stat, 'data.total.value', 1);\n\n const tableColumns = [\n {\n id: 'value',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: columnWidth,\n height: 35,\n fontSize: this.largeFontSize,\n font: this.boldFont,\n noteFontSize: this.smallFontSize - 1,\n align: 'left',\n },\n ];\n\n const rows = _.map(statDatums, datum => {\n const { id } = datum;\n\n let color = this.colors[id];\n if (id === 'veryHigh') color = this.colors.high;\n if (id === 'veryLow') color = this.colors.low;\n\n const value = formatDatum(\n datum,\n _.get(stat, 'dataFormat.label'),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n let note = datum.legendTitle;\n if (stat.units) note += ` ${stat.units}`;\n\n let secondaryValue;\n if (opts.secondaryFormatKey) {\n secondaryValue = formatDatum(\n datum,\n _.get(stat, ['dataFormat', opts.secondaryFormatKey]),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n if (stat.id === 'readingsInRange') secondaryValue.suffix += 'readings/day';\n note += ` (${secondaryValue.value} ${secondaryValue.suffix})`;\n }\n\n const stripePadding = 2;\n\n return {\n value: {\n text: value.value,\n subText: value.suffix,\n note,\n },\n _fillStripe: {\n color,\n opacity: opts.fillOpacity,\n width: (columnWidth - (2 * stripePadding)) * (_.toNumber(datum.value) / statTotal),\n background: true,\n padding: stripePadding,\n },\n };\n }).reverse();\n\n this.renderTable(tableColumns, rows, {\n showHeaders: false,\n bottomMargin: 15,\n });\n }\n }\n\n renderCalendarSection(opts) {\n const {\n title,\n data,\n type,\n bottomMargin = 20,\n disabled,\n emptyText,\n } = opts;\n\n const columnWidth = this.getActiveColumnWidth();\n\n let headingMoveDown = 0.25;\n\n const renderSectionHeading = (moveDown = 0) => this.renderSectionHeading(title, {\n width: columnWidth,\n fontSize: this.largeFontSize,\n moveDown,\n });\n\n if (disabled) {\n renderSectionHeading(headingMoveDown);\n this.renderEmptyText(emptyText);\n } else {\n const isSiteChange = type === 'siteChange';\n let priorToFirstSiteChange = false;\n const siteChangeSource = this.sections.siteChanges.source;\n\n if (isSiteChange) {\n priorToFirstSiteChange = _.some(data, ({ summary = {} }) => _.isNaN(summary.daysSince));\n }\n\n const chunkedDayMap = _.chunk(_.map(this.calendar.days, (day, index) => {\n const date = moment.utc(day.date);\n const dateLabelMask = (index === 0 || date.date() === 1) ? 'MMM D' : 'D';\n\n let dayType = day.type;\n\n if (isSiteChange) {\n if (dayType === 'inRange') {\n dayType = data[day.date] ? SITE_CHANGE : NO_SITE_CHANGE;\n }\n\n if (dayType === NO_SITE_CHANGE && priorToFirstSiteChange) {\n dayType = 'outOfRange';\n }\n\n if (dayType === SITE_CHANGE && priorToFirstSiteChange) {\n priorToFirstSiteChange = false;\n }\n }\n\n return {\n color: this.colors[type],\n count: _.get(data, `${day.date}.total`, _.get(data, `${day.date}.count`, 0)),\n dayOfWeek: date.format('ddd'),\n daysSince: _.get(data, `${day.date}.summary.daysSince[${siteChangeSource}]`),\n label: date.format(dateLabelMask),\n type: dayType,\n };\n }), 7);\n\n const rows = _.map(chunkedDayMap, week => {\n const values = {};\n\n _.each(week, day => {\n values[day.dayOfWeek] = day;\n });\n\n return values;\n });\n\n this.doc.fontSize(this.largeFontSize);\n const headingHeight = this.doc.heightOfString(' ');\n let headingYPos = this.doc.y;\n\n this.doc.fontSize(this.smallFontSize);\n const headerHeight = this.doc.heightOfString(' ');\n\n this.doc.moveDown(headingMoveDown);\n const currentYPos = headingHeight + this.doc.y;\n\n this.doc.y = currentYPos + headerHeight;\n\n this.calendar.pos[type] = {\n y: currentYPos + headerHeight + 4.25,\n pageIndex: this.currentPageIndex,\n };\n\n if (!this.calendar.rowHeight) {\n // Calculate row height by rendering a single row with invisible fill and stroke\n this.doc.fillOpacity(0);\n this.doc.strokeOpacity(0);\n this.lockFillandStroke();\n\n this.renderTable(this.calendar.columns, [rows[0]], {\n bottomMargin: 0,\n });\n\n this.calendar.rowHeight = this.doc.y - this.calendar.pos[type].y;\n\n // Reset fill and stroke opacities\n this.unlockFillandStroke();\n this.doc.fillOpacity(1);\n this.doc.strokeOpacity(1);\n } else {\n // Check to see if there's room on the current page, and if not, render on a new page\n const calendarHeight = this.calendar.pos[type].y + (this.calendar.rowHeight * rows.length);\n if (calendarHeight > this.chartArea.bottomEdge) {\n if (this.currentPageIndex + 1 < this.totalPages) {\n this.goToPage(this.currentPageIndex + 1);\n } else {\n this.doc.addPage();\n }\n\n this.doc.moveDown(headingMoveDown);\n headingMoveDown = 0;\n headingYPos = this.chartArea.topEdge;\n\n this.calendar.pos[type] = {\n y: headingYPos + headingHeight + headerHeight + 4.25,\n pageIndex: this.currentPageIndex,\n };\n }\n }\n\n this.doc.y = headingYPos;\n renderSectionHeading(headingMoveDown);\n\n this.doc.fontSize(this.smallFontSize);\n this.renderTable(this.calendar.columns, rows, {\n bottomMargin,\n });\n }\n }\n\n renderCalendarCell(tb, data, draw, column, pos, padding) {\n if (draw) {\n const {\n color,\n count,\n type,\n daysSince,\n label,\n } = data[column.id];\n\n const xPos = pos.x + padding.left;\n const yPos = pos.y + padding.top;\n\n const isEmptyBolusDay = color === this.colors.bolus && count === 0;\n const isExcludedBolusDay = isEmptyBolusDay && _.get(this.data, 'query.excludeDaysWithoutBolus', false);\n\n this.setFill((type === 'outOfRange' || isExcludedBolusDay) ? this.colors.lightGrey : 'black', 1);\n\n this.doc\n .fontSize(this.extraSmallFontSize)\n .text(label, xPos, yPos);\n\n const width = column.width - _.get(padding, 'left', 0) - _.get(padding, 'right', 0);\n const height = column.height - _.get(padding, 'top', 0) - _.get(padding, 'bottom', 0);\n\n const gridHeight = height - (this.doc.y - yPos);\n const gridWidth = width > gridHeight ? gridHeight : width;\n\n const siteChangeTypes = [NO_SITE_CHANGE, SITE_CHANGE];\n const isSiteChange = _.includes(siteChangeTypes, type) ? type === SITE_CHANGE : null;\n\n if (isSiteChange !== null) {\n this.setStroke(this.colors.grey);\n this.doc.lineWidth(1);\n\n const isFirst = _.isNaN(daysSince);\n\n const linePos = {\n x: pos.x,\n y: pos.y + column.height / 2 - 1,\n };\n\n const dotPos = {\n x: linePos.x + column.width - 6,\n y: linePos.y,\n };\n\n this.doc\n .moveTo(isFirst ? dotPos.x : linePos.x, linePos.y)\n .lineTo(linePos.x + column.width, linePos.y)\n .stroke();\n\n if (isSiteChange) {\n const daysSinceLabel = daysSince === 1 ? 'day' : 'days';\n\n const siteChangeSource = this.sections.siteChanges.source;\n const imageWidth = width / 2.5;\n const imagePadding = (width - imageWidth) / 2;\n\n this.setStroke('white');\n this.doc.lineWidth(2);\n\n this.doc\n .moveTo(linePos.x + column.width / 2, linePos.y - 0.5)\n .lineTo(dotPos.x, linePos.y)\n .stroke();\n\n this.setFill(color);\n this.setStroke(this.colors.grey);\n\n this.doc\n .lineWidth(0.5)\n .circle(dotPos.x, dotPos.y, 2.5)\n .fillAndStroke();\n\n this.setFill();\n\n this.doc.image(siteChangeImages[siteChangeSource], xPos + imagePadding, this.doc.y, {\n width: imageWidth,\n });\n\n if (!isFirst) {\n this.doc.text(`${daysSince} ${daysSinceLabel}`, this.doc.x, this.doc.y + 2, {\n width,\n align: 'center',\n });\n }\n }\n } else if (count > 0) {\n const gridPos = {\n x: pos.x + (column.width - gridWidth) / 2,\n y: this.doc.y,\n };\n\n this.setFill(color);\n this.renderCountGrid(count, gridWidth, gridPos, color);\n this.setFill();\n }\n\n this.resetText();\n }\n\n return ' ';\n }\n\n renderCountGrid(count, width, pos) {\n const colCount = 3;\n const rowCount = 3;\n const gridSpaces = colCount * rowCount;\n const padding = width * 0.05;\n const maxCount = 17;\n const renderCount = count > maxCount ? maxCount : count;\n\n const {\n x: xPos,\n y: yPos,\n } = pos;\n\n const diameter = (width - padding * (colCount - 1)) / colCount;\n const radius = diameter / 2;\n\n const grid = _.times(rowCount, (row) => _.times(colCount, (col) => ({\n x: xPos + (col * diameter) + (padding * col),\n y: yPos + (row * diameter) + (padding * row),\n })));\n\n const countArray = _.fill(Array(renderCount), 1);\n const extrasArray = _.map(\n _.chunk(countArray.splice(gridSpaces), gridSpaces - 1),\n chunk => chunk.length\n ).reverse();\n\n const gridValues = _.map(\n _.fill(Array(gridSpaces), 0),\n (space, index) => (_.get(countArray, index, 0) + _.get(extrasArray, index, 0)),\n );\n\n if (extrasArray.length) {\n gridValues.reverse();\n }\n\n const chunkedGridValues = _.chunk(gridValues, colCount);\n\n const renderColumn = rowIndex => (col, colIndex) => {\n const gridPos = grid[rowIndex][colIndex];\n const dot = chunkedGridValues[rowIndex][colIndex];\n\n if (dot > 1) {\n this.renderCountGrid(dot, diameter, gridPos);\n } else if (dot === 1) {\n this.doc\n .circle(gridPos.x + radius, gridPos.y + radius, radius)\n .fill();\n }\n };\n\n const renderRow = (row, rowIndex) => {\n _.each(row, renderColumn(rowIndex));\n };\n\n _.each(chunkedGridValues, renderRow);\n }\n\n renderCalendarSummary(opts) {\n const columnWidth = this.getActiveColumnWidth();\n\n const {\n dimensions,\n data,\n type,\n header,\n disabled,\n } = opts;\n\n if (!disabled) {\n let primaryDimension;\n const rows = [];\n\n _.each(dimensions, dimension => {\n const { path, key } = dimension;\n\n const valueObj = _.get(data, _.compact([...path.split('.').concat(key)]), 0);\n\n const isAverage = dimension.average;\n\n const value = isAverage\n ? Math.round(_.get(data, [...path.split('.').concat('avgPerDay')]))\n : _.get(valueObj, 'count', valueObj);\n\n const stat = {\n label: dimension.label,\n value: (value || 0).toString(),\n };\n\n if (dimension.primary) {\n stat.label = header;\n primaryDimension = stat;\n } else {\n if (value === 0 && dimension.hideEmpty) {\n return;\n }\n rows.push(stat);\n }\n });\n\n const tableColumns = this.defineStatColumns({\n labelWidth: columnWidth * 0.8,\n valueWidth: columnWidth * 0.2,\n height: 20,\n labelHeader: primaryDimension.label,\n valueHeader: (primaryDimension.value || 0).toString(),\n });\n\n tableColumns[0].headerFont = this.font;\n\n if (_.get(this, `calendar.pos[${type}]`)) {\n this.goToPage(this.calendar.pos[type].pageIndex);\n this.doc.y = this.calendar.pos[type].y;\n }\n\n this.renderTable(tableColumns, rows, {\n columnDefaults: {\n zebra: true,\n headerFill: {\n color: this.colors[`${type}Header`],\n opacity: 1,\n },\n headerRenderer: this.renderCustomTextCell,\n headerHeight: 28,\n },\n bottomMargin: 15,\n });\n }\n }\n\n renderEmptyText(text) {\n this.setFill(this.colors.lightGrey);\n\n this.doc\n .fontSize(this.defaultFontSize)\n .text(text, {\n width: this.getActiveColumnWidth(),\n })\n .moveDown(1.5);\n\n this.resetText();\n }\n}\n\nexport default BasicsPrintView;\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABVCAYAAAAFZ8k8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxQjdCNERGOUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQjdCNERGQUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFCN0I0REY3RDZCMTExRTZCMzIzRUIwMjhFODg5QjE5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFCN0I0REY4RDZCMTExRTZCMzIzRUIwMjhFODg5QjE5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+o8lLcwAAEP9JREFUeNrsXAlQ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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABiCAYAAAAcGP4pAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBQjEzNDY3OUNFRDIxMUU2QjJFMEQwNTY5NTQ5NEM1NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBQjEzNDY3QUNFRDIxMUU2QjJFMEQwNTY5NTQ5NEM1NCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFCMTM0Njc3Q0VEMjExRTZCMkUwRDA1Njk1NDk0QzU0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkFCMTM0Njc4Q0VEMjExRTZCMkUwRDA1Njk1NDk0QzU0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9EA3LQAAEINJREFUeNrkXQlQ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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABXCAYAAABIr2g3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxQjdCNERGREQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQjdCNERGRUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFCN0I0REZCRDZCMTExRTZCMzIzRUIwMjhFODg5QjE5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFCN0I0REZDRDZCMTExRTZCMzIzRUIwMjhFODg5QjE5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+V0pZSwAAEztJREFUeNrkXQlQ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\"","/*\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport { range } from 'd3-array';\nimport { scaleLinear } from 'd3-scale';\nimport moment from 'moment-timezone';\n\nimport PrintView from './PrintView';\n\nimport { calculateBasalPath, getBasalSequencePaths } from '../render/basal';\nimport getBolusPaths from '../render/bolus';\nimport { getBasalPathGroups, getBasalPathGroupType } from '../../utils/basal';\nimport { getPumpVocabulary } from '../../utils/device';\nimport { formatDatum, getStatDefinition, statFormats } from '../../utils/stat';\nimport {\n classifyBgValue,\n getOutOfRangeThreshold,\n} from '../../utils/bloodglucose';\nimport {\n getBolusFromInsulinEvent,\n getCarbs,\n getDelivered,\n getExtendedPercentage,\n getMaxDuration,\n getMaxValue,\n getNormalPercentage,\n getWizardFromInsulinEvent,\n} from '../../utils/bolus';\nimport {\n formatLocalizedFromUTC,\n formatDuration,\n getOffset,\n} from '../../utils/datetime';\nimport {\n formatBgValue,\n formatDecimalNumber,\n formatPercentage,\n removeTrailingZeroes,\n} from '../../utils/format';\n\nimport {\n AUTOMATED_DELIVERY,\n MMOLL_UNITS,\n MS_IN_MIN,\n PHYSICAL_ACTIVITY,\n SCHEDULED_DELIVERY,\n SLEEP,\n} from '../../utils/constants';\n\nimport {\n processBasalRange,\n processBgRange,\n processBolusRange,\n processBasalSequencesForDate,\n} from '../../utils/print/data';\n\nconst t = i18next.t.bind(i18next);\n\nclass DailyPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.isAutomatedBasalDevice = _.get(this, 'latestPumpUpload.isAutomatedBasalDevice', false);\n this.isAutomatedBolusDevice = _.get(this, 'latestPumpUpload.isAutomatedBolusDevice', false);\n\n this.hasCarbExchanges = _.some(\n _.get(data, 'data.current.data.wizard', []),\n { type: 'wizard', carbUnits: 'exchanges' }\n );\n\n const deviceLabels = getPumpVocabulary(this.manufacturer);\n\n this.basalGroupLabels = {\n automated: deviceLabels[AUTOMATED_DELIVERY],\n manual: deviceLabels[SCHEDULED_DELIVERY],\n };\n\n this.pumpSettingsOverrideLabels = {\n [SLEEP]: deviceLabels[SLEEP],\n [PHYSICAL_ACTIVITY]: deviceLabels[PHYSICAL_ACTIVITY],\n };\n\n this.bgAxisFontSize = 5;\n this.carbsFontSize = 5.5;\n\n this.summaryHeaderFontSize = opts.summaryHeaderFontSize;\n\n this.chartsPerPage = opts.chartsPerPage;\n this.numDays = this.endpoints.activeDays;\n\n // render options\n this.bolusWidth = 3;\n this.carbRadius = 4.25;\n this.cbgRadius = 1;\n this.markerRadius = 4.25;\n this.extendedLineThickness = 0.75;\n this.interruptedLineThickness = 0.5;\n this.smbgRadius = 3;\n this.triangleHeight = 1.25;\n\n const undelivered = '#B2B2B2';\n\n this.colors = _.assign(this.colors, {\n axes: '#858585',\n bolus: {\n automated: '#B2B2B2',\n delivered: 'black',\n extendedPath: 'black',\n extendedExpectationPath: undelivered,\n extendedTriangle: 'black',\n extendedTriangleInterrupted: undelivered,\n interrupted: 'white',\n overrideTriangle: 'white',\n programmed: 'black',\n undelivered,\n underride: undelivered,\n underrideTriangle: 'white',\n },\n carbs: '#F8D48E',\n carbExchanges: '#FFB686',\n lightDividers: '#D8D8D8',\n });\n\n this.rightEdge = this.margins.left + this.width;\n this.bottomEdge = this.margins.top + this.height;\n\n this.gapBtwnSummaryAndChartAsPercentage = 0.04;\n this.chartArea = {\n bottomEdge: opts.margins.top + opts.height,\n leftEdge: opts.margins.left +\n (opts.summaryWidthAsPercentage + this.gapBtwnSummaryAndChartAsPercentage) * this.width,\n topEdge: opts.margins.top,\n };\n\n this.chartArea.width = this.rightEdge - this.chartArea.leftEdge;\n this.initialChartArea = _.clone(this.chartArea);\n\n this.summaryArea = {\n rightEdge: opts.margins.left + opts.summaryWidthAsPercentage * this.width,\n };\n\n this.bgRange = processBgRange(this.aggregationsByDate.dataByDate);\n this.bolusRange = processBolusRange(this.aggregationsByDate.dataByDate, this.timezone);\n this.basalRange = processBasalRange(this.aggregationsByDate.dataByDate);\n\n this.summaryArea.width = this.summaryArea.rightEdge - this.margins.left;\n\n const dates = _.keys(this.aggregationsByDate.dataByDate);\n dates.sort();\n\n const numDays = _.min([this.numDays, dates.length]);\n const selectedDates = _.slice(dates, -Math.abs(numDays));\n\n this.chartsByDate = {};\n this.initialChartsByDate = {};\n\n _.each(selectedDates, (date) => {\n const dateData = this.aggregationsByDate.dataByDate[date];\n\n const bounds = [\n moment.utc(date).tz(this.timezone).valueOf(),\n moment.utc(date).tz(this.timezone).add(1, 'day').valueOf(),\n ];\n\n const utcBounds = [\n bounds[0] + getOffset(bounds[0], this.timezone) * MS_IN_MIN,\n bounds[1] + getOffset(bounds[1], this.timezone) * MS_IN_MIN,\n ];\n\n processBasalSequencesForDate(dateData, utcBounds);\n\n this.chartsByDate[date] = { data: dateData, utcBounds, date };\n this.initialChartsByDate[date] = _.cloneDeep(this.chartsByDate[date]);\n });\n\n this.chartsPlaced = this.initialChartsPlaced = 0;\n this.chartIndex = this.initialChartIndex = 0;\n\n // kick off the dynamic calculation of chart area based on font sizes for header and footer\n this.setHeaderSize().setFooterSize().calculateChartMinimums(this.chartArea);\n\n // calculate heights and place charts in preparation for rendering\n _.each(selectedDates, (date) => {\n this.calculateDateChartHeight(this.chartsByDate[date]);\n });\n\n while (this.chartsPlaced < selectedDates.length) {\n this.placeChartsOnPage();\n }\n\n _.each(this.chartsByDate, (dateChart) => {\n this.makeScales(dateChart);\n });\n }\n\n newPage() {\n const charts = _.filter(this.chartsByDate, chart => chart.page === this.currentPageIndex + 1);\n const start = _.head(charts).date;\n const end = _.last(charts).date;\n\n super.newPage(this.getDateRange(start, end, 'YYYY-MM-DD', t('Date range: ')));\n this.renderLegend();\n }\n\n calculateChartMinimums(chartArea) {\n const legendHeight = this.doc.fontSize(9).currentLineHeight() * 5;\n this.doc.fontSize(this.defaultFontSize);\n const { topEdge, bottomEdge } = chartArea;\n const totalHeight = bottomEdge - legendHeight - topEdge;\n const perChart = totalHeight / 3.25;\n this.chartMinimums = {\n notesEtc: perChart * (3 / 20),\n bgEtcChart: perChart * (9 / 20),\n bolusDetails: perChart * (4 / 20),\n basalChart: perChart * (3 / 20),\n belowBasal: perChart * (1 / 20),\n paddingBelow: (totalHeight * (1 / 13)) / 3,\n total: perChart,\n };\n\n return this;\n }\n\n calculateDateChartHeight({ data, date }) {\n this.doc.fontSize(this.smallFontSize);\n const lineHeight = this.doc.currentLineHeight() * 1.25;\n\n const threeHrBinnedBoluses = _.groupBy(data.bolus, (d) => {\n const bolus = getBolusFromInsulinEvent(d);\n return bolus.threeHrBin;\n });\n const maxBolusStack = _.max(_.map(\n _.keys(threeHrBinnedBoluses),\n (key) => {\n const totalLines = _.reduce(threeHrBinnedBoluses[key], (lines, insulinEvent) => {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n if (bolus.extended || bolus.expectedExtended) {\n return lines + 2;\n }\n return lines + 1;\n }, 0);\n return totalLines;\n },\n ));\n\n const { notesEtc, bgEtcChart, basalChart, belowBasal, total } = this.chartMinimums;\n const bolusDetailsHeight = lineHeight * maxBolusStack;\n const totalGivenMaxBolusStack = bolusDetailsHeight +\n notesEtc + bgEtcChart + basalChart + belowBasal;\n\n const { bolusDetails: minBolusDetails } = this.chartMinimums;\n\n this.chartsByDate[date].bolusDetailsHeight = _.max([minBolusDetails, bolusDetailsHeight]);\n this.chartsByDate[date].chartHeight = _.max([total, totalGivenMaxBolusStack]);\n\n return this;\n }\n\n makeScales(dateChart) {\n const {\n notesEtc,\n bgEtcChart,\n basalChart,\n belowBasal,\n } = this.chartMinimums;\n\n this.bgRange[1] = _.max([this.bgRange[1], this.bgBounds.targetUpperBound]);\n\n // Calculate the maximum BG yScale value\n this.bgScaleYLimit = _.min([this.bgRange[1], this.bgBounds.clampThreshold]);\n\n dateChart.bgScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.bgScaleYLimit])\n .range([\n dateChart.topEdge + notesEtc + bgEtcChart + this.cbgRadius,\n dateChart.topEdge + notesEtc - this.cbgRadius,\n ])\n .clamp(true);\n dateChart.bolusScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.bolusRange[1] || 1])\n .range([\n dateChart.topEdge + notesEtc + bgEtcChart,\n dateChart.topEdge + notesEtc + (bgEtcChart / 3),\n ]);\n dateChart.basalScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.basalRange[1]])\n .range([\n dateChart.bottomEdge - belowBasal,\n dateChart.bottomEdge - belowBasal - basalChart,\n ]);\n dateChart.xScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([dateChart.utcBounds[0], dateChart.utcBounds[1]])\n // TODO: change to this.bolusWidth / 2 assuming boluses will be wider than cbgs\n .range([this.chartArea.leftEdge + this.cbgRadius, this.rightEdge - this.cbgRadius]);\n\n return this;\n }\n\n placeChartsOnPage() {\n const { topEdge, bottomEdge } = this.chartArea;\n let totalChartHeight = 0;\n const dates = _.keys(this.chartsByDate);\n const startingIndexThisPage = this.chartIndex;\n let chartsOnThisPage = 0;\n const limit = _.min([dates.length, startingIndexThisPage + this.chartsPerPage]);\n for (let i = startingIndexThisPage; i < limit; ++i) {\n const thisChartHeight = this.chartsByDate[dates[i]].chartHeight;\n const nextTotalHeight = totalChartHeight + thisChartHeight + this.chartMinimums.paddingBelow;\n if (nextTotalHeight > (bottomEdge - topEdge)) {\n this.chartIndex = i;\n break;\n }\n this.chartIndex = i + 1;\n totalChartHeight += thisChartHeight + this.chartMinimums.paddingBelow;\n chartsOnThisPage += 1;\n this.chartsPlaced += 1;\n }\n for (let i = startingIndexThisPage; i < startingIndexThisPage + chartsOnThisPage; ++i) {\n const chart = this.chartsByDate[dates[i]];\n chart.page = this.currentPageIndex + 1;\n if (i === startingIndexThisPage) {\n chart.topEdge = this.chartArea.topEdge;\n chart.bottomEdge = this.chartArea.topEdge + chart.chartHeight;\n } else {\n chart.topEdge =\n this.chartsByDate[dates[i - 1]].bottomEdge + this.chartMinimums.paddingBelow;\n chart.bottomEdge = chart.topEdge + chart.chartHeight;\n }\n }\n\n this.doc.addPage();\n\n return this;\n }\n\n renderEventPath(path) {\n if (path.type === 'programmed') {\n if (path.subType === 'automated') {\n this.doc.path(path.d)\n .lineWidth(0.5)\n .stroke(this.colors.bolus[path.type]);\n } else {\n this.doc.path(path.d)\n .lineWidth(0.5)\n .dash(0.5, { space: 1 })\n .stroke(this.colors.bolus[path.type]);\n }\n } else {\n this.doc.path(path.d)\n .fill(_.get(this.colors.bolus, path.subType, this.colors.bolus[path.type]));\n }\n }\n\n render() {\n _.each(this.chartsByDate, (dateChart) => {\n this.goToPage(dateChart.page);\n this.renderSummary(dateChart)\n .renderXAxes(dateChart)\n .renderYAxes(dateChart)\n .renderCbgs(dateChart)\n .renderSmbgs(dateChart)\n .renderInsulinEvents(dateChart)\n .renderFoodCarbs(dateChart)\n .renderBolusDetails(dateChart)\n .renderBasalPaths(dateChart)\n .renderBasalRates(dateChart)\n .renderPumpSettingsOverrides(dateChart)\n .renderChartDivider(dateChart);\n });\n }\n\n renderSummary({ date, topEdge }) {\n const smallIndent = this.margins.left + 4;\n const statsIndent = 6;\n const widthWithoutIndent = this.summaryArea.width - statsIndent;\n let first = true;\n\n const bgPrecision = this.bgUnits === MMOLL_UNITS ? 1 : 0;\n\n const statsData = _.get(this.aggregationsByDate, ['statsByDate', date], {});\n const stats = {};\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource: this.bgSource,\n days: this.endpoints.activeDays || this.endpoints.days,\n bgPrefs: this.bgPrefs,\n manufacturer: this.manufacturer,\n });\n stats[statType] = stat;\n });\n\n const { target, veryLow } = _.get(stats, 'timeInRange.data.raw.durations', {});\n const totalCbgDuration = _.get(stats, 'timeInRange.data.total.value', {});\n const { averageGlucose } = _.get(stats, 'averageGlucose.data.raw', {});\n const { carbs } = _.get(stats, 'carbs.data.raw', {});\n const { basal: totalBasal, bolus: totalBolus } = _.get(stats, 'totalInsulin.data.raw', {});\n const totalInsulin = totalBasal + totalBolus;\n\n this.doc.fillColor('black')\n .fillOpacity(1)\n .font(this.boldFont)\n .fontSize(this.summaryHeaderFontSize)\n .text(moment(date, 'YYYY-MM-DD').format('ddd, MMM D, Y'), this.margins.left, topEdge);\n\n const yPos = (function (doc) { // eslint-disable-line func-names\n let value = topEdge + doc.currentLineHeight() * 1.5;\n return {\n current: () => (value),\n small: () => {\n value += (doc.currentLineHeight() * 0.75);\n return value;\n },\n update: () => {\n value += (doc.currentLineHeight() * 1.25);\n return value;\n },\n };\n }(this.doc));\n\n this.doc.moveTo(this.margins.left, yPos.current())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .lineWidth(0.5)\n .stroke(this.colors.lightDividers);\n\n if (totalCbgDuration > 0) {\n first = false;\n this.doc.fontSize(this.smallFontSize)\n .lineGap(this.doc.currentLineHeight() * 0.25)\n .text(t('Time in Target'), smallIndent, yPos.update());\n\n yPos.update();\n\n const { targetUpperBound, targetLowerBound, veryLowThreshold } = this.bgBounds;\n\n const upperTarget = formatDecimalNumber(targetUpperBound, bgPrecision);\n const lowerTarget = formatDecimalNumber(targetLowerBound, bgPrecision);\n\n this.doc.font(this.font)\n .text(\n `${lowerTarget} - ${upperTarget}`,\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(`${formatPercentage(target / totalCbgDuration)}`, { align: 'right' });\n\n yPos.update();\n\n this.doc\n .text(\n t('Below {{threshold}}', {\n threshold: formatDecimalNumber(veryLowThreshold, bgPrecision),\n }),\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(`${formatPercentage(veryLow / totalCbgDuration)}`, { align: 'right' });\n\n yPos.update();\n }\n\n if (totalInsulin > 0) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n const ratioTitle = this.isAutomatedBasalDevice\n ? t('Time in {{automatedLabel}}', {\n automatedLabel: this.basalGroupLabels.automated,\n })\n : t('Basal:Bolus Ratio');\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(ratioTitle, smallIndent, yPos.update());\n\n yPos.update();\n\n const ratio = this.isAutomatedBasalDevice\n ? ['manual', 'automated']\n : ['basal', 'bolus'];\n\n const percentages = {\n basal: formatPercentage(totalBasal / totalInsulin),\n bolus: formatPercentage(totalBolus / totalInsulin),\n };\n\n const labels = {\n basal: t('Basal'),\n bolus: t('Bolus'),\n };\n\n if (this.isAutomatedBasalDevice) {\n const { automated, manual } = _.get(stats, 'timeInAuto.data.raw', {});\n const totalBasalDuration = automated + manual;\n percentages.automated = formatPercentage(automated / totalBasalDuration);\n percentages.manual = formatPercentage(manual / totalBasalDuration);\n\n labels.automated = this.basalGroupLabels.automated;\n labels.manual = this.basalGroupLabels.manual;\n }\n\n const primary = {\n [ratio[0]]: percentages[ratio[0]],\n [ratio[1]]: percentages[ratio[1]],\n };\n\n const secondary = {\n [ratio[0]]: this.isAutomatedBasalDevice ? '' : `, ${formatDecimalNumber(totalBasal, 1)} U`,\n [ratio[1]]: this.isAutomatedBasalDevice ? '' : `, ${formatDecimalNumber(totalBolus, 1)} U`,\n };\n\n this.doc.font(this.font)\n .text(\n labels[ratio[0]],\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(\n `${primary[ratio[0]]}${secondary[ratio[0]]}`,\n { align: 'right' }\n );\n\n yPos.update();\n\n this.doc.font(this.font)\n .text(\n labels[ratio[1]],\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(\n `${primary[ratio[1]]}${secondary[ratio[1]]}`,\n { align: 'right' }\n );\n\n yPos.update();\n }\n\n if (averageGlucose) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Average BG'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n `${formatDecimalNumber(averageGlucose, bgPrecision)} ${this.bgUnits}`,\n { align: 'right' }\n );\n\n yPos.small();\n }\n\n if (totalInsulin > 0) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Total Insulin'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n `${formatDecimalNumber(totalInsulin, 1)} U`,\n { align: 'right' }\n );\n\n yPos.small();\n }\n\n if (_.get(carbs, 'grams') > 0 || _.get(carbs, 'exchanges') > 0) {\n const formattedCarbs = formatDatum({ value: carbs }, statFormats.carbs);\n const carbValues = _.get(formattedCarbs, 'value');\n const carbSuffixes = _.get(formattedCarbs, 'suffix');\n\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Total Carbs'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n _.map(carbValues, (value, i) => `${value} ${carbSuffixes[i]}`).join(', '),\n { align: 'right' }\n );\n }\n\n return this;\n }\n\n renderXAxes({ bolusDetailsHeight, topEdge, date }) {\n const {\n notesEtc,\n bgEtcChart,\n basalChart,\n } = this.chartMinimums;\n\n this.doc.lineWidth(0.25);\n\n // render x-axis for bgEtcChart\n const bottomOfBgEtcChart = topEdge + notesEtc + bgEtcChart;\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBgEtcChart)\n .lineTo(this.rightEdge, bottomOfBgEtcChart)\n .stroke(this.colors.axes);\n\n // render bottom border of bolusDetails\n const bottomOfBolusDetails = bottomOfBgEtcChart + bolusDetailsHeight;\n\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBolusDetails)\n .lineTo(this.rightEdge, bottomOfBolusDetails)\n .stroke(this.colors.axes);\n\n // render x-axis for basalChart\n const bottomOfBasalChart = bottomOfBolusDetails + basalChart;\n this.chartsByDate[date].bottomOfBasalChart = bottomOfBasalChart;\n\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBasalChart)\n .lineTo(this.rightEdge, bottomOfBasalChart)\n .stroke(this.colors.axes);\n\n return this;\n }\n\n renderYAxes({ bgScale, bottomOfBasalChart, utcBounds, date, topEdge, xScale }) {\n const end = utcBounds[1];\n let current = utcBounds[0];\n const threeHrLocs = [current];\n while (current < end) {\n current = moment.utc(current)\n .add(3, 'h')\n .valueOf();\n threeHrLocs.push(current);\n }\n const chart = this.chartsByDate[date];\n chart.bolusDetailPositions = Array(8);\n chart.bolusDetailWidths = Array(8);\n\n // render the vertical lines at three-hr intervals\n _.each(threeHrLocs, (loc, i) => {\n let xPos = xScale(loc);\n if (i === 0) {\n xPos = this.chartArea.leftEdge;\n }\n if (i === 8) {\n xPos = this.rightEdge;\n }\n if (i > 0) {\n chart.bolusDetailWidths[i - 1] = xPos - chart.bolusDetailPositions[i - 1];\n }\n if (i < 8) {\n chart.bolusDetailPositions[i] = xPos;\n\n this.doc.font(this.font).fontSize(this.smallFontSize)\n .text(\n formatLocalizedFromUTC(loc, this.timePrefs, 'ha').slice(0, -1),\n xPos,\n topEdge,\n { indent: 3 },\n );\n }\n\n this.doc.moveTo(xPos, topEdge)\n .lineTo(xPos, bottomOfBasalChart)\n .lineWidth(0.25)\n .stroke(this.colors.axes);\n });\n\n // render the BG axis labels and guides\n const opts = {\n align: 'right',\n width: this.chartArea.leftEdge - this.summaryArea.rightEdge - 3,\n };\n\n const renderedBounds = _.pickBy(this.bgBounds, bound => (bound <= this.bgScaleYLimit));\n\n _.each(renderedBounds, (bound, key) => {\n const bgTick = formatBgValue(bound, this.bgPrefs);\n const xPos = this.chartArea.leftEdge;\n const yPos = bgScale(bound);\n\n if (key === 'targetUpperBound' || key === 'targetLowerBound') {\n this.doc\n .moveTo(xPos, yPos)\n .lineTo(xPos + this.chartArea.width, yPos)\n .lineWidth(0.25)\n .dash(3, { space: 4 })\n .stroke(this.colors.axes);\n\n this.setStroke();\n this.doc.undash();\n }\n\n this.doc.font(this.font)\n .fontSize(this.bgAxisFontSize)\n .fillColor(this.colors.axis)\n .text(\n `${bgTick}`,\n this.summaryArea.rightEdge,\n yPos - this.doc.currentLineHeight() / 2,\n opts,\n );\n });\n\n return this;\n }\n\n renderCbgs({ bgScale, data: { cbg: cbgs }, xScale }) {\n _.each(cbgs, (cbg) => {\n this.doc.circle(xScale(cbg.normalTime), bgScale(cbg.value), 1)\n .fill(this.colors[classifyBgValue(this.bgBounds, cbg.value)]);\n });\n\n return this;\n }\n\n renderSmbgs({ bgScale, data: { smbg: smbgs }, xScale }) {\n _.each(smbgs, (smbg) => {\n const xPos = xScale(smbg.normalTime);\n const yPos = bgScale(smbg.value);\n const smbgLabel = formatBgValue(smbg.value, this.bgPrefs, getOutOfRangeThreshold(smbg));\n const labelWidth = this.doc.widthOfString(smbgLabel);\n const labelOffsetX = labelWidth / 2;\n let labelStartX = xPos - labelOffsetX;\n const labelEndX = labelStartX + labelWidth;\n\n this.doc.circle(xPos, yPos, this.smbgRadius)\n .fill(this.colors[classifyBgValue(this.bgBounds, smbg.value)]);\n\n // Ensure label is printed within chart area for the x-axis\n if (labelStartX <= this.chartArea.leftEdge) {\n labelStartX = labelStartX + (this.chartArea.leftEdge - labelStartX) + 1;\n }\n if (labelEndX >= this.rightEdge) {\n labelStartX = labelStartX - (labelEndX - this.rightEdge) - 1;\n }\n\n this.doc.font(this.boldFont)\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(\n smbgLabel,\n labelStartX,\n yPos - 12.5, {\n lineBreak: false,\n },\n );\n });\n\n return this;\n }\n\n renderInsulinEvents({ bolusScale, data: { bolus: insulinEvents }, xScale }) {\n _.each(insulinEvents, (insulinEvent) => {\n const paths = getBolusPaths(insulinEvent, xScale, bolusScale, {\n bolusWidth: this.bolusWidth,\n extendedLineThickness: this.extendedLineThickness,\n interruptedLineThickness: this.interruptedLineThickness,\n triangleHeight: this.triangleHeight,\n });\n _.each(paths, (path) => {\n this.renderEventPath(path);\n });\n const carbs = getCarbs(insulinEvent);\n const circleOffset = 1;\n const textOffset = 1.75;\n const carbUnits = _.get(getWizardFromInsulinEvent(insulinEvent), 'carbUnits');\n const carbFillColor = (carbUnits === 'exchanges') ? this.colors.carbExchanges : this.colors.carbs;\n if (carbs) {\n const carbsX = xScale(getBolusFromInsulinEvent(insulinEvent).normalTime);\n const carbsY = bolusScale(getMaxValue(insulinEvent)) - this.carbRadius - circleOffset;\n this.doc.circle(carbsX, carbsY, this.carbRadius)\n .fill(carbFillColor);\n this.doc.font(this.font)\n .fontSize(this.carbsFontSize)\n .fillColor('black')\n .text(\n carbs,\n carbsX - this.carbRadius * 2,\n carbsY - textOffset,\n { align: 'center', width: this.carbRadius * 4 }\n );\n }\n });\n\n return this;\n }\n\n renderFoodCarbs({ bolusScale, data: { food }, xScale }) {\n const circleOffset = 1;\n const textOffset = 1.75;\n\n _.each(food, foodEvent => {\n const carbs = _.get(foodEvent, 'nutrition.carbohydrate.net');\n\n if (carbs) {\n const carbsX = xScale(foodEvent.normalTime);\n const carbsY = bolusScale(0) - this.carbRadius - circleOffset;\n this.doc.circle(carbsX, carbsY, this.carbRadius)\n .fill(this.colors.carbs);\n this.doc.font(this.font)\n .fontSize(this.carbsFontSize)\n .fillColor('black')\n .text(\n Math.round(carbs),\n carbsX - this.carbRadius * 2,\n carbsY - textOffset,\n { align: 'center', width: this.carbRadius * 4 }\n );\n }\n });\n\n return this;\n }\n\n renderBolusDetails({\n bolusDetailPositions,\n bolusDetailWidths,\n bolusScale,\n data: { bolus: insulinEvents },\n }) {\n this.doc.font(this.font)\n .fontSize(this.smallFontSize)\n .fillColor('black');\n\n const topOfBolusDetails = bolusScale.range()[0] + 2;\n\n const grouped = _.groupBy(\n _.map(insulinEvents, (d) => (getBolusFromInsulinEvent(d))),\n (d) => (d.threeHrBin / 3),\n );\n\n _.each(grouped, (binOfBoluses, i) => {\n const groupWidth = bolusDetailWidths[i] - 2;\n const groupXPos = bolusDetailPositions[i];\n const yPos = (function (doc) { // eslint-disable-line func-names\n let value = topOfBolusDetails;\n return {\n current: () => (value),\n update: () => {\n value += (doc.currentLineHeight() * 1.2);\n return value;\n },\n };\n }(this.doc));\n _.each(_.sortBy(binOfBoluses, 'normalTime'), (bolus) => {\n const displayTime = formatLocalizedFromUTC(bolus.normalTime, this.timePrefs, 'h:mma')\n .slice(0, -1);\n this.doc.text(\n displayTime,\n groupXPos,\n yPos.current(),\n { continued: true, indent: 2, width: groupWidth },\n ).text(\n removeTrailingZeroes(formatDecimalNumber(getDelivered(bolus), 2)),\n { align: 'right' }\n );\n\n if (bolus.extended != null) {\n const normalPercentage = getNormalPercentage(bolus);\n const extendedPercentage = getExtendedPercentage(bolus);\n const durationOpts = { ascii: true };\n const durationText = `${formatDuration(getMaxDuration(bolus), durationOpts)}`;\n const percentagesText = Number.isNaN(normalPercentage) ?\n `over ${durationText}` : `${extendedPercentage} ${durationText}`;\n this.doc.text(\n percentagesText,\n groupXPos,\n yPos.update(),\n { indent: 2, width: groupWidth },\n );\n }\n yPos.update();\n });\n });\n\n return this;\n }\n\n renderBasalRates(chart) {\n const { bottomOfBasalChart, data: { basal }, xScale } = chart;\n\n const currentSchedule = {\n rate: 0,\n duration: 0,\n index: -1,\n };\n\n const labeledSchedules = [];\n _.each(basal, datum => {\n if (datum.subType === 'scheduled' && datum.rate > 0 && datum.duration >= 60 * MS_IN_MIN) {\n const newRate = currentSchedule.rate !== datum.rate;\n\n if (newRate) {\n labeledSchedules.push({\n normalTime: datum.normalTime,\n rate: datum.rate,\n duration: currentSchedule.duration + datum.duration,\n });\n\n currentSchedule.rate = datum.rate;\n currentSchedule.index ++;\n currentSchedule.duration = 0;\n } else if (labeledSchedules.length) {\n labeledSchedules[currentSchedule.index].duration += datum.duration;\n } else {\n currentSchedule.duration += datum.duration;\n }\n }\n });\n\n this.setFill();\n\n _.each(labeledSchedules, schedule => {\n const start = xScale(schedule.normalTime);\n\n this.doc.fontSize(this.extraSmallFontSize);\n const label = `${parseFloat(formatDecimalNumber(schedule.rate, 3))}`;\n const xPos = start;\n const yPos = bottomOfBasalChart + 2;\n\n this.doc.text(label, xPos, yPos);\n });\n\n this.resetText();\n\n return this;\n }\n\n renderBasalPaths({ basalScale, data: { basal, basalSequences: sequences }, xScale }) {\n _.each(sequences, (sequence) => {\n // Skip empty basal sequences -- otherwise getBasalSequencePaths throws error\n if (_.filter(sequence).length) {\n const paths = getBasalSequencePaths(sequence, xScale, basalScale);\n\n _.each(paths, (path) => {\n const opacity = _.includes(['scheduled', 'automated'], path.basalType) ? 0.4 : 0.2;\n const fillColor = path.basalType === 'automated'\n ? this.colors.basalAutomated\n : this.colors.basal;\n\n const lineWidth = path.type === 'border--undelivered--automated' ? 1.5 : 0.5;\n\n if (path.renderType === 'fill') {\n this.doc\n .path(path.d)\n .fillColor(fillColor)\n .fillOpacity(opacity)\n .fill();\n } else if (path.renderType === 'stroke') {\n this.doc\n .path(path.d)\n .lineWidth(lineWidth)\n .dash(1, { space: 2 })\n .stroke(this.colors.basal);\n }\n });\n }\n });\n\n if (!_.isEmpty(basal)) {\n const basalPathGroups = getBasalPathGroups(basal);\n\n // Split delivered path into individual segments based on subType\n _.each(basalPathGroups, (group, index) => {\n const firstDatum = group[0];\n const isAutomated = getBasalPathGroupType(firstDatum) === 'automated';\n const color = isAutomated\n ? this.colors.basalAutomated\n : this.colors.basal;\n\n const wholeDateDeliveredPath = calculateBasalPath(group, xScale, basalScale, {\n endAtZero: false,\n flushBottomOffset: -0.25,\n isFilled: false,\n startAtZero: false,\n });\n\n this.doc\n .path(wholeDateDeliveredPath)\n .lineWidth(0.5)\n .undash()\n .stroke(color);\n\n // Render group markers\n if (index > 0) {\n const xPos = xScale(firstDatum.normalTime);\n const yPos = basalScale.range()[1] + this.markerRadius + 1;\n const zeroBasal = basalScale.range()[0];\n const flushWithBottomOfScale = zeroBasal;\n\n const label = isAutomated\n ? this.basalGroupLabels.automated.charAt(0)\n : this.basalGroupLabels.manual.charAt(0);\n\n const labelColor = 'white';\n\n const labelWidth = this.doc\n .fontSize(5)\n .widthOfString(label);\n\n this.doc\n .circle(xPos, yPos, this.markerRadius)\n .fillColor(color)\n .fillOpacity(1)\n .fill();\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.75)\n .lineTo(xPos, flushWithBottomOfScale)\n .stroke(color);\n\n this.doc\n .fillColor(labelColor)\n .text(label, xPos - (labelWidth / 2), yPos - 2, {\n width: labelWidth,\n align: 'center',\n });\n }\n });\n }\n\n return this;\n }\n\n renderPumpSettingsOverrides({ basalScale, data: { deviceEvent }, xScale, utcBounds }) {\n const overrideData = _.filter(deviceEvent, { subType: 'pumpSettingsOverride' });\n\n const isFabricatedNewDayOverride = datum => _.includes(\n _.map(_.get(datum, 'annotations', []), 'code'),\n 'tandem/pumpSettingsOverride/fabricated-from-new-day'\n );\n\n // Because the new datums are fabricated at upload when they cross midnight, we stitch them\n // together by adding the fabricated datum's duration to the previous one, so long as the\n // previous one is not also a fabricated datum.\n const stitchedData = _.reduce(overrideData, (res, datum) => {\n const prevDatum = res[res.length - 1];\n\n if (prevDatum && (\n isFabricatedNewDayOverride(datum) && !isFabricatedNewDayOverride(prevDatum))\n ) {\n res[res.length - 1].normalEnd = datum.normalEnd;\n res[res.length - 1].duration += datum.duration;\n } else {\n res.push(datum);\n }\n\n return res;\n }, []);\n\n _.each(stitchedData, datum => {\n const overrideStart = _.max([datum.normalTime, utcBounds[0]]);\n const overrideEnd = _.min([datum.normalTime + datum.duration, utcBounds[1]]);\n const xPos = xScale(overrideStart);\n const yPos = basalScale.range()[1] + this.markerRadius + 1;\n const bottomOfScale = basalScale.range()[0];\n const label = _.get(this.pumpSettingsOverrideLabels, [datum.overrideType, 'marker'], (datum.overrideType || 'O').toUpperCase()).charAt(0);\n const labelColor = 'white';\n const color = this.colors[datum.overrideType];\n\n const labelWidth = this.doc\n .fontSize(5)\n .widthOfString(label);\n\n this.doc\n .circle(xPos, yPos, this.markerRadius)\n .fillColor(color)\n .fillOpacity(1)\n .fill();\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.75)\n .lineTo(xPos, bottomOfScale)\n .stroke(color);\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.5)\n .lineTo(xScale(overrideEnd), yPos)\n .dash(1, { space: 2 })\n .stroke(color);\n\n this.doc.undash();\n\n this.doc\n .fillColor(labelColor)\n .text(label, xPos - (labelWidth / 2), yPos - 2, {\n width: labelWidth,\n align: 'center',\n });\n });\n\n return this;\n }\n\n renderChartDivider({ bottomEdge, bottomOfBasalChart }) {\n const isLastChartOnPage = bottomEdge + this.chartMinimums.total > this.chartArea.bottomEdge;\n\n const padding = (bottomEdge - bottomOfBasalChart) + this.chartMinimums.paddingBelow;\n\n if (!isLastChartOnPage) {\n const yPos = bottomOfBasalChart + padding / 2;\n\n this.doc\n .moveTo(this.leftEdge, yPos)\n .lineWidth(1)\n .lineTo(this.rightEdge, yPos)\n .stroke(this.colors.lightGrey);\n }\n }\n\n renderLegend() {\n this.doc.fontSize(9);\n const lineHeight = this.doc.currentLineHeight();\n this.doc.fillColor('black').fillOpacity(1)\n .text(t('Legend'), this.margins.left, this.bottomEdge - lineHeight * 8);\n\n const legendHeight = lineHeight * 4;\n const legendTop = this.bottomEdge - lineHeight * 6;\n\n this.doc.lineWidth(1)\n .rect(this.margins.left, legendTop, this.width, legendHeight)\n .stroke('black');\n\n this.doc.fontSize(this.smallFontSize);\n\n const legendVerticalMiddle = legendTop + lineHeight * 2;\n const legendTextMiddle = legendVerticalMiddle - this.doc.currentLineHeight() / 2;\n let legendItemLeftOffset = 9;\n let legendItemLabelOffset = 4.5;\n\n if (this.isAutomatedBolusDevice) {\n legendItemLeftOffset = 7;\n legendItemLabelOffset = 4;\n }\n\n let cursor = this.margins.left + legendItemLeftOffset;\n\n // rendering the items in the legend\n // cbg\n const vertOffsetAdjustments = [\n 2.25,\n 1,\n 0.25,\n 0,\n 0,\n -0.25,\n -1,\n -2.25,\n ];\n _.each(_.map(range(0, 16, 2), (d) => ([d, d - 7])), (pair) => {\n const [horizOffset, vertOffset] = pair;\n const adjustedVertOffset = vertOffset + vertOffsetAdjustments[horizOffset / 2];\n let fill;\n\n if (horizOffset < 4) {\n fill = 'high';\n } else if (horizOffset < 12) {\n fill = 'target';\n } else {\n fill = 'low';\n }\n\n this.doc\n .circle(cursor + horizOffset, legendVerticalMiddle + adjustedVertOffset, this.cbgRadius)\n .fill(this.colors[fill]);\n });\n cursor += 16 + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('CGM'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('CGM')) + legendItemLeftOffset * 2;\n\n // smbg\n const smbgPositions = {\n target: [cursor, legendVerticalMiddle],\n high: [cursor + this.smbgRadius * 2, legendVerticalMiddle - this.smbgRadius * 2],\n low: [cursor + this.smbgRadius * 2, legendVerticalMiddle + this.smbgRadius * 2],\n };\n this.doc.circle(cursor, legendVerticalMiddle, this.smbgRadius)\n .fill(this.colors.target);\n this.doc.circle(smbgPositions.high[0], smbgPositions.high[1], this.smbgRadius)\n .fill(this.colors.high);\n this.doc.circle(smbgPositions.low[0], smbgPositions.low[1], this.smbgRadius)\n .fill(this.colors.low);\n cursor += this.smbgRadius * 3 + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('BGM'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('BGM')) + legendItemLeftOffset * 2;\n\n /* boluses */\n const bolusOpts = {\n bolusWidth: this.bolusWidth,\n extendedLineThickness: this.extendedLineThickness,\n interruptedLineThickness: this.interruptedLineThickness,\n triangleHeight: this.triangleHeight,\n };\n const legendBolusYScale = scaleLinear()\n .domain([0, 10])\n .range([legendTop + legendHeight - legendHeight / 4, legendTop + legendHeight / 4]);\n\n // (normal) bolus\n const normalBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const normalPaths = getBolusPaths(\n { normal: 10, normalTime: 0 },\n normalBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(normalPaths, (path) => {\n this.renderEventPath(path);\n });\n\n if (this.isAutomatedBolusDevice) {\n const automatedPaths = getBolusPaths(\n { normal: 6, normalTime: 5, subType: 'automated' },\n normalBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(automatedPaths, (path) => {\n this.renderEventPath(path);\n });\n\n cursor += this.bolusWidth * 3 + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Bolus'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('manual & automated'));\n\n cursor += this.doc.widthOfString(t('manual & automated')) + legendItemLeftOffset * 2;\n } else {\n cursor += this.bolusWidth + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('Bolus'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Bolus')) + legendItemLeftOffset * 2;\n }\n\n // underride & override boluses\n const rideBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const overridePaths = getBolusPaths(\n {\n type: 'wizard',\n recommended: {\n net: 8,\n carb: 8,\n correction: 0,\n },\n bolus: {\n normal: 10,\n normalTime: 0,\n },\n },\n rideBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(overridePaths, (path) => {\n this.renderEventPath(path);\n });\n const underridePaths = getBolusPaths(\n {\n type: 'wizard',\n recommended: {\n net: 10,\n carb: 8,\n correction: 2,\n },\n bolus: {\n normal: 5,\n normalTime: 5,\n },\n },\n rideBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(underridePaths, (path) => {\n this.renderEventPath(path);\n });\n\n cursor += this.bolusWidth * 3 + legendItemLabelOffset;\n\n if (this.isAutomatedBolusDevice) {\n this.doc\n .fillColor('black')\n .text(t('Override'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('up & down'));\n\n cursor += this.doc.widthOfString(t('up & down')) + legendItemLeftOffset * 2;\n } else {\n this.doc.fillColor('black').text(t('Override up & down'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Override up & down')) + legendItemLeftOffset * 2;\n }\n\n // interrupted bolus\n const interruptedBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const interruptedPaths = getBolusPaths(\n {\n normal: 6,\n expectedNormal: 10,\n normalTime: 0,\n },\n interruptedBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(interruptedPaths, (path) => {\n this.renderEventPath(path);\n });\n cursor += this.bolusWidth + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('Interrupted'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Interrupted')) + legendItemLeftOffset * 2;\n\n // extended bolus\n const extendedBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const extendedPaths = getBolusPaths(\n {\n normal: 5,\n extended: 5,\n duration: 10,\n normalTime: 0,\n },\n extendedBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(extendedPaths, (path) => {\n this.renderEventPath(path);\n });\n cursor += this.bolusWidth / 2 + 10 + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Combo /'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('Extended'));\n\n cursor += this.doc.widthOfString(t('Extended')) + legendItemLeftOffset * 2;\n\n // carbohydrates\n const carbsYPos = {\n circle: legendVerticalMiddle,\n carbs: legendVerticalMiddle - this.carbRadius / 2,\n label: legendTextMiddle,\n };\n\n const exchangesYPos = {\n circle: carbsYPos.circle + this.doc.currentLineHeight() / 2 + 1.5,\n carbs: carbsYPos.carbs + this.doc.currentLineHeight() / 2 + 1.5,\n };\n\n if (this.hasCarbExchanges) {\n carbsYPos.circle = carbsYPos.circle - this.doc.currentLineHeight() / 2 - 1;\n carbsYPos.carbs = carbsYPos.carbs - this.doc.currentLineHeight() / 2 - 1;\n carbsYPos.label = carbsYPos.label - this.doc.currentLineHeight() / 2;\n }\n\n this.doc\n .circle(cursor, carbsYPos.circle, this.carbRadius)\n .fill(this.colors.carbs);\n\n if (this.hasCarbExchanges) {\n this.doc\n .circle(cursor, exchangesYPos.circle, this.carbRadius)\n .fill(this.colors.carbExchanges);\n }\n\n this.doc\n .fillColor('black')\n .fontSize(this.carbsFontSize)\n .text(\n '25',\n cursor - this.carbRadius,\n carbsYPos.carbs,\n { align: 'center', width: this.carbRadius * 2 }\n );\n\n if (this.hasCarbExchanges) {\n this.doc\n .text(\n '2',\n cursor - this.carbRadius,\n exchangesYPos.carbs,\n { align: 'center', width: this.carbRadius * 2 }\n );\n }\n\n this.doc.fontSize(this.smallFontSize);\n cursor += this.carbRadius + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Carbs (g)'), cursor, carbsYPos.label);\n\n if (this.hasCarbExchanges) {\n this.doc.text(t('Carb exch'));\n }\n\n cursor += this.doc.widthOfString(t('Carbs (g)')) + legendItemLeftOffset * 2;\n\n /* basals */\n const legendBasalYScale = scaleLinear()\n .domain([0, 2.5])\n .range([legendTop + legendHeight - legendHeight / 4, legendTop + legendHeight / 4.5]);\n\n const legendBasalXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 50]);\n\n const dynamicBasalType = this.isAutomatedBasalDevice ? 'automated' : 'scheduled';\n\n const scheduled1 = {\n subType: dynamicBasalType,\n rate: 1.5,\n duration: 2,\n normalTime: 0,\n };\n const negTemp = {\n subType: 'temp',\n rate: 0.5,\n duration: 2.5,\n normalTime: 2,\n suppressed: {\n rate: 1.5,\n },\n };\n const scheduled2 = {\n subType: 'scheduled',\n rate: 1.75,\n duration: 1.5,\n normalTime: 4.5,\n };\n const posTemp = {\n subType: 'temp',\n rate: 2,\n duration: 2,\n normalTime: 6,\n suppressed: {\n rate: 1.75,\n },\n };\n const suspend = {\n subType: 'suspend',\n rate: 0,\n duration: 2,\n normalTime: 8,\n suppressed: {\n subType: dynamicBasalType,\n rate: dynamicBasalType === 'automated' ? 0 : 1.75,\n },\n };\n const data = {\n basal: [\n scheduled1,\n negTemp,\n scheduled2,\n posTemp,\n suspend,\n ],\n basalSequences: [\n [scheduled1],\n [negTemp],\n [scheduled2],\n [posTemp],\n [suspend],\n ],\n };\n this.renderBasalPaths({\n basalScale: legendBasalYScale,\n data,\n xScale: legendBasalXScale,\n });\n cursor += 50 + legendItemLabelOffset;\n this.doc\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(t('Basals'), cursor, legendTextMiddle);\n\n return this;\n }\n}\n\nexport default DailyPrintView;\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\n/**\n * calculateBasalPath\n * @param {Array} basalSequence - an array of Tidepool basal events to be rendered as one\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n * @param {Object} opts - basal sequence rendering options such as whether filled\n *\n * @return {String} path - basal sequence SVG path\n */\n\nexport function calculateBasalPath(basalSequence, xScale, yScale, {\n endAtZero,\n flushBottomOffset = 0,\n isFilled,\n startAtZero,\n}) {\n let path = '';\n const zeroBasal = yScale.range()[0];\n const flushWithBottomOfScale = zeroBasal + flushBottomOffset;\n\n function handleDiscontinuousEnd(basal) {\n path += `L ${xScale(basal.normalTime + basal.duration)},${flushWithBottomOfScale} `;\n }\n\n function handleDiscontinuousStart(basal) {\n path += `M ${xScale(basal.normalTime)},${flushWithBottomOfScale} `;\n }\n\n const first = basalSequence[0];\n const startX = xScale(first.normalTime);\n const startY = _.every(basalSequence, (d) => (d.rate === 0)) ?\n flushWithBottomOfScale :\n yScale(first.rate);\n if (startAtZero || isFilled) {\n path += `M ${startX},${zeroBasal} L `;\n } else {\n path += 'M ';\n }\n path += `${startX},${startY}\n L ${xScale(first.normalTime + first.duration)},${startY} `;\n\n if (!isFilled && first.discontinuousEnd) {\n handleDiscontinuousEnd(first);\n }\n\n _.each(basalSequence.slice(1), (basal) => {\n const thisBasalY = (basal.rate > 0) ? yScale(basal.rate) : flushWithBottomOfScale;\n if (!isFilled && basal.discontinuousStart) {\n handleDiscontinuousStart(basal);\n }\n\n path += `L ${xScale(basal.normalTime)},${thisBasalY}\n L ${xScale(basal.normalTime + basal.duration)},${thisBasalY} `;\n\n if (!isFilled && basal.discontinuousEnd) {\n handleDiscontinuousEnd(basal);\n }\n });\n\n const last = basalSequence[basalSequence.length - 1];\n const endX = xScale(last.normalTime + last.duration);\n path += `L ${endX},${yScale(last.rate)}`;\n\n if (endAtZero || isFilled) {\n path += ` L ${endX},${zeroBasal}`;\n }\n\n if (isFilled) {\n path += ' Z';\n }\n\n // PDFKit will not render path definitions with line breaks properly\n // do NOT forget to remove the newlines!\n return path.replace(/\\n/g, '').replace(/\\s\\s+/g, ' ');\n}\n\n/**\n * getBasalSequencePaths\n * @param {Array} basalSequence - an array of Tidepool basal events to be rendered as one\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n *\n * @return {Array} paths - Array of Objects, each specifying component paths to draw a bolus\n */\nexport function getBasalSequencePaths(basalSequence, xScale, yScale) {\n const first = basalSequence[0];\n const last = basalSequence[basalSequence.length - 1];\n const paths = [];\n let type;\n\n const types = _.uniq(\n _.reject(\n _.map(\n basalSequence, 'subType'\n ),\n (d) => (!_.isString(d))\n )\n );\n if (types.length === 0) {\n throw new Error('Cannot determine `subType` of basal sequence!');\n } else if (types.length > 1) {\n throw new Error('A basal sequence may contain only *one* `subType` of basal event.');\n } else {\n type = types[0];\n }\n\n if (_.some(basalSequence, (d) => (d.rate > 0))) {\n paths.push({\n d: calculateBasalPath(\n basalSequence, xScale, yScale, {\n endAtZero: last.discontinuousEnd,\n isFilled: true,\n startAtZero: first.discontinuousStart,\n },\n ),\n basalType: type,\n key: `basalFill-${first.id}`,\n renderType: 'fill',\n type: `fill--${type}`,\n });\n }\n\n const suppresseds = [];\n let undeliveredType = 'border--undelivered';\n _.each(basalSequence, (basal) => {\n if (basal.suppressed) {\n const suppressed = _.clone(basal.suppressed);\n if (_.get(suppressed, 'subType', suppressed.deliveryType) === 'automated') {\n undeliveredType = 'border--undelivered--automated';\n // For automated suppressed delivery, we always render at the baseline\n suppressed.rate = 0;\n }\n suppresseds.push(_.assign({}, suppressed, _.pick(basal, ['duration', 'normalTime'])));\n }\n });\n\n if (!_.isEmpty(suppresseds)) {\n paths.push({\n d: calculateBasalPath(\n suppresseds, xScale, yScale, {\n endAtZero: false,\n isFilled: false,\n startAtZero: false,\n },\n ),\n basalType: type,\n key: `basalPathUndelivered-${first.id}`,\n renderType: 'stroke',\n type: undeliveredType,\n });\n }\n\n return paths;\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 * as bolusUtils from '../../utils/bolus';\n\n/**\n * formatBolusRectPath\n * @param {Object} bolusEdges - object containing `left`, `right`, `top`, `bottom` edges\n *\n * @return {String} SVG path data string defining a bolus rectangle\n */\nfunction formatBolusRectPath({ left, right, top, bottom }) {\n // PDFKit will not render path definitions with line breaks properly\n // do NOT forget to remove the newlines!\n return `\n M ${left},${bottom}\n L ${left},${top}\n L ${right},${top}\n L ${right},${bottom} Z\n `;\n}\n\n/**\n * getBolusEdges\n * @param {Number} bolusWidth - width of a bolus (rendering-platform specific)\n * @param {Number} bolusCenter - scaled center of the bolus on the x (i.e., time) axis\n * @param {Number} bolusBottom - scaled bottom of the bolus on the y-axis\n * @param {Number} bolusHeight - scaled height of the bolus\n *\n * @return {Object} object containing `left`, `right`, `top`, `bottom` edges for a bolus rectangle\n */\nexport function getBolusEdges(bolusWidth, bolusCenter, bolusBottom, bolusHeight) {\n const halfWidth = bolusWidth / 2;\n\n const leftX = bolusCenter - halfWidth;\n const rightX = bolusCenter + halfWidth;\n\n return {\n left: leftX,\n right: rightX,\n top: bolusHeight,\n bottom: bolusBottom,\n };\n}\n\n/**\n * getBolusPaths\n * @param {Object} insulinEvent - a Tidepool wizard (with embedded bolus) or bolus datum\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n * @param {Object} opts - bolus rendering options such as width\n *\n * @return {Array} paths - Array of Objects, each specifying component paths to draw a bolus\n */\nexport default function getBolusPaths(insulinEvent, xScale, yScale, {\n bolusWidth,\n extendedLineThickness,\n interruptedLineThickness,\n triangleHeight,\n}) {\n const bolus = bolusUtils.getBolusFromInsulinEvent(insulinEvent);\n const paths = [];\n\n const bolusBottom = yScale.range()[0];\n const bolusCenter = xScale(bolus.normalTime);\n\n const isNonTrivialUnderride = bolusUtils.isUnderride(insulinEvent) &&\n bolusUtils.getDelivered(insulinEvent);\n const isNonTrivialOverride = bolusUtils.isOverride(insulinEvent) &&\n bolusUtils.getDelivered(insulinEvent);\n\n // the backmost layer is any undelivered bolus insulin\n // (in the case of interruption/cancellation/suspension)\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: suspended\n if (bolusUtils.isInterruptedBolus(insulinEvent)) {\n const undeliveredY = yScale(bolusUtils.getMaxValue(insulinEvent));\n const edges = getBolusEdges(bolusWidth, bolusCenter, bolusBottom, undeliveredY);\n const { left, right } = edges;\n const path = formatBolusRectPath(edges);\n\n paths.push({\n d: path,\n key: `undelivered-${bolus.id}`,\n type: 'undelivered',\n });\n\n const programmedY = yScale(bolusUtils.getProgrammed(insulinEvent));\n const deliveredY = yScale(bolusUtils.getDelivered(insulinEvent));\n // NB: JFC, Chrome uses a constant offset no matter the stroke-width :(((\n // TODO: test in different browsers and adjust\n const fractionStroke = 0.5;\n\n // TODO: figure out how to make this agnostic to browser and render target\n paths.push({\n d: `\n M ${left + fractionStroke},${deliveredY}\n L ${left + fractionStroke},${programmedY + fractionStroke}\n L ${right - fractionStroke},${programmedY + fractionStroke}\n L ${right - fractionStroke},${deliveredY}\n `,\n key: `programmed-${bolus.id}`,\n type: 'programmed',\n });\n // the rectangle for undelivered includes an underride if the insulinEvent\n // was *both* an underride and interrupted/cancelled/suspended\n } else {\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: underride\n if (isNonTrivialUnderride) {\n const recommendedY = yScale(bolusUtils.getRecommended(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(bolusWidth, bolusCenter, bolusBottom, recommendedY)\n );\n\n paths.push({\n d: path,\n key: `underride-${insulinEvent.id}`,\n type: 'underride',\n });\n }\n }\n\n // this is a port of tideline's js/plot/util/drawbolus.js: bolus\n if (bolusUtils.getDelivered(insulinEvent) || bolusUtils.getProgrammed((insulinEvent))) {\n const maxY = yScale(bolusUtils.getDelivered(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(bolusWidth, bolusCenter, bolusBottom, maxY)\n );\n\n paths.push({\n d: path,\n key: `delivered-${bolus.id}`,\n type: 'delivered',\n subType: insulinEvent.subType,\n });\n\n const deliveredY = yScale(bolusUtils.getDelivered(insulinEvent));\n const edges = getBolusEdges(bolusWidth, bolusCenter, bolusBottom, deliveredY);\n const { left, right, top, bottom } = edges;\n const fractionStroke = 0.5;\n\n if (insulinEvent.subType === 'automated') {\n paths.push({\n d: `\n M ${left + fractionStroke},${bottom}\n L ${left + fractionStroke},${top + fractionStroke}\n L ${right - fractionStroke},${top + fractionStroke}\n L ${right - fractionStroke},${bottom}\n `,\n key: `programmed-${bolus.id}`,\n type: 'programmed',\n subType: insulinEvent.subType,\n });\n }\n }\n\n // this is a port of tideline's js/plot/util/drawbolus.js: extended\n // it does the straight part of the \"arm\" representing the extended part of the bolus\n // and also the triangle at the end of the \"arm\"\n if (bolusUtils.hasExtended(insulinEvent)) {\n const extendedVal = bolusUtils.getExtended(insulinEvent);\n // yes, 4.5 is a magic number that matches the first tideline implementation\n // the benefit of 4.5 * extendedLineThickness is that\n // it scales with various settings for line thickness, which may vary based on render target\n const triangleSize = 4.5 * extendedLineThickness;\n const halfTriangle = triangleSize / 2;\n const startOfTriangle = xScale(bolus.normalTime + bolusUtils.getMaxDuration(insulinEvent))\n - triangleSize;\n const extendedY = yScale(extendedVal) + (extendedLineThickness / 2);\n\n if (extendedVal > 0) {\n paths.push({\n d: `\n M ${bolusCenter},${extendedY + extendedLineThickness / 2}\n L ${bolusCenter},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY + extendedLineThickness / 2} Z\n `,\n key: `extendedPath-${bolus.id}`,\n type: 'extendedPath',\n });\n }\n\n const interruptedExtended = bolusUtils.isInterruptedBolus(insulinEvent) && extendedVal > 0;\n\n if (interruptedExtended) {\n const startOfInterrupted = xScale(bolus.normalTime + bolusUtils.getDuration(insulinEvent));\n\n paths.push({\n d: `\n M ${startOfInterrupted},${extendedY + extendedLineThickness / 2}\n L ${startOfInterrupted},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY + extendedLineThickness / 2} Z\n `,\n key: `extendedExpectationPath-${bolus.id}`,\n type: 'extendedExpectationPath',\n });\n\n const halfInterrupted = interruptedLineThickness / 2;\n\n paths.push({\n d: `\n M ${startOfInterrupted},${extendedY - halfInterrupted}\n L ${startOfInterrupted - interruptedLineThickness * 2},${extendedY - halfInterrupted}\n L ${startOfInterrupted - interruptedLineThickness * 2},${extendedY + halfInterrupted}\n L ${startOfInterrupted},${extendedY + halfInterrupted} Z\n `,\n key: `extendedInterrupted-${bolus.id}`,\n type: 'extendedInterrupted',\n });\n }\n\n if (extendedVal > 0) {\n paths.push({\n d: `\n M ${startOfTriangle + triangleSize},${extendedY - halfTriangle}\n L ${startOfTriangle + triangleSize},${extendedY + halfTriangle}\n L ${startOfTriangle},${extendedY} Z\n `,\n key: `extendedTriangle-${bolus.id}`,\n type: `extendedTriangle${interruptedExtended ? 'Interrupted' : ''}`,\n });\n }\n }\n\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: underride\n // it does the triangle for an underride of a calculator recommendation\n if (isNonTrivialUnderride) {\n const programmedY = yScale(bolusUtils.getProgrammed(insulinEvent));\n const edges = getBolusEdges(\n bolusWidth, bolusCenter, bolusBottom, programmedY,\n );\n const { left, right } = edges;\n\n paths.push({\n d: `\n M ${left},${programmedY}\n L ${left + bolusWidth / 2},${programmedY + triangleHeight}\n L ${right},${programmedY} Z\n `,\n key: `underrideTriangle-${insulinEvent.id}`,\n type: 'underrideTriangle',\n });\n }\n\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: override\n // it does the triangle for an override of a calculator recommendation\n if (isNonTrivialOverride) {\n const recommendedY = yScale(bolusUtils.getRecommended(insulinEvent));\n const edges = getBolusEdges(\n bolusWidth, bolusCenter, bolusBottom, recommendedY,\n );\n const { left, right } = edges;\n\n paths.push({\n d: `\n M ${left},${recommendedY}\n L ${left + bolusWidth / 2},${recommendedY - triangleHeight}\n L ${right},${recommendedY} Z\n `,\n key: `overrideTriangle-${insulinEvent.id}`,\n type: 'overrideTriangle',\n });\n }\n\n // the red line indicating interruption/cancellation/suspension appears on top\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: suspended\n if (bolusUtils.isInterruptedBolus(insulinEvent)) {\n const bottomOfInterruptedLine = yScale(bolusUtils.getDelivered(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(\n bolusWidth,\n bolusCenter,\n bottomOfInterruptedLine,\n bottomOfInterruptedLine + interruptedLineThickness,\n )\n );\n\n paths.push({\n d: path,\n key: `interrupted-${bolus.id}`,\n type: 'interrupted',\n });\n }\n\n const formattedPaths = _.forEach(paths, (path) => {\n const pathCopy = path;\n pathCopy.d = path.d.replace(/\\n/g, '').replace(/\\s\\s+/g, ' ');\n return pathCopy;\n });\n\n return formattedPaths;\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 moment from 'moment-timezone';\nimport { extent } from 'd3-array';\n\nimport { getBasalSequences } from '../../utils/basal';\n\n/**\n * processBgRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @returns {Array} the extent of bg range values\n */\nexport function processBgRange(dataByDate) {\n const bgs = _.reduce(\n dataByDate,\n (all, date) => (\n all.concat(_.get(date, 'cbg', [])).concat(_.get(date, 'smbg', []))\n ),\n []\n );\n return extent(bgs, (d) => (d.value));\n}\n\n/**\n * processBolusRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @param {String} timezoneName - a timezone name\n * @returns {Array} the extent of bolus range values\n */\nexport function processBolusRange(dataByDate, timezoneName) {\n const boluses = _.reduce(\n dataByDate, (all, date) => (all.concat(_.get(date, 'bolus', []))), []\n );\n _.each(boluses, (bolus) => {\n // eslint-disable-next-line no-param-reassign\n bolus.threeHrBin = Math.floor(moment.utc(bolus.normalTime).tz(timezoneName).hours() / 3) * 3;\n });\n return extent(boluses, (d) => ((d.normal || 0) + (d.extended || 0)));\n}\n\n/**\n * processBasalRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @returns {Array} the extent of basal range values\n */\nexport function processBasalRange(dataByDate) {\n const basals = _.reduce(\n dataByDate, (all, date) => (all.concat(_.get(date, 'basal', []))), []\n );\n const rawBasalRange = extent(\n basals,\n (d) => (_.max([_.get(d, ['suppressed', 'rate'], 0), d.rate]))\n );\n // multiply the max rate by 1.1 to add a little buffer so the highest basals\n // don't sit at the very top of the basal rendering area and bump into boluses\n return [0, rawBasalRange[1] * 1.1];\n}\n\n/**\n * processBasalSequencesByDate\n * @param {Object} dateData - Object containing arrays of Tidepool datums keyed by type\n * @param {Array} bounds - start and end bounds of date, as integer timestamps\n */\nexport function processBasalSequencesForDate(dateData, bounds) {\n const { basal: basals = [] } = dateData;\n\n for (let i = 0; i < basals.length; ++i) {\n const basal = basals[i];\n\n // trim the first and last basals to fit within the date's bounds\n if (i === 0 && basal.normalTime < bounds[0] && basal.normalEnd > bounds[0]) {\n basal.duration = basal.duration - (bounds[0] - basal.normalTime);\n basal.normalTime = bounds[0];\n }\n\n if (i === basals.length - 1) {\n basal.duration = _.min([bounds[1] - basal.normalTime, basal.duration]);\n }\n\n let nextBasal;\n if (i !== basals.length - 1) {\n nextBasal = basals[i + 1];\n if ((basal.normalTime + basal.duration) !== nextBasal.normalTime) {\n basal.discontinuousEnd = true;\n nextBasal.discontinuousStart = true;\n }\n }\n }\n // eslint-disable-next-line no-param-reassign\n dateData.basalSequences = getBasalSequences(basals);\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport { range } from 'd3-array';\nimport { scaleLinear } from 'd3-scale';\nimport moment from 'moment';\n\nimport PrintView from './PrintView';\nimport { formatBgValue } from '../../utils/format';\nimport { classifyBgValue, getOutOfRangeThreshold } from '../../utils/bloodglucose';\nimport { formatClocktimeFromMsPer24, THREE_HRS } from '../../utils/datetime';\nimport { MS_IN_HOUR } from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\n\nclass BgLogPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.smbgRadius = 3;\n\n this.numDays = this.endpoints.activeDays;\n this.doc.addPage();\n\n const dates = _.keys(this.aggregationsByDate.dataByDate).sort();\n this.chartDates = dates.reverse();\n\n // Auto-bind callback methods\n this.getBGLabelYOffset = this.getBGLabelYOffset.bind(this);\n this.getBgChartColumns = this.getBgChartColumns.bind(this);\n this.getBgChartRow = this.getBgChartRow.bind(this);\n this.renderBgCell = this.renderBgCell.bind(this);\n }\n\n newPage() {\n super.newPage(this.getDateRange(this.endpoints.range[0], this.endpoints.range[1] - 1, undefined, t('Date range: ')));\n }\n\n getBGLabelYOffset() {\n return _.get(this.bgChart, 'datumsRendered', 0) % 2 === 0 ? -12 : 5;\n }\n\n getBgChartColumns(opts = {}) {\n return _.map(this.bgChart.headers, ({ id, text }, index) => ({\n cache: false,\n border: index === 0 || opts.border === false ? '' : 'TBLR',\n header: text,\n headerBorder: index === 0 || opts.headerBorder === false ? '' : 'BL',\n headerFill: index === 0 || opts.headerFill === false ? false : {\n color: this.colors.smbgHeader,\n opacity: 1,\n },\n headerPadding: [6, 2, 2, 2],\n height: this.doc.fontSize(this.defaultFontSize).currentLineHeight(),\n id,\n padding: [12, 2, 8, 2],\n renderer: this.renderBgCell,\n width: this.bgChart.columnWidth,\n }));\n }\n\n getBgChartRow(date) {\n const data = _.get(this.aggregationsByDate, `dataByDate.${date}`);\n const dateMoment = moment(date);\n const isWeekend = _.includes(['0', '6'], dateMoment.format('d'));\n const timeSlots = _.filter(_.map(_.sortBy(this.bgChart.columns, 'id'), 'id'), _.isNumber);\n\n const smbgByTimeSlot = _.groupBy(\n data.smbg,\n datum => _.findLast(timeSlots, slot => datum.msPer24 >= slot)\n );\n\n const row = {};\n\n _.each(this.bgChart.columns, ({ id }) => {\n if (id === 'date') {\n row[id] = {\n text: dateMoment.format('ddd, MMM D'),\n };\n } else {\n row[id] = {\n smbg: _.get(smbgByTimeSlot, id, []),\n };\n }\n });\n\n row._fill = { // eslint-disable-line no-underscore-dangle\n color: isWeekend ? this.tableSettings.colors.zebraEven : 'white',\n opacity: 1,\n };\n\n return row;\n }\n\n render() {\n this.renderBGChart();\n this.renderSummaryTable();\n }\n\n renderBGChart() {\n this.resetText();\n\n this.bgChart = {\n datumsRendered: 0,\n };\n\n this.bgChart.headers = _.map(\n range(0, 8),\n i => ({\n id: i * THREE_HRS,\n text: formatClocktimeFromMsPer24(i * THREE_HRS, 'h a'),\n }),\n );\n\n this.bgChart.headers.unshift({\n id: 'date',\n text: '',\n });\n\n this.bgChart.columnWidth = this.chartArea.width / this.bgChart.headers.length;\n\n this.bgChart.columns = this.getBgChartColumns();\n\n this.bgChart.rows = _.map(this.chartDates, this.getBgChartRow);\n\n this.bgChart.pos = {\n x: this.doc.x,\n y: this.doc.y,\n currentPageIndex: this.currentPageIndex,\n };\n\n // First, we render the table, but don't render the data, to get the cell backgrounds filled\n this.renderTable(this.bgChart.columns, this.bgChart.rows, {\n bottomMargin: 20,\n columnDefaults: {\n fill: true,\n skipDraw: true,\n },\n });\n\n // Reposition to the original bgChart rendering postion, and render over top with the data\n this.goToPage(this.bgChart.pos.currentPageIndex);\n\n this.doc.x = this.bgChart.pos.x;\n this.doc.y = this.bgChart.pos.y;\n\n this.renderTable(this.getBgChartColumns({\n headerFill: false,\n border: false,\n }), this.bgChart.rows, {\n bottomMargin: 20,\n columnDefaults: {\n fill: false,\n },\n });\n }\n\n renderSummaryTable() {\n this.resetText();\n\n const { total, days, averageGlucose } = _.get(this.stats, 'averageGlucose.data.raw', {});\n\n const totalDays = Math.ceil(days || this.numDays || 0);\n const totalReadings = total || 0;\n const avgReadingsPerDay = Math.round(totalReadings / totalDays);\n\n const averageGlucoseText = averageGlucose\n ? formatBgValue(averageGlucose, this.bgPrefs)\n : '--';\n\n this.summaryTable = {};\n\n if (this.chartArea.bottomEdge - this.doc.y < 45) {\n this.doc.addPage();\n }\n\n this.doc.x = this.leftEdge + this.bgChart.columnWidth;\n\n this.summaryTable.columnWidth = (this.chartArea.width - this.bgChart.columnWidth) / 4;\n\n this.summaryTable.columns = [\n {\n id: 'totalDays',\n header: t('Days In Report'),\n },\n {\n id: 'totalReadings',\n header: t('Total BG Readings'),\n },\n {\n id: 'avgReadingsPerDay',\n header: t('Avg. BG Readings / Day'),\n },\n {\n id: 'avgBg',\n header: t('Avg. BG ({{- units}})', { units: this.bgUnits }),\n },\n ];\n\n this.summaryTable.rows = [\n {\n totalDays: totalDays.toString(),\n totalReadings: totalReadings.toString(),\n avgReadingsPerDay: (avgReadingsPerDay || 0).toString(),\n avgBg: averageGlucoseText,\n },\n ];\n\n this.renderTable(this.summaryTable.columns, this.summaryTable.rows, {\n bottomMargin: 0,\n columnDefaults: {\n align: 'center',\n headerAlign: 'center',\n headerFill: {\n color: this.colors.smbgHeader,\n opacity: 1,\n },\n width: this.summaryTable.columnWidth,\n },\n });\n }\n\n renderBgCell(tb, data, draw, column, pos, padding) {\n if (draw && !column.skipDraw) {\n const {\n id,\n height,\n width,\n } = column;\n\n const {\n text,\n smbg = [],\n } = data[id];\n\n if (text) {\n const xPos = pos.x + padding.left;\n const yPos = pos.y + padding.top;\n\n this.setFill('black', 1);\n\n this.doc\n .fontSize(this.defaultFontSize)\n .text(text, xPos, yPos, {\n align: 'right',\n width: width - padding.left - padding.right,\n });\n } else if (smbg.length) {\n _.each(smbg, datum => {\n const xScale = scaleLinear()\n .domain([id, id + (MS_IN_HOUR * 3)])\n .range([pos.x, pos.x + width]);\n\n const xPos = xScale(datum.msPer24);\n const yPos = pos.y + padding.top + (height / 2);\n\n this.doc\n .circle(xPos, yPos, this.smbgRadius)\n .fill(this.colors[classifyBgValue(this.bgBounds, datum.value, 'fiveWay')]);\n\n const smbgLabel = formatBgValue(datum.value, this.bgPrefs, getOutOfRangeThreshold(datum));\n const labelWidth = this.doc.widthOfString(smbgLabel);\n const labelOffsetX = labelWidth / 2;\n const labelOffsetY = this.getBGLabelYOffset();\n\n let labelStartX = xPos - labelOffsetX;\n const labelEndX = labelStartX + labelWidth;\n\n\n // Ensure label is printed within chart area for the x-axis\n const chartLeftEdge = this.leftEdge + width;\n\n if (labelStartX - 1 <= chartLeftEdge) {\n labelStartX = labelStartX + (chartLeftEdge - (labelStartX - 1)) + 1;\n }\n\n if (labelEndX + 1 >= this.rightEdge) {\n labelStartX = labelStartX - ((labelEndX + 1) - this.rightEdge) - 1;\n }\n\n this.doc.fontSize(this.smallFontSize);\n\n this.doc\n .rect(\n labelStartX - 1,\n yPos + labelOffsetY - 1,\n labelWidth + 2,\n this.doc.currentLineHeight())\n .fill('white');\n\n this.doc\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(\n smbgLabel,\n labelStartX,\n yPos + labelOffsetY, {\n lineBreak: false,\n width: labelWidth,\n align: 'center',\n },\n );\n\n this.bgChart.datumsRendered++;\n });\n }\n\n this.resetText();\n }\n\n return ' ';\n }\n}\n\nexport default BgLogPrintView;\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 i18next from 'i18next';\n\nimport PrintView from './PrintView';\n\nimport {\n deviceName,\n getDeviceMeta,\n insulinSettings,\n startTimeAndValue,\n} from '../../utils/settings/data';\n\nimport {\n basal,\n bolusTitle,\n ratio,\n sensitivity,\n target,\n} from '../../utils/settings/nonTandemData';\n\nimport { getPumpVocabulary } from '../../utils/device';\n\nimport {\n basalSchedules as profileSchedules,\n basal as tandemBasal,\n} from '../../utils/settings/tandemData';\n\nconst t = i18next.t.bind(i18next);\n\nclass SettingsPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.isTandem = this.manufacturer === 'tandem';\n this.deviceMeta = getDeviceMeta(this.latestPumpUpload.settings, this.timePrefs);\n this.deviceLabels = getPumpVocabulary(this.manufacturer);\n\n this.doc.addPage();\n }\n\n newPage() {\n super.newPage(t('Uploaded on: {{uploadDate}}', { uploadDate: this.deviceMeta.uploaded }));\n }\n\n render() {\n this.renderDeviceMeta();\n\n if (this.isTandem) {\n this.renderTandemProfiles();\n } else {\n if (this.manufacturer !== 'animas') this.renderPumpSettings();\n this.renderBasalSchedules();\n this.renderWizardSettings();\n }\n }\n\n renderDeviceMeta() {\n const device = deviceName(this.manufacturer) || t('Unknown');\n this.doc\n .font(this.boldFont)\n .fontSize(this.defaultFontSize)\n .text(device, { continued: true })\n .font(this.font)\n .text(' › ' + t('Serial Number: {{serial}}', { serial: this.deviceMeta.serial })) // eslint-disable-line prefer-template\n .moveDown();\n\n this.resetText();\n this.doc.moveDown();\n }\n\n renderTandemProfiles() {\n this.renderSectionHeading(t('Profile Settings'));\n\n const basalSchedules = profileSchedules(this.latestPumpUpload.settings);\n\n const sortedSchedules = _.orderBy(basalSchedules,\n [\n schedule => (schedule.name === this.latestPumpUpload.settings.activeSchedule ? 1 : 0),\n 'position',\n ],\n ['desc', 'asc']\n );\n\n _.each(sortedSchedules, schedule => {\n const profile = tandemBasal(schedule, this.latestPumpUpload.settings, this.bgUnits);\n\n const heading = {\n text: profile.title.main,\n subText: ` ${profile.title.secondary}`,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.tableSettings.colors.zebraHeader,\n opacity: 1,\n },\n width: this.chartArea.width,\n },\n });\n\n const widths = {\n rate: 105,\n bgTarget: 105,\n carbRatio: 105,\n insulinSensitivity: 155,\n };\n\n const firstColumnWidth = this.chartArea.width - _.sum(_.values(widths));\n\n const tableColumns = _.map(profile.columns, (column, index) => {\n const isFirst = index === 0;\n\n const fills = {\n grey: {\n color: this.tableSettings.colors.zebraHeader,\n opacity: 1,\n },\n basal: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n };\n\n const headerFills = {\n start: fills.grey,\n rate: fills.basal,\n bgTarget: fills.basal,\n carbRatio: fills.basal,\n insulinSensitivity: fills.basal,\n };\n\n const label = _.isPlainObject(column.label)\n ? {\n text: column.label.main,\n subText: ` ${column.label.secondary}`,\n } : {\n text: column.label,\n };\n\n const columnDef = {\n id: column.key,\n header: label,\n align: isFirst ? 'left' : 'center',\n headerFill: headerFills[column.key],\n cache: false,\n headerRenderer: this.renderCustomTextCell,\n };\n\n if (!isFirst) {\n columnDef.width = widths[column.key];\n\n if (columnDef.id === 'rate') {\n columnDef.renderer = this.renderCustomTextCell;\n }\n } else {\n columnDef.cache = false;\n columnDef.renderer = this.renderCustomTextCell;\n }\n\n return columnDef;\n });\n\n const rows = _.map(profile.rows, (row, index) => {\n const isLast = index === profile.rows.length - 1;\n\n if (isLast) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n row._bold = true;\n }\n\n return row;\n });\n\n this.renderTable(tableColumns, rows, {\n bottomMargin: 0,\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n flexColumn: 'start',\n });\n\n this.setLayoutColumns({\n width: firstColumnWidth + widths.rate,\n count: 1,\n });\n\n this.renderInsulinSettings(this.latestPumpUpload.settings, schedule.name);\n this.doc.moveDown();\n });\n }\n\n renderPumpSettings() {\n this.renderSectionHeading(t('Pump Settings'));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n this.renderInsulinSettings(this.latestPumpUpload.settings);\n this.doc.moveDown();\n }\n\n renderInsulinSettings(settings, scheduleName) {\n const columnWidth = this.getActiveColumnWidth();\n const valueWidth = 50;\n const { rows: tableRows, columns } = insulinSettings(settings, this.manufacturer, scheduleName);\n\n const tableColumns = _.map(columns, (column, index) => ({\n id: column.key,\n align: index === 0 ? 'left' : 'right',\n width: index === 0 ? columnWidth - valueWidth : valueWidth,\n }));\n\n const heading = {\n text: t('Insulin Settings'),\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n fontSize: scheduleName ? this.defaultFontSize : this.largeFontSize,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n this.renderTable(tableColumns, tableRows, {\n bottomMargin: 15,\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n showHeaders: false,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n this.resetText();\n }\n\n renderBasalSchedules() {\n this.renderSectionHeading(t('Basal Rates'));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n const {\n activeSchedule,\n basalSchedules,\n lastManualBasalSchedule,\n } = this.latestPumpUpload.settings;\n\n const columnWidth = this.getActiveColumnWidth();\n\n const tableColumns = _.map(startTimeAndValue('rate'), (column, index) => {\n const isValue = index === 1;\n const valueWidth = 50;\n\n return {\n id: column.key,\n header: column.label,\n align: isValue ? 'right' : 'left',\n width: isValue ? valueWidth : columnWidth - valueWidth,\n };\n });\n\n // We only show automated basal schedules if active at upload\n const schedules = _.reject(\n _.map(\n basalSchedules,\n (schedule, index) => basal(index, this.latestPumpUpload.settings, this.manufacturer)\n ),\n schedule => (schedule.isAutomated && schedule.scheduleName !== activeSchedule)\n );\n\n const sortedSchedules = _.orderBy(\n schedules,\n [\n schedule => (schedule.isAutomated ? 1 : 0),\n schedule => (schedule.scheduleName === lastManualBasalSchedule ? 1 : 0),\n schedule => (schedule.scheduleName === activeSchedule ? 1 : 0),\n schedule => schedule.rows.length,\n 'name',\n ],\n ['desc', 'desc', 'desc', 'desc', 'asc']\n );\n\n const automatedScheduleShowing = _.some(sortedSchedules, { isAutomated: true });\n\n _.each(sortedSchedules, (schedule, index) => {\n const columnIndex = automatedScheduleShowing && index > 0 ? index - 1 : index;\n const activeColumn = columnIndex < this.layoutColumns.count\n ? columnIndex % this.layoutColumns.count\n : this.getShortestLayoutColumn();\n\n this.goToLayoutColumnPosition(activeColumn);\n\n const scheduleLabel = _.get(schedule, 'title', {});\n\n const heading = {\n text: scheduleLabel.main,\n subText: schedule.isAutomated ? ` ${scheduleLabel.secondary.toLowerCase()}` : ` ${scheduleLabel.units}`,\n note: schedule.isAutomated ? null : scheduleLabel.secondary,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: schedule.isAutomated ? this.colors.basalAutomated : this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n bottomMargin: schedule.isAutomated ? 15 : 0,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n if (!schedule.isAutomated) {\n const rows = _.map(schedule.rows, (row, rowIndex) => {\n const isLast = rowIndex === schedule.rows.length - 1;\n\n if (isLast) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n row._bold = true;\n }\n\n return row;\n });\n\n this.renderTable(tableColumns, rows, {\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n bottomMargin: 15,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n });\n\n this.resetText();\n }\n\n renderWizardSettings() {\n this.doc.x = this.chartArea.leftEdge;\n this.doc.y = _.get(this.layoutColumns, ['columns', this.getLongestLayoutColumn(), 'y']);\n this.doc.moveDown();\n\n this.renderSectionHeading(bolusTitle(this.manufacturer));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n this.renderSensitivity();\n\n this.renderTarget();\n\n this.renderRatio();\n\n this.resetText();\n }\n\n renderWizardSetting(settings, units = '') {\n this.goToLayoutColumnPosition(this.getShortestLayoutColumn());\n\n const columnWidth = this.getActiveColumnWidth();\n\n const tableColumns = _.map(settings.columns, (column, index) => {\n const isValue = index > 0;\n const valueWidth = 50;\n\n return {\n id: column.key,\n header: column.label,\n align: isValue ? 'right' : 'left',\n width: isValue ? valueWidth : columnWidth - (valueWidth * (settings.columns.length - 1)),\n };\n });\n\n const heading = {\n text: settings.title,\n subText: ` ${units}`,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n this.renderTable(tableColumns, settings.rows, {\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n\n renderSensitivity() {\n const units = `${this.bgUnits}/U`;\n this.renderWizardSetting(\n sensitivity(this.latestPumpUpload.settings, this.manufacturer, this.bgUnits),\n units\n );\n }\n\n renderTarget() {\n const units = this.bgUnits;\n this.renderWizardSetting(\n target(this.latestPumpUpload.settings, this.manufacturer),\n units\n );\n }\n\n renderRatio() {\n const units = _.get(this, 'latestPumpUpload.settings.units.carb') === 'exchanges' ? 'U/exch' : 'g/U';\n this.renderWizardSetting(\n ratio(this.latestPumpUpload.settings, this.manufacturer),\n units\n );\n }\n}\n\nexport default SettingsPrintView;\n","/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport moment from 'moment-timezone';\n\nimport PrintView from './PrintView';\n\nimport {\n AGP_FOOTER_Y_PADDING,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n colors,\n fontSizes,\n text,\n} from './utils/AGPConstants';\n\nimport {\n generateChartSections,\n} from './utils/AGPUtils';\n\nimport { MGDL_UNITS, MS_IN_MIN } from '../../utils/constants';\nimport { getPatientFullName } from '../../utils/misc';\nimport { bankersRound } from '../../utils/format';\nimport { formatBirthdate, getOffset } from '../../utils/datetime';\nimport { formatDatum } from '../../utils/stat';\n\nconst agpLogo = require('./images/capturAGP-logo.png');\nconst tidepoolLogo = require('./images/tidepool-logo-408x46.png');\nconst t = i18next.t.bind(i18next);\n\nclass AGPPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n this.sections = generateChartSections(data);\n this.doc.addPage();\n this.svgDataURLS = opts.svgDataURLS;\n }\n\n newPage() {\n super.newPage();\n }\n\n async render() {\n // this.renderGuides(); // Uncomment to render section borders for debugging\n this.renderReportInfo();\n\n if (\n !this.sections.ambulatoryGlucoseProfile.sufficientData &&\n !this.sections.dailyGlucoseProfiles.sufficientData &&\n !this.sections.glucoseMetrics.sufficientData &&\n !this.sections.timeInRanges.sufficientData\n ) {\n // If no sections have sufficient data we don't render any of them\n this.renderInsufficientData();\n } else {\n // If at least one section has sufficient data we render all of them, and show any unmet\n // data sufficiency text within the sections themselves\n this.renderGlucoseMetrics();\n await this.renderTimeInRanges();\n await this.renderAmbulatoryGlucoseProfile();\n await this.renderDailyGlucoseProfiles();\n }\n }\n\n renderHeader() {\n this.doc.font(this.boldFont).fontSize(fontSizes.reportHeader);\n const xPos = this.leftEdge;\n const yPos = this.topEdge;\n\n this.doc\n .fillColor(colors.text.reportHeader)\n .fillOpacity(1)\n .text(`${text.reportHeader} `, xPos, yPos, { continued: true })\n .font(this.font)\n .text(text.reportSubHeader);\n\n return this;\n }\n\n renderFooter() {\n this.doc.font(this.font).fontSize(fontSizes.reportFooter);\n const xPos = this.leftEdge;\n const yPos = this.bottomEdge - this.doc.currentLineHeight() * 1.25 - AGP_FOOTER_Y_PADDING;\n\n this.doc\n .fillColor(colors.text.reportFooter)\n .fillOpacity(1)\n .text(text.reportFooter, xPos, yPos);\n\n this.agpLogoWidth = 70;\n this.tidepoolLogoWidth = 65;\n const logoX = this.doc.page.width - this.agpLogoWidth - this.margins.right;\n const logoY = this.bottomEdge - this.agpLogoWidth * 0.175 - AGP_FOOTER_Y_PADDING;\n\n // Render AGP Logo\n this.doc.image(agpLogo, logoX, logoY, { width: this.agpLogoWidth });\n\n // Render Tidepool Logo\n this.doc.image(tidepoolLogo, logoX - (this.agpLogoWidth + 10), logoY + 2, { width: this.tidepoolLogoWidth });\n this.setStroke(colors.mediumGrey);\n\n this.doc\n .moveTo(logoX - 8, logoY)\n .lineTo(logoX - 8, logoY + 11)\n .stroke();\n\n super.renderFooter();\n\n return this;\n }\n\n renderGuides() {\n // page margins\n this.doc.lineWidth(1)\n .dash(3, { space: 4 })\n .rect(this.margins.left, this.margins.top, this.width, this.height)\n .stroke('#EEEEEE');\n\n _.each(_.values(this.sections), section => {\n this.doc.lineWidth(1)\n .rect(section.x, section.y, section.width, section.height)\n .stroke('#EEEEEE');\n });\n\n this.doc.undash();\n }\n\n renderInsufficientData() {\n this.resetText();\n const yPos = this.topEdge + (this.dpi * 0.3);\n const xPos = this.leftEdge;\n\n this.doc\n .fontSize(fontSizes.reportInfo.default)\n .text(text.reportInsuffienctData, xPos, yPos);\n }\n\n renderSectionContainer(section) {\n this.resetText();\n\n if (section.bordered) {\n // Draw section container\n this.doc\n .roundedRect(section.x, section.y, section.width, section.height, AGP_SECTION_BORDER_RADIUS)\n .fill(colors.background.shaded);\n this.doc\n .rect(section.x + 1, section.y + 1 + AGP_SECTION_HEADER_HEIGHT, section.width - 2, AGP_SECTION_BORDER_RADIUS)\n .fill(colors.white);\n this.doc\n .roundedRect(section.x + 1, section.y + 1 + AGP_SECTION_HEADER_HEIGHT, section.width - 2, section.height - 2 - AGP_SECTION_HEADER_HEIGHT, AGP_SECTION_BORDER_RADIUS - 1)\n .fill(colors.white);\n }\n\n // Add section titles, subtitles, and descriptions\n if (section.text?.title) {\n const titlePaddingX = 8;\n const titleXPos = section.x + titlePaddingX;\n const titleYPos = section.y + 1 + ((AGP_SECTION_HEADER_HEIGHT - this.doc.currentLineHeight()) / 2);\n this.setFill(colors.text.section.title);\n\n this.doc.font(this.boldFont)\n .fontSize(fontSizes.section.title);\n\n this.doc.text(section.text.title, titleXPos, titleYPos);\n\n if (section.text?.subtitle) {\n const subtitleXPos = titleXPos + this.doc.widthOfString(section.text.title) + (this.dpi * 0.4);\n\n this.setFill(colors.text.section.subtitle);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.subtitle);\n\n this.doc.text(section.text.subtitle, subtitleXPos, section.y + 1 + ((AGP_SECTION_HEADER_HEIGHT - this.doc.currentLineHeight()) / 2));\n }\n }\n\n if (!section.sufficientData && section.text?.insufficientData) {\n const insufficientDataPaddingX = 14;\n const insufficientDataPaddingY = 8;\n const insufficientDataXPos = section.x + insufficientDataPaddingX;\n const insufficientDataYPos = section.y + AGP_SECTION_HEADER_HEIGHT + insufficientDataPaddingY;\n\n this.setFill(colors.text.section.insufficientData);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.insufficientData);\n\n this.doc.text(section.text.insufficientData, insufficientDataXPos, insufficientDataYPos);\n } else if (section.text?.description) {\n const descriptionPaddingX = 14;\n const descriptionPaddingY = 8;\n const descriptionXPos = section.x + descriptionPaddingX;\n const descriptionYPos = section.y + AGP_SECTION_HEADER_HEIGHT + descriptionPaddingY;\n\n this.setFill(colors.text.section.description);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.description);\n\n this.doc.text(section.text.description, descriptionXPos, descriptionYPos);\n }\n }\n\n renderReportInfo() {\n const section = this.sections.reportInfo;\n this.renderSectionContainer(section);\n\n const patientName = _.truncate(getPatientFullName(this.patient), { length: 32 });\n const patientBirthdate = formatBirthdate(this.patient);\n let patientMRN = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const { cgmDaysWorn = 0, oldestDatum, newestDatum, sensorUsageAGP } = this.stats.sensorUsage?.data?.raw || {};\n\n let cgmDaysWornText = cgmDaysWorn === 1\n ? t('{{cgmDaysWorn}} Day', { cgmDaysWorn })\n : t('{{cgmDaysWorn}} Days', { cgmDaysWorn });\n\n if (cgmDaysWorn >= 1) {\n cgmDaysWornText += `: ${cgmDaysWorn === 1\n ? moment.utc(newestDatum?.time - getOffset(newestDatum?.time, this.timezone) * MS_IN_MIN).format('MMMM D, YYYY')\n : this.getDateRange(oldestDatum?.time, newestDatum?.time, undefined, '', 'MMMM')\n }`;\n }\n\n const renderInfoRow = (mainText, subTextLabel, subText, underline = true) => {\n const x = this.doc.x;\n const y = this.doc.y;\n let subTextWidth = 0;\n\n if (subText) {\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.reportInfo.default);\n\n subTextWidth = this.doc.widthOfString(subText);\n\n this.doc.text(subText, x, y, {\n align: 'right',\n width: section.width,\n });\n\n if (subTextLabel) {\n this.doc\n .font(this.font)\n .fontSize(fontSizes.reportInfo.label);\n\n this.doc.text(subTextLabel, x, y + 1, {\n align: 'right',\n width: section.width - subTextWidth - this.dpi * 0.025,\n });\n }\n }\n\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.reportInfo.default)\n .text(mainText, x, y);\n\n if (underline) {\n const lineYPos = y + this.doc.currentLineHeight() + this.dpi * 0.025;\n\n this.doc\n .moveTo(section.x, lineYPos)\n .lineWidth(0.25)\n .lineTo(section.x + section.width, lineYPos)\n .strokeColor(colors.line.default)\n .stroke();\n }\n\n this.doc.x = x;\n };\n\n this.doc.x = section.x;\n\n if (patientMRN) {\n if (patientMRN.length > 15) {\n patientMRN = `${patientMRN.slice(0, 5)}\\u2026${patientMRN.slice(-7)}`;\n }\n\n this.doc.y = section.y + this.dpi * 0.05;\n this.doc.moveUp(1);\n renderInfoRow('', text.reportInfo.mrn, patientMRN, false);\n }\n\n this.doc.y = section.y + this.dpi * 0.05;\n renderInfoRow(patientName, text.reportInfo.dob, patientBirthdate);\n this.doc.moveDown(1);\n renderInfoRow(cgmDaysWornText);\n this.doc.moveDown(1);\n renderInfoRow(t('Time CGM Active: {{activeTime}}%', {\n activeTime: bankersRound(sensorUsageAGP, 1),\n }));\n }\n\n renderGlucoseMetrics() {\n const section = this.sections.glucoseMetrics;\n this.renderSectionContainer(section);\n\n const paddingX = this.dpi * 0.2;\n const xExtents = [section.x + paddingX, section.x + section.width - paddingX];\n\n const glucoseStats = [\n this.stats.averageGlucose,\n this.stats.glucoseManagementIndicator,\n this.stats.coefficientOfVariation,\n ];\n\n this.doc.x = section.x;\n this.doc.y = section.y + this.dpi * 0.375;\n\n _.each(glucoseStats, (stat, index) => {\n const paddingY = 8;\n const statWidth = xExtents[1] - xExtents[0];\n const y = this.doc.y;\n const isAverageGlucose = stat.id === 'averageGlucose';\n const isShaded = index % 2 !== 0;\n\n const { value, suffix } = formatDatum(\n _.get(stat.data, _.get(stat.data, 'dataPaths.summaryAGP', stat.data?.dataPaths?.summary)),\n _.get(stat, 'dataFormat.summary'),\n { bgPrefs: this.bgPrefs, data: stat.data, useAGPFormat: true }\n );\n\n const units = suffix || this.bgUnits;\n\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.glucoseMetrics.labels)\n .lineGap(-1.5);\n\n if (isShaded) {\n this.doc\n .rect(section.x, y - paddingY, section.width, this.doc.currentLineHeight() * 2.25 + paddingY * 2)\n .fill(colors.background.shaded);\n }\n\n this.setFill();\n\n this.doc\n .text(text.glucoseMetrics[stat.id].label, xExtents[0], y);\n\n const valueYShift = (fontSizes.glucoseMetrics.values - fontSizes.glucoseMetrics.labels) / 2;\n const unitsFontSize = isAverageGlucose ? fontSizes.glucoseMetrics.bgUnits : fontSizes.glucoseMetrics.values;\n const unitsYShift = isAverageGlucose ? valueYShift - 2.15 : valueYShift;\n\n this.doc\n .fontSize(unitsFontSize)\n .text(`${units}`, xExtents[0], y - unitsYShift, { align: 'right', width: statWidth });\n\n const valueXShift = this.doc.widthOfString(units) + 1;\n\n this.doc\n .fontSize(fontSizes.glucoseMetrics.values)\n .text(`${value}`, xExtents[0], y - valueYShift, { align: 'right', width: statWidth - valueXShift });\n\n this.doc\n .font(this.font)\n .fontSize(fontSizes.glucoseMetrics.subLabels);\n\n const bgUnitsKey = this.bgUnits === MGDL_UNITS ? 'mgdl' : 'mmoll';\n const goal = isAverageGlucose\n ? text.glucoseMetrics[stat.id].goal[bgUnitsKey]\n : text.glucoseMetrics[stat.id].goal;\n\n this.setFill(colors.text.goals.glucoseMetrics);\n\n this.doc\n .lineGap(1.3)\n .text(goal);\n\n this.doc\n .fontSize(fontSizes.glucoseMetrics.subLabels);\n\n if (text.glucoseMetrics[stat.id].subLabel) this.doc.text(text.glucoseMetrics[stat.id].subLabel);\n this.doc.moveDown(1.25);\n });\n\n this.resetText();\n }\n\n async renderTimeInRanges() {\n const section = this.sections.timeInRanges;\n this.renderSectionContainer(section);\n\n // Set chart plot within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + this.dpi * 0.25;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - this.dpi * 0.25 - AGP_SECTION_BORDER_RADIUS;\n this.renderSVGImage(this.svgDataURLS?.timeInRanges, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\n }\n\n async renderAmbulatoryGlucoseProfile() {\n const section = this.sections.ambulatoryGlucoseProfile;\n this.renderSectionContainer(section);\n\n if (section.sufficientData) {\n // Set chart plot within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + this.dpi * 0.5;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - this.dpi * 0.5 - AGP_SECTION_BORDER_RADIUS;\n this.renderSVGImage(this.svgDataURLS?.ambulatoryGlucoseProfile, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\n }\n }\n\n async renderDailyGlucoseProfiles() {\n const section = this.sections.dailyGlucoseProfiles;\n this.renderSectionContainer(section);\n\n // Set chart plots within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n this.renderSVGImage(this.svgDataURLS?.dailyGlucoseProfiles?.[0], chartAreaX, chartAreaY, chartAreaWidth, plotHeight);\n this.renderSVGImage(this.svgDataURLS?.dailyGlucoseProfiles?.[1], chartAreaX, chartAreaY + plotHeight, chartAreaWidth, plotHeight);\n }\n}\n\nexport default AGPPrintView;\n","module.exports = \"data:image/png;base64,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\"","module.exports = require(\"moment\");","module.exports = require(\"lodash\");","module.exports = require(\"d3-scale\");","import _ from 'lodash';\nimport table from 'text-table';\nimport i18next from 'i18next';\n\nimport {\n formatBirthdate,\n formatCurrentDate,\n formatDateRange,\n formatDiagnosisDate,\n getOffset,\n getTimezoneFromTimePrefs,\n} from '../datetime';\n\nimport { MS_IN_MIN } from '../constants';\n\nimport { getPatientFullName } from '../misc';\n\nconst t = i18next.t.bind(i18next);\n\nexport class TextUtil {\n constructor(patient, endpoints, timePrefs) {\n this.patient = patient;\n this.endpoints = endpoints;\n this.timePrefs = timePrefs;\n }\n\n buildDocumentHeader = (source) => {\n const fullname = this.buildTextLine(getPatientFullName(this.patient));\n const bday = this.buildTextLine({ label: t('Date of birth'), value: formatBirthdate(this.patient) });\n const diagnosis = formatDiagnosisDate(this.patient);\n const diagnosisText = diagnosis ? this.buildTextLine({ label: t('Date of diagnosis'), value: diagnosis }) : '';\n const mrn = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const mrnText = mrn ? this.buildTextLine({ label: t('MRN'), value: mrn }) : '';\n const exported = this.buildTextLine({ label: `${t('Exported from Tidepool')}${source ? ` ${source}` : ''}`, value: formatCurrentDate() });\n return `${fullname}${bday}${diagnosisText}${mrnText}${exported}`;\n };\n\n buildDocumentDates = () => {\n const timezone = getTimezoneFromTimePrefs(this.timePrefs);\n\n // endpoint is exclusive, so need to subtract a millisecond from formatted range end date\n let start = this.endpoints[0];\n let end = this.endpoints[1] - 1;\n\n start = start - getOffset(start, timezone) * MS_IN_MIN;\n end = end - getOffset(end, timezone) * MS_IN_MIN;\n\n return `\\nReporting Period: ${formatDateRange(start, end)}\\n`;\n }\n\n buildTextLine = (text = '') => (_.isPlainObject(text) ? `${text.label}: ${text.value}\\n` : `${text}\\n`);\n\n buildTextTable = (name, rows, columns, opts) => {\n const tableText = this.getTable(rows, columns, opts);\n if (name && tableText) return `\\n${name}\\n${tableText}\\n`;\n return name ? `\\n${name}\\n` : `\\n${tableText}\\n`;\n }\n\n getTable = (rows, columns, opts = {}) => {\n _.defaults(opts, {\n showHeader: true,\n });\n\n const header = [this.getTableHeader(columns)];\n const content = this.getTableRows(rows, columns);\n return opts.showHeader ? table(header.concat(content)) : table(content);\n };\n\n getTableHeader = columns => _.map(\n columns,\n column => (_.isPlainObject(column.label) ? `${column.label.main} ${column.label.secondary}` : column.label)\n );\n\n getTableRows = (rows, columns) => _.map(\n rows,\n row => this.getTableRow(columns, row)\n );\n\n getTableRow = (columns, rowData) => _.map(\n columns,\n column => rowData[column.key]\n );\n}\n\nexport default TextUtil;\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) {\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 wizard = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'bolus') {\n wizard = getWizardFromInsulinEvent(insulinEvent);\n }\n // a simple manual/\"quick\" bolus won't have a `recommended` field\n if (!wizard.recommended) {\n return NaN;\n }\n const netRecommendation = _.get(wizard, ['recommended', 'net'], null);\n if (netRecommendation !== null) {\n return netRecommendation;\n }\n let rec = 0;\n rec += _.get(wizard, ['recommended', 'carb'], 0);\n rec += _.get(wizard, ['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 = Boolean(\n bolus.normal != null &&\n bolus.expectedNormal &&\n bolus.normal !== bolus.expectedNormal\n );\n\n const cancelledDuringExtended = Boolean(\n bolus.extended != null &&\n bolus.expectedExtended &&\n bolus.extended !== bolus.expectedExtended\n );\n\n if (_.inRange(bolus.normal, Infinity)) {\n if (!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 bolus programmed was larger than the calculated recommendation\n */\nexport function isOverride(insulinEvent) {\n return getRecommended(insulinEvent.wizard || insulinEvent) < getProgrammed(insulinEvent);\n}\n\n/**\n * isUnderride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus programmed was smaller than the calculated recommendation\n */\nexport function isUnderride(insulinEvent) {\n return getRecommended(insulinEvent.wizard || insulinEvent) > getProgrammed(insulinEvent);\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 = _.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 * 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) 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, formatDecimalNumber } 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(formatDecimalNumber(hours * rate, 3));\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 const start = new Date(endpoints[0]);\n const end = new Date(endpoints[1]);\n let dose = 0;\n\n _.each(data, (datum, index) => {\n let duration = datum.duration;\n if (index === 0) {\n // handle first segment, which may have started before the start endpoint\n duration = _.min([new Date(datum.normalEnd) - start, datum.duration]);\n } else if (index === data.length - 1) {\n // handle last segment, which may go past the end endpoint\n duration = _.min([end - new Date(datum.normalTime), datum.duration]);\n }\n\n dose += getSegmentDose(duration, 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 start = new Date(endpoints[0]);\n const end = new Date(endpoints[1]);\n\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n _.each(data, (datum, index) => {\n let duration = datum.duration;\n if (index === 0) {\n // handle first segment, which may have started before the start endpoint\n duration = _.min([new Date(datum.normalEnd) - start, datum.duration]);\n } else if (index === data.length - 1) {\n // handle last segment, which may go past the end endpoint\n duration = _.min([end - new Date(datum.normalTime), datum.duration]);\n }\n durations[getBasalPathGroupType(datum)] += duration;\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","// DPI here is the coordinate system, not the resolution; sub-dot precision renders crisply!\nexport const DPI = 72;\nexport const MARGIN = DPI / 2;\nexport const HEIGHT = 11 * DPI - (2 * MARGIN);\nexport const WIDTH = 8.5 * DPI - (2 * MARGIN);\nexport const MARGINS = {\n left: MARGIN,\n top: MARGIN,\n right: MARGIN,\n bottom: MARGIN,\n};\nexport const DEFAULT_FONT_SIZE = 10;\nexport const LARGE_FONT_SIZE = 12;\nexport const FOOTER_FONT_SIZE = 8;\nexport const HEADER_FONT_SIZE = 14;\nexport const SMALL_FONT_SIZE = 8;\nexport const EXTRA_SMALL_FONT_SIZE = 6;\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 DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n clampThreshold: 33.3,\n },\n};\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 AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\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 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('Fill Cannula'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Change Pod'),\n [SITE_CHANGE_TUBING]: t('Activate Pod'),\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('Prime Cannula'),\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('Prime Reservoir'),\n [SITE_CHANGE_CANNULA]: t('Prime Cannula'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Change Cartridge'),\n [SITE_CHANGE_TUBING]: t('Fill Tubing'),\n [SITE_CHANGE_CANNULA]: t('Fill Cannula'),\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 default: {\n [SITE_CHANGE_RESERVOIR]: t('Change Cartridge'),\n [SITE_CHANGE_TUBING]: t('Fill Tubing'),\n [SITE_CHANGE_CANNULA]: t('Fill Cannula'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\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 [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","module.exports = require(\"d3-time-format\");","/*\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport PdfTable from 'voilab-pdf-table';\nimport PdfTableFitColumn from 'voilab-pdf-table/plugins/fitcolumn';\nimport i18next from 'i18next';\n\nimport SVGtoPDF from 'svg-to-pdfkit';\n\nimport {\n getOffset,\n getTimezoneFromTimePrefs,\n formatBirthdate,\n formatCurrentDate,\n formatDateRange,\n} from '../../utils/datetime';\n\nimport { getStatDefinition } from '../../utils/stat';\nimport { getPatientFullName } from '../../utils/misc';\n\nimport {\n DPI,\n MARGINS,\n WIDTH,\n HEIGHT,\n DEFAULT_FONT_SIZE,\n EXTRA_SMALL_FONT_SIZE,\n FOOTER_FONT_SIZE,\n HEADER_FONT_SIZE,\n LARGE_FONT_SIZE,\n SMALL_FONT_SIZE,\n} from './utils/constants';\n\nimport { BG_COLORS, MS_IN_MIN } from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\n\nconst logo = require('./images/tidepool-logo-408x46.png');\n\nclass PrintView {\n constructor(doc, data = {}, opts) {\n this.doc = doc;\n this.addSVG = SVGtoPDF.bind(null, this.doc);\n\n this.title = opts.title;\n this.data = _.cloneDeep(data);\n this.bgPrefs = _.get(this.data, 'bgPrefs');\n this.bgUnits = _.get(this.data, 'bgPrefs.bgUnits');\n this.bgBounds = _.get(this.data, 'bgPrefs.bgBounds');\n this.timePrefs = _.get(this.data, 'timePrefs');\n this.timezone = getTimezoneFromTimePrefs(this.timePrefs);\n this.endpoints = _.get(this.data, 'data.current.endpoints', {});\n this.bgSource = _.get(this.data, 'metaData.bgSources.current');\n this.latestPumpUpload = _.get(this.data, 'metaData.latestPumpUpload');\n this.manufacturer = _.get(this.latestPumpUpload, 'manufacturer');\n\n this.stats = {};\n const statsData = _.get(this.data, 'data.current.stats', {});\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource: this.bgSource,\n days: this.endpoints.activeDays || this.endpoints.days,\n bgPrefs: this.bgPrefs,\n manufacturer: this.manufacturer,\n });\n this.stats[statType] = stat;\n });\n\n this.aggregationsByDate = _.get(this.data, 'data.current.aggregationsByDate', {});\n\n this.debug = opts.debug || false;\n\n this.dpi = opts.dpi || DPI;\n this.margins = opts.margins || MARGINS;\n\n this.font = 'Helvetica';\n this.boldFont = 'Helvetica-Bold';\n\n this.defaultFontSize = opts.defaultFontSize || DEFAULT_FONT_SIZE;\n this.footerFontSize = opts.footerFontSize || FOOTER_FONT_SIZE;\n this.headerFontSize = opts.headerFontSize || HEADER_FONT_SIZE;\n this.largeFontSize = opts.largeFontSize || LARGE_FONT_SIZE;\n this.smallFontSize = opts.smallFontSize || SMALL_FONT_SIZE;\n this.extraSmallFontSize = opts.extraSmallFontSize || EXTRA_SMALL_FONT_SIZE;\n\n this.width = opts.width || WIDTH;\n this.height = opts.height || HEIGHT;\n\n this.patient = opts.patient;\n this.patientInfoBox = {\n width: 0,\n height: 0,\n };\n\n this.colors = {\n ...BG_COLORS,\n basal: '#19A0D7',\n basalAutomated: '#00B2C3',\n sleep: '#4457D9',\n physicalActivity: '#758CFF',\n bolus: '#7CD0F0',\n bolusAutomated: '#00B2C3',\n smbg: '#6480FB',\n siteChange: '#FCD144',\n basalHeader: '#DCF1F9',\n smbgHeader: '#E8ECFE',\n bolusHeader: '#EBF7FC',\n grey: '#6D6D6D',\n lightGrey: '#979797',\n darkGrey: '#4E4E4F',\n };\n\n this.tableSettings = {\n colors: {\n border: this.colors.grey,\n tableHeader: this.colors.basal,\n zebraHeader: '#FAFAFA',\n zebraEven: '#FAFAFA',\n zebraOdd: '#FFFFFF',\n },\n borderWidth: 0.5,\n };\n\n this.leftEdge = this.margins.left;\n this.rightEdge = this.margins.left + this.width;\n this.topEdge = this.margins.top;\n this.bottomEdge = this.margins.top + this.height;\n\n this.chartArea = {\n bottomEdge: this.margins.top + opts.height,\n leftEdge: this.margins.left,\n topEdge: this.margins.top,\n };\n\n this.chartArea.width = this.rightEdge - this.chartArea.leftEdge;\n this.initialChartArea = _.clone(this.chartArea);\n\n this.totalPages = this.initialTotalPages = this.doc.bufferedPageRange().count || 0;\n this.currentPageIndex = -1;\n\n // kick off the dynamic calculation of chart area based on font sizes for header and footer\n this.setHeaderSize().setFooterSize();\n\n // Auto-bind callback methods\n this.newPage = this.newPage.bind(this);\n this.setNewPageTablePosition = this.setNewPageTablePosition.bind(this);\n this.renderCustomTextCell = this.renderCustomTextCell.bind(this);\n\n // Clear previous and set up pageAdded listeners :/\n this.doc.removeAllListeners('pageAdded');\n this.doc.on('pageAdded', this.newPage);\n }\n\n newPage(dateText) {\n if (this.debug) {\n this.renderDebugGrid();\n }\n\n const currentFont = {\n name: _.get(this.doc, '_font.name', this.font),\n size: _.get(this.doc, '_fontSize', this.defaultFontSize),\n };\n\n this.currentPageIndex++;\n this.totalPages++;\n\n this.renderHeader(dateText).renderFooter();\n this.doc.x = this.chartArea.leftEdge;\n this.doc.y = this.chartArea.topEdge;\n\n // Set font styles back to what they were before the page break\n // This is needed because the header and footer rendering changes it\n // and any tables that need to continue rendering on the new page are affected.\n this.doc\n .font(currentFont.name)\n .fontSize(currentFont.size);\n\n if (this.table) {\n this.setNewPageTablePosition();\n }\n\n if (this.layoutColumns) {\n this.setLayoutColumns({\n activeIndex: this.layoutColumns.activeIndex,\n count: this.layoutColumns.count,\n gutter: this.layoutColumns.gutter,\n type: this.layoutColumns.type,\n width: this.layoutColumns.width,\n widths: this.layoutColumns.widths,\n });\n\n this.goToLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n }\n\n setNewPageTablePosition() {\n const xPos = this.layoutColumns\n ? _.get(this, `layoutColumns.columns.${this.layoutColumns.activeIndex}.x`)\n : this.chartArea.leftEdge;\n\n this.doc.x = this.table.pos.x = xPos;\n this.doc.y = this.table.pos.y = this.chartArea.topEdge;\n\n this.table.pdf.lineWidth(this.tableSettings.borderWidth);\n }\n\n setLayoutColumns(opts) {\n const {\n activeIndex = 0,\n columns = [],\n count = _.get(opts, 'widths.length', 0),\n gutter = 0,\n type = 'equal',\n width = this.chartArea.width,\n widths = [],\n } = opts;\n\n const availableWidth = width - (gutter * (count - 1));\n\n switch (type) {\n case 'percentage': {\n let combinedWidths = 0;\n let i = 0;\n\n do {\n const columnWidth = availableWidth * widths[i] / 100;\n\n columns.push({\n x: this.chartArea.leftEdge + (gutter * i) + combinedWidths,\n y: this.doc.y,\n width: columnWidth,\n });\n\n i++;\n combinedWidths += columnWidth;\n } while (i < count);\n\n break;\n }\n\n case 'equal':\n default: {\n const columnWidth = availableWidth / count;\n let i = 0;\n\n do {\n columns.push({\n x: this.chartArea.leftEdge + (gutter * i) + (columnWidth * i),\n y: this.doc.y,\n width: columnWidth,\n });\n i++;\n } while (i < count);\n\n break;\n }\n }\n\n this.layoutColumns = {\n activeIndex,\n columns,\n count,\n gutter,\n type,\n width,\n widths,\n };\n }\n\n updateLayoutColumnPosition(index) {\n this.layoutColumns.columns[index].x = this.doc.x;\n this.layoutColumns.columns[index].y = this.doc.y;\n }\n\n goToLayoutColumnPosition(index) {\n this.doc.x = this.layoutColumns.columns[index].x;\n this.doc.y = this.layoutColumns.columns[index].y;\n this.layoutColumns.activeIndex = index;\n }\n\n goToPage(index) {\n this.doc.switchToPage(this.initialTotalPages + index);\n this.currentPageIndex = index;\n }\n\n getShortestLayoutColumn() {\n let shortest;\n let shortestIndex;\n _.each(this.layoutColumns.columns, (column, colIndex) => {\n if (!shortest || (shortest > column.y)) {\n shortest = column.y;\n shortestIndex = colIndex;\n }\n });\n\n return shortestIndex;\n }\n\n getLongestLayoutColumn() {\n let longest;\n let longestIndex;\n _.each(_.get(this, 'layoutColumns.columns', []), (column, colIndex) => {\n if (!longest || (longest < column.y)) {\n longest = column.y;\n longestIndex = colIndex;\n }\n });\n\n return longestIndex;\n }\n\n getActiveColumnWidth() {\n return this.layoutColumns.columns[this.layoutColumns.activeIndex].width;\n }\n\n getDateRange(startDate, endDate, dateParseFormat, prefix, monthFormat) {\n let start = startDate;\n let end = endDate;\n\n if (_.isNumber(startDate) && _.isNumber(endDate)) {\n start = startDate - getOffset(startDate, this.timezone) * MS_IN_MIN;\n end = endDate - getOffset(endDate, this.timezone) * MS_IN_MIN;\n }\n\n return t('{{prefix}}{{dateRange}}', {\n prefix,\n dateRange: formatDateRange(start, end, dateParseFormat, monthFormat),\n });\n }\n\n lockFillandStroke() {\n this.fillLocked = true;\n this.strokeLocked = true;\n }\n\n unlockFillandStroke() {\n this.fillLocked = false;\n this.strokeLocked = false;\n }\n\n setFill(color = 'black', opacity = 1) {\n if (this.fillLocked) return;\n this.doc\n .fillColor(color)\n .fillOpacity(opacity);\n }\n\n setStroke(color = 'black', opacity = 1) {\n if (this.strokeLocked) return;\n this.doc\n .strokeColor(color)\n .strokeOpacity(opacity);\n }\n\n resetText() {\n this.setFill();\n this.doc\n .lineGap(0)\n .fontSize(this.defaultFontSize)\n .font(this.font);\n }\n\n renderSectionHeading(heading, opts = {}) {\n const {\n xPos = this.doc.x,\n yPos = this.doc.y,\n font = _.get(opts, 'font', this.font),\n fontSize = _.get(opts, 'fontSize', this.headerFontSize),\n subTextFont = _.get(opts, 'subTextFont', this.font),\n subTextFontSize = _.get(opts, 'subTextFontSize', this.defaultFontSize),\n moveDown = 1,\n } = opts;\n\n const text = _.isString(heading) ? heading : heading.text;\n const subText = _.get(heading, 'subText', false);\n\n const textHeight = this.doc\n .font(font)\n .fontSize(fontSize)\n .heightOfString(' ');\n\n const subTextHeight = this.doc\n .font(subTextFont)\n .fontSize(subTextFontSize)\n .heightOfString(' ');\n\n const subTextYOffset = (textHeight - subTextHeight) / 1.75;\n\n this.doc\n .font(font)\n .fontSize(fontSize)\n .text(text, xPos, yPos, _.defaults(opts, {\n align: 'left',\n continued: !!subText,\n }));\n\n if (subText) {\n this.doc\n .font(subTextFont)\n .fontSize(subTextFontSize)\n .text(` ${subText}`, xPos, yPos + subTextYOffset);\n }\n\n this.resetText();\n this.doc.moveDown(moveDown);\n }\n\n renderCellStripe(data = {}, column = {}, pos = {}, isHeader = false) {\n const fillStripeKey = isHeader ? 'headerFillStripe' : 'fillStripe';\n const fillKey = isHeader ? 'headerFill' : 'fill';\n const heightKey = isHeader ? 'headerHeight' : 'height';\n\n const height = _.get(column, heightKey, column.height)\n || _.get(data, '_renderedContent.height', 0);\n\n const stripe = {\n width: 0,\n height,\n padding: 0,\n color: this.colors.grey,\n opacity: 1,\n background: false,\n };\n\n const fillStripe = _.get(data, `_${fillStripeKey}`, column[fillStripeKey]);\n const fill = _.get(data, `_${fillKey}`, column[fillKey]);\n\n if (fillStripe) {\n const stripeDefined = _.isPlainObject(fillStripe);\n\n stripe.color = stripeDefined\n ? _.get(fillStripe, 'color', this.colors.grey)\n : _.get(fill, 'color', this.colors.grey);\n\n stripe.opacity = stripeDefined ? _.get(fillStripe, 'opacity', 1) : 1;\n stripe.width = stripeDefined ? _.get(fillStripe, 'width', 6) : 6;\n stripe.background = _.get(fillStripe, 'background', false);\n stripe.padding = _.get(fillStripe, 'padding', 0);\n\n this.setFill(stripe.color, stripe.opacity);\n\n const xPos = pos.x + 0.25 + stripe.padding;\n const yPos = pos.y + 0.25 + stripe.padding;\n const stripeWidth = stripe.width;\n const stripeHeight = stripe.height - 0.5 - (2 * stripe.padding);\n\n if (stripe.width > 0) {\n this.doc\n .rect(xPos, yPos, stripeWidth, stripeHeight)\n .fill();\n }\n\n this.setFill();\n }\n\n return stripe;\n }\n\n renderCustomTextCell(tb, data, draw, column, pos, padding, isHeader) {\n if (draw) {\n let {\n text = '',\n subText = '',\n note,\n } = _.get(data, column.id, column.header || {});\n\n if ((!isHeader && _.isString(data[column.id])) || _.isString(column.header)) {\n text = isHeader ? column.header : data[column.id];\n subText = note = null;\n }\n\n const alignKey = isHeader ? 'headerAlign' : 'align';\n const align = _.get(column, alignKey, 'left');\n\n const stripe = this.renderCellStripe(data, column, pos, isHeader);\n const stripeOffset = stripe.background ? 0 : stripe.width;\n\n const xPos = pos.x + _.get(padding, 'left', 0) + stripeOffset;\n let yPos = pos.y + padding.top;\n\n // eslint-disable-next-line no-underscore-dangle\n const boldRow = data._bold || isHeader;\n\n const width = column.width - _.get(padding, 'left', 0) - _.get(padding, 'right', 0);\n\n const heightKey = isHeader ? 'headerHeight' : 'height';\n\n const height = _.get(column, heightKey, column.height)\n || _.get(data, '_renderedContent.height', 0);\n\n const fontKey = isHeader ? 'headerFont' : 'font';\n\n this.doc\n .font(_.get(column, fontKey, boldRow ? this.boldFont : this.font))\n .fontSize(_.get(column, 'fontSize', this.defaultFontSize));\n\n if (column.valign === 'center') {\n const textHeight = this.doc.heightOfString(text, { width });\n yPos += (height - textHeight) / 2 + 1;\n }\n\n let textRightPadding = 0;\n if (subText && align === 'right') {\n textRightPadding = this.doc.widthOfString(subText);\n }\n\n this.doc.text(text, xPos - textRightPadding, yPos, {\n continued: !!subText,\n align,\n width,\n });\n\n this.doc.font(this.font);\n\n if (subText) {\n this.doc.text(`${subText}`, xPos, yPos, {\n align,\n width,\n });\n }\n\n if (note) {\n this.doc\n .fontSize(_.get(column, 'noteFontSize', this.defaultFontSize))\n .text(note, {\n align,\n width,\n });\n }\n }\n\n return ' ';\n }\n\n renderTableHeading(heading = {}, opts = {}) {\n const fontSize = _.get(opts, 'fontSize', this.largeFontSize);\n const cellHeight = fontSize * 2;\n\n this.doc\n .font(this.font)\n .fontSize(fontSize);\n\n const columns = [\n {\n id: 'heading',\n align: _.get(opts, 'align', 'left'),\n height: _.get(opts, 'height', _.get(heading, 'note') ? cellHeight + 13 : cellHeight),\n cache: false,\n renderer: this.renderCustomTextCell,\n font: _.get(opts, 'font', this.boldFont),\n fontSize,\n },\n ];\n\n const rows = [\n {\n heading,\n note: _.get(heading, 'note'),\n },\n ];\n\n this.renderTable(columns, rows, _.defaultsDeep(opts, {\n columnDefaults: {\n headerBorder: '',\n },\n bottomMargin: 0,\n showHeaders: false,\n }));\n\n this.resetText();\n }\n\n renderTable(columns = [], rows = [], opts = {}, Table = PdfTable, FitColumn = PdfTableFitColumn) {\n this.doc.lineWidth(this.tableSettings.borderWidth);\n\n _.defaultsDeep(opts, {\n columnDefaults: {\n borderColor: this.tableSettings.colors.border,\n headerBorder: 'TBLR',\n border: 'TBLR',\n align: 'left',\n padding: [7, 5, 3, 5],\n headerPadding: [7, 5, 3, 5],\n fill: _.get(opts, 'columnDefaults.fill', _.get(opts, 'columnDefaults.zebra', false)),\n },\n bottomMargin: 20,\n pos: {\n maxY: this.chartArea.bottomEdge,\n },\n });\n\n // There is a bug in the PDF table plugin where it will render empty headers even if showHeaders\n // is false when a table spills over onto a new page. We remove the header border and padding in\n // to work around this, and cause it to effectively render nothing.\n // eslint-disable-next-line no-param-reassign\n if (opts.showHeaders === false) columns = columns.map(column => ({ ...column, headerBorder: '', headerPadding: [0, 0, 0, 0] }));\n\n const {\n flexColumn,\n } = opts;\n\n const table = this.table = new Table(this.doc, opts);\n\n if (flexColumn) {\n table.addPlugin(new FitColumn({\n column: flexColumn,\n }));\n }\n\n table.onPageAdd(this.onPageAdd.bind(this));\n\n table.onPageAdded(this.onPageAdded.bind(this));\n\n table.onCellBackgroundAdd(this.onCellBackgroundAdd.bind(this));\n\n table.onCellBackgroundAdded(this.onCellBackgroundAdded.bind(this));\n\n table.onCellBorderAdd(this.onCellBorderAdd.bind(this));\n\n table.onCellBorderAdded(this.onCellBorderAdded.bind(this));\n\n table.onRowAdd(this.onRowAdd.bind(this));\n\n table.onRowAdded(this.onRowAdded.bind(this));\n\n table.onBodyAdded(this.onBodyAdded.bind(this));\n\n table\n .setColumnsDefaults(opts.columnDefaults)\n .addColumns(columns)\n .addBody(rows);\n }\n\n onPageAdd(tb, row, ev) {\n const currentPageIndex = this.initialTotalPages + this.currentPageIndex;\n\n if (currentPageIndex + 1 === this.totalPages) {\n tb.pdf.addPage();\n } else {\n this.currentPageIndex++;\n tb.pdf.switchToPage(this.initialTotalPages + this.currentPageIndex);\n this.setNewPageTablePosition();\n }\n\n // cancel event so the automatic page add is not triggered\n ev.cancel = true; // eslint-disable-line no-param-reassign\n }\n\n onPageAdded(tb) {\n tb.addHeader();\n }\n\n onBodyAdded(tb) {\n // Restore x position after table is drawn\n this.doc.x = _.get(tb, 'pos.x', this.doc.page.margins.left);\n\n // Add margin to the bottom of the table\n this.doc.y += tb.bottomMargin;\n }\n\n onCellBackgroundAdd(tb, column, row, index, isHeader) {\n const {\n fill,\n headerFill,\n zebra,\n } = column;\n\n const isEven = index % 2 === 0;\n\n const fillKey = isHeader ? headerFill : fill;\n\n if (fillKey) {\n const fillDefined = _.isPlainObject(fillKey);\n let color;\n let opacity;\n\n if (!fillDefined) {\n opacity = 1;\n\n if (zebra) {\n if (isHeader) {\n color = this.tableSettings.colors.zebraHeader;\n } else {\n color = isEven\n ? this.tableSettings.colors.zebraEven\n : this.tableSettings.colors.zebraOdd;\n }\n } else {\n color = fillKey || 'white';\n }\n } else {\n const defaultOpacity = _.get(fillKey, 'opacity', 1);\n\n color = _.get(fillKey, 'color', 'white');\n opacity = zebra && !isEven ? defaultOpacity / 2 : defaultOpacity;\n }\n\n this.setFill(color, opacity);\n }\n\n /* eslint-disable no-underscore-dangle */\n if (row._fill) {\n const {\n color,\n opacity,\n } = row._fill;\n\n this.setFill(color, opacity);\n }\n /* eslint-enable no-underscore-dangle */\n }\n\n onCellBackgroundAdded() {\n this.setFill();\n }\n\n onCellBorderAdd(tb, column) {\n this.doc.lineWidth(this.tableSettings.borderWidth);\n this.setStroke(_.get(column, 'borderColor', 'black'), 1);\n }\n\n onCellBorderAdded() {\n this.setStroke();\n }\n\n onRowAdd(tb, row) {\n // eslint-disable-next-line no-underscore-dangle\n if (row._bold) {\n this.doc.font(this.boldFont);\n }\n }\n\n onRowAdded() {\n this.resetText();\n }\n\n renderPatientInfo() {\n const patientName = _.truncate(getPatientFullName(this.patient), { length: 32 });\n const patientBirthdate = formatBirthdate(this.patient);\n let patientMRN = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const xOffset = this.margins.left;\n const yOffset = this.margins.top;\n\n this.doc\n .lineWidth(1)\n .fontSize(10)\n .text(patientName, xOffset, yOffset, {\n lineGap: 2,\n });\n\n const patientNameWidth = this.doc.widthOfString(patientName);\n const patientDOB = t('DOB: {{birthdate}}', { birthdate: patientBirthdate });\n\n this.doc\n .fontSize(10)\n .text(patientDOB);\n\n const patientBirthdayWidth = this.doc.widthOfString(patientDOB);\n this.patientInfoBox.height = this.doc.y;\n\n let patientMRNWidth = 0;\n\n if (patientMRN) {\n if (patientMRN.length > 15) {\n patientMRN = `${patientMRN.slice(0, 5)}\\u2026${patientMRN.slice(-7)}`;\n }\n\n const patientMRNText = t('MRN: {{mrn}}', { mrn: patientMRN });\n\n this.doc\n .moveDown(0.15)\n .fontSize(10)\n .text(patientMRNText);\n\n patientMRNWidth = this.doc.widthOfString(patientMRNText);\n this.patientInfoBox.height = this.doc.y;\n }\n\n this.patientInfoBox.width = _.max([patientNameWidth, patientBirthdayWidth, patientMRNWidth]);\n\n // Render the divider between the patient info and title\n const padding = 10;\n\n this.doc\n .moveTo(this.margins.left + this.patientInfoBox.width + padding, this.margins.top)\n .lineTo(this.margins.left + this.patientInfoBox.width + padding, this.patientInfoBox.height)\n .stroke('black');\n\n this.dividerWidth = padding * 2 + 1;\n }\n\n renderTitle() {\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n const xOffset = this.margins.left + this.patientInfoBox.width + 21;\n const yOffset = (\n this.margins.top + ((this.patientInfoBox.height - this.margins.top) / 2 - (lineHeight / 2))\n );\n\n const title = this.currentPageIndex === 0\n ? this.title\n : t('{{title}} (cont.)', { title: this.title });\n\n this.doc.text(title, xOffset, yOffset);\n this.titleWidth = this.doc.widthOfString(title);\n }\n\n renderDateText(dateText = '') {\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n\n // Calculate the remaining available width so we can\n // center the print text between the patient/title text and the logo\n const availableWidth = this.doc.page.width - _.reduce([\n this.patientInfoBox.width,\n this.dividerWidth,\n this.titleWidth,\n this.logoWidth,\n this.margins.left,\n this.margins.right,\n ], (a, b) => (a + b), 0);\n\n const xOffset = (\n this.margins.left + this.patientInfoBox.width + this.dividerWidth + this.titleWidth\n );\n const yOffset = (\n this.margins.top + ((this.patientInfoBox.height - this.margins.top) / 2 - (lineHeight / 2))\n );\n\n this.doc\n .fontSize(10)\n .text(dateText, xOffset, yOffset + 2.5, {\n width: availableWidth,\n align: 'center',\n });\n }\n\n renderLogo() {\n this.logoWidth = 100;\n const xOffset = this.doc.page.width - this.logoWidth - this.margins.right;\n const yOffset = this.margins.top + 5;\n\n this.doc.image(logo, xOffset, yOffset, { width: this.logoWidth });\n }\n\n renderDebugGrid() {\n const minorLineColor = '#B8B8B8';\n const numMinorLines = 5;\n let thisLineYPos = this.margins.top;\n while (thisLineYPos <= (this.bottomEdge)) {\n this.doc.moveTo(this.margins.left, thisLineYPos)\n .lineTo(this.rightEdge, thisLineYPos)\n .lineWidth(0.25)\n .stroke('red');\n if (thisLineYPos !== this.bottomEdge) {\n for (let i = 1; i < numMinorLines + 1; ++i) {\n const innerLinePos = thisLineYPos + this.dpi * (i / (numMinorLines + 1));\n this.doc.moveTo(this.margins.left, innerLinePos)\n .lineTo(this.rightEdge, innerLinePos)\n .lineWidth(0.05)\n .stroke(minorLineColor);\n }\n }\n thisLineYPos += this.dpi;\n }\n\n let thisLineXPos = this.margins.left;\n while (thisLineXPos <= (this.rightEdge)) {\n this.doc.moveTo(thisLineXPos, this.margins.top)\n .lineTo(thisLineXPos, this.bottomEdge)\n .lineWidth(0.25)\n .stroke('red');\n for (let i = 1; i < numMinorLines + 1; ++i) {\n const innerLinePos = thisLineXPos + this.dpi * (i / (numMinorLines + 1));\n if (innerLinePos <= this.rightEdge) {\n this.doc.moveTo(innerLinePos, this.margins.top)\n .lineTo(innerLinePos, this.bottomEdge)\n .lineWidth(0.05)\n .stroke(minorLineColor);\n }\n }\n thisLineXPos += this.dpi;\n }\n\n return this;\n }\n\n renderHeader(dateText) {\n this.renderPatientInfo();\n\n this.renderTitle();\n\n this.renderLogo();\n\n this.renderDateText(dateText);\n\n this.doc.moveDown();\n\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n const height = lineHeight * 0.25 + this.patientInfoBox.height;\n this.doc\n .moveTo(this.margins.left, height)\n .lineTo(this.margins.left + this.width, height)\n .stroke('black');\n\n // TODO: remove this; it is just for exposing/debugging the chartArea.topEdge adjustment\n if (this.debug) {\n this.doc\n .fillColor('#E8E8E8', 0.3333333333)\n .rect(this.margins.left, this.margins.top, this.width, lineHeight * 4)\n .fill();\n }\n\n return this;\n }\n\n renderFooter() {\n this.doc.fontSize(this.footerFontSize);\n\n const helpText = t('Questions or feedback? Please email support@tidepool.org' +\n ' or visit support.tidepool.org.');\n\n const printDateText = `Printed on: ${formatCurrentDate()}`;\n const printDateWidth = this.doc.widthOfString(printDateText);\n\n const pageCountWidth = this.doc.widthOfString('Page 1 of 1');\n\n const xPos = this.margins.left;\n const yPos = (this.height + this.margins.top) - this.doc.currentLineHeight() * 1.5;\n const innerWidth = (this.width) - printDateWidth - pageCountWidth;\n\n this.doc\n .fillColor(this.colors.lightGrey)\n .fillOpacity(1)\n .text(printDateText, xPos, yPos)\n .text(helpText, xPos + printDateWidth, yPos, {\n width: innerWidth,\n align: 'center',\n });\n\n this.setFill();\n\n return this;\n }\n\n static renderPageNumbers(doc) {\n const pageCount = doc.bufferedPageRange().count;\n let page = 0;\n while (page < pageCount) {\n page++;\n doc.switchToPage(page - 1);\n doc.fontSize(FOOTER_FONT_SIZE).fillColor('#979797').fillOpacity(1);\n doc.text(\n t('Page {{page}} of {{pageCount}}', { page, pageCount }),\n MARGINS.left,\n (HEIGHT + MARGINS.top) - doc.currentLineHeight() * 1.5,\n { align: 'right' }\n );\n }\n }\n\n renderSVGImage(svgDataURL = '', x, y, width, height) {\n const svgDataURLArr = svgDataURL.split(',');\n const rawChartSVG = decodeURIComponent(svgDataURLArr[1]);\n this.addSVG(rawChartSVG, x, y, { assumePt: true, width, height });\n }\n\n setFooterSize() {\n this.doc.fontSize(this.footerFontSize);\n const lineHeight = this.doc.currentLineHeight();\n this.chartArea.bottomEdge = this.chartArea.bottomEdge - lineHeight * 3;\n\n return this;\n }\n\n setHeaderSize() {\n this.doc.fontSize(this.headerFontSize);\n const lineHeight = this.doc.currentLineHeight();\n this.chartArea.topEdge = this.chartArea.topEdge + lineHeight * 4;\n\n return this;\n }\n}\n\nexport default PrintView;\n","import arrayWithHoles from \"./arrayWithHoles\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit\";\nimport nonIterableRest from \"./nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n return;\n }\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nexport default function _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","module.exports = require(\"d3-format\");","module.exports = require(\"sundial\");","/*\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\n/**\n * getPatientFullName\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} PwD's full name (first & last)\n */\nexport function getPatientFullName(patient) {\n const profile = _.get(patient, ['profile'], {});\n const patientInfo = profile.patient || {};\n\n if (patientInfo.isOtherPerson) {\n return patientInfo.fullName;\n }\n return profile.fullName;\n}\n","import superPropBase from \"./superPropBase\";\nexport default function _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}","import getPrototypeOf from \"./getPrototypeOf\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\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 */\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport * as data from './data';\nimport { pumpVocabulary, AUTOMATED_DELIVERY } from '../constants';\n\nconst t = i18next.t.bind(i18next);\n\n/**\n * basalSchedules\n * @param {Object} settings object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function basalSchedules(settings) {\n return data.getScheduleNames(settings.basalSchedules);\n}\n\n/**\n * deviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function deviceMeta(settings, timePrefs) {\n return data.getDeviceMeta(settings, timePrefs);\n}\n\n/**\n * bolusTitle\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n *\n * @return {String} bolus title for given manufacturer\n */\nexport function bolusTitle(manufacturer) {\n const BOLUS_SETTINGS_LABEL_BY_MANUFACTURER = {\n animas: t('ezCarb ezBG'),\n insulet: t('Bolus Calculator'),\n medtronic: t('Bolus Wizard'),\n microtech: t('Bolus Calculator'),\n };\n return BOLUS_SETTINGS_LABEL_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * scheduleLabel\n * @private\n */\nfunction scheduleLabel(scheduleName, activeScheduleName, manufacturer, noUnits) {\n return data.getScheduleLabel(scheduleName, activeScheduleName, manufacturer, noUnits);\n}\n\n/**\n * basalRows\n * @private\n */\nfunction basalRows(schedule, settings) {\n return data.processBasalRateData(settings.basalSchedules[schedule]);\n}\n\n/**\n * basalColumns\n * @private\n */\nfunction basalColumns() {\n return data.startTimeAndValue('rate');\n}\n\n/**\n * basal\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @return {Object} object with basal title, columns and rows\n */\nexport function basal(schedule, settings, manufacturer) {\n const name = settings.basalSchedules[schedule].name;\n const lookupKey = (manufacturer === 'carelink') ? 'medtronic' : manufacturer;\n\n const isAutomated = _.get(pumpVocabulary, [\n data.deviceName(lookupKey),\n AUTOMATED_DELIVERY,\n ]) === name;\n\n return {\n scheduleName: name,\n activeAtUpload: (name === settings.activeSchedule),\n isAutomated,\n title: scheduleLabel(name, settings.activeSchedule, manufacturer, isAutomated),\n columns: isAutomated ? [] : basalColumns(),\n rows: isAutomated ? [] : basalRows(schedule, settings),\n };\n}\n\n/**\n * sensitivityTitle\n * @private\n */\nfunction sensitivityTitle(manufacturer) {\n const ISF_BY_MANUFACTURER = {\n animas: t('ISF'),\n insulet: t('Correction factor'),\n medtronic: t('Sensitivity'),\n microtech: t('Insulin Sensitivity'),\n };\n return ISF_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * sensitivityColumns\n * @private\n */\nfunction sensitivityColumns() {\n return data.startTimeAndValue('amount');\n}\n\n/**\n * sensitivityRows\n * @private\n */\nfunction sensitivityRows(settings, units) {\n return data.processSensitivityData(\n settings.insulinSensitivity,\n units,\n );\n}\n\n/**\n * sensitivity\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @return {Object} object with sensitivity title, columns and rows\n */\nexport function sensitivity(settings, manufacturer, units) {\n return {\n title: sensitivityTitle(manufacturer),\n columns: sensitivityColumns(),\n rows: sensitivityRows(settings, units),\n };\n}\n\n/**\n * ratioTitle\n * @private\n */\nfunction ratioTitle(manufacturer) {\n const CARB_RATIO_BY_MANUFACTURER = {\n animas: t('I:C Ratio'),\n insulet: t('IC ratio'),\n medtronic: t('Carb Ratios'),\n microtech: t('Carbohydrate Ratio'),\n };\n return CARB_RATIO_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * ratioColumns\n * @private\n */\nfunction ratioColumns() {\n return data.startTimeAndValue('amount');\n}\n\n/**\n * ratioRows\n * @private\n */\nfunction ratioRows(settings) {\n return data.processCarbRatioData(settings.carbRatio);\n}\n\n/**\n * ratio\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @return {Object} object with ratio title, columns and rows\n */\nexport function ratio(settings, manufacturer) {\n return {\n title: ratioTitle(manufacturer),\n columns: ratioColumns(),\n rows: ratioRows(settings),\n };\n}\n\n/**\n * targetTitle\n * @private\n */\nfunction targetTitle(manufacturer) {\n const BG_TARGET_BY_MANUFACTURER = {\n animas: t('BG Target'),\n insulet: t('Target BG'),\n medtronic: t('BG Target'),\n microtech: t('Target BG'),\n };\n return BG_TARGET_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * targetColumns\n * @private\n */\nfunction targetColumns(manufacturer) {\n const BG_TARGET_COLS_BY_MANUFACTURER = {\n animas: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Target') },\n { key: 'columnThree', label: t('Range') },\n ],\n insulet: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Target') },\n { key: 'columnThree', label: t('Correct Above') },\n ],\n medtronic: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Low') },\n { key: 'columnThree', label: t('High') },\n ],\n microtech: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Lower') },\n { key: 'columnThree', label: t('Upper') },\n ],\n };\n return BG_TARGET_COLS_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * targetRows\n * @private\n */\nfunction targetRows(settings, units, manufacturer) {\n const BG_TARGET_ACCESSORS_BY_MANUFACTURER = {\n animas: { columnTwo: 'target', columnThree: 'range' },\n insulet: { columnTwo: 'target', columnThree: 'high' },\n medtronic: { columnTwo: 'low', columnThree: 'high' },\n microtech: { columnTwo: 'low', columnThree: 'high' },\n };\n return data.processBgTargetData(\n settings.bgTarget,\n units,\n BG_TARGET_ACCESSORS_BY_MANUFACTURER[manufacturer],\n );\n}\n\n/**\n * target\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @return {Object} object with target title, columns and rows\n */\nexport function target(settings, manufacturer, units) {\n return {\n title: targetTitle(manufacturer),\n columns: targetColumns(manufacturer),\n rows: targetRows(settings, units, manufacturer),\n };\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 */\nimport * as data from './data';\n\n/**\n * basalSchedules\n * @param {Object} settings object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function basalSchedules(settings) {\n return data.getTimedSchedules(settings.basalSchedules);\n}\n\n/**\n * deviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function deviceMeta(settings, timePrefs) {\n return data.getDeviceMeta(settings, timePrefs);\n}\n\n/**\n * scheduleLabel\n * @private\n */\nfunction scheduleLabel(scheduleName, activeScheduleName) {\n return data.getScheduleLabel(scheduleName, activeScheduleName, 'tandem', true);\n}\n\n/**\n * basalRows\n * @private\n */\nfunction basalRows(schedule, settings, units) {\n return data.processTimedSettings(\n settings,\n schedule,\n units,\n );\n}\n\n/**\n * basalColumns\n * @private\n */\nfunction basalColumns(styles = {}, units) {\n return [\n { key: 'start',\n label: 'Start time' },\n { key: 'rate',\n label: {\n main: 'Basal Rates',\n secondary: 'U/hr',\n },\n className: styles.basalScheduleHeader },\n { key: 'bgTarget',\n label: {\n main: 'Target BG',\n secondary: units,\n },\n className: styles.bolusSettingsHeader },\n { key: 'carbRatio',\n label: {\n main: 'Carb Ratio',\n secondary: 'g/U',\n },\n className: styles.bolusSettingsHeader },\n { key: 'insulinSensitivity',\n label: {\n main: 'Correction Factor',\n secondary: `${units}/U`,\n },\n className: styles.bolusSettingsHeader },\n ];\n}\n\n/**\n * basal\n *\n * @param {Object} schedule object schedule to build basal data from\n * @param {Object} settings object with pump settings data\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @param {String} styles object with applicable styles\n * @return {Object} object with basal title, columns and rows\n */\nexport function basal(schedule, settings, units, styles = {}) {\n return {\n scheduleName: schedule.name,\n activeAtUpload: (schedule.name === settings.activeSchedule),\n title: scheduleLabel(schedule.name, settings.activeSchedule),\n columns: basalColumns(styles, units),\n rows: basalRows(schedule, settings, units),\n };\n}\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"react\"","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack:///./src/modules/print/utils/AGPConstants.js","webpack:///external \"text-table\"","webpack:///./src/utils/datetime.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack:///./node_modules/babel-preset-react-app/node_modules/regenerator-runtime/runtime.js","webpack:///./src/modules/print/utils/AGPUtils.js","webpack:///./src/utils/basics/data.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack:///external \"i18next\"","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack:///./src/modules/print/images/tidepool-logo-408x46.png","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack:///./src/utils/bloodglucose.js","webpack:///./src/utils/format.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./src/utils/device.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./src/utils/stat.js","webpack:///./src/utils/settings/data.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/objectSpread.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///external \"d3-array\"","webpack:///external \"moment-timezone\"","webpack:///./src/modules/print/index.js","webpack:///external \"bluebird\"","webpack:///external \"voilab-pdf-table\"","webpack:///./node_modules/voilab-pdf-table/plugins/fitcolumn.js","webpack:///./node_modules/svg-to-pdfkit/source.js","webpack:///./src/modules/print/BasicsPrintView.js","webpack:///./src/modules/print/images/sitechange-cannula.png","webpack:///./src/modules/print/images/sitechange-reservoir.png","webpack:///./src/modules/print/images/sitechange-tubing.png","webpack:///./src/modules/print/DailyPrintView.js","webpack:///./src/modules/render/basal.js","webpack:///./src/modules/render/bolus.js","webpack:///./src/utils/print/data.js","webpack:///./src/modules/print/BgLogPrintView.js","webpack:///./src/modules/print/SettingsPrintView.js","webpack:///./src/modules/print/AGPPrintView.js","webpack:///./src/modules/print/images/capturAGP-logo.png","webpack:///external \"moment\"","webpack:///external \"lodash\"","webpack:///external \"d3-scale\"","webpack:///./src/utils/text/TextUtil.js","webpack:///./src/utils/bolus.js","webpack:///./src/utils/basal.js","webpack:///./src/modules/print/utils/constants.js","webpack:///./src/utils/constants.js","webpack:///external \"d3-time-format\"","webpack:///./src/modules/print/PrintView.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/typeof.js","webpack:///external \"d3-format\"","webpack:///external \"sundial\"","webpack:///./src/utils/misc.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/get.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/superPropBase.js","webpack:///./src/utils/settings/nonTandemData.js","webpack:///./src/utils/settings/tandemData.js","webpack:///(webpack)/buildin/module.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","_typeof","_getRequireWildcardCache","WeakMap","cache","obj","default","has","newObj","hasPropertyDescriptor","getOwnPropertyDescriptor","desc","set","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","arguments","apply","err","undefined","__webpack_exports__","_lodash","_interopRequireDefault","_i18next","_constants","i18next","_","init","returnEmptyString","nsSeparator","AGP_FOOTER_Y_PADDING","DPI","AGP_SECTION_HEADER_HEIGHT","AGP_SECTION_DESCRIPTION_HEIGHT","text","reportHeader","reportSubHeader","reportFooter","reportInsuffienctData","timeInRanges","title","subtitle","reportInfo","dob","mrn","glucoseMetrics","averageGlucose","label","goal","mgdl","mmoll","glucoseManagementIndicator","coefficientOfVariation","subLabel","ambulatoryGlucoseProfile","description","targetRange","insufficientData","dailyGlucoseProfiles","bgRanges","veryHigh","high","target","low","veryLow","goals","highCombined","lowCombined","subLabels","TIRtarget","TIRminutes","section","values","ticks","summaries","bgUnits","labels","hourlyTicks","bgTicks","percentileTicks","timeTicks","weekdayTicks","calendarDates","black","colors","bg","dailyProfileBg","hour","percentile","line","range","dailyProfileTarget","divider","white","lightGrey","mediumGrey","darkGrey","background","shaded","bgRange","lowShaded","highShaded","empty","median","interQuartile","outerQuantile","fill","utc","timezoneName","length","localized","moment","tz","hrsToMs","hours","minToMs","minutes","secToMs","seconds","ms","milliseconds","utcHammertime","Date","parse","zone","utcOffset","patient","bday","_d3TimeFormat","utcFormat","format","isNull","isUndefined","TWENTY_FOUR_HRS","Error","timeFormat","diagnosis","startDate","endDate","dateParseFormat","monthFormat","start","end","startFormat","isSame","concat","endFormat","duration","opts","momentDuration","days","QUARTER","ascii","THIRD","HALF","TWO_THIRDS","THREE_QUARTERS","condensed","formatted","roundedMinutes","roundedHours","roundedDays","trim","suffix","timePrefs","timezone","getTimezoneFromTimePrefs","startOfDay","startOf","valueOf","toDate","add","_momentTimezone","_sundial","getBrowserTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","timezoneAware","sundial","checkTimezoneName","_defineProperty","configurable","writable","runtime","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","context","Context","_invoke","state","GenStateSuspendedStart","method","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","forEach","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","result","__await","unwrapped","TypeError","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","constructor","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","iter","toString","keys","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","Function","_AGPConstants","_format","_datetime","_bloodglucose","_constants2","_moment","boldText","textString","String","chartScaleToPixels","paperPixelDimension","scaleValue","pixelsToChartScale","pixels","pointsToPixels","points","createAnnotation","options","defaultsDeep","arrowside","font","color","family","AGP_FONT_FAMILY","showarrow","calculateDataSufficiency","_data$data","_data$data$current","_data$data2","_data$data2$current","_data$data2$current$s","data","statsByDate","current","aggregationsByDate","_ref2","stats","sensorUsage","cgmDaysWorn","count","newestDatum","sampleFrequency","sensorUsageAGP","sufficiencyBySection","hoursOfCGMData","MS_IN_HOUR","sufficencyMet","cgmCalendarDays","map","max","val","index","time","subtract","sensorUsageByDate","date","_statsByDate$date","_ref3","countForDate","sampleFrequencyForDate","_ref3$newestDatum","newestDatumForDate","_ref3$oldestDatum","oldestDatum","oldestDatumForDate","sufficiencyMet","minCount","maxPossibleReadings","bankersRound","MS_IN_DAY","msPer24","sufficientDays","filter","topSevenSufficientDays","orderBy","topSevenDaysSensorUsageMean","meanBy","reportInfoAndMetricsWidth","chartRenderAreaTop","rightEdge","MARGINS","left","WIDTH","chartRenderAreaBottom","top","HEIGHT","bottom","sectionGap","sections","dataSufficiency","x","y","width","height","bordered","sufficientData","dailyGlucoseProfilesHeight","stat","bgPrefs","chartAreaWidth","chartAreaHeight","AGP_SECTION_BORDER_RADIUS","plotMarginX","plotMarginTop","plotMarginBottom","paperWidth","paperHeight","barWidth","yScale","xScale","statTotal","_bgPrefs$bgBounds","_bgPrefs$bgBounds2","_bgPrefs$bgBounds3","_bgPrefs$bgBounds4","rawCounts","statDatums","id","chartData","reduce","res","datum","toNumber","renderedValue","AGP_TIR_MIN_HEIGHT","rawById","raw","rendered","yScaleCorrection","last","marker","bgBounds","veryLowThreshold","targetLowerBound","targetUpperBound","veryHighThreshold","tick","align","size","fontSizes","formatBgValue","xanchor","xshift","yanchor","getBracketPosValues","posX","posX2","posY","posY2","minBracketYOffSet","isNumber","maxSubBracketYOffset","subBracketXOffset","subBracketYOffset","min","targetBracketAllowedYRange","barSeparatorPixelWidth","bracketYPos","bracketXExtents","bracketPos","_toConsumableArray2","brackets","pos","path","radiusX","radiusY","join","createBracketSVG","yref","leaderYPos","leaderXExtents","leaderPos","leaders","isLowLeader","rangePosY","rangeLabels","rangeValues","formatPercentage","rangeSummaryPosY","combinedRangeSummaryValues","rangeSummaryValues","yshift","goalsPos","_objectSpread10","subLabelsPos","xref","rangeAnnotations","lowSummary","highSummary","layout","barmode","showlegend","margin","b","xaxis","showgrid","showline","showticklabels","zeroline","yaxis","annotations","shapes","cbgData","plotMarginY","_bgPrefs$bgBounds5","_bgPrefs$bgBounds6","_bgPrefs$bgBounds7","_bgPrefs$bgBounds8","yClamp","MGDL_UNITS","AGP_BG_CLAMP_MGDL","AGP_BG_CLAMP_MMOLL","mungeBGDataBins","ONE_HR","AGP_LOWER_QUANTILE","AGP_UPPER_QUANTILE","quantileKeys","firstDatum","lastDatum","smoothedChartData","_chartData","_chartData2","curr","sum","smoothDatum","firstSmoothedDatum","lastSmoothedDatum","unshift","msX","quantileBand","upperKey","lowerKey","fillcolor","simplify","shape","smoothing","bgTickAnnotations","isTarget","includes","bgTargetMarkers","posXLeft","posYTop","posYBottom","createbgTargetMarkerSVG","xsizemode","ysizemode","bgGridLines","isClamp","isZero","layer","x0","x1","y0","y1","percentileLabels","percentileTickYPositions","percentileTickShiftedYPositions","medianYPos","minGap","percentileTickYShifts","shiftedYPos","percentileTickAnnotations","visible","percentileTickLines","quarterDayTicks","hourlyTicksAnnotations","yAxes","each","yAxis","domain","linecolor","mirror","gridcolor","tickvals","xaxis2","overlaying","tickcolor","ticklen","axis","mean","dateLabelFormat","plotHeight","_bgPrefs$bgBounds9","_bgPrefs$bgBounds10","halfDayTicks","halfDayTickAnnotations","calendarDays","flatten","calendarDayAnnotations","combinedData","dayData","isLow","first","fillYExentRangeIndex","textangle","manufacturer","pumpUpload","bgLabels","generateBgRangeLabels","upperFirst","deviceLabels","_device","getPumpVocabulary","dimensions","summaryTitle","perRow","primary","automatedLabel","AUTOMATED_DELIVERY","hideEmpty","AUTOMATED_SUSPEND","_dimensions","average","percentage","selectorIndex","isAutomatedBolusDevice","firstDay","day","dow","aggregations","aggregationData","cloneDeep","hasDataInRange","processedData","summary","byDate","aggregation","disabled","_aggregationData$type","_aggregationData$type2","hasBasal","basal","hasAutomatedSuspend","automatedSuspend","_aggregationData$type3","_aggregationData$type4","hasSMBG","smbg","hasCalibrations","calibration","source","getSiteChangeSource","SITE_CHANGE_TYPE_UNDECLARED","subTitle","getSiteChangeSourceLabel","emptyText","aggregationKey","getEmptyText","rangeStartDate","rangeEndDate","currentDate","endOf","dateObj","timestamp","isInteger","_data$data$aggregatio","_data$data$current$en","endpoints","metaData","query","textUtil","utils","TextUtil","basicsString","buildDocumentHeader","buildDocumentDates","buildTextLine","statsText","getSummaryTableData","statData","header","rows","dimension","pathValue","split","Math","round","columns","fingersticks","buildTextTable","showHeader","boluses","siteChanges","infusionSiteData","siteChangeSource","valuesIn","daysSince","getSiteChangesTableData","basals","devices","_ref","_metaData$matchedDevi","matchedDevices","textLines","_TextUtil","_stat","reshapeBgClassesToBgBounds","settings","ANIMAS","MEDTRONIC","TANDEM","lowerCase","allowedSources","SITE_CHANGE_CANNULA","SITE_CHANGE_TUBING","INSULET","MICROTECH","SITE_CHANGE_RESERVOIR","fallbackSubtitle","pumpVocabulary","_classCallCheck","instance","Constructor","_getPrototypeOf","_defineProperties","props","descriptor","_createClass","protoProps","staticProps","_possibleConstructorReturn","_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__","_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__","_setPrototypeOf","_inherits","subClass","superClass","bgValue","classificationType","isEmpty","gt","MGDL_PER_MMOLL","bgClasses","DEFAULT_BG_BOUNDS","clampThreshold","thresholds","mapValues","threshold","segmented","prefix","bgDatum","outOfRangeAnnotation","find","annotation","code","_defineProperty2","total","datumWeight","deviceId","indexOf","MS_IN_MIN","bgType","binSize","outerQuantiles","binned","groupBy","findBinForTimeOfDay","outOfRanges","findOutOfRangeAnnotations","binKeys","_d3Array","binCalculator","calculateSmbgStatsForBin","calculateCbgStatsForBin","valueExtractor","mungedData","determineRangeBoundaries","outOfRange","lowThresholds","highThresholds","boundaries","floor","isOutOfRangeAnnotation","eventsAnnotatedAsOutOfRange","some","pick","uniqBy","binKey","_outerQuantiles","_slicedToArray2","_outerQuantiles$","lowerQuantile","_outerQuantiles$2","upperQuantile","sorted","sortBy","centerOfBinMs","parseInt","quantile","firstQuartile","thirdQuartile","msFrom","msTo","outOfRangeThresholds","useAGPFormat","units","lowThreshold","highThreshold","MMOLL_UNITS","convertToMmolL","BG_LOW","BG_HIGH","toFixed","_d3Format","decimalLength","qtyString","formatDecimalNumber","precision","Number","replace","pow","abs","places","_assertThisInitialized","ReferenceError","uploadData","findLast","deviceTags","basalData","lastManualBasal","deliveryType","pumpSettings","deviceModel","AUTOMATED_BASAL_DEVICE_MODELS","_data","deviceName","vocabulary","defaults","formatFn","formatDatum","statsString","_stat$data","_stat$data$raw","renderTable","commonStats","timeInRange","readingsInRange","totalInsulin","timeInAuto","timeInOverride","bgExtents","renderSecondaryValue","forcePlainTextValues","statTitle","dataFormat","formattedText","secondary","tooltip","legendTitle","dataPaths","isArray","compact","_react","dailyDoseUnitOptions","statTypes","barHorizontal","barBg","input","simple","statBgSourceLabels","cbg","statFormats","bgCount","cv","carbs","gmi","standardDevRange","standardDevValue","unitsPerKg","averageDailyDose","standardDev","statFetchMethods","_statFetchMethods","getSum","ensureNumeric","isNil","parseFloat","deviation","lowerValue","lowerColorId","upperValue","upperColorId","emptyDataPlaceholder","disableStat","classifyBgValue","isPlainObject","grams","exchanges","_value","classifyCvValue","formatDuration","createElement","style","BG_COLORS","LBS_PER_KG","isFinite","getStatAnnotations","bgSource","bgStats","bgSourceLabel","smbgLabel","cbgLabel","overrideLabel","SETTINGS_OVERRIDE","getStatData","_objectSpread3","suffixValue","inputValue","output","dividend","bgMax","bgMin","glucoseManagementIndicatorAGP","summaryAGP","findIndex","standardDeviation","automated","manual","scheduledLabel","SCHEDULED_DELIVERY","PHYSICAL_ACTIVITY","SLEEP","durations","bolus","getStatTitle","collapsible","alwaysShowSummary","alwaysShowTooltips","tooltipTitle","legend","hideSummaryUnits","reverseLegendOrder","animas","insulet","medtronic","tandem","microtech","scheduleName","activeName","deviceKey","noUnits","part","main","settingsData","keysIn","names","schedules","position","normalTime","uploadedTime","datetime","formatLocalizedFromUTC","schedule","activeSchedule","uploaded","serial","deviceSerialNumber","scheduleData","starts","getStarts","noRateData","rate","getBasalRate","startTime","formatClocktimeFromMsPer24","getTotalBasalRates","targetsData","columnTwo","getBloodGlucoseValue","columnThree","carbRatioData","amount","getValue","sensitivityData","bgTargets","basalSchedules","bgTarget","carbRatio","carbRatios","insulinSensitivity","insulinSensitivities","valueKey","maxBasal","maxBolus","insulinDurationUnits","insulinDuration","durationInHours","minutesRemainder","padStart","setting","MAX_BASAL","MAX_BOLUS","INSULIN_DURATION","shift","_interopRequireWildcard","DISPLAY_PRECISION_PLACES","noData","fieldName","timedData","hrs","_objectSpread","_defineProperty__WEBPACK_IMPORTED_MODULE_0__","ownKeys","getOwnPropertySymbols","sym","_toConsumableArray","arr","Array","arr2","_arrayWithoutHoles","from","_iterableToArray","_nonIterableSpread","_bluebird","_PrintView","_BasicsPrintView","_DailyPrintView","_BgLogPrintView","_SettingsPrintView","_AGPPrintView","constants","PDFDocument","PDFDocumentStub","_classCallCheck2","blobStream","PrintView","BasicsPrintView","DailyPrintView","BgLogPrintView","SettingsPrintView","AGPPrintView","createPrintView","doc","Renderer","svgDataURLS","renderOpts","debug","defaultFontSize","DEFAULT_FONT_SIZE","dpi","footerFontSize","FOOTER_FONT_SIZE","headerFontSize","HEADER_FONT_SIZE","margins","smallFontSize","SMALL_FONT_SIZE","assign","chartsPerPage","summaryHeaderFontSize","summaryWidthAsPercentage","createPrintPDFPackage","_opts$basics","basics","_opts$daily","daily","_opts$bgLog","bgLog","_opts$settings","_opts$agp","agp","changeLanguage","preferences","displayLanguageCode","pdfOpts","_asyncToGenerator2","_regenerator","_callee","DocLib","streamLib","stream","_context","autoFirstPage","bufferPages","MARGIN","pipe","render","renderPageNumbers","on","pdf","blob","toBlob","url","toBlobURL","_x","_x2","lodash","PdfTableFitColumn","conf","merge","column","maxWidth","calculatedWidth","clone","configure","table","onBodyAdd","setWidth","onColumnAdded","onColumnPropertyChanged","reinitWidth","prop","resetWidth","page","content_width","sumBy","getColumns","right","setColumnWidth","svg","NamedColors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","DefaultColors","transparent","Entities","quot","amp","lt","apos","OElig","oelig","Scaron","scaron","Yuml","circ","tilde","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","permil","lsaquo","rsaquo","euro","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","fnof","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","bull","hellip","prime","Prime","oline","frasl","weierp","image","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","exist","nabla","isin","notin","ni","prod","minus","lowast","radic","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams","PathArguments","A","a","C","H","h","L","M","Q","q","S","T","V","v","Z","z","PathFlags","A3","A4","a3","a4","Properties","inherit","initial","visibility","hidden","collapse","stroke","stop-color","fill-opacity","stroke-opacity","stop-opacity","fill-rule","nonzero","evenodd","clip-rule","stroke-width","stroke-dasharray","stroke-dashoffset","stroke-miterlimit","stroke-linejoin","miter","bevel","stroke-linecap","butt","square","font-size","xx-small","x-small","small","medium","large","x-large","xx-large","font-family","font-weight","600","700","800","900","bold","bolder","500","400","300","200","100","normal","lighter","font-style","italic","oblique","text-anchor","middle","direction","ltr","rtl","dominant-baseline","auto","baseline","before-edge","text-before-edge","central","after-edge","text-after-edge","ideographic","alphabetic","hanging","mathematical","alignment-baseline","baseline-shift","super","word-spacing","letter-spacing","text-decoration","none","underline","overline","line-through","xml:space","css","preserve","pre","pre-line","pre-wrap","nowrap","marker-start","marker-mid","marker-end","opacity","transform","display","inline","block","clip-path","mask","overflow","scroll","docBeginGroup","bbox","group","_groupCount","resources","ref","xobj","Type","Subtype","FormType","BBox","Group","CS","I","K","Resources","write","savedMatrix","_ctm","savedPage","groupStack","fonts","xobjects","ext_gstates","patterns","docEndGroup","Font","XObject","ExtGState","Pattern","docInsertGroup","addContent","docApplyMask","clip","_maskCount","gstate","CA","ca","BM","SMask","G","BC","docUsePattern","pattern","_patternCount","PatternType","PaintType","TilingType","dx","dy","XStep","YStep","Matrix","multiplyMatrix","matrix","ProcSet","temp","docBeginText","docSetTextMatrix","e","f","validateNumber","docSetTextMode","docWriteGlyph","glyph","docFillColor","fillOpacity","fillColor","docStrokeColor","strokeOpacity","strokeColor","parseXml","xml","SvgNode","tag","nodeName","nodeValue","nodeType","attributes","childNodes","parentNode","textContent","classList","getAttribute","attr","getElementById","recursive","node","getElementsByTagName","child","parser","StringParser","match","decodeEntities","warningCallback","matchAll","str","mt","m0","m1","m2","fromCharCode","parseColor","colorCallback","opacityToColor","isMask","newColor","newOpacity","multiply","transformPoint","getGlobalMatrix","ctm","getPageBBox","SvgShape","inverseMatrix","getBoundingBox","dt","validateMatrix","m3","m4","m5","isNotEqual","solveEquation","curve","isEqual","sqrt","getCurveValue","number","parseTranform","temp2","func","nums","parser2","matchNumber","matchSeparator","PI","cos","sin","parseAspectRatio","aspectRatio","availWidth","availHeight","elemWidth","elemHeight","initAlign","ratioType","xAlign","yAlign","scaleX","scaleY","Min","Mid","Max","parseStyleAttr","fontFamily","fontSize","fontStyle","fontWeight","fontVariant","parts","parseSelector","ids","classes","tags","specificity","parseStyleSheet","rule","rules","selectors","selector","matchesSelector","elem","combineArrays","array1","array2","getAscent","ascender","maxY","scale","getDescent","descender","minY","getTextPos","encoded","encode","hex","unicode","charCodeAt","advanceWidth","xOffset","yOffset","xAdvance","yAdvance","createSVGElement","inherits","SvgElemUse","SvgElemSymbol","SvgElemGroup","SvgElemLink","SvgElemSvg","SVGElemImage","SvgElemRect","SvgElemCircle","SvgElemEllipse","SvgElemLine","SvgElemPolyline","SvgElemPolygon","SvgElemPath","SvgElemText","SvgElemTspan","SvgElemTextPath","SvgElemTextNode","SvgElem","exp","all","substring","matchSpace","matchLengthUnit","LineSegment","p1x","p1y","p2x","p2y","totalLength","startPoint","atan2","endPoint","getPointAtLength","pathCommands","pathSegments","lastCom","lastCtrlX","lastCtrlY","startX","startY","currX","currY","move","segment","c1x","c1y","c2x","c2y","divisions","equationX","equationY","derivativeX","derivativeY","lengthMap","minX","maxX","rootsX","rootsY","l1","l2","close","addCommand","hasStart","hasEnd","cx","cy","rx","ry","fi","fa","fs","x2","y2","th1","th2","segms","ceil","th3","th4","endX","endY","command","Infinity","addBounds","bbox1","j","mergeShape","insertInDocument","moveTo","lineTo","bezierCurveTo","closePath","getSubPaths","subPaths","getMarkers","markers","subPath","subPathMarkers","startMarker","prevEndMarker","endMarker","styleCache","childrenCache","isOuterElement","stack","useCSS","getComputedStyle","specificities","styleRules","getStyle","allowedChildren","resolveUrl","file","svgObj","documentCallback","svgs","documentCache","isArrayLike","computeUnits","unit","percent","isFontSize","getViewport","em","ex","","px","pt","cm","mm","in","pc","computeLength","temp1","computeLengthList","strict","getLength","getLengthList","getUrl","getNumberList","getViewbox","viewBox","getPercent","chooseValue","keyInfo","parsed","fallbackColor","SvgElemGradient","SvgElemPattern","dasharray","getChildren","children","getParentVWidth","getVWidth","viewportWidth","getParentVHeight","getVHeight","viewportHeight","getParentViewport","getBoundingShape","SvgElemStylable","getTransformation","SvgElemClipPath","useMask","SvgElemMask","getFill","isClip","getPaint","getStroke","SvgElemHasChildren","childShape","drawChildren","drawInDocument","SvgElemContainer","drawContent","clipped","masked","save","restore","link","addLink","isText","w","Rect","Border","URI","links","docInsertLink","preserveAspectRatio","imageCallback","openImage","rect","translate","fallback","_attr","_getChildren","bBox","gOpacity","bBoxUnitsPattern","bBoxUnitsContent","aspectRatioMatrix","docCreatePattern","stopColor","grad","r2","bBoxUnits","spread","nAfter","nBefore","nTotal","multiplier","inv","corner1","corner2","corner3","corner4","linearGradient","radialGradient","offset","inOrder","_colorSpace","setTransform","SvgElemBasicShape","dashScale","lineWidth","lineCap","circle","dashArray","dashOffset","miterLimit","lineJoin","dash","phase","fillAndStroke","markerStart","markerMid","markerEnd","markersPos","SvgElemMarker","drawMarker","pathLength","posArray","strokeWidth","orient","rotate","refX","refY","SvgElemTextContainer","_pos","dx0","ascent","dy0","dx1","descent","dy1","dx2","dy2","drawTextInDocument","decorate","_font","fauxBold","childElem","skew","fauxItalic","linePosition","pathObject","pathScale","pathElem","textParentElem","currentAnchor","currentDirection","processedText","remainingText","textPaths","currentChunk","currentX","currentY","doAnchoring","anchordx","startltr","middleltr","endltr","startrtl","middlertl","endrtl","textOnPath","currentElem","textOffset","charMidX","pointOnPath","continuous","parentElem","_y","_dx","_dy","_rot","_defRot","fontOptions","fontNameorLink","fontCallback","_index","textLength","spacingAndGlyphs","wordSpacing","letterSpacing","textAnchor","textDirection","xHeight","getXHeight","getBaseline","words","rawText","renderedText","xAttr","yAttr","dxAttr","dyAttr","rotAttr","firstChar","lastChar","textScale","spaceDiff","adjustLength","pxToPt","assumePt","SVGElement","console","warn","_registeredFonts","styles","savedFillColor","_fillColor","_PrintView2","siteChangeCannulaImage","siteChangeReservoirImage","siteChangeTubingImage","siteChangeImages","_siteChangeImages","_this","_possibleConstructorReturn2","_getPrototypeOf2","processBasicsAggregations","defineBasicsAggregations","latestPumpUpload","renderCalendarCell","_assertThisInitialized2","addPage","initLayout","_get2","getDateRange","_this2","columnWidth","getActiveColumnWidth","calendar","findBasicsDays","generateCalendarDayLabels","headerHeight","renderer","headerBorder","headerPadding","padding","setLayoutColumns","chartArea","gutter","widths","renderStats","renderCalendars","RenderCalendarSummaries","goToPage","goToLayoutColumnPosition","renderAggregatedStats","initCalendar","renderCalendarSection","subText","siteChangesSubTitle","bottomMargin","renderCalendarSummary","_readingsInRange$data","_readingsInRange$data2","_this$stats","renderHorizontalBarStat","heading","note","secondaryFormatKey","renderSimpleStat","hasCarbGramsData","hasCarbExchangeData","_opts$height","_opts$labelWidth","labelWidth","_opts$valueWidth","valueWidth","_opts$statFont","statFont","_opts$statFontSize","statFontSize","_opts$valueFont","valueFont","boldFont","_opts$valueFontSize","valueFontSize","_opts$labelHeader","labelHeader","_opts$valueHeader","valueHeader","renderCustomTextCell","tableSettings","borderWidth","headerAlign","border","valign","tableColumns","defineStatColumns","setFill","showHeaders","_this3","primaryFormatKey","statHasData","renderTableHeading","columnDefaults","noteFontSize","moveDown","largeFontSize","secondaryValue","_fillStripe","_this4","_opts$bottomMargin","headingMoveDown","renderSectionHeading","renderEmptyText","isSiteChange","priorToFirstSiteChange","_ref$summary","chunkedDayMap","chunk","dateLabelMask","dayType","SITE_CHANGE","NO_SITE_CHANGE","dayOfWeek","week","headingHeight","heightOfString","headingYPos","currentYPos","pageIndex","currentPageIndex","rowHeight","bottomEdge","totalPages","topEdge","lockFillandStroke","unlockFillandStroke","tb","draw","_data$column$id","xPos","yPos","isExcludedBolusDay","extraSmallFontSize","gridHeight","gridWidth","siteChangeTypes","setStroke","isFirst","linePos","dotPos","daysSinceLabel","imageWidth","imagePadding","gridPos","renderCountGrid","resetText","_this5","renderCount","diameter","radius","grid","row","col","countArray","extrasArray","splice","colCount","gridSpaces","gridValues","space","chunkedGridValues","rowIndex","colIndex","dot","renderColumn","primaryDimension","valueObj","headerFont","zebra","headerFill","headerRenderer","_d3Scale","_basal","_bolus","_basal2","_bolus2","_this$pumpSettingsOve","isAutomatedBasalDevice","hasCarbExchanges","carbUnits","basalGroupLabels","pumpSettingsOverrideLabels","bgAxisFontSize","carbsFontSize","numDays","activeDays","bolusWidth","carbRadius","cbgRadius","markerRadius","extendedLineThickness","interruptedLineThickness","smbgRadius","triangleHeight","axes","delivered","extendedPath","extendedExpectationPath","extendedTriangle","extendedTriangleInterrupted","interrupted","overrideTriangle","programmed","undelivered","underride","underrideTriangle","carbExchanges","lightDividers","gapBtwnSummaryAndChartAsPercentage","leftEdge","initialChartArea","summaryArea","processBgRange","dataByDate","bolusRange","processBolusRange","basalRange","processBasalRange","dates","sort","selectedDates","chartsByDate","initialChartsByDate","dateData","bounds","utcBounds","getOffset","processBasalSequencesForDate","chartsPlaced","initialChartsPlaced","chartIndex","initialChartIndex","setHeaderSize","setFooterSize","calculateChartMinimums","calculateDateChartHeight","placeChartsOnPage","dateChart","makeScales","charts","chart","head","renderLegend","legendHeight","currentLineHeight","totalHeight","perChart","chartMinimums","notesEtc","bgEtcChart","bolusDetails","basalChart","belowBasal","paddingBelow","lineHeight","threeHrBinnedBoluses","getBolusFromInsulinEvent","threeHrBin","maxBolusStack","lines","insulinEvent","extended","expectedExtended","_this$chartMinimums","bolusDetailsHeight","totalGivenMaxBolusStack","minBolusDetails","chartHeight","_this$chartMinimums2","bgScaleYLimit","bgScale","scaleLinear","clamp","bolusScale","basalScale","_this$chartArea","totalChartHeight","startingIndexThisPage","chartsOnThisPage","limit","thisChartHeight","subType","renderSummary","renderXAxes","renderYAxes","renderCbgs","renderSmbgs","renderInsulinEvents","renderFoodCarbs","renderBolusDetails","renderBasalPaths","renderBasalRates","renderPumpSettingsOverrides","renderChartDivider","smallIndent","widthWithoutIndent","bgPrecision","statsData","forOwn","statType","getStatDefinition","_$get","totalCbgDuration","_$get4","totalBasal","totalBolus","update","lineGap","_this$bgBounds","upperTarget","lowerTarget","indent","continued","_primary","_secondary","ratioTitle","ratio","percentages","_$get5","totalBasalDuration","formattedCarbs","carbValues","carbSuffixes","_this$chartMinimums3","bottomOfBgEtcChart","bottomOfBolusDetails","bottomOfBasalChart","_ref4","threeHrLocs","bolusDetailPositions","bolusDetailWidths","renderedBounds","pickBy","bound","bgTick","undash","_this6","_ref5","cbgs","_this7","_ref6","smbgs","getOutOfRangeThreshold","widthOfString","labelStartX","labelEndX","lineBreak","_this8","_ref7","insulinEvents","paths","renderEventPath","getCarbs","carbFillColor","getWizardFromInsulinEvent","carbsX","carbsY","getMaxValue","_this9","_ref8","food","foodEvent","_this10","_ref9","topOfBolusDetails","grouped","binOfBoluses","groupWidth","groupXPos","displayTime","removeTrailingZeroes","getDelivered","normalPercentage","getNormalPercentage","extendedPercentage","getExtendedPercentage","durationText","getMaxDuration","percentagesText","_this11","currentSchedule","labeledSchedules","_this12","_ref10","_ref10$data","sequences","basalSequences","sequence","getBasalSequencePaths","basalType","basalAutomated","renderType","basalPathGroups","getBasalPathGroups","isAutomated","getBasalPathGroupType","wholeDateDeliveredPath","calculateBasalPath","endAtZero","flushBottomOffset","isFilled","startAtZero","flushWithBottomOfScale","_this13","_ref11","deviceEvent","overrideData","isFabricatedNewDayOverride","stitchedData","prevDatum","normalEnd","overrideStart","overrideEnd","bottomOfScale","overrideType","toUpperCase","_ref12","isLastChartOnPage","_this14","legendTop","legendVerticalMiddle","legendTextMiddle","legendItemLeftOffset","legendItemLabelOffset","cursor","vertOffsetAdjustments","pair","_pair","horizOffset","adjustedVertOffset","smbgPositions","bolusOpts","legendBolusYScale","normalBolusXScale","normalPaths","automatedPaths","rideBolusXScale","overridePaths","recommended","net","carb","correction","underridePaths","interruptedBolusXScale","interruptedPaths","expectedNormal","extendedBolusXScale","extendedPaths","carbsYPos","exchangesYPos","legendBasalYScale","legendBasalXScale","dynamicBasalType","scheduled1","negTemp","suppressed","scheduled2","posTemp","suspend","basalSequence","types","uniq","isString","discontinuousEnd","discontinuousStart","suppresseds","undeliveredType","_ref$flushBottomOffse","zeroBasal","handleDiscontinuousEnd","every","thisBasalY","handleDiscontinuousStart","bolusUtils","bolusBottom","bolusCenter","isNonTrivialUnderride","isUnderride","isNonTrivialOverride","isOverride","isInterruptedBolus","undeliveredY","edges","getBolusEdges","formatBolusRectPath","programmedY","getProgrammed","deliveredY","recommendedY","getRecommended","hasExtended","extendedVal","getExtended","triangleSize","halfTriangle","startOfTriangle","extendedY","interruptedExtended","startOfInterrupted","getDuration","halfInterrupted","bottomOfInterruptedLine","pathCopy","bolusHeight","halfWidth","bgs","extent","_dateData$basal","nextBasal","getBasalSequences","chartDates","getBGLabelYOffset","getBgChartColumns","getBgChartRow","renderBgCell","bgChart","headers","smbgHeader","dateMoment","isWeekend","timeSlots","smbgByTimeSlot","slot","_fill","zebraEven","renderBGChart","renderSummaryTable","datumsRendered","THREE_HRS","skipDraw","totalDays","totalReadings","avgReadingsPerDay","averageGlucoseText","summaryTable","avgBg","_data$id","_data$id$smbg","labelOffsetX","labelOffsetY","chartLeftEdge","_nonTandemData","_tandemData","isTandem","deviceMeta","getDeviceMeta","uploadDate","renderDeviceMeta","renderTandemProfiles","renderPumpSettings","renderBasalSchedules","renderWizardSettings","device","sortedSchedules","profile","zebraHeader","firstColumnWidth","fills","headerFills","columnDef","_bold","flexColumn","renderInsulinSettings","_insulinSettings","insulinSettings","tableRows","updateLayoutColumnPosition","layoutColumns","activeIndex","_this$latestPumpUploa","lastManualBasalSchedule","startTimeAndValue","isValue","automatedScheduleShowing","columnIndex","activeColumn","getShortestLayoutColumn","scheduleLabel","toLowerCase","getLongestLayoutColumn","bolusTitle","renderSensitivity","renderTarget","renderRatio","renderWizardSetting","sensitivity","_AGPUtils","_misc","agpLogo","tidepoolLogo","generateChartSections","renderReportInfo","renderInsufficientData","renderGlucoseMetrics","renderTimeInRanges","renderAmbulatoryGlucoseProfile","renderDailyGlucoseProfiles","agpLogoWidth","tidepoolLogoWidth","logoX","logoY","_section$text","_section$text3","_section$text4","roundedRect","_section$text2","titleXPos","titleYPos","subtitleXPos","insufficientDataXPos","insufficientDataYPos","descriptionXPos","descriptionYPos","_this$patient","_this$patient2","_this$patient2$profil","_this$patient2$profil2","_this$stats$sensorUsa","_this$stats$sensorUsa2","renderSectionContainer","patientName","truncate","getPatientFullName","patientBirthdate","formatBirthdate","patientMRN","clinicPatientMRN","_ref$cgmDaysWorn","cgmDaysWornText","renderInfoRow","mainText","subTextLabel","subTextWidth","lineYPos","moveUp","activeTime","paddingX","xExtents","glucoseStats","_stat$data$dataPaths","statWidth","isAverageGlucose","isShaded","_formatDatum","paddingY","valueYShift","unitsFontSize","unitsYShift","valueXShift","bgUnitsKey","chartAreaX","chartAreaY","renderSVGImage","_this$svgDataURLS","_this$svgDataURLS2","_this$svgDataURLS3","_this$svgDataURLS3$da","_this$svgDataURLS4","_this$svgDataURLS4$da","_textTable","fullname","formatDiagnosisDate","diagnosisText","mrnText","exported","formatCurrentDate","formatDateRange","tableText","getTable","getTableHeader","content","getTableRows","getTableRow","rowData","wizard","NaN","inRange","expectedDuration","Boolean","cancelledDuringNormal","cancelledDuringExtended","fixFloatingPoint","netRecommendation","rec","currentBasal","seq","idx","basalTypeChange","getEndpoints","initialSegmentDuration","dose","getSegmentDose","formatInsulin","suppressedDeliveryType","currentPathType","pathType","optionalExtents","startIndex","endIndex","findLastIndex","toISOString","returnData","events","automatedStop","acc","event","subtotals","suspends","distinct","skipped","springConfig","stiffness","damping","_DEFAULT_BG_BOUNDS","trends","extentSizes","ONE_WEEK","TWO_WEEKS","FOUR_WEEKS","_pumpVocabulary","_ANIMAS","_INSULET","_MEDTRONIC","_MICROTECH","_TANDEM","_default","_voilabPdfTable","_fitcolumn","_svgToPdfkit","logo","addSVG","SVGtoPDF","LARGE_FONT_SIZE","EXTRA_SMALL_FONT_SIZE","patientInfoBox","_objectSpread4","sleep","physicalActivity","bolusAutomated","siteChange","basalHeader","bolusHeader","tableHeader","zebraOdd","initialTotalPages","bufferedPageRange","newPage","setNewPageTablePosition","removeAllListeners","dateText","renderDebugGrid","currentFont","renderHeader","renderFooter","_opts$activeIndex","_opts$columns","_opts$count","_opts$gutter","_opts$type","_opts$width","_opts$widths","availableWidth","combinedWidths","switchToPage","shortest","shortestIndex","longest","longestIndex","dateRange","fillLocked","strokeLocked","_opts$xPos","_opts$yPos","_opts$font","_opts$fontSize","_opts$subTextFont","subTextFont","_opts$subTextFontSize","subTextFontSize","_opts$moveDown","subTextYOffset","isHeader","fillStripeKey","fillKey","heightKey","stripe","fillStripe","stripeDefined","stripeWidth","stripeHeight","_$get$text","_$get$subText","alignKey","renderCellStripe","stripeOffset","boldRow","fontKey","textRightPadding","cellHeight","Table","PdfTable","FitColumn","borderColor","addPlugin","onPageAdd","onPageAdded","onCellBackgroundAdd","onCellBackgroundAdded","onCellBorderAdd","onCellBorderAdded","onRowAdd","onRowAdded","onBodyAdded","setColumnsDefaults","addColumns","addBody","ev","cancel","addHeader","isEven","defaultOpacity","_row$_fill","patientNameWidth","patientDOB","birthdate","patientBirthdayWidth","patientMRNWidth","patientMRNText","dividerWidth","titleWidth","logoWidth","thisLineYPos","numMinorLines","innerLinePos","thisLineXPos","renderPatientInfo","renderTitle","renderLogo","renderDateText","helpText","printDateText","printDateWidth","pageCountWidth","innerWidth","svgDataURL","svgDataURLArr","rawChartSVG","decodeURIComponent","pageCount","_slicedToArray","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","_iterableToArrayLimit","_nonIterableRest","_typeof2","patientInfo","isOtherPerson","fullName","get_get","receiver","Reflect","base","_superPropBase","getScheduleNames","lookupKey","activeAtUpload","activeScheduleName","getScheduleLabel","processBasalRateData","basalRows","sensitivityTitle","processSensitivityData","sensitivityRows","processCarbRatioData","ratioRows","targetTitle","targetColumns","processBgTargetData","targetRows","getTimedSchedules","className","basalScheduleHeader","bolusSettingsHeader","basalColumns","processTimedSettings","webpackPolyfill","deprecate"],"mappings":"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","file":"print.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 432);\n","module.exports = require(\"react\");","var _typeof = require(\"../helpers/typeof\");\n\nfunction _getRequireWildcardCache() {\n if (typeof WeakMap !== \"function\") return null;\n var cache = new WeakMap();\n\n _getRequireWildcardCache = function _getRequireWildcardCache() {\n return cache;\n };\n\n return cache;\n}\n\nfunction _interopRequireWildcard(obj) {\n if (obj && obj.__esModule) {\n return obj;\n }\n\n if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n return {\n \"default\": obj\n };\n }\n\n var cache = _getRequireWildcardCache();\n\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n\n newObj[\"default\"] = obj;\n\n if (cache) {\n cache.set(obj, newObj);\n }\n\n return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;","module.exports = require(\"regenerator-runtime\");\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","import _ from 'lodash';\nimport i18next from 'i18next';\nconst t = i18next.t.bind(i18next);\n\nimport { DPI } from './constants';\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 AGP_BG_CLAMP_MGDL = 350;\nexport const AGP_BG_CLAMP_MMOLL = 19.4;\nexport const AGP_FOOTER_Y_PADDING = DPI * 0.25;\nexport const AGP_TIR_MIN_HEIGHT = 5;\nexport const AGP_SECTION_BORDER_RADIUS = 8;\nexport const AGP_SECTION_HEADER_HEIGHT = DPI * 0.25;\nexport const AGP_SECTION_DESCRIPTION_HEIGHT = DPI * 0.25;\nexport const AGP_LOWER_QUANTILE = 0.05;\nexport const AGP_UPPER_QUANTILE = 0.95;\n\n// Preferring Helvetica instead of Arial since we don't have license and PDFkit doesn't include it\nexport const AGP_FONT_FAMILY = 'Helvetica, Arial, Sans-Serif';\n\nexport const text = {\n reportHeader: t('AGP Report:'),\n reportSubHeader: t('Continuous glucose monitoring'),\n reportFooter: t('Patent pending \\u2013 HealthPartners Institute dba International Diabetes Center \\u2013 All Rights Reserved. \\u00A92022'),\n reportInsuffienctData: t('Insufficient data to generate an AGP Report.'),\n timeInRanges: {\n title: t('Time in Ranges'),\n subtitle: t('Goals for Type 1 and Type 2 Diabetes'),\n },\n reportInfo: {\n dob: t('DOB:'),\n mrn: t('MRN:'),\n },\n glucoseMetrics: {\n title: t('Glucose metrics'),\n averageGlucose: {\n label: t('Average Glucose'),\n goal: {\n mgdl: t('Goal: <154 mg/dL'),\n mmoll: t('Goal: <8.6 mmol/L'),\n },\n },\n glucoseManagementIndicator: {\n label: t('Glucose Management Indicator (GMI)'),\n goal: t('Goal: <7%'),\n },\n coefficientOfVariation: {\n label: t('Glucose Variability'),\n subLabel: t('Defined as percent coefficient of variation'),\n goal: t('Goal: <=36%'), // \\u2264 unicode symbol not available in Helvetica, and we don't own license for Arial\n },\n },\n ambulatoryGlucoseProfile: {\n title: t('Ambulatory Glucose Profile (AGP)'),\n description: t('AGP is a summary of glucose values from the report period, with median (50%) and other percentiles shown as if they occurred in a single day.'),\n targetRange: t('Target<br>Range'),\n insufficientData: t('Insufficient CGM data to generate AGP graph'),\n },\n dailyGlucoseProfiles: {\n title: t('Daily Glucose Profiles'),\n description: t('Each daily profile represents a midnight-to-midnight period.'),\n },\n bgRanges: {\n veryHigh: t('Very High'),\n high: t('High'),\n target: t('Target'),\n low: t('Low'),\n veryLow: t('Very Low'),\n },\n goals: {\n veryHigh: t('Goal: <5%'),\n highCombined: t('Goal: <25%'),\n target: t('Goal: >70%'),\n lowCombined: t('Goal: <4%'),\n veryLow: t('Goal: <1%'),\n },\n subLabels: {\n TIRtarget: t('Each 5% increase is clinically beneficial'),\n TIRminutes: t('Each 1% time in range = about 15 minutes'),\n },\n};\n\nexport const fontSizes = {\n reportHeader: 14,\n reportSubHeader: 14,\n reportFooter: 7,\n reportInfo: {\n default: 10,\n label: 8,\n },\n section: {\n title: 9,\n subtitle: 8,\n description: 7,\n insufficientData: 7,\n },\n timeInRanges: {\n values: 9,\n ticks: 7,\n summaries: 12,\n goals: 7,\n subLabels: 7,\n },\n glucoseMetrics: {\n values: 12,\n bgUnits: 8,\n labels: 9,\n subLabels: 8,\n goals: 8,\n },\n ambulatoryGlucoseProfile: {\n hourlyTicks: 7,\n bgTicks: 9,\n percentileTicks: 8,\n bgUnits: 7,\n targetRange: 9,\n },\n dailyGlucoseProfiles: {\n bgTicks: 7,\n bgUnits: 7,\n timeTicks: 7,\n weekdayTicks: 8,\n calendarDates: 8,\n },\n};\n\nconst black = '#000000';\nconst white = '#FFFFFF';\nconst lightGrey = '#D9D9D9';\nconst mediumGrey = '#7A7A7A';\nconst darkGrey = '#626267';\n\nexport const colors = {\n text: {\n reportHeader: '#522398',\n label: darkGrey,\n reportFooter: black,\n section: {\n title: black,\n subtitle: darkGrey,\n description: black,\n insufficientData: black,\n },\n reportInfo: black,\n calendarDates: darkGrey,\n goals: {\n veryHigh: darkGrey,\n highCombined: mediumGrey,\n target: mediumGrey,\n lowCombined: mediumGrey,\n veryLow: darkGrey,\n glucoseMetrics: darkGrey,\n },\n subLabels: {\n TIRtarget: darkGrey,\n TIRminutes: black,\n glucoseMetrics: darkGrey,\n },\n ticks: {\n bg: darkGrey,\n dailyProfileBg: black,\n hour: darkGrey,\n percentile: darkGrey,\n },\n },\n line: {\n default: darkGrey,\n ticks: lightGrey,\n range: {\n target: '#00AA51',\n dailyProfileTarget: black,\n default: lightGrey,\n divider: white,\n },\n },\n white,\n black,\n lightGrey,\n mediumGrey,\n darkGrey,\n background: {\n shaded: lightGrey,\n },\n bgRange: {\n veryLow: '#CC0019',\n low: '#FF0000',\n lowShaded: '#FF8080',\n target: '#0BAD5A',\n high: '#FFBF00',\n highShaded: '#FFD180',\n veryHigh: '#FF6900',\n empty: darkGrey,\n },\n ambulatoryGlucoseProfile: {\n median: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#00AA51',\n high: '#FFA600',\n veryHigh: '#FF7538',\n },\n interQuartile: {\n veryLow: '#A30014',\n low: '#FF0000',\n target: '#8BCD9E',\n high: '#FFC966',\n veryHigh: '#FFB380',\n },\n outerQuantile: {\n veryLow: '#A30014',\n low: '#FF8080',\n target: '#BEE1C6',\n high: '#FFE6B3',\n veryHigh: '#FFD9BF',\n },\n },\n dailyGlucoseProfiles: {\n low: {\n line: '#FF0000',\n fill: '#FF8080',\n },\n target: {\n line: '#00AA51',\n fill: lightGrey,\n },\n high: {\n line: '#FFA600',\n fill: '#FFD180',\n },\n },\n};\n","module.exports = require(\"text-table\");","/*\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';\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 startFormat = isSameYear ? start.format(`${monthFormat} D`) : start.format(`${monthFormat} D, YYYY`);\n const endFormat = end.format(`${monthFormat} D, YYYY`);\n\n const formattedRange = `${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 *\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 getLocalizedCeiling(utc, timePrefs) {\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 const startOfDay = moment.utc(utc)\n .tz(timezone)\n .startOf('day');\n\n const utcHammertime = (typeof utc === 'string') ? Date.parse(utc) : utc;\n if (startOfDay.valueOf() === utcHammertime) {\n return startOfDay.toDate();\n }\n return startOfDay.add(1, 'day').toDate();\n}\n","export default function _defineProperty(obj, key, value) {\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\n return obj;\n}","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import _ from 'lodash';\n\nimport {\n AGP_BG_CLAMP_MGDL,\n AGP_BG_CLAMP_MMOLL,\n AGP_FONT_FAMILY,\n AGP_FOOTER_Y_PADDING,\n AGP_LOWER_QUANTILE,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n AGP_TIR_MIN_HEIGHT,\n AGP_UPPER_QUANTILE,\n colors,\n fontSizes,\n text,\n} from './AGPConstants';\n\nimport { DPI, MARGINS, WIDTH, HEIGHT } from './constants';\nimport { bankersRound, formatBgValue, formatPercentage } from '../../../utils/format';\nimport { ONE_HR, getTimezoneFromTimePrefs } from '../../../utils/datetime';\nimport { mungeBGDataBins } from '../../../utils/bloodglucose';\nimport { MGDL_UNITS, MS_IN_DAY, MS_IN_HOUR } from '../../../utils/constants';\nimport moment from 'moment';\n\nexport const boldText = textString => `<b>${String(textString)}</b>`;\nexport const chartScaleToPixels = (paperPixelDimension, scaleValue) => scaleValue * paperPixelDimension;\nexport const pixelsToChartScale = (paperPixelDimension, pixels) => pixels / paperPixelDimension;\nexport const pointsToPixels = points => points * 0.75;\n\nexport const createAnnotation = options => {\n const annotation = _.defaultsDeep(options, {\n arrowside: 'none',\n font: {\n color: colors.black,\n family: AGP_FONT_FAMILY,\n },\n showarrow: false,\n });\n\n return annotation;\n};\n\nexport const calculateDataSufficiency = (data = {}) => {\n const { statsByDate } = data.data?.current?.aggregationsByDate;\n\n const {\n cgmDaysWorn,\n count,\n newestDatum,\n sampleFrequency,\n sensorUsageAGP,\n } = data.data?.current?.stats?.sensorUsage || {};\n\n const sufficiencyBySection = {\n ambulatoryGlucoseProfile: true,\n dailyGlucoseProfiles: true,\n glucoseMetrics: true,\n timeInRanges: true,\n };\n\n const hoursOfCGMData = (count * sampleFrequency) / MS_IN_HOUR;\n\n if (hoursOfCGMData < 24) {\n // Show nothing if <24 hours total cgm time\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: false,\n glucoseMetrics: false,\n timeInRanges: false,\n };\n } else if (hoursOfCGMData === 24) {\n // Hide agp if only 24 hours total cgm time, but show other sections conditional on sufficiency\n const sufficencyMet = sensorUsageAGP >= 70;\n\n return {\n ambulatoryGlucoseProfile: false,\n dailyGlucoseProfiles: sufficencyMet,\n glucoseMetrics: sufficencyMet,\n timeInRanges: sufficencyMet,\n };\n }\n\n const cgmCalendarDays = _.map(_.range(_.max([cgmDaysWorn, 7])), (val, index) => (\n moment.utc(newestDatum.time).tz(getTimezoneFromTimePrefs(data.timePrefs)).subtract(index, 'days').format('YYYY-MM-DD')\n )).reverse();\n\n const sensorUsageByDate = _.map(cgmCalendarDays, (date, index) => {\n const {\n count: countForDate,\n sampleFrequency: sampleFrequencyForDate,\n newestDatum: newestDatumForDate = {},\n oldestDatum: oldestDatumForDate = {},\n } = statsByDate[date]?.sensorUsage || {};\n\n if (!sampleFrequencyForDate || !countForDate) {\n return { sufficiencyMet: false, sensorUsage: 0 };\n }\n\n const minCount = MS_IN_HOUR / sampleFrequencyForDate;\n\n let maxPossibleReadings = 0;\n if (index === 0) {\n maxPossibleReadings = bankersRound((MS_IN_DAY - oldestDatumForDate.msPer24) / sampleFrequencyForDate);\n } else if (index === cgmCalendarDays.length - 1) {\n maxPossibleReadings = bankersRound(newestDatumForDate.msPer24 / sampleFrequencyForDate);\n } else {\n maxPossibleReadings = bankersRound(MS_IN_DAY / sampleFrequencyForDate);\n }\n\n const sensorUsage = maxPossibleReadings > 0 ? countForDate / maxPossibleReadings * 100 : 0;\n const sufficiencyMet = countForDate >= minCount;\n\n return ({ count: countForDate, date, maxPossibleReadings, sensorUsage, sufficiencyMet });\n });\n\n // AGP section requires that each day in the top 7 have at least an hour of data, and an average\n // sensore usage of 70%\n const sufficientDays = _.filter(sensorUsageByDate, { sufficiencyMet: true });\n const topSevenSufficientDays = _.slice(_.orderBy(sufficientDays, ['sensorUsage'], ['desc']), 0, 7);\n\n if (topSevenSufficientDays.length < 7) {\n sufficiencyBySection.ambulatoryGlucoseProfile = false;\n } else {\n const topSevenDaysSensorUsageMean = _.meanBy(topSevenSufficientDays, 'sensorUsage');\n sufficiencyBySection.ambulatoryGlucoseProfile = topSevenDaysSensorUsageMean >= 70;\n }\n\n return sufficiencyBySection;\n};\n\nexport const generateChartSections = (data) => {\n const reportInfoAndMetricsWidth = DPI * 3.375;\n const chartRenderAreaTop = DPI * 0.75;\n const rightEdge = MARGINS.left + WIDTH;\n const bottomEdge = MARGINS.top + HEIGHT;\n const chartRenderAreaBottom = bottomEdge - (DPI * 0.75 - MARGINS.bottom);\n const sectionGap = DPI * 0.25;\n const sections = {};\n const dataSufficiency = calculateDataSufficiency(data);\n\n sections.timeInRanges = {\n x: MARGINS.left,\n y: chartRenderAreaTop,\n width: DPI * 3.875,\n height: DPI * 3,\n bordered: true,\n text: text.timeInRanges,\n sufficientData: dataSufficiency.timeInRanges,\n };\n\n sections.reportInfo = {\n x: rightEdge - reportInfoAndMetricsWidth,\n y: chartRenderAreaTop,\n width: reportInfoAndMetricsWidth,\n height: DPI * 0.875,\n text: text.reportInfo,\n };\n\n sections.glucoseMetrics = {\n x: rightEdge - reportInfoAndMetricsWidth,\n y: sections.reportInfo.y + sections.reportInfo.height + sectionGap,\n width: reportInfoAndMetricsWidth,\n height: DPI * 1.875,\n bordered: true,\n text: text.glucoseMetrics,\n sufficientData: dataSufficiency.glucoseMetrics,\n };\n\n sections.ambulatoryGlucoseProfile = {\n x: MARGINS.left,\n y: DPI * 4,\n width: WIDTH,\n height: DPI * 3.5,\n bordered: true,\n text: text.ambulatoryGlucoseProfile,\n sufficientData: dataSufficiency.ambulatoryGlucoseProfile,\n };\n\n const dailyGlucoseProfilesHeight = DPI * 2.25;\n sections.dailyGlucoseProfiles = {\n x: MARGINS.left,\n y: chartRenderAreaBottom - dailyGlucoseProfilesHeight - AGP_FOOTER_Y_PADDING,\n width: WIDTH,\n height: dailyGlucoseProfilesHeight,\n bordered: true,\n text: text.dailyGlucoseProfiles,\n sufficientData: dataSufficiency.dailyGlucoseProfiles,\n };\n\n return sections;\n};\n\n/**\n * Generates the Plotly figure for the AGP Time In Ranges chart\n * @param {*} section\n * @param {*} stat\n * @param {*} bgPrefs\n * @returns\n */\nexport const generateTimeInRangesFigure = (section, stat, bgPrefs) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - DPI * 0.25 - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.425;\n const plotMarginBottom = DPI * 0.3;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginTop + plotMarginBottom);\n const barWidth = DPI * 0.35;\n const barSeparatorPixelWidth = 2;\n const yScale = pixelsToChartScale.bind(null, paperHeight);\n const xScale = pixelsToChartScale.bind(null, paperWidth);\n\n const statTotal = _.get(stat, 'data.raw.counts.total', 0);\n if (section.sufficientData) {\n const rawCounts = _.get(stat, 'data.raw.counts', {});\n\n const statDatums = [\n { id: 'veryLow', value: rawCounts.veryLow },\n { id: 'low', value: rawCounts.low },\n { id: 'target', value: rawCounts.target },\n { id: 'high', value: rawCounts.high },\n { id: 'veryHigh', value: rawCounts.veryHigh },\n ];\n\n const chartData = _.reduce(statDatums, (res, datum, i) => {\n const value = _.toNumber(datum.value) / statTotal * 1;\n const renderedValue = _.max([value, AGP_TIR_MIN_HEIGHT / 100]);\n res.rawById[datum.id] = value;\n res.raw.push(value);\n res.rendered.push(renderedValue);\n res.ticks.push((res.ticks[i - 1] || 0) + renderedValue);\n return res;\n }, { rawById: {}, raw: [], rendered: [], ticks: [] });\n\n // Needs y-scale correction since we may exceed y domain limits due to minimum bar height\n const yScaleCorrection = 1 / _.last(chartData.ticks);\n chartData.rendered = _.map(chartData.rendered, value => value * yScaleCorrection);\n chartData.ticks = _.map(chartData.ticks, value => value * yScaleCorrection);\n\n const data = _.map(statDatums, (datum, index) => ({\n x: [stat.id],\n y: [chartData.rendered[index]],\n name: datum.id,\n type: 'bar',\n width: barWidth / paperWidth * 2,\n marker: {\n color: _.toNumber(datum.value) > 0 ? colors.bgRange[datum.id] : colors.bgRange.empty,\n line: {\n color: colors.line.range.divider,\n width: barSeparatorPixelWidth,\n },\n },\n }));\n\n const bgTicks = _.map([\n bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n bgPrefs?.bgBounds?.veryHighThreshold,\n bgPrefs?.bgUnits,\n ], (tick, index) => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.timeInRanges.ticks,\n },\n text: index === 4 // bgUnits label\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n x: 0,\n xanchor: 'right',\n xshift: -2,\n y: index === 4 // bgUnits label\n ? chartData.ticks[1] + ((chartData.ticks[2] - chartData.ticks[1]) / 2)\n : chartData.ticks[index],\n yanchor: 'middle',\n }));\n\n /* eslint-disable no-param-reassign */\n const getBracketPosValues = (posX, posX2, posY, posY2) => {\n const minBracketYOffSet = yScale(13);\n\n if (_.isNumber(posY2)) {\n const maxSubBracketYOffset = yScale(24);\n if (posY - posY2 < minBracketYOffSet) posY2 = posY - minBracketYOffSet;\n const subBracketXOffset = (posX2 - posX) / 2;\n const subBracketYOffset = _.min([(posY - posY2) / 2, maxSubBracketYOffset]);\n\n return {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n };\n }\n\n // Only a single Ypos is passed for the target bracket\n // We need to ensure it's not too close to the range enxtents to avoid potential crowding\n const targetBracketAllowedYRange = [\n yScale(AGP_TIR_MIN_HEIGHT) * 3 + yScale(barSeparatorPixelWidth * 5),\n 1 - (yScale(AGP_TIR_MIN_HEIGHT) * 3 + yScale(barSeparatorPixelWidth * 5)),\n ];\n\n if (posY < targetBracketAllowedYRange[0]) posY = targetBracketAllowedYRange[0];\n if (posY > targetBracketAllowedYRange[1]) posY = targetBracketAllowedYRange[1];\n\n return { posX, posX2, posY };\n };\n /* eslint-enable no-param-reassign */\n\n const createBracketSVG = (pos) => {\n const {\n posX,\n posX2,\n posY,\n posY2,\n subBracketXOffset,\n subBracketYOffset,\n } = pos;\n\n if (_.isNumber(posY2)) {\n const radiusX = xScale(5);\n const radiusY = yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX + subBracketXOffset - radiusX}`,\n `Q ${posX + subBracketXOffset} ${posY} ${posX + subBracketXOffset} ${posY - radiusY}`,\n `V ${posY2 + radiusY}`,\n `Q ${posX + subBracketXOffset} ${posY2} ${posX + subBracketXOffset - radiusX} ${posY2}`,\n `H ${posX}`,\n `M ${posX + subBracketXOffset} ${posY2 + subBracketYOffset}`,\n `H ${posX2}`,\n ].join(' ');\n }\n\n return [\n `M ${posX} ${posY}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const bracketYPos = [\n // Low Brackets\n chartData.ticks[0],\n yScale(-11),\n\n // Target Bracket\n chartData.ticks[1] + ((chartData.ticks[2] - chartData.ticks[1]) / 2),\n\n // High Brackets\n chartData.ticks[4],\n chartData.ticks[2] + ((chartData.ticks[3] - chartData.ticks[2]) / 2),\n ];\n\n const bracketXExtents = [xScale(barWidth + 5), xScale(paperWidth - barWidth)];\n\n const bracketPos = {\n low: getBracketPosValues(...bracketXExtents, ...bracketYPos.slice(0, 2)),\n target: getBracketPosValues(...bracketXExtents, bracketYPos[2]),\n high: getBracketPosValues(...bracketXExtents, ...bracketYPos.slice(3)),\n };\n\n const brackets = _.map(_.values(bracketPos), pos => ({\n type: 'path',\n path: createBracketSVG(pos),\n line: { color: colors.line.default, width: 0.5 },\n yref: 'paper',\n }));\n\n const createLeaderSVG = (posX, posX2, posY, posY2) => {\n const isLowLeader = posY > posY2;\n const radiusX = xScale(5);\n const radiusY = isLowLeader ? yScale(-5) : yScale(5);\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY2 - radiusY}`,\n `Q ${posX} ${posY2} ${posX + radiusX} ${posY2}`,\n `H ${posX2}`,\n ].join(' ');\n };\n\n const leaderYPos = [\n // Very Low Leader\n 0,\n bracketPos.low.posY2 + yScale(6),\n\n // Very High Leader\n 1,\n bracketPos.high.posY + yScale(6),\n ];\n\n const leaderXExtents = [xScale(barWidth / 2), xScale(barWidth + 2)];\n\n const leaderPos = {\n veryLow: [...leaderXExtents, ...leaderYPos.slice(0, 2)],\n veryHigh: [...leaderXExtents, ...leaderYPos.slice(2)],\n };\n\n const leaders = _.map(_.values(leaderPos), pos => ({\n type: 'path',\n path: createLeaderSVG(...pos),\n line: { color: colors.black, width: 0.5 },\n yref: 'paper',\n }));\n\n const rangePosY = {\n veryLow: bracketPos.low.posY2,\n low: bracketPos.low.posY,\n target: bracketPos.target.posY,\n high: bracketPos.high.posY2,\n veryHigh: bracketPos.high.posY,\n };\n\n const rangePosYOrderedKeys = [\n 'veryLow',\n 'low',\n 'target',\n 'high',\n 'veryHigh',\n ];\n\n const rangeLabels = _.map(rangePosYOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.timeInRanges.values,\n },\n text: boldText(text.bgRanges[range]),\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n }));\n\n const rangeValuesOrderedKeys = [\n 'veryLow',\n 'low',\n 'high',\n 'veryHigh',\n ];\n\n const rangeValues = _.map(rangeValuesOrderedKeys, range => createAnnotation({\n align: 'right',\n font: {\n size: fontSizes.timeInRanges.values,\n },\n text: boldText(formatPercentage(chartData.rawById[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'right',\n xshift: -4,\n y: rangePosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n }));\n\n const rangeSummaryPosY = {\n low: bracketPos.low.posY2 + bracketPos.low.subBracketYOffset,\n target: bracketPos.target.posY,\n high: bracketPos.high.posY2 + bracketPos.high.subBracketYOffset,\n };\n\n const combinedRangeSummaryValues = {\n low: chartData.rawById.veryLow + chartData.rawById.low,\n target: chartData.rawById.target,\n high: chartData.rawById.veryHigh + chartData.rawById.high,\n };\n\n const rangeSummaryOrderedKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const rangeSummaryValues = _.map(rangeSummaryOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n size: fontSizes.timeInRanges.summaries,\n },\n text: boldText(formatPercentage(combinedRangeSummaryValues[range], 0, true)),\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: 3,\n y: rangeSummaryPosY[range],\n yanchor: 'bottom',\n yref: 'paper',\n yshift: -1,\n }));\n\n const goalsPos = {\n veryLow: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.low.posY2,\n yshift: -12,\n },\n lowCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.low.posY2 + bracketPos.low.subBracketYOffset,\n yshift: 1,\n },\n target: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.target.posY,\n yshift: 1,\n },\n highCombined: {\n x: bracketXExtents[1],\n xanchor: 'right',\n xshift: 1,\n y: bracketPos.high.posY2 + bracketPos.high.subBracketYOffset,\n yshift: 1,\n },\n veryHigh: {\n x: bracketXExtents[0],\n xanchor: 'left',\n xshift: -1,\n y: bracketPos.high.posY,\n yshift: 11,\n },\n };\n\n const goalsOrderedKeys = [\n 'veryLow',\n 'lowCombined',\n 'target',\n 'highCombined',\n 'veryHigh',\n ];\n\n const goals = _.map(goalsOrderedKeys, range => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.goals[range],\n size: fontSizes.timeInRanges.goals,\n },\n text: text.goals[range],\n yanchor: 'bottom',\n yref: 'paper',\n ...goalsPos[range],\n }));\n\n const subLabelsPos = {\n TIRtarget: {\n x: bracketXExtents[0] + (bracketXExtents[1] - bracketXExtents[0]) / 2,\n xanchor: 'left',\n xshift: -20,\n y: bracketPos.target.posY,\n yshift: -12,\n },\n TIRminutes: {\n x: xScale(paperWidth),\n xanchor: 'right',\n xref: 'paper',\n xshift: plotMarginX - 7,\n y: bracketPos.low.posY2,\n yshift: -12,\n },\n };\n\n const subLabelsOrderedKeys = [\n 'TIRtarget',\n 'TIRminutes',\n ];\n\n const subLabels = _.map(subLabelsOrderedKeys, label => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.subLabels[label],\n size: fontSizes.timeInRanges.subLabels,\n },\n text: text.subLabels[label],\n yanchor: 'bottom',\n yref: 'paper',\n ...subLabelsPos[label],\n }));\n\n const rangeAnnotations = {\n veryLow: [\n rangeLabels[0],\n rangeValues[0],\n goals[0],\n ],\n low: [\n rangeLabels[1],\n rangeValues[1],\n ],\n lowSummary: [\n rangeSummaryValues[0],\n goals[1],\n ],\n target: [\n rangeLabels[2],\n rangeSummaryValues[1],\n goals[2],\n subLabels[0],\n ],\n high: [\n rangeLabels[3],\n rangeValues[2],\n ],\n veryHigh: [\n rangeLabels[4],\n rangeValues[3],\n goals[4],\n ],\n highSummary: [\n rangeSummaryValues[2],\n goals[3],\n ],\n };\n\n const layout = {\n barmode: 'stack',\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n yaxis: {\n range: [0, 1],\n showgrid: false,\n showline: false,\n showticklabels: false,\n zeroline: false,\n },\n\n annotations: [\n ...bgTicks,\n ...rangeAnnotations.veryHigh,\n ...rangeAnnotations.high,\n ...rangeAnnotations.highSummary,\n ...rangeAnnotations.target,\n ...rangeAnnotations.low,\n ...rangeAnnotations.veryLow,\n ...rangeAnnotations.lowSummary,\n subLabels[1],\n ],\n\n shapes: [\n ...brackets,\n ...leaders,\n ],\n };\n\n const figure = { data, layout };\n return figure;\n }\n\n return null;\n};\n\nexport const generateAmbulatoryGlucoseProfileFigure = (section, cbgData, bgPrefs) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotMarginX = DPI * 0.5;\n const plotMarginY = DPI * 0.2;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n const paperHeight = chartAreaHeight - (plotMarginY * 2);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n const chartData = mungeBGDataBins('cbg', ONE_HR, cbgData, [AGP_LOWER_QUANTILE, AGP_UPPER_QUANTILE]);\n\n // Smooth all bin quantiles according to AGP spec\n const quantileKeys = [\n 'lowerQuantile',\n 'firstQuartile',\n 'median',\n 'thirdQuartile',\n 'upperQuantile',\n ];\n\n const firstDatum = chartData[0];\n const lastDatum = chartData[chartData.length - 1];\n\n const smoothDatum = (prev, curr, next) => {\n // return with current value if current bin, or both adjacent bins, are empty\n if ((!prev && !next) || !curr) {\n return curr;\n } else if (!prev || !next) {\n // Weight at 0-4-1 or 1-4-0 respectively if one of the adjacent bins is empty\n return _.sum([prev || 0, curr * 4, next || 0]) / 5;\n }\n // Weight at 1-4-1\n return _.sum([prev, curr * 4, next]) / 6;\n };\n\n const smoothedChartData = _.map(chartData, (datum, index) => ({\n ...datum,\n ..._.reduce(quantileKeys, (result, key) => {\n result[key] = smoothDatum( // eslint-disable-line no-param-reassign\n chartData[index - 1]?.[key] || lastDatum[key],\n datum[key],\n chartData[index + 1]?.[key] || firstDatum[key]\n );\n return result;\n }, {}),\n }));\n\n // Prepend/append extent datums to opposite ends to allow fully cyclic traces across the entire\n // X axis. Otherwise, the first and last 1/2 hours will not be rendered.\n const firstSmoothedDatum = smoothedChartData[0];\n const lastSmoothedDatum = smoothedChartData[smoothedChartData.length - 1];\n smoothedChartData.unshift({ ...lastSmoothedDatum, msX: firstSmoothedDatum.msX - ONE_HR });\n smoothedChartData.push({ ...firstSmoothedDatum, msX: lastSmoothedDatum.msX + ONE_HR });\n\n const quantileBand = (upperKey, lowerKey, key, bgRange, index) => ({\n name: key,\n type: 'scatter',\n x: [..._.map(smoothedChartData, 'msX'), ..._.map(_.reverse([...smoothedChartData]), 'msX')],\n y: [..._.map(smoothedChartData, upperKey), ..._.map(_.reverse([...smoothedChartData]), lowerKey)],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n fill: 'tozerox',\n fillcolor: colors.ambulatoryGlucoseProfile[key][bgRange],\n mode: 'none',\n line: {\n simplify: false,\n shape: 'spline',\n smoothing: 0.5,\n },\n });\n\n const bgRangeKeys = [\n 'veryLow',\n 'low',\n 'target',\n 'high',\n 'veryHigh',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.veryLowThreshold,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n bgPrefs?.bgBounds?.veryHighThreshold,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(bgTicks, (tick, index) => {\n const isTarget = _.includes([2, 3], index);\n let yshift = 0;\n if (index === 0) yshift = 4;\n if (index === 1) yshift = -2;\n\n return createAnnotation({\n align: 'right',\n font: {\n color: isTarget ? colors.white : colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgTicks,\n },\n height: 9,\n text: index === 0\n ? boldText(tick)\n : boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift,\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n });\n });\n\n const createbgTargetMarkerSVG = (posX, posY) => {\n const radiusX = 2;\n const radiusY = 2;\n const width = 22;\n const height = 10;\n const posXLeft = posX - width;\n const posYTop = posY + height / 2;\n const posYBottom = posY - height / 2;\n const arrowHeight = height / 2 - 1;\n\n return [\n `M ${posX} ${posY}`,\n `V ${posY - 1}`,\n `L ${posX - arrowHeight} ${posYBottom}`,\n `H ${posXLeft + radiusX}`,\n `Q ${posXLeft} ${posYBottom} ${posXLeft} ${posYBottom + radiusY}`,\n `V ${posYTop - radiusY}`,\n `Q ${posXLeft} ${posYTop} ${posXLeft + radiusX} ${posYTop}`,\n `H ${posX - arrowHeight}`,\n `L ${posX} ${posY + 1}`,\n `V ${posY}`,\n ].join(' ');\n };\n\n const bgTargetMarkers = _.map(_.slice(bgTicks, 2, 4), tick => ({\n fillcolor: colors.line.range.target,\n line: {\n width: 0,\n },\n tick,\n path: createbgTargetMarkerSVG(-1, tick / yClamp * paperHeight),\n type: 'path',\n xanchor: 0,\n xref: 'paper',\n xsizemode: 'pixel',\n yanchor: 0,\n yref: 'paper',\n ysizemode: 'pixel',\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 5;\n const isTarget = _.includes([2, 3], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.target : colors.line.range.default,\n width: isTarget ? 2 : 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const percentileTicks = _.map(quantileKeys, key => {\n if (firstSmoothedDatum[key] && lastSmoothedDatum[key]) {\n return (firstSmoothedDatum[key] + lastSmoothedDatum[key]) / 2;\n }\n return firstSmoothedDatum[key] || lastSmoothedDatum[key];\n });\n\n const percentileLabels = ['5%', '25%', '50%', '75%', '95%'];\n\n // Ensure that percentile ticks and annotations don't crowd\n const percentileTickYPositions = _.map(percentileTicks, tick => chartScaleToPixels(paperHeight, tick / yClamp));\n const percentileTickShiftedYPositions = [...percentileTickYPositions];\n const medianYPos = percentileTickYPositions[2];\n const minGap = pointsToPixels(fontSizes.ambulatoryGlucoseProfile.percentileTicks) + 2;\n percentileTickShiftedYPositions[1] = _.min([medianYPos - minGap, percentileTickShiftedYPositions[1]]);\n percentileTickShiftedYPositions[0] = _.min([percentileTickShiftedYPositions[1] - minGap, percentileTickShiftedYPositions[0]]);\n percentileTickShiftedYPositions[3] = _.max([medianYPos + minGap, percentileTickShiftedYPositions[3]]);\n percentileTickShiftedYPositions[4] = _.max([percentileTickShiftedYPositions[3] + minGap, percentileTickShiftedYPositions[4]]);\n const percentileTickYShifts = _.map(percentileTickShiftedYPositions, (shiftedYPos, index) => (shiftedYPos - percentileTickYPositions[index]));\n\n const percentileTickAnnotations = _.map(percentileTicks, (tick, index) => createAnnotation({\n align: 'left',\n font: {\n color: index === 2 ? colors.black : colors.text.ticks.percentile,\n size: fontSizes.ambulatoryGlucoseProfile.percentileTicks,\n },\n text: boldText(percentileLabels[index]),\n visible: tick / yClamp <= 1,\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: percentileTickYShifts[index],\n xanchor: 'left',\n xref: 'x',\n xshift: 5,\n x: MS_IN_DAY,\n }));\n\n const percentileTickLines = _.map(percentileTicks, (tick, index) => ({\n line: {\n color: colors.line.ticks,\n width: 1,\n },\n type: 'line',\n visible: tick / yClamp <= 1,\n x0: paperWidth,\n x1: paperWidth + 5,\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp + pixelsToChartScale(paperHeight, percentileTickYShifts[index]),\n yref: 'paper',\n }));\n\n const quarterDayTicks = _.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 6);\n\n const hourlyTicks = _.filter(\n _.range(0, MS_IN_DAY + 1, MS_IN_HOUR),\n tick => ((tick / MS_IN_HOUR) % 12 !== 0)\n );\n\n const hourlyTicksAnnotations = _.map(_.range(0, MS_IN_DAY + 1, MS_IN_HOUR * 3), tick => createAnnotation({\n align: 'center',\n font: {\n color: (tick / MS_IN_HOUR) % 12 === 0 ? colors.black : colors.darkGrey,\n size: fontSizes.ambulatoryGlucoseProfile.hourlyTicks,\n },\n text: boldText(moment.utc(tick).format('ha')),\n y: 0,\n yanchor: 'top',\n yref: 'y',\n yshift: 0,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const data = [];\n const yAxes = [];\n\n _.each(bgRangeKeys, (bgRange, index) => {\n data.push(quantileBand('upperQuantile', 'lowerQuantile', 'outerQuantile', bgRange, index));\n data.push(quantileBand('thirdQuartile', 'firstQuartile', 'interQuartile', bgRange, index));\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(smoothedChartData, 'msX'),\n y: _.map(smoothedChartData, 'median'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.ambulatoryGlucoseProfile.median[bgRange],\n simplify: false,\n shape: 'spline',\n width: 3,\n smoothing: 0.5,\n },\n });\n\n const range = [bgTicks[index], bgTicks[index + 1]];\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n const layout = {\n width: chartAreaWidth,\n height: chartAreaHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginY,\n t: plotMarginY,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: quarterDayTicks,\n zeroline: false,\n },\n\n // secondary axis for hourly ticks\n xaxis2: {\n range: [0, MS_IN_DAY],\n overlaying: 'x',\n showgrid: false,\n showline: false,\n showticklabels: false,\n ticks: 'inside',\n tickcolor: colors.lightGrey,\n ticklen: 5,\n tickvals: hourlyTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...percentileTickAnnotations,\n ...hourlyTicksAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: bgPrefs?.bgUnits,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: bgTicks[5] / yClamp,\n yanchor: 'top',\n yref: 'paper',\n yshift: -4,\n }),\n\n createAnnotation({\n font: {\n color: colors.black,\n size: fontSizes.ambulatoryGlucoseProfile.bgUnits,\n },\n text: boldText(text.ambulatoryGlucoseProfile.targetRange),\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -2,\n y: _.mean(_.slice(bgTicks, 2, 4)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ...bgTargetMarkers,\n ...percentileTickLines,\n ],\n };\n\n const figure = {\n data: [\n ...data,\n { visible: false, xaxis: 'x2' },\n ],\n layout,\n };\n\n return figure;\n }\n\n return null;\n};\n\nexport const generateDailyGlucoseProfilesFigure = (section, cbgData, bgPrefs, dateLabelFormat) => {\n // Set chart plot within section borders\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n const plotMarginX = DPI * 0.5;\n const plotMarginTop = DPI * 0.2;\n const plotMarginBottom = 1;\n const paperWidth = chartAreaWidth - (plotMarginX * 2);\n\n if (section.sufficientData) {\n const yClamp = bgPrefs?.bgUnits === MGDL_UNITS ? AGP_BG_CLAMP_MGDL : AGP_BG_CLAMP_MMOLL;\n\n const bgRangeKeys = [\n 'low',\n 'target',\n 'high',\n ];\n\n const bgTicks = [\n 0,\n bgPrefs?.bgBounds?.targetLowerBound,\n bgPrefs?.bgBounds?.targetUpperBound,\n yClamp,\n ];\n\n const bgTickAnnotations = _.map(_.slice(bgTicks, 1, 3), tick => createAnnotation({\n align: 'right',\n font: {\n color: colors.text.ticks.dailyProfileBg,\n size: fontSizes.dailyGlucoseProfiles.bgTicks,\n },\n text: boldText(formatBgValue(tick, bgPrefs, undefined, true)),\n y: tick / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n xanchor: 'right',\n xref: 'x',\n xshift: -2,\n x: 0,\n }));\n\n const bgGridLines = _.map(bgTicks, (tick, index) => {\n const isClamp = index === 3;\n const isTarget = _.includes([1, 2], index);\n const isZero = index === 0;\n\n return {\n layer: isTarget || isClamp ? 'above' : 'below',\n line: {\n color: isTarget ? colors.line.range.dailyProfileTarget : colors.line.range.default,\n width: 1,\n },\n type: 'line',\n x0: isClamp || isZero ? -1 : 0, // fills an empty pixel cap on top grid line\n x1: isClamp || isZero ? paperWidth + 1 : paperWidth, // fills an empty pixel cap on top grid line\n xref: 'paper',\n xanchor: 0,\n xsizemode: 'pixel',\n y0: tick / yClamp,\n y1: tick / yClamp,\n yref: 'paper',\n };\n });\n\n const halfDayTicks = _.range(0, MS_IN_DAY * 7 + 1, MS_IN_HOUR * 12);\n\n const halfDayTickAnnotations = _.map(_.filter(halfDayTicks, (tick, index) => index % 2 !== 0), (tick, index) => createAnnotation({\n align: 'center',\n font: {\n color: colors.black,\n size: dateLabelFormat === 'ha'\n ? fontSizes.dailyGlucoseProfiles.timeTicks\n : fontSizes.dailyGlucoseProfiles.weekdayTicks,\n },\n text: dateLabelFormat === 'ha'\n ? boldText(moment.utc(tick).format(dateLabelFormat))\n : boldText(moment.utc(String(cbgData[index][0])).format(dateLabelFormat)),\n y: 1,\n yanchor: 'bottom',\n yref: 'paper',\n yshift: 1,\n xanchor: 'middle',\n xref: 'x',\n x: tick,\n }));\n\n const calendarDays = _.flatten(_.map(cbgData, (d) => d[0]));\n\n const calendarDayAnnotations = _.map(calendarDays, (date, index) => createAnnotation({\n align: 'left',\n font: {\n color: colors.text.calendarDates,\n size: fontSizes.dailyGlucoseProfiles.calendarDates,\n },\n text: boldText(moment.utc(date).format('D')),\n y: 1,\n yanchor: 'top',\n yref: 'paper',\n yshift: 0,\n xanchor: 'left',\n xref: 'x',\n xshift: 0,\n x: index * MS_IN_DAY,\n }));\n\n const data = [];\n const yAxes = [];\n\n const combinedData = _.flatten(_.map(cbgData, (d, index) => (_.map(d[1], dayData => ({\n ...dayData,\n msPer24: dayData.msPer24 + MS_IN_DAY * index,\n })))));\n\n _.each(bgRangeKeys, (bgRange, index) => {\n const isLow = index === 0;\n const isTarget = index === 1;\n const firstDatum = _.first(combinedData);\n const lastDatum = _.last(combinedData);\n const range = [bgTicks[index], bgTicks[index + 1]];\n const fillYExentRangeIndex = isLow ? 1 : 0;\n\n data.push({\n name: 'rangeFill',\n type: 'scatter',\n x: isTarget\n ? [0, MS_IN_DAY * 7, MS_IN_DAY * 7, 0]\n : [firstDatum?.msPer24, ..._.map(combinedData, 'msPer24'), lastDatum?.msPer24, firstDatum?.msPer24],\n y: isTarget\n ? [range[1], range[1], range[0], range[0]]\n : [range[fillYExentRangeIndex], ..._.map(combinedData, 'value'), range[fillYExentRangeIndex], range[fillYExentRangeIndex]],\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'none',\n fill: 'tonextx',\n fillcolor: colors.dailyGlucoseProfiles[bgRange].fill,\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n data.push({\n name: 'median',\n type: 'scatter',\n x: _.map(combinedData, 'msPer24'),\n y: _.map(combinedData, 'value'),\n yaxis: index === 0 ? 'y' : `y${index + 1}`,\n mode: 'lines',\n fill: 'none',\n line: {\n color: colors.dailyGlucoseProfiles[bgRange].line,\n simplify: false,\n width: 1,\n },\n });\n\n const yAxis = {\n domain: [range[0] / yClamp, range[1] / yClamp],\n range,\n showgrid: false,\n showline: true,\n linecolor: colors.lightGrey,\n mirror: true,\n showticklabels: false,\n zeroline: false,\n };\n\n yAxes.push(yAxis);\n });\n\n const layout = {\n width: chartAreaWidth,\n height: plotHeight,\n showlegend: false,\n\n margin: {\n l: plotMarginX,\n r: plotMarginX,\n b: plotMarginBottom,\n t: plotMarginTop,\n },\n\n xaxis: {\n gridcolor: colors.line.ticks,\n linecolor: colors.line.ticks,\n range: [0, MS_IN_DAY * 7],\n showgrid: true,\n showline: false,\n showticklabels: false,\n tickvals: halfDayTicks,\n zeroline: false,\n },\n\n ..._.reduce(yAxes, (result, axis, index) => {\n const axisKey = index === 0 ? 'yaxis' : `yaxis${index + 1}`;\n result[axisKey] = axis; // eslint-disable-line no-param-reassign\n return result;\n }, {}),\n\n annotations: [\n ...bgTickAnnotations,\n ...halfDayTickAnnotations,\n ...calendarDayAnnotations,\n\n createAnnotation({\n font: {\n color: colors.text.ticks.bg,\n size: fontSizes.dailyGlucoseProfiles.bgUnits,\n },\n text: boldText(bgPrefs?.bgUnits),\n textangle: 270,\n x: 0,\n xanchor: 'right',\n xref: 'paper',\n xshift: -18,\n y: _.mean(_.slice(bgTicks, 1, 3)) / yClamp,\n yanchor: 'middle',\n yref: 'paper',\n yshift: 0,\n }),\n ],\n\n shapes: [\n ...bgGridLines,\n ],\n };\n\n const figure = {\n data,\n layout,\n };\n\n return figure;\n }\n\n return null;\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 moment from 'moment';\nimport i18next from 'i18next';\n\nimport { getPumpVocabulary } from '../device';\nimport {\n generateBgRangeLabels,\n reshapeBgClassesToBgBounds,\n} from '../bloodglucose';\n\nimport {\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE_TYPE_UNDECLARED,\n AUTOMATED_DELIVERY,\n AUTOMATED_SUSPEND,\n INSULET,\n TANDEM,\n ANIMAS,\n MEDTRONIC,\n MICROTECH,\n pumpVocabulary,\n} from '../constants';\n\nimport TextUtil from '../text/TextUtil';\nimport { statsText } from '../stat';\n\nconst t = i18next.t.bind(i18next);\n\n// Exporting utils for easy stubbing in tests\nexport const utils = {\n reshapeBgClassesToBgBounds,\n statsText,\n TextUtil,\n};\n\n/**\n * Define sections and dimensions used in the basics view\n *\n * @param {Object} bgPrefs - bgPrefs object containing viz-style bgBounds\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpUpload Tidepool latest pump upload datum\n * @returns {Object} sections\n */\nexport function defineBasicsAggregations(bgPrefs, manufacturer, pumpUpload = {}) {\n const bgLabels = generateBgRangeLabels(bgPrefs);\n bgLabels.veryLow = _.upperFirst(bgLabels.veryLow);\n bgLabels.veryHigh = _.upperFirst(bgLabels.veryHigh);\n\n const deviceLabels = getPumpVocabulary(manufacturer);\n\n const sectionNames = [\n 'basals',\n 'boluses',\n 'fingersticks',\n 'siteChanges',\n ];\n\n const sections = {};\n\n _.each(sectionNames, section => {\n let type = section;\n let dimensions;\n let title = '';\n let summaryTitle;\n let perRow = 3;\n\n switch (section) {\n case 'basals':\n title = 'Basals';\n summaryTitle = t('Total basal events');\n dimensions = [\n { path: 'basal.summary', key: 'total', label: t('Basal Events'), primary: true },\n { path: 'basal.summary.subtotals', key: 'temp', label: t('Temp Basals') },\n { path: 'basal.summary.subtotals', key: 'suspend', label: t('Suspends') },\n {\n path: 'basal.summary.subtotals',\n key: 'automatedStop',\n label: t('{{automatedLabel}} Exited', {\n automatedLabel: deviceLabels[AUTOMATED_DELIVERY],\n }),\n hideEmpty: true,\n },\n {\n path: 'automatedSuspend.summary.subtotals',\n key: 'automatedSuspend',\n label: deviceLabels[AUTOMATED_SUSPEND],\n hideEmpty: true,\n },\n ];\n perRow = 4;\n break;\n\n case 'boluses':\n title = t('Bolusing');\n summaryTitle = t('Avg boluses / day');\n dimensions = [\n { path: 'summary', key: 'total', label: t('Avg per day'), average: true, primary: true },\n { path: 'summary.subtotals', key: 'wizard', label: t('Calculator'), percentage: true, selectorIndex: 0 },\n { path: 'summary.subtotals', key: 'correction', label: t('Correction'), percentage: true, selectorIndex: 1 },\n { path: 'summary.subtotals', key: 'extended', label: t('Extended'), percentage: true, selectorIndex: 4 },\n { path: 'summary.subtotals', key: 'interrupted', label: t('Interrupted'), percentage: true, selectorIndex: 5 },\n { path: 'summary.subtotals', key: 'override', label: t('Override'), percentage: true, selectorIndex: 2 },\n { path: 'summary.subtotals', key: 'underride', label: t('Underride'), percentage: true, selectorIndex: 6 },\n ];\n\n if (pumpUpload.isAutomatedBolusDevice) {\n dimensions.push(...[\n { path: 'summary.subtotals', key: 'manual', label: t('Manual'), percentage: true, selectorIndex: 3 },\n { path: 'summary.subtotals', key: 'automated', label: t('Automated'), percentage: false, selectorIndex: 7 },\n ]);\n perRow = 4;\n }\n break;\n\n case 'fingersticks':\n title = t('BG readings');\n summaryTitle = t('Avg BG readings / day');\n dimensions = [\n { path: 'smbg.summary', key: 'total', label: t('Avg per day'), average: true, primary: true },\n { path: 'smbg.summary.subtotals', key: 'meter', label: t('Meter'), percentage: true },\n { path: 'smbg.summary.subtotals', key: 'manual', label: t('Manual'), percentage: true },\n { path: 'calibration.summary.subtotals', key: 'calibration', label: t('Calibrations'), hideEmpty: true },\n { path: 'smbg.summary.subtotals', key: 'veryLow', label: bgLabels.veryLow, percentage: true },\n { path: 'smbg.summary.subtotals', key: 'veryHigh', label: bgLabels.veryHigh, percentage: true },\n ];\n break;\n\n case 'siteChanges':\n title = t('Infusion site changes');\n break;\n\n default:\n type = false;\n break;\n }\n\n sections[section] = {\n dimensions,\n perRow,\n summaryTitle,\n title,\n type,\n };\n });\n\n return sections;\n}\n\n/**\n * Generate the day labels based on the days supplied by the processed basics view data\n *\n * @export\n * @param {Array} days - supplied by the processed basics view data\n * @returns {Array} labels - formatted day labels. I.E. [Mon, Tues, Wed, ...]\n */\nexport function generateCalendarDayLabels(days) {\n const firstDay = moment.utc(days[0].date).day();\n\n return _.map(_.range(firstDay, firstDay + 7), dow => (\n moment.utc().day(dow).format('ddd')\n ));\n}\n\n/**\n * Determine the site change source for the patient\n * @param {Object} patient\n * @param {String} manufacturer\n */\nexport function getSiteChangeSource(patient = {}, manufacturer) {\n const {\n settings,\n } = patient;\n\n let siteChangeSource = SITE_CHANGE_TYPE_UNDECLARED;\n\n if (_.includes(_.map([ANIMAS, MEDTRONIC, TANDEM], _.lowerCase), manufacturer)) {\n siteChangeSource = _.get(settings, 'siteChangeSource');\n const allowedSources = [SITE_CHANGE_CANNULA, SITE_CHANGE_TUBING];\n\n if (!_.includes(allowedSources, siteChangeSource)) {\n siteChangeSource = SITE_CHANGE_TYPE_UNDECLARED;\n }\n } else if (_.includes(_.map([INSULET, MICROTECH], _.lowerCase), manufacturer)) {\n siteChangeSource = SITE_CHANGE_RESERVOIR;\n }\n\n return siteChangeSource;\n}\n\n/**\n * Get the device-specific label for the site change source\n * @param {String} siteChangeSource\n * @param {String} manufacturer\n */\nexport function getSiteChangeSourceLabel(siteChangeSource, manufacturer) {\n const fallbackSubtitle = siteChangeSource !== SITE_CHANGE_TYPE_UNDECLARED\n ? pumpVocabulary.default[SITE_CHANGE_RESERVOIR]\n : null;\n\n return _.get(\n pumpVocabulary,\n [_.upperFirst(manufacturer), siteChangeSource],\n fallbackSubtitle,\n );\n}\n\n/**\n * Set the availability of basics sections\n *\n * @export\n * @param {Object} Provided data with empty sections disabled and empty text statements provided\n */\nexport function processBasicsAggregations(aggregations, data, patient, manufacturer) {\n /* eslint-disable no-param-reassign, max-len */\n const aggregationData = _.cloneDeep(data);\n\n const hasDataInRange = (processedData = {}) => (\n _.get(processedData.summary, 'total', _.keys(processedData.byDate).length) > 0\n );\n\n const getEmptyText = (aggregation, aggregationKey) => {\n /* eslint-disable max-len */\n let emptyText;\n\n switch (aggregationKey) {\n case 'basals':\n case 'boluses':\n emptyText = t(\"This section requires data from an insulin pump, so there's nothing to display.\");\n break;\n\n case 'siteChanges':\n emptyText = hasDataInRange(aggregationData[aggregationKey])\n ? t(\"Please choose a preferred site change source from the 'Basics' web view to view this data.\")\n : t(\"This section requires data from an insulin pump, so there's nothing to display.\");\n break;\n\n case 'fingersticks':\n emptyText = t(\"This section requires data from a blood-glucose meter, so there's nothing to display.\");\n break;\n\n default:\n emptyText = t('Why is this grey? There is not enough data to show this statistic.');\n break;\n }\n\n return emptyText;\n /* eslint-enable max-len */\n };\n\n _.each(aggregations, (aggregation, key) => {\n const type = aggregation.type;\n let disabled = false;\n\n if (type === 'boluses') {\n disabled = !hasDataInRange(aggregationData[type]);\n } else if (type === 'basals') {\n const hasBasal = hasDataInRange(aggregationData[type]?.basal);\n const hasAutomatedSuspend = hasDataInRange(aggregationData[type]?.automatedSuspend);\n disabled = !hasBasal && !hasAutomatedSuspend;\n } else if (type === 'fingersticks') {\n const hasSMBG = hasDataInRange(aggregationData[type]?.smbg);\n const hasCalibrations = hasDataInRange(aggregationData[type]?.calibration);\n disabled = !hasSMBG && !hasCalibrations;\n } else if (type === 'siteChanges') {\n aggregations[key].source = getSiteChangeSource(patient, manufacturer);\n aggregations[key].manufacturer = manufacturer;\n disabled = aggregations[key].source === SITE_CHANGE_TYPE_UNDECLARED;\n if (!disabled) {\n aggregations[key].subTitle = getSiteChangeSourceLabel(\n aggregations[key].source,\n manufacturer\n );\n }\n }\n\n if (disabled) {\n aggregations[key].emptyText = getEmptyText(aggregation, key);\n }\n\n aggregations[key].disabled = disabled;\n });\n /* eslint-enable no-param-reassign */\n\n return aggregations;\n}\n\n/**\n * Get a keyed list of dates in range, designated as future, past, or most recent\n * @param {Array} range - The start and end points (Zulu timestamp or integer hammertime)\n * @param {String} timezone - A valid timezone, UTC if undefined\n * @returns {Object} Map of objects keyed by date\n */\nexport function findBasicsDays(range, timezone = 'UTC') {\n const days = [];\n const rangeStartDate = moment.utc(range[0]).tz(timezone).format('YYYY-MM-DD');\n const rangeEndDate = moment.utc(range[1]).tz(timezone).subtract(1, 'ms').format('YYYY-MM-DD');\n let currentDate = moment.utc(range[0]).tz(timezone).startOf('isoWeek').toDate();\n while (currentDate < moment.utc(range[1]).tz(timezone).endOf('isoWeek')) {\n const date = moment.utc(currentDate).tz(timezone).format('YYYY-MM-DD');\n const dateObj = { date };\n if (date < rangeStartDate || date > rangeEndDate) {\n dateObj.type = 'outOfRange';\n } else {\n dateObj.type = 'inRange';\n }\n days.push(dateObj);\n currentDate = moment.utc(currentDate).tz(timezone).add(1, 'days').toDate();\n }\n return days;\n}\n\n/**\n * Find the appropriate start endpoint for basics calendars given the timestamp of the latest datum\n * @param {String} timestamp - Zulu timestamp (Integer hammertime also OK)\n * @param {String} timezone - A valid timezone, UTC if undefined\n * @returns {String} ISO date string relative to provided timezone\n */\nexport function findBasicsStart(timestamp, timezone = 'UTC') {\n return moment.utc(_.isInteger(timestamp) ? timestamp : Date.parse(timestamp)).tz(timezone)\n .startOf('isoWeek')\n .subtract(14, 'days')\n .toDate();\n}\n\n/**\n * basicsText\n * @param {Object} patient - the patient object that contains the profile\n * @param {Object} data - DataUtil data object\n * @param {Array} stats - Processed stats array\n * @param {Object} stats - Processed aggregations object\n *\n * @return {String} Basics data as a formatted string\n */\nexport function basicsText(patient, data, stats, aggregations) {\n const {\n bgPrefs,\n data: {\n aggregationsByDate = {},\n current: {\n endpoints = {},\n },\n },\n metaData,\n query,\n timePrefs,\n } = data;\n\n const textUtil = new utils.TextUtil(patient, endpoints.range, timePrefs);\n\n let basicsString = textUtil.buildDocumentHeader('Basics');\n basicsString += textUtil.buildDocumentDates();\n\n if (_.get(query, 'excludeDaysWithoutBolus')) {\n basicsString += textUtil.buildTextLine(t('Days with no boluses have been excluded from bolus calculations'));\n }\n\n basicsString += utils.statsText(stats, textUtil, bgPrefs);\n\n const getSummaryTableData = (dimensions, statData, header) => {\n const rows = [];\n const columns = [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ];\n\n _.each(dimensions, dimension => {\n const pathValue = _.get(statData, [...dimension.path.split('.'), dimension.key]);\n\n const value = dimension.average\n ? Math.round(_.get(statData, [...dimension.path.split('.'), 'avgPerDay']))\n : _.get(pathValue, 'count', pathValue || 0);\n\n const stat = {\n label: dimension.label,\n value: value.toString(),\n };\n\n if (dimension.primary) {\n stat.label = header;\n rows.unshift(stat);\n } else {\n if (value === 0 && dimension.hideEmpty) {\n return;\n }\n rows.push(stat);\n }\n });\n\n return { rows, columns };\n };\n\n const getSiteChangesTableData = (infusionSiteData, siteChangeSource) => {\n const rows = [];\n const columns = [\n { key: 'label', label: 'Label' },\n { key: 'value', label: 'Value' },\n ];\n\n _.each(_.valuesIn(infusionSiteData), datum => {\n const daysSince = _.get(datum, ['summary', 'daysSince', siteChangeSource]);\n if (daysSince) rows.push(daysSince);\n });\n\n return {\n columns,\n rows: [\n { label: 'Mean Duration', value: `${Math.round(_.mean(rows) * 10) / 10} days` },\n { label: 'Longest Duration', value: `${_.max(rows)} days` },\n ],\n };\n };\n\n if (!aggregations.fingersticks.disabled) {\n const fingersticks = getSummaryTableData(\n aggregations.fingersticks.dimensions,\n aggregationsByDate.fingersticks,\n aggregations.fingersticks.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n fingersticks.rows,\n fingersticks.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.boluses.disabled) {\n const boluses = getSummaryTableData(\n aggregations.boluses.dimensions,\n aggregationsByDate.boluses,\n aggregations.boluses.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n boluses.rows,\n boluses.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.siteChanges.disabled) {\n const siteChanges = getSiteChangesTableData(\n _.get(aggregationsByDate, 'siteChanges.byDate', {}),\n aggregations.siteChanges.source,\n );\n\n basicsString += textUtil.buildTextTable(\n `${aggregations.siteChanges.title} from '${aggregations.siteChanges.subTitle}'`,\n siteChanges.rows,\n siteChanges.columns,\n { showHeader: false }\n );\n }\n\n if (!aggregations.basals.disabled) {\n const basals = getSummaryTableData(\n aggregations.basals.dimensions,\n aggregationsByDate.basals,\n aggregations.basals.summaryTitle\n );\n\n basicsString += textUtil.buildTextTable(\n '',\n basals.rows,\n basals.columns,\n { showHeader: false }\n );\n }\n\n const devices = _.filter(metaData?.devices, ({ id }) => metaData?.matchedDevices?.[id]);\n\n if (devices.length) {\n const textLines = [\n `\\n${t('Devices Uploaded')}`,\n ..._.map(devices, ({ id, label }) => label || id),\n ];\n\n _.each(textLines, line => {\n basicsString += textUtil.buildTextLine(line);\n });\n }\n\n return basicsString;\n}\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}","module.exports = require(\"i18next\");","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","module.exports = \"data:image/png;base64,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\"","function _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, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","import _typeof from \"../../helpers/esm/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\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 { DEFAULT_BG_BOUNDS, MGDL_PER_MMOLL, MS_IN_MIN } from './constants';\nimport { TWENTY_FOUR_HRS } from './datetime';\n\nimport { formatBgValue } from './format.js';\n\n/**\n * classifyBgValue\n * @param {Object} bgBounds - object describing boundaries for blood glucose categories\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, 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 const { veryLowThreshold, targetLowerBound, targetUpperBound, veryHighThreshold } = bgBounds;\n if (classificationType === 'fiveWay') {\n if (bgValue < veryLowThreshold) {\n return 'veryLow';\n } else if (bgValue >= veryLowThreshold && bgValue < targetLowerBound) {\n return 'low';\n } else if (bgValue > targetUpperBound && bgValue <= veryHighThreshold) {\n return 'high';\n } else if (bgValue > veryHighThreshold) {\n return 'veryHigh';\n }\n return 'target';\n }\n if (bgValue < targetLowerBound) {\n return 'low';\n } else if (bgValue > 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 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 thresholds = _.mapValues(bgBounds, threshold => formatBgValue(threshold, bgPrefs));\n\n if (opts.condensed) {\n return {\n veryLow: `<${thresholds.veryLowThreshold}`,\n low: `${thresholds.veryLowThreshold}-${thresholds.targetLowerBound}`,\n target: `${thresholds.targetLowerBound}-${thresholds.targetUpperBound}`,\n high: `${thresholds.targetUpperBound}-${thresholds.veryHighThreshold}`,\n veryHigh: `>${thresholds.veryHighThreshold}`,\n };\n }\n\n if (opts.segmented) {\n return {\n veryLow: {\n prefix: 'below',\n suffix: bgUnits,\n value: `${thresholds.veryLowThreshold}`,\n },\n low: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.veryLowThreshold}-${thresholds.targetLowerBound}`,\n },\n target: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.targetLowerBound}-${thresholds.targetUpperBound}`,\n },\n high: {\n prefix: 'between',\n suffix: bgUnits,\n value: `${thresholds.targetUpperBound}-${thresholds.veryHighThreshold}`,\n },\n veryHigh: {\n prefix: 'above',\n suffix: bgUnits,\n value: `${thresholds.veryHighThreshold}`,\n },\n };\n }\n\n return {\n veryLow: `below ${thresholds.veryLowThreshold} ${bgUnits}`,\n low: `between ${thresholds.veryLowThreshold} - ${thresholds.targetLowerBound} ${bgUnits}`,\n target: `between ${thresholds.targetLowerBound} - ${thresholds.targetUpperBound} ${bgUnits}`,\n high: `between ${thresholds.targetUpperBound} - ${thresholds.veryHighThreshold} ${bgUnits}`,\n veryHigh: `above ${thresholds.veryHighThreshold} ${bgUnits}`,\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 let datumWeight = 1;\n const deviceId = _.get(datum, 'deviceId', '');\n\n // Because our decision as to whether or not there's enough cgm data to warrant using\n // it to calculate average BGs is based on the expected number of readings in a day,\n // we need to adjust the weight of a for the Freestyle Libre datum, as it only\n // collects BG samples every 15 minutes as opposed the default 5 minutes from dexcom.\n if (datum.type === 'cbg' && deviceId.indexOf('AbbottFreeStyleLibre') === 0) {\n datumWeight = 3;\n }\n\n return total + datumWeight;\n }, 0);\n}\n\n/**\n * Get the CGM sample frequency in milliseconds from a CGM data point. Most devices default at a\n * 5 minute interval, but others, such as the Abbot FreeStyle Libre, sample every 15 mins\n *\n * @param {Array} datum - a cgm data point\n */\nexport function cgmSampleFrequency(datum) {\n const deviceId = _.get(datum, 'deviceId', '');\n if (deviceId.indexOf('AbbottFreeStyleLibre3') === 0) {\n return 5 * MS_IN_MIN;\n }\n\n if (deviceId.indexOf('AbbottFreeStyleLibre') === 0) {\n return 15 * MS_IN_MIN;\n }\n\n return 5 * MS_IN_MIN;\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 centerOfBinMs = parseInt(binKey, 10);\n const stats = {\n id: binKey,\n min: min(data),\n mean: mean(data),\n max: max(data),\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 * 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) 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 * 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, useAGPFormat) {\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 useAGPFormat\n ? bankersRound(val, 1).toFixed(1)\n : format('.1f')(val);\n }\n\n return useAGPFormat\n ? bankersRound(val).toString()\n : format('d')(val);\n}\n\n/**\n * formatDecimalNumber\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 * 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","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","import _ from 'lodash';\n\nimport {\n AUTOMATED_BASAL_DEVICE_MODELS,\n pumpVocabulary,\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 if the provided upload datum was for an automated basal device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @param {String} deviceModel Device model number\n * @returns {Boolean}\n */\nexport function isAutomatedBasalDevice(manufacturer, pumpSettings = {}, deviceModel) {\n return _.includes(\n _.get(AUTOMATED_BASAL_DEVICE_MODELS, deviceName(manufacturer), []),\n deviceModel\n ) || (manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0);\n}\n\n/**\n * Check if the provided upload datum was for an automated bolus device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @returns {Boolean}\n */\nexport function isAutomatedBolusDevice(manufacturer, pumpSettings = {}) {\n return manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0;\n}\n\n/**\n * Check if the provided upload datum was for a settings-overrideable device\n * @param {String} manufacturer Manufacturer name\n * @param {Object} pumpSettings Tidepool pumpSettings datum\n * @returns {Boolean}\n */\nexport function isSettingsOverrideDevice(manufacturer, pumpSettings = {}) {\n return manufacturer === 'tandem' && _.get(pumpSettings, 'deviceId', '').indexOf('tandemCIQ') === 0;\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, _.upperFirst(manufacturer), {}),\n vocabulary.default\n );\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;","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 PHYSICAL_ACTIVITY,\n LBS_PER_KG,\n MS_IN_DAY,\n SCHEDULED_DELIVERY,\n SETTINGS_OVERRIDE,\n SLEEP,\n} from './constants';\n\nimport { getPumpVocabulary } from './device';\nimport { bankersRound, formatDecimalNumber, formatBgValue } 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 formatDatum = (datum = {}, format, opts = {}) => {\n let id = datum.id;\n let value = datum.value;\n let suffix = datum.suffix || '';\n let deviation;\n let lowerValue;\n let lowerColorId;\n let upperValue;\n let upperColorId;\n\n _.defaults(opts, {\n emptyDataPlaceholder: '--',\n forcePlainTextValues: false,\n });\n\n const total = _.get(opts, 'data.total.value');\n\n const disableStat = () => {\n id = 'statDisabled';\n value = opts.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(opts.bgPrefs, { condensed: true })[id];\n break;\n\n case statFormats.bgValue:\n if (value >= 0) {\n id = classifyBgValue(_.get(opts.bgPrefs, 'bgBounds'), value);\n value = formatBgValue(value, opts.bgPrefs, undefined, opts.useAGPFormat);\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 = opts.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 = opts.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 const percentage = (value / total) * 100;\n let precision = 0;\n // We want to show extra precision on very small percentages so that we avoid showing 0%\n // when there is some data there.\n if (percentage > 0 && percentage < 0.5) {\n precision = percentage < 0.05 ? 2 : 1;\n }\n value = formatDecimalNumber(percentage, precision);\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(opts.bgPrefs, 'bgBounds'), lowerValue)\n : 'low';\n\n upperValue = value + deviation;\n upperColorId = classifyBgValue(_.get(opts.bgPrefs, 'bgBounds'), upperValue);\n\n lowerValue = formatBgValue(lowerValue, opts.bgPrefs);\n upperValue = formatBgValue(upperValue, opts.bgPrefs);\n\n value = !opts.forcePlainTextValues ? (\n <span>\n <span style={{\n color: BG_COLORS[lowerColorId],\n }}>\n {lowerValue}\n </span>\n &nbsp;-&nbsp;\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, opts.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\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.'));\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. 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 a settings override.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabel}} divided by the total duration of settings overrides for this time period.\\n\\n**(time)** is 24 hours multiplied by % in {{overrideLabel}}.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n } else {\n annotations.push(t('**Time In {{overrideLabel}}:** Time spent in a settings override.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\n annotations.push(t('**How we calculate this:**\\n\\n**(%)** is the duration in {{overrideLabel}} divided by the total duration of settings overrides for this time period.\\n\\n**(time)** is total duration of time in {{overrideLabel}}.', { overrideLabel: vocabulary[SETTINGS_OVERRIDE] }));\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'));\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 this time period.'));\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: 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 bgRanges = generateBgRangeLabels(opts.bgPrefs, { condensed: true });\n\n let statData = {\n raw: {\n days: opts.days,\n ...data,\n },\n };\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\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 = [\n {\n id: 'veryLow',\n value: ensureNumeric(data.veryLow),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.veryLow,\n },\n {\n id: 'low',\n value: ensureNumeric(data.low),\n title: t('Readings Below Range'),\n legendTitle: bgRanges.low,\n },\n {\n id: 'target',\n value: ensureNumeric(data.target),\n title: t('Readings In Range'),\n legendTitle: bgRanges.target,\n },\n {\n id: 'high',\n value: ensureNumeric(data.high),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.high,\n },\n {\n id: 'veryHigh',\n value: ensureNumeric(data.veryHigh),\n title: t('Readings Above Range'),\n legendTitle: bgRanges.veryHigh,\n },\n ];\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.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 = [\n {\n id: 'physicalActivity',\n value: ensureNumeric(_.get(data, 'physicalActivity', 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [PHYSICAL_ACTIVITY, 'label']) }),\n legendTitle: _.get(vocabulary, [PHYSICAL_ACTIVITY, 'label']),\n },\n {\n id: 'sleep',\n value: ensureNumeric(_.get(data, 'sleep', 0)),\n title: t('Time In {{overrideLabel}}', { overrideLabel: _.get(vocabulary, [SLEEP, 'label']) }),\n legendTitle: _.get(vocabulary, [SLEEP, 'label']),\n },\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 = [\n {\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 {\n id: 'veryHigh',\n value: ensureNumeric(data.durations.veryHigh),\n title: t('Time Above Range'),\n legendTitle: bgRanges.veryHigh,\n },\n ];\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\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('BG Extents ({{bgSourceLabel}})', { bgSourceLabel: statBgSourceLabels[bgSource] });\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 };\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 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","/*\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';\n\nimport * as datetime from '../datetime';\nimport * as format from '../format';\nimport { getPumpVocabulary } from '../device';\n\nimport {\n MAX_BOLUS,\n MAX_BASAL,\n INSULIN_DURATION,\n} from '../../utils/constants';\n\nconst DISPLAY_PRECISION_PLACES = 3;\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\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 };\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, DISPLAY_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(DISPLAY_PRECISION_PLACES)) * hrs;\n total += parseFloat(amount.toFixed(DISPLAY_PRECISION_PLACES));\n }\n return format.formatDecimalNumber(total, DISPLAY_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\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\n * @param {String} [scheduleName] name of schedule for tandem settings\n */\nexport function insulinSettings(settings, manufacturer, scheduleName) {\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 const 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 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 const rows = [\n { setting: deviceLabels[MAX_BASAL], value: maxBasal ? `${maxBasal} U/hr` : '-' },\n { setting: deviceLabels[MAX_BOLUS], value: maxBolus ? `${maxBolus} U` : '-' },\n { setting: deviceLabels[INSULIN_DURATION], value: insulinDuration ? `${insulinDuration} hrs` : '-' },\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","import defineProperty from \"./defineProperty\";\nexport default function _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(Object(source));\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();\n}","export default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n }\n}","export default function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}","module.exports = require(\"d3-array\");","module.exports = require(\"moment-timezone\");","/*\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/* global PDFDocument, blobStream */\nimport Promise from 'bluebird';\nimport _ from 'lodash';\n\nimport i18next from 'i18next';\nimport PrintView from './PrintView';\nimport BasicsPrintView from './BasicsPrintView';\nimport DailyPrintView from './DailyPrintView';\nimport BgLogPrintView from './BgLogPrintView';\nimport SettingsPrintView from './SettingsPrintView';\nimport AGPPrintView from './AGPPrintView';\n\nimport * as constants from './utils/constants';\n\nif (_.get(i18next, 'options.returnEmptyString') === undefined) {\n // Return key if no translation is present\n i18next.init({ returnEmptyString: false, nsSeparator: '|' });\n}\n\nconst t = i18next.t.bind(i18next);\n\n// Exporting utils for easy stubbing in tests\nexport const utils = {\n PDFDocument: class PDFDocumentStub {},\n blobStream: function blobStreamStub() {},\n PrintView,\n BasicsPrintView,\n DailyPrintView,\n BgLogPrintView,\n SettingsPrintView,\n AGPPrintView,\n};\n\n/**\n * createPrintView\n * @param {Object} doc - PDFKit document instance\n * @param {Object} data - pre-munged data for the daily print view\n * @param {Object} bgPrefs - user's blood glucose thresholds & targets\n * @param {Object} timePrefs - object containing timezoneAware Boolean, timezoneName String or null\n * @param {Number} numDays - number of days of daily view to include in printout\n * @param {Object} patient - full tidepool patient object\n *\n * @return {Object} dailyPrintView instance\n */\nexport function createPrintView(type, data, opts, doc) {\n const {\n patient,\n svgDataURLS,\n } = opts;\n\n let Renderer;\n let renderOpts = {\n // TODO: set this up as a Webpack Define plugin to pull from env variable\n // maybe that'll be tricky through React Storybook?\n debug: false,\n defaultFontSize: constants.DEFAULT_FONT_SIZE,\n dpi: constants.DPI,\n footerFontSize: constants.FOOTER_FONT_SIZE,\n headerFontSize: constants.HEADER_FONT_SIZE,\n height: constants.HEIGHT,\n margins: constants.MARGINS,\n patient,\n smallFontSize: constants.SMALL_FONT_SIZE,\n svgDataURLS,\n width: constants.WIDTH,\n };\n\n switch (type) {\n case 'daily':\n Renderer = utils.DailyPrintView;\n\n renderOpts = _.assign(renderOpts, {\n chartsPerPage: 3,\n summaryHeaderFontSize: 10,\n summaryWidthAsPercentage: 0.18,\n title: t('Daily Charts'),\n });\n break;\n\n case 'basics':\n Renderer = utils.BasicsPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('The Basics'),\n });\n break;\n\n case 'bgLog':\n Renderer = utils.BgLogPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('BG Log'),\n });\n break;\n\n case 'settings':\n Renderer = utils.SettingsPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('Pump Settings'),\n });\n break;\n\n case 'agp':\n Renderer = utils.AGPPrintView;\n\n renderOpts = _.assign(renderOpts, {\n title: t('AGP Charts'),\n });\n break;\n\n default:\n return null;\n }\n\n return new Renderer(doc, data, renderOpts);\n}\n\n/**\n * createPrintPDFPackage\n * @param {Array} data - Object of tideline-preprocessed Tidepool diabetes data & notes;\n * grouped by type\n * @param {Object} opts - an object of print options (see destructured param below)\n *\n * @return {Promise} - Promise that resolves with an object containing the pdf blob and url\n */\nexport function createPrintPDFPackage(data, opts) {\n const {\n patient,\n basics = {},\n daily = {},\n bgLog = {},\n settings = {},\n agp = {},\n } = opts;\n\n if (_.get(patient, 'preferences.displayLanguageCode')) {\n i18next.changeLanguage(patient.preferences.displayLanguageCode);\n }\n\n const pdfOpts = _.cloneDeep(opts);\n\n return new Promise(async (resolve, reject) => {\n const DocLib = typeof PDFDocument !== 'undefined' ? PDFDocument : utils.PDFDocument;\n const streamLib = typeof blobStream !== 'undefined' ? blobStream : utils.blobStream;\n\n /* NB: if you don't set the `margin` (or `margins` if not all are the same)\n then when you are using the .text() command a new page will be added if you specify\n coordinates outside of the default margin (or outside of the margins you've specified)\n */\n const doc = new DocLib({ autoFirstPage: false, bufferPages: true, margin: constants.MARGIN });\n const stream = doc.pipe(streamLib());\n\n if (!basics.disabled) createPrintView('basics', data.basics, pdfOpts, doc).render();\n if (!daily.disabled) createPrintView('daily', data.daily, pdfOpts, doc).render();\n if (!bgLog.disabled) createPrintView('bgLog', data.bgLog, pdfOpts, doc).render();\n if (!settings.disabled) createPrintView('settings', data.settings, pdfOpts, doc).render();\n if (!agp.disabled) await createPrintView('agp', data.agp, pdfOpts, doc).render();\n\n PrintView.renderPageNumbers(doc);\n\n doc.end();\n\n stream.on('finish', () => {\n const pdf = {\n blob: stream.toBlob(),\n url: stream.toBlobURL('application/pdf'),\n };\n return resolve(pdf);\n });\n\n stream.on('error', (error) => {\n stream.end();\n return reject(error);\n });\n });\n}\n\nexport default createPrintPDFPackage;\n","module.exports = require(\"bluebird\");","module.exports = require(\"voilab-pdf-table\");","/*jslint node: true, unparam: true, nomen: true */\n'use strict';\n\nvar lodash = require('lodash'),\n\n /**\n * Plugin constructor. Configuration may take parameters listed below.\n *\n * @param {String} column stretched column index\n * @param {Number} maxWidth table max width. Default to page width minus\n * margins\n */\n PdfTableFitColumn = function (conf) {\n lodash.merge(this, {\n\n id: 'fitcolumn',\n\n /**\n * Stretched column index\n * @var {String}\n */\n column: null,\n\n /**\n * Table max width. Default to page width minus margins\n * @var {Number}\n */\n maxWidth: null,\n\n /**\n * Calculated width at EV_BODY_ADD event\n * @var {Number}\n */\n calculatedWidth: null\n\n }, lodash.clone(conf || {}));\n };\n\nlodash.assign(PdfTableFitColumn.prototype, {\n\n /**\n * Configure plugin by attaching functions to table events\n *\n * @param {PdfTable}\n * @return {void}\n */\n configure: function (table) {\n table\n .onBodyAdd(this.setWidth.bind(this))\n .onColumnAdded(this.onColumnAdded.bind(this))\n .onColumnPropertyChanged(this.onColumnPropertyChanged.bind(this));\n },\n\n /**\n * Reinit width after a column is added\n *\n * @param {PdfTable}\n * @return {PdfTableFitColumn}\n */\n onColumnAdded: function (table) {\n return this.reinitWidth(table);\n },\n\n /**\n * Reinit width after width or hidden property changed\n *\n * @param {PdfTable} table\n * @param {Object} column\n * @param {String} prop\n * @return {PdfTableFitColumn}\n */\n onColumnPropertyChanged: function (table, column, prop) {\n // manage width changes and show/hide changes\n if (prop !== 'width' && prop !== 'hidden') {\n return this;\n }\n return this.reinitWidth(table);\n },\n\n /**\n * Reset width, so calculation can be re-executed\n *\n * @return {PdfTableFitColumn}\n */\n resetWidth: function () {\n this.calculatedWidth = null;\n return this;\n },\n\n /**\n * Reinit width\n *\n * @param {PdfTable} table\n * @return {PdfTableFitColumn}\n */\n reinitWidth: function (table) {\n return this\n .resetWidth()\n .setWidth(table);\n },\n\n /**\n * Check the max width of the stretched column. This method is called just\n * before we start to add data rows\n *\n * @param {PdfTable} table\n * @return {void}\n */\n setWidth: function (table) {\n if (!table.pdf.page) {\n return;\n }\n if (this.calculatedWidth === null) {\n var self = this,\n content_width = this.maxWidth,\n width = lodash.sumBy(table.getColumns(), function (column) {\n return column.id !== self.column ? column.width : 0;\n });\n\n if (!content_width) {\n content_width = table.pdf.page.width\n - table.pdf.page.margins.left\n - table.pdf.page.margins.right;\n }\n\n this.calculatedWidth = content_width - width;\n if (this.calculatedWidth < 0) {\n this.calculatedWidth = 0;\n }\n }\n table.setColumnWidth(this.column, this.calculatedWidth, true);\n }\n\n});\n\nmodule.exports = PdfTableFitColumn;\n","var SVGtoPDF = function(doc, svg, x, y, options) {\r\n \"use strict\";\r\n\r\n const NamedColors = {aliceblue: [240,248,255], antiquewhite: [250,235,215], aqua: [0,255,255], aquamarine: [127,255,212], azure: [240,255,255], beige: [245,245,220], bisque: [255,228,196], black: [0,0,0], blanchedalmond: [255,235,205], blue: [0,0,255], blueviolet: [138,43,226], brown: [165,42,42], burlywood: [222,184,135], cadetblue: [95,158,160], chartreuse: [127,255,0],\r\n chocolate: [210,105,30], coral: [255,127,80], cornflowerblue: [100,149,237], cornsilk: [255,248,220], crimson: [220,20,60], cyan: [0,255,255], darkblue: [0,0,139], darkcyan: [0,139,139], darkgoldenrod: [184,134,11], darkgray: [169,169,169], darkgrey: [169,169,169], darkgreen: [0,100,0], darkkhaki: [189,183,107], darkmagenta: [139,0,139], darkolivegreen: [85,107,47],\r\n darkorange: [255,140,0], darkorchid: [153,50,204], darkred: [139,0,0], darksalmon: [233,150,122], darkseagreen: [143,188,143], darkslateblue: [72,61,139], darkslategray: [47,79,79], darkslategrey: [47,79,79], darkturquoise: [0,206,209], darkviolet: [148,0,211], deeppink: [255,20,147], deepskyblue: [0,191,255], dimgray: [105,105,105], dimgrey: [105,105,105],\r\n dodgerblue: [30,144,255], firebrick: [178,34,34], floralwhite: [255,250,240], forestgreen: [34,139,34], fuchsia: [255,0,255], gainsboro: [220,220,220], ghostwhite: [248,248,255], gold: [255,215,0], goldenrod: [218,165,32], gray: [128,128,128], grey: [128,128,128], green: [0,128,0], greenyellow: [173,255,47], honeydew: [240,255,240], hotpink: [255,105,180],\r\n indianred: [205,92,92], indigo: [75,0,130], ivory: [255,255,240], khaki: [240,230,140], lavender: [230,230,250], lavenderblush: [255,240,245], lawngreen: [124,252,0], lemonchiffon: [255,250,205], lightblue: [173,216,230], lightcoral: [240,128,128], lightcyan: [224,255,255], lightgoldenrodyellow: [250,250,210], lightgray: [211,211,211], lightgrey: [211,211,211],\r\n lightgreen: [144,238,144], lightpink: [255,182,193], lightsalmon: [255,160,122], lightseagreen: [32,178,170], lightskyblue: [135,206,250], lightslategray: [119,136,153], lightslategrey: [119,136,153], lightsteelblue: [176,196,222], lightyellow: [255,255,224], lime: [0,255,0], limegreen: [50,205,50], linen: [250,240,230], magenta: [255,0,255], maroon: [128,0,0],\r\n mediumaquamarine: [102,205,170], mediumblue: [0,0,205], mediumorchid: [186,85,211], mediumpurple: [147,112,219], mediumseagreen: [60,179,113], mediumslateblue: [123,104,238], mediumspringgreen: [0,250,154], mediumturquoise: [72,209,204], mediumvioletred: [199,21,133], midnightblue: [25,25,112], mintcream: [245,255,250], mistyrose: [255,228,225], moccasin: [255,228,181],\r\n navajowhite: [255,222,173], navy: [0,0,128], oldlace: [253,245,230], olive: [128,128,0], olivedrab: [107,142,35], orange: [255,165,0], orangered: [255,69,0], orchid: [218,112,214], palegoldenrod: [238,232,170], palegreen: [152,251,152], paleturquoise: [175,238,238], palevioletred: [219,112,147], papayawhip: [255,239,213], peachpuff: [255,218,185], peru: [205,133,63],\r\n pink: [255,192,203], plum: [221,160,221], powderblue: [176,224,230], purple: [128,0,128], rebeccapurple: [102,51,153], red: [255,0,0], rosybrown: [188,143,143], royalblue: [65,105,225], saddlebrown: [139,69,19], salmon: [250,128,114], sandybrown: [244,164,96], seagreen: [46,139,87], seashell: [255,245,238], sienna: [160,82,45], silver: [192,192,192], skyblue: [135,206,235],\r\n slateblue: [106,90,205], slategray: [112,128,144], slategrey: [112,128,144], snow: [255,250,250], springgreen: [0,255,127], steelblue: [70,130,180], tan: [210,180,140], teal: [0,128,128], thistle: [216,191,216], tomato: [255,99,71], turquoise: [64,224,208], violet: [238,130,238], wheat: [245,222,179], white: [255,255,255], whitesmoke: [245,245,245], yellow: [255,255,0]};\r\n const DefaultColors = {black: [NamedColors.black, 1], white: [NamedColors.white, 1], transparent: [NamedColors.black, 0]};\r\n const Entities = {quot: 34, amp: 38, lt: 60, gt: 62, apos: 39, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, circ: 710, tilde: 732, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, permil: 8240, lsaquo: 8249,\r\n rsaquo: 8250, euro: 8364, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, copy: 169, ordf: 170, laquo: 171, not: 172, shy: 173, reg: 174, macr: 175, deg: 176, plusmn: 177, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, sup1: 185, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190,\r\n iquest: 191, Agrave: 192, Aacute: 193, Acirc: 194, Atilde: 195, Auml: 196, Aring: 197, AElig: 198, Ccedil: 199, Egrave: 200, Eacute: 201, Ecirc: 202, Euml: 203, Igrave: 204, Iacute: 205, Icirc: 206, Iuml: 207, ETH: 208, Ntilde: 209, Ograve: 210, Oacute: 211, Ocirc: 212, Otilde: 213, Ouml: 214, times: 215, Oslash: 216, Ugrave: 217, Uacute: 218, Ucirc: 219, Uuml: 220, Yacute: 221,\r\n THORN: 222, szlig: 223, agrave: 224, aacute: 225, acirc: 226, atilde: 227, auml: 228, aring: 229, aelig: 230, ccedil: 231, egrave: 232, eacute: 233, ecirc: 234, euml: 235, igrave: 236, iacute: 237, icirc: 238, iuml: 239, eth: 240, ntilde: 241, ograve: 242, oacute: 243, ocirc: 244, otilde: 245, ouml: 246, divide: 247, oslash: 248, ugrave: 249, uacute: 250, ucirc: 251, uuml: 252,\r\n yacute: 253, thorn: 254, yuml: 255, fnof: 402, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949,\r\n zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, bull: 8226, hellip: 8230, prime: 8242, Prime: 8243, oline: 8254, frasl: 8260, weierp: 8472, image: 8465, real: 8476,\r\n trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744,\r\n cap: 8745, cup: 8746, int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830};\r\n const PathArguments = {A: 7, a: 7, C: 6, c: 6, H: 1, h: 1, L: 2, l: 2, M: 2, m: 2, Q: 4, q: 4, S: 4, s: 4, T: 2, t: 2, V: 1, v: 1, Z: 0, z: 0};\r\n const PathFlags = {A3: true, A4: true, a3: true, a4: true};\r\n const Properties = {\r\n 'color': {inherit: true, initial: undefined},\r\n 'visibility': {inherit: true, initial: 'visible', values: {'hidden': 'hidden', 'collapse': 'hidden', 'visible':'visible'}},\r\n 'fill': {inherit: true, initial: DefaultColors.black},\r\n 'stroke': {inherit: true, initial: 'none'},\r\n 'stop-color': {inherit: false, initial: DefaultColors.black},\r\n 'fill-opacity': {inherit: true, initial: 1},\r\n 'stroke-opacity': {inherit: true, initial: 1},\r\n 'stop-opacity': {inherit: false, initial: 1},\r\n 'fill-rule': {inherit: true, initial: 'nonzero', values: {'nonzero':'nonzero', 'evenodd':'evenodd'}},\r\n 'clip-rule': {inherit: true, initial: 'nonzero', values: {'nonzero':'nonzero', 'evenodd':'evenodd'}},\r\n 'stroke-width': {inherit: true, initial: 1},\r\n 'stroke-dasharray': {inherit: true, initial: []},\r\n 'stroke-dashoffset': {inherit: true, initial: 0},\r\n 'stroke-miterlimit': {inherit: true, initial: 4},\r\n 'stroke-linejoin': {inherit: true, initial: 'miter', values: {'miter':'miter', 'round':'round', 'bevel':'bevel'}},\r\n 'stroke-linecap': {inherit: true, initial: 'butt', values: {'butt':'butt', 'round':'round', 'square':'square'}},\r\n 'font-size': {inherit: true, initial: 16, values: {'xx-small':9, 'x-small':10, 'small':13, 'medium':16, 'large':18, 'x-large':24, 'xx-large':32}},\r\n 'font-family': {inherit: true, initial: 'sans-serif'},\r\n 'font-weight': {inherit: true, initial: 'normal', values: {'600':'bold', '700':'bold', '800':'bold', '900':'bold', 'bold':'bold', 'bolder':'bold', '500':'normal', '400':'normal', '300':'normal', '200':'normal', '100':'normal', 'normal':'normal', 'lighter':'normal'}},\r\n 'font-style': {inherit: true, initial: 'normal', values: {'italic':'italic', 'oblique':'italic', 'normal':'normal'}},\r\n 'text-anchor': {inherit: true, initial: 'start', values: {'start':'start', 'middle':'middle', 'end':'end'}},\r\n 'direction': {inherit: true, initial: 'ltr', values: {'ltr':'ltr', 'rtl':'rtl'}},\r\n 'dominant-baseline': {inherit: true, initial: 'baseline', values: {'auto':'baseline', 'baseline':'baseline', 'before-edge':'before-edge', 'text-before-edge':'before-edge', 'middle':'middle', 'central':'central', 'after-edge':'after-edge', 'text-after-edge':'after-edge', 'ideographic':'ideographic', 'alphabetic':'alphabetic', 'hanging':'hanging', 'mathematical':'mathematical'}},\r\n 'alignment-baseline': {inherit: false, initial: undefined, values: {'auto':'baseline', 'baseline':'baseline', 'before-edge':'before-edge', 'text-before-edge':'before-edge', 'middle':'middle', 'central':'central', 'after-edge':'after-edge', 'text-after-edge':'after-edge', 'ideographic':'ideographic', 'alphabetic':'alphabetic', 'hanging':'hanging', 'mathematical':'mathematical'}},\r\n 'baseline-shift': {inherit: true, initial: 'baseline', values: {'baseline':'baseline', 'sub':'sub', 'super':'super'}},\r\n 'word-spacing': {inherit: true, initial: 0, values: {normal:0}},\r\n 'letter-spacing': {inherit: true, initial: 0, values: {normal:0}},\r\n 'text-decoration': {inherit: false, initial: 'none', values: {'none':'none', 'underline':'underline', 'overline':'overline', 'line-through':'line-through'}},\r\n 'xml:space': {inherit: true, initial: 'default', css: 'white-space', values: {'preserve':'preserve', 'default':'default', 'pre':'preserve', 'pre-line':'preserve', 'pre-wrap':'preserve', 'nowrap': 'default'}},\r\n 'marker-start': {inherit: true, initial: 'none'},\r\n 'marker-mid': {inherit: true, initial: 'none'},\r\n 'marker-end': {inherit: true, initial: 'none'},\r\n 'opacity': {inherit: false, initial: 1},\r\n 'transform': {inherit: false, initial: [1, 0, 0, 1, 0, 0]},\r\n 'display': {inherit: false, initial: 'inline', values: {'none':'none', 'inline':'inline', 'block':'inline'}},\r\n 'clip-path': {inherit: false, initial: 'none'},\r\n 'mask': {inherit: false, initial: 'none'},\r\n 'overflow': {inherit: false, initial: 'hidden', values: {'hidden':'hidden', 'scroll':'hidden', 'visible':'visible'}}\r\n };\r\n\r\n function docBeginGroup(bbox) {\r\n let group = new (function PDFGroup() {})();\r\n group.name = 'G' + (doc._groupCount = (doc._groupCount || 0) + 1);\r\n group.resources = doc.ref();\r\n group.xobj = doc.ref({\r\n Type: 'XObject',\r\n Subtype: 'Form',\r\n FormType: 1,\r\n BBox: bbox,\r\n Group: {S: 'Transparency', CS: 'DeviceRGB', I: true, K: false},\r\n Resources: group.resources\r\n });\r\n group.xobj.write('');\r\n group.savedMatrix = doc._ctm;\r\n group.savedPage = doc.page;\r\n groupStack.push(group);\r\n doc._ctm = [1, 0, 0, 1, 0, 0];\r\n doc.page = {\r\n width: doc.page.width, height: doc.page.height,\r\n write: function(data) {group.xobj.write(data);},\r\n fonts: {}, xobjects: {}, ext_gstates: {}, patterns: {}\r\n };\r\n return group;\r\n }\r\n function docEndGroup(group) {\r\n if (group !== groupStack.pop()) {throw('Group not matching');}\r\n if (Object.keys(doc.page.fonts).length) {group.resources.data.Font = doc.page.fonts;}\r\n if (Object.keys(doc.page.xobjects).length) {group.resources.data.XObject = doc.page.xobjects;}\r\n if (Object.keys(doc.page.ext_gstates).length) {group.resources.data.ExtGState = doc.page.ext_gstates;}\r\n if (Object.keys(doc.page.patterns).length) {group.resources.data.Pattern = doc.page.patterns;}\r\n group.resources.end();\r\n group.xobj.end();\r\n doc._ctm = group.savedMatrix;\r\n doc.page = group.savedPage;\r\n }\r\n function docInsertGroup(group) {\r\n doc.page.xobjects[group.name] = group.xobj;\r\n doc.addContent('/' + group.name + ' Do');\r\n }\r\n function docApplyMask(group, clip) {\r\n let name = 'M' + (doc._maskCount = (doc._maskCount || 0) + 1);\r\n let gstate = doc.ref({\r\n Type: 'ExtGState', CA: 1, ca: 1, BM: 'Normal',\r\n SMask: {S: 'Luminosity', G: group.xobj, BC: (clip ? [0, 0, 0] : [1, 1, 1])}\r\n });\r\n gstate.end();\r\n doc.page.ext_gstates[name] = gstate;\r\n doc.addContent('/' + name + ' gs');\r\n }\r\n function docCreatePattern(group, dx, dy, matrix) {\r\n let pattern = new (function PDFPattern() {})();\r\n pattern.group = group;\r\n pattern.dx = dx;\r\n pattern.dy = dy;\r\n pattern.matrix = matrix || [1, 0, 0, 1, 0, 0];\r\n return pattern;\r\n }\r\n function docUsePattern(pattern, stroke) {\r\n let name = 'P' + (doc._patternCount = (doc._patternCount || 0) + 1);\r\n let ref = doc.ref({\r\n Type: 'Pattern', PatternType: 1, PaintType: 1, TilingType: 2,\r\n BBox: [0, 0, pattern.dx, pattern.dy], XStep: pattern.dx, YStep: pattern.dy,\r\n Matrix: multiplyMatrix(doc._ctm, pattern.matrix),\r\n Resources: {\r\n ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],\r\n XObject: (function() {let temp = {}; temp[pattern.group.name] = pattern.group.xobj; return temp;})()\r\n }\r\n });\r\n ref.write('/' + pattern.group.name + ' Do');\r\n ref.end();\r\n doc.page.patterns[name] = ref;\r\n if (stroke) {\r\n doc.addContent('/Pattern CS');\r\n doc.addContent('/' + name + ' SCN');\r\n } else {\r\n doc.addContent('/Pattern cs');\r\n doc.addContent('/' + name + ' scn');\r\n }\r\n }\r\n function docBeginText(font, size) {\r\n if (!doc.page.fonts[font.id]) {doc.page.fonts[font.id] = font.ref();}\r\n doc.addContent('BT').addContent('/' + font.id + ' ' + size + ' Tf');\r\n }\r\n function docSetTextMatrix(a, b, c, d, e, f) {\r\n doc.addContent(validateNumber(a) + ' ' + validateNumber(b) + ' ' + validateNumber(-c) + ' ' + validateNumber(-d) + ' ' + validateNumber(e) + ' ' + validateNumber(f) + ' Tm');\r\n }\r\n function docSetTextMode(fill, stroke) {\r\n let mode = fill && stroke ? 2 : stroke ? 1 : fill ? 0 : 3;\r\n doc.addContent(mode + ' Tr');\r\n }\r\n function docWriteGlyph(glyph) {\r\n doc.addContent('<' + glyph + '> Tj');\r\n }\r\n function docEndText() {\r\n doc.addContent('ET');\r\n }\r\n function docFillColor(color) {\r\n if (color[0].constructor.name === 'PDFPattern') {\r\n doc.fillOpacity(color[1]);\r\n docUsePattern(color[0], false);\r\n } else {\r\n doc.fillColor(color[0], color[1]);\r\n }\r\n }\r\n function docStrokeColor(color) {\r\n if (color[0].constructor.name === 'PDFPattern') {\r\n doc.strokeOpacity(color[1]);\r\n docUsePattern(color[0], true);\r\n } else {\r\n doc.strokeColor(color[0], color[1]);\r\n }\r\n }\r\n function docInsertLink(x, y, w, h, url) {\r\n let ref = doc.ref({\r\n Type: 'Annot',\r\n Subtype: 'Link',\r\n Rect: [x, y, w, h],\r\n Border: [0, 0, 0],\r\n A: {\r\n S: 'URI',\r\n URI: new String(url)\r\n }\r\n });\r\n ref.end();\r\n links.push(ref);\r\n }\r\n function parseXml(xml) {\r\n let SvgNode = function(tag, type, value, error) {\r\n this.error = error;\r\n this.nodeName = tag;\r\n this.nodeValue = value;\r\n this.nodeType = type;\r\n this.attributes = Object.create(null);\r\n this.childNodes = [];\r\n this.parentNode = null;\r\n this.id = '';\r\n this.textContent = '';\r\n this.classList = [];\r\n };\r\n SvgNode.prototype.getAttribute = function(attr) {\r\n return this.attributes[attr] != null ? this.attributes[attr] : null;\r\n };\r\n SvgNode.prototype.getElementById = function(id) {\r\n let result = null;\r\n (function recursive(node) {\r\n if (result) {return;}\r\n if (node.nodeType === 1) {\r\n if (node.id === id) {result = node;}\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n recursive(node.childNodes[i]);\r\n }\r\n }\r\n })(this);\r\n return result;\r\n };\r\n SvgNode.prototype.getElementsByTagName = function(tag) {\r\n let result = [];\r\n (function recursive(node) {\r\n if (node.nodeType === 1) {\r\n if (node.nodeName === tag) {result.push(node);}\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n recursive(node.childNodes[i]);\r\n }\r\n }\r\n })(this);\r\n return result;\r\n };\r\n let parser = new StringParser(xml.trim()), result, child, error = false; \r\n let recursive = function() {\r\n let temp, child;\r\n if (temp = parser.match(/^<([\\w:.-]+)\\s*/, true)) { // Opening tag\r\n let node = new SvgNode(temp[1], 1, null, error);\r\n while (temp = parser.match(/^([\\w:.-]+)(?:\\s*=\\s*\"([^\"]*)\"|\\s*=\\s*'([^']*)')?\\s*/, true)) { // Attribute\r\n let attr = temp[1], value = decodeEntities(temp[2] || temp[3] || '');\r\n if (!node.attributes[attr]) {\r\n node.attributes[attr] = value;\r\n if (attr === 'id') {node.id = value;}\r\n if (attr === 'class') {node.classList = value.split(' ');}\r\n } else {\r\n warningCallback('parseXml: duplicate attribute \"' + attr + '\"');\r\n error = true;\r\n }\r\n }\r\n if (parser.match(/^>/)) { // End of opening tag\r\n while (child = recursive()) {\r\n node.childNodes.push(child);\r\n child.parentNode = node;\r\n node.textContent += (child.nodeType === 3 || child.nodeType === 4 ? child.nodeValue : child.textContent);\r\n }\r\n if (temp = parser.match(/^<\\/([\\w:.-]+)\\s*>/, true)) { // Closing tag\r\n if (temp[1] === node.nodeName) {\r\n return node;\r\n } else {\r\n warningCallback('parseXml: tag not matching, opening \"' + node.nodeName + '\" & closing \"' + temp[1] + '\"');\r\n error = true;\r\n return node;\r\n }\r\n } else {\r\n warningCallback('parseXml: tag not matching, opening \"' + node.nodeName + '\" & not closing');\r\n error = true;\r\n return node;\r\n }\r\n } else if (parser.match(/^\\/>/)) { // Self-closing tag\r\n return node;\r\n } else {\r\n warningCallback('parseXml: tag could not be parsed \"' + node.nodeName + '\"');\r\n error = true;\r\n }\r\n } else if (temp = parser.match(/^<!--[\\s\\S]*?-->/)) { // Comment\r\n return new SvgNode(null, 8, temp, error);\r\n } else if (temp = parser.match(/^<\\?[\\s\\S]*?\\?>/)) { // Processing instructions\r\n return new SvgNode(null, 7, temp, error);\r\n } else if (temp = parser.match(/^<!DOCTYPE\\s*([\\s\\S]*?)>/)) { // Doctype\r\n return new SvgNode(null, 10, temp, error);\r\n } else if (temp = parser.match(/^<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/, true)) { // Cdata node\r\n return new SvgNode('#cdata-section', 4, temp[1], error);\r\n } else if (temp = parser.match(/^([^<]+)/, true)) { // Text node\r\n return new SvgNode('#text', 3, decodeEntities(temp[1]), error);\r\n }\r\n };\r\n while (child = recursive()) {\r\n if (child.nodeType === 1 && !result) {\r\n result = child;\r\n } else if (child.nodeType === 1 || (child.nodeType === 3 && child.nodeValue.trim() !== '')) {\r\n warningCallback('parseXml: data after document end has been discarded');\r\n }\r\n }\r\n if (parser.matchAll()) {\r\n warningCallback('parseXml: parsing error');\r\n }\r\n return result;\r\n };\r\n function decodeEntities(str) {\r\n return(str.replace(/&(?:#([0-9]+)|#[xX]([0-9A-Fa-f]+)|([0-9A-Za-z]+));/g, function(mt, m0, m1, m2) {\r\n if (m0) {return String.fromCharCode(parseInt(m0, 10));}\r\n else if (m1) {return String.fromCharCode(parseInt(m1, 16));}\r\n else if (m2 && Entities[m2]) {return String.fromCharCode(Entities[m2]);}\r\n else {return mt;}\r\n }));\r\n }\r\n function parseColor(raw) {\r\n let temp, result;\r\n raw = (raw || '').trim();\r\n if (temp = NamedColors[raw]) {\r\n result = [temp.slice(), 1];\r\n } else if (temp = raw.match(/^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)$/i)) {\r\n temp[1] = parseInt(temp[1]); temp[2] = parseInt(temp[2]); temp[3] = parseInt(temp[3]); temp[4] = parseFloat(temp[4]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256 && temp[4] <= 1) {\r\n result = [temp.slice(1, 4), temp[4]];\r\n }\r\n } else if (temp = raw.match(/^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)$/i)) {\r\n temp[1] = parseInt(temp[1]); temp[2] = parseInt(temp[2]); temp[3] = parseInt(temp[3]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256) {\r\n result = [temp.slice(1, 4), 1];\r\n }\r\n } else if (temp = raw.match(/^rgb\\(\\s*([0-9.]+)%\\s*,\\s*([0-9.]+)%\\s*,\\s*([0-9.]+)%\\s*\\)$/i)) {\r\n temp[1] = 2.55 * parseFloat(temp[1]); temp[2] = 2.55 * parseFloat(temp[2]); temp[3] = 2.55 * parseFloat(temp[3]);\r\n if (temp[1] < 256 && temp[2] < 256 && temp[3] < 256) {\r\n result = [temp.slice(1, 4), 1];\r\n }\r\n } else if (temp = raw.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)) {\r\n result = [[parseInt(temp[1], 16), parseInt(temp[2], 16), parseInt(temp[3], 16)], 1];\r\n } else if (temp = raw.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i)) {\r\n result = [[0x11 * parseInt(temp[1], 16), 0x11 * parseInt(temp[2], 16), 0x11 * parseInt(temp[3], 16)], 1];\r\n }\r\n return colorCallback ? colorCallback(result, raw) : result;\r\n }\r\n function opacityToColor(color, opacity, isMask) {\r\n let newColor = color[0].slice(),\r\n newOpacity = color[1] * opacity;\r\n if (isMask) {\r\n for (let i = 0; i < color.length; i++) {\r\n newColor[i] *= newOpacity;\r\n }\r\n return [newColor, 1];\r\n } else {\r\n return [newColor, newOpacity];\r\n }\r\n }\r\n function multiplyMatrix() {\r\n function multiply(a, b) {\r\n return [ a[0]*b[0]+a[2]*b[1], a[1]*b[0]+a[3]*b[1], a[0]*b[2]+a[2]*b[3],\r\n a[1]*b[2]+a[3]*b[3], a[0]*b[4]+a[2]*b[5]+a[4], a[1]*b[4]+a[3]*b[5]+a[5] ];\r\n }\r\n let result = arguments[0];\r\n for (let i = 1; i < arguments.length; i++) {\r\n result = multiply(result, arguments[i]);\r\n }\r\n return result;\r\n }\r\n function transformPoint(p, m) {\r\n return [m[0] * p[0] + m[2] * p[1] + m[4], m[1] * p[0] + m[3] * p[1] + m[5]];\r\n }\r\n function getGlobalMatrix() {\r\n let ctm = doc._ctm;\r\n for (let i = groupStack.length - 1; i >= 0; i--) {\r\n ctm = multiplyMatrix(groupStack[i].savedMatrix, ctm);\r\n }\r\n return ctm;\r\n }\r\n function getPageBBox() {\r\n return new SvgShape().M(0, 0).L(doc.page.width, 0).L(doc.page.width, doc.page.height).L(0, doc.page.height)\r\n .transform(inverseMatrix(getGlobalMatrix())).getBoundingBox();\r\n }\r\n function inverseMatrix(m) {\r\n let dt = m[0] * m[3] - m[1] * m[2];\r\n return [m[3] / dt, -m[1] / dt, -m[2] / dt, m[0] / dt, (m[2]*m[5] - m[3]*m[4]) / dt, (m[1]*m[4] - m[0]*m[5]) / dt];\r\n }\r\n function validateMatrix(m) {\r\n let m0 = validateNumber(m[0]), m1 = validateNumber(m[1]), m2 = validateNumber(m[2]),\r\n m3 = validateNumber(m[3]), m4 = validateNumber(m[4]), m5 = validateNumber(m[5]);\r\n if (isNotEqual(m0 * m3 - m1 * m2, 0)) {\r\n return [m0, m1, m2, m3, m4, m5];\r\n }\r\n }\r\n function solveEquation(curve) {\r\n let a = curve[2] || 0, b = curve[1] || 0, c = curve[0] || 0;\r\n if (isEqual(a, 0) && isEqual(b, 0)) {\r\n return [];\r\n } else if (isEqual(a, 0)) {\r\n return [(-c) / b];\r\n } else {\r\n let d = b * b - 4 * a * c;\r\n if (isNotEqual(d, 0) && d > 0) {\r\n return [(-b + Math.sqrt(d)) / (2 * a), (-b - Math.sqrt(d)) / (2 * a)];\r\n } else if (isEqual(d, 0)) {\r\n return [(-b) / (2 * a)];\r\n } else {\r\n return [];\r\n }\r\n }\r\n }\r\n function getCurveValue(t, curve) {\r\n return (curve[0] || 0) + (curve[1] || 0) * t + (curve[2] || 0) * t * t + (curve[3] || 0) * t * t * t;\r\n }\r\n function isEqual(number, ref) {\r\n return Math.abs(number - ref) < 1e-10;\r\n }\r\n function isNotEqual(number, ref) {\r\n return Math.abs(number - ref) >= 1e-10;\r\n }\r\n function validateNumber(n) {\r\n return n > -1e21 && n < 1e21 ? Math.round(n * 1e6) / 1e6 : 0;\r\n }\r\n function isArrayLike(v) {\r\n return typeof v === 'object' && v !== null && typeof v.length === 'number';\r\n }\r\n function parseTranform(v) {\r\n let parser = new StringParser((v || '').trim()), result = [1, 0, 0, 1, 0, 0], temp;\r\n while (temp = parser.match(/^([A-Za-z]+)\\s*[(]([^(]+)[)]/, true)) {\r\n let func = temp[1], nums = [], parser2 = new StringParser(temp[2].trim()), temp2;\r\n while (temp2 = parser2.matchNumber()) {\r\n nums.push(Number(temp2));\r\n parser2.matchSeparator();\r\n }\r\n if (func === 'matrix' && nums.length === 6) {\r\n result = multiplyMatrix(result, [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]]);\r\n } else if (func === 'translate' && nums.length === 2) {\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[0], nums[1]]);\r\n } else if (func === 'translate' && nums.length === 1) {\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[0], 0]);\r\n } else if (func === 'scale' && nums.length === 2) {\r\n result = multiplyMatrix(result, [nums[0], 0, 0, nums[1], 0, 0]);\r\n } else if (func === 'scale' && nums.length === 1) {\r\n result = multiplyMatrix(result, [nums[0], 0, 0, nums[0], 0, 0]);\r\n } else if (func === 'rotate' && nums.length === 3) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, 0, 0, 1, nums[1], nums[2]], [Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0], [1, 0, 0, 1, -nums[1], -nums[2]]);\r\n } else if (func === 'rotate' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);\r\n } else if (func === 'skewX' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, 0, Math.tan(a), 1, 0, 0]);\r\n } else if (func === 'skewY' && nums.length === 1) {\r\n let a = nums[0] * Math.PI / 180;\r\n result = multiplyMatrix(result, [1, Math.tan(a), 0, 1, 0, 0]);\r\n } else {return;}\r\n parser.matchSeparator();\r\n }\r\n if (parser.matchAll()) {return;}\r\n return result;\r\n }\r\n function parseAspectRatio(aspectRatio, availWidth, availHeight, elemWidth, elemHeight, initAlign) {\r\n let temp = (aspectRatio || '').trim().match(/^(none)$|^x(Min|Mid|Max)Y(Min|Mid|Max)(?:\\s+(meet|slice))?$/) || [],\r\n ratioType = temp[1] || temp[4] || 'meet',\r\n xAlign = temp[2] || 'Mid',\r\n yAlign = temp[3] || 'Mid',\r\n scaleX = availWidth / elemWidth,\r\n scaleY = availHeight / elemHeight,\r\n dx = {'Min':0, 'Mid':0.5, 'Max':1}[xAlign] - (initAlign || 0),\r\n dy = {'Min':0, 'Mid':0.5, 'Max':1}[yAlign] - (initAlign || 0);\r\n if (ratioType === 'slice') {\r\n scaleY = scaleX = Math.max(scaleX, scaleY);\r\n } else if (ratioType === 'meet') {\r\n scaleY = scaleX = Math.min(scaleX, scaleY);\r\n }\r\n return [scaleX, 0, 0, scaleY, dx * (availWidth - elemWidth * scaleX), dy * (availHeight - elemHeight * scaleY)];\r\n }\r\n function parseStyleAttr(v) {\r\n let result = Object.create(null);\r\n v = (v || '').trim().split(/;/);\r\n for (let i = 0; i < v.length; i++) {\r\n let key = (v[i].split(':')[0] || '').trim(),\r\n value = (v[i].split(':')[1] || '').trim();\r\n if (key) {\r\n result[key] = value;\r\n }\r\n }\r\n if (result['marker']) {\r\n if (!result['marker-start']) {result['marker-start'] = result['marker'];}\r\n if (!result['marker-mid']) {result['marker-mid'] = result['marker'];}\r\n if (!result['marker-end']) {result['marker-end'] = result['marker'];}\r\n }\r\n if (result['font']) {\r\n let fontFamily = null, fontSize = null, fontStyle = \"normal\", fontWeight = \"normal\", fontVariant = \"normal\";\r\n let parts = result['font'].split(/\\s+/);\r\n for (let i = 0; i < parts.length; i++) {\r\n switch (parts[i]) {\r\n case \"normal\":\r\n break;\r\n case \"italic\": case \"oblique\":\r\n fontStyle = parts[i];\r\n break;\r\n case \"small-caps\":\r\n fontVariant = parts[i];\r\n break;\r\n case \"bold\": case \"bolder\": case \"lighter\": case \"100\": case \"200\": case \"300\":\r\n case \"400\": case \"500\": case \"600\": case \"700\": case \"800\": case \"900\":\r\n fontWeight = parts[i];\r\n break;\r\n default:\r\n if (!fontSize) {\r\n fontSize = parts[i].split('/')[0];\r\n } else {\r\n if (!fontFamily) {\r\n fontFamily = parts[i];\r\n } else {\r\n fontFamily += ' ' + parts[i];\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (!result['font-style']) {result['font-style'] = fontStyle;}\r\n if (!result['font-variant']) {result['font-variant'] = fontVariant;}\r\n if (!result['font-weight']) {result['font-weight'] = fontWeight;}\r\n if (!result['font-size']) {result['font-size'] = fontSize;}\r\n if (!result['font-family']) {result['font-family'] = fontFamily;}\r\n }\r\n return result;\r\n }\r\n function parseSelector(v) {\r\n let parts = v.split(/(?=[.#])/g), ids = [], classes = [], tags = [], temp;\r\n for (let i = 0; i < parts.length; i++) {\r\n if (temp = parts[i].match(/^[#]([_A-Za-z0-9-]+)$/)) {\r\n ids.push(temp[1]);\r\n } else if (temp = parts[i].match(/^[.]([_A-Za-z0-9-]+)$/)) {\r\n classes.push(temp[1]);\r\n } else if (temp = parts[i].match(/^([_A-Za-z0-9-]+)$/)) {\r\n tags.push(temp[1]);\r\n } else if (parts[i] !== '*') {\r\n return;\r\n }\r\n }\r\n return {\r\n tags: tags, ids: ids, classes: classes,\r\n specificity: ids.length * 10000 + classes.length * 100 + tags.length\r\n };\r\n }\r\n function parseStyleSheet(v) {\r\n let parser = new StringParser(v.trim()), rules = [], rule;\r\n while (rule = parser.match(/^\\s*([^\\{\\}]*?)\\s*\\{([^\\{\\}]*?)\\}/, true)) {\r\n let selectors = rule[1].split(/\\s*,\\s*/g),\r\n css = parseStyleAttr(rule[2]);\r\n for (let i = 0; i < selectors.length; i++) {\r\n let selector = parseSelector(selectors[i]);\r\n if (selector) {\r\n rules.push({selector: selector, css:css});\r\n }\r\n }\r\n }\r\n return rules;\r\n }\r\n function matchesSelector(elem, selector) {\r\n if (elem.nodeType !== 1) {return false;}\r\n for (let i = 0; i < selector.tags.length; i++) {\r\n if (selector.tags[i] !== elem.nodeName) {return false;}\r\n }\r\n for (let i = 0; i < selector.ids.length; i++) {\r\n if (selector.ids[i] !== elem.id) {return false;}\r\n }\r\n for (let i = 0; i < selector.classes.length; i++) {\r\n if (elem.classList.indexOf(selector.classes[i]) === -1) {return false;}\r\n }\r\n return true;\r\n }\r\n function getStyle(elem) {\r\n let result = Object.create(null);\r\n let specificities = Object.create(null);\r\n for (let i = 0; i < styleRules.length; i++) {\r\n let rule = styleRules[i];\r\n if (matchesSelector(elem, rule.selector)) {\r\n for (let key in rule.css) {\r\n if (!(specificities[key] > rule.selector.specificity)) {\r\n result[key] = rule.css[key];\r\n specificities[key] = rule.selector.specificity;\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n function combineArrays(array1, array2) {\r\n return array1.concat(array2.slice(array1.length));\r\n }\r\n function getAscent(font, size) {\r\n return Math.max(font.ascender, (font.bbox[3] || font.bbox.maxY) * (font.scale || 1)) * size / 1000;\r\n }\r\n function getDescent(font, size) {\r\n return Math.min(font.descender, (font.bbox[1] || font.bbox.minY) * (font.scale || 1)) * size / 1000;\r\n }\r\n function getXHeight(font, size) {\r\n return (font.xHeight || 0.5 * (font.ascender - font.descender)) * size / 1000;\r\n }\r\n function getBaseline(font, size, baseline, shift) {\r\n let dy1, dy2;\r\n switch (baseline) {\r\n case 'middle': dy1 = 0.5 * getXHeight(font, size); break;\r\n case 'central': dy1 = 0.5 * (getDescent(font, size) + getAscent(font, size)); break;\r\n case 'after-edge': case 'text-after-edge': dy1 = getDescent(font, size); break;\r\n case 'alphabetic': case 'auto': case 'baseline': dy1 = 0; break;\r\n case 'mathematical': dy1 = 0.5 * getAscent(font, size); break;\r\n case 'hanging': dy1 = 0.8 * getAscent(font, size); break;\r\n case 'before-edge': case 'text-before-edge': dy1 = getAscent(font, size); break;\r\n default: dy1 = 0; break;\r\n }\r\n switch (shift) {\r\n case 'baseline': dy2 = 0; break;\r\n case 'super': dy2 = 0.6 * size; break;\r\n case 'sub': dy2 = -0.6 * size; break;\r\n default: dy2 = shift; break;\r\n }\r\n return dy1 - dy2;\r\n }\r\n function getTextPos(font, size, text) {\r\n let encoded = font.encode('' + text), hex = encoded[0], pos = encoded[1], data = [];\r\n for (let i = 0; i < hex.length; i++) {\r\n let unicode = font.unicode ? font.unicode[parseInt(hex[i], 16)] : [text.charCodeAt(i)];\r\n data.push({\r\n glyph: hex[i],\r\n unicode: unicode,\r\n width: pos[i].advanceWidth * size / 1000,\r\n xOffset: pos[i].xOffset * size / 1000,\r\n yOffset: pos[i].yOffset * size / 1000,\r\n xAdvance: pos[i].xAdvance * size / 1000,\r\n yAdvance: pos[i].yAdvance * size / 1000\r\n });\r\n }\r\n return data;\r\n }\r\n function createSVGElement(obj, inherits) {\r\n switch (obj.nodeName) {\r\n case 'use': return new SvgElemUse(obj, inherits);\r\n case 'symbol': return new SvgElemSymbol(obj, inherits);\r\n case 'g': return new SvgElemGroup(obj, inherits);\r\n case 'a': return new SvgElemLink(obj, inherits);\r\n case 'svg': return new SvgElemSvg(obj, inherits);\r\n case 'image': return new SVGElemImage(obj, inherits);\r\n case 'rect': return new SvgElemRect(obj, inherits);\r\n case 'circle': return new SvgElemCircle(obj, inherits);\r\n case 'ellipse': return new SvgElemEllipse(obj, inherits);\r\n case 'line': return new SvgElemLine(obj, inherits);\r\n case 'polyline': return new SvgElemPolyline(obj, inherits);\r\n case 'polygon': return new SvgElemPolygon(obj, inherits);\r\n case 'path': return new SvgElemPath(obj, inherits);\r\n case 'text': return new SvgElemText(obj, inherits);\r\n case 'tspan': return new SvgElemTspan(obj, inherits);\r\n case 'textPath': return new SvgElemTextPath(obj, inherits);\r\n case '#text': case '#cdata-section': return new SvgElemTextNode(obj, inherits);\r\n default: return new SvgElem(obj, inherits);\r\n }\r\n }\r\n\r\n var StringParser = function(str) {\r\n this.match = function(exp, all) {\r\n let temp = str.match(exp);\r\n if (!temp || temp.index !== 0) {return;}\r\n str = str.substring(temp[0].length);\r\n return (all ? temp : temp[0]);\r\n };\r\n this.matchSeparator = function() {\r\n return this.match(/^(?:\\s*,\\s*|\\s*|)/);\r\n };\r\n this.matchSpace = function() {\r\n return this.match(/^(?:\\s*)/);\r\n };\r\n this.matchLengthUnit = function() {\r\n return this.match(/^(?:px|pt|cm|mm|in|pc|em|ex|%|)/);\r\n };\r\n this.matchNumber = function() {\r\n return this.match(/^(?:[-+]?(?:[0-9]+[.][0-9]+|[0-9]+[.]|[.][0-9]+|[0-9]+)(?:[eE][-+]?[0-9]+)?)/);\r\n };\r\n this.matchAll = function() {\r\n return this.match(/^[\\s\\S]+/);\r\n };\r\n };\r\n\r\n var BezierSegment = function(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\r\n let divisions = 6 * precision;\r\n let equationX = [p1x, -3 * p1x + 3 * c1x, 3 * p1x - 6 * c1x + 3 * c2x, -p1x + 3 * c1x - 3 * c2x + p2x];\r\n let equationY = [p1y, -3 * p1y + 3 * c1y, 3 * p1y - 6 * c1y + 3 * c2y, -p1y + 3 * c1y - 3 * c2y + p2y];\r\n let derivativeX = [-3 * p1x + 3 * c1x, 6 * p1x - 12 * c1x + 6 * c2x, -3 * p1x + 9 * c1x - 9 * c2x + 3 * p2x];\r\n let derivativeY = [-3 * p1y + 3 * c1y, 6 * p1y - 12 * c1y + 6 * c2y, -3 * p1y + 9 * c1y - 9 * c2y + 3 * p2y];\r\n let lengthMap = [0];\r\n for (let i = 1; i <= divisions; i++) {\r\n let t = (i - 0.5) / divisions;\r\n let dx = getCurveValue(t, derivativeX) / divisions,\r\n dy = getCurveValue(t, derivativeY) / divisions,\r\n l = Math.sqrt(dx * dx + dy * dy);\r\n lengthMap[i] = lengthMap[i - 1] + l;\r\n }\r\n this.totalLength = lengthMap[divisions];\r\n this.startPoint = [p1x, p1y, isEqual(p1x, c1x) && isEqual(p1y, c1y) ? Math.atan2(c2y - c1y, c2x - c1x) : Math.atan2(c1y - p1y, c1x - p1x)];\r\n this.endPoint = [p2x, p2y, isEqual(c2x, p2x) && isEqual(c2y, p2y) ? Math.atan2(c2y - c1y, c2x - c1x) : Math.atan2(p2y - c2y, p2x - c2x)];\r\n this.getBoundingBox = function() {\r\n let temp;\r\n let minX = getCurveValue(0, equationX), minY = getCurveValue(0, equationY),\r\n maxX = getCurveValue(1, equationX), maxY = getCurveValue(1, equationY);\r\n if (minX > maxX) {temp = maxX; maxX = minX; minX = temp;}\r\n if (minY > maxY) {temp = maxY; maxY = minY; minY = temp;}\r\n let rootsX = solveEquation(derivativeX);\r\n for (let i = 0; i < rootsX.length; i++) {\r\n if (rootsX[i] >= 0 && rootsX[i] <= 1) {\r\n let x = getCurveValue(rootsX[i], equationX);\r\n if (x < minX) {minX = x;}\r\n if (x > maxX) {maxX = x;}\r\n }\r\n }\r\n let rootsY = solveEquation(derivativeY);\r\n for (let i = 0; i < rootsY.length; i++) {\r\n if (rootsY[i] >= 0 && rootsY[i] <= 1) {\r\n let y = getCurveValue(rootsY[i], equationY);\r\n if (y < minY) {minY = y;}\r\n if (y > maxY) {maxY = y;}\r\n }\r\n }\r\n return [minX, minY, maxX, maxY];\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (isEqual(l, 0)) {return this.startPoint;}\r\n if (isEqual(l, this.totalLength)) {return this.endPoint;}\r\n if (l < 0 || l > this.totalLength) {return;}\r\n for (let i = 1; i <= divisions; i++) {\r\n let l1 = lengthMap[i-1], l2 = lengthMap[i];\r\n if (l1 <= l && l <= l2) {\r\n let t = (i - (l2 - l) / (l2 - l1)) / divisions,\r\n x = getCurveValue(t, equationX), y = getCurveValue(t, equationY),\r\n dx = getCurveValue(t, derivativeX), dy = getCurveValue(t, derivativeY);\r\n return [x, y, Math.atan2(dy, dx)];\r\n }\r\n }\r\n };\r\n };\r\n\r\n var LineSegment = function(p1x, p1y, p2x, p2y) {\r\n this.totalLength = Math.sqrt((p2x - p1x) * (p2x - p1x) + (p2y - p1y) * (p2y - p1y));\r\n this.startPoint = [p1x, p1y, Math.atan2(p2y - p1y, p2x - p1x)];\r\n this.endPoint = [p2x, p2y, Math.atan2(p2y - p1y, p2x - p1x)];\r\n this.getBoundingBox = function() {\r\n return [Math.min(this.startPoint[0], this.endPoint[0]), Math.min(this.startPoint[1], this.endPoint[1]),\r\n Math.max(this.startPoint[0], this.endPoint[0]), Math.max(this.startPoint[1], this.endPoint[1])];\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (l >= 0 && l <= this.totalLength) {\r\n let r = l / this.totalLength || 0,\r\n x = this.startPoint[0] + r * (this.endPoint[0] - this.startPoint[0]),\r\n y = this.startPoint[1] + r * (this.endPoint[1] - this.startPoint[1]);\r\n return [x, y, this.startPoint[2]];\r\n }\r\n };\r\n };\r\n\r\n var SvgShape = function() {\r\n this.pathCommands = [];\r\n this.pathSegments = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.totalLength = 0;\r\n let startX = 0, startY = 0, currX = 0, currY = 0, lastCom, lastCtrlX, lastCtrlY;\r\n this.move = function(x, y) {\r\n startX = currX = x; startY = currY = y;\r\n return null;\r\n };\r\n this.line = function(x, y) {\r\n let segment = new LineSegment(currX, currY, x, y);\r\n currX = x; currY = y;\r\n return segment;\r\n };\r\n this.curve = function(c1x, c1y, c2x, c2y, x, y) {\r\n let segment = new BezierSegment(currX, currY, c1x, c1y, c2x, c2y, x, y);\r\n currX = x; currY = y;\r\n return segment;\r\n };\r\n this.close = function() {\r\n let segment = new LineSegment(currX, currY, startX, startY);\r\n currX = startX; currY = startY;\r\n return segment;\r\n };\r\n this.addCommand = function(data) {\r\n this.pathCommands.push(data);\r\n let segment = this[data[0]].apply(this, data.slice(3));\r\n if (segment) {\r\n segment.hasStart = data[1];\r\n segment.hasEnd = data[2];\r\n this.startPoint = this.startPoint || segment.startPoint;\r\n this.endPoint = segment.endPoint;\r\n this.pathSegments.push(segment);\r\n this.totalLength += segment.totalLength;\r\n }\r\n };\r\n this.M = function(x, y) {\r\n this.addCommand(['move', true, true, x, y]);\r\n lastCom = 'M';\r\n return this;\r\n };\r\n this.m = function(x, y) {\r\n return this.M(currX + x, currY + y);\r\n };\r\n this.Z = this.z = function() {\r\n this.addCommand(['close', true, true]);\r\n lastCom = 'Z';\r\n return this;\r\n };\r\n this.L = function(x, y) {\r\n this.addCommand(['line', true, true, x, y]);\r\n lastCom = 'L';\r\n return this;\r\n };\r\n this.l = function(x, y) {\r\n return this.L(currX + x, currY + y);\r\n };\r\n this.H = function(x) {\r\n return this.L(x, currY);\r\n };\r\n this.h = function(x) {\r\n return this.L(currX + x, currY);\r\n };\r\n this.V = function(y) {\r\n return this.L(currX, y);\r\n };\r\n this.v = function(y) {\r\n return this.L(currX, currY + y);\r\n };\r\n this.C = function(c1x, c1y, c2x, c2y, x, y) {\r\n this.addCommand(['curve', true, true, c1x, c1y, c2x, c2y, x, y]);\r\n lastCom = 'C'; lastCtrlX = c2x; lastCtrlY = c2y;\r\n return this;\r\n };\r\n this.c = function(c1x, c1y, c2x, c2y, x, y) {\r\n return this.C(currX + c1x, currY + c1y, currX + c2x, currY + c2y, currX + x, currY + y);\r\n };\r\n this.S = function(c1x, c1y, x, y) {\r\n return this.C(currX + (lastCom === 'C' ? currX - lastCtrlX : 0), currY + (lastCom === 'C' ? currY - lastCtrlY : 0), c1x, c1y, x, y);\r\n };\r\n this.s = function(c1x, c1y, x, y) {\r\n return this.C(currX + (lastCom === 'C' ? currX - lastCtrlX : 0), currY + (lastCom === 'C' ? currY - lastCtrlY : 0), currX + c1x, currY + c1y, currX + x, currY + y);\r\n };\r\n this.Q = function(cx, cy, x, y) {\r\n let c1x = currX + 2 / 3 * (cx - currX), c1y = currY + 2 / 3 * (cy - currY),\r\n c2x = x + 2 / 3 * (cx - x), c2y = y + 2 / 3 * (cy - y);\r\n this.addCommand(['curve', true, true, c1x, c1y, c2x, c2y, x, y]);\r\n lastCom = 'Q'; lastCtrlX = cx; lastCtrlY = cy;\r\n return this;\r\n };\r\n this.q = function(c1x, c1y, x, y) {\r\n return this.Q(currX + c1x, currY + c1y, currX + x, currY + y);\r\n };\r\n this.T = function(x, y) {\r\n return this.Q(currX + (lastCom === 'Q' ? currX - lastCtrlX : 0), currY + (lastCom === 'Q' ? currY - lastCtrlY : 0), x, y);\r\n };\r\n this.t = function(x, y) {\r\n return this.Q(currX + (lastCom === 'Q' ? currX - lastCtrlX : 0), currY + (lastCom === 'Q' ? currY - lastCtrlY : 0), currX + x, currY + y);\r\n };\r\n this.A = function(rx, ry, fi, fa, fs, x, y) {\r\n if (isEqual(rx, 0) || isEqual(ry, 0)) {\r\n this.addCommand(['line', true, true, x, y]);\r\n } else {\r\n fi = fi * (Math.PI / 180);\r\n rx = Math.abs(rx);\r\n ry = Math.abs(ry);\r\n fa = 1 * !!fa;\r\n fs = 1 * !!fs;\r\n let x1 = Math.cos(fi) * (currX - x) / 2 + Math.sin(fi) * (currY - y) / 2,\r\n y1 = Math.cos(fi) * (currY - y) / 2 - Math.sin(fi) * (currX - x) / 2,\r\n lambda = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry);\r\n if (lambda > 1) {\r\n rx *= Math.sqrt(lambda);\r\n ry *= Math.sqrt(lambda);\r\n }\r\n let r = Math.sqrt(Math.max(0, rx * rx * ry * ry - rx * rx * y1 * y1 - ry * ry * x1 * x1) / (rx * rx * y1 * y1 + ry * ry * x1 * x1)),\r\n x2 = (fa === fs ? -1 : 1) * r * rx * y1 / ry,\r\n y2 = (fa === fs ? 1 : -1) * r * ry * x1 / rx;\r\n let cx = Math.cos(fi) * x2 - Math.sin(fi) * y2 + (currX + x) / 2,\r\n cy = Math.sin(fi) * x2 + Math.cos(fi) * y2 + (currY + y) / 2,\r\n th1 = Math.atan2((y1 - y2) / ry, (x1 - x2) / rx),\r\n th2 = Math.atan2((-y1 - y2) / ry, (-x1 - x2) / rx);\r\n if (fs === 0 && th2 - th1 > 0) {\r\n th2 -= 2 * Math.PI;\r\n } else if (fs === 1 && th2 - th1 < 0) {\r\n th2 += 2 * Math.PI;\r\n }\r\n let segms = Math.ceil(Math.abs(th2 - th1) / (Math.PI / precision));\r\n for (let i = 0; i < segms; i++) {\r\n let th3 = th1 + i * (th2 - th1) / segms,\r\n th4 = th1 + (i + 1) * (th2 - th1) / segms,\r\n t = 4/3 * Math.tan((th4 - th3) / 4);\r\n let c1x = cx + Math.cos(fi) * rx * (Math.cos(th3) - t * Math.sin(th3)) - Math.sin(fi) * ry * (Math.sin(th3) + t * Math.cos(th3)),\r\n c1y = cy + Math.sin(fi) * rx * (Math.cos(th3) - t * Math.sin(th3)) + Math.cos(fi) * ry * (Math.sin(th3) + t * Math.cos(th3)),\r\n c2x = cx + Math.cos(fi) * rx * (Math.cos(th4) + t * Math.sin(th4)) - Math.sin(fi) * ry * (Math.sin(th4) - t * Math.cos(th4)),\r\n c2y = cy + Math.sin(fi) * rx * (Math.cos(th4) + t * Math.sin(th4)) + Math.cos(fi) * ry * (Math.sin(th4) - t * Math.cos(th4)),\r\n endX = cx + Math.cos(fi) * rx * Math.cos(th4) - Math.sin(fi) * ry * Math.sin(th4),\r\n endY = cy + Math.sin(fi) * rx * Math.cos(th4) + Math.cos(fi) * ry * Math.sin(th4);\r\n this.addCommand(['curve', (i === 0), (i === segms - 1), c1x, c1y, c2x, c2y, endX, endY]);\r\n }\r\n }\r\n lastCom = 'A';\r\n return this;\r\n };\r\n this.a = function(rx, ry, fi, fa, fs, x, y) {\r\n return this.A(rx, ry, fi, fa, fs, currX + x, currY + y);\r\n };\r\n this.path = function(d) {\r\n let command, value, temp,\r\n parser = new StringParser((d || '').trim());\r\n while (command = parser.match(/^[astvzqmhlcASTVZQMHLC]/)) {\r\n parser.matchSeparator();\r\n let values = [];\r\n while (value = (PathFlags[command + values.length] ? parser.match(/^[01]/) : parser.matchNumber())) {\r\n parser.matchSeparator();\r\n if (values.length === PathArguments[command]) {\r\n this[command].apply(this, values);\r\n values = [];\r\n if (command === 'M') {command = 'L';}\r\n else if (command === 'm') {command = 'l';}\r\n }\r\n values.push(Number(value));\r\n }\r\n if (values.length === PathArguments[command]) {\r\n this[command].apply(this, values);\r\n } else {\r\n warningCallback('SvgPath: command ' + command + ' with ' + values.length + ' numbers'); return;\r\n }\r\n }\r\n if (temp = parser.matchAll()) {\r\n warningCallback('SvgPath: unexpected string ' + temp);\r\n }\r\n return this;\r\n };\r\n this.getBoundingBox = function() {\r\n let bbox = [Infinity, Infinity, -Infinity, -Infinity];\r\n function addBounds(bbox1) {\r\n if (bbox1[0] < bbox[0]) {bbox[0] = bbox1[0];}\r\n if (bbox1[2] > bbox[2]) {bbox[2] = bbox1[2];}\r\n if (bbox1[1] < bbox[1]) {bbox[1] = bbox1[1];}\r\n if (bbox1[3] > bbox[3]) {bbox[3] = bbox1[3];}\r\n }\r\n for (let i = 0; i < this.pathSegments.length; i++) {\r\n addBounds(this.pathSegments[i].getBoundingBox());\r\n }\r\n if (bbox[0] === Infinity) {bbox[0] = 0;}\r\n if (bbox[1] === Infinity) {bbox[1] = 0;}\r\n if (bbox[2] === -Infinity) {bbox[2] = 0;}\r\n if (bbox[3] === -Infinity) {bbox[3] = 0;}\r\n return bbox;\r\n };\r\n this.getPointAtLength = function(l) {\r\n if (l >= 0 && l <= this.totalLength) {\r\n let temp;\r\n for (let i = 0; i < this.pathSegments.length; i++) {\r\n if (temp = this.pathSegments[i].getPointAtLength(l)) {\r\n return temp;\r\n }\r\n l -= this.pathSegments[i].totalLength;\r\n }\r\n return this.endPoint;\r\n }\r\n };\r\n this.transform = function(m) {\r\n this.pathSegments = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.totalLength = 0;\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let data = this.pathCommands.shift();\r\n for (let j = 3; j < data.length; j+=2) {\r\n let p = transformPoint([data[j], data[j + 1]], m)\r\n data[j] = p[0];\r\n data[j + 1] = p[1];\r\n }\r\n this.addCommand(data);\r\n }\r\n return this; \r\n };\r\n this.mergeShape = function(shape) {\r\n for (let i = 0; i < shape.pathCommands.length; i++) {\r\n this.addCommand(shape.pathCommands[i].slice());\r\n }\r\n return this;\r\n };\r\n this.clone = function() {\r\n return new SvgShape().mergeShape(this);\r\n };\r\n this.insertInDocument = function() {\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let command = this.pathCommands[i][0], values = this.pathCommands[i].slice(3);\r\n switch(command) {\r\n case 'move': doc.moveTo(values[0], values[1]); break;\r\n case 'line': doc.lineTo(values[0], values[1]); break;\r\n case 'curve': doc.bezierCurveTo(values[0], values[1], values[2], values[3], values[4], values[5]); break;\r\n case 'close': doc.closePath(); break;\r\n }\r\n }\r\n };\r\n this.getSubPaths = function() {\r\n let subPaths = [], shape = new SvgShape();\r\n for (let i = 0; i < this.pathCommands.length; i++) {\r\n let data = this.pathCommands[i], command = this.pathCommands[i][0];\r\n if (command === 'move' && i !== 0) {\r\n subPaths.push(shape);\r\n shape = new SvgShape();\r\n }\r\n shape.addCommand(data);\r\n }\r\n subPaths.push(shape);\r\n return subPaths;\r\n };\r\n this.getMarkers = function() {\r\n let markers = [], subPaths = this.getSubPaths();\r\n for (let i = 0; i < subPaths.length; i++) {\r\n let subPath = subPaths[i], subPathMarkers = [];\r\n for (let j = 0; j < subPath.pathSegments.length; j++) {\r\n let segment = subPath.pathSegments[j];\r\n if (isNotEqual(segment.totalLength, 0) || j === 0 || j === subPath.pathSegments.length - 1) {\r\n if (segment.hasStart) {\r\n let startMarker = segment.getPointAtLength(0), prevEndMarker = subPathMarkers.pop();\r\n if (prevEndMarker) {startMarker[2] = 0.5 * (prevEndMarker[2] + startMarker[2]);}\r\n subPathMarkers.push(startMarker);\r\n }\r\n if (segment.hasEnd) {\r\n let endMarker = segment.getPointAtLength(segment.totalLength);\r\n subPathMarkers.push(endMarker);\r\n }\r\n }\r\n }\r\n markers = markers.concat(subPathMarkers);\r\n }\r\n return markers;\r\n };\r\n };\r\n\r\n var SvgElem = function(obj, inherits) {\r\n let styleCache = Object.create(null);\r\n let childrenCache = null;\r\n this.name = obj.nodeName;\r\n this.isOuterElement = obj === svg || !obj.parentNode;\r\n this.inherits = inherits || (!this.isOuterElement ? createSVGElement(obj.parentNode, null) : null);\r\n this.stack = (this.inherits ? this.inherits.stack.concat(obj) : [obj]);\r\n this.style = parseStyleAttr(typeof obj.getAttribute === 'function' && obj.getAttribute('style'));\r\n this.css = useCSS ? getComputedStyle(obj) : getStyle(obj);\r\n this.allowedChildren = [];\r\n this.attr = function(key) {\r\n if (typeof obj.getAttribute === 'function') {\r\n return obj.getAttribute(key);\r\n }\r\n };\r\n this.resolveUrl = function(value) {\r\n let temp = (value || '').match(/^\\s*(?:url\\(\"(.*)#(.*)\"\\)|url\\('(.*)#(.*)'\\)|url\\((.*)#(.*)\\)|(.*)#(.*))\\s*$/) || [];\r\n let file = temp[1] || temp[3] || temp[5] || temp[7],\r\n id = temp[2] || temp[4] || temp[6] || temp[8];\r\n if (id) {\r\n if (!file) {\r\n let svgObj = svg.getElementById(id);\r\n if (svgObj) {\r\n if (this.stack.indexOf(svgObj) === -1) {\r\n return svgObj;\r\n } else {\r\n warningCallback('SVGtoPDF: loop of circular references for id \"' + id + '\"');\r\n return;\r\n }\r\n }\r\n }\r\n if (documentCallback) {\r\n let svgs = documentCache[file];\r\n if (!svgs) {\r\n svgs = documentCallback(file);\r\n if (!isArrayLike(svgs)) {svgs = [svgs];}\r\n for (let i = 0; i < svgs.length; i++) {\r\n if (typeof svgs[i] === 'string') {svgs[i] = parseXml(svgs[i]);}\r\n }\r\n documentCache[file] = svgs;\r\n }\r\n for (let i = 0; i < svgs.length; i++) {\r\n let svgObj = svgs[i].getElementById(id);\r\n if (svgObj) {\r\n if (this.stack.indexOf(svgObj) === -1) {\r\n return svgObj;\r\n } else {\r\n warningCallback('SVGtoPDF: loop of circular references for id \"' + file + '#' + id + '\"');\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n this.computeUnits = function(value, unit, percent, isFontSize) {\r\n if (unit === '%') {\r\n return parseFloat(value) / 100 * (isFontSize || percent != null ? percent : this.getViewport());\r\n } else if (unit === 'ex' || unit === 'em') {\r\n return value * {'em':1, 'ex':0.5}[unit] * (isFontSize ? percent : this.get('font-size'));\r\n } else {\r\n return value * {'':1, 'px':1, 'pt':96/72, 'cm':96/2.54, 'mm':96/25.4, 'in':96, 'pc':96/6}[unit];\r\n }\r\n };\r\n this.computeLength = function(value, percent, initial, isFontSize) {\r\n let parser = new StringParser((value || '').trim()), temp1, temp2;\r\n if (typeof (temp1 = parser.matchNumber()) === 'string' && typeof (temp2 = parser.matchLengthUnit()) === 'string' && !parser.matchAll()) {\r\n return this.computeUnits(temp1, temp2, percent, isFontSize);\r\n }\r\n return initial;\r\n };\r\n this.computeLengthList = function(value, percent, strict) {\r\n let parser = new StringParser((value || '').trim()), result = [], temp1, temp2;\r\n while (typeof (temp1 = parser.matchNumber()) === 'string' && typeof (temp2 = parser.matchLengthUnit()) === 'string') {\r\n result.push(this.computeUnits(temp1, temp2, percent));\r\n parser.matchSeparator();\r\n }\r\n if (strict && parser.matchAll()) {return;}\r\n return result;\r\n };\r\n this.getLength = function(key, percent, initial) {\r\n return this.computeLength(this.attr(key), percent, initial);\r\n };\r\n this.getLengthList = function(key, percent) {\r\n return this.computeLengthList(this.attr(key), percent);\r\n };\r\n this.getUrl = function(key) {\r\n return this.resolveUrl(this.attr(key))\r\n };\r\n this.getNumberList = function(key) {\r\n let parser = new StringParser((this.attr(key) || '').trim()), result = [], temp;\r\n while (temp = parser.matchNumber()) {\r\n result.push(Number(temp));\r\n parser.matchSeparator();\r\n }\r\n result.error = parser.matchAll();\r\n return result;\r\n }\r\n this.getViewbox = function(key, initial) {\r\n let viewBox = this.getNumberList(key);\r\n if (viewBox.length === 4 && viewBox[2] >= 0 && viewBox[3] >= 0) {return viewBox;}\r\n return initial;\r\n };\r\n this.getPercent = function(key, initial) {\r\n let value = this.attr(key);\r\n let parser = new StringParser((value || '').trim()), temp1, temp2;\r\n let number = parser.matchNumber();\r\n if (!number) {return initial;}\r\n if (parser.match('%')) {number *= 0.01;}\r\n if (parser.matchAll()) {return initial;}\r\n return Math.max(0, Math.min(1, number));\r\n };\r\n this.chooseValue = function(args) {\r\n for (let i = 0; i < arguments.length; i++) {\r\n if (arguments[i] != null && arguments[i] === arguments[i]) {return arguments[i];}\r\n }\r\n return arguments[arguments.length - 1];\r\n };\r\n this.get = function(key) {\r\n if (styleCache[key] !== undefined) {return styleCache[key];}\r\n let keyInfo = Properties[key] || {}, value, result;\r\n for (let i = 0; i < 3; i++) {\r\n switch (i) {\r\n case 0:\r\n if (key !== 'transform') { // the CSS transform behaves strangely\r\n value = this.css[keyInfo.css || key];\r\n }\r\n break;\r\n case 1:\r\n value = this.style[key];\r\n break;\r\n case 2:\r\n value = this.attr(key);\r\n break;\r\n }\r\n if (value === 'inherit') {\r\n result = (this.inherits ? this.inherits.get(key) : keyInfo.initial);\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n if (keyInfo.values != null) {\r\n result = keyInfo.values[value];\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n if (value != null) {\r\n let parsed;\r\n switch (key) {\r\n case 'font-size':\r\n result = this.computeLength(value, this.inherits ? this.inherits.get(key) : keyInfo.initial, undefined, true);\r\n break;\r\n case 'baseline-shift':\r\n result = this.computeLength(value, this.get('font-size'));\r\n break;\r\n case 'font-family':\r\n result = value || undefined;\r\n break;\r\n case 'opacity': case 'stroke-opacity': case 'fill-opacity': case 'stop-opacity':\r\n parsed = parseFloat(value);\r\n if (!isNaN(parsed)) {\r\n result = Math.max(0, Math.min(1, parsed));\r\n }\r\n break;\r\n case 'transform':\r\n result = parseTranform(value);\r\n break;\r\n case 'stroke-dasharray':\r\n if (value === 'none') {\r\n result = [];\r\n } else if (parsed = this.computeLengthList(value, this.getViewport(), true)) {\r\n let sum = 0, error = false;\r\n for (let j = 0; j < parsed.length; j++) {\r\n if (parsed[j] < 0) {error = true;}\r\n sum += parsed[j];\r\n }\r\n if (!error) {\r\n if (parsed.length % 2 === 1) {\r\n parsed = parsed.concat(parsed);\r\n }\r\n result = (sum === 0 ? [] : parsed);\r\n }\r\n }\r\n break;\r\n case 'color':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else {\r\n result = parseColor(value);\r\n }\r\n break;\r\n case 'fill': case 'stroke':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else if (value === 'currentColor') {\r\n result = this.get('color');\r\n } else if (parsed = parseColor(value)) {\r\n return parsed;\r\n } else if (parsed = (value || '').split(' ')) {\r\n let object = this.resolveUrl(parsed[0]),\r\n fallbackColor = parseColor(parsed[1]);\r\n if (object == null) {\r\n result = fallbackColor;\r\n } else if (object.nodeName === 'linearGradient' || object.nodeName === 'radialGradient') {\r\n result = new SvgElemGradient(object, null, fallbackColor);\r\n } else if (object.nodeName === 'pattern') {\r\n result = new SvgElemPattern(object, null, fallbackColor);\r\n } else {\r\n result = fallbackColor;\r\n }\r\n }\r\n break;\r\n case 'stop-color':\r\n if (value === 'none' || value === 'transparent') {\r\n result = 'none';\r\n } else if (value === 'currentColor') {\r\n result = this.get('color');\r\n } else {\r\n result = parseColor(value);\r\n }\r\n break;\r\n case 'marker-start': case 'marker-mid': case 'marker-end': case 'clip-path': case 'mask':\r\n if (value === 'none') {\r\n result = 'none';\r\n } else {\r\n result = this.resolveUrl(value);\r\n }\r\n break;\r\n case 'stroke-width':\r\n parsed = this.computeLength(value, this.getViewport());\r\n if (parsed != null && parsed >= 0) {\r\n result = parsed;\r\n }\r\n break;\r\n case 'stroke-miterlimit':\r\n parsed = parseFloat(value);\r\n if (parsed != null && parsed >= 1) {\r\n result = parsed;\r\n }\r\n break;\r\n case 'word-spacing': case 'letter-spacing':\r\n result = this.computeLength(value, this.getViewport());\r\n break;\r\n case 'stroke-dashoffset':\r\n result = this.computeLength(value, this.getViewport());\r\n if (result != null) {\r\n if (result < 0) { // fix for crbug.com/660850\r\n let dasharray = this.get('stroke-dasharray');\r\n for (let j = 0; j < dasharray.length; j++) {result += dasharray[j];}\r\n }\r\n }\r\n break;\r\n }\r\n if (result != null) {return styleCache[key] = result;}\r\n }\r\n }\r\n return styleCache[key] = (keyInfo.inherit && this.inherits ? this.inherits.get(key) : keyInfo.initial);\r\n };\r\n this.getChildren = function() {\r\n if (childrenCache != null) {return childrenCache;}\r\n let children = [];\r\n for (let i = 0; i < obj.childNodes.length; i++) {\r\n let child = obj.childNodes[i];\r\n if (!child.error && this.allowedChildren.indexOf(child.nodeName) !== -1) {\r\n children.push(createSVGElement(child, this));\r\n }\r\n }\r\n return childrenCache = children;\r\n };\r\n this.getParentVWidth = function() {\r\n return (this.inherits ? this.inherits.getVWidth(): viewportWidth);\r\n };\r\n this.getParentVHeight = function() {\r\n return (this.inherits ? this.inherits.getVHeight() : viewportHeight);\r\n };\r\n this.getParentViewport = function() {\r\n return Math.sqrt(0.5 * this.getParentVWidth() * this.getParentVWidth() + 0.5 * this.getParentVHeight() * this.getParentVHeight());\r\n };\r\n this.getVWidth = function() {\r\n return this.getParentVWidth();\r\n };\r\n this.getVHeight = function() {\r\n return this.getParentVHeight();\r\n };\r\n this.getViewport = function() {\r\n return Math.sqrt(0.5 * this.getVWidth() * this.getVWidth() + 0.5 * this.getVHeight() * this.getVHeight());\r\n };\r\n this.getBoundingBox = function() {\r\n let shape = this.getBoundingShape();\r\n return shape.getBoundingBox();\r\n };\r\n };\r\n\r\n var SvgElemStylable = function(obj, inherits) {\r\n SvgElem.call(this, obj, inherits);\r\n this.transform = function() {\r\n doc.transform.apply(doc, this.getTransformation());\r\n };\r\n this.clip = function() {\r\n if (this.get('clip-path') !== 'none') {\r\n let clipPath = new SvgElemClipPath(this.get('clip-path'), null);\r\n clipPath.useMask(this.getBoundingBox());\r\n return true;\r\n }\r\n };\r\n this.mask = function() {\r\n if (this.get('mask') !== 'none') {\r\n let mask = new SvgElemMask(this.get('mask'), null);\r\n mask.useMask(this.getBoundingBox());\r\n return true;\r\n }\r\n };\r\n this.getFill = function(isClip, isMask) {\r\n let opacity = this.get('opacity'),\r\n fill = this.get('fill'),\r\n fillOpacity = this.get('fill-opacity');\r\n if (isClip) {return DefaultColors.white;}\r\n if (fill !== 'none' && opacity && fillOpacity) {\r\n if (fill instanceof SvgElemGradient || fill instanceof SvgElemPattern) {\r\n return fill.getPaint(this.getBoundingBox(), fillOpacity * opacity, isClip, isMask);\r\n }\r\n return opacityToColor(fill, fillOpacity * opacity, isMask);\r\n }\r\n };\r\n this.getStroke = function(isClip, isMask) {\r\n let opacity = this.get('opacity'),\r\n stroke = this.get('stroke'),\r\n strokeOpacity = this.get('stroke-opacity');\r\n if (isClip || isEqual(this.get('stroke-width'), 0)) {return;}\r\n if (stroke !== 'none' && opacity && strokeOpacity) {\r\n if (stroke instanceof SvgElemGradient || stroke instanceof SvgElemPattern) {\r\n return stroke.getPaint(this.getBoundingBox(), strokeOpacity * opacity, isClip, isMask);\r\n }\r\n return opacityToColor(stroke, strokeOpacity * opacity, isMask);\r\n }\r\n };\r\n };\r\n\r\n var SvgElemHasChildren = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.allowedChildren = ['use', 'g', 'a', 'svg', 'image', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path', 'text'];\r\n this.getBoundingShape = function() {\r\n let shape = new SvgShape(),\r\n children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i].get('display') !== 'none') {\r\n if (typeof children[i].getBoundingShape === 'function') {\r\n let childShape = children[i].getBoundingShape().clone();\r\n if (typeof children[i].getTransformation === 'function') {\r\n childShape.transform(children[i].getTransformation());\r\n }\r\n shape.mergeShape(childShape);\r\n }\r\n }\r\n }\r\n return shape;\r\n };\r\n this.drawChildren = function(isClip, isMask) {\r\n let children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n if (children[i].get('display') !== 'none') {\r\n if (typeof children[i].drawInDocument === 'function') {\r\n children[i].drawInDocument(isClip, isMask);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n\r\n var SvgElemContainer = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.drawContent = function(isClip, isMask) {\r\n this.transform();\r\n let clipped = this.clip(),\r\n masked = this.mask(),\r\n group;\r\n if ((this.get('opacity') < 1 || clipped || masked) && !isClip) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawChildren(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n doc.fillOpacity(this.get('opacity'));\r\n docInsertGroup(group);\r\n }\r\n };\r\n };\r\n\r\n var SvgElemUse = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n child = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (child) {child = createSVGElement(child, this);}\r\n this.getChildren = function() {\r\n return child ? [child] : [];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(this.get('transform'), [1, 0, 0, 1, x, y]);\r\n };\r\n };\r\n\r\n var SvgElemSymbol = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let width = this.getLength('width', this.getParentVWidth(), this.getParentVWidth()),\r\n height = this.getLength('height', this.getParentVHeight(), this.getParentVHeight());\r\n if (inherits instanceof SvgElemUse) {\r\n width = inherits.getLength('width', inherits.getParentVWidth(), width);\r\n height = inherits.getLength('height', inherits.getParentVHeight(), height);\r\n }\r\n let aspectRatio = (this.attr('preserveAspectRatio') || '').trim(),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3]), [1, 0, 0, 1, -viewBox[0], -viewBox[1]]);\r\n };\r\n };\r\n\r\n var SvgElemGroup = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n if (this.link && !isClip && !isMask) {this.addLink();}\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n };\r\n\r\n var SvgElemLink = function(obj, inherits) {\r\n if (inherits && inherits.isText) {\r\n SvgElemTspan.call(this, obj, inherits);\r\n this.allowedChildren = ['textPath', 'tspan', '#text', '#cdata-section', 'a'];\r\n } else {\r\n SvgElemGroup.call(this, obj, inherits);\r\n }\r\n this.link = this.attr('href') || this.attr('xlink:href');\r\n this.addLink = function() {\r\n if (this.link.match(/^(?:[a-z][a-z0-9+.-]*:|\\/\\/)?/i) && this.getChildren().length) {\r\n let bbox = this.getBoundingShape().transform(getGlobalMatrix()).getBoundingBox();\r\n docInsertLink(bbox[0], bbox[1], bbox[2], bbox[3], this.link);\r\n }\r\n }\r\n };\r\n\r\n var SvgElemSvg = function(obj, inherits) {\r\n SvgElemContainer.call(this, obj, inherits);\r\n let width = this.getLength('width', this.getParentVWidth(), this.getParentVWidth()),\r\n height = this.getLength('height', this.getParentVHeight(), this.getParentVHeight()),\r\n x = this.getLength('x', this.getParentVWidth(), 0),\r\n y = this.getLength('y', this.getParentVHeight(), 0);\r\n if (inherits instanceof SvgElemUse) {\r\n width = inherits.getLength('width', inherits.getParentVWidth(), width);\r\n height = inherits.getLength('height', inherits.getParentVHeight(), height);\r\n }\r\n let aspectRatio = this.attr('preserveAspectRatio'),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n if (this.isOuterElement && preserveAspectRatio) {\r\n x = y = 0;\r\n width = viewportWidth;\r\n height = viewportHeight;\r\n aspectRatio = preserveAspectRatio;\r\n }\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n if (this.get('overflow') === 'hidden') {\r\n new SvgShape().M(x, y).L(x + width, y).L(x + width, y + height).L(x, y + height).Z()\r\n .transform(this.get('transform'))\r\n .insertInDocument();\r\n doc.clip();\r\n }\r\n this.drawContent(isClip, isMask);\r\n doc.restore();\r\n };\r\n this.getTransformation = function() {\r\n return multiplyMatrix(\r\n this.get('transform'),\r\n [1, 0, 0, 1, x, y],\r\n parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3]),\r\n [1, 0, 0, 1, -viewBox[0], -viewBox[1]]\r\n );\r\n };\r\n };\r\n\r\n var SVGElemImage = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n let link = imageCallback(this.attr('href') || this.attr('xlink:href') || ''),\r\n x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n width = this.getLength('width', this.getVWidth(), 'auto'),\r\n height = this.getLength('height', this.getVHeight(), 'auto'),\r\n image;\r\n try {\r\n image = doc.openImage(link);\r\n } catch(e) {\r\n warningCallback('SVGElemImage: failed to open image \"' + link + '\" in PDFKit');\r\n }\r\n if (image) {\r\n if (width === 'auto' && height !== 'auto') {\r\n width = height * image.width / image.height;\r\n } else if (height === 'auto' && width !== 'auto') {\r\n height = width * image.height / image.width;\r\n } else if (width === 'auto' && height === 'auto') {\r\n width = image.width;\r\n height = image.height;\r\n }\r\n }\r\n if (width === 'auto' || width < 0) {width = 0;}\r\n if (height === 'auto' || height < 0) {height = 0;}\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.getBoundingShape = function() {\r\n return new SvgShape().M(x, y).L(x + width, y).M(x + width, y + height).L(x, y + height);\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n if (this.get('visibility') === 'hidden' || !image) {return;}\r\n doc.save();\r\n this.transform();\r\n if (this.get('overflow') === 'hidden') {\r\n doc.rect(x, y, width, height).clip();\r\n }\r\n this.clip();\r\n this.mask();\r\n doc.translate(x, y);\r\n doc.transform.apply(doc, parseAspectRatio(this.attr('preserveAspectRatio'), width, height, image ? image.width : width, image ? image.height : height));\r\n if (!isClip) {\r\n doc.fillOpacity(this.get('opacity'));\r\n doc.image(image, 0, 0);\r\n } else {\r\n doc.rect(0, 0, image.width, image.height);\r\n docFillColor(DefaultColors.white).fill();\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemPattern = function(obj, inherits, fallback) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.ref = (function() {\r\n let ref = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (ref && ref.nodeName === obj.nodeName) {\r\n return new SvgElemPattern(ref, inherits, fallback);\r\n }\r\n }).call(this);\r\n let _attr = this.attr;\r\n this.attr = function(key) {\r\n let attr = _attr.call(this, key);\r\n if (attr != null || key === 'href' || key === 'xlink:href') {return attr;}\r\n return this.ref ? this.ref.attr(key) : null;\r\n };\r\n let _getChildren = this.getChildren;\r\n this.getChildren = function() {\r\n let children = _getChildren.call(this);\r\n if (children.length > 0) {return children;}\r\n return this.ref ? this.ref.getChildren() : [];\r\n };\r\n this.getPaint = function(bBox, gOpacity, isClip, isMask) {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n bBoxUnitsContent = (this.attr('patternContentUnits') === 'objectBoundingBox'),\r\n x = this.getLength('x', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0),\r\n y = this.getLength('y', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0),\r\n width = this.getLength('width', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0),\r\n height = this.getLength('height', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0);\r\n if (bBoxUnitsContent && !bBoxUnitsPattern) { // Use the same units for pattern & pattern content\r\n x = (x - bBox[0]) / (bBox[2] - bBox[0]) || 0;\r\n y = (y - bBox[1]) / (bBox[3] - bBox[1]) || 0;\r\n width = width / (bBox[2] - bBox[0]) || 0;\r\n height = height / (bBox[3] - bBox[1]) || 0;\r\n } else if (!bBoxUnitsContent && bBoxUnitsPattern) {\r\n x = bBox[0] + x * (bBox[2] - bBox[0]);\r\n y = bBox[1] + y * (bBox[3] - bBox[1]);\r\n width = width * (bBox[2] - bBox[0]);\r\n height = height * (bBox[3] - bBox[1]);\r\n }\r\n let viewBox = this.getViewbox('viewBox', [0, 0, width, height]),\r\n aspectRatio = (this.attr('preserveAspectRatio') || '').trim(),\r\n aspectRatioMatrix = multiplyMatrix(\r\n parseAspectRatio(aspectRatio, width, height, viewBox[2], viewBox[3], 0),\r\n [1, 0, 0, 1, -viewBox[0], -viewBox[1]]\r\n ),\r\n matrix = parseTranform(this.attr('patternTransform'));\r\n if (bBoxUnitsContent) {\r\n matrix = multiplyMatrix([bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]], matrix);\r\n }\r\n matrix = multiplyMatrix(matrix, [1, 0, 0, 1, x, y]);\r\n if ((matrix = validateMatrix(matrix)) && (aspectRatioMatrix = validateMatrix(aspectRatioMatrix)) && (width = validateNumber(width)) && (height = validateNumber(height))) {\r\n let group = docBeginGroup([0, 0, width, height]);\r\n doc.transform.apply(doc, aspectRatioMatrix);\r\n this.drawChildren(isClip, isMask);\r\n docEndGroup(group);\r\n return [docCreatePattern(group, width, height, matrix), gOpacity];\r\n } else {\r\n return fallback ? [fallback[0], fallback[1] * gOpacity] : undefined;\r\n }\r\n };\r\n this.getVWidth = function() {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n width = this.getLength('width', (bBoxUnitsPattern ? 1 : this.getParentVWidth()), 0);\r\n return this.getViewbox('viewBox', [0, 0, width, 0])[2];\r\n };\r\n this.getVHeight = function() {\r\n let bBoxUnitsPattern = (this.attr('patternUnits') !== 'userSpaceOnUse'),\r\n height = this.getLength('height', (bBoxUnitsPattern ? 1 : this.getParentVHeight()), 0);\r\n return this.getViewbox('viewBox', [0, 0, 0, height])[3];\r\n };\r\n };\r\n\r\n var SvgElemGradient = function(obj, inherits, fallback) {\r\n SvgElem.call(this, obj, inherits);\r\n this.allowedChildren = ['stop'];\r\n this.ref = (function() {\r\n let ref = this.getUrl('href') || this.getUrl('xlink:href');\r\n if (ref && ref.nodeName === obj.nodeName) {\r\n return new SvgElemGradient(ref, inherits, fallback);\r\n }\r\n }).call(this);\r\n let _attr = this.attr;\r\n this.attr = function(key) {\r\n let attr = _attr.call(this, key);\r\n if (attr != null || key === 'href' || key === 'xlink:href') {return attr;}\r\n return this.ref ? this.ref.attr(key) : null;\r\n };\r\n let _getChildren = this.getChildren;\r\n this.getChildren = function() {\r\n let children = _getChildren.call(this);\r\n if (children.length > 0) {return children;}\r\n return this.ref ? this.ref.getChildren() : [];\r\n };\r\n this.getPaint = function(bBox, gOpacity, isClip, isMask) {\r\n let children = this.getChildren();\r\n if (children.length === 0) {return;}\r\n if (children.length === 1) {\r\n let child = children[0],\r\n stopColor = child.get('stop-color');\r\n if (stopColor === 'none') {return;}\r\n return opacityToColor(stopColor, child.get('stop-opacity') * gOpacity, isMask);\r\n }\r\n let bBoxUnits = (this.attr('gradientUnits') !== 'userSpaceOnUse'),\r\n matrix = parseTranform(this.attr('gradientTransform')),\r\n spread = this.attr('spreadMethod'),\r\n grad,\r\n x1, x2, y1, y2, r2,\r\n nAfter = 0,\r\n nBefore = 0,\r\n nTotal = 1;\r\n if (bBoxUnits) {\r\n matrix = multiplyMatrix([bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]], matrix);\r\n }\r\n if (matrix = validateMatrix(matrix)) {\r\n if (this.name === 'linearGradient') {\r\n x1 = this.getLength('x1', (bBoxUnits ? 1 : this.getVWidth()), 0);\r\n x2 = this.getLength('x2', (bBoxUnits ? 1 : this.getVWidth()), (bBoxUnits ? 1 : this.getVWidth()));\r\n y1 = this.getLength('y1', (bBoxUnits ? 1 : this.getVHeight()), 0);\r\n y2 = this.getLength('y2', (bBoxUnits ? 1 : this.getVHeight()), 0);\r\n } else {\r\n x2 = this.getLength('cx', (bBoxUnits ? 1 : this.getVWidth()), (bBoxUnits ? 0.5 : 0.5 * this.getVWidth()));\r\n y2 = this.getLength('cy', (bBoxUnits ? 1 : this.getVHeight()), (bBoxUnits ? 0.5 : 0.5 * this.getVHeight()));\r\n r2 = this.getLength('r', (bBoxUnits ? 1 : this.getViewport()), (bBoxUnits ? 0.5 : 0.5 * this.getViewport()));\r\n x1 = this.getLength('fx', (bBoxUnits ? 1 : this.getVWidth()), x2);\r\n y1 = this.getLength('fy', (bBoxUnits ? 1 : this.getVHeight()), y2);\r\n if (r2 < 0) {\r\n warningCallback('SvgElemGradient: negative r value');\r\n }\r\n let d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),\r\n multiplier = 1;\r\n if (d > r2) { // according to specification\r\n multiplier = r2 / d;\r\n x1 = x2 + (x1 - x2) * multiplier;\r\n y1 = y2 + (y1 - y2) * multiplier;\r\n }\r\n r2 = Math.max(r2, d * multiplier * (1 + 1e-6)); // fix for edge-case gradients see issue #84\r\n }\r\n if (spread === 'reflect' || spread === 'repeat') {\r\n let inv = inverseMatrix(matrix),\r\n corner1 = transformPoint([bBox[0], bBox[1]], inv),\r\n corner2 = transformPoint([bBox[2], bBox[1]], inv),\r\n corner3 = transformPoint([bBox[2], bBox[3]], inv),\r\n corner4 = transformPoint([bBox[0], bBox[3]], inv);\r\n if (this.name === 'linearGradient') { // See file 'gradient-repeat-maths.png'\r\n nAfter = Math.max((corner1[0] - x2) * (x2 - x1) + (corner1[1] - y2) * (y2 - y1),\r\n (corner2[0] - x2) * (x2 - x1) + (corner2[1] - y2) * (y2 - y1),\r\n (corner3[0] - x2) * (x2 - x1) + (corner3[1] - y2) * (y2 - y1),\r\n (corner4[0] - x2) * (x2 - x1) + (corner4[1] - y2) * (y2 - y1))\r\n / (Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\r\n nBefore = Math.max((corner1[0] - x1) * (x1 - x2) + (corner1[1] - y1) * (y1 - y2),\r\n (corner2[0] - x1) * (x1 - x2) + (corner2[1] - y1) * (y1 - y2),\r\n (corner3[0] - x1) * (x1 - x2) + (corner3[1] - y1) * (y1 - y2),\r\n (corner4[0] - x1) * (x1 - x2) + (corner4[1] - y1) * (y1 - y2))\r\n / (Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\r\n } else {\r\n nAfter = Math.sqrt(Math.max(Math.pow(corner1[0] - x2, 2) + Math.pow(corner1[1] - y2, 2),\r\n Math.pow(corner2[0] - x2, 2) + Math.pow(corner2[1] - y2, 2),\r\n Math.pow(corner3[0] - x2, 2) + Math.pow(corner3[1] - y2, 2),\r\n Math.pow(corner4[0] - x2, 2) + Math.pow(corner4[1] - y2, 2))) / r2 - 1;\r\n }\r\n nAfter = Math.ceil(nAfter + 0.5); // Add a little more because the stroke can extend outside of the bounding box\r\n nBefore = Math.ceil(nBefore + 0.5);\r\n nTotal = nBefore + 1 + nAfter; // How many times the gradient needs to be repeated to fill the object bounding box\r\n }\r\n if (this.name === 'linearGradient') {\r\n grad = doc.linearGradient(x1 - nBefore * (x2 - x1), y1 - nBefore * (y2 - y1), x2 + nAfter * (x2 - x1), y2 + nAfter * (y2 - y1));\r\n } else {\r\n grad = doc.radialGradient(x1, y1, 0, x2, y2, r2 + nAfter * r2);\r\n }\r\n for (let n = 0; n < nTotal; n++) {\r\n let offset = 0,\r\n inOrder = (spread !== 'reflect' || (n - nBefore) % 2 === 0);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[inOrder ? i : children.length - 1 - i],\r\n stopColor = child.get('stop-color');\r\n if (stopColor === 'none') {stopColor = DefaultColors.transparent;}\r\n stopColor = opacityToColor(stopColor, child.get('stop-opacity') * gOpacity, isMask);\r\n offset = Math.max(offset, inOrder ? child.getPercent('offset', 0) : 1 - child.getPercent('offset', 0));\r\n if (i === 0 && stopColor[0].length === 4) {grad._colorSpace = 'DeviceCMYK';} // Fix until PR #763 is merged into PDFKit\r\n if (i === 0 && offset > 0) {\r\n grad.stop((n + 0) / nTotal, stopColor[0], stopColor[1]);\r\n }\r\n grad.stop((n + offset) / (nAfter + nBefore + 1), stopColor[0], stopColor[1]);\r\n if (i === children.length - 1 && offset < 1) {\r\n grad.stop((n + 1) / nTotal, stopColor[0], stopColor[1]);\r\n }\r\n }\r\n }\r\n grad.setTransform.apply(grad, matrix);\r\n return [grad, 1];\r\n } else {\r\n return fallback ? [fallback[0], fallback[1] * gOpacity] : undefined;\r\n }\r\n }\r\n };\r\n\r\n var SvgElemBasicShape = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.dashScale = 1;\r\n this.getBoundingShape = function() {\r\n return this.shape;\r\n };\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n if (this.get('visibility') === 'hidden' || !this.shape) {return;}\r\n doc.save();\r\n this.transform();\r\n this.clip();\r\n if (!isClip) {\r\n let masked = this.mask(),\r\n group;\r\n if (masked) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n let subPaths = this.shape.getSubPaths(),\r\n fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask),\r\n lineWidth = this.get('stroke-width'),\r\n lineCap = this.get('stroke-linecap');\r\n if (fill || stroke) {\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke) {\r\n for (let j = 0; j < subPaths.length; j++) {\r\n if (isEqual(subPaths[j].totalLength, 0)) {\r\n if ((lineCap === 'square' || lineCap === 'round') && lineWidth > 0) {\r\n if (subPaths[j].startPoint && subPaths[j].startPoint.length > 1) {\r\n let x = subPaths[j].startPoint[0],\r\n y = subPaths[j].startPoint[1];\r\n docFillColor(stroke);\r\n if (lineCap === 'square') {\r\n doc.rect(x - 0.5 * lineWidth, y - 0.5 * lineWidth, lineWidth, lineWidth);\r\n } else if (lineCap === 'round') {\r\n doc.circle(x, y, 0.5 * lineWidth);\r\n }\r\n doc.fill();\r\n }\r\n }\r\n }\r\n }\r\n let dashArray = this.get('stroke-dasharray'),\r\n dashOffset = this.get('stroke-dashoffset');\r\n if (isNotEqual(this.dashScale, 1)) {\r\n for (let j = 0; j < dashArray.length; j++) {\r\n dashArray[j] *= this.dashScale;\r\n }\r\n dashOffset *= this.dashScale;\r\n }\r\n docStrokeColor(stroke);\r\n doc.lineWidth(lineWidth)\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(lineCap)\r\n .dash(dashArray, {phase: dashOffset});\r\n }\r\n for (let j = 0; j < subPaths.length; j++) {\r\n if (subPaths[j].totalLength > 0) {\r\n subPaths[j].insertInDocument();\r\n }\r\n }\r\n if (fill && stroke) {\r\n doc.fillAndStroke(this.get('fill-rule'));\r\n } else if (fill) {\r\n doc.fill(this.get('fill-rule'));\r\n } else if (stroke) {\r\n doc.stroke();\r\n }\r\n }\r\n let markerStart = this.get('marker-start'),\r\n markerMid = this.get('marker-mid'),\r\n markerEnd = this.get('marker-end');\r\n if (markerStart !== 'none' || markerMid !== 'none' || markerEnd !== 'none') {\r\n let markersPos = this.shape.getMarkers();\r\n if (markerStart !== 'none') {\r\n let marker = new SvgElemMarker(markerStart, null);\r\n marker.drawMarker(false, isMask, markersPos[0], lineWidth);\r\n }\r\n if (markerMid !== 'none') {\r\n for (let i = 1; i < markersPos.length - 1; i++) {\r\n let marker = new SvgElemMarker(markerMid, null);\r\n marker.drawMarker(false, isMask, markersPos[i], lineWidth);\r\n }\r\n }\r\n if (markerEnd !== 'none') {\r\n let marker = new SvgElemMarker(markerEnd, null);\r\n marker.drawMarker(false, isMask, markersPos[markersPos.length - 1], lineWidth);\r\n }\r\n }\r\n if (group) {\r\n docEndGroup(group);\r\n docInsertGroup(group);\r\n }\r\n } else {\r\n this.shape.insertInDocument();\r\n docFillColor(DefaultColors.white);\r\n doc.fill(this.get('clip-rule'));\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemRect = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let x = this.getLength('x', this.getVWidth(), 0),\r\n y = this.getLength('y', this.getVHeight(), 0),\r\n w = this.getLength('width', this.getVWidth(), 0),\r\n h = this.getLength('height', this.getVHeight(), 0),\r\n rx = this.getLength('rx', this.getVWidth()),\r\n ry = this.getLength('ry', this.getVHeight());\r\n if (rx === undefined && ry === undefined) {rx = ry = 0;}\r\n else if (rx === undefined && ry !== undefined) {rx = ry;}\r\n else if (rx !== undefined && ry === undefined) {ry = rx;}\r\n if (w > 0 && h > 0) {\r\n if (rx && ry) {\r\n rx = Math.min(rx, 0.5 * w);\r\n ry = Math.min(ry, 0.5 * h);\r\n this.shape = new SvgShape().M(x + rx, y).L(x + w - rx, y).A(rx, ry, 0, 0, 1, x + w, y + ry)\r\n .L(x + w, y + h - ry).A(rx, ry, 0, 0, 1, x + w - rx, y + h).L(x + rx, y + h)\r\n .A(rx, ry, 0, 0, 1, x, y + h - ry).L(x, y + ry).A(rx, ry, 0, 0, 1, x + rx, y).Z();\r\n } else {\r\n this.shape = new SvgShape().M(x, y).L(x + w, y).L(x + w, y + h).L(x, y + h).Z();\r\n }\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemCircle = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let cx = this.getLength('cx', this.getVWidth(), 0),\r\n cy = this.getLength('cy', this.getVHeight(), 0),\r\n r = this.getLength('r', this.getViewport(), 0);\r\n if (r > 0) {\r\n this.shape = new SvgShape().M(cx + r, cy).A(r, r, 0, 0, 1, cx - r, cy).A(r, r, 0, 0, 1, cx + r, cy).Z();\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemEllipse = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let cx = this.getLength('cx', this.getVWidth(), 0),\r\n cy = this.getLength('cy', this.getVHeight(), 0),\r\n rx = this.getLength('rx', this.getVWidth(), 0),\r\n ry = this.getLength('ry', this.getVHeight(), 0);\r\n if (rx > 0 && ry > 0) {\r\n this.shape = new SvgShape().M(cx + rx, cy).A(rx, ry, 0, 0, 1, cx - rx, cy).A(rx, ry, 0, 0, 1, cx + rx, cy).Z();\r\n } else {\r\n this.shape = new SvgShape();\r\n }\r\n };\r\n\r\n var SvgElemLine = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let x1 = this.getLength('x1', this.getVWidth(), 0),\r\n y1 = this.getLength('y1', this.getVHeight(), 0),\r\n x2 = this.getLength('x2', this.getVWidth(), 0),\r\n y2 = this.getLength('y2', this.getVHeight(), 0);\r\n this.shape = new SvgShape().M(x1, y1).L(x2, y2);\r\n };\r\n\r\n var SvgElemPolyline = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let points = this.getNumberList('points');\r\n this.shape = new SvgShape();\r\n for (let i = 0; i < points.length - 1; i += 2) {\r\n if (i === 0) {\r\n this.shape.M(points[i], points[i+1]);\r\n } else {\r\n this.shape.L(points[i], points[i+1]);\r\n }\r\n }\r\n if (points.error) {warningCallback('SvgElemPolygon: unexpected string ' + points.error);}\r\n if (points.length % 2 === 1) {warningCallback('SvgElemPolyline: uneven number of coordinates');}\r\n };\r\n\r\n var SvgElemPolygon = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n let points = this.getNumberList('points');\r\n this.shape = new SvgShape();\r\n for (let i = 0; i < points.length - 1; i += 2) {\r\n if (i === 0) {\r\n this.shape.M(points[i], points[i+1]);\r\n } else {\r\n this.shape.L(points[i], points[i+1]);\r\n }\r\n }\r\n this.shape.Z();\r\n if (points.error) {warningCallback('SvgElemPolygon: unexpected string ' + points.error);}\r\n if (points.length % 2 === 1) {warningCallback('SvgElemPolygon: uneven number of coordinates');}\r\n };\r\n\r\n var SvgElemPath = function(obj, inherits) {\r\n SvgElemBasicShape.call(this, obj, inherits);\r\n this.shape = new SvgShape().path(this.attr('d'));\r\n let pathLength = this.getLength('pathLength', this.getViewport());\r\n this.pathLength = pathLength > 0 ? pathLength : undefined;\r\n this.dashScale = (this.pathLength !== undefined ? this.shape.totalLength / this.pathLength : 1);\r\n };\r\n\r\n var SvgElemMarker = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n let width = this.getLength('markerWidth', this.getParentVWidth(), 3),\r\n height = this.getLength('markerHeight', this.getParentVHeight(), 3),\r\n viewBox = this.getViewbox('viewBox', [0, 0, width, height]);\r\n this.getVWidth = function() {\r\n return viewBox[2];\r\n };\r\n this.getVHeight = function() {\r\n return viewBox[3];\r\n };\r\n this.drawMarker = function(isClip, isMask, posArray, strokeWidth) {\r\n doc.save();\r\n let orient = this.attr('orient'),\r\n units = this.attr('markerUnits'),\r\n rotate = (orient === 'auto' ? posArray[2] : (parseFloat(orient) || 0) * Math.PI / 180),\r\n scale = (units === 'userSpaceOnUse' ? 1 : strokeWidth);\r\n doc.transform(Math.cos(rotate) * scale, Math.sin(rotate) * scale, -Math.sin(rotate) * scale, Math.cos(rotate) * scale, posArray[0], posArray[1]);\r\n let refX = this.getLength('refX', this.getVWidth(), 0),\r\n refY = this.getLength('refY', this.getVHeight(), 0),\r\n aspectRatioMatrix = parseAspectRatio(this.attr('preserveAspectRatio'), width, height, viewBox[2], viewBox[3], 0.5);\r\n if (this.get('overflow') === 'hidden') {\r\n doc.rect(aspectRatioMatrix[0] * (viewBox[0] + viewBox[2] / 2 - refX) - width / 2, aspectRatioMatrix[3] * (viewBox[1] + viewBox[3] / 2 - refY) - height / 2, width, height).clip();\r\n }\r\n doc.transform.apply(doc, aspectRatioMatrix);\r\n doc.translate(-refX, -refY);\r\n let group;\r\n if (this.get('opacity') < 1 && !isClip) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawChildren(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n doc.fillOpacity(this.get('opacity'));\r\n docInsertGroup(group);\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n var SvgElemClipPath = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.useMask = function(bBox) {\r\n let group = docBeginGroup(getPageBBox());\r\n doc.save();\r\n if (this.attr('clipPathUnits') === 'objectBoundingBox') {\r\n doc.transform(bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]);\r\n }\r\n this.clip();\r\n this.drawChildren(true, false);\r\n doc.restore();\r\n docEndGroup(group);\r\n docApplyMask(group, true);\r\n };\r\n };\r\n\r\n var SvgElemMask = function(obj, inherits) {\r\n SvgElemHasChildren.call(this, obj, inherits);\r\n this.useMask = function(bBox) {\r\n let group = docBeginGroup(getPageBBox());\r\n doc.save();\r\n let x, y, w, h;\r\n if (this.attr('maskUnits') === 'userSpaceOnUse') {\r\n x = this.getLength('x', this.getVWidth(), -0.1 * (bBox[2] - bBox[0]) + bBox[0]);\r\n y = this.getLength('y', this.getVHeight(), -0.1 * (bBox[3] - bBox[1]) + bBox[1]);\r\n w = this.getLength('width', this.getVWidth(), 1.2 * (bBox[2] - bBox[0]));\r\n h = this.getLength('height', this.getVHeight(), 1.2 * (bBox[3] - bBox[1]));\r\n } else {\r\n x = this.getLength('x', this.getVWidth(), -0.1) * (bBox[2] - bBox[0]) + bBox[0];\r\n y = this.getLength('y', this.getVHeight(), -0.1) * (bBox[3] - bBox[1]) + bBox[1];\r\n w = this.getLength('width', this.getVWidth(), 1.2) * (bBox[2] - bBox[0]);\r\n h = this.getLength('height', this.getVHeight(), 1.2) * (bBox[3] - bBox[1]);\r\n }\r\n doc.rect(x, y, w, h).clip();\r\n if (this.attr('maskContentUnits') === 'objectBoundingBox') {\r\n doc.transform(bBox[2] - bBox[0], 0, 0, bBox[3] - bBox[1], bBox[0], bBox[1]);\r\n }\r\n this.clip();\r\n this.drawChildren(false, true);\r\n doc.restore();\r\n docEndGroup(group);\r\n docApplyMask(group, true);\r\n };\r\n };\r\n\r\n var SvgElemTextContainer = function(obj, inherits) {\r\n SvgElemStylable.call(this, obj, inherits);\r\n this.allowedChildren = ['tspan', '#text', '#cdata-section', 'a'];\r\n this.isText = true;\r\n this.getBoundingShape = function() {\r\n let shape = new SvgShape();\r\n for (let i = 0; i < this._pos.length; i++) {\r\n let pos = this._pos[i];\r\n if (!pos.hidden) {\r\n let dx0 = pos.ascent * Math.sin(pos.rotate), dy0 = -pos.ascent * Math.cos(pos.rotate),\r\n dx1 = pos.descent * Math.sin(pos.rotate), dy1 = -pos.descent * Math.cos(pos.rotate),\r\n dx2 = pos.width * Math.cos(pos.rotate), dy2 = pos.width * Math.sin(pos.rotate);\r\n shape.M(pos.x + dx0, pos.y + dy0).L(pos.x + dx0 + dx2, pos.y + dy0 + dy2)\r\n .M(pos.x + dx1 + dx2, pos.y + dy1 + dy2).L(pos.x + dx1, pos.y + dy1);\r\n }\r\n }\r\n return shape;\r\n };\r\n this.drawTextInDocument = function(isClip, isMask) {\r\n if (this.link && !isClip && !isMask) {this.addLink();}\r\n if (this.get('text-decoration') === 'underline') {\r\n this.decorate(0.05 * this._font.size, -0.075 * this._font.size, isClip, isMask);\r\n }\r\n if (this.get('text-decoration') === 'overline') {\r\n this.decorate(0.05 * this._font.size, getAscent(this._font.font, this._font.size) + 0.075 * this._font.size, isClip, isMask);\r\n }\r\n let fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask),\r\n strokeWidth = this.get('stroke-width');\r\n if (this._font.fauxBold) {\r\n if (!stroke) {\r\n stroke = fill;\r\n strokeWidth = this._font.size * 0.03;\r\n } else {\r\n strokeWidth += this._font.size * 0.03;\r\n }\r\n }\r\n let children = this.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n let childElem = children[i];\r\n switch(childElem.name) {\r\n case 'tspan': case 'textPath': case 'a':\r\n if (childElem.get('display') !== 'none') {\r\n childElem.drawTextInDocument(isClip, isMask);\r\n }\r\n break;\r\n case '#text': case '#cdata-section':\r\n if (this.get('visibility') === 'hidden') {continue;}\r\n if (fill || stroke || isClip) {\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke && strokeWidth) {\r\n docStrokeColor(stroke);\r\n doc.lineWidth(strokeWidth)\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(this.get('stroke-linecap'))\r\n .dash(this.get('stroke-dasharray'), {phase:this.get('stroke-dashoffset')});\r\n }\r\n docBeginText(this._font.font, this._font.size);\r\n docSetTextMode(!!fill, !!stroke);\r\n for (let j = 0, pos = childElem._pos; j < pos.length; j++) {\r\n if (!pos[j].hidden && isNotEqual(pos[j].width, 0)) {\r\n let cos = Math.cos(pos[j].rotate), sin = Math.sin(pos[j].rotate), skew = (this._font.fauxItalic ? -0.25 : 0);\r\n docSetTextMatrix(cos * pos[j].scale, sin * pos[j].scale, cos * skew - sin, sin * skew + cos, pos[j].x, pos[j].y);\r\n docWriteGlyph(pos[j].glyph);\r\n }\r\n }\r\n docEndText();\r\n }\r\n break;\r\n }\r\n }\r\n if (this.get('text-decoration') === 'line-through') {\r\n this.decorate(0.05 * this._font.size, 0.5 * (getAscent(this._font.font, this._font.size) + getDescent(this._font.font, this._font.size)), isClip, isMask);\r\n }\r\n };\r\n this.decorate = function(lineWidth, linePosition, isClip, isMask) {\r\n let fill = this.getFill(isClip, isMask),\r\n stroke = this.getStroke(isClip, isMask);\r\n if (fill) {\r\n docFillColor(fill);\r\n }\r\n if (stroke) {\r\n docStrokeColor(stroke);\r\n doc.lineWidth(this.get('stroke-width'))\r\n .miterLimit(this.get('stroke-miterlimit'))\r\n .lineJoin(this.get('stroke-linejoin'))\r\n .lineCap(this.get('stroke-linecap'))\r\n .dash(this.get('stroke-dasharray'), {phase:this.get('stroke-dashoffset')});\r\n }\r\n for (let j = 0, pos = this._pos; j < pos.length; j++) {\r\n if (!pos[j].hidden && isNotEqual(pos[j].width, 0)) {\r\n let dx0 = (linePosition + lineWidth / 2) * Math.sin(pos[j].rotate),\r\n dy0 = -(linePosition + lineWidth / 2) * Math.cos(pos[j].rotate),\r\n dx1 = (linePosition - lineWidth / 2) * Math.sin(pos[j].rotate),\r\n dy1 = -(linePosition - lineWidth / 2) * Math.cos(pos[j].rotate),\r\n dx2 = pos[j].width * Math.cos(pos[j].rotate),\r\n dy2 = pos[j].width * Math.sin(pos[j].rotate);\r\n new SvgShape().M(pos[j].x + dx0, pos[j].y + dy0)\r\n .L(pos[j].x + dx0 + dx2, pos[j].y + dy0 + dy2)\r\n .L(pos[j].x + dx1 + dx2, pos[j].y + dy1 + dy2)\r\n .L(pos[j].x + dx1, pos[j].y + dy1).Z()\r\n .insertInDocument();\r\n if (fill && stroke) {\r\n doc.fillAndStroke();\r\n } else if (fill) {\r\n doc.fill();\r\n } else if (stroke) {\r\n doc.stroke();\r\n }\r\n }\r\n }\r\n };\r\n };\r\n\r\n var SvgElemTextNode = function(obj, inherits) {\r\n this.name = obj.nodeName;\r\n this.textContent = obj.nodeValue;\r\n };\r\n\r\n var SvgElemTspan = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n };\r\n\r\n var SvgElemTextPath = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n let pathObject, pathLength, temp;\r\n if ((temp = this.attr('path')) && temp.trim() !== '') {\r\n let pathLength = this.getLength('pathLength', this.getViewport());\r\n this.pathObject = new SvgShape().path(temp);\r\n this.pathLength = pathLength > 0 ? pathLength : this.pathObject.totalLength;\r\n this.pathScale = this.pathObject.totalLength / this.pathLength;\r\n } else if ((temp = this.getUrl('href') || this.getUrl('xlink:href')) && temp.nodeName === 'path') {\r\n let pathElem = new SvgElemPath(temp, this);\r\n this.pathObject = pathElem.shape.clone().transform(pathElem.get('transform'));\r\n this.pathLength = this.chooseValue(pathElem.pathLength, this.pathObject.totalLength);\r\n this.pathScale = this.pathObject.totalLength / this.pathLength;\r\n }\r\n };\r\n\r\n var SvgElemText = function(obj, inherits) {\r\n SvgElemTextContainer.call(this, obj, inherits);\r\n this.allowedChildren = ['textPath', 'tspan', '#text', '#cdata-section', 'a'];\r\n (function (textParentElem) {\r\n let processedText = '', remainingText = obj.textContent, textPaths = [], currentChunk = [], currentAnchor, currentDirection, currentX = 0, currentY = 0;\r\n function doAnchoring() {\r\n if (currentChunk.length) {\r\n let last = currentChunk[currentChunk.length - 1];\r\n let first = currentChunk[0]\r\n let width = last.x + last.width - first.x;\r\n let anchordx = {'startltr': 0, 'middleltr': 0.5, 'endltr': 1, 'startrtl': 1, 'middlertl': 0.5, 'endrtl': 0}[currentAnchor + currentDirection] * width || 0;\r\n for (let i = 0; i < currentChunk.length; i++) {\r\n currentChunk[i].x -= anchordx;\r\n }\r\n }\r\n currentChunk = [];\r\n }\r\n function adjustLength(pos, length, spacingAndGlyphs) {\r\n let firstChar = pos[0], lastChar = pos[pos.length - 1],\r\n startX = firstChar.x, endX = lastChar.x + lastChar.width;\r\n if (spacingAndGlyphs) {\r\n let textScale = length / (endX - startX);\r\n if (textScale > 0 && textScale < Infinity) {\r\n for (let j = 0; j < pos.length; j++) {\r\n pos[j].x = startX + textScale * (pos[j].x - startX);\r\n pos[j].scale *= textScale;\r\n pos[j].width *= textScale;\r\n }\r\n }\r\n } else {\r\n if (pos.length >= 2) {\r\n let spaceDiff = (length - (endX - startX)) / (pos.length - 1);\r\n for (let j = 0; j < pos.length; j++) {\r\n pos[j].x += j * spaceDiff;\r\n }\r\n }\r\n }\r\n currentX += length - (endX - startX);\r\n }\r\n function recursive(currentElem, parentElem) {\r\n currentElem._x = combineArrays(currentElem.getLengthList('x', currentElem.getVWidth()), (parentElem ? parentElem._x.slice(parentElem._pos.length) : []));\r\n currentElem._y = combineArrays(currentElem.getLengthList('y', currentElem.getVHeight()), (parentElem ? parentElem._y.slice(parentElem._pos.length) : []));\r\n currentElem._dx = combineArrays(currentElem.getLengthList('dx', currentElem.getVWidth()), (parentElem ? parentElem._dx.slice(parentElem._pos.length) : []));\r\n currentElem._dy = combineArrays(currentElem.getLengthList('dy', currentElem.getVHeight()), (parentElem ? parentElem._dy.slice(parentElem._pos.length) : []));\r\n currentElem._rot = combineArrays(currentElem.getNumberList('rotate'), (parentElem ? parentElem._rot.slice(parentElem._pos.length) : []));\r\n currentElem._defRot = currentElem.chooseValue(currentElem._rot[currentElem._rot.length - 1], parentElem && parentElem._defRot, 0);\r\n if (currentElem.name === 'textPath') {currentElem._y = [];}\r\n let fontOptions = {fauxItalic: false, fauxBold: false},\r\n fontNameorLink = fontCallback(currentElem.get('font-family'), currentElem.get('font-weight') === 'bold', currentElem.get('font-style') === 'italic', fontOptions);\r\n try {\r\n doc.font(fontNameorLink);\r\n } catch(e) {\r\n warningCallback('SVGElemText: failed to open font \"' + fontNameorLink + '\" in PDFKit');\r\n }\r\n currentElem._pos = [];\r\n currentElem._index = 0;\r\n currentElem._font = {font: doc._font, size: currentElem.get('font-size'), fauxItalic: fontOptions.fauxItalic, fauxBold: fontOptions.fauxBold};\r\n let textLength = currentElem.getLength('textLength', currentElem.getVWidth(), undefined),\r\n spacingAndGlyphs = currentElem.attr('lengthAdjust') === 'spacingAndGlyphs',\r\n wordSpacing = currentElem.get('word-spacing'),\r\n letterSpacing = currentElem.get('letter-spacing'),\r\n textAnchor = currentElem.get('text-anchor'),\r\n textDirection = currentElem.get('direction'),\r\n baseline = getBaseline(currentElem._font.font, currentElem._font.size, currentElem.get('alignment-baseline') || currentElem.get('dominant-baseline'), currentElem.get('baseline-shift'));\r\n if (currentElem.name === 'textPath') {\r\n doAnchoring();\r\n currentX = currentY = 0;\r\n }\r\n let children = currentElem.getChildren();\r\n for (let i = 0; i < children.length; i++) {\r\n let childElem = children[i];\r\n switch(childElem.name) {\r\n case 'tspan': case 'textPath': case 'a':\r\n recursive(childElem, currentElem);\r\n break;\r\n case '#text': case '#cdata-section':\r\n let rawText = childElem.textContent, renderedText = rawText, words;\r\n childElem._font = currentElem._font;\r\n childElem._pos = [];\r\n remainingText = remainingText.substring(rawText.length);\r\n if (currentElem.get('xml:space') === 'preserve') {\r\n renderedText = renderedText.replace(/[\\s]/g, ' ');\r\n } else {\r\n renderedText = renderedText.replace(/[\\s]+/g, ' ');\r\n if (processedText.match(/[\\s]$|^$/)) {renderedText = renderedText.replace(/^[\\s]/, '');}\r\n if (remainingText.match(/^[\\s]*$/)) {renderedText = renderedText.replace(/[\\s]$/, '');}\r\n }\r\n processedText += rawText;\r\n if (wordSpacing === 0) {\r\n words = [renderedText];\r\n } else {\r\n words = renderedText.split(/(\\s)/);\r\n }\r\n for (let w = 0; w < words.length; w++) {\r\n let pos = getTextPos(currentElem._font.font, currentElem._font.size, words[w]);\r\n for (let j = 0; j < pos.length; j++) {\r\n let index = currentElem._index,\r\n xAttr = currentElem._x[index],\r\n yAttr = currentElem._y[index],\r\n dxAttr = currentElem._dx[index],\r\n dyAttr = currentElem._dy[index],\r\n rotAttr = currentElem._rot[index],\r\n continuous = !(w === 0 && j === 0);\r\n if (xAttr !== undefined) {continuous = false; doAnchoring(); currentX = xAttr;}\r\n if (yAttr !== undefined) {continuous = false; doAnchoring(); currentY = yAttr;}\r\n if (dxAttr !== undefined) {continuous = false; currentX += dxAttr;}\r\n if (dyAttr !== undefined) {continuous = false; currentY += dyAttr;}\r\n if (rotAttr !== undefined || currentElem._defRot !== 0) {continuous = false;}\r\n let position = {\r\n glyph: pos[j].glyph,\r\n rotate: (Math.PI / 180) * currentElem.chooseValue(rotAttr, currentElem._defRot),\r\n x: currentX + pos[j].xOffset,\r\n y: currentY + baseline + pos[j].yOffset,\r\n width: pos[j].width,\r\n ascent: getAscent(currentElem._font.font, currentElem._font.size),\r\n descent: getDescent(currentElem._font.font, currentElem._font.size),\r\n scale: 1,\r\n hidden: false,\r\n continuous: continuous\r\n };\r\n currentChunk.push(position);\r\n childElem._pos.push(position);\r\n currentElem._pos.push(position);\r\n currentElem._index += pos[j].unicode.length;\r\n if (currentChunk.length === 1) {\r\n currentAnchor = textAnchor;\r\n currentDirection = textDirection;\r\n }\r\n currentX += pos[j].xAdvance + letterSpacing;\r\n currentY += pos[j].yAdvance;\r\n }\r\n if (words[w] === ' ') {\r\n currentX += wordSpacing;\r\n }\r\n }\r\n break;\r\n default:\r\n remainingText = remainingText.substring(childElem.textContent.length);\r\n }\r\n }\r\n if (textLength && currentElem._pos.length) {\r\n adjustLength(currentElem._pos, textLength, spacingAndGlyphs);\r\n }\r\n if (currentElem.name === 'textPath' || currentElem.name === 'text') {\r\n doAnchoring();\r\n }\r\n if (currentElem.name === 'textPath') {\r\n textPaths.push(currentElem);\r\n let pathObject = currentElem.pathObject;\r\n if (pathObject) {\r\n currentX = pathObject.endPoint[0]; currentY = pathObject.endPoint[1];\r\n }\r\n }\r\n if (parentElem) {\r\n parentElem._pos = parentElem._pos.concat(currentElem._pos);\r\n parentElem._index += currentElem._index;\r\n }\r\n }\r\n function textOnPath(currentElem) {\r\n let pathObject = currentElem.pathObject,\r\n pathLength = currentElem.pathLength,\r\n pathScale = currentElem.pathScale;\r\n if (pathObject) {\r\n let textOffset = currentElem.getLength('startOffset', pathLength, 0);\r\n for (let j = 0; j < currentElem._pos.length; j++) {\r\n let charMidX = textOffset + currentElem._pos[j].x + 0.5 * currentElem._pos[j].width;\r\n if (charMidX > pathLength || charMidX < 0) {\r\n currentElem._pos[j].hidden = true;\r\n } else {\r\n let pointOnPath = pathObject.getPointAtLength(charMidX * pathScale);\r\n if (isNotEqual(pathScale, 1)) {\r\n currentElem._pos[j].scale *= pathScale;\r\n currentElem._pos[j].width *= pathScale;\r\n }\r\n currentElem._pos[j].x = pointOnPath[0] - 0.5 * currentElem._pos[j].width * Math.cos(pointOnPath[2]) - currentElem._pos[j].y * Math.sin(pointOnPath[2]);\r\n currentElem._pos[j].y = pointOnPath[1] - 0.5 * currentElem._pos[j].width * Math.sin(pointOnPath[2]) + currentElem._pos[j].y * Math.cos(pointOnPath[2]);\r\n currentElem._pos[j].rotate = pointOnPath[2] + currentElem._pos[j].rotate;\r\n currentElem._pos[j].continuous = false;\r\n }\r\n }\r\n } else {\r\n for (let j = 0; j < currentElem._pos.length; j++) {\r\n currentElem._pos[j].hidden = true;\r\n }\r\n }\r\n }\r\n recursive(textParentElem, null);\r\n for (let i = 0; i < textPaths.length; i++) {\r\n textOnPath(textPaths[i]);\r\n }\r\n })(this);\r\n this.getTransformation = function() {\r\n return this.get('transform');\r\n };\r\n this.drawInDocument = function(isClip, isMask) {\r\n doc.save();\r\n this.transform();\r\n this.clip();\r\n let masked = this.mask(), group;\r\n if (masked) {\r\n group = docBeginGroup(getPageBBox());\r\n }\r\n this.drawTextInDocument(isClip, isMask);\r\n if (group) {\r\n docEndGroup(group);\r\n docInsertGroup(group);\r\n }\r\n doc.restore();\r\n };\r\n };\r\n\r\n options = options || {};\r\n var pxToPt = options.assumePt ? 1 : (72/96), // 1px = 72/96pt, but only if assumePt is false\r\n viewportWidth = (options.width || doc.page.width) / pxToPt,\r\n viewportHeight = (options.height || doc.page.height) / pxToPt,\r\n preserveAspectRatio = options.preserveAspectRatio || null, // default to null so that the attr can override if not passed\r\n useCSS = options.useCSS && typeof SVGElement !== 'undefined' && svg instanceof SVGElement && typeof getComputedStyle === 'function',\r\n warningCallback = options.warningCallback,\r\n fontCallback = options.fontCallback,\r\n imageCallback = options.imageCallback,\r\n colorCallback = options.colorCallback,\r\n documentCallback = options.documentCallback,\r\n precision = Math.ceil(Math.max(1, options.precision)) || 3,\r\n groupStack = [],\r\n documentCache = {},\r\n links = [],\r\n styleRules = [];\r\n\r\n if (typeof warningCallback !== 'function') {\r\n warningCallback = function(str) {\r\n if (typeof console !== undefined && typeof console.warn === 'function') {console.warn(str);}\r\n };\r\n }\r\n if (typeof fontCallback !== 'function') {\r\n fontCallback = function(family, bold, italic, fontOptions) {\r\n // Check if the font is already registered in the document\r\n if (bold && italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-BoldItalic')) {\r\n return family + '-BoldItalic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family + '-Italic')) {\r\n fontOptions.fauxBold = true;\r\n return family + '-Italic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family + '-Bold')) {\r\n fontOptions.fauxItalic = true;\r\n return family + '-Bold';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxBold = true;\r\n fontOptions.fauxItalic = true;\r\n return family;\r\n }\r\n }\r\n if (bold && !italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-Bold')) {\r\n return family + '-Bold';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxBold = true;\r\n return family;\r\n }\r\n }\r\n if (!bold && italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family + '-Italic')) {\r\n return family + '-Italic';\r\n } else if (doc._registeredFonts.hasOwnProperty(family)) {\r\n fontOptions.fauxItalic = true;\r\n return family;\r\n }\r\n }\r\n if (!bold && !italic) {\r\n if (doc._registeredFonts.hasOwnProperty(family)) {\r\n return family;\r\n }\r\n }\r\n // Use standard fonts as fallback\r\n if (family.match(/(?:^|,)\\s*serif\\s*$/)) {\r\n if (bold && italic) {return 'Times-BoldItalic';}\r\n if (bold && !italic) {return 'Times-Bold';}\r\n if (!bold && italic) {return 'Times-Italic';}\r\n if (!bold && !italic) {return 'Times-Roman';}\r\n } else if (family.match(/(?:^|,)\\s*monospace\\s*$/)) {\r\n if (bold && italic) {return 'Courier-BoldOblique';}\r\n if (bold && !italic) {return 'Courier-Bold';}\r\n if (!bold && italic) {return 'Courier-Oblique';}\r\n if (!bold && !italic) {return 'Courier';}\r\n } else if (family.match(/(?:^|,)\\s*sans-serif\\s*$/) || true) {\r\n if (bold && italic) {return 'Helvetica-BoldOblique';}\r\n if (bold && !italic) {return 'Helvetica-Bold';}\r\n if (!bold && italic) {return 'Helvetica-Oblique';}\r\n if (!bold && !italic) {return 'Helvetica';}\r\n }\r\n };\r\n }\r\n if (typeof imageCallback !== 'function') {\r\n imageCallback = function(link) {\r\n return link.replace(/\\s+/g, '');\r\n };\r\n }\r\n if (typeof colorCallback !== 'function') {\r\n colorCallback = null;\r\n } else {\r\n for (let color in DefaultColors) {\r\n let newColor = colorCallback(DefaultColors[color]);\r\n DefaultColors[color][0] = newColor[0];\r\n DefaultColors[color][1] = newColor[1];\r\n }\r\n }\r\n if (typeof documentCallback !== 'function') {\r\n documentCallback = null;\r\n }\r\n\r\n if (typeof svg === 'string') {svg = parseXml(svg);}\r\n if (svg) {\r\n let styles = svg.getElementsByTagName('style');\r\n for (let i = 0; i < styles.length; i++) {\r\n styleRules = styleRules.concat(parseStyleSheet(styles[i].textContent));\r\n }\r\n let elem = createSVGElement(svg, null);\r\n if (typeof elem.drawInDocument === 'function') {\r\n if (options.useCSS && !useCSS) {\r\n warningCallback('SVGtoPDF: useCSS option can only be used for SVG *elements* in compatible browsers');\r\n }\r\n let savedFillColor = doc._fillColor;\r\n doc.save().translate(x || 0, y || 0).scale(pxToPt);\r\n elem.drawInDocument();\r\n for (let i = 0; i < links.length; i++) {\r\n doc.page.annotations.push(links[i]);\r\n }\r\n doc.restore();\r\n doc._fillColor = savedFillColor;\r\n } else {\r\n warningCallback('SVGtoPDF: this element can\\'t be rendered directly: ' + svg.nodeName);\r\n }\r\n } else {\r\n warningCallback('SVGtoPDF: the input does not look like a valid SVG');\r\n }\r\n\r\n};\r\n\r\nif (typeof module !== 'undefined' && module && typeof module.exports !== 'undefined') {\r\n module.exports = SVGtoPDF;\r\n}\r\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport moment from 'moment';\nimport i18next from 'i18next';\n\nimport PrintView from './PrintView';\n\nimport {\n defineBasicsAggregations,\n generateCalendarDayLabels,\n processBasicsAggregations,\n findBasicsDays,\n} from '../../utils/basics/data';\n\nimport { formatDatum, statBgSourceLabels } from '../../utils/stat';\nimport { getPumpVocabulary } from '../../utils/device';\n\nimport {\n AUTOMATED_DELIVERY,\n SITE_CHANGE_CANNULA,\n SITE_CHANGE_RESERVOIR,\n SITE_CHANGE_TUBING,\n NO_SITE_CHANGE,\n SETTINGS_OVERRIDE,\n SITE_CHANGE,\n} from '../../utils/constants';\n\nconst siteChangeCannulaImage = require('./images/sitechange-cannula.png');\nconst siteChangeReservoirImage = require('./images/sitechange-reservoir.png');\nconst siteChangeTubingImage = require('./images/sitechange-tubing.png');\n\nconst siteChangeImages = {\n [SITE_CHANGE_CANNULA]: siteChangeCannulaImage,\n [SITE_CHANGE_RESERVOIR]: siteChangeReservoirImage,\n [SITE_CHANGE_TUBING]: siteChangeTubingImage,\n};\n\nconst t = i18next.t.bind(i18next);\n\nclass BasicsPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.sections = _.isEmpty(this.aggregationsByDate) ? {} : processBasicsAggregations(\n defineBasicsAggregations(\n this.bgPrefs,\n this.manufacturer,\n this.latestPumpUpload,\n ),\n this.aggregationsByDate,\n this.patient,\n this.manufacturer\n );\n\n // Auto-bind callback methods\n this.renderCalendarCell = this.renderCalendarCell.bind(this);\n\n this.doc.addPage();\n this.initLayout();\n }\n\n newPage() {\n super.newPage(this.getDateRange(this.endpoints.range[0], this.endpoints.range[1] - 1, undefined, t('Date range: ')));\n }\n\n initCalendar() {\n const columnWidth = this.getActiveColumnWidth();\n const calendar = {};\n\n calendar.days = findBasicsDays(this.endpoints.range, this.timePrefs.timezoneName);\n calendar.labels = generateCalendarDayLabels(calendar.days);\n\n calendar.headerHeight = 15;\n\n calendar.columns = _.map(calendar.labels, label => ({\n id: label,\n header: label,\n width: columnWidth / 7,\n height: columnWidth / 7,\n cache: false,\n renderer: this.renderCalendarCell,\n headerBorder: '',\n headerPadding: [4, 2, 0, 2],\n padding: [3, 2, 3, 2],\n }));\n\n calendar.pos = {};\n\n this.calendar = calendar;\n }\n\n initLayout() {\n this.setLayoutColumns({\n width: this.chartArea.width,\n gutter: 15,\n type: 'percentage',\n widths: [25.5, 49, 25.5],\n });\n }\n\n render() {\n this.renderStats();\n this.renderCalendars();\n this.RenderCalendarSummaries();\n }\n\n renderStats() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(0);\n this.renderAggregatedStats();\n }\n\n renderCalendars() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(1);\n this.initCalendar();\n\n this.renderCalendarSection({\n title: this.sections.fingersticks.title,\n data: this.aggregationsByDate.fingersticks.smbg.byDate,\n type: 'smbg',\n disabled: this.sections.fingersticks.disabled,\n emptyText: this.sections.fingersticks.emptyText,\n });\n\n this.renderCalendarSection({\n title: {\n text: this.sections.boluses.title,\n subText: _.get(this.data, 'query.excludeDaysWithoutBolus') ? t('(days with no boluses have been excluded)') : false,\n },\n data: this.aggregationsByDate.boluses.byDate,\n type: 'bolus',\n disabled: this.sections.boluses.disabled,\n emptyText: this.sections.boluses.emptyText,\n });\n\n const siteChangesSubTitle = this.sections.siteChanges.subTitle;\n\n this.renderCalendarSection({\n title: {\n text: this.sections.siteChanges.title,\n subText: siteChangesSubTitle ? t(\"(from '{{source}}')\", { source: this.sections.siteChanges.subTitle }) : false,\n },\n data: this.aggregationsByDate.siteChanges.byDate,\n type: 'siteChange',\n disabled: this.sections.siteChanges.disabled,\n emptyText: this.sections.siteChanges.emptyText,\n });\n\n this.renderCalendarSection({\n title: this.sections.basals.title,\n data: this.aggregationsByDate.basals.basal.byDate,\n type: 'basal',\n disabled: this.sections.basals.disabled,\n emptyText: this.sections.basals.emptyText,\n bottomMargin: 0,\n });\n }\n\n RenderCalendarSummaries() {\n this.goToPage(0);\n this.goToLayoutColumnPosition(2);\n\n this.renderCalendarSummary({\n dimensions: this.sections.fingersticks.dimensions,\n header: this.sections.fingersticks.summaryTitle,\n data: this.aggregationsByDate.fingersticks,\n type: 'smbg',\n disabled: this.sections.fingersticks.disabled,\n });\n\n this.renderCalendarSummary({\n dimensions: this.sections.boluses.dimensions,\n header: this.sections.boluses.summaryTitle,\n data: this.aggregationsByDate.boluses,\n type: 'bolus',\n disabled: this.sections.boluses.disabled,\n });\n\n this.renderCalendarSummary({\n dimensions: this.sections.basals.dimensions,\n header: this.sections.basals.summaryTitle,\n data: this.aggregationsByDate.basals,\n type: 'basal',\n disabled: this.sections.basals.disabled,\n });\n }\n\n renderAggregatedStats() {\n const {\n averageDailyDose,\n averageGlucose,\n carbs,\n coefficientOfVariation,\n glucoseManagementIndicator,\n readingsInRange,\n sensorUsage,\n standardDev,\n timeInAuto,\n timeInOverride,\n timeInRange,\n totalInsulin,\n } = this.stats;\n\n if (timeInRange) {\n this.renderHorizontalBarStat(\n timeInRange,\n {\n heading: {\n text: 'BG Distribution',\n note: t('Showing {{source}} data', { source: statBgSourceLabels[this.bgSource] }),\n },\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (readingsInRange) {\n this.renderHorizontalBarStat(\n readingsInRange,\n {\n heading: {\n text: 'BG Distribution',\n note: t('{{source}} data from {{count}} readings', {\n source: statBgSourceLabels[this.bgSource],\n count: readingsInRange.data?.raw?.total,\n }),\n },\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (averageGlucose) this.renderSimpleStat(averageGlucose);\n if (sensorUsage) this.renderSimpleStat(sensorUsage);\n\n this.renderHorizontalBarStat(\n totalInsulin,\n {\n heading: t('Avg. Daily Insulin Ratio'),\n secondaryFormatKey: 'tooltip',\n fillOpacity: 0.5,\n }\n );\n\n if (timeInAuto) {\n const automatedLabel = getPumpVocabulary(this.manufacturer)[AUTOMATED_DELIVERY];\n this.renderHorizontalBarStat(\n timeInAuto,\n {\n heading: t('Time In {{automatedLabel}} Ratio', { automatedLabel }),\n fillOpacity: 0.5,\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n if (timeInOverride) {\n const overrideLabel = getPumpVocabulary(this.manufacturer)[SETTINGS_OVERRIDE];\n this.renderHorizontalBarStat(\n timeInOverride,\n {\n heading: t('Time In {{overrideLabel}}', { overrideLabel }),\n fillOpacity: 0.5,\n secondaryFormatKey: 'tooltip',\n }\n );\n }\n\n const hasCarbGramsData = _.get(carbs, 'data.raw.carbs.grams', 0) > 0;\n const hasCarbExchangeData = _.get(carbs, 'data.raw.carbs.exchanges', 0) > 0;\n\n if (hasCarbGramsData && hasCarbExchangeData) {\n carbs.title = [\n carbs.title,\n t('Avg. Daily Carb Exchanges'),\n ];\n }\n\n this.renderSimpleStat(carbs);\n this.renderSimpleStat(averageDailyDose);\n if (glucoseManagementIndicator) this.renderSimpleStat(glucoseManagementIndicator);\n this.renderSimpleStat(standardDev);\n this.renderSimpleStat(coefficientOfVariation);\n }\n\n defineStatColumns(opts = {}) {\n const columnWidth = this.getActiveColumnWidth();\n\n const {\n height = 30,\n labelWidth = columnWidth * 0.65,\n valueWidth = columnWidth * 0.35,\n statFont = this.font,\n statFontSize = this.defaultFontSize,\n valueFont = this.boldFont,\n valueFontSize = this.defaultFontSize,\n labelHeader = false,\n valueHeader = false,\n } = opts;\n\n const columns = [\n {\n id: 'label',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: Math.round(labelWidth) - this.tableSettings.borderWidth,\n height,\n fontSize: statFontSize,\n font: statFont,\n align: 'left',\n headerAlign: 'left',\n border: 'TBL',\n headerBorder: 'TBL',\n valign: 'center',\n header: labelHeader,\n },\n {\n id: 'value',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: Math.round(valueWidth) - this.tableSettings.borderWidth,\n height,\n fontSize: valueFontSize,\n font: valueFont,\n align: 'right',\n headerAlign: 'right',\n border: 'TBR',\n headerBorder: 'TBR',\n valign: 'center',\n header: valueHeader,\n },\n ];\n\n return columns;\n }\n\n renderSimpleStat(stat) {\n const label = !_.isArray(stat.title) ? _.compact([stat.title]) : stat.title;\n\n const value = formatDatum(\n _.get(stat.data, _.get(stat.data, 'dataPaths.summary')),\n _.get(stat, 'dataFormat.summary'),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n // Ensure zero values are not stripped by _.compact when setting values array\n if (value.value === 0) value.value = [value.value];\n if (!_.isArray(value.value)) value.value = _.compact([value.value]);\n if (!_.isArray(value.suffix)) value.suffix = _.compact([value.suffix]);\n\n const tableColumns = this.defineStatColumns();\n\n this.setFill(value.id === 'statDisabled' ? this.colors.lightGrey : 'black', 1);\n\n const rows = _.map(value.value, (v, i) => ({\n label: label[i] || '',\n value: {\n text: `${v}`,\n subText: `${_.get(value, ['suffix', i], '')}`,\n },\n }));\n\n this.renderTable(tableColumns, rows, {\n showHeaders: false,\n bottomMargin: 15,\n });\n\n this.setFill();\n }\n\n renderHorizontalBarStat(stat, opts = {}) {\n _.defaults(opts, {\n heading: {\n text: stat.title,\n subText: null,\n note: null,\n },\n primaryFormatKey: 'label',\n secondaryFormatKey: null,\n emptyText: t('No data available'),\n fillOpacity: 0.75,\n });\n\n const columnWidth = this.getActiveColumnWidth();\n\n const statHasData = _.get(stat, 'data.total.value') > 0;\n if (!statHasData && _.isPlainObject(opts.heading)) {\n opts.heading.note = opts.emptyText; // eslint-disable-line no-param-reassign\n }\n\n this.renderTableHeading(opts.heading, {\n columnDefaults: {\n width: columnWidth,\n noteFontSize: this.smallFontSize,\n },\n height: opts.heading.note ? 30 : 16,\n font: this.font,\n fontSize: this.defaultFontSize,\n });\n\n if (!statHasData) this.doc.moveDown(1.25);\n\n this.doc.fontSize(this.smallFontSize);\n\n if (statHasData) {\n const statDatums = _.get(stat, 'data.data', []);\n const statTotal = _.get(stat, 'data.total.value', 1);\n\n const tableColumns = [\n {\n id: 'value',\n cache: false,\n renderer: this.renderCustomTextCell,\n width: columnWidth,\n height: 35,\n fontSize: this.largeFontSize,\n font: this.boldFont,\n noteFontSize: this.smallFontSize - 1,\n align: 'left',\n },\n ];\n\n const rows = _.map(statDatums, datum => {\n const { id } = datum;\n\n let color = this.colors[id];\n if (id === 'veryHigh') color = this.colors.high;\n if (id === 'veryLow') color = this.colors.low;\n\n const value = formatDatum(\n datum,\n _.get(stat, 'dataFormat.label'),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n let note = datum.legendTitle;\n if (stat.units) note += ` ${stat.units}`;\n\n let secondaryValue;\n if (opts.secondaryFormatKey) {\n secondaryValue = formatDatum(\n datum,\n _.get(stat, ['dataFormat', opts.secondaryFormatKey]),\n { bgPrefs: this.bgPrefs, data: stat.data }\n );\n\n if (stat.id === 'readingsInRange') secondaryValue.suffix += 'readings/day';\n note += ` (${secondaryValue.value} ${secondaryValue.suffix})`;\n }\n\n const stripePadding = 2;\n\n return {\n value: {\n text: value.value,\n subText: value.suffix,\n note,\n },\n _fillStripe: {\n color,\n opacity: opts.fillOpacity,\n width: (columnWidth - (2 * stripePadding)) * (_.toNumber(datum.value) / statTotal),\n background: true,\n padding: stripePadding,\n },\n };\n }).reverse();\n\n this.renderTable(tableColumns, rows, {\n showHeaders: false,\n bottomMargin: 15,\n });\n }\n }\n\n renderCalendarSection(opts) {\n const {\n title,\n data,\n type,\n bottomMargin = 20,\n disabled,\n emptyText,\n } = opts;\n\n const columnWidth = this.getActiveColumnWidth();\n\n let headingMoveDown = 0.25;\n\n const renderSectionHeading = (moveDown = 0) => this.renderSectionHeading(title, {\n width: columnWidth,\n fontSize: this.largeFontSize,\n moveDown,\n });\n\n if (disabled) {\n renderSectionHeading(headingMoveDown);\n this.renderEmptyText(emptyText);\n } else {\n const isSiteChange = type === 'siteChange';\n let priorToFirstSiteChange = false;\n const siteChangeSource = this.sections.siteChanges.source;\n\n if (isSiteChange) {\n priorToFirstSiteChange = _.some(data, ({ summary = {} }) => _.isNaN(summary.daysSince));\n }\n\n const chunkedDayMap = _.chunk(_.map(this.calendar.days, (day, index) => {\n const date = moment.utc(day.date);\n const dateLabelMask = (index === 0 || date.date() === 1) ? 'MMM D' : 'D';\n\n let dayType = day.type;\n\n if (isSiteChange) {\n if (dayType === 'inRange') {\n dayType = data[day.date] ? SITE_CHANGE : NO_SITE_CHANGE;\n }\n\n if (dayType === NO_SITE_CHANGE && priorToFirstSiteChange) {\n dayType = 'outOfRange';\n }\n\n if (dayType === SITE_CHANGE && priorToFirstSiteChange) {\n priorToFirstSiteChange = false;\n }\n }\n\n return {\n color: this.colors[type],\n count: _.get(data, `${day.date}.total`, _.get(data, `${day.date}.count`, 0)),\n dayOfWeek: date.format('ddd'),\n daysSince: _.get(data, `${day.date}.summary.daysSince[${siteChangeSource}]`),\n label: date.format(dateLabelMask),\n type: dayType,\n };\n }), 7);\n\n const rows = _.map(chunkedDayMap, week => {\n const values = {};\n\n _.each(week, day => {\n values[day.dayOfWeek] = day;\n });\n\n return values;\n });\n\n this.doc.fontSize(this.largeFontSize);\n const headingHeight = this.doc.heightOfString(' ');\n let headingYPos = this.doc.y;\n\n this.doc.fontSize(this.smallFontSize);\n const headerHeight = this.doc.heightOfString(' ');\n\n this.doc.moveDown(headingMoveDown);\n const currentYPos = headingHeight + this.doc.y;\n\n this.doc.y = currentYPos + headerHeight;\n\n this.calendar.pos[type] = {\n y: currentYPos + headerHeight + 4.25,\n pageIndex: this.currentPageIndex,\n };\n\n if (!this.calendar.rowHeight) {\n // Calculate row height by rendering a single row with invisible fill and stroke\n this.doc.fillOpacity(0);\n this.doc.strokeOpacity(0);\n this.lockFillandStroke();\n\n this.renderTable(this.calendar.columns, [rows[0]], {\n bottomMargin: 0,\n });\n\n this.calendar.rowHeight = this.doc.y - this.calendar.pos[type].y;\n\n // Reset fill and stroke opacities\n this.unlockFillandStroke();\n this.doc.fillOpacity(1);\n this.doc.strokeOpacity(1);\n } else {\n // Check to see if there's room on the current page, and if not, render on a new page\n const calendarHeight = this.calendar.pos[type].y + (this.calendar.rowHeight * rows.length);\n if (calendarHeight > this.chartArea.bottomEdge) {\n if (this.currentPageIndex + 1 < this.totalPages) {\n this.goToPage(this.currentPageIndex + 1);\n } else {\n this.doc.addPage();\n }\n\n this.doc.moveDown(headingMoveDown);\n headingMoveDown = 0;\n headingYPos = this.chartArea.topEdge;\n\n this.calendar.pos[type] = {\n y: headingYPos + headingHeight + headerHeight + 4.25,\n pageIndex: this.currentPageIndex,\n };\n }\n }\n\n this.doc.y = headingYPos;\n renderSectionHeading(headingMoveDown);\n\n this.doc.fontSize(this.smallFontSize);\n this.renderTable(this.calendar.columns, rows, {\n bottomMargin,\n });\n }\n }\n\n renderCalendarCell(tb, data, draw, column, pos, padding) {\n if (draw) {\n const {\n color,\n count,\n type,\n daysSince,\n label,\n } = data[column.id];\n\n const xPos = pos.x + padding.left;\n const yPos = pos.y + padding.top;\n\n const isEmptyBolusDay = color === this.colors.bolus && count === 0;\n const isExcludedBolusDay = isEmptyBolusDay && _.get(this.data, 'query.excludeDaysWithoutBolus', false);\n\n this.setFill((type === 'outOfRange' || isExcludedBolusDay) ? this.colors.lightGrey : 'black', 1);\n\n this.doc\n .fontSize(this.extraSmallFontSize)\n .text(label, xPos, yPos);\n\n const width = column.width - _.get(padding, 'left', 0) - _.get(padding, 'right', 0);\n const height = column.height - _.get(padding, 'top', 0) - _.get(padding, 'bottom', 0);\n\n const gridHeight = height - (this.doc.y - yPos);\n const gridWidth = width > gridHeight ? gridHeight : width;\n\n const siteChangeTypes = [NO_SITE_CHANGE, SITE_CHANGE];\n const isSiteChange = _.includes(siteChangeTypes, type) ? type === SITE_CHANGE : null;\n\n if (isSiteChange !== null) {\n this.setStroke(this.colors.grey);\n this.doc.lineWidth(1);\n\n const isFirst = _.isNaN(daysSince);\n\n const linePos = {\n x: pos.x,\n y: pos.y + column.height / 2 - 1,\n };\n\n const dotPos = {\n x: linePos.x + column.width - 6,\n y: linePos.y,\n };\n\n this.doc\n .moveTo(isFirst ? dotPos.x : linePos.x, linePos.y)\n .lineTo(linePos.x + column.width, linePos.y)\n .stroke();\n\n if (isSiteChange) {\n const daysSinceLabel = daysSince === 1 ? 'day' : 'days';\n\n const siteChangeSource = this.sections.siteChanges.source;\n const imageWidth = width / 2.5;\n const imagePadding = (width - imageWidth) / 2;\n\n this.setStroke('white');\n this.doc.lineWidth(2);\n\n this.doc\n .moveTo(linePos.x + column.width / 2, linePos.y - 0.5)\n .lineTo(dotPos.x, linePos.y)\n .stroke();\n\n this.setFill(color);\n this.setStroke(this.colors.grey);\n\n this.doc\n .lineWidth(0.5)\n .circle(dotPos.x, dotPos.y, 2.5)\n .fillAndStroke();\n\n this.setFill();\n\n this.doc.image(siteChangeImages[siteChangeSource], xPos + imagePadding, this.doc.y, {\n width: imageWidth,\n });\n\n if (!isFirst) {\n this.doc.text(`${daysSince} ${daysSinceLabel}`, this.doc.x, this.doc.y + 2, {\n width,\n align: 'center',\n });\n }\n }\n } else if (count > 0) {\n const gridPos = {\n x: pos.x + (column.width - gridWidth) / 2,\n y: this.doc.y,\n };\n\n this.setFill(color);\n this.renderCountGrid(count, gridWidth, gridPos, color);\n this.setFill();\n }\n\n this.resetText();\n }\n\n return ' ';\n }\n\n renderCountGrid(count, width, pos) {\n const colCount = 3;\n const rowCount = 3;\n const gridSpaces = colCount * rowCount;\n const padding = width * 0.05;\n const maxCount = 17;\n const renderCount = count > maxCount ? maxCount : count;\n\n const {\n x: xPos,\n y: yPos,\n } = pos;\n\n const diameter = (width - padding * (colCount - 1)) / colCount;\n const radius = diameter / 2;\n\n const grid = _.times(rowCount, (row) => _.times(colCount, (col) => ({\n x: xPos + (col * diameter) + (padding * col),\n y: yPos + (row * diameter) + (padding * row),\n })));\n\n const countArray = _.fill(Array(renderCount), 1);\n const extrasArray = _.map(\n _.chunk(countArray.splice(gridSpaces), gridSpaces - 1),\n chunk => chunk.length\n ).reverse();\n\n const gridValues = _.map(\n _.fill(Array(gridSpaces), 0),\n (space, index) => (_.get(countArray, index, 0) + _.get(extrasArray, index, 0)),\n );\n\n if (extrasArray.length) {\n gridValues.reverse();\n }\n\n const chunkedGridValues = _.chunk(gridValues, colCount);\n\n const renderColumn = rowIndex => (col, colIndex) => {\n const gridPos = grid[rowIndex][colIndex];\n const dot = chunkedGridValues[rowIndex][colIndex];\n\n if (dot > 1) {\n this.renderCountGrid(dot, diameter, gridPos);\n } else if (dot === 1) {\n this.doc\n .circle(gridPos.x + radius, gridPos.y + radius, radius)\n .fill();\n }\n };\n\n const renderRow = (row, rowIndex) => {\n _.each(row, renderColumn(rowIndex));\n };\n\n _.each(chunkedGridValues, renderRow);\n }\n\n renderCalendarSummary(opts) {\n const columnWidth = this.getActiveColumnWidth();\n\n const {\n dimensions,\n data,\n type,\n header,\n disabled,\n } = opts;\n\n if (!disabled) {\n let primaryDimension;\n const rows = [];\n\n _.each(dimensions, dimension => {\n const { path, key } = dimension;\n\n const valueObj = _.get(data, _.compact([...path.split('.').concat(key)]), 0);\n\n const isAverage = dimension.average;\n\n const value = isAverage\n ? Math.round(_.get(data, [...path.split('.').concat('avgPerDay')]))\n : _.get(valueObj, 'count', valueObj);\n\n const stat = {\n label: dimension.label,\n value: (value || 0).toString(),\n };\n\n if (dimension.primary) {\n stat.label = header;\n primaryDimension = stat;\n } else {\n if (value === 0 && dimension.hideEmpty) {\n return;\n }\n rows.push(stat);\n }\n });\n\n const tableColumns = this.defineStatColumns({\n labelWidth: columnWidth * 0.8,\n valueWidth: columnWidth * 0.2,\n height: 20,\n labelHeader: primaryDimension.label,\n valueHeader: (primaryDimension.value || 0).toString(),\n });\n\n tableColumns[0].headerFont = this.font;\n\n if (_.get(this, `calendar.pos[${type}]`)) {\n this.goToPage(this.calendar.pos[type].pageIndex);\n this.doc.y = this.calendar.pos[type].y;\n }\n\n this.renderTable(tableColumns, rows, {\n columnDefaults: {\n zebra: true,\n headerFill: {\n color: this.colors[`${type}Header`],\n opacity: 1,\n },\n headerRenderer: this.renderCustomTextCell,\n headerHeight: 28,\n },\n bottomMargin: 15,\n });\n }\n }\n\n renderEmptyText(text) {\n this.setFill(this.colors.lightGrey);\n\n this.doc\n .fontSize(this.defaultFontSize)\n .text(text, {\n width: this.getActiveColumnWidth(),\n })\n .moveDown(1.5);\n\n this.resetText();\n }\n}\n\nexport default BasicsPrintView;\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABVCAYAAAAFZ8k8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxQjdCNERGOUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQjdCNERGQUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFCN0I0REY3RDZCMTExRTZCMzIzRUIwMjhFODg5QjE5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFCN0I0REY4RDZCMTExRTZCMzIzRUIwMjhFODg5QjE5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+o8lLcwAAEP9JREFUeNrsXAlQ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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABiCAYAAAAcGP4pAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBQjEzNDY3OUNFRDIxMUU2QjJFMEQwNTY5NTQ5NEM1NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBQjEzNDY3QUNFRDIxMUU2QjJFMEQwNTY5NTQ5NEM1NCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFCMTM0Njc3Q0VEMjExRTZCMkUwRDA1Njk1NDk0QzU0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkFCMTM0Njc4Q0VEMjExRTZCMkUwRDA1Njk1NDk0QzU0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9EA3LQAAEINJREFUeNrkXQlQ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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAABXCAYAAABIr2g3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxQjdCNERGREQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQjdCNERGRUQ2QjExMUU2QjMyM0VCMDI4RTg4OUIxOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFCN0I0REZCRDZCMTExRTZCMzIzRUIwMjhFODg5QjE5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFCN0I0REZDRDZCMTExRTZCMzIzRUIwMjhFODg5QjE5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+V0pZSwAAEztJREFUeNrkXQlQ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\"","/*\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport { range } from 'd3-array';\nimport { scaleLinear } from 'd3-scale';\nimport moment from 'moment-timezone';\n\nimport PrintView from './PrintView';\n\nimport { calculateBasalPath, getBasalSequencePaths } from '../render/basal';\nimport getBolusPaths from '../render/bolus';\nimport { getBasalPathGroups, getBasalPathGroupType } from '../../utils/basal';\nimport { getPumpVocabulary } from '../../utils/device';\nimport { formatDatum, getStatDefinition, statFormats } from '../../utils/stat';\nimport {\n classifyBgValue,\n getOutOfRangeThreshold,\n} from '../../utils/bloodglucose';\nimport {\n getBolusFromInsulinEvent,\n getCarbs,\n getDelivered,\n getExtendedPercentage,\n getMaxDuration,\n getMaxValue,\n getNormalPercentage,\n getWizardFromInsulinEvent,\n} from '../../utils/bolus';\nimport {\n formatLocalizedFromUTC,\n formatDuration,\n getOffset,\n} from '../../utils/datetime';\nimport {\n formatBgValue,\n formatDecimalNumber,\n formatPercentage,\n removeTrailingZeroes,\n} from '../../utils/format';\n\nimport {\n AUTOMATED_DELIVERY,\n MMOLL_UNITS,\n MS_IN_MIN,\n PHYSICAL_ACTIVITY,\n SCHEDULED_DELIVERY,\n SLEEP,\n} from '../../utils/constants';\n\nimport {\n processBasalRange,\n processBgRange,\n processBolusRange,\n processBasalSequencesForDate,\n} from '../../utils/print/data';\n\nconst t = i18next.t.bind(i18next);\n\nclass DailyPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.isAutomatedBasalDevice = _.get(this, 'latestPumpUpload.isAutomatedBasalDevice', false);\n this.isAutomatedBolusDevice = _.get(this, 'latestPumpUpload.isAutomatedBolusDevice', false);\n\n this.hasCarbExchanges = _.some(\n _.get(data, 'data.current.data.wizard', []),\n { type: 'wizard', carbUnits: 'exchanges' }\n );\n\n const deviceLabels = getPumpVocabulary(this.manufacturer);\n\n this.basalGroupLabels = {\n automated: deviceLabels[AUTOMATED_DELIVERY],\n manual: deviceLabels[SCHEDULED_DELIVERY],\n };\n\n this.pumpSettingsOverrideLabels = {\n [SLEEP]: deviceLabels[SLEEP],\n [PHYSICAL_ACTIVITY]: deviceLabels[PHYSICAL_ACTIVITY],\n };\n\n this.bgAxisFontSize = 5;\n this.carbsFontSize = 5.5;\n\n this.summaryHeaderFontSize = opts.summaryHeaderFontSize;\n\n this.chartsPerPage = opts.chartsPerPage;\n this.numDays = this.endpoints.activeDays;\n\n // render options\n this.bolusWidth = 3;\n this.carbRadius = 4.25;\n this.cbgRadius = 1;\n this.markerRadius = 4.25;\n this.extendedLineThickness = 0.75;\n this.interruptedLineThickness = 0.5;\n this.smbgRadius = 3;\n this.triangleHeight = 1.25;\n\n const undelivered = '#B2B2B2';\n\n this.colors = _.assign(this.colors, {\n axes: '#858585',\n bolus: {\n automated: '#B2B2B2',\n delivered: 'black',\n extendedPath: 'black',\n extendedExpectationPath: undelivered,\n extendedTriangle: 'black',\n extendedTriangleInterrupted: undelivered,\n interrupted: 'white',\n overrideTriangle: 'white',\n programmed: 'black',\n undelivered,\n underride: undelivered,\n underrideTriangle: 'white',\n },\n carbs: '#F8D48E',\n carbExchanges: '#FFB686',\n lightDividers: '#D8D8D8',\n });\n\n this.rightEdge = this.margins.left + this.width;\n this.bottomEdge = this.margins.top + this.height;\n\n this.gapBtwnSummaryAndChartAsPercentage = 0.04;\n this.chartArea = {\n bottomEdge: opts.margins.top + opts.height,\n leftEdge: opts.margins.left +\n (opts.summaryWidthAsPercentage + this.gapBtwnSummaryAndChartAsPercentage) * this.width,\n topEdge: opts.margins.top,\n };\n\n this.chartArea.width = this.rightEdge - this.chartArea.leftEdge;\n this.initialChartArea = _.clone(this.chartArea);\n\n this.summaryArea = {\n rightEdge: opts.margins.left + opts.summaryWidthAsPercentage * this.width,\n };\n\n this.bgRange = processBgRange(this.aggregationsByDate.dataByDate);\n this.bolusRange = processBolusRange(this.aggregationsByDate.dataByDate, this.timezone);\n this.basalRange = processBasalRange(this.aggregationsByDate.dataByDate);\n\n this.summaryArea.width = this.summaryArea.rightEdge - this.margins.left;\n\n const dates = _.keys(this.aggregationsByDate.dataByDate);\n dates.sort();\n\n const numDays = _.min([this.numDays, dates.length]);\n const selectedDates = _.slice(dates, -Math.abs(numDays));\n\n this.chartsByDate = {};\n this.initialChartsByDate = {};\n\n _.each(selectedDates, (date) => {\n const dateData = this.aggregationsByDate.dataByDate[date];\n\n const bounds = [\n moment.utc(date).tz(this.timezone).valueOf(),\n moment.utc(date).tz(this.timezone).add(1, 'day').valueOf(),\n ];\n\n const utcBounds = [\n bounds[0] + getOffset(bounds[0], this.timezone) * MS_IN_MIN,\n bounds[1] + getOffset(bounds[1], this.timezone) * MS_IN_MIN,\n ];\n\n processBasalSequencesForDate(dateData, utcBounds);\n\n this.chartsByDate[date] = { data: dateData, utcBounds, date };\n this.initialChartsByDate[date] = _.cloneDeep(this.chartsByDate[date]);\n });\n\n this.chartsPlaced = this.initialChartsPlaced = 0;\n this.chartIndex = this.initialChartIndex = 0;\n\n // kick off the dynamic calculation of chart area based on font sizes for header and footer\n this.setHeaderSize().setFooterSize().calculateChartMinimums(this.chartArea);\n\n // calculate heights and place charts in preparation for rendering\n _.each(selectedDates, (date) => {\n this.calculateDateChartHeight(this.chartsByDate[date]);\n });\n\n while (this.chartsPlaced < selectedDates.length) {\n this.placeChartsOnPage();\n }\n\n _.each(this.chartsByDate, (dateChart) => {\n this.makeScales(dateChart);\n });\n }\n\n newPage() {\n const charts = _.filter(this.chartsByDate, chart => chart.page === this.currentPageIndex + 1);\n const start = _.head(charts).date;\n const end = _.last(charts).date;\n\n super.newPage(this.getDateRange(start, end, 'YYYY-MM-DD', t('Date range: ')));\n this.renderLegend();\n }\n\n calculateChartMinimums(chartArea) {\n const legendHeight = this.doc.fontSize(9).currentLineHeight() * 5;\n this.doc.fontSize(this.defaultFontSize);\n const { topEdge, bottomEdge } = chartArea;\n const totalHeight = bottomEdge - legendHeight - topEdge;\n const perChart = totalHeight / 3.25;\n this.chartMinimums = {\n notesEtc: perChart * (3 / 20),\n bgEtcChart: perChart * (9 / 20),\n bolusDetails: perChart * (4 / 20),\n basalChart: perChart * (3 / 20),\n belowBasal: perChart * (1 / 20),\n paddingBelow: (totalHeight * (1 / 13)) / 3,\n total: perChart,\n };\n\n return this;\n }\n\n calculateDateChartHeight({ data, date }) {\n this.doc.fontSize(this.smallFontSize);\n const lineHeight = this.doc.currentLineHeight() * 1.25;\n\n const threeHrBinnedBoluses = _.groupBy(data.bolus, (d) => {\n const bolus = getBolusFromInsulinEvent(d);\n return bolus.threeHrBin;\n });\n const maxBolusStack = _.max(_.map(\n _.keys(threeHrBinnedBoluses),\n (key) => {\n const totalLines = _.reduce(threeHrBinnedBoluses[key], (lines, insulinEvent) => {\n const bolus = getBolusFromInsulinEvent(insulinEvent);\n if (bolus.extended || bolus.expectedExtended) {\n return lines + 2;\n }\n return lines + 1;\n }, 0);\n return totalLines;\n },\n ));\n\n const { notesEtc, bgEtcChart, basalChart, belowBasal, total } = this.chartMinimums;\n const bolusDetailsHeight = lineHeight * maxBolusStack;\n const totalGivenMaxBolusStack = bolusDetailsHeight +\n notesEtc + bgEtcChart + basalChart + belowBasal;\n\n const { bolusDetails: minBolusDetails } = this.chartMinimums;\n\n this.chartsByDate[date].bolusDetailsHeight = _.max([minBolusDetails, bolusDetailsHeight]);\n this.chartsByDate[date].chartHeight = _.max([total, totalGivenMaxBolusStack]);\n\n return this;\n }\n\n makeScales(dateChart) {\n const {\n notesEtc,\n bgEtcChart,\n basalChart,\n belowBasal,\n } = this.chartMinimums;\n\n this.bgRange[1] = _.max([this.bgRange[1], this.bgBounds.targetUpperBound]);\n\n // Calculate the maximum BG yScale value\n this.bgScaleYLimit = _.min([this.bgRange[1], this.bgBounds.clampThreshold]);\n\n dateChart.bgScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.bgScaleYLimit])\n .range([\n dateChart.topEdge + notesEtc + bgEtcChart + this.cbgRadius,\n dateChart.topEdge + notesEtc - this.cbgRadius,\n ])\n .clamp(true);\n dateChart.bolusScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.bolusRange[1] || 1])\n .range([\n dateChart.topEdge + notesEtc + bgEtcChart,\n dateChart.topEdge + notesEtc + (bgEtcChart / 3),\n ]);\n dateChart.basalScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([0, this.basalRange[1]])\n .range([\n dateChart.bottomEdge - belowBasal,\n dateChart.bottomEdge - belowBasal - basalChart,\n ]);\n dateChart.xScale = scaleLinear() // eslint-disable-line no-param-reassign\n .domain([dateChart.utcBounds[0], dateChart.utcBounds[1]])\n // TODO: change to this.bolusWidth / 2 assuming boluses will be wider than cbgs\n .range([this.chartArea.leftEdge + this.cbgRadius, this.rightEdge - this.cbgRadius]);\n\n return this;\n }\n\n placeChartsOnPage() {\n const { topEdge, bottomEdge } = this.chartArea;\n let totalChartHeight = 0;\n const dates = _.keys(this.chartsByDate);\n const startingIndexThisPage = this.chartIndex;\n let chartsOnThisPage = 0;\n const limit = _.min([dates.length, startingIndexThisPage + this.chartsPerPage]);\n for (let i = startingIndexThisPage; i < limit; ++i) {\n const thisChartHeight = this.chartsByDate[dates[i]].chartHeight;\n const nextTotalHeight = totalChartHeight + thisChartHeight + this.chartMinimums.paddingBelow;\n if (nextTotalHeight > (bottomEdge - topEdge)) {\n this.chartIndex = i;\n break;\n }\n this.chartIndex = i + 1;\n totalChartHeight += thisChartHeight + this.chartMinimums.paddingBelow;\n chartsOnThisPage += 1;\n this.chartsPlaced += 1;\n }\n for (let i = startingIndexThisPage; i < startingIndexThisPage + chartsOnThisPage; ++i) {\n const chart = this.chartsByDate[dates[i]];\n chart.page = this.currentPageIndex + 1;\n if (i === startingIndexThisPage) {\n chart.topEdge = this.chartArea.topEdge;\n chart.bottomEdge = this.chartArea.topEdge + chart.chartHeight;\n } else {\n chart.topEdge =\n this.chartsByDate[dates[i - 1]].bottomEdge + this.chartMinimums.paddingBelow;\n chart.bottomEdge = chart.topEdge + chart.chartHeight;\n }\n }\n\n this.doc.addPage();\n\n return this;\n }\n\n renderEventPath(path) {\n if (path.type === 'programmed') {\n if (path.subType === 'automated') {\n this.doc.path(path.d)\n .lineWidth(0.5)\n .stroke(this.colors.bolus[path.type]);\n } else {\n this.doc.path(path.d)\n .lineWidth(0.5)\n .dash(0.5, { space: 1 })\n .stroke(this.colors.bolus[path.type]);\n }\n } else {\n this.doc.path(path.d)\n .fill(_.get(this.colors.bolus, path.subType, this.colors.bolus[path.type]));\n }\n }\n\n render() {\n _.each(this.chartsByDate, (dateChart) => {\n this.goToPage(dateChart.page);\n this.renderSummary(dateChart)\n .renderXAxes(dateChart)\n .renderYAxes(dateChart)\n .renderCbgs(dateChart)\n .renderSmbgs(dateChart)\n .renderInsulinEvents(dateChart)\n .renderFoodCarbs(dateChart)\n .renderBolusDetails(dateChart)\n .renderBasalPaths(dateChart)\n .renderBasalRates(dateChart)\n .renderPumpSettingsOverrides(dateChart)\n .renderChartDivider(dateChart);\n });\n }\n\n renderSummary({ date, topEdge }) {\n const smallIndent = this.margins.left + 4;\n const statsIndent = 6;\n const widthWithoutIndent = this.summaryArea.width - statsIndent;\n let first = true;\n\n const bgPrecision = this.bgUnits === MMOLL_UNITS ? 1 : 0;\n\n const statsData = _.get(this.aggregationsByDate, ['statsByDate', date], {});\n const stats = {};\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource: this.bgSource,\n days: this.endpoints.activeDays || this.endpoints.days,\n bgPrefs: this.bgPrefs,\n manufacturer: this.manufacturer,\n });\n stats[statType] = stat;\n });\n\n const { target, veryLow } = _.get(stats, 'timeInRange.data.raw.durations', {});\n const totalCbgDuration = _.get(stats, 'timeInRange.data.total.value', {});\n const { averageGlucose } = _.get(stats, 'averageGlucose.data.raw', {});\n const { carbs } = _.get(stats, 'carbs.data.raw', {});\n const { basal: totalBasal, bolus: totalBolus } = _.get(stats, 'totalInsulin.data.raw', {});\n const totalInsulin = totalBasal + totalBolus;\n\n this.doc.fillColor('black')\n .fillOpacity(1)\n .font(this.boldFont)\n .fontSize(this.summaryHeaderFontSize)\n .text(moment(date, 'YYYY-MM-DD').format('ddd, MMM D, Y'), this.margins.left, topEdge);\n\n const yPos = (function (doc) { // eslint-disable-line func-names\n let value = topEdge + doc.currentLineHeight() * 1.5;\n return {\n current: () => (value),\n small: () => {\n value += (doc.currentLineHeight() * 0.75);\n return value;\n },\n update: () => {\n value += (doc.currentLineHeight() * 1.25);\n return value;\n },\n };\n }(this.doc));\n\n this.doc.moveTo(this.margins.left, yPos.current())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .lineWidth(0.5)\n .stroke(this.colors.lightDividers);\n\n if (totalCbgDuration > 0) {\n first = false;\n this.doc.fontSize(this.smallFontSize)\n .lineGap(this.doc.currentLineHeight() * 0.25)\n .text(t('Time in Target'), smallIndent, yPos.update());\n\n yPos.update();\n\n const { targetUpperBound, targetLowerBound, veryLowThreshold } = this.bgBounds;\n\n const upperTarget = formatDecimalNumber(targetUpperBound, bgPrecision);\n const lowerTarget = formatDecimalNumber(targetLowerBound, bgPrecision);\n\n this.doc.font(this.font)\n .text(\n `${lowerTarget} - ${upperTarget}`,\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(`${formatPercentage(target / totalCbgDuration)}`, { align: 'right' });\n\n yPos.update();\n\n this.doc\n .text(\n t('Below {{threshold}}', {\n threshold: formatDecimalNumber(veryLowThreshold, bgPrecision),\n }),\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(`${formatPercentage(veryLow / totalCbgDuration)}`, { align: 'right' });\n\n yPos.update();\n }\n\n if (totalInsulin > 0) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n const ratioTitle = this.isAutomatedBasalDevice\n ? t('Time in {{automatedLabel}}', {\n automatedLabel: this.basalGroupLabels.automated,\n })\n : t('Basal:Bolus Ratio');\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(ratioTitle, smallIndent, yPos.update());\n\n yPos.update();\n\n const ratio = this.isAutomatedBasalDevice\n ? ['manual', 'automated']\n : ['basal', 'bolus'];\n\n const percentages = {\n basal: formatPercentage(totalBasal / totalInsulin),\n bolus: formatPercentage(totalBolus / totalInsulin),\n };\n\n const labels = {\n basal: t('Basal'),\n bolus: t('Bolus'),\n };\n\n if (this.isAutomatedBasalDevice) {\n const { automated, manual } = _.get(stats, 'timeInAuto.data.raw', {});\n const totalBasalDuration = automated + manual;\n percentages.automated = formatPercentage(automated / totalBasalDuration);\n percentages.manual = formatPercentage(manual / totalBasalDuration);\n\n labels.automated = this.basalGroupLabels.automated;\n labels.manual = this.basalGroupLabels.manual;\n }\n\n const primary = {\n [ratio[0]]: percentages[ratio[0]],\n [ratio[1]]: percentages[ratio[1]],\n };\n\n const secondary = {\n [ratio[0]]: this.isAutomatedBasalDevice ? '' : `, ${formatDecimalNumber(totalBasal, 1)} U`,\n [ratio[1]]: this.isAutomatedBasalDevice ? '' : `, ${formatDecimalNumber(totalBolus, 1)} U`,\n };\n\n this.doc.font(this.font)\n .text(\n labels[ratio[0]],\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(\n `${primary[ratio[0]]}${secondary[ratio[0]]}`,\n { align: 'right' }\n );\n\n yPos.update();\n\n this.doc.font(this.font)\n .text(\n labels[ratio[1]],\n { indent: statsIndent, continued: true, width: widthWithoutIndent },\n )\n .text(\n `${primary[ratio[1]]}${secondary[ratio[1]]}`,\n { align: 'right' }\n );\n\n yPos.update();\n }\n\n if (averageGlucose) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Average BG'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n `${formatDecimalNumber(averageGlucose, bgPrecision)} ${this.bgUnits}`,\n { align: 'right' }\n );\n\n yPos.small();\n }\n\n if (totalInsulin > 0) {\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Total Insulin'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n `${formatDecimalNumber(totalInsulin, 1)} U`,\n { align: 'right' }\n );\n\n yPos.small();\n }\n\n if (_.get(carbs, 'grams') > 0 || _.get(carbs, 'exchanges') > 0) {\n const formattedCarbs = formatDatum({ value: carbs }, statFormats.carbs);\n const carbValues = _.get(formattedCarbs, 'value');\n const carbSuffixes = _.get(formattedCarbs, 'suffix');\n\n if (!first) {\n this.doc.moveTo(this.margins.left, yPos.update())\n .lineTo(this.summaryArea.rightEdge, yPos.current())\n .stroke(this.colors.lightDividers);\n } else {\n first = false;\n }\n\n this.doc.fontSize(this.smallFontSize).font(this.boldFont)\n .text(\n t('Total Carbs'),\n smallIndent,\n yPos.update(),\n { continued: true, width: widthWithoutIndent }\n )\n .font(this.font)\n .text(\n _.map(carbValues, (value, i) => `${value} ${carbSuffixes[i]}`).join(', '),\n { align: 'right' }\n );\n }\n\n return this;\n }\n\n renderXAxes({ bolusDetailsHeight, topEdge, date }) {\n const {\n notesEtc,\n bgEtcChart,\n basalChart,\n } = this.chartMinimums;\n\n this.doc.lineWidth(0.25);\n\n // render x-axis for bgEtcChart\n const bottomOfBgEtcChart = topEdge + notesEtc + bgEtcChart;\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBgEtcChart)\n .lineTo(this.rightEdge, bottomOfBgEtcChart)\n .stroke(this.colors.axes);\n\n // render bottom border of bolusDetails\n const bottomOfBolusDetails = bottomOfBgEtcChart + bolusDetailsHeight;\n\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBolusDetails)\n .lineTo(this.rightEdge, bottomOfBolusDetails)\n .stroke(this.colors.axes);\n\n // render x-axis for basalChart\n const bottomOfBasalChart = bottomOfBolusDetails + basalChart;\n this.chartsByDate[date].bottomOfBasalChart = bottomOfBasalChart;\n\n this.doc.moveTo(this.chartArea.leftEdge, bottomOfBasalChart)\n .lineTo(this.rightEdge, bottomOfBasalChart)\n .stroke(this.colors.axes);\n\n return this;\n }\n\n renderYAxes({ bgScale, bottomOfBasalChart, utcBounds, date, topEdge, xScale }) {\n const end = utcBounds[1];\n let current = utcBounds[0];\n const threeHrLocs = [current];\n while (current < end) {\n current = moment.utc(current)\n .add(3, 'h')\n .valueOf();\n threeHrLocs.push(current);\n }\n const chart = this.chartsByDate[date];\n chart.bolusDetailPositions = Array(8);\n chart.bolusDetailWidths = Array(8);\n\n // render the vertical lines at three-hr intervals\n _.each(threeHrLocs, (loc, i) => {\n let xPos = xScale(loc);\n if (i === 0) {\n xPos = this.chartArea.leftEdge;\n }\n if (i === 8) {\n xPos = this.rightEdge;\n }\n if (i > 0) {\n chart.bolusDetailWidths[i - 1] = xPos - chart.bolusDetailPositions[i - 1];\n }\n if (i < 8) {\n chart.bolusDetailPositions[i] = xPos;\n\n this.doc.font(this.font).fontSize(this.smallFontSize)\n .text(\n formatLocalizedFromUTC(loc, this.timePrefs, 'ha').slice(0, -1),\n xPos,\n topEdge,\n { indent: 3 },\n );\n }\n\n this.doc.moveTo(xPos, topEdge)\n .lineTo(xPos, bottomOfBasalChart)\n .lineWidth(0.25)\n .stroke(this.colors.axes);\n });\n\n // render the BG axis labels and guides\n const opts = {\n align: 'right',\n width: this.chartArea.leftEdge - this.summaryArea.rightEdge - 3,\n };\n\n const renderedBounds = _.pickBy(this.bgBounds, bound => (bound <= this.bgScaleYLimit));\n\n _.each(renderedBounds, (bound, key) => {\n const bgTick = formatBgValue(bound, this.bgPrefs);\n const xPos = this.chartArea.leftEdge;\n const yPos = bgScale(bound);\n\n if (key === 'targetUpperBound' || key === 'targetLowerBound') {\n this.doc\n .moveTo(xPos, yPos)\n .lineTo(xPos + this.chartArea.width, yPos)\n .lineWidth(0.25)\n .dash(3, { space: 4 })\n .stroke(this.colors.axes);\n\n this.setStroke();\n this.doc.undash();\n }\n\n this.doc.font(this.font)\n .fontSize(this.bgAxisFontSize)\n .fillColor(this.colors.axis)\n .text(\n `${bgTick}`,\n this.summaryArea.rightEdge,\n yPos - this.doc.currentLineHeight() / 2,\n opts,\n );\n });\n\n return this;\n }\n\n renderCbgs({ bgScale, data: { cbg: cbgs }, xScale }) {\n _.each(cbgs, (cbg) => {\n this.doc.circle(xScale(cbg.normalTime), bgScale(cbg.value), 1)\n .fill(this.colors[classifyBgValue(this.bgBounds, cbg.value)]);\n });\n\n return this;\n }\n\n renderSmbgs({ bgScale, data: { smbg: smbgs }, xScale }) {\n _.each(smbgs, (smbg) => {\n const xPos = xScale(smbg.normalTime);\n const yPos = bgScale(smbg.value);\n const smbgLabel = formatBgValue(smbg.value, this.bgPrefs, getOutOfRangeThreshold(smbg));\n const labelWidth = this.doc.widthOfString(smbgLabel);\n const labelOffsetX = labelWidth / 2;\n let labelStartX = xPos - labelOffsetX;\n const labelEndX = labelStartX + labelWidth;\n\n this.doc.circle(xPos, yPos, this.smbgRadius)\n .fill(this.colors[classifyBgValue(this.bgBounds, smbg.value)]);\n\n // Ensure label is printed within chart area for the x-axis\n if (labelStartX <= this.chartArea.leftEdge) {\n labelStartX = labelStartX + (this.chartArea.leftEdge - labelStartX) + 1;\n }\n if (labelEndX >= this.rightEdge) {\n labelStartX = labelStartX - (labelEndX - this.rightEdge) - 1;\n }\n\n this.doc.font(this.boldFont)\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(\n smbgLabel,\n labelStartX,\n yPos - 12.5, {\n lineBreak: false,\n },\n );\n });\n\n return this;\n }\n\n renderInsulinEvents({ bolusScale, data: { bolus: insulinEvents }, xScale }) {\n _.each(insulinEvents, (insulinEvent) => {\n const paths = getBolusPaths(insulinEvent, xScale, bolusScale, {\n bolusWidth: this.bolusWidth,\n extendedLineThickness: this.extendedLineThickness,\n interruptedLineThickness: this.interruptedLineThickness,\n triangleHeight: this.triangleHeight,\n });\n _.each(paths, (path) => {\n this.renderEventPath(path);\n });\n const carbs = getCarbs(insulinEvent);\n const circleOffset = 1;\n const textOffset = 1.75;\n const carbUnits = _.get(getWizardFromInsulinEvent(insulinEvent), 'carbUnits');\n const carbFillColor = (carbUnits === 'exchanges') ? this.colors.carbExchanges : this.colors.carbs;\n if (carbs) {\n const carbsX = xScale(getBolusFromInsulinEvent(insulinEvent).normalTime);\n const carbsY = bolusScale(getMaxValue(insulinEvent)) - this.carbRadius - circleOffset;\n this.doc.circle(carbsX, carbsY, this.carbRadius)\n .fill(carbFillColor);\n this.doc.font(this.font)\n .fontSize(this.carbsFontSize)\n .fillColor('black')\n .text(\n carbs,\n carbsX - this.carbRadius * 2,\n carbsY - textOffset,\n { align: 'center', width: this.carbRadius * 4 }\n );\n }\n });\n\n return this;\n }\n\n renderFoodCarbs({ bolusScale, data: { food }, xScale }) {\n const circleOffset = 1;\n const textOffset = 1.75;\n\n _.each(food, foodEvent => {\n const carbs = _.get(foodEvent, 'nutrition.carbohydrate.net');\n\n if (carbs) {\n const carbsX = xScale(foodEvent.normalTime);\n const carbsY = bolusScale(0) - this.carbRadius - circleOffset;\n this.doc.circle(carbsX, carbsY, this.carbRadius)\n .fill(this.colors.carbs);\n this.doc.font(this.font)\n .fontSize(this.carbsFontSize)\n .fillColor('black')\n .text(\n Math.round(carbs),\n carbsX - this.carbRadius * 2,\n carbsY - textOffset,\n { align: 'center', width: this.carbRadius * 4 }\n );\n }\n });\n\n return this;\n }\n\n renderBolusDetails({\n bolusDetailPositions,\n bolusDetailWidths,\n bolusScale,\n data: { bolus: insulinEvents },\n }) {\n this.doc.font(this.font)\n .fontSize(this.smallFontSize)\n .fillColor('black');\n\n const topOfBolusDetails = bolusScale.range()[0] + 2;\n\n const grouped = _.groupBy(\n _.map(insulinEvents, (d) => (getBolusFromInsulinEvent(d))),\n (d) => (d.threeHrBin / 3),\n );\n\n _.each(grouped, (binOfBoluses, i) => {\n const groupWidth = bolusDetailWidths[i] - 2;\n const groupXPos = bolusDetailPositions[i];\n const yPos = (function (doc) { // eslint-disable-line func-names\n let value = topOfBolusDetails;\n return {\n current: () => (value),\n update: () => {\n value += (doc.currentLineHeight() * 1.2);\n return value;\n },\n };\n }(this.doc));\n _.each(_.sortBy(binOfBoluses, 'normalTime'), (bolus) => {\n const displayTime = formatLocalizedFromUTC(bolus.normalTime, this.timePrefs, 'h:mma')\n .slice(0, -1);\n this.doc.text(\n displayTime,\n groupXPos,\n yPos.current(),\n { continued: true, indent: 2, width: groupWidth },\n ).text(\n removeTrailingZeroes(formatDecimalNumber(getDelivered(bolus), 2)),\n { align: 'right' }\n );\n\n if (bolus.extended != null) {\n const normalPercentage = getNormalPercentage(bolus);\n const extendedPercentage = getExtendedPercentage(bolus);\n const durationOpts = { ascii: true };\n const durationText = `${formatDuration(getMaxDuration(bolus), durationOpts)}`;\n const percentagesText = Number.isNaN(normalPercentage) ?\n `over ${durationText}` : `${extendedPercentage} ${durationText}`;\n this.doc.text(\n percentagesText,\n groupXPos,\n yPos.update(),\n { indent: 2, width: groupWidth },\n );\n }\n yPos.update();\n });\n });\n\n return this;\n }\n\n renderBasalRates(chart) {\n const { bottomOfBasalChart, data: { basal }, xScale } = chart;\n\n const currentSchedule = {\n rate: 0,\n duration: 0,\n index: -1,\n };\n\n const labeledSchedules = [];\n _.each(basal, datum => {\n if (datum.subType === 'scheduled' && datum.rate > 0 && datum.duration >= 60 * MS_IN_MIN) {\n const newRate = currentSchedule.rate !== datum.rate;\n\n if (newRate) {\n labeledSchedules.push({\n normalTime: datum.normalTime,\n rate: datum.rate,\n duration: currentSchedule.duration + datum.duration,\n });\n\n currentSchedule.rate = datum.rate;\n currentSchedule.index ++;\n currentSchedule.duration = 0;\n } else if (labeledSchedules.length) {\n labeledSchedules[currentSchedule.index].duration += datum.duration;\n } else {\n currentSchedule.duration += datum.duration;\n }\n }\n });\n\n this.setFill();\n\n _.each(labeledSchedules, schedule => {\n const start = xScale(schedule.normalTime);\n\n this.doc.fontSize(this.extraSmallFontSize);\n const label = `${parseFloat(formatDecimalNumber(schedule.rate, 3))}`;\n const xPos = start;\n const yPos = bottomOfBasalChart + 2;\n\n this.doc.text(label, xPos, yPos);\n });\n\n this.resetText();\n\n return this;\n }\n\n renderBasalPaths({ basalScale, data: { basal, basalSequences: sequences }, xScale }) {\n _.each(sequences, (sequence) => {\n // Skip empty basal sequences -- otherwise getBasalSequencePaths throws error\n if (_.filter(sequence).length) {\n const paths = getBasalSequencePaths(sequence, xScale, basalScale);\n\n _.each(paths, (path) => {\n const opacity = _.includes(['scheduled', 'automated'], path.basalType) ? 0.4 : 0.2;\n const fillColor = path.basalType === 'automated'\n ? this.colors.basalAutomated\n : this.colors.basal;\n\n const lineWidth = path.type === 'border--undelivered--automated' ? 1.5 : 0.5;\n\n if (path.renderType === 'fill') {\n this.doc\n .path(path.d)\n .fillColor(fillColor)\n .fillOpacity(opacity)\n .fill();\n } else if (path.renderType === 'stroke') {\n this.doc\n .path(path.d)\n .lineWidth(lineWidth)\n .dash(1, { space: 2 })\n .stroke(this.colors.basal);\n }\n });\n }\n });\n\n if (!_.isEmpty(basal)) {\n const basalPathGroups = getBasalPathGroups(basal);\n\n // Split delivered path into individual segments based on subType\n _.each(basalPathGroups, (group, index) => {\n const firstDatum = group[0];\n const isAutomated = getBasalPathGroupType(firstDatum) === 'automated';\n const color = isAutomated\n ? this.colors.basalAutomated\n : this.colors.basal;\n\n const wholeDateDeliveredPath = calculateBasalPath(group, xScale, basalScale, {\n endAtZero: false,\n flushBottomOffset: -0.25,\n isFilled: false,\n startAtZero: false,\n });\n\n this.doc\n .path(wholeDateDeliveredPath)\n .lineWidth(0.5)\n .undash()\n .stroke(color);\n\n // Render group markers\n if (index > 0) {\n const xPos = xScale(firstDatum.normalTime);\n const yPos = basalScale.range()[1] + this.markerRadius + 1;\n const zeroBasal = basalScale.range()[0];\n const flushWithBottomOfScale = zeroBasal;\n\n const label = isAutomated\n ? this.basalGroupLabels.automated.charAt(0)\n : this.basalGroupLabels.manual.charAt(0);\n\n const labelColor = 'white';\n\n const labelWidth = this.doc\n .fontSize(5)\n .widthOfString(label);\n\n this.doc\n .circle(xPos, yPos, this.markerRadius)\n .fillColor(color)\n .fillOpacity(1)\n .fill();\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.75)\n .lineTo(xPos, flushWithBottomOfScale)\n .stroke(color);\n\n this.doc\n .fillColor(labelColor)\n .text(label, xPos - (labelWidth / 2), yPos - 2, {\n width: labelWidth,\n align: 'center',\n });\n }\n });\n }\n\n return this;\n }\n\n renderPumpSettingsOverrides({ basalScale, data: { deviceEvent }, xScale, utcBounds }) {\n const overrideData = _.filter(deviceEvent, { subType: 'pumpSettingsOverride' });\n\n const isFabricatedNewDayOverride = datum => _.includes(\n _.map(_.get(datum, 'annotations', []), 'code'),\n 'tandem/pumpSettingsOverride/fabricated-from-new-day'\n );\n\n // Because the new datums are fabricated at upload when they cross midnight, we stitch them\n // together by adding the fabricated datum's duration to the previous one, so long as the\n // previous one is not also a fabricated datum.\n const stitchedData = _.reduce(overrideData, (res, datum) => {\n const prevDatum = res[res.length - 1];\n\n if (prevDatum && (\n isFabricatedNewDayOverride(datum) && !isFabricatedNewDayOverride(prevDatum))\n ) {\n res[res.length - 1].normalEnd = datum.normalEnd;\n res[res.length - 1].duration += datum.duration;\n } else {\n res.push(datum);\n }\n\n return res;\n }, []);\n\n _.each(stitchedData, datum => {\n const overrideStart = _.max([datum.normalTime, utcBounds[0]]);\n const overrideEnd = _.min([datum.normalTime + datum.duration, utcBounds[1]]);\n const xPos = xScale(overrideStart);\n const yPos = basalScale.range()[1] + this.markerRadius + 1;\n const bottomOfScale = basalScale.range()[0];\n const label = _.get(this.pumpSettingsOverrideLabels, [datum.overrideType, 'marker'], (datum.overrideType || 'O').toUpperCase()).charAt(0);\n const labelColor = 'white';\n const color = this.colors[datum.overrideType];\n\n const labelWidth = this.doc\n .fontSize(5)\n .widthOfString(label);\n\n this.doc\n .circle(xPos, yPos, this.markerRadius)\n .fillColor(color)\n .fillOpacity(1)\n .fill();\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.75)\n .lineTo(xPos, bottomOfScale)\n .stroke(color);\n\n this.doc\n .moveTo(xPos, yPos)\n .lineWidth(0.5)\n .lineTo(xScale(overrideEnd), yPos)\n .dash(1, { space: 2 })\n .stroke(color);\n\n this.doc.undash();\n\n this.doc\n .fillColor(labelColor)\n .text(label, xPos - (labelWidth / 2), yPos - 2, {\n width: labelWidth,\n align: 'center',\n });\n });\n\n return this;\n }\n\n renderChartDivider({ bottomEdge, bottomOfBasalChart }) {\n const isLastChartOnPage = bottomEdge + this.chartMinimums.total > this.chartArea.bottomEdge;\n\n const padding = (bottomEdge - bottomOfBasalChart) + this.chartMinimums.paddingBelow;\n\n if (!isLastChartOnPage) {\n const yPos = bottomOfBasalChart + padding / 2;\n\n this.doc\n .moveTo(this.leftEdge, yPos)\n .lineWidth(1)\n .lineTo(this.rightEdge, yPos)\n .stroke(this.colors.lightGrey);\n }\n }\n\n renderLegend() {\n this.doc.fontSize(9);\n const lineHeight = this.doc.currentLineHeight();\n this.doc.fillColor('black').fillOpacity(1)\n .text(t('Legend'), this.margins.left, this.bottomEdge - lineHeight * 8);\n\n const legendHeight = lineHeight * 4;\n const legendTop = this.bottomEdge - lineHeight * 6;\n\n this.doc.lineWidth(1)\n .rect(this.margins.left, legendTop, this.width, legendHeight)\n .stroke('black');\n\n this.doc.fontSize(this.smallFontSize);\n\n const legendVerticalMiddle = legendTop + lineHeight * 2;\n const legendTextMiddle = legendVerticalMiddle - this.doc.currentLineHeight() / 2;\n let legendItemLeftOffset = 9;\n let legendItemLabelOffset = 4.5;\n\n if (this.isAutomatedBolusDevice) {\n legendItemLeftOffset = 7;\n legendItemLabelOffset = 4;\n }\n\n let cursor = this.margins.left + legendItemLeftOffset;\n\n // rendering the items in the legend\n // cbg\n const vertOffsetAdjustments = [\n 2.25,\n 1,\n 0.25,\n 0,\n 0,\n -0.25,\n -1,\n -2.25,\n ];\n _.each(_.map(range(0, 16, 2), (d) => ([d, d - 7])), (pair) => {\n const [horizOffset, vertOffset] = pair;\n const adjustedVertOffset = vertOffset + vertOffsetAdjustments[horizOffset / 2];\n let fill;\n\n if (horizOffset < 4) {\n fill = 'high';\n } else if (horizOffset < 12) {\n fill = 'target';\n } else {\n fill = 'low';\n }\n\n this.doc\n .circle(cursor + horizOffset, legendVerticalMiddle + adjustedVertOffset, this.cbgRadius)\n .fill(this.colors[fill]);\n });\n cursor += 16 + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('CGM'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('CGM')) + legendItemLeftOffset * 2;\n\n // smbg\n const smbgPositions = {\n target: [cursor, legendVerticalMiddle],\n high: [cursor + this.smbgRadius * 2, legendVerticalMiddle - this.smbgRadius * 2],\n low: [cursor + this.smbgRadius * 2, legendVerticalMiddle + this.smbgRadius * 2],\n };\n this.doc.circle(cursor, legendVerticalMiddle, this.smbgRadius)\n .fill(this.colors.target);\n this.doc.circle(smbgPositions.high[0], smbgPositions.high[1], this.smbgRadius)\n .fill(this.colors.high);\n this.doc.circle(smbgPositions.low[0], smbgPositions.low[1], this.smbgRadius)\n .fill(this.colors.low);\n cursor += this.smbgRadius * 3 + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('BGM'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('BGM')) + legendItemLeftOffset * 2;\n\n /* boluses */\n const bolusOpts = {\n bolusWidth: this.bolusWidth,\n extendedLineThickness: this.extendedLineThickness,\n interruptedLineThickness: this.interruptedLineThickness,\n triangleHeight: this.triangleHeight,\n };\n const legendBolusYScale = scaleLinear()\n .domain([0, 10])\n .range([legendTop + legendHeight - legendHeight / 4, legendTop + legendHeight / 4]);\n\n // (normal) bolus\n const normalBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const normalPaths = getBolusPaths(\n { normal: 10, normalTime: 0 },\n normalBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(normalPaths, (path) => {\n this.renderEventPath(path);\n });\n\n if (this.isAutomatedBolusDevice) {\n const automatedPaths = getBolusPaths(\n { normal: 6, normalTime: 5, subType: 'automated' },\n normalBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(automatedPaths, (path) => {\n this.renderEventPath(path);\n });\n\n cursor += this.bolusWidth * 3 + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Bolus'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('manual & automated'));\n\n cursor += this.doc.widthOfString(t('manual & automated')) + legendItemLeftOffset * 2;\n } else {\n cursor += this.bolusWidth + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('Bolus'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Bolus')) + legendItemLeftOffset * 2;\n }\n\n // underride & override boluses\n const rideBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const overridePaths = getBolusPaths(\n {\n type: 'wizard',\n recommended: {\n net: 8,\n carb: 8,\n correction: 0,\n },\n bolus: {\n normal: 10,\n normalTime: 0,\n },\n },\n rideBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(overridePaths, (path) => {\n this.renderEventPath(path);\n });\n const underridePaths = getBolusPaths(\n {\n type: 'wizard',\n recommended: {\n net: 10,\n carb: 8,\n correction: 2,\n },\n bolus: {\n normal: 5,\n normalTime: 5,\n },\n },\n rideBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(underridePaths, (path) => {\n this.renderEventPath(path);\n });\n\n cursor += this.bolusWidth * 3 + legendItemLabelOffset;\n\n if (this.isAutomatedBolusDevice) {\n this.doc\n .fillColor('black')\n .text(t('Override'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('up & down'));\n\n cursor += this.doc.widthOfString(t('up & down')) + legendItemLeftOffset * 2;\n } else {\n this.doc.fillColor('black').text(t('Override up & down'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Override up & down')) + legendItemLeftOffset * 2;\n }\n\n // interrupted bolus\n const interruptedBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const interruptedPaths = getBolusPaths(\n {\n normal: 6,\n expectedNormal: 10,\n normalTime: 0,\n },\n interruptedBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(interruptedPaths, (path) => {\n this.renderEventPath(path);\n });\n cursor += this.bolusWidth + legendItemLabelOffset;\n this.doc.fillColor('black').text(t('Interrupted'), cursor, legendTextMiddle);\n cursor += this.doc.widthOfString(t('Interrupted')) + legendItemLeftOffset * 2;\n\n // extended bolus\n const extendedBolusXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 10]);\n const extendedPaths = getBolusPaths(\n {\n normal: 5,\n extended: 5,\n duration: 10,\n normalTime: 0,\n },\n extendedBolusXScale,\n legendBolusYScale,\n bolusOpts\n );\n _.each(extendedPaths, (path) => {\n this.renderEventPath(path);\n });\n cursor += this.bolusWidth / 2 + 10 + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Combo /'), cursor, legendTextMiddle - this.doc.currentLineHeight() / 2)\n .text(t('Extended'));\n\n cursor += this.doc.widthOfString(t('Extended')) + legendItemLeftOffset * 2;\n\n // carbohydrates\n const carbsYPos = {\n circle: legendVerticalMiddle,\n carbs: legendVerticalMiddle - this.carbRadius / 2,\n label: legendTextMiddle,\n };\n\n const exchangesYPos = {\n circle: carbsYPos.circle + this.doc.currentLineHeight() / 2 + 1.5,\n carbs: carbsYPos.carbs + this.doc.currentLineHeight() / 2 + 1.5,\n };\n\n if (this.hasCarbExchanges) {\n carbsYPos.circle = carbsYPos.circle - this.doc.currentLineHeight() / 2 - 1;\n carbsYPos.carbs = carbsYPos.carbs - this.doc.currentLineHeight() / 2 - 1;\n carbsYPos.label = carbsYPos.label - this.doc.currentLineHeight() / 2;\n }\n\n this.doc\n .circle(cursor, carbsYPos.circle, this.carbRadius)\n .fill(this.colors.carbs);\n\n if (this.hasCarbExchanges) {\n this.doc\n .circle(cursor, exchangesYPos.circle, this.carbRadius)\n .fill(this.colors.carbExchanges);\n }\n\n this.doc\n .fillColor('black')\n .fontSize(this.carbsFontSize)\n .text(\n '25',\n cursor - this.carbRadius,\n carbsYPos.carbs,\n { align: 'center', width: this.carbRadius * 2 }\n );\n\n if (this.hasCarbExchanges) {\n this.doc\n .text(\n '2',\n cursor - this.carbRadius,\n exchangesYPos.carbs,\n { align: 'center', width: this.carbRadius * 2 }\n );\n }\n\n this.doc.fontSize(this.smallFontSize);\n cursor += this.carbRadius + legendItemLabelOffset;\n this.doc\n .fillColor('black')\n .text(t('Carbs (g)'), cursor, carbsYPos.label);\n\n if (this.hasCarbExchanges) {\n this.doc.text(t('Carb exch'));\n }\n\n cursor += this.doc.widthOfString(t('Carbs (g)')) + legendItemLeftOffset * 2;\n\n /* basals */\n const legendBasalYScale = scaleLinear()\n .domain([0, 2.5])\n .range([legendTop + legendHeight - legendHeight / 4, legendTop + legendHeight / 4.5]);\n\n const legendBasalXScale = scaleLinear()\n .domain([0, 10])\n .range([cursor, cursor + 50]);\n\n const dynamicBasalType = this.isAutomatedBasalDevice ? 'automated' : 'scheduled';\n\n const scheduled1 = {\n subType: dynamicBasalType,\n rate: 1.5,\n duration: 2,\n normalTime: 0,\n };\n const negTemp = {\n subType: 'temp',\n rate: 0.5,\n duration: 2.5,\n normalTime: 2,\n suppressed: {\n rate: 1.5,\n },\n };\n const scheduled2 = {\n subType: 'scheduled',\n rate: 1.75,\n duration: 1.5,\n normalTime: 4.5,\n };\n const posTemp = {\n subType: 'temp',\n rate: 2,\n duration: 2,\n normalTime: 6,\n suppressed: {\n rate: 1.75,\n },\n };\n const suspend = {\n subType: 'suspend',\n rate: 0,\n duration: 2,\n normalTime: 8,\n suppressed: {\n subType: dynamicBasalType,\n rate: dynamicBasalType === 'automated' ? 0 : 1.75,\n },\n };\n const data = {\n basal: [\n scheduled1,\n negTemp,\n scheduled2,\n posTemp,\n suspend,\n ],\n basalSequences: [\n [scheduled1],\n [negTemp],\n [scheduled2],\n [posTemp],\n [suspend],\n ],\n };\n this.renderBasalPaths({\n basalScale: legendBasalYScale,\n data,\n xScale: legendBasalXScale,\n });\n cursor += 50 + legendItemLabelOffset;\n this.doc\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(t('Basals'), cursor, legendTextMiddle);\n\n return this;\n }\n}\n\nexport default DailyPrintView;\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\n/**\n * calculateBasalPath\n * @param {Array} basalSequence - an array of Tidepool basal events to be rendered as one\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n * @param {Object} opts - basal sequence rendering options such as whether filled\n *\n * @return {String} path - basal sequence SVG path\n */\n\nexport function calculateBasalPath(basalSequence, xScale, yScale, {\n endAtZero,\n flushBottomOffset = 0,\n isFilled,\n startAtZero,\n}) {\n let path = '';\n const zeroBasal = yScale.range()[0];\n const flushWithBottomOfScale = zeroBasal + flushBottomOffset;\n\n function handleDiscontinuousEnd(basal) {\n path += `L ${xScale(basal.normalTime + basal.duration)},${flushWithBottomOfScale} `;\n }\n\n function handleDiscontinuousStart(basal) {\n path += `M ${xScale(basal.normalTime)},${flushWithBottomOfScale} `;\n }\n\n const first = basalSequence[0];\n const startX = xScale(first.normalTime);\n const startY = _.every(basalSequence, (d) => (d.rate === 0)) ?\n flushWithBottomOfScale :\n yScale(first.rate);\n if (startAtZero || isFilled) {\n path += `M ${startX},${zeroBasal} L `;\n } else {\n path += 'M ';\n }\n path += `${startX},${startY}\n L ${xScale(first.normalTime + first.duration)},${startY} `;\n\n if (!isFilled && first.discontinuousEnd) {\n handleDiscontinuousEnd(first);\n }\n\n _.each(basalSequence.slice(1), (basal) => {\n const thisBasalY = (basal.rate > 0) ? yScale(basal.rate) : flushWithBottomOfScale;\n if (!isFilled && basal.discontinuousStart) {\n handleDiscontinuousStart(basal);\n }\n\n path += `L ${xScale(basal.normalTime)},${thisBasalY}\n L ${xScale(basal.normalTime + basal.duration)},${thisBasalY} `;\n\n if (!isFilled && basal.discontinuousEnd) {\n handleDiscontinuousEnd(basal);\n }\n });\n\n const last = basalSequence[basalSequence.length - 1];\n const endX = xScale(last.normalTime + last.duration);\n path += `L ${endX},${yScale(last.rate)}`;\n\n if (endAtZero || isFilled) {\n path += ` L ${endX},${zeroBasal}`;\n }\n\n if (isFilled) {\n path += ' Z';\n }\n\n // PDFKit will not render path definitions with line breaks properly\n // do NOT forget to remove the newlines!\n return path.replace(/\\n/g, '').replace(/\\s\\s+/g, ' ');\n}\n\n/**\n * getBasalSequencePaths\n * @param {Array} basalSequence - an array of Tidepool basal events to be rendered as one\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n *\n * @return {Array} paths - Array of Objects, each specifying component paths to draw a bolus\n */\nexport function getBasalSequencePaths(basalSequence, xScale, yScale) {\n const first = basalSequence[0];\n const last = basalSequence[basalSequence.length - 1];\n const paths = [];\n let type;\n\n const types = _.uniq(\n _.reject(\n _.map(\n basalSequence, 'subType'\n ),\n (d) => (!_.isString(d))\n )\n );\n if (types.length === 0) {\n throw new Error('Cannot determine `subType` of basal sequence!');\n } else if (types.length > 1) {\n throw new Error('A basal sequence may contain only *one* `subType` of basal event.');\n } else {\n type = types[0];\n }\n\n if (_.some(basalSequence, (d) => (d.rate > 0))) {\n paths.push({\n d: calculateBasalPath(\n basalSequence, xScale, yScale, {\n endAtZero: last.discontinuousEnd,\n isFilled: true,\n startAtZero: first.discontinuousStart,\n },\n ),\n basalType: type,\n key: `basalFill-${first.id}`,\n renderType: 'fill',\n type: `fill--${type}`,\n });\n }\n\n const suppresseds = [];\n let undeliveredType = 'border--undelivered';\n _.each(basalSequence, (basal) => {\n if (basal.suppressed) {\n const suppressed = _.clone(basal.suppressed);\n if (_.get(suppressed, 'subType', suppressed.deliveryType) === 'automated') {\n undeliveredType = 'border--undelivered--automated';\n // For automated suppressed delivery, we always render at the baseline\n suppressed.rate = 0;\n }\n suppresseds.push(_.assign({}, suppressed, _.pick(basal, ['duration', 'normalTime'])));\n }\n });\n\n if (!_.isEmpty(suppresseds)) {\n paths.push({\n d: calculateBasalPath(\n suppresseds, xScale, yScale, {\n endAtZero: false,\n isFilled: false,\n startAtZero: false,\n },\n ),\n basalType: type,\n key: `basalPathUndelivered-${first.id}`,\n renderType: 'stroke',\n type: undeliveredType,\n });\n }\n\n return paths;\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 * as bolusUtils from '../../utils/bolus';\n\n/**\n * formatBolusRectPath\n * @param {Object} bolusEdges - object containing `left`, `right`, `top`, `bottom` edges\n *\n * @return {String} SVG path data string defining a bolus rectangle\n */\nfunction formatBolusRectPath({ left, right, top, bottom }) {\n // PDFKit will not render path definitions with line breaks properly\n // do NOT forget to remove the newlines!\n return `\n M ${left},${bottom}\n L ${left},${top}\n L ${right},${top}\n L ${right},${bottom} Z\n `;\n}\n\n/**\n * getBolusEdges\n * @param {Number} bolusWidth - width of a bolus (rendering-platform specific)\n * @param {Number} bolusCenter - scaled center of the bolus on the x (i.e., time) axis\n * @param {Number} bolusBottom - scaled bottom of the bolus on the y-axis\n * @param {Number} bolusHeight - scaled height of the bolus\n *\n * @return {Object} object containing `left`, `right`, `top`, `bottom` edges for a bolus rectangle\n */\nexport function getBolusEdges(bolusWidth, bolusCenter, bolusBottom, bolusHeight) {\n const halfWidth = bolusWidth / 2;\n\n const leftX = bolusCenter - halfWidth;\n const rightX = bolusCenter + halfWidth;\n\n return {\n left: leftX,\n right: rightX,\n top: bolusHeight,\n bottom: bolusBottom,\n };\n}\n\n/**\n * getBolusPaths\n * @param {Object} insulinEvent - a Tidepool wizard (with embedded bolus) or bolus datum\n * @param {Function} xScale - xScale preconfigured with domain & range\n * @param {Function} yScale - yScale preconfigured with domain & range\n * @param {Object} opts - bolus rendering options such as width\n *\n * @return {Array} paths - Array of Objects, each specifying component paths to draw a bolus\n */\nexport default function getBolusPaths(insulinEvent, xScale, yScale, {\n bolusWidth,\n extendedLineThickness,\n interruptedLineThickness,\n triangleHeight,\n}) {\n const bolus = bolusUtils.getBolusFromInsulinEvent(insulinEvent);\n const paths = [];\n\n const bolusBottom = yScale.range()[0];\n const bolusCenter = xScale(bolus.normalTime);\n\n const isNonTrivialUnderride = bolusUtils.isUnderride(insulinEvent) &&\n bolusUtils.getDelivered(insulinEvent);\n const isNonTrivialOverride = bolusUtils.isOverride(insulinEvent) &&\n bolusUtils.getDelivered(insulinEvent);\n\n // the backmost layer is any undelivered bolus insulin\n // (in the case of interruption/cancellation/suspension)\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: suspended\n if (bolusUtils.isInterruptedBolus(insulinEvent)) {\n const undeliveredY = yScale(bolusUtils.getMaxValue(insulinEvent));\n const edges = getBolusEdges(bolusWidth, bolusCenter, bolusBottom, undeliveredY);\n const { left, right } = edges;\n const path = formatBolusRectPath(edges);\n\n paths.push({\n d: path,\n key: `undelivered-${bolus.id}`,\n type: 'undelivered',\n });\n\n const programmedY = yScale(bolusUtils.getProgrammed(insulinEvent));\n const deliveredY = yScale(bolusUtils.getDelivered(insulinEvent));\n // NB: JFC, Chrome uses a constant offset no matter the stroke-width :(((\n // TODO: test in different browsers and adjust\n const fractionStroke = 0.5;\n\n // TODO: figure out how to make this agnostic to browser and render target\n paths.push({\n d: `\n M ${left + fractionStroke},${deliveredY}\n L ${left + fractionStroke},${programmedY + fractionStroke}\n L ${right - fractionStroke},${programmedY + fractionStroke}\n L ${right - fractionStroke},${deliveredY}\n `,\n key: `programmed-${bolus.id}`,\n type: 'programmed',\n });\n // the rectangle for undelivered includes an underride if the insulinEvent\n // was *both* an underride and interrupted/cancelled/suspended\n } else {\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: underride\n if (isNonTrivialUnderride) {\n const recommendedY = yScale(bolusUtils.getRecommended(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(bolusWidth, bolusCenter, bolusBottom, recommendedY)\n );\n\n paths.push({\n d: path,\n key: `underride-${insulinEvent.id}`,\n type: 'underride',\n });\n }\n }\n\n // this is a port of tideline's js/plot/util/drawbolus.js: bolus\n if (bolusUtils.getDelivered(insulinEvent) || bolusUtils.getProgrammed((insulinEvent))) {\n const maxY = yScale(bolusUtils.getDelivered(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(bolusWidth, bolusCenter, bolusBottom, maxY)\n );\n\n paths.push({\n d: path,\n key: `delivered-${bolus.id}`,\n type: 'delivered',\n subType: insulinEvent.subType,\n });\n\n const deliveredY = yScale(bolusUtils.getDelivered(insulinEvent));\n const edges = getBolusEdges(bolusWidth, bolusCenter, bolusBottom, deliveredY);\n const { left, right, top, bottom } = edges;\n const fractionStroke = 0.5;\n\n if (insulinEvent.subType === 'automated') {\n paths.push({\n d: `\n M ${left + fractionStroke},${bottom}\n L ${left + fractionStroke},${top + fractionStroke}\n L ${right - fractionStroke},${top + fractionStroke}\n L ${right - fractionStroke},${bottom}\n `,\n key: `programmed-${bolus.id}`,\n type: 'programmed',\n subType: insulinEvent.subType,\n });\n }\n }\n\n // this is a port of tideline's js/plot/util/drawbolus.js: extended\n // it does the straight part of the \"arm\" representing the extended part of the bolus\n // and also the triangle at the end of the \"arm\"\n if (bolusUtils.hasExtended(insulinEvent)) {\n const extendedVal = bolusUtils.getExtended(insulinEvent);\n // yes, 4.5 is a magic number that matches the first tideline implementation\n // the benefit of 4.5 * extendedLineThickness is that\n // it scales with various settings for line thickness, which may vary based on render target\n const triangleSize = 4.5 * extendedLineThickness;\n const halfTriangle = triangleSize / 2;\n const startOfTriangle = xScale(bolus.normalTime + bolusUtils.getMaxDuration(insulinEvent))\n - triangleSize;\n const extendedY = yScale(extendedVal) + (extendedLineThickness / 2);\n\n if (extendedVal > 0) {\n paths.push({\n d: `\n M ${bolusCenter},${extendedY + extendedLineThickness / 2}\n L ${bolusCenter},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY + extendedLineThickness / 2} Z\n `,\n key: `extendedPath-${bolus.id}`,\n type: 'extendedPath',\n });\n }\n\n const interruptedExtended = bolusUtils.isInterruptedBolus(insulinEvent) && extendedVal > 0;\n\n if (interruptedExtended) {\n const startOfInterrupted = xScale(bolus.normalTime + bolusUtils.getDuration(insulinEvent));\n\n paths.push({\n d: `\n M ${startOfInterrupted},${extendedY + extendedLineThickness / 2}\n L ${startOfInterrupted},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY - extendedLineThickness / 2}\n L ${startOfTriangle + extendedLineThickness},${extendedY + extendedLineThickness / 2} Z\n `,\n key: `extendedExpectationPath-${bolus.id}`,\n type: 'extendedExpectationPath',\n });\n\n const halfInterrupted = interruptedLineThickness / 2;\n\n paths.push({\n d: `\n M ${startOfInterrupted},${extendedY - halfInterrupted}\n L ${startOfInterrupted - interruptedLineThickness * 2},${extendedY - halfInterrupted}\n L ${startOfInterrupted - interruptedLineThickness * 2},${extendedY + halfInterrupted}\n L ${startOfInterrupted},${extendedY + halfInterrupted} Z\n `,\n key: `extendedInterrupted-${bolus.id}`,\n type: 'extendedInterrupted',\n });\n }\n\n if (extendedVal > 0) {\n paths.push({\n d: `\n M ${startOfTriangle + triangleSize},${extendedY - halfTriangle}\n L ${startOfTriangle + triangleSize},${extendedY + halfTriangle}\n L ${startOfTriangle},${extendedY} Z\n `,\n key: `extendedTriangle-${bolus.id}`,\n type: `extendedTriangle${interruptedExtended ? 'Interrupted' : ''}`,\n });\n }\n }\n\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: underride\n // it does the triangle for an underride of a calculator recommendation\n if (isNonTrivialUnderride) {\n const programmedY = yScale(bolusUtils.getProgrammed(insulinEvent));\n const edges = getBolusEdges(\n bolusWidth, bolusCenter, bolusBottom, programmedY,\n );\n const { left, right } = edges;\n\n paths.push({\n d: `\n M ${left},${programmedY}\n L ${left + bolusWidth / 2},${programmedY + triangleHeight}\n L ${right},${programmedY} Z\n `,\n key: `underrideTriangle-${insulinEvent.id}`,\n type: 'underrideTriangle',\n });\n }\n\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: override\n // it does the triangle for an override of a calculator recommendation\n if (isNonTrivialOverride) {\n const recommendedY = yScale(bolusUtils.getRecommended(insulinEvent));\n const edges = getBolusEdges(\n bolusWidth, bolusCenter, bolusBottom, recommendedY,\n );\n const { left, right } = edges;\n\n paths.push({\n d: `\n M ${left},${recommendedY}\n L ${left + bolusWidth / 2},${recommendedY - triangleHeight}\n L ${right},${recommendedY} Z\n `,\n key: `overrideTriangle-${insulinEvent.id}`,\n type: 'overrideTriangle',\n });\n }\n\n // the red line indicating interruption/cancellation/suspension appears on top\n // this is a (partial) port of tideline's js/plot/util/drawbolus.js: suspended\n if (bolusUtils.isInterruptedBolus(insulinEvent)) {\n const bottomOfInterruptedLine = yScale(bolusUtils.getDelivered(insulinEvent));\n const path = formatBolusRectPath(\n getBolusEdges(\n bolusWidth,\n bolusCenter,\n bottomOfInterruptedLine,\n bottomOfInterruptedLine + interruptedLineThickness,\n )\n );\n\n paths.push({\n d: path,\n key: `interrupted-${bolus.id}`,\n type: 'interrupted',\n });\n }\n\n const formattedPaths = _.forEach(paths, (path) => {\n const pathCopy = path;\n pathCopy.d = path.d.replace(/\\n/g, '').replace(/\\s\\s+/g, ' ');\n return pathCopy;\n });\n\n return formattedPaths;\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 moment from 'moment-timezone';\nimport { extent } from 'd3-array';\n\nimport { getBasalSequences } from '../../utils/basal';\n\n/**\n * processBgRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @returns {Array} the extent of bg range values\n */\nexport function processBgRange(dataByDate) {\n const bgs = _.reduce(\n dataByDate,\n (all, date) => (\n all.concat(_.get(date, 'cbg', [])).concat(_.get(date, 'smbg', []))\n ),\n []\n );\n return extent(bgs, (d) => (d.value));\n}\n\n/**\n * processBolusRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @param {String} timezoneName - a timezone name\n * @returns {Array} the extent of bolus range values\n */\nexport function processBolusRange(dataByDate, timezoneName) {\n const boluses = _.reduce(\n dataByDate, (all, date) => (all.concat(_.get(date, 'bolus', []))), []\n );\n _.each(boluses, (bolus) => {\n // eslint-disable-next-line no-param-reassign\n bolus.threeHrBin = Math.floor(moment.utc(bolus.normalTime).tz(timezoneName).hours() / 3) * 3;\n });\n return extent(boluses, (d) => ((d.normal || 0) + (d.extended || 0)));\n}\n\n/**\n * processBasalRange\n * @param {Object} dataByDate - Arrays of Tidepool datums keyed by type and grouped by date\n * @returns {Array} the extent of basal range values\n */\nexport function processBasalRange(dataByDate) {\n const basals = _.reduce(\n dataByDate, (all, date) => (all.concat(_.get(date, 'basal', []))), []\n );\n const rawBasalRange = extent(\n basals,\n (d) => (_.max([_.get(d, ['suppressed', 'rate'], 0), d.rate]))\n );\n // multiply the max rate by 1.1 to add a little buffer so the highest basals\n // don't sit at the very top of the basal rendering area and bump into boluses\n return [0, rawBasalRange[1] * 1.1];\n}\n\n/**\n * processBasalSequencesByDate\n * @param {Object} dateData - Object containing arrays of Tidepool datums keyed by type\n * @param {Array} bounds - start and end bounds of date, as integer timestamps\n */\nexport function processBasalSequencesForDate(dateData, bounds) {\n const { basal: basals = [] } = dateData;\n\n for (let i = 0; i < basals.length; ++i) {\n const basal = basals[i];\n\n // trim the first and last basals to fit within the date's bounds\n if (i === 0 && basal.normalTime < bounds[0] && basal.normalEnd > bounds[0]) {\n basal.duration = basal.duration - (bounds[0] - basal.normalTime);\n basal.normalTime = bounds[0];\n }\n\n if (i === basals.length - 1) {\n basal.duration = _.min([bounds[1] - basal.normalTime, basal.duration]);\n }\n\n let nextBasal;\n if (i !== basals.length - 1) {\n nextBasal = basals[i + 1];\n if ((basal.normalTime + basal.duration) !== nextBasal.normalTime) {\n basal.discontinuousEnd = true;\n nextBasal.discontinuousStart = true;\n }\n }\n }\n // eslint-disable-next-line no-param-reassign\n dateData.basalSequences = getBasalSequences(basals);\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport { range } from 'd3-array';\nimport { scaleLinear } from 'd3-scale';\nimport moment from 'moment';\n\nimport PrintView from './PrintView';\nimport { formatBgValue } from '../../utils/format';\nimport { classifyBgValue, getOutOfRangeThreshold } from '../../utils/bloodglucose';\nimport { formatClocktimeFromMsPer24, THREE_HRS } from '../../utils/datetime';\nimport { MS_IN_HOUR } from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\n\nclass BgLogPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.smbgRadius = 3;\n\n this.numDays = this.endpoints.activeDays;\n this.doc.addPage();\n\n const dates = _.keys(this.aggregationsByDate.dataByDate).sort();\n this.chartDates = dates.reverse();\n\n // Auto-bind callback methods\n this.getBGLabelYOffset = this.getBGLabelYOffset.bind(this);\n this.getBgChartColumns = this.getBgChartColumns.bind(this);\n this.getBgChartRow = this.getBgChartRow.bind(this);\n this.renderBgCell = this.renderBgCell.bind(this);\n }\n\n newPage() {\n super.newPage(this.getDateRange(this.endpoints.range[0], this.endpoints.range[1] - 1, undefined, t('Date range: ')));\n }\n\n getBGLabelYOffset() {\n return _.get(this.bgChart, 'datumsRendered', 0) % 2 === 0 ? -12 : 5;\n }\n\n getBgChartColumns(opts = {}) {\n return _.map(this.bgChart.headers, ({ id, text }, index) => ({\n cache: false,\n border: index === 0 || opts.border === false ? '' : 'TBLR',\n header: text,\n headerBorder: index === 0 || opts.headerBorder === false ? '' : 'BL',\n headerFill: index === 0 || opts.headerFill === false ? false : {\n color: this.colors.smbgHeader,\n opacity: 1,\n },\n headerPadding: [6, 2, 2, 2],\n height: this.doc.fontSize(this.defaultFontSize).currentLineHeight(),\n id,\n padding: [12, 2, 8, 2],\n renderer: this.renderBgCell,\n width: this.bgChart.columnWidth,\n }));\n }\n\n getBgChartRow(date) {\n const data = _.get(this.aggregationsByDate, `dataByDate.${date}`);\n const dateMoment = moment(date);\n const isWeekend = _.includes(['0', '6'], dateMoment.format('d'));\n const timeSlots = _.filter(_.map(_.sortBy(this.bgChart.columns, 'id'), 'id'), _.isNumber);\n\n const smbgByTimeSlot = _.groupBy(\n data.smbg,\n datum => _.findLast(timeSlots, slot => datum.msPer24 >= slot)\n );\n\n const row = {};\n\n _.each(this.bgChart.columns, ({ id }) => {\n if (id === 'date') {\n row[id] = {\n text: dateMoment.format('ddd, MMM D'),\n };\n } else {\n row[id] = {\n smbg: _.get(smbgByTimeSlot, id, []),\n };\n }\n });\n\n row._fill = { // eslint-disable-line no-underscore-dangle\n color: isWeekend ? this.tableSettings.colors.zebraEven : 'white',\n opacity: 1,\n };\n\n return row;\n }\n\n render() {\n this.renderBGChart();\n this.renderSummaryTable();\n }\n\n renderBGChart() {\n this.resetText();\n\n this.bgChart = {\n datumsRendered: 0,\n };\n\n this.bgChart.headers = _.map(\n range(0, 8),\n i => ({\n id: i * THREE_HRS,\n text: formatClocktimeFromMsPer24(i * THREE_HRS, 'h a'),\n }),\n );\n\n this.bgChart.headers.unshift({\n id: 'date',\n text: '',\n });\n\n this.bgChart.columnWidth = this.chartArea.width / this.bgChart.headers.length;\n\n this.bgChart.columns = this.getBgChartColumns();\n\n this.bgChart.rows = _.map(this.chartDates, this.getBgChartRow);\n\n this.bgChart.pos = {\n x: this.doc.x,\n y: this.doc.y,\n currentPageIndex: this.currentPageIndex,\n };\n\n // First, we render the table, but don't render the data, to get the cell backgrounds filled\n this.renderTable(this.bgChart.columns, this.bgChart.rows, {\n bottomMargin: 20,\n columnDefaults: {\n fill: true,\n skipDraw: true,\n },\n });\n\n // Reposition to the original bgChart rendering postion, and render over top with the data\n this.goToPage(this.bgChart.pos.currentPageIndex);\n\n this.doc.x = this.bgChart.pos.x;\n this.doc.y = this.bgChart.pos.y;\n\n this.renderTable(this.getBgChartColumns({\n headerFill: false,\n border: false,\n }), this.bgChart.rows, {\n bottomMargin: 20,\n columnDefaults: {\n fill: false,\n },\n });\n }\n\n renderSummaryTable() {\n this.resetText();\n\n const { total, days, averageGlucose } = _.get(this.stats, 'averageGlucose.data.raw', {});\n\n const totalDays = Math.ceil(days || this.numDays || 0);\n const totalReadings = total || 0;\n const avgReadingsPerDay = Math.round(totalReadings / totalDays);\n\n const averageGlucoseText = averageGlucose\n ? formatBgValue(averageGlucose, this.bgPrefs)\n : '--';\n\n this.summaryTable = {};\n\n if (this.chartArea.bottomEdge - this.doc.y < 45) {\n this.doc.addPage();\n }\n\n this.doc.x = this.leftEdge + this.bgChart.columnWidth;\n\n this.summaryTable.columnWidth = (this.chartArea.width - this.bgChart.columnWidth) / 4;\n\n this.summaryTable.columns = [\n {\n id: 'totalDays',\n header: t('Days In Report'),\n },\n {\n id: 'totalReadings',\n header: t('Total BG Readings'),\n },\n {\n id: 'avgReadingsPerDay',\n header: t('Avg. BG Readings / Day'),\n },\n {\n id: 'avgBg',\n header: t('Avg. BG ({{- units}})', { units: this.bgUnits }),\n },\n ];\n\n this.summaryTable.rows = [\n {\n totalDays: totalDays.toString(),\n totalReadings: totalReadings.toString(),\n avgReadingsPerDay: (avgReadingsPerDay || 0).toString(),\n avgBg: averageGlucoseText,\n },\n ];\n\n this.renderTable(this.summaryTable.columns, this.summaryTable.rows, {\n bottomMargin: 0,\n columnDefaults: {\n align: 'center',\n headerAlign: 'center',\n headerFill: {\n color: this.colors.smbgHeader,\n opacity: 1,\n },\n width: this.summaryTable.columnWidth,\n },\n });\n }\n\n renderBgCell(tb, data, draw, column, pos, padding) {\n if (draw && !column.skipDraw) {\n const {\n id,\n height,\n width,\n } = column;\n\n const {\n text,\n smbg = [],\n } = data[id];\n\n if (text) {\n const xPos = pos.x + padding.left;\n const yPos = pos.y + padding.top;\n\n this.setFill('black', 1);\n\n this.doc\n .fontSize(this.defaultFontSize)\n .text(text, xPos, yPos, {\n align: 'right',\n width: width - padding.left - padding.right,\n });\n } else if (smbg.length) {\n _.each(smbg, datum => {\n const xScale = scaleLinear()\n .domain([id, id + (MS_IN_HOUR * 3)])\n .range([pos.x, pos.x + width]);\n\n const xPos = xScale(datum.msPer24);\n const yPos = pos.y + padding.top + (height / 2);\n\n this.doc\n .circle(xPos, yPos, this.smbgRadius)\n .fill(this.colors[classifyBgValue(this.bgBounds, datum.value, 'fiveWay')]);\n\n const smbgLabel = formatBgValue(datum.value, this.bgPrefs, getOutOfRangeThreshold(datum));\n const labelWidth = this.doc.widthOfString(smbgLabel);\n const labelOffsetX = labelWidth / 2;\n const labelOffsetY = this.getBGLabelYOffset();\n\n let labelStartX = xPos - labelOffsetX;\n const labelEndX = labelStartX + labelWidth;\n\n\n // Ensure label is printed within chart area for the x-axis\n const chartLeftEdge = this.leftEdge + width;\n\n if (labelStartX - 1 <= chartLeftEdge) {\n labelStartX = labelStartX + (chartLeftEdge - (labelStartX - 1)) + 1;\n }\n\n if (labelEndX + 1 >= this.rightEdge) {\n labelStartX = labelStartX - ((labelEndX + 1) - this.rightEdge) - 1;\n }\n\n this.doc.fontSize(this.smallFontSize);\n\n this.doc\n .rect(\n labelStartX - 1,\n yPos + labelOffsetY - 1,\n labelWidth + 2,\n this.doc.currentLineHeight())\n .fill('white');\n\n this.doc\n .fontSize(this.smallFontSize)\n .fillColor('black')\n .text(\n smbgLabel,\n labelStartX,\n yPos + labelOffsetY, {\n lineBreak: false,\n width: labelWidth,\n align: 'center',\n },\n );\n\n this.bgChart.datumsRendered++;\n });\n }\n\n this.resetText();\n }\n\n return ' ';\n }\n}\n\nexport default BgLogPrintView;\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 i18next from 'i18next';\n\nimport PrintView from './PrintView';\n\nimport {\n deviceName,\n getDeviceMeta,\n insulinSettings,\n startTimeAndValue,\n} from '../../utils/settings/data';\n\nimport {\n basal,\n bolusTitle,\n ratio,\n sensitivity,\n target,\n} from '../../utils/settings/nonTandemData';\n\nimport { getPumpVocabulary } from '../../utils/device';\n\nimport {\n basalSchedules as profileSchedules,\n basal as tandemBasal,\n} from '../../utils/settings/tandemData';\n\nconst t = i18next.t.bind(i18next);\n\nclass SettingsPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n\n this.isTandem = this.manufacturer === 'tandem';\n this.deviceMeta = getDeviceMeta(this.latestPumpUpload.settings, this.timePrefs);\n this.deviceLabels = getPumpVocabulary(this.manufacturer);\n\n this.doc.addPage();\n }\n\n newPage() {\n super.newPage(t('Uploaded on: {{uploadDate}}', { uploadDate: this.deviceMeta.uploaded }));\n }\n\n render() {\n this.renderDeviceMeta();\n\n if (this.isTandem) {\n this.renderTandemProfiles();\n } else {\n if (this.manufacturer !== 'animas') this.renderPumpSettings();\n this.renderBasalSchedules();\n this.renderWizardSettings();\n }\n }\n\n renderDeviceMeta() {\n const device = deviceName(this.manufacturer) || t('Unknown');\n this.doc\n .font(this.boldFont)\n .fontSize(this.defaultFontSize)\n .text(device, { continued: true })\n .font(this.font)\n .text(' › ' + t('Serial Number: {{serial}}', { serial: this.deviceMeta.serial })) // eslint-disable-line prefer-template\n .moveDown();\n\n this.resetText();\n this.doc.moveDown();\n }\n\n renderTandemProfiles() {\n this.renderSectionHeading(t('Profile Settings'));\n\n const basalSchedules = profileSchedules(this.latestPumpUpload.settings);\n\n const sortedSchedules = _.orderBy(basalSchedules,\n [\n schedule => (schedule.name === this.latestPumpUpload.settings.activeSchedule ? 1 : 0),\n 'position',\n ],\n ['desc', 'asc']\n );\n\n _.each(sortedSchedules, schedule => {\n const profile = tandemBasal(schedule, this.latestPumpUpload.settings, this.bgUnits);\n\n const heading = {\n text: profile.title.main,\n subText: ` ${profile.title.secondary}`,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.tableSettings.colors.zebraHeader,\n opacity: 1,\n },\n width: this.chartArea.width,\n },\n });\n\n const widths = {\n rate: 105,\n bgTarget: 105,\n carbRatio: 105,\n insulinSensitivity: 155,\n };\n\n const firstColumnWidth = this.chartArea.width - _.sum(_.values(widths));\n\n const tableColumns = _.map(profile.columns, (column, index) => {\n const isFirst = index === 0;\n\n const fills = {\n grey: {\n color: this.tableSettings.colors.zebraHeader,\n opacity: 1,\n },\n basal: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n };\n\n const headerFills = {\n start: fills.grey,\n rate: fills.basal,\n bgTarget: fills.basal,\n carbRatio: fills.basal,\n insulinSensitivity: fills.basal,\n };\n\n const label = _.isPlainObject(column.label)\n ? {\n text: column.label.main,\n subText: ` ${column.label.secondary}`,\n } : {\n text: column.label,\n };\n\n const columnDef = {\n id: column.key,\n header: label,\n align: isFirst ? 'left' : 'center',\n headerFill: headerFills[column.key],\n cache: false,\n headerRenderer: this.renderCustomTextCell,\n };\n\n if (!isFirst) {\n columnDef.width = widths[column.key];\n\n if (columnDef.id === 'rate') {\n columnDef.renderer = this.renderCustomTextCell;\n }\n } else {\n columnDef.cache = false;\n columnDef.renderer = this.renderCustomTextCell;\n }\n\n return columnDef;\n });\n\n const rows = _.map(profile.rows, (row, index) => {\n const isLast = index === profile.rows.length - 1;\n\n if (isLast) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n row._bold = true;\n }\n\n return row;\n });\n\n this.renderTable(tableColumns, rows, {\n bottomMargin: 0,\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n flexColumn: 'start',\n });\n\n this.setLayoutColumns({\n width: firstColumnWidth + widths.rate,\n count: 1,\n });\n\n this.renderInsulinSettings(this.latestPumpUpload.settings, schedule.name);\n this.doc.moveDown();\n });\n }\n\n renderPumpSettings() {\n this.renderSectionHeading(t('Pump Settings'));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n this.renderInsulinSettings(this.latestPumpUpload.settings);\n this.doc.moveDown();\n }\n\n renderInsulinSettings(settings, scheduleName) {\n const columnWidth = this.getActiveColumnWidth();\n const valueWidth = 50;\n const { rows: tableRows, columns } = insulinSettings(settings, this.manufacturer, scheduleName);\n\n const tableColumns = _.map(columns, (column, index) => ({\n id: column.key,\n align: index === 0 ? 'left' : 'right',\n width: index === 0 ? columnWidth - valueWidth : valueWidth,\n }));\n\n const heading = {\n text: t('Insulin Settings'),\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n fontSize: scheduleName ? this.defaultFontSize : this.largeFontSize,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n this.renderTable(tableColumns, tableRows, {\n bottomMargin: 15,\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n showHeaders: false,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n this.resetText();\n }\n\n renderBasalSchedules() {\n this.renderSectionHeading(t('Basal Rates'));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n const {\n activeSchedule,\n basalSchedules,\n lastManualBasalSchedule,\n } = this.latestPumpUpload.settings;\n\n const columnWidth = this.getActiveColumnWidth();\n\n const tableColumns = _.map(startTimeAndValue('rate'), (column, index) => {\n const isValue = index === 1;\n const valueWidth = 50;\n\n return {\n id: column.key,\n header: column.label,\n align: isValue ? 'right' : 'left',\n width: isValue ? valueWidth : columnWidth - valueWidth,\n };\n });\n\n // We only show automated basal schedules if active at upload\n const schedules = _.reject(\n _.map(\n basalSchedules,\n (schedule, index) => basal(index, this.latestPumpUpload.settings, this.manufacturer)\n ),\n schedule => (schedule.isAutomated && schedule.scheduleName !== activeSchedule)\n );\n\n const sortedSchedules = _.orderBy(\n schedules,\n [\n schedule => (schedule.isAutomated ? 1 : 0),\n schedule => (schedule.scheduleName === lastManualBasalSchedule ? 1 : 0),\n schedule => (schedule.scheduleName === activeSchedule ? 1 : 0),\n schedule => schedule.rows.length,\n 'name',\n ],\n ['desc', 'desc', 'desc', 'desc', 'asc']\n );\n\n const automatedScheduleShowing = _.some(sortedSchedules, { isAutomated: true });\n\n _.each(sortedSchedules, (schedule, index) => {\n const columnIndex = automatedScheduleShowing && index > 0 ? index - 1 : index;\n const activeColumn = columnIndex < this.layoutColumns.count\n ? columnIndex % this.layoutColumns.count\n : this.getShortestLayoutColumn();\n\n this.goToLayoutColumnPosition(activeColumn);\n\n const scheduleLabel = _.get(schedule, 'title', {});\n\n const heading = {\n text: scheduleLabel.main,\n subText: schedule.isAutomated ? ` ${scheduleLabel.secondary.toLowerCase()}` : ` ${scheduleLabel.units}`,\n note: schedule.isAutomated ? null : scheduleLabel.secondary,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: schedule.isAutomated ? this.colors.basalAutomated : this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n bottomMargin: schedule.isAutomated ? 15 : 0,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n if (!schedule.isAutomated) {\n const rows = _.map(schedule.rows, (row, rowIndex) => {\n const isLast = rowIndex === schedule.rows.length - 1;\n\n if (isLast) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n row._bold = true;\n }\n\n return row;\n });\n\n this.renderTable(tableColumns, rows, {\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n bottomMargin: 15,\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n });\n\n this.resetText();\n }\n\n renderWizardSettings() {\n this.doc.x = this.chartArea.leftEdge;\n this.doc.y = _.get(this.layoutColumns, ['columns', this.getLongestLayoutColumn(), 'y']);\n this.doc.moveDown();\n\n this.renderSectionHeading(bolusTitle(this.manufacturer));\n\n this.setLayoutColumns({\n width: this.chartArea.width,\n count: 3,\n gutter: 15,\n });\n\n this.renderSensitivity();\n\n this.renderTarget();\n\n this.renderRatio();\n\n this.resetText();\n }\n\n renderWizardSetting(settings, units = '') {\n this.goToLayoutColumnPosition(this.getShortestLayoutColumn());\n\n const columnWidth = this.getActiveColumnWidth();\n\n const tableColumns = _.map(settings.columns, (column, index) => {\n const isValue = index > 0;\n const valueWidth = 50;\n\n return {\n id: column.key,\n header: column.label,\n align: isValue ? 'right' : 'left',\n width: isValue ? valueWidth : columnWidth - (valueWidth * (settings.columns.length - 1)),\n };\n });\n\n const heading = {\n text: settings.title,\n subText: ` ${units}`,\n };\n\n this.renderTableHeading(heading, {\n columnDefaults: {\n fill: {\n color: this.colors.basal,\n opacity: 0.15,\n },\n width: columnWidth,\n },\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n\n this.renderTable(tableColumns, settings.rows, {\n columnDefaults: {\n zebra: true,\n headerFill: true,\n },\n });\n\n this.updateLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n\n renderSensitivity() {\n const units = `${this.bgUnits}/U`;\n this.renderWizardSetting(\n sensitivity(this.latestPumpUpload.settings, this.manufacturer, this.bgUnits),\n units\n );\n }\n\n renderTarget() {\n const units = this.bgUnits;\n this.renderWizardSetting(\n target(this.latestPumpUpload.settings, this.manufacturer),\n units\n );\n }\n\n renderRatio() {\n const units = _.get(this, 'latestPumpUpload.settings.units.carb') === 'exchanges' ? 'U/exch' : 'g/U';\n this.renderWizardSetting(\n ratio(this.latestPumpUpload.settings, this.manufacturer),\n units\n );\n }\n}\n\nexport default SettingsPrintView;\n","/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport moment from 'moment-timezone';\n\nimport PrintView from './PrintView';\n\nimport {\n AGP_FOOTER_Y_PADDING,\n AGP_SECTION_BORDER_RADIUS,\n AGP_SECTION_DESCRIPTION_HEIGHT,\n AGP_SECTION_HEADER_HEIGHT,\n colors,\n fontSizes,\n text,\n} from './utils/AGPConstants';\n\nimport {\n generateChartSections,\n} from './utils/AGPUtils';\n\nimport { MGDL_UNITS, MS_IN_MIN } from '../../utils/constants';\nimport { getPatientFullName } from '../../utils/misc';\nimport { bankersRound } from '../../utils/format';\nimport { formatBirthdate, getOffset } from '../../utils/datetime';\nimport { formatDatum } from '../../utils/stat';\n\nconst agpLogo = require('./images/capturAGP-logo.png');\nconst tidepoolLogo = require('./images/tidepool-logo-408x46.png');\nconst t = i18next.t.bind(i18next);\n\nclass AGPPrintView extends PrintView {\n constructor(doc, data, opts) {\n super(doc, data, opts);\n this.sections = generateChartSections(data);\n this.doc.addPage();\n this.svgDataURLS = opts.svgDataURLS;\n }\n\n newPage() {\n super.newPage();\n }\n\n async render() {\n // this.renderGuides(); // Uncomment to render section borders for debugging\n this.renderReportInfo();\n\n if (\n !this.sections.ambulatoryGlucoseProfile.sufficientData &&\n !this.sections.dailyGlucoseProfiles.sufficientData &&\n !this.sections.glucoseMetrics.sufficientData &&\n !this.sections.timeInRanges.sufficientData\n ) {\n // If no sections have sufficient data we don't render any of them\n this.renderInsufficientData();\n } else {\n // If at least one section has sufficient data we render all of them, and show any unmet\n // data sufficiency text within the sections themselves\n this.renderGlucoseMetrics();\n await this.renderTimeInRanges();\n await this.renderAmbulatoryGlucoseProfile();\n await this.renderDailyGlucoseProfiles();\n }\n }\n\n renderHeader() {\n this.doc.font(this.boldFont).fontSize(fontSizes.reportHeader);\n const xPos = this.leftEdge;\n const yPos = this.topEdge;\n\n this.doc\n .fillColor(colors.text.reportHeader)\n .fillOpacity(1)\n .text(`${text.reportHeader} `, xPos, yPos, { continued: true })\n .font(this.font)\n .text(text.reportSubHeader);\n\n return this;\n }\n\n renderFooter() {\n this.doc.font(this.font).fontSize(fontSizes.reportFooter);\n const xPos = this.leftEdge;\n const yPos = this.bottomEdge - this.doc.currentLineHeight() * 1.25 - AGP_FOOTER_Y_PADDING;\n\n this.doc\n .fillColor(colors.text.reportFooter)\n .fillOpacity(1)\n .text(text.reportFooter, xPos, yPos);\n\n this.agpLogoWidth = 70;\n this.tidepoolLogoWidth = 65;\n const logoX = this.doc.page.width - this.agpLogoWidth - this.margins.right;\n const logoY = this.bottomEdge - this.agpLogoWidth * 0.175 - AGP_FOOTER_Y_PADDING;\n\n // Render AGP Logo\n this.doc.image(agpLogo, logoX, logoY, { width: this.agpLogoWidth });\n\n // Render Tidepool Logo\n this.doc.image(tidepoolLogo, logoX - (this.agpLogoWidth + 10), logoY + 2, { width: this.tidepoolLogoWidth });\n this.setStroke(colors.mediumGrey);\n\n this.doc\n .moveTo(logoX - 8, logoY)\n .lineTo(logoX - 8, logoY + 11)\n .stroke();\n\n super.renderFooter();\n\n return this;\n }\n\n renderGuides() {\n // page margins\n this.doc.lineWidth(1)\n .dash(3, { space: 4 })\n .rect(this.margins.left, this.margins.top, this.width, this.height)\n .stroke('#EEEEEE');\n\n _.each(_.values(this.sections), section => {\n this.doc.lineWidth(1)\n .rect(section.x, section.y, section.width, section.height)\n .stroke('#EEEEEE');\n });\n\n this.doc.undash();\n }\n\n renderInsufficientData() {\n this.resetText();\n const yPos = this.topEdge + (this.dpi * 0.3);\n const xPos = this.leftEdge;\n\n this.doc\n .fontSize(fontSizes.reportInfo.default)\n .text(text.reportInsuffienctData, xPos, yPos);\n }\n\n renderSectionContainer(section) {\n this.resetText();\n\n if (section.bordered) {\n // Draw section container\n this.doc\n .roundedRect(section.x, section.y, section.width, section.height, AGP_SECTION_BORDER_RADIUS)\n .fill(colors.background.shaded);\n this.doc\n .rect(section.x + 1, section.y + 1 + AGP_SECTION_HEADER_HEIGHT, section.width - 2, AGP_SECTION_BORDER_RADIUS)\n .fill(colors.white);\n this.doc\n .roundedRect(section.x + 1, section.y + 1 + AGP_SECTION_HEADER_HEIGHT, section.width - 2, section.height - 2 - AGP_SECTION_HEADER_HEIGHT, AGP_SECTION_BORDER_RADIUS - 1)\n .fill(colors.white);\n }\n\n // Add section titles, subtitles, and descriptions\n if (section.text?.title) {\n const titlePaddingX = 8;\n const titleXPos = section.x + titlePaddingX;\n const titleYPos = section.y + 1 + ((AGP_SECTION_HEADER_HEIGHT - this.doc.currentLineHeight()) / 2);\n this.setFill(colors.text.section.title);\n\n this.doc.font(this.boldFont)\n .fontSize(fontSizes.section.title);\n\n this.doc.text(section.text.title, titleXPos, titleYPos);\n\n if (section.text?.subtitle) {\n const subtitleXPos = titleXPos + this.doc.widthOfString(section.text.title) + (this.dpi * 0.4);\n\n this.setFill(colors.text.section.subtitle);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.subtitle);\n\n this.doc.text(section.text.subtitle, subtitleXPos, section.y + 1 + ((AGP_SECTION_HEADER_HEIGHT - this.doc.currentLineHeight()) / 2));\n }\n }\n\n if (!section.sufficientData && section.text?.insufficientData) {\n const insufficientDataPaddingX = 14;\n const insufficientDataPaddingY = 8;\n const insufficientDataXPos = section.x + insufficientDataPaddingX;\n const insufficientDataYPos = section.y + AGP_SECTION_HEADER_HEIGHT + insufficientDataPaddingY;\n\n this.setFill(colors.text.section.insufficientData);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.insufficientData);\n\n this.doc.text(section.text.insufficientData, insufficientDataXPos, insufficientDataYPos);\n } else if (section.text?.description) {\n const descriptionPaddingX = 14;\n const descriptionPaddingY = 8;\n const descriptionXPos = section.x + descriptionPaddingX;\n const descriptionYPos = section.y + AGP_SECTION_HEADER_HEIGHT + descriptionPaddingY;\n\n this.setFill(colors.text.section.description);\n\n this.doc.font(this.font)\n .fontSize(fontSizes.section.description);\n\n this.doc.text(section.text.description, descriptionXPos, descriptionYPos);\n }\n }\n\n renderReportInfo() {\n const section = this.sections.reportInfo;\n this.renderSectionContainer(section);\n\n const patientName = _.truncate(getPatientFullName(this.patient), { length: 32 });\n const patientBirthdate = formatBirthdate(this.patient);\n let patientMRN = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const { cgmDaysWorn = 0, oldestDatum, newestDatum, sensorUsageAGP } = this.stats.sensorUsage?.data?.raw || {};\n\n let cgmDaysWornText = cgmDaysWorn === 1\n ? t('{{cgmDaysWorn}} Day', { cgmDaysWorn })\n : t('{{cgmDaysWorn}} Days', { cgmDaysWorn });\n\n if (cgmDaysWorn >= 1) {\n cgmDaysWornText += `: ${cgmDaysWorn === 1\n ? moment.utc(newestDatum?.time - getOffset(newestDatum?.time, this.timezone) * MS_IN_MIN).format('MMMM D, YYYY')\n : this.getDateRange(oldestDatum?.time, newestDatum?.time, undefined, '', 'MMMM')\n }`;\n }\n\n const renderInfoRow = (mainText, subTextLabel, subText, underline = true) => {\n const x = this.doc.x;\n const y = this.doc.y;\n let subTextWidth = 0;\n\n if (subText) {\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.reportInfo.default);\n\n subTextWidth = this.doc.widthOfString(subText);\n\n this.doc.text(subText, x, y, {\n align: 'right',\n width: section.width,\n });\n\n if (subTextLabel) {\n this.doc\n .font(this.font)\n .fontSize(fontSizes.reportInfo.label);\n\n this.doc.text(subTextLabel, x, y + 1, {\n align: 'right',\n width: section.width - subTextWidth - this.dpi * 0.025,\n });\n }\n }\n\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.reportInfo.default)\n .text(mainText, x, y);\n\n if (underline) {\n const lineYPos = y + this.doc.currentLineHeight() + this.dpi * 0.025;\n\n this.doc\n .moveTo(section.x, lineYPos)\n .lineWidth(0.25)\n .lineTo(section.x + section.width, lineYPos)\n .strokeColor(colors.line.default)\n .stroke();\n }\n\n this.doc.x = x;\n };\n\n this.doc.x = section.x;\n\n if (patientMRN) {\n if (patientMRN.length > 15) {\n patientMRN = `${patientMRN.slice(0, 5)}\\u2026${patientMRN.slice(-7)}`;\n }\n\n this.doc.y = section.y + this.dpi * 0.05;\n this.doc.moveUp(1);\n renderInfoRow('', text.reportInfo.mrn, patientMRN, false);\n }\n\n this.doc.y = section.y + this.dpi * 0.05;\n renderInfoRow(patientName, text.reportInfo.dob, patientBirthdate);\n this.doc.moveDown(1);\n renderInfoRow(cgmDaysWornText);\n this.doc.moveDown(1);\n renderInfoRow(t('Time CGM Active: {{activeTime}}%', {\n activeTime: bankersRound(sensorUsageAGP, 1),\n }));\n }\n\n renderGlucoseMetrics() {\n const section = this.sections.glucoseMetrics;\n this.renderSectionContainer(section);\n\n const paddingX = this.dpi * 0.2;\n const xExtents = [section.x + paddingX, section.x + section.width - paddingX];\n\n const glucoseStats = [\n this.stats.averageGlucose,\n this.stats.glucoseManagementIndicator,\n this.stats.coefficientOfVariation,\n ];\n\n this.doc.x = section.x;\n this.doc.y = section.y + this.dpi * 0.375;\n\n _.each(glucoseStats, (stat, index) => {\n const paddingY = 8;\n const statWidth = xExtents[1] - xExtents[0];\n const y = this.doc.y;\n const isAverageGlucose = stat.id === 'averageGlucose';\n const isShaded = index % 2 !== 0;\n\n const { value, suffix } = formatDatum(\n _.get(stat.data, _.get(stat.data, 'dataPaths.summaryAGP', stat.data?.dataPaths?.summary)),\n _.get(stat, 'dataFormat.summary'),\n { bgPrefs: this.bgPrefs, data: stat.data, useAGPFormat: true }\n );\n\n const units = suffix || this.bgUnits;\n\n this.doc\n .font(this.boldFont)\n .fontSize(fontSizes.glucoseMetrics.labels)\n .lineGap(-1.5);\n\n if (isShaded) {\n this.doc\n .rect(section.x, y - paddingY, section.width, this.doc.currentLineHeight() * 2.25 + paddingY * 2)\n .fill(colors.background.shaded);\n }\n\n this.setFill();\n\n this.doc\n .text(text.glucoseMetrics[stat.id].label, xExtents[0], y);\n\n const valueYShift = (fontSizes.glucoseMetrics.values - fontSizes.glucoseMetrics.labels) / 2;\n const unitsFontSize = isAverageGlucose ? fontSizes.glucoseMetrics.bgUnits : fontSizes.glucoseMetrics.values;\n const unitsYShift = isAverageGlucose ? valueYShift - 2.15 : valueYShift;\n\n this.doc\n .fontSize(unitsFontSize)\n .text(`${units}`, xExtents[0], y - unitsYShift, { align: 'right', width: statWidth });\n\n const valueXShift = this.doc.widthOfString(units) + 1;\n\n this.doc\n .fontSize(fontSizes.glucoseMetrics.values)\n .text(`${value}`, xExtents[0], y - valueYShift, { align: 'right', width: statWidth - valueXShift });\n\n this.doc\n .font(this.font)\n .fontSize(fontSizes.glucoseMetrics.subLabels);\n\n const bgUnitsKey = this.bgUnits === MGDL_UNITS ? 'mgdl' : 'mmoll';\n const goal = isAverageGlucose\n ? text.glucoseMetrics[stat.id].goal[bgUnitsKey]\n : text.glucoseMetrics[stat.id].goal;\n\n this.setFill(colors.text.goals.glucoseMetrics);\n\n this.doc\n .lineGap(1.3)\n .text(goal);\n\n this.doc\n .fontSize(fontSizes.glucoseMetrics.subLabels);\n\n if (text.glucoseMetrics[stat.id].subLabel) this.doc.text(text.glucoseMetrics[stat.id].subLabel);\n this.doc.moveDown(1.25);\n });\n\n this.resetText();\n }\n\n async renderTimeInRanges() {\n const section = this.sections.timeInRanges;\n this.renderSectionContainer(section);\n\n // Set chart plot within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + this.dpi * 0.25;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - this.dpi * 0.25 - AGP_SECTION_BORDER_RADIUS;\n this.renderSVGImage(this.svgDataURLS?.timeInRanges, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\n }\n\n async renderAmbulatoryGlucoseProfile() {\n const section = this.sections.ambulatoryGlucoseProfile;\n this.renderSectionContainer(section);\n\n if (section.sufficientData) {\n // Set chart plot within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + this.dpi * 0.5;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - this.dpi * 0.5 - AGP_SECTION_BORDER_RADIUS;\n this.renderSVGImage(this.svgDataURLS?.ambulatoryGlucoseProfile, chartAreaX, chartAreaY, chartAreaWidth, chartAreaHeight);\n }\n }\n\n async renderDailyGlucoseProfiles() {\n const section = this.sections.dailyGlucoseProfiles;\n this.renderSectionContainer(section);\n\n // Set chart plots within section borders\n const chartAreaX = section.x + 1;\n const chartAreaY = section.y + 1 + AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT;\n const chartAreaWidth = section.width - 2;\n const chartAreaHeight = section.height - 2 - (AGP_SECTION_HEADER_HEIGHT + AGP_SECTION_DESCRIPTION_HEIGHT) - AGP_SECTION_BORDER_RADIUS;\n const plotHeight = chartAreaHeight / 2;\n this.renderSVGImage(this.svgDataURLS?.dailyGlucoseProfiles?.[0], chartAreaX, chartAreaY, chartAreaWidth, plotHeight);\n this.renderSVGImage(this.svgDataURLS?.dailyGlucoseProfiles?.[1], chartAreaX, chartAreaY + plotHeight, chartAreaWidth, plotHeight);\n }\n}\n\nexport default AGPPrintView;\n","module.exports = \"data:image/png;base64,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\"","module.exports = require(\"moment\");","module.exports = require(\"lodash\");","module.exports = require(\"d3-scale\");","import _ from 'lodash';\nimport table from 'text-table';\nimport i18next from 'i18next';\n\nimport {\n formatBirthdate,\n formatCurrentDate,\n formatDateRange,\n formatDiagnosisDate,\n getOffset,\n getTimezoneFromTimePrefs,\n} from '../datetime';\n\nimport { MS_IN_MIN } from '../constants';\n\nimport { getPatientFullName } from '../misc';\n\nconst t = i18next.t.bind(i18next);\n\nexport class TextUtil {\n constructor(patient, endpoints, timePrefs) {\n this.patient = patient;\n this.endpoints = endpoints;\n this.timePrefs = timePrefs;\n }\n\n buildDocumentHeader = (source) => {\n const fullname = this.buildTextLine(getPatientFullName(this.patient));\n const bday = this.buildTextLine({ label: t('Date of birth'), value: formatBirthdate(this.patient) });\n const diagnosis = formatDiagnosisDate(this.patient);\n const diagnosisText = diagnosis ? this.buildTextLine({ label: t('Date of diagnosis'), value: diagnosis }) : '';\n const mrn = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const mrnText = mrn ? this.buildTextLine({ label: t('MRN'), value: mrn }) : '';\n const exported = this.buildTextLine({ label: `${t('Exported from Tidepool')}${source ? ` ${source}` : ''}`, value: formatCurrentDate() });\n return `${fullname}${bday}${diagnosisText}${mrnText}${exported}`;\n };\n\n buildDocumentDates = () => {\n const timezone = getTimezoneFromTimePrefs(this.timePrefs);\n\n // endpoint is exclusive, so need to subtract a millisecond from formatted range end date\n let start = this.endpoints[0];\n let end = this.endpoints[1] - 1;\n\n start = start - getOffset(start, timezone) * MS_IN_MIN;\n end = end - getOffset(end, timezone) * MS_IN_MIN;\n\n return `\\nReporting Period: ${formatDateRange(start, end)}\\n`;\n }\n\n buildTextLine = (text = '') => (_.isPlainObject(text) ? `${text.label}: ${text.value}\\n` : `${text}\\n`);\n\n buildTextTable = (name, rows, columns, opts) => {\n const tableText = this.getTable(rows, columns, opts);\n if (name && tableText) return `\\n${name}\\n${tableText}\\n`;\n return name ? `\\n${name}\\n` : `\\n${tableText}\\n`;\n }\n\n getTable = (rows, columns, opts = {}) => {\n _.defaults(opts, {\n showHeader: true,\n });\n\n const header = [this.getTableHeader(columns)];\n const content = this.getTableRows(rows, columns);\n return opts.showHeader ? table(header.concat(content)) : table(content);\n };\n\n getTableHeader = columns => _.map(\n columns,\n column => (_.isPlainObject(column.label) ? `${column.label.main} ${column.label.secondary}` : column.label)\n );\n\n getTableRows = (rows, columns) => _.map(\n rows,\n row => this.getTableRow(columns, row)\n );\n\n getTableRow = (columns, rowData) => _.map(\n columns,\n column => rowData[column.key]\n );\n}\n\nexport default TextUtil;\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) {\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 wizard = insulinEvent;\n if (_.get(insulinEvent, 'type') === 'bolus') {\n wizard = getWizardFromInsulinEvent(insulinEvent);\n }\n // a simple manual/\"quick\" bolus won't have a `recommended` field\n if (!wizard.recommended) {\n return NaN;\n }\n const netRecommendation = _.get(wizard, ['recommended', 'net'], null);\n if (netRecommendation !== null) {\n return netRecommendation;\n }\n let rec = 0;\n rec += _.get(wizard, ['recommended', 'carb'], 0);\n rec += _.get(wizard, ['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 = Boolean(\n bolus.normal != null &&\n bolus.expectedNormal &&\n bolus.normal !== bolus.expectedNormal\n );\n\n const cancelledDuringExtended = Boolean(\n bolus.extended != null &&\n bolus.expectedExtended &&\n bolus.extended !== bolus.expectedExtended\n );\n\n if (_.inRange(bolus.normal, Infinity)) {\n if (!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 bolus programmed was larger than the calculated recommendation\n */\nexport function isOverride(insulinEvent) {\n return getRecommended(insulinEvent.wizard || insulinEvent) < getProgrammed(insulinEvent);\n}\n\n/**\n * isUnderride\n * @param {Object} insulinEvent - a Tidepool bolus or wizard object\n *\n * @return {Boolean} whether the bolus programmed was smaller than the calculated recommendation\n */\nexport function isUnderride(insulinEvent) {\n return getRecommended(insulinEvent.wizard || insulinEvent) > getProgrammed(insulinEvent);\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 = _.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 * 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) 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, formatDecimalNumber } 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(formatDecimalNumber(hours * rate, 3));\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 const start = new Date(endpoints[0]);\n const end = new Date(endpoints[1]);\n let dose = 0;\n\n _.each(data, (datum, index) => {\n let duration = datum.duration;\n if (index === 0) {\n // handle first segment, which may have started before the start endpoint\n duration = _.min([new Date(datum.normalEnd) - start, datum.duration]);\n } else if (index === data.length - 1) {\n // handle last segment, which may go past the end endpoint\n duration = _.min([end - new Date(datum.normalTime), datum.duration]);\n }\n\n dose += getSegmentDose(duration, 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 start = new Date(endpoints[0]);\n const end = new Date(endpoints[1]);\n\n const durations = {\n automated: 0,\n manual: 0,\n };\n\n _.each(data, (datum, index) => {\n let duration = datum.duration;\n if (index === 0) {\n // handle first segment, which may have started before the start endpoint\n duration = _.min([new Date(datum.normalEnd) - start, datum.duration]);\n } else if (index === data.length - 1) {\n // handle last segment, which may go past the end endpoint\n duration = _.min([end - new Date(datum.normalTime), datum.duration]);\n }\n durations[getBasalPathGroupType(datum)] += duration;\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","// DPI here is the coordinate system, not the resolution; sub-dot precision renders crisply!\nexport const DPI = 72;\nexport const MARGIN = DPI / 2;\nexport const HEIGHT = 11 * DPI - (2 * MARGIN);\nexport const WIDTH = 8.5 * DPI - (2 * MARGIN);\nexport const MARGINS = {\n left: MARGIN,\n top: MARGIN,\n right: MARGIN,\n bottom: MARGIN,\n};\nexport const DEFAULT_FONT_SIZE = 10;\nexport const LARGE_FONT_SIZE = 12;\nexport const FOOTER_FONT_SIZE = 8;\nexport const HEADER_FONT_SIZE = 14;\nexport const SMALL_FONT_SIZE = 8;\nexport const EXTRA_SMALL_FONT_SIZE = 6;\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 DEFAULT_BG_BOUNDS = {\n [MGDL_UNITS]: {\n veryLowThreshold: 54,\n targetLowerBound: 70,\n targetUpperBound: 180,\n veryHighThreshold: 250,\n clampThreshold: 600,\n },\n [MMOLL_UNITS]: {\n veryLowThreshold: 3.0,\n targetLowerBound: 3.9,\n targetUpperBound: 10.0,\n veryHighThreshold: 13.9,\n clampThreshold: 33.3,\n },\n};\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 AUTOMATED_DELIVERY = 'automatedDelivery';\nexport const AUTOMATED_SUSPEND = 'automatedSuspend';\nexport const SCHEDULED_DELIVERY = 'scheduledDelivery';\nexport const SETTINGS_OVERRIDE = 'settingsOverride';\nexport const SLEEP = 'sleep';\nexport const PHYSICAL_ACTIVITY = 'physicalActivity';\nexport const MAX_BOLUS = 'maxBolus';\nexport const MAX_BASAL = 'maxBasal';\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 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('Fill Cannula'),\n },\n [INSULET]: {\n [SITE_CHANGE_RESERVOIR]: t('Change Pod'),\n [SITE_CHANGE_TUBING]: t('Activate Pod'),\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('Prime Cannula'),\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('Prime Reservoir'),\n [SITE_CHANGE_CANNULA]: t('Prime Cannula'),\n },\n [TANDEM]: {\n [SITE_CHANGE_RESERVOIR]: t('Change Cartridge'),\n [SITE_CHANGE_TUBING]: t('Fill Tubing'),\n [SITE_CHANGE_CANNULA]: t('Fill Cannula'),\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 default: {\n [SITE_CHANGE_RESERVOIR]: t('Change Cartridge'),\n [SITE_CHANGE_TUBING]: t('Fill Tubing'),\n [SITE_CHANGE_CANNULA]: t('Fill Cannula'),\n [AUTOMATED_DELIVERY]: t('Automated'),\n [AUTOMATED_SUSPEND]: t('Automated Suspend'),\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 [MAX_BOLUS]: t('Max Bolus'),\n [MAX_BASAL]: t('Max Basal'),\n [INSULIN_DURATION]: t('Insulin Duration'),\n },\n};\n\nexport const AUTOMATED_BASAL_DEVICE_MODELS = {\n [MEDTRONIC]: ['1580', '1581', '1582', '1780', '1781', '1782'],\n};\n\nexport const BG_COLORS = {\n veryLow: '#FB5951',\n low: '#FF8B7C',\n target: '#76D3A6',\n high: '#BB9AE7',\n veryHigh: '#8C65D6',\n};\n","module.exports = require(\"d3-time-format\");","/*\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/* eslint-disable lodash/prefer-lodash-method */\n\nimport _ from 'lodash';\nimport PdfTable from 'voilab-pdf-table';\nimport PdfTableFitColumn from 'voilab-pdf-table/plugins/fitcolumn';\nimport i18next from 'i18next';\n\nimport SVGtoPDF from 'svg-to-pdfkit';\n\nimport {\n getOffset,\n getTimezoneFromTimePrefs,\n formatBirthdate,\n formatCurrentDate,\n formatDateRange,\n} from '../../utils/datetime';\n\nimport { getStatDefinition } from '../../utils/stat';\nimport { getPatientFullName } from '../../utils/misc';\n\nimport {\n DPI,\n MARGINS,\n WIDTH,\n HEIGHT,\n DEFAULT_FONT_SIZE,\n EXTRA_SMALL_FONT_SIZE,\n FOOTER_FONT_SIZE,\n HEADER_FONT_SIZE,\n LARGE_FONT_SIZE,\n SMALL_FONT_SIZE,\n} from './utils/constants';\n\nimport { BG_COLORS, MS_IN_MIN } from '../../utils/constants';\n\nconst t = i18next.t.bind(i18next);\n\nconst logo = require('./images/tidepool-logo-408x46.png');\n\nclass PrintView {\n constructor(doc, data = {}, opts) {\n this.doc = doc;\n this.addSVG = SVGtoPDF.bind(null, this.doc);\n\n this.title = opts.title;\n this.data = _.cloneDeep(data);\n this.bgPrefs = _.get(this.data, 'bgPrefs');\n this.bgUnits = _.get(this.data, 'bgPrefs.bgUnits');\n this.bgBounds = _.get(this.data, 'bgPrefs.bgBounds');\n this.timePrefs = _.get(this.data, 'timePrefs');\n this.timezone = getTimezoneFromTimePrefs(this.timePrefs);\n this.endpoints = _.get(this.data, 'data.current.endpoints', {});\n this.bgSource = _.get(this.data, 'metaData.bgSources.current');\n this.latestPumpUpload = _.get(this.data, 'metaData.latestPumpUpload');\n this.manufacturer = _.get(this.latestPumpUpload, 'manufacturer');\n\n this.stats = {};\n const statsData = _.get(this.data, 'data.current.stats', {});\n _.forOwn(statsData, (statData, statType) => {\n const stat = getStatDefinition(statData, statType, {\n bgSource: this.bgSource,\n days: this.endpoints.activeDays || this.endpoints.days,\n bgPrefs: this.bgPrefs,\n manufacturer: this.manufacturer,\n });\n this.stats[statType] = stat;\n });\n\n this.aggregationsByDate = _.get(this.data, 'data.current.aggregationsByDate', {});\n\n this.debug = opts.debug || false;\n\n this.dpi = opts.dpi || DPI;\n this.margins = opts.margins || MARGINS;\n\n this.font = 'Helvetica';\n this.boldFont = 'Helvetica-Bold';\n\n this.defaultFontSize = opts.defaultFontSize || DEFAULT_FONT_SIZE;\n this.footerFontSize = opts.footerFontSize || FOOTER_FONT_SIZE;\n this.headerFontSize = opts.headerFontSize || HEADER_FONT_SIZE;\n this.largeFontSize = opts.largeFontSize || LARGE_FONT_SIZE;\n this.smallFontSize = opts.smallFontSize || SMALL_FONT_SIZE;\n this.extraSmallFontSize = opts.extraSmallFontSize || EXTRA_SMALL_FONT_SIZE;\n\n this.width = opts.width || WIDTH;\n this.height = opts.height || HEIGHT;\n\n this.patient = opts.patient;\n this.patientInfoBox = {\n width: 0,\n height: 0,\n };\n\n this.colors = {\n ...BG_COLORS,\n basal: '#19A0D7',\n basalAutomated: '#00B2C3',\n sleep: '#4457D9',\n physicalActivity: '#758CFF',\n bolus: '#7CD0F0',\n bolusAutomated: '#00B2C3',\n smbg: '#6480FB',\n siteChange: '#FCD144',\n basalHeader: '#DCF1F9',\n smbgHeader: '#E8ECFE',\n bolusHeader: '#EBF7FC',\n grey: '#6D6D6D',\n lightGrey: '#979797',\n darkGrey: '#4E4E4F',\n };\n\n this.tableSettings = {\n colors: {\n border: this.colors.grey,\n tableHeader: this.colors.basal,\n zebraHeader: '#FAFAFA',\n zebraEven: '#FAFAFA',\n zebraOdd: '#FFFFFF',\n },\n borderWidth: 0.5,\n };\n\n this.leftEdge = this.margins.left;\n this.rightEdge = this.margins.left + this.width;\n this.topEdge = this.margins.top;\n this.bottomEdge = this.margins.top + this.height;\n\n this.chartArea = {\n bottomEdge: this.margins.top + opts.height,\n leftEdge: this.margins.left,\n topEdge: this.margins.top,\n };\n\n this.chartArea.width = this.rightEdge - this.chartArea.leftEdge;\n this.initialChartArea = _.clone(this.chartArea);\n\n this.totalPages = this.initialTotalPages = this.doc.bufferedPageRange().count || 0;\n this.currentPageIndex = -1;\n\n // kick off the dynamic calculation of chart area based on font sizes for header and footer\n this.setHeaderSize().setFooterSize();\n\n // Auto-bind callback methods\n this.newPage = this.newPage.bind(this);\n this.setNewPageTablePosition = this.setNewPageTablePosition.bind(this);\n this.renderCustomTextCell = this.renderCustomTextCell.bind(this);\n\n // Clear previous and set up pageAdded listeners :/\n this.doc.removeAllListeners('pageAdded');\n this.doc.on('pageAdded', this.newPage);\n }\n\n newPage(dateText) {\n if (this.debug) {\n this.renderDebugGrid();\n }\n\n const currentFont = {\n name: _.get(this.doc, '_font.name', this.font),\n size: _.get(this.doc, '_fontSize', this.defaultFontSize),\n };\n\n this.currentPageIndex++;\n this.totalPages++;\n\n this.renderHeader(dateText).renderFooter();\n this.doc.x = this.chartArea.leftEdge;\n this.doc.y = this.chartArea.topEdge;\n\n // Set font styles back to what they were before the page break\n // This is needed because the header and footer rendering changes it\n // and any tables that need to continue rendering on the new page are affected.\n this.doc\n .font(currentFont.name)\n .fontSize(currentFont.size);\n\n if (this.table) {\n this.setNewPageTablePosition();\n }\n\n if (this.layoutColumns) {\n this.setLayoutColumns({\n activeIndex: this.layoutColumns.activeIndex,\n count: this.layoutColumns.count,\n gutter: this.layoutColumns.gutter,\n type: this.layoutColumns.type,\n width: this.layoutColumns.width,\n widths: this.layoutColumns.widths,\n });\n\n this.goToLayoutColumnPosition(this.layoutColumns.activeIndex);\n }\n }\n\n setNewPageTablePosition() {\n const xPos = this.layoutColumns\n ? _.get(this, `layoutColumns.columns.${this.layoutColumns.activeIndex}.x`)\n : this.chartArea.leftEdge;\n\n this.doc.x = this.table.pos.x = xPos;\n this.doc.y = this.table.pos.y = this.chartArea.topEdge;\n\n this.table.pdf.lineWidth(this.tableSettings.borderWidth);\n }\n\n setLayoutColumns(opts) {\n const {\n activeIndex = 0,\n columns = [],\n count = _.get(opts, 'widths.length', 0),\n gutter = 0,\n type = 'equal',\n width = this.chartArea.width,\n widths = [],\n } = opts;\n\n const availableWidth = width - (gutter * (count - 1));\n\n switch (type) {\n case 'percentage': {\n let combinedWidths = 0;\n let i = 0;\n\n do {\n const columnWidth = availableWidth * widths[i] / 100;\n\n columns.push({\n x: this.chartArea.leftEdge + (gutter * i) + combinedWidths,\n y: this.doc.y,\n width: columnWidth,\n });\n\n i++;\n combinedWidths += columnWidth;\n } while (i < count);\n\n break;\n }\n\n case 'equal':\n default: {\n const columnWidth = availableWidth / count;\n let i = 0;\n\n do {\n columns.push({\n x: this.chartArea.leftEdge + (gutter * i) + (columnWidth * i),\n y: this.doc.y,\n width: columnWidth,\n });\n i++;\n } while (i < count);\n\n break;\n }\n }\n\n this.layoutColumns = {\n activeIndex,\n columns,\n count,\n gutter,\n type,\n width,\n widths,\n };\n }\n\n updateLayoutColumnPosition(index) {\n this.layoutColumns.columns[index].x = this.doc.x;\n this.layoutColumns.columns[index].y = this.doc.y;\n }\n\n goToLayoutColumnPosition(index) {\n this.doc.x = this.layoutColumns.columns[index].x;\n this.doc.y = this.layoutColumns.columns[index].y;\n this.layoutColumns.activeIndex = index;\n }\n\n goToPage(index) {\n this.doc.switchToPage(this.initialTotalPages + index);\n this.currentPageIndex = index;\n }\n\n getShortestLayoutColumn() {\n let shortest;\n let shortestIndex;\n _.each(this.layoutColumns.columns, (column, colIndex) => {\n if (!shortest || (shortest > column.y)) {\n shortest = column.y;\n shortestIndex = colIndex;\n }\n });\n\n return shortestIndex;\n }\n\n getLongestLayoutColumn() {\n let longest;\n let longestIndex;\n _.each(_.get(this, 'layoutColumns.columns', []), (column, colIndex) => {\n if (!longest || (longest < column.y)) {\n longest = column.y;\n longestIndex = colIndex;\n }\n });\n\n return longestIndex;\n }\n\n getActiveColumnWidth() {\n return this.layoutColumns.columns[this.layoutColumns.activeIndex].width;\n }\n\n getDateRange(startDate, endDate, dateParseFormat, prefix, monthFormat) {\n let start = startDate;\n let end = endDate;\n\n if (_.isNumber(startDate) && _.isNumber(endDate)) {\n start = startDate - getOffset(startDate, this.timezone) * MS_IN_MIN;\n end = endDate - getOffset(endDate, this.timezone) * MS_IN_MIN;\n }\n\n return t('{{prefix}}{{dateRange}}', {\n prefix,\n dateRange: formatDateRange(start, end, dateParseFormat, monthFormat),\n });\n }\n\n lockFillandStroke() {\n this.fillLocked = true;\n this.strokeLocked = true;\n }\n\n unlockFillandStroke() {\n this.fillLocked = false;\n this.strokeLocked = false;\n }\n\n setFill(color = 'black', opacity = 1) {\n if (this.fillLocked) return;\n this.doc\n .fillColor(color)\n .fillOpacity(opacity);\n }\n\n setStroke(color = 'black', opacity = 1) {\n if (this.strokeLocked) return;\n this.doc\n .strokeColor(color)\n .strokeOpacity(opacity);\n }\n\n resetText() {\n this.setFill();\n this.doc\n .lineGap(0)\n .fontSize(this.defaultFontSize)\n .font(this.font);\n }\n\n renderSectionHeading(heading, opts = {}) {\n const {\n xPos = this.doc.x,\n yPos = this.doc.y,\n font = _.get(opts, 'font', this.font),\n fontSize = _.get(opts, 'fontSize', this.headerFontSize),\n subTextFont = _.get(opts, 'subTextFont', this.font),\n subTextFontSize = _.get(opts, 'subTextFontSize', this.defaultFontSize),\n moveDown = 1,\n } = opts;\n\n const text = _.isString(heading) ? heading : heading.text;\n const subText = _.get(heading, 'subText', false);\n\n const textHeight = this.doc\n .font(font)\n .fontSize(fontSize)\n .heightOfString(' ');\n\n const subTextHeight = this.doc\n .font(subTextFont)\n .fontSize(subTextFontSize)\n .heightOfString(' ');\n\n const subTextYOffset = (textHeight - subTextHeight) / 1.75;\n\n this.doc\n .font(font)\n .fontSize(fontSize)\n .text(text, xPos, yPos, _.defaults(opts, {\n align: 'left',\n continued: !!subText,\n }));\n\n if (subText) {\n this.doc\n .font(subTextFont)\n .fontSize(subTextFontSize)\n .text(` ${subText}`, xPos, yPos + subTextYOffset);\n }\n\n this.resetText();\n this.doc.moveDown(moveDown);\n }\n\n renderCellStripe(data = {}, column = {}, pos = {}, isHeader = false) {\n const fillStripeKey = isHeader ? 'headerFillStripe' : 'fillStripe';\n const fillKey = isHeader ? 'headerFill' : 'fill';\n const heightKey = isHeader ? 'headerHeight' : 'height';\n\n const height = _.get(column, heightKey, column.height)\n || _.get(data, '_renderedContent.height', 0);\n\n const stripe = {\n width: 0,\n height,\n padding: 0,\n color: this.colors.grey,\n opacity: 1,\n background: false,\n };\n\n const fillStripe = _.get(data, `_${fillStripeKey}`, column[fillStripeKey]);\n const fill = _.get(data, `_${fillKey}`, column[fillKey]);\n\n if (fillStripe) {\n const stripeDefined = _.isPlainObject(fillStripe);\n\n stripe.color = stripeDefined\n ? _.get(fillStripe, 'color', this.colors.grey)\n : _.get(fill, 'color', this.colors.grey);\n\n stripe.opacity = stripeDefined ? _.get(fillStripe, 'opacity', 1) : 1;\n stripe.width = stripeDefined ? _.get(fillStripe, 'width', 6) : 6;\n stripe.background = _.get(fillStripe, 'background', false);\n stripe.padding = _.get(fillStripe, 'padding', 0);\n\n this.setFill(stripe.color, stripe.opacity);\n\n const xPos = pos.x + 0.25 + stripe.padding;\n const yPos = pos.y + 0.25 + stripe.padding;\n const stripeWidth = stripe.width;\n const stripeHeight = stripe.height - 0.5 - (2 * stripe.padding);\n\n if (stripe.width > 0) {\n this.doc\n .rect(xPos, yPos, stripeWidth, stripeHeight)\n .fill();\n }\n\n this.setFill();\n }\n\n return stripe;\n }\n\n renderCustomTextCell(tb, data, draw, column, pos, padding, isHeader) {\n if (draw) {\n let {\n text = '',\n subText = '',\n note,\n } = _.get(data, column.id, column.header || {});\n\n if ((!isHeader && _.isString(data[column.id])) || _.isString(column.header)) {\n text = isHeader ? column.header : data[column.id];\n subText = note = null;\n }\n\n const alignKey = isHeader ? 'headerAlign' : 'align';\n const align = _.get(column, alignKey, 'left');\n\n const stripe = this.renderCellStripe(data, column, pos, isHeader);\n const stripeOffset = stripe.background ? 0 : stripe.width;\n\n const xPos = pos.x + _.get(padding, 'left', 0) + stripeOffset;\n let yPos = pos.y + padding.top;\n\n // eslint-disable-next-line no-underscore-dangle\n const boldRow = data._bold || isHeader;\n\n const width = column.width - _.get(padding, 'left', 0) - _.get(padding, 'right', 0);\n\n const heightKey = isHeader ? 'headerHeight' : 'height';\n\n const height = _.get(column, heightKey, column.height)\n || _.get(data, '_renderedContent.height', 0);\n\n const fontKey = isHeader ? 'headerFont' : 'font';\n\n this.doc\n .font(_.get(column, fontKey, boldRow ? this.boldFont : this.font))\n .fontSize(_.get(column, 'fontSize', this.defaultFontSize));\n\n if (column.valign === 'center') {\n const textHeight = this.doc.heightOfString(text, { width });\n yPos += (height - textHeight) / 2 + 1;\n }\n\n let textRightPadding = 0;\n if (subText && align === 'right') {\n textRightPadding = this.doc.widthOfString(subText);\n }\n\n this.doc.text(text, xPos - textRightPadding, yPos, {\n continued: !!subText,\n align,\n width,\n });\n\n this.doc.font(this.font);\n\n if (subText) {\n this.doc.text(`${subText}`, xPos, yPos, {\n align,\n width,\n });\n }\n\n if (note) {\n this.doc\n .fontSize(_.get(column, 'noteFontSize', this.defaultFontSize))\n .text(note, {\n align,\n width,\n });\n }\n }\n\n return ' ';\n }\n\n renderTableHeading(heading = {}, opts = {}) {\n const fontSize = _.get(opts, 'fontSize', this.largeFontSize);\n const cellHeight = fontSize * 2;\n\n this.doc\n .font(this.font)\n .fontSize(fontSize);\n\n const columns = [\n {\n id: 'heading',\n align: _.get(opts, 'align', 'left'),\n height: _.get(opts, 'height', _.get(heading, 'note') ? cellHeight + 13 : cellHeight),\n cache: false,\n renderer: this.renderCustomTextCell,\n font: _.get(opts, 'font', this.boldFont),\n fontSize,\n },\n ];\n\n const rows = [\n {\n heading,\n note: _.get(heading, 'note'),\n },\n ];\n\n this.renderTable(columns, rows, _.defaultsDeep(opts, {\n columnDefaults: {\n headerBorder: '',\n },\n bottomMargin: 0,\n showHeaders: false,\n }));\n\n this.resetText();\n }\n\n renderTable(columns = [], rows = [], opts = {}, Table = PdfTable, FitColumn = PdfTableFitColumn) {\n this.doc.lineWidth(this.tableSettings.borderWidth);\n\n _.defaultsDeep(opts, {\n columnDefaults: {\n borderColor: this.tableSettings.colors.border,\n headerBorder: 'TBLR',\n border: 'TBLR',\n align: 'left',\n padding: [7, 5, 3, 5],\n headerPadding: [7, 5, 3, 5],\n fill: _.get(opts, 'columnDefaults.fill', _.get(opts, 'columnDefaults.zebra', false)),\n },\n bottomMargin: 20,\n pos: {\n maxY: this.chartArea.bottomEdge,\n },\n });\n\n // There is a bug in the PDF table plugin where it will render empty headers even if showHeaders\n // is false when a table spills over onto a new page. We remove the header border and padding in\n // to work around this, and cause it to effectively render nothing.\n // eslint-disable-next-line no-param-reassign\n if (opts.showHeaders === false) columns = columns.map(column => ({ ...column, headerBorder: '', headerPadding: [0, 0, 0, 0] }));\n\n const {\n flexColumn,\n } = opts;\n\n const table = this.table = new Table(this.doc, opts);\n\n if (flexColumn) {\n table.addPlugin(new FitColumn({\n column: flexColumn,\n }));\n }\n\n table.onPageAdd(this.onPageAdd.bind(this));\n\n table.onPageAdded(this.onPageAdded.bind(this));\n\n table.onCellBackgroundAdd(this.onCellBackgroundAdd.bind(this));\n\n table.onCellBackgroundAdded(this.onCellBackgroundAdded.bind(this));\n\n table.onCellBorderAdd(this.onCellBorderAdd.bind(this));\n\n table.onCellBorderAdded(this.onCellBorderAdded.bind(this));\n\n table.onRowAdd(this.onRowAdd.bind(this));\n\n table.onRowAdded(this.onRowAdded.bind(this));\n\n table.onBodyAdded(this.onBodyAdded.bind(this));\n\n table\n .setColumnsDefaults(opts.columnDefaults)\n .addColumns(columns)\n .addBody(rows);\n }\n\n onPageAdd(tb, row, ev) {\n const currentPageIndex = this.initialTotalPages + this.currentPageIndex;\n\n if (currentPageIndex + 1 === this.totalPages) {\n tb.pdf.addPage();\n } else {\n this.currentPageIndex++;\n tb.pdf.switchToPage(this.initialTotalPages + this.currentPageIndex);\n this.setNewPageTablePosition();\n }\n\n // cancel event so the automatic page add is not triggered\n ev.cancel = true; // eslint-disable-line no-param-reassign\n }\n\n onPageAdded(tb) {\n tb.addHeader();\n }\n\n onBodyAdded(tb) {\n // Restore x position after table is drawn\n this.doc.x = _.get(tb, 'pos.x', this.doc.page.margins.left);\n\n // Add margin to the bottom of the table\n this.doc.y += tb.bottomMargin;\n }\n\n onCellBackgroundAdd(tb, column, row, index, isHeader) {\n const {\n fill,\n headerFill,\n zebra,\n } = column;\n\n const isEven = index % 2 === 0;\n\n const fillKey = isHeader ? headerFill : fill;\n\n if (fillKey) {\n const fillDefined = _.isPlainObject(fillKey);\n let color;\n let opacity;\n\n if (!fillDefined) {\n opacity = 1;\n\n if (zebra) {\n if (isHeader) {\n color = this.tableSettings.colors.zebraHeader;\n } else {\n color = isEven\n ? this.tableSettings.colors.zebraEven\n : this.tableSettings.colors.zebraOdd;\n }\n } else {\n color = fillKey || 'white';\n }\n } else {\n const defaultOpacity = _.get(fillKey, 'opacity', 1);\n\n color = _.get(fillKey, 'color', 'white');\n opacity = zebra && !isEven ? defaultOpacity / 2 : defaultOpacity;\n }\n\n this.setFill(color, opacity);\n }\n\n /* eslint-disable no-underscore-dangle */\n if (row._fill) {\n const {\n color,\n opacity,\n } = row._fill;\n\n this.setFill(color, opacity);\n }\n /* eslint-enable no-underscore-dangle */\n }\n\n onCellBackgroundAdded() {\n this.setFill();\n }\n\n onCellBorderAdd(tb, column) {\n this.doc.lineWidth(this.tableSettings.borderWidth);\n this.setStroke(_.get(column, 'borderColor', 'black'), 1);\n }\n\n onCellBorderAdded() {\n this.setStroke();\n }\n\n onRowAdd(tb, row) {\n // eslint-disable-next-line no-underscore-dangle\n if (row._bold) {\n this.doc.font(this.boldFont);\n }\n }\n\n onRowAdded() {\n this.resetText();\n }\n\n renderPatientInfo() {\n const patientName = _.truncate(getPatientFullName(this.patient), { length: 32 });\n const patientBirthdate = formatBirthdate(this.patient);\n let patientMRN = this.patient?.clinicPatientMRN || this.patient?.profile?.patient?.mrn;\n const xOffset = this.margins.left;\n const yOffset = this.margins.top;\n\n this.doc\n .lineWidth(1)\n .fontSize(10)\n .text(patientName, xOffset, yOffset, {\n lineGap: 2,\n });\n\n const patientNameWidth = this.doc.widthOfString(patientName);\n const patientDOB = t('DOB: {{birthdate}}', { birthdate: patientBirthdate });\n\n this.doc\n .fontSize(10)\n .text(patientDOB);\n\n const patientBirthdayWidth = this.doc.widthOfString(patientDOB);\n this.patientInfoBox.height = this.doc.y;\n\n let patientMRNWidth = 0;\n\n if (patientMRN) {\n if (patientMRN.length > 15) {\n patientMRN = `${patientMRN.slice(0, 5)}\\u2026${patientMRN.slice(-7)}`;\n }\n\n const patientMRNText = t('MRN: {{mrn}}', { mrn: patientMRN });\n\n this.doc\n .moveDown(0.15)\n .fontSize(10)\n .text(patientMRNText);\n\n patientMRNWidth = this.doc.widthOfString(patientMRNText);\n this.patientInfoBox.height = this.doc.y;\n }\n\n this.patientInfoBox.width = _.max([patientNameWidth, patientBirthdayWidth, patientMRNWidth]);\n\n // Render the divider between the patient info and title\n const padding = 10;\n\n this.doc\n .moveTo(this.margins.left + this.patientInfoBox.width + padding, this.margins.top)\n .lineTo(this.margins.left + this.patientInfoBox.width + padding, this.patientInfoBox.height)\n .stroke('black');\n\n this.dividerWidth = padding * 2 + 1;\n }\n\n renderTitle() {\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n const xOffset = this.margins.left + this.patientInfoBox.width + 21;\n const yOffset = (\n this.margins.top + ((this.patientInfoBox.height - this.margins.top) / 2 - (lineHeight / 2))\n );\n\n const title = this.currentPageIndex === 0\n ? this.title\n : t('{{title}} (cont.)', { title: this.title });\n\n this.doc.text(title, xOffset, yOffset);\n this.titleWidth = this.doc.widthOfString(title);\n }\n\n renderDateText(dateText = '') {\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n\n // Calculate the remaining available width so we can\n // center the print text between the patient/title text and the logo\n const availableWidth = this.doc.page.width - _.reduce([\n this.patientInfoBox.width,\n this.dividerWidth,\n this.titleWidth,\n this.logoWidth,\n this.margins.left,\n this.margins.right,\n ], (a, b) => (a + b), 0);\n\n const xOffset = (\n this.margins.left + this.patientInfoBox.width + this.dividerWidth + this.titleWidth\n );\n const yOffset = (\n this.margins.top + ((this.patientInfoBox.height - this.margins.top) / 2 - (lineHeight / 2))\n );\n\n this.doc\n .fontSize(10)\n .text(dateText, xOffset, yOffset + 2.5, {\n width: availableWidth,\n align: 'center',\n });\n }\n\n renderLogo() {\n this.logoWidth = 100;\n const xOffset = this.doc.page.width - this.logoWidth - this.margins.right;\n const yOffset = this.margins.top + 5;\n\n this.doc.image(logo, xOffset, yOffset, { width: this.logoWidth });\n }\n\n renderDebugGrid() {\n const minorLineColor = '#B8B8B8';\n const numMinorLines = 5;\n let thisLineYPos = this.margins.top;\n while (thisLineYPos <= (this.bottomEdge)) {\n this.doc.moveTo(this.margins.left, thisLineYPos)\n .lineTo(this.rightEdge, thisLineYPos)\n .lineWidth(0.25)\n .stroke('red');\n if (thisLineYPos !== this.bottomEdge) {\n for (let i = 1; i < numMinorLines + 1; ++i) {\n const innerLinePos = thisLineYPos + this.dpi * (i / (numMinorLines + 1));\n this.doc.moveTo(this.margins.left, innerLinePos)\n .lineTo(this.rightEdge, innerLinePos)\n .lineWidth(0.05)\n .stroke(minorLineColor);\n }\n }\n thisLineYPos += this.dpi;\n }\n\n let thisLineXPos = this.margins.left;\n while (thisLineXPos <= (this.rightEdge)) {\n this.doc.moveTo(thisLineXPos, this.margins.top)\n .lineTo(thisLineXPos, this.bottomEdge)\n .lineWidth(0.25)\n .stroke('red');\n for (let i = 1; i < numMinorLines + 1; ++i) {\n const innerLinePos = thisLineXPos + this.dpi * (i / (numMinorLines + 1));\n if (innerLinePos <= this.rightEdge) {\n this.doc.moveTo(innerLinePos, this.margins.top)\n .lineTo(innerLinePos, this.bottomEdge)\n .lineWidth(0.05)\n .stroke(minorLineColor);\n }\n }\n thisLineXPos += this.dpi;\n }\n\n return this;\n }\n\n renderHeader(dateText) {\n this.renderPatientInfo();\n\n this.renderTitle();\n\n this.renderLogo();\n\n this.renderDateText(dateText);\n\n this.doc.moveDown();\n\n const lineHeight = this.doc.fontSize(14).currentLineHeight();\n const height = lineHeight * 0.25 + this.patientInfoBox.height;\n this.doc\n .moveTo(this.margins.left, height)\n .lineTo(this.margins.left + this.width, height)\n .stroke('black');\n\n // TODO: remove this; it is just for exposing/debugging the chartArea.topEdge adjustment\n if (this.debug) {\n this.doc\n .fillColor('#E8E8E8', 0.3333333333)\n .rect(this.margins.left, this.margins.top, this.width, lineHeight * 4)\n .fill();\n }\n\n return this;\n }\n\n renderFooter() {\n this.doc.fontSize(this.footerFontSize);\n\n const helpText = t('Questions or feedback? Please email support@tidepool.org' +\n ' or visit support.tidepool.org.');\n\n const printDateText = `Printed on: ${formatCurrentDate()}`;\n const printDateWidth = this.doc.widthOfString(printDateText);\n\n const pageCountWidth = this.doc.widthOfString('Page 1 of 1');\n\n const xPos = this.margins.left;\n const yPos = (this.height + this.margins.top) - this.doc.currentLineHeight() * 1.5;\n const innerWidth = (this.width) - printDateWidth - pageCountWidth;\n\n this.doc\n .fillColor(this.colors.lightGrey)\n .fillOpacity(1)\n .text(printDateText, xPos, yPos)\n .text(helpText, xPos + printDateWidth, yPos, {\n width: innerWidth,\n align: 'center',\n });\n\n this.setFill();\n\n return this;\n }\n\n static renderPageNumbers(doc) {\n const pageCount = doc.bufferedPageRange().count;\n let page = 0;\n while (page < pageCount) {\n page++;\n doc.switchToPage(page - 1);\n doc.fontSize(FOOTER_FONT_SIZE).fillColor('#979797').fillOpacity(1);\n doc.text(\n t('Page {{page}} of {{pageCount}}', { page, pageCount }),\n MARGINS.left,\n (HEIGHT + MARGINS.top) - doc.currentLineHeight() * 1.5,\n { align: 'right' }\n );\n }\n }\n\n renderSVGImage(svgDataURL = '', x, y, width, height) {\n const svgDataURLArr = svgDataURL.split(',');\n const rawChartSVG = decodeURIComponent(svgDataURLArr[1]);\n this.addSVG(rawChartSVG, x, y, { assumePt: true, width, height });\n }\n\n setFooterSize() {\n this.doc.fontSize(this.footerFontSize);\n const lineHeight = this.doc.currentLineHeight();\n this.chartArea.bottomEdge = this.chartArea.bottomEdge - lineHeight * 3;\n\n return this;\n }\n\n setHeaderSize() {\n this.doc.fontSize(this.headerFontSize);\n const lineHeight = this.doc.currentLineHeight();\n this.chartArea.topEdge = this.chartArea.topEdge + lineHeight * 4;\n\n return this;\n }\n}\n\nexport default PrintView;\n","import arrayWithHoles from \"./arrayWithHoles\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit\";\nimport nonIterableRest from \"./nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n return;\n }\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nexport default function _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","module.exports = require(\"d3-format\");","module.exports = require(\"sundial\");","/*\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\n/**\n * getPatientFullName\n * @param {Object} patient - Tidepool patient object containing profile\n *\n * @return {String} PwD's full name (first & last)\n */\nexport function getPatientFullName(patient) {\n const profile = _.get(patient, ['profile'], {});\n const patientInfo = profile.patient || {};\n\n if (patientInfo.isOtherPerson) {\n return patientInfo.fullName;\n }\n return profile.fullName;\n}\n","import superPropBase from \"./superPropBase\";\nexport default function _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n}","import getPrototypeOf from \"./getPrototypeOf\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\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 */\nimport _ from 'lodash';\nimport i18next from 'i18next';\nimport * as data from './data';\nimport { pumpVocabulary, AUTOMATED_DELIVERY } from '../constants';\n\nconst t = i18next.t.bind(i18next);\n\n/**\n * basalSchedules\n * @param {Object} settings object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function basalSchedules(settings) {\n return data.getScheduleNames(settings.basalSchedules);\n}\n\n/**\n * deviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function deviceMeta(settings, timePrefs) {\n return data.getDeviceMeta(settings, timePrefs);\n}\n\n/**\n * bolusTitle\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n *\n * @return {String} bolus title for given manufacturer\n */\nexport function bolusTitle(manufacturer) {\n const BOLUS_SETTINGS_LABEL_BY_MANUFACTURER = {\n animas: t('ezCarb ezBG'),\n insulet: t('Bolus Calculator'),\n medtronic: t('Bolus Wizard'),\n microtech: t('Bolus Calculator'),\n };\n return BOLUS_SETTINGS_LABEL_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * scheduleLabel\n * @private\n */\nfunction scheduleLabel(scheduleName, activeScheduleName, manufacturer, noUnits) {\n return data.getScheduleLabel(scheduleName, activeScheduleName, manufacturer, noUnits);\n}\n\n/**\n * basalRows\n * @private\n */\nfunction basalRows(schedule, settings) {\n return data.processBasalRateData(settings.basalSchedules[schedule]);\n}\n\n/**\n * basalColumns\n * @private\n */\nfunction basalColumns() {\n return data.startTimeAndValue('rate');\n}\n\n/**\n * basal\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @return {Object} object with basal title, columns and rows\n */\nexport function basal(schedule, settings, manufacturer) {\n const name = settings.basalSchedules[schedule].name;\n const lookupKey = (manufacturer === 'carelink') ? 'medtronic' : manufacturer;\n\n const isAutomated = _.get(pumpVocabulary, [\n data.deviceName(lookupKey),\n AUTOMATED_DELIVERY,\n ]) === name;\n\n return {\n scheduleName: name,\n activeAtUpload: (name === settings.activeSchedule),\n isAutomated,\n title: scheduleLabel(name, settings.activeSchedule, manufacturer, isAutomated),\n columns: isAutomated ? [] : basalColumns(),\n rows: isAutomated ? [] : basalRows(schedule, settings),\n };\n}\n\n/**\n * sensitivityTitle\n * @private\n */\nfunction sensitivityTitle(manufacturer) {\n const ISF_BY_MANUFACTURER = {\n animas: t('ISF'),\n insulet: t('Correction factor'),\n medtronic: t('Sensitivity'),\n microtech: t('Insulin Sensitivity'),\n };\n return ISF_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * sensitivityColumns\n * @private\n */\nfunction sensitivityColumns() {\n return data.startTimeAndValue('amount');\n}\n\n/**\n * sensitivityRows\n * @private\n */\nfunction sensitivityRows(settings, units) {\n return data.processSensitivityData(\n settings.insulinSensitivity,\n units,\n );\n}\n\n/**\n * sensitivity\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @return {Object} object with sensitivity title, columns and rows\n */\nexport function sensitivity(settings, manufacturer, units) {\n return {\n title: sensitivityTitle(manufacturer),\n columns: sensitivityColumns(),\n rows: sensitivityRows(settings, units),\n };\n}\n\n/**\n * ratioTitle\n * @private\n */\nfunction ratioTitle(manufacturer) {\n const CARB_RATIO_BY_MANUFACTURER = {\n animas: t('I:C Ratio'),\n insulet: t('IC ratio'),\n medtronic: t('Carb Ratios'),\n microtech: t('Carbohydrate Ratio'),\n };\n return CARB_RATIO_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * ratioColumns\n * @private\n */\nfunction ratioColumns() {\n return data.startTimeAndValue('amount');\n}\n\n/**\n * ratioRows\n * @private\n */\nfunction ratioRows(settings) {\n return data.processCarbRatioData(settings.carbRatio);\n}\n\n/**\n * ratio\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @return {Object} object with ratio title, columns and rows\n */\nexport function ratio(settings, manufacturer) {\n return {\n title: ratioTitle(manufacturer),\n columns: ratioColumns(),\n rows: ratioRows(settings),\n };\n}\n\n/**\n * targetTitle\n * @private\n */\nfunction targetTitle(manufacturer) {\n const BG_TARGET_BY_MANUFACTURER = {\n animas: t('BG Target'),\n insulet: t('Target BG'),\n medtronic: t('BG Target'),\n microtech: t('Target BG'),\n };\n return BG_TARGET_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * targetColumns\n * @private\n */\nfunction targetColumns(manufacturer) {\n const BG_TARGET_COLS_BY_MANUFACTURER = {\n animas: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Target') },\n { key: 'columnThree', label: t('Range') },\n ],\n insulet: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Target') },\n { key: 'columnThree', label: t('Correct Above') },\n ],\n medtronic: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Low') },\n { key: 'columnThree', label: t('High') },\n ],\n microtech: [\n { key: 'start', label: t('Start time') },\n { key: 'columnTwo', label: t('Lower') },\n { key: 'columnThree', label: t('Upper') },\n ],\n };\n return BG_TARGET_COLS_BY_MANUFACTURER[manufacturer];\n}\n\n/**\n * targetRows\n * @private\n */\nfunction targetRows(settings, units, manufacturer) {\n const BG_TARGET_ACCESSORS_BY_MANUFACTURER = {\n animas: { columnTwo: 'target', columnThree: 'range' },\n insulet: { columnTwo: 'target', columnThree: 'high' },\n medtronic: { columnTwo: 'low', columnThree: 'high' },\n microtech: { columnTwo: 'low', columnThree: 'high' },\n };\n return data.processBgTargetData(\n settings.bgTarget,\n units,\n BG_TARGET_ACCESSORS_BY_MANUFACTURER[manufacturer],\n );\n}\n\n/**\n * target\n *\n * @param {Object} settings object with pump settings data\n * @param {String} manufacturer one of: animas, carelink, insulet, medtronic, microtech\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @return {Object} object with target title, columns and rows\n */\nexport function target(settings, manufacturer, units) {\n return {\n title: targetTitle(manufacturer),\n columns: targetColumns(manufacturer),\n rows: targetRows(settings, units, manufacturer),\n };\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 */\nimport * as data from './data';\n\n/**\n * basalSchedules\n * @param {Object} settings object with basal schedule properties\n *\n * @return {Array} array of basal schedule names\n */\nexport function basalSchedules(settings) {\n return data.getTimedSchedules(settings.basalSchedules);\n}\n\n/**\n * deviceMeta\n * @param {Object} settingsData all settings data\n * @param {Object} timePrefs timezone preferences object\n *\n * @return {Object} filtered meta data\n */\nexport function deviceMeta(settings, timePrefs) {\n return data.getDeviceMeta(settings, timePrefs);\n}\n\n/**\n * scheduleLabel\n * @private\n */\nfunction scheduleLabel(scheduleName, activeScheduleName) {\n return data.getScheduleLabel(scheduleName, activeScheduleName, 'tandem', true);\n}\n\n/**\n * basalRows\n * @private\n */\nfunction basalRows(schedule, settings, units) {\n return data.processTimedSettings(\n settings,\n schedule,\n units,\n );\n}\n\n/**\n * basalColumns\n * @private\n */\nfunction basalColumns(styles = {}, units) {\n return [\n { key: 'start',\n label: 'Start time' },\n { key: 'rate',\n label: {\n main: 'Basal Rates',\n secondary: 'U/hr',\n },\n className: styles.basalScheduleHeader },\n { key: 'bgTarget',\n label: {\n main: 'Target BG',\n secondary: units,\n },\n className: styles.bolusSettingsHeader },\n { key: 'carbRatio',\n label: {\n main: 'Carb Ratio',\n secondary: 'g/U',\n },\n className: styles.bolusSettingsHeader },\n { key: 'insulinSensitivity',\n label: {\n main: 'Correction Factor',\n secondary: `${units}/U`,\n },\n className: styles.bolusSettingsHeader },\n ];\n}\n\n/**\n * basal\n *\n * @param {Object} schedule object schedule to build basal data from\n * @param {Object} settings object with pump settings data\n * @param {String} units MGDL_UNITS or MMOLL_UNITS\n * @param {String} styles object with applicable styles\n * @return {Object} object with basal title, columns and rows\n */\nexport function basal(schedule, settings, units, styles = {}) {\n return {\n scheduleName: schedule.name,\n activeAtUpload: (schedule.name === settings.activeSchedule),\n title: scheduleLabel(schedule.name, settings.activeSchedule),\n columns: basalColumns(styles, units),\n rows: basalRows(schedule, settings, units),\n };\n}\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""}