{"version":3,"file":"2608.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./.yarn/__virtual__/@emotion-css-virtual-15ef12e38d/3/opt/drone/yarncache/@emotion-css-npm-11.7.1-25ff8755a7-ac1f56656f.zip/node_modules/@emotion/css/create-instance/dist/emotion-css-create-instance.esm.js","webpack://grafana/./.yarn/__virtual__/@emotion-css-virtual-15ef12e38d/3/opt/drone/yarncache/@emotion-css-npm-11.7.1-25ff8755a7-ac1f56656f.zip/node_modules/@emotion/css/dist/emotion-css.esm.js","webpack://grafana/./packages/jaeger-ui-components/src/Theme.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-mappings.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-shortcuts.tsx","webpack://grafana/./packages/jaeger-ui-components/src/url/externalLinkContext.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/date.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/number.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/utils.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/Ticks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineCollapser.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/EUpdateTypes.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/DraggableManager.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineColumnResizer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineHeaderRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/color-generator.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/Positions.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/url/ReferenceLink.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ReferencesButton.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Popover.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/CopyIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.markers.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBar.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/span-ancestor-ids.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanTreeOffset.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBarRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Divider.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/LabeledList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/TextList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetailRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/VirtualizedTraceView.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/tag-keys.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/NewWindowIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/ExternalLinks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/BreakableText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/TraceName.tsx","webpack://grafana/../../opt/drone/yarncache/lru-memoize-npm-1.1.0-281b40912f-cc0c8f8427.zip/node_modules/lru-memoize/dist/lru-memoize.es.js","webpack://grafana/./packages/jaeger-ui-components/src/constants/default-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/config/get-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/span.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/link-patterns.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/trace-viewer.ts","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/CanvasSpanGraph.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/render-into-canvas.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/TickLabels.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/GraphTicks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/Scrubber.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/ViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/TracePageHeader.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/DetailState.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/TreeNode.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/process.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/span.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/trace.js","webpack://grafana/./packages/jaeger-ui-components/src/utils/sort.js","webpack://grafana/./packages/jaeger-ui-components/src/model/transform-trace-data.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/filter-spans.tsx","webpack://grafana/./packages/jaeger-ui-components/src/uberUtilityStyles.ts","webpack://grafana/./public/app/core/utils/tracing.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/responseTransform.ts","webpack://grafana/./.yarn/__virtual__/react-icon-base-virtual-e209b164a7/3/opt/drone/yarncache/react-icon-base-npm-2.1.0-caadf8254e-62b6bfe486.zip/node_modules/react-icon-base/lib/index.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/alert.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/android-open.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/arrow-right-a.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/chevron-right.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/ios-arrow-down.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/ios-arrow-right.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/io/link.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/md/file-upload.js","webpack://grafana/./.yarn/__virtual__/react-icons-virtual-f314220a93/3/opt/drone/yarncache/react-icons-npm-2.2.7-c2e0e4d90b-74e692fdd3.zip/node_modules/react-icons/lib/md/keyboard-arrow-right.js","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/jsonMarkup.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/index.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/addEvents.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bind.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindMultiple.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindSequence.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/bindSingle.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/detach.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/dom-event.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/fireCallback.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getKeyInfo.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getMatches.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/getReverseMap.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/handleKey.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/handleKeyEvent.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/modifiersMatch.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/pickBestAction.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/reset.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/resetSequenceTimer.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/resetSequences.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/stopCallback.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/trigger.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/prototype/unbind.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/Combokeys/reset.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/characterFromEvent.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/eventModifiers.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/isModifier.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/keysFromString.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/preventDefault.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/shift-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-aliases.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-characters-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/special-keys-map.js","webpack://grafana/../../opt/drone/yarncache/combokeys-npm-3.0.1-45601d2e33-37ad8d0257.zip/node_modules/combokeys/helpers/stopPropagation.js","webpack://grafana/../../opt/drone/yarncache/copy-to-clipboard-npm-3.3.1-18029bce99-3c7b1c333d.zip/node_modules/copy-to-clipboard/index.js","webpack://grafana/../../opt/drone/yarncache/deep-freeze-npm-0.0.1-12d684fc1a-1e43c98e44.zip/node_modules/deep-freeze/index.js","webpack://grafana/../../opt/drone/yarncache/fuzzy-npm-0.1.3-a0dfe08bd0-acc09c6173.zip/node_modules/fuzzy/lib/fuzzy.js","webpack://grafana/../../opt/drone/yarncache/toggle-selection-npm-1.0.6-c506b73005-a90dc80ed1.zip/node_modules/toggle-selection/index.js"],"sourcesContent":["import createCache from '@emotion/cache';\nimport { serializeStyles } from '@emotion/serialize';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\n\nfunction insertWithoutScoping(cache, serialized) {\n if (cache.inserted[serialized.name] === undefined) {\n return cache.insert('', serialized, cache.sheet, true);\n }\n}\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar createEmotion = function createEmotion(options) {\n var cache = createCache(options); // $FlowFixMe\n\n cache.sheet.speedy = function (value) {\n if (process.env.NODE_ENV !== 'production' && this.ctr !== 0) {\n throw new Error('speedy must be changed before any rules are inserted');\n }\n\n this.isSpeedy = value;\n };\n\n cache.compat = true;\n\n var css = function css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered, undefined);\n insertStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var keyframes = function keyframes() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n var animation = \"animation-\" + serialized.name;\n insertWithoutScoping(cache, {\n name: serialized.name,\n styles: \"@keyframes \" + animation + \"{\" + serialized.styles + \"}\"\n });\n return animation;\n };\n\n var injectGlobal = function injectGlobal() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n insertWithoutScoping(cache, serialized);\n };\n\n var cx = function cx() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n return {\n css: css,\n cx: cx,\n injectGlobal: injectGlobal,\n keyframes: keyframes,\n hydrate: function hydrate(ids) {\n ids.forEach(function (key) {\n cache.inserted[key] = true;\n });\n },\n flush: function flush() {\n cache.registered = {};\n cache.inserted = {};\n cache.sheet.flush();\n },\n // $FlowFixMe\n sheet: cache.sheet,\n cache: cache,\n getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),\n merge: merge.bind(null, cache.registered, css)\n };\n};\n\nvar classnames = function classnames(args) {\n var cls = '';\n\n for (var i = 0; i < args.length; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nexport default createEmotion;\n","import '@emotion/cache';\nimport '@emotion/serialize';\nimport '@emotion/utils';\nimport createEmotion from '../create-instance/dist/emotion-css-create-instance.esm.js';\n\nvar _createEmotion = createEmotion({\n key: 'css'\n}),\n flush = _createEmotion.flush,\n hydrate = _createEmotion.hydrate,\n cx = _createEmotion.cx,\n merge = _createEmotion.merge,\n getRegisteredStyles = _createEmotion.getRegisteredStyles,\n injectGlobal = _createEmotion.injectGlobal,\n keyframes = _createEmotion.keyframes,\n css = _createEmotion.css,\n sheet = _createEmotion.sheet,\n cache = _createEmotion.cache;\n\nexport { cache, css, cx, flush, getRegisteredStyles, hydrate, injectGlobal, keyframes, merge, sheet };\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Tries to get a dark variant color. Either by simply inverting the luminosity and darkening or lightening the color\n * a bit, or if base is provided, tries 2 variants of lighter and darker colors and checks which is more readable with\n * the base.\n * @param theme\n * @param hex\n * @param base\n */\nexport function autoColor(theme: GrafanaTheme2, hex: string, base?: string) {\n if (theme.isLight) {\n return hex;\n } else {\n if (base) {\n const color = tinycolor(hex);\n return tinycolor\n .mostReadable(\n base,\n [\n color.clone().lighten(25),\n color.clone().lighten(10),\n color,\n color.clone().darken(10),\n color.clone().darken(25),\n ],\n {\n includeFallbackColors: false,\n }\n )\n .toHex8String();\n }\n const color = tinycolor(hex).toHsl();\n color.l = 1 - color.l;\n const newColor = tinycolor(color);\n return newColor.isLight() ? newColor.darken(5).toHex8String() : newColor.lighten(5).toHex8String();\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst keyboardMappings: Record = {\n scrollPageDown: { binding: 's', label: 'Scroll down' },\n scrollPageUp: { binding: 'w', label: 'Scroll up' },\n scrollToNextVisibleSpan: { binding: 'f', label: 'Scroll to the next visible span' },\n scrollToPrevVisibleSpan: { binding: 'b', label: 'Scroll to the previous visible span' },\n panLeft: { binding: ['a', 'left'], label: 'Pan left' },\n panLeftFast: { binding: ['shift+a', 'shift+left'], label: 'Pan left — Large' },\n panRight: { binding: ['d', 'right'], label: 'Pan right' },\n panRightFast: { binding: ['shift+d', 'shift+right'], label: 'Pan right — Large' },\n zoomIn: { binding: 'up', label: 'Zoom in' },\n zoomInFast: { binding: 'shift+up', label: 'Zoom in — Large' },\n zoomOut: { binding: 'down', label: 'Zoom out' },\n zoomOutFast: { binding: 'shift+down', label: 'Zoom out — Large' },\n collapseAll: { binding: ']', label: 'Collapse All' },\n expandAll: { binding: '[', label: 'Expand All' },\n collapseOne: { binding: 'p', label: 'Collapse One Level' },\n expandOne: { binding: 'o', label: 'Expand One Level' },\n searchSpans: { binding: 'ctrl+b', label: 'Search Spans' },\n clearSearch: { binding: 'escape', label: 'Clear Search' },\n};\n\nexport default keyboardMappings;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport Combokeys from 'combokeys';\nimport * as React from 'react';\n\nimport keyboardMappings from './keyboard-mappings';\n\nexport type CombokeysHandler =\n | (() => void)\n | ((event: React.KeyboardEvent) => void)\n | ((event: React.KeyboardEvent, s: string) => void);\n\nexport type ShortcutCallbacks = {\n [name: string]: CombokeysHandler;\n};\n\nlet instance: Combokeys | undefined;\n\nfunction getInstance(): Combokeys {\n if (instance) {\n return instance;\n }\n const local = new Combokeys(document.body);\n instance = local;\n return local;\n}\n\nexport function merge(callbacks: ShortcutCallbacks) {\n const inst = getInstance();\n Object.keys(callbacks).forEach((name) => {\n const keysHandler = callbacks[name];\n if (keysHandler) {\n inst.bind(keyboardMappings[name].binding, keysHandler);\n }\n });\n}\n\nexport function reset() {\n const combokeys = getInstance();\n combokeys.reset();\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React from 'react';\n\n/**\n * There are several places where external links to spans are created. The url layout though is something\n * that should be decided on the application level and not on the component level but at the same time\n * propagating the factory function everywhere could be cumbersome so we use this context for that.\n */\nconst ExternalLinkContext = React.createContext<((traceID: string, spanID: string) => string) | undefined>(undefined);\nExternalLinkContext.displayName = 'ExternalLinkContext';\nexport default ExternalLinkContext;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { round as _round, dropWhile as _dropWhile } from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { toFloatPrecision } from './number';\n\nconst TODAY = 'Today';\nconst YESTERDAY = 'Yesterday';\n\nexport const STANDARD_DATE_FORMAT = 'YYYY-MM-DD';\nexport const STANDARD_TIME_FORMAT = 'HH:mm';\nexport const STANDARD_DATETIME_FORMAT = 'MMMM D YYYY, HH:mm:ss.SSS';\nexport const ONE_MILLISECOND = 1000;\nexport const ONE_SECOND = 1000 * ONE_MILLISECOND;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const ONE_DAY = 24 * ONE_HOUR;\nexport const DEFAULT_MS_PRECISION = Math.log10(ONE_MILLISECOND);\n\nconst UNIT_STEPS: Array<{ unit: string; microseconds: number; ofPrevious: number }> = [\n { unit: 'd', microseconds: ONE_DAY, ofPrevious: 24 },\n { unit: 'h', microseconds: ONE_HOUR, ofPrevious: 60 },\n { unit: 'm', microseconds: ONE_MINUTE, ofPrevious: 60 },\n { unit: 's', microseconds: ONE_SECOND, ofPrevious: 1000 },\n { unit: 'ms', microseconds: ONE_MILLISECOND, ofPrevious: 1000 },\n { unit: 'μs', microseconds: 1, ofPrevious: 1000 },\n];\n\n/**\n * @param {number} timestamp\n * @param {number} initialTimestamp\n * @param {number} totalDuration\n * @returns {number} 0-100 percentage\n */\nexport function getPercentageOfDuration(duration: number, totalDuration: number) {\n return (duration / totalDuration) * 100;\n}\n\nconst quantizeDuration = (duration: number, floatPrecision: number, conversionFactor: number) =>\n toFloatPrecision(duration / conversionFactor, floatPrecision) * conversionFactor;\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDate(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_DATE_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatTime(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_TIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDatetime(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_DATETIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatMillisecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_MILLISECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asMilliseconds()}ms`;\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in seconds\n */\nexport function formatSecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_SECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asSeconds()}s`;\n}\n\n/**\n * Humanizes the duration for display.\n *\n * Example:\n * 5000ms => 5s\n * 1000μs => 1ms\n * 183840s => 2d 3h\n *\n * @param {number} duration (in microseconds)\n * @return {string} formatted duration\n */\nexport function formatDuration(duration: number): string {\n // Drop all units that are too large except the last one\n const [primaryUnit, secondaryUnit] = _dropWhile(\n UNIT_STEPS,\n ({ microseconds }, index) => index < UNIT_STEPS.length - 1 && microseconds > duration\n );\n\n if (primaryUnit.ofPrevious === 1000) {\n // If the unit is decimal based, display as a decimal\n return `${_round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`;\n }\n\n const primaryValue = Math.floor(duration / primaryUnit.microseconds);\n const primaryUnitString = `${primaryValue}${primaryUnit.unit}`;\n const secondaryValue = Math.round((duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious);\n const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`;\n return secondaryValue === 0 ? primaryUnitString : `${primaryUnitString} ${secondaryUnitString}`;\n}\n\nexport function formatRelativeDate(value: any, fullMonthName = false) {\n const m = moment.isMoment(value) ? value : moment(value);\n const monthFormat = fullMonthName ? 'MMMM' : 'MMM';\n const dt = new Date();\n if (dt.getFullYear() !== m.year()) {\n return m.format(`${monthFormat} D, YYYY`);\n }\n const mMonth = m.month();\n const mDate = m.date();\n const date = dt.getDate();\n if (mMonth === dt.getMonth() && mDate === date) {\n return TODAY;\n }\n dt.setDate(date - 1);\n if (mMonth === dt.getMonth() && mDate === dt.getDate()) {\n return YESTERDAY;\n }\n return m.format(`${monthFormat} D`);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * given a number and a desired precision for the floating\n * side, return the number at the new precision.\n *\n * toFloatPrecision(3.55, 1) // 3.5\n * toFloatPrecision(0.04422, 2) // 0.04\n * toFloatPrecision(6.24e6, 2) // 6240000.00\n *\n * does not support numbers that use \"e\" notation on toString.\n *\n * @param {number} number\n * @param {number} precision\n * @returns {number} number at new floating precision\n */\nexport function toFloatPrecision(number: number, precision: number): number {\n const log10Length = Math.floor(Math.log10(Math.abs(number))) + 1;\n const targetPrecision = precision + log10Length;\n\n if (targetPrecision <= 0) {\n return Math.trunc(number);\n }\n\n return Number(number.toPrecision(targetPrecision));\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\nexport type ViewedBoundsFunctionType = (start: number, end: number) => { start: number; end: number };\n/**\n * Given a range (`min`, `max`) and factoring in a zoom (`viewStart`, `viewEnd`)\n * a function is created that will find the position of a sub-range (`start`, `end`).\n * The calling the generated method will return the result as a `{ start, end }`\n * object with values ranging in [0, 1].\n *\n * @param {number} min The start of the outer range.\n * @param {number} max The end of the outer range.\n * @param {number} viewStart The start of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @param {number} viewEnd The end of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @returns {(number, number) => Object} Created view bounds function\n */\nexport function createViewedBoundsFunc(viewRange: { min: number; max: number; viewStart: number; viewEnd: number }) {\n const { min, max, viewStart, viewEnd } = viewRange;\n const duration = max - min;\n const viewMin = min + viewStart * duration;\n const viewMax = max - (1 - viewEnd) * duration;\n const viewWindow = viewMax - viewMin;\n\n /**\n * View bounds function\n * @param {number} start The start of the sub-range.\n * @param {number} end The end of the sub-range.\n * @returns {Object} The resultant range.\n */\n return (start: number, end: number) => ({\n start: (start - viewMin) / viewWindow,\n end: (end - viewMin) / viewWindow,\n });\n}\n\n/**\n * Returns `true` if the `span` has a tag matching `key` = `value`.\n *\n * @param {string} key The tag key to match on.\n * @param {any} value The tag value to match.\n * @param {{tags}} span An object with a `tags` property of { key, value }\n * items.\n * @returns {boolean} True if a match was found.\n */\nexport function spanHasTag(key: string, value: any, span: TraceSpan) {\n if (!Array.isArray(span.tags) || !span.tags.length) {\n return false;\n }\n return span.tags.some((tag) => tag.key === key && tag.value === value);\n}\n\nexport const isClientSpan = spanHasTag.bind(null, 'span.kind', 'client');\nexport const isServerSpan = spanHasTag.bind(null, 'span.kind', 'server');\n\nconst isErrorBool = spanHasTag.bind(null, 'error', true);\nconst isErrorStr = spanHasTag.bind(null, 'error', 'true');\nexport const isErrorSpan = (span: TraceSpan) => isErrorBool(span) || isErrorStr(span);\n\n/**\n * Returns `true` if at least one of the descendants of the `parentSpanIndex`\n * span contains an error tag.\n *\n * @param {TraceSpan[]} spans The spans for a trace - should be\n * sorted with children following parents.\n * @param {number} parentSpanIndex The index of the parent span - only\n * subsequent spans with depth less than\n * the parent span will be checked.\n * @returns {boolean} Returns `true` if a descendant contains an error tag.\n */\nexport function spanContainsErredSpan(spans: TraceSpan[], parentSpanIndex: number) {\n const { depth } = spans[parentSpanIndex];\n let i = parentSpanIndex + 1;\n for (; i < spans.length && spans[i].depth > depth; i++) {\n if (isErrorSpan(spans[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Expects the first span to be the parent span.\n */\nexport function findServerChildSpan(spans: TraceSpan[]) {\n if (spans.length <= 1 || !isClientSpan(spans[0])) {\n return false;\n }\n const span = spans[0];\n const spanChildDepth = span.depth + 1;\n let i = 1;\n while (i < spans.length && spans[i].depth === spanChildDepth) {\n if (isServerSpan(spans[i])) {\n return spans[i];\n }\n i++;\n }\n return null;\n}\n\nexport const isKindClient = (span: TraceSpan): Boolean =>\n span.tags.some(({ key, value }) => key === 'span.kind' && value === 'client');\n\nexport { formatDuration } from '../utils/date';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TNil } from '../types';\n\nimport { formatDuration } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n Ticks: css`\n label: Ticks;\n pointer-events: none;\n `,\n TicksTick: css`\n label: TicksTick;\n position: absolute;\n height: 100%;\n width: 1px;\n background: ${autoColor(theme, '#d8d8d8')};\n &:last-child {\n width: 0;\n }\n `,\n TicksTickLabel: css`\n label: TicksTickLabel;\n left: 0.25rem;\n position: absolute;\n `,\n TicksTickLabelEndAnchor: css`\n label: TicksTickLabelEndAnchor;\n left: initial;\n right: 0.25rem;\n `,\n };\n};\n\ntype TicksProps = {\n endTime?: number | TNil;\n numTicks: number;\n showLabels?: boolean | TNil;\n startTime?: number | TNil;\n};\n\nexport default function Ticks(props: TicksProps) {\n const { endTime, numTicks, showLabels, startTime } = props;\n\n let labels: undefined | string[];\n if (showLabels) {\n labels = [];\n const viewingDuration = (endTime || 0) - (startTime || 0);\n for (let i = 0; i < numTicks; i++) {\n const durationAtTick = (startTime || 0) + (i / (numTicks - 1)) * viewingDuration;\n labels.push(formatDuration(durationAtTick));\n }\n }\n const styles = useStyles2(getStyles);\n const ticks: React.ReactNode[] = [];\n for (let i = 0; i < numTicks; i++) {\n const portion = i / (numTicks - 1);\n ticks.push(\n \n {labels && (\n = 1 })}>\n {labels[i]}\n \n )}\n \n );\n }\n return
{ticks}
;\n}\n\nTicks.defaultProps = {\n endTime: null,\n showLabels: null,\n startTime: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { ubRelative } from '../uberUtilityStyles';\n\nconst getStyles = () => {\n return {\n flexRow: css`\n display: flex;\n flex: 0 1 auto;\n flex-direction: row;\n `,\n };\n};\n\ntype TTimelineRowProps = {\n children: React.ReactNode;\n className?: string;\n};\n\ninterface TimelineRowCellProps extends React.HTMLAttributes {\n children: React.ReactNode;\n className?: string;\n width: number;\n style?: {};\n}\n\nexport default function TimelineRow(props: TTimelineRowProps) {\n const { children, className = '', ...rest } = props;\n const styles = useStyles2(getStyles);\n return (\n
\n {children}\n
\n );\n}\n\nTimelineRow.defaultProps = {\n className: '',\n};\n\nexport function TimelineRowCell(props: TimelineRowCellProps) {\n const { children, className = '', width, style, ...rest } = props;\n const widthPercent = `${width * 100}%`;\n const mergedStyle = { ...style, flexBasis: widthPercent, maxWidth: widthPercent };\n return (\n
\n {children}\n
\n );\n}\n\nTimelineRowCell.defaultProps = { className: '', style: {} };\n\nTimelineRow.Cell = TimelineRowCell;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n TimelineCollapser: css`\n align-items: center;\n display: flex;\n flex: none;\n justify-content: center;\n margin-right: 0.5rem;\n `,\n };\n};\n\ntype CollapserProps = {\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onExpandOne: () => void;\n onExpandAll: () => void;\n};\n\nexport function TimelineCollapser(props: CollapserProps) {\n const { onExpandAll, onExpandOne, onCollapseAll, onCollapseOne } = props;\n const styles = useStyles2(getStyles);\n return (\n
\n \n \n \n \n
\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// // export default {\n// const updateTypes = {\n// DRAG_END: 'DRAG_END',\n// DRAG_MOVE: 'DRAG_MOVE',\n// DRAG_START: 'DRAG_START',\n// MOUSE_ENTER: 'MOUSE_ENTER',\n// MOUSE_LEAVE: 'MOUSE_LEAVE',\n// MOUSE_MOVE: 'MOUSE_MOVE',\n// };\n\n// const typeUpdateTypes = updateTypes as { [K in keyof typeof updateTypes]: K };\n\nenum EUpdateTypes {\n DragEnd = 'DragEnd',\n DragMove = 'DragMove',\n DragStart = 'DragStart',\n MouseEnter = 'MouseEnter',\n MouseLeave = 'MouseLeave',\n MouseMove = 'MouseMove',\n}\n\nexport default EUpdateTypes;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport { TNil } from '../../types';\n\nimport EUpdateTypes from './EUpdateTypes';\nimport { DraggableBounds, DraggingUpdate } from './types';\n\nconst LEFT_MOUSE_BUTTON = 0;\n\ntype DraggableManagerOptions = {\n getBounds: (tag: string | TNil) => DraggableBounds;\n onMouseEnter?: (update: DraggingUpdate) => void;\n onMouseLeave?: (update: DraggingUpdate) => void;\n onMouseMove?: (update: DraggingUpdate) => void;\n onDragStart?: (update: DraggingUpdate) => void;\n onDragMove?: (update: DraggingUpdate) => void;\n onDragEnd?: (update: DraggingUpdate) => void;\n resetBoundsOnResize?: boolean;\n tag?: string;\n};\n\nexport default class DraggableManager {\n // cache the last known DraggableBounds (invalidate via `#resetBounds())\n _bounds: DraggableBounds | TNil;\n _isDragging: boolean;\n // optional callbacks for various dragging events\n _onMouseEnter: ((update: DraggingUpdate) => void) | TNil;\n _onMouseLeave: ((update: DraggingUpdate) => void) | TNil;\n _onMouseMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragStart: ((update: DraggingUpdate) => void) | TNil;\n _onDragMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragEnd: ((update: DraggingUpdate) => void) | TNil;\n // whether to reset the bounds on window resize\n _resetBoundsOnResize: boolean;\n\n /**\n * Get the `DraggableBounds` for the current drag. The returned value is\n * cached until either `#resetBounds()` is called or the window is resized\n * (assuming `_resetBoundsOnResize` is `true`). The `DraggableBounds` defines\n * the range the current drag can span to. It also establishes the left offset\n * to adjust `clientX` by (from the `MouseEvent`s).\n */\n getBounds: (tag: string | TNil) => DraggableBounds;\n\n // convenience data\n tag: string | TNil;\n\n // handlers for integration with DOM elements\n handleMouseEnter: (event: React.MouseEvent) => void;\n handleMouseMove: (event: React.MouseEvent) => void;\n handleMouseLeave: (event: React.MouseEvent) => void;\n handleMouseDown: (event: React.MouseEvent) => void;\n\n constructor({ getBounds, tag, resetBoundsOnResize = true, ...rest }: DraggableManagerOptions) {\n this.handleMouseDown = this._handleDragEvent;\n this.handleMouseEnter = this._handleMinorMouseEvent;\n this.handleMouseMove = this._handleMinorMouseEvent;\n this.handleMouseLeave = this._handleMinorMouseEvent;\n\n this.getBounds = getBounds;\n this.tag = tag;\n this._isDragging = false;\n this._bounds = undefined;\n this._resetBoundsOnResize = Boolean(resetBoundsOnResize);\n if (this._resetBoundsOnResize) {\n window.addEventListener('resize', this.resetBounds);\n }\n this._onMouseEnter = rest.onMouseEnter;\n this._onMouseLeave = rest.onMouseLeave;\n this._onMouseMove = rest.onMouseMove;\n this._onDragStart = rest.onDragStart;\n this._onDragMove = rest.onDragMove;\n this._onDragEnd = rest.onDragEnd;\n }\n\n _getBounds(): DraggableBounds {\n if (!this._bounds) {\n this._bounds = this.getBounds(this.tag);\n }\n return this._bounds;\n }\n\n _getPosition(clientX: number) {\n const { clientXLeft, maxValue, minValue, width } = this._getBounds();\n let x = clientX - clientXLeft;\n let value = x / width;\n if (minValue != null && value < minValue) {\n value = minValue;\n x = minValue * width;\n } else if (maxValue != null && value > maxValue) {\n value = maxValue;\n x = maxValue * width;\n }\n return { value, x };\n }\n\n _stopDragging() {\n window.removeEventListener('mousemove', this._handleDragEvent);\n window.removeEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = null;\n }\n this._isDragging = false;\n }\n\n isDragging() {\n return this._isDragging;\n }\n\n dispose() {\n if (this._isDragging) {\n this._stopDragging();\n }\n if (this._resetBoundsOnResize) {\n window.removeEventListener('resize', this.resetBounds);\n }\n this._bounds = undefined;\n this._onMouseEnter = undefined;\n this._onMouseLeave = undefined;\n this._onMouseMove = undefined;\n this._onDragStart = undefined;\n this._onDragMove = undefined;\n this._onDragEnd = undefined;\n }\n\n resetBounds = () => {\n this._bounds = undefined;\n };\n\n _handleMinorMouseEvent = (event: React.MouseEvent) => {\n const { button, clientX, type: eventType } = event;\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mouseenter') {\n type = EUpdateTypes.MouseEnter;\n handler = this._onMouseEnter;\n } else if (eventType === 'mouseleave') {\n type = EUpdateTypes.MouseLeave;\n handler = this._onMouseLeave;\n } else if (eventType === 'mousemove') {\n type = EUpdateTypes.MouseMove;\n handler = this._onMouseMove;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n\n _handleDragEvent = (event: MouseEvent | React.MouseEvent) => {\n const { button, clientX, type: eventType } = event;\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mousedown') {\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n window.addEventListener('mousemove', this._handleDragEvent);\n window.addEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = 'none';\n }\n this._isDragging = true;\n\n type = EUpdateTypes.DragStart;\n handler = this._onDragStart;\n } else if (eventType === 'mousemove') {\n if (!this._isDragging) {\n return;\n }\n type = EUpdateTypes.DragMove;\n handler = this._onDragMove;\n } else if (eventType === 'mouseup') {\n if (!this._isDragging) {\n return;\n }\n this._stopDragging();\n type = EUpdateTypes.DragEnd;\n handler = this._onDragEnd;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\n\nexport const getStyles = stylesFactory(() => {\n return {\n TimelineColumnResizer: css`\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n `,\n wrapper: css`\n bottom: 0;\n position: absolute;\n top: 0;\n `,\n dragger: css`\n border-left: 2px solid transparent;\n cursor: col-resize;\n height: 5000px;\n margin-left: -1px;\n position: absolute;\n top: 0;\n width: 1px;\n z-index: 10;\n &:hover {\n border-left: 2px solid rgba(0, 0, 0, 0.3);\n }\n &::before {\n position: absolute;\n top: 0;\n bottom: 0;\n left: -8px;\n right: 0;\n content: ' ';\n }\n `,\n draggerDragging: css`\n background: rgba(136, 0, 136, 0.05);\n width: unset;\n &::before {\n left: -2000px;\n right: -2000px;\n }\n `,\n draggerDraggingLeft: css`\n border-left: 2px solid #808;\n border-right: 1px solid #999;\n `,\n draggerDraggingRight: css`\n border-left: 1px solid #999;\n border-right: 2px solid #808;\n `,\n gripIcon: css`\n position: absolute;\n top: 0;\n bottom: 0;\n &::before,\n &::after {\n border-right: 1px solid #ccc;\n content: ' ';\n height: 9px;\n position: absolute;\n right: 9px;\n top: 25px;\n }\n &::after {\n right: 5px;\n }\n `,\n gripIconDragging: css`\n &::before,\n &::after {\n border-right: 1px solid rgba(136, 0, 136, 0.5);\n }\n `,\n };\n});\n\ntype TimelineColumnResizerProps = {\n min: number;\n max: number;\n onChange: (newSize: number) => void;\n position: number;\n columnResizeHandleHeight: number;\n};\n\ntype TimelineColumnResizerState = {\n dragPosition: number | TNil;\n};\n\nexport default class TimelineColumnResizer extends React.PureComponent<\n TimelineColumnResizerProps,\n TimelineColumnResizerState\n> {\n state: TimelineColumnResizerState;\n\n _dragManager: DraggableManager;\n _rootElm: Element | TNil;\n\n constructor(props: TimelineColumnResizerProps) {\n super(props);\n this._dragManager = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleDragEnd,\n onDragMove: this._handleDragUpdate,\n onDragStart: this._handleDragUpdate,\n });\n this._rootElm = undefined;\n this.state = {\n dragPosition: null,\n };\n }\n\n componentWillUnmount() {\n this._dragManager.dispose();\n }\n\n _setRootElm = (elm: Element | TNil) => {\n this._rootElm = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._rootElm) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._rootElm.getBoundingClientRect();\n const { min, max } = this.props;\n return {\n clientXLeft,\n width,\n maxValue: max,\n minValue: min,\n };\n };\n\n _handleDragUpdate = ({ value }: DraggingUpdate) => {\n this.setState({ dragPosition: value });\n };\n\n _handleDragEnd = ({ manager, value }: DraggingUpdate) => {\n manager.resetBounds();\n this.setState({ dragPosition: null });\n this.props.onChange(value);\n };\n\n render() {\n let left;\n let draggerStyle: React.CSSProperties;\n const { position, columnResizeHandleHeight } = this.props;\n const { dragPosition } = this.state;\n left = `${position * 100}%`;\n const gripStyle = { left };\n let isDraggingLeft = false;\n let isDraggingRight = false;\n const styles = getStyles();\n\n if (this._dragManager.isDragging() && this._rootElm && dragPosition != null) {\n isDraggingLeft = dragPosition < position;\n isDraggingRight = dragPosition > position;\n left = `${dragPosition * 100}%`;\n // Draw a highlight from the current dragged position back to the original\n // position, e.g. highlight the change. Draw the highlight via `left` and\n // `right` css styles (simpler than using `width`).\n const draggerLeft = `${Math.min(position, dragPosition) * 100}%`;\n // subtract 1px for draggerRight to deal with the right border being off\n // by 1px when dragging left\n const draggerRight = `calc(${(1 - Math.max(position, dragPosition)) * 100}% - 1px)`;\n draggerStyle = { left: draggerLeft, right: draggerRight };\n } else {\n draggerStyle = gripStyle;\n }\n draggerStyle.height = columnResizeHandleHeight;\n\n const isDragging = isDraggingLeft || isDraggingRight;\n return (\n
\n \n \n
\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\n// exported for testing\nexport const getStyles = stylesFactory(() => {\n return {\n TimelineViewingLayer: css`\n label: TimelineViewingLayer;\n bottom: 0;\n cursor: vertical-text;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n `,\n TimelineViewingLayerCursorGuide: css`\n label: TimelineViewingLayerCursorGuide;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 1px;\n background-color: red;\n `,\n TimelineViewingLayerDragged: css`\n label: TimelineViewingLayerDragged;\n position: absolute;\n top: 0;\n bottom: 0;\n `,\n TimelineViewingLayerDraggedDraggingLeft: css`\n label: TimelineViewingLayerDraggedDraggingLeft;\n border-left: 1px solid;\n `,\n TimelineViewingLayerDraggedDraggingRight: css`\n label: TimelineViewingLayerDraggedDraggingRight;\n border-right: 1px solid;\n `,\n TimelineViewingLayerDraggedShiftDrag: css`\n label: TimelineViewingLayerDraggedShiftDrag;\n background-color: rgba(68, 68, 255, 0.2);\n border-color: #44f;\n `,\n TimelineViewingLayerDraggedReframeDrag: css`\n label: TimelineViewingLayerDraggedReframeDrag;\n background-color: rgba(255, 68, 68, 0.2);\n border-color: #f44;\n `,\n TimelineViewingLayerFullOverlay: css`\n label: TimelineViewingLayerFullOverlay;\n bottom: 0;\n cursor: col-resize;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n user-select: none;\n `,\n };\n});\n\ntype TimelineViewingLayerProps = {\n /**\n * `boundsInvalidator` is an arbitrary prop that lets the component know the\n * bounds for dragging need to be recalculated. In practice, the name column\n * width serves fine for this.\n */\n boundsInvalidator: any | null | undefined;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n};\n\ntype TDraggingLeftLayout = {\n isDraggingLeft: boolean;\n left: string;\n width: string;\n};\n\ntype TOutOfViewLayout = {\n isOutOfView: true;\n};\n\nfunction isOutOfView(layout: TDraggingLeftLayout | TOutOfViewLayout): layout is TOutOfViewLayout {\n return Reflect.has(layout, 'isOutOfView');\n}\n\n/**\n * Map from a sub range to the greater view range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 0.25 befomes 3/8.\n * @returns {number}\n */\nfunction mapFromViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return viewStart + value * (viewEnd - viewStart);\n}\n\n/**\n * Map a value from the view ([0, 1]) to a sub-range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 3/8 becomes 1/4.\n * @returns {number}\n */\nfunction mapToViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return (value - viewStart) / (viewEnd - viewStart);\n}\n\n/**\n * Get the layout for the \"next\" view range time, e.g. the difference from the\n * drag start and the drag end. This is driven by `shiftStart`, `shiftEnd` or\n * `reframe` on `props.viewRangeTime`, not by the current state of the\n * component. So, it reflects in-progress dragging from the span minimap.\n */\nfunction getNextViewLayout(start: number, position: number): TDraggingLeftLayout | TOutOfViewLayout {\n let [left, right] = start < position ? [start, position] : [position, start];\n if (left >= 1 || right <= 0) {\n return { isOutOfView: true };\n }\n if (left < 0) {\n left = 0;\n }\n if (right > 1) {\n right = 1;\n }\n return {\n isDraggingLeft: start > position,\n left: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n };\n}\n\n/**\n * Render the visual indication of the \"next\" view range.\n */\nfunction getMarkers(viewStart: number, viewEnd: number, from: number, to: number, isShift: boolean): React.ReactNode {\n const mappedFrom = mapToViewSubRange(viewStart, viewEnd, from);\n const mappedTo = mapToViewSubRange(viewStart, viewEnd, to);\n const layout = getNextViewLayout(mappedFrom, mappedTo);\n if (isOutOfView(layout)) {\n return null;\n }\n const { isDraggingLeft, left, width } = layout;\n const styles = getStyles();\n const cls = cx({\n [styles.TimelineViewingLayerDraggedDraggingRight]: !isDraggingLeft,\n [styles.TimelineViewingLayerDraggedReframeDrag]: !isShift,\n [styles.TimelineViewingLayerDraggedShiftDrag]: isShift,\n });\n return (\n \n );\n}\n\n/**\n * `TimelineViewingLayer` is rendered on top of the TimelineHeaderRow time\n * labels; it handles showing the current view range and handles mouse UX for\n * modifying it.\n */\nexport default class TimelineViewingLayer extends React.PureComponent {\n _draggerReframe: DraggableManager;\n _root: Element | TNil;\n\n constructor(props: TimelineViewingLayerProps) {\n super(props);\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseLeave: this._handleReframeMouseLeave,\n onMouseMove: this._handleReframeMouseMove,\n });\n this._root = undefined;\n }\n\n UNSAFE_componentWillReceiveProps(nextProps: TimelineViewingLayerProps) {\n const { boundsInvalidator } = this.props;\n if (boundsInvalidator !== nextProps.boundsInvalidator) {\n this._draggerReframe.resetBounds();\n }\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n }\n\n _setRoot = (elm: Element | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n return { clientXLeft, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRangeTime.current;\n const cursor = mapFromViewSubRange(viewStart, viewEnd, value);\n this.props.updateNextViewRangeTime({ cursor });\n };\n\n _handleReframeMouseLeave = () => {\n this.props.updateNextViewRangeTime({ cursor: undefined });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const [start, end] = shift < anchor ? [shift, anchor] : [anchor, shift];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'timeline-header');\n };\n\n render() {\n const { viewRangeTime } = this.props;\n const { current, cursor, reframe, shiftEnd, shiftStart } = viewRangeTime;\n const [viewStart, viewEnd] = current;\n const haveNextTimeRange = reframe != null || shiftEnd != null || shiftStart != null;\n let cusrorPosition: string | TNil;\n if (!haveNextTimeRange && cursor != null && cursor >= viewStart && cursor <= viewEnd) {\n cusrorPosition = `${mapToViewSubRange(viewStart, viewEnd, cursor) * 100}%`;\n }\n const styles = getStyles();\n return (\n \n {cusrorPosition != null && (\n \n )}\n {reframe != null && getMarkers(viewStart, viewEnd, reframe.anchor, reframe.shift, false)}\n {shiftEnd != null && getMarkers(viewStart, viewEnd, viewEnd, shiftEnd, true)}\n {shiftStart != null && getMarkers(viewStart, viewEnd, viewStart, shiftStart, true)}\n \n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { ubFlex, ubPx2 } from '../../uberUtilityStyles';\nimport Ticks from '../Ticks';\nimport TimelineRow from '../TimelineRow';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\nimport { TimelineCollapser } from './TimelineCollapser';\nimport TimelineColumnResizer from './TimelineColumnResizer';\nimport TimelineViewingLayer from './TimelineViewingLayer';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TimelineHeaderRow: css`\n label: TimelineHeaderRow;\n background: ${autoColor(theme, '#ececec')};\n border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n height: 38px;\n line-height: 38px;\n width: 100%;\n z-index: 4;\n position: relative;\n `,\n TimelineHeaderRowTitle: css`\n label: TimelineHeaderRowTitle;\n flex: 1;\n overflow: hidden;\n margin: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n TimelineHeaderWrapper: css`\n label: TimelineHeaderWrapper;\n align-items: center;\n `,\n };\n};\n\ntype TimelineHeaderRowProps = {\n duration: number;\n nameColumnWidth: number;\n numTicks: number;\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onColummWidthChange: (width: number) => void;\n onExpandAll: () => void;\n onExpandOne: () => void;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n columnResizeHandleHeight: number;\n};\n\nexport default function TimelineHeaderRow(props: TimelineHeaderRowProps) {\n const {\n duration,\n nameColumnWidth,\n numTicks,\n onCollapseAll,\n onCollapseOne,\n onColummWidthChange,\n onExpandAll,\n onExpandOne,\n updateViewRangeTime,\n updateNextViewRangeTime,\n viewRangeTime,\n columnResizeHandleHeight,\n } = props;\n const [viewStart, viewEnd] = viewRangeTime.current;\n const styles = useStyles2(getStyles);\n return (\n \n \n

Service & Operation

\n \n
\n \n \n \n \n \n
\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport memoizeOne from 'memoize-one';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { colors } from '@grafana/ui';\n\n// TS needs the precise return type\nfunction strToRgb(s: string): [number, number, number] {\n if (s.length !== 7) {\n return [0, 0, 0];\n }\n const r = s.slice(1, 3);\n const g = s.slice(3, 5);\n const b = s.slice(5);\n return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)];\n}\n\nclass ColorGenerator {\n colorsHex: string[];\n colorsRgb: Array<[number, number, number]>;\n cache: Map;\n currentIdx: number;\n\n constructor(colorsHex: string[]) {\n this.colorsHex = colorsHex;\n this.colorsRgb = colorsHex.map(strToRgb);\n this.cache = new Map();\n this.currentIdx = 0;\n }\n\n _getColorIndex(key: string): number {\n let i = this.cache.get(key);\n if (i == null) {\n i = this.currentIdx;\n this.cache.set(key, this.currentIdx);\n this.currentIdx = ++this.currentIdx % this.colorsHex.length;\n }\n return i;\n }\n\n /**\n * Will assign a color to an arbitrary key.\n * If the key has been used already, it will\n * use the same color.\n */\n getColorByKey(key: string) {\n const i = this._getColorIndex(key);\n return this.colorsHex[i];\n }\n\n /**\n * Retrieve the RGB values associated with a key. Adds the key and associates\n * it with a color if the key is not recognized.\n * @returns {number[]} An array of three ints [0, 255] representing a color.\n */\n getRgbColorByKey(key: string): [number, number, number] {\n const i = this._getColorIndex(key);\n return this.colorsRgb[i];\n }\n\n clear() {\n this.cache.clear();\n this.currentIdx = 0;\n }\n}\n\nconst getGenerator = memoizeOne((colors: string[]) => {\n return new ColorGenerator(colors);\n});\n\nexport function clear() {\n getGenerator([]);\n}\n\nexport function getColorByKey(key: string, theme: GrafanaTheme2) {\n return getGenerator(colors).getColorByKey(key);\n}\n\nexport function getRgbColorByKey(key: string, theme: GrafanaTheme2): [number, number, number] {\n return getGenerator(colors).getRgbColorByKey(key);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ntype THeightGetter = (index: number) => number;\n\n/**\n * Keeps track of the height and y-position for anything sequenctial where\n * y-positions follow one-after-another and can be derived from the height of\n * the prior entries. The height is known from an accessor function parameter\n * to the methods that require new knowledge the heights.\n *\n * @export\n * @class Positions\n */\nexport default class Positions {\n /**\n * Indicates how far past the explicitly required height or y-values should\n * checked.\n */\n bufferLen: number;\n dataLen: number;\n heights: number[];\n /**\n * `lastI` keeps track of which values have already been visited. In many\n * scenarios, values do not need to be revisited. But, revisiting is required\n * when heights have changed, so `lastI` can be forced.\n */\n lastI: number;\n ys: number[];\n\n constructor(bufferLen: number) {\n this.ys = [];\n this.heights = [];\n this.bufferLen = bufferLen;\n this.dataLen = -1;\n this.lastI = -1;\n }\n\n /**\n * Used to make sure the length of y-values and heights is consistent with\n * the context; in particular `lastI` needs to remain valid.\n */\n profileData(dataLength: number) {\n if (dataLength !== this.dataLen) {\n this.dataLen = dataLength;\n this.ys.length = dataLength;\n this.heights.length = dataLength;\n if (this.lastI >= dataLength) {\n this.lastI = dataLength - 1;\n }\n }\n }\n\n /**\n * Calculate and save the heights and y-values, based on `heightGetter`, from\n * `lastI` until the`max` index; the starting point (`lastI`) can be forced\n * via the `forcedLastI` parameter.\n * @param {number=} forcedLastI\n */\n calcHeights(max: number, heightGetter: THeightGetter, forcedLastI?: number) {\n if (forcedLastI != null) {\n this.lastI = forcedLastI;\n }\n let _max = max + this.bufferLen;\n if (_max <= this.lastI) {\n return;\n }\n if (_max >= this.heights.length) {\n _max = this.heights.length - 1;\n }\n let i = this.lastI;\n if (this.lastI === -1) {\n i = 0;\n this.ys[0] = 0;\n }\n while (i <= _max) {\n // eslint-disable-next-line no-multi-assign\n const h = (this.heights[i] = heightGetter(i));\n this.ys[i + 1] = this.ys[i] + h;\n i++;\n }\n this.lastI = _max;\n }\n\n /**\n * Verify the height and y-values from `lastI` up to `yValue`.\n */\n calcYs(yValue: number, heightGetter: THeightGetter) {\n while ((this.ys[this.lastI] == null || yValue > this.ys[this.lastI]) && this.lastI < this.dataLen - 1) {\n this.calcHeights(this.lastI, heightGetter);\n }\n }\n\n /**\n * Get the latest height for index `_i`. If it's in new terretory\n * (_i > lastI), find the heights (and y-values) leading up to it. If it's in\n * known territory (_i <= lastI) and the height is different than what is\n * known, recalculate subsequent y values, but don't confirm the heights of\n * those items, just update based on the difference.\n */\n confirmHeight(_i: number, heightGetter: THeightGetter) {\n let i = _i;\n if (i > this.lastI) {\n this.calcHeights(i, heightGetter);\n return;\n }\n const h = heightGetter(i);\n if (h === this.heights[i]) {\n return;\n }\n const chg = h - this.heights[i];\n this.heights[i] = h;\n // shift the y positions by `chg` for all known y positions\n while (++i <= this.lastI) {\n this.ys[i] += chg;\n }\n if (this.ys[this.lastI + 1] != null) {\n this.ys[this.lastI + 1] += chg;\n }\n }\n\n /**\n * Given a target y-value (`yValue`), find the closest index (in the `.ys`\n * array) that is prior to the y-value; e.g. map from y-value to index in\n * `.ys`.\n */\n findFloorIndex(yValue: number, heightGetter: THeightGetter): number {\n this.calcYs(yValue, heightGetter);\n\n let imin = 0;\n let imax = this.lastI;\n\n if (this.ys.length < 2 || yValue < this.ys[1]) {\n return 0;\n }\n if (yValue > this.ys[imax]) {\n return imax;\n }\n let i;\n while (imin < imax) {\n // eslint-disable-next-line no-bitwise\n i = (imin + 0.5 * (imax - imin)) | 0;\n if (yValue > this.ys[i]) {\n if (yValue <= this.ys[i + 1]) {\n return i;\n }\n imin = i;\n } else if (yValue < this.ys[i]) {\n if (yValue >= this.ys[i - 1]) {\n return i - 1;\n }\n imax = i;\n } else {\n return i;\n }\n }\n throw new Error(`unable to find floor index for y=${yValue}`);\n }\n\n /**\n * Get the `y` and `height` for a given row.\n *\n * @returns {{ height: number, y: number }}\n */\n getRowPosition(index: number, heightGetter: THeightGetter) {\n this.confirmHeight(index, heightGetter);\n return {\n height: this.heights[index],\n y: this.ys[index],\n };\n }\n\n /**\n * Get the estimated height of the whole shebang by extrapolating based on\n * the average known height.\n */\n getEstimatedHeight(): number {\n const known = this.ys[this.lastI] + this.heights[this.lastI];\n if (this.lastI >= this.dataLen - 1) {\n // eslint-disable-next-line no-bitwise\n return known | 0;\n }\n // eslint-disable-next-line no-bitwise\n return ((known / (this.lastI + 1)) * this.heights.length) | 0;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport { TNil } from '../../types';\n\nimport Positions from './Positions';\n\ntype TWrapperProps = {\n style: React.CSSProperties;\n ref: (elm: HTMLDivElement) => void;\n onScroll?: () => void;\n};\n\n/**\n * @typedef\n */\ntype TListViewProps = {\n /**\n * Number of elements in the list.\n */\n dataLength: number;\n /**\n * Convert item index (number) to the key (string). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getIndexFromKey: (key: string) => number;\n /**\n * Convert item key (string) to the index (number). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getKeyFromIndex: (index: number) => string;\n /**\n * Number of items to draw and add to the DOM, initially.\n */\n initialDraw?: number;\n /**\n * The parent provides fallback height measurements when there is not a\n * rendered element to measure.\n */\n itemHeightGetter: (index: number, key: string) => number;\n /**\n * Function that renders an item; rendered items are added directly to the\n * DOM, they are not wrapped in list item wrapper HTMLElement.\n */\n // itemRenderer(itemKey, style, i, attrs)\n itemRenderer: (\n itemKey: string,\n style: Record,\n index: number,\n attributes: Record\n ) => React.ReactNode;\n /**\n * `className` for the HTMLElement that holds the items.\n */\n itemsWrapperClassName?: string;\n /**\n * When adding new items to the DOM, this is the number of items to add above\n * and below the current view. E.g. if list is 100 items and is scrolled\n * halfway down (so items [46, 55] are in view), then when a new range of\n * items is rendered, it will render items `46 - viewBuffer` to\n * `55 + viewBuffer`.\n */\n viewBuffer: number;\n /**\n * The minimum number of items offscreen in either direction; e.g. at least\n * `viewBuffer` number of items must be off screen above and below the\n * current view, or more items will be rendered.\n */\n viewBufferMin: number;\n /**\n * When `true`, expect `_wrapperElm` to have `overflow: visible` and to,\n * essentially, be tall to the point the entire page will will end up\n * scrolling as a result of the ListView. Similar to react-virtualized\n * window scroller.\n *\n * - Ref: https://bvaughn.github.io/react-virtualized/#/components/WindowScroller\n * - Ref:https://github.com/bvaughn/react-virtualized/blob/497e2a1942529560681d65a9ef9f5e9c9c9a49ba/docs/WindowScroller.md\n */\n windowScroller?: boolean;\n /**\n * You need to pass in scrollElement when windowScroller is set to false.\n * This element is responsible for tracking scrolling for lazy loading.\n */\n scrollElement?: Element;\n};\n\nconst DEFAULT_INITIAL_DRAW = 100;\n\n/**\n * Virtualized list view component, for the most part, only renders the window\n * of items that are in-view with some buffer before and after. Listens for\n * scroll events and updates which items are rendered. See react-virtualized\n * for a suite of components with similar, but generalized, functionality.\n * https://github.com/bvaughn/react-virtualized\n *\n * Note: Presently, ListView cannot be a PureComponent. This is because ListView\n * is sensitive to the underlying state that drives the list items, but it\n * doesn't actually receive that state. So, a render may still be required even\n * if ListView's props are unchanged.\n *\n * @export\n * @class ListView\n */\nexport default class ListView extends React.Component {\n /**\n * Keeps track of the height and y-value of items, by item index, in the\n * ListView.\n */\n _yPositions: Positions;\n /**\n * Keep track of the known / measured heights of the rendered items; populated\n * with values through observation and keyed on the item key, not the item\n * index.\n */\n _knownHeights: Map;\n /**\n * The start index of the items currently drawn.\n */\n _startIndexDrawn: number;\n /**\n * The end index of the items currently drawn.\n */\n _endIndexDrawn: number;\n /**\n * The start index of the items currently in view.\n */\n _startIndex: number;\n /**\n * The end index of the items currently in view.\n */\n _endIndex: number;\n /**\n * Height of the visual window, e.g. height of the scroller element.\n */\n _viewHeight: number;\n /**\n * `scrollTop` of the current scroll position.\n */\n _scrollTop: number;\n /**\n * Used to keep track of whether or not a re-calculation of what should be\n * drawn / viewable has been scheduled.\n */\n _isScrolledOrResized: boolean;\n /**\n * If `windowScroller` is true, this notes how far down the page the scroller\n * is located. (Note: repositioning and below-the-fold views are untested)\n */\n _htmlTopOffset: number;\n _windowScrollListenerAdded: boolean;\n _htmlElm: HTMLElement;\n /**\n * Element holding the scroller.\n */\n _wrapperElm: Element | TNil;\n /**\n * HTMLElement holding the rendered items.\n */\n _itemHolderElm: HTMLElement | TNil;\n\n static defaultProps = {\n initialDraw: DEFAULT_INITIAL_DRAW,\n itemsWrapperClassName: '',\n windowScroller: false,\n };\n\n constructor(props: TListViewProps) {\n super(props);\n\n this._yPositions = new Positions(200);\n // _knownHeights is (item-key -> observed height) of list items\n this._knownHeights = new Map();\n\n this._startIndexDrawn = 2 ** 20;\n this._endIndexDrawn = -(2 ** 20);\n this._startIndex = 0;\n this._endIndex = 0;\n this._viewHeight = -1;\n this._scrollTop = -1;\n this._isScrolledOrResized = false;\n\n this._htmlTopOffset = -1;\n this._windowScrollListenerAdded = false;\n // _htmlElm is only relevant if props.windowScroller is true\n this._htmlElm = document.documentElement as any;\n this._wrapperElm = undefined;\n this._itemHolderElm = undefined;\n }\n\n componentDidMount() {\n if (this.props.windowScroller) {\n if (this._wrapperElm) {\n const { top } = this._wrapperElm.getBoundingClientRect();\n this._htmlTopOffset = top + this._htmlElm.scrollTop;\n }\n window.addEventListener('scroll', this._onScroll);\n this._windowScrollListenerAdded = true;\n } else {\n // The wrapper element should be the one that handles the scrolling. Once we are not using scroll-canvas we can remove this.\n this._wrapperElm = this.props.scrollElement;\n this._wrapperElm?.addEventListener('scroll', this._onScroll);\n }\n }\n\n componentDidUpdate() {\n if (this._itemHolderElm) {\n this._scanItemHeights();\n }\n }\n\n componentWillUnmount() {\n if (this._windowScrollListenerAdded) {\n window.removeEventListener('scroll', this._onScroll);\n } else {\n this._wrapperElm?.removeEventListener('scroll', this._onScroll);\n }\n }\n\n getViewHeight = () => this._viewHeight;\n\n /**\n * Get the index of the item at the bottom of the current view.\n */\n getBottomVisibleIndex = (): number => {\n const bottomY = this._scrollTop + this._viewHeight;\n return this._yPositions.findFloorIndex(bottomY, this._getHeight);\n };\n\n /**\n * Get the index of the item at the top of the current view.\n */\n getTopVisibleIndex = (): number => this._yPositions.findFloorIndex(this._scrollTop, this._getHeight);\n\n getRowPosition = (index: number): { height: number; y: number } =>\n this._yPositions.getRowPosition(index, this._getHeight);\n\n scrollToIndex = (index: number) => {\n // calculate the position of the list view relative to the scroll parent\n const { scrollElement } = this.props;\n const scrollElementTop = scrollElement?.getBoundingClientRect().top || 0;\n const listViewTop = (scrollElement?.scrollTop || 0) + (this._itemHolderElm?.getBoundingClientRect().top || 0);\n const listViewOffset = listViewTop - scrollElementTop;\n\n const itemOffset = this.getRowPosition(index).y;\n\n // hard code a small offset to leave a little bit of space above the focused span, so it is visually clear\n // that there is content above\n this.props.scrollElement?.scrollTo({ top: itemOffset + listViewOffset - 80 });\n };\n\n /**\n * Scroll event listener that schedules a remeasuring of which items should be\n * rendered.\n */\n _onScroll = () => {\n if (!this._isScrolledOrResized) {\n this._isScrolledOrResized = true;\n window.requestAnimationFrame(this._positionList);\n }\n };\n\n /**\n * Returns true is the view height (scroll window) or scroll position have\n * changed.\n */\n _isViewChanged() {\n if (!this._wrapperElm) {\n return false;\n }\n const useRoot = this.props.windowScroller;\n const clientHeight = useRoot ? this._htmlElm.clientHeight : this._wrapperElm.clientHeight;\n const scrollTop = useRoot ? this._htmlElm.scrollTop : this._wrapperElm.scrollTop;\n return clientHeight !== this._viewHeight || scrollTop !== this._scrollTop;\n }\n\n /**\n * Recalculate _startIndex and _endIndex, e.g. which items are in view.\n */\n _calcViewIndexes() {\n const useRoot = this.props.windowScroller;\n // funky if statement is to satisfy flow\n if (!useRoot) {\n /* istanbul ignore next */\n if (!this._wrapperElm) {\n this._viewHeight = -1;\n this._startIndex = 0;\n this._endIndex = 0;\n return;\n }\n this._viewHeight = this._wrapperElm.clientHeight;\n this._scrollTop = this._wrapperElm.scrollTop;\n } else {\n this._viewHeight = window.innerHeight - this._htmlTopOffset;\n this._scrollTop = window.scrollY;\n }\n const yStart = this._scrollTop;\n const yEnd = this._scrollTop + this._viewHeight;\n this._startIndex = this._yPositions.findFloorIndex(yStart, this._getHeight);\n this._endIndex = this._yPositions.findFloorIndex(yEnd, this._getHeight);\n }\n\n /**\n * Checked to see if the currently rendered items are sufficient, if not,\n * force an update to trigger more items to be rendered.\n */\n _positionList = () => {\n this._isScrolledOrResized = false;\n if (!this._wrapperElm) {\n return;\n }\n this._calcViewIndexes();\n // indexes drawn should be padded by at least props.viewBufferMin\n const maxStart = this.props.viewBufferMin > this._startIndex ? 0 : this._startIndex - this.props.viewBufferMin;\n const minEnd =\n this.props.viewBufferMin < this.props.dataLength - this._endIndex\n ? this._endIndex + this.props.viewBufferMin\n : this.props.dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n this.forceUpdate();\n }\n };\n\n _initWrapper = (elm: HTMLElement | TNil) => {\n if (!this.props.windowScroller) {\n return;\n }\n this._wrapperElm = elm;\n if (elm) {\n this._viewHeight = elm.clientHeight;\n }\n };\n\n _initItemHolder = (elm: HTMLElement | TNil) => {\n this._itemHolderElm = elm;\n this._scanItemHeights();\n };\n\n /**\n * Go through all items that are rendered and save their height based on their\n * item-key (which is on a data-* attribute). If any new or adjusted heights\n * are found, re-measure the current known y-positions (via .yPositions).\n */\n _scanItemHeights = () => {\n const getIndexFromKey = this.props.getIndexFromKey;\n if (!this._itemHolderElm) {\n return;\n }\n // note the keys for the first and last altered heights, the `yPositions`\n // needs to be updated\n let lowDirtyKey = null;\n let highDirtyKey = null;\n let isDirty = false;\n // iterating childNodes is faster than children\n // https://jsperf.com/large-htmlcollection-vs-large-nodelist\n const nodes = this._itemHolderElm.childNodes;\n const max = nodes.length;\n for (let i = 0; i < max; i++) {\n const node: HTMLElement = nodes[i] as any;\n // use `.getAttribute(...)` instead of `.dataset` for jest / JSDOM\n const itemKey = node.getAttribute('data-item-key');\n if (!itemKey) {\n // eslint-disable-next-line no-console\n console.warn('itemKey not found');\n continue;\n }\n // measure the first child, if it's available, otherwise the node itself\n // (likely not transferable to other contexts, and instead is specific to\n // how we have the items rendered)\n const measureSrc: Element = node.firstElementChild || node;\n const observed = measureSrc.clientHeight;\n const known = this._knownHeights.get(itemKey);\n if (observed !== known) {\n this._knownHeights.set(itemKey, observed);\n if (!isDirty) {\n isDirty = true;\n // eslint-disable-next-line no-multi-assign\n lowDirtyKey = highDirtyKey = itemKey;\n } else {\n highDirtyKey = itemKey;\n }\n }\n }\n if (lowDirtyKey != null && highDirtyKey != null) {\n // update yPositions, then redraw\n const imin = getIndexFromKey(lowDirtyKey);\n const imax = highDirtyKey === lowDirtyKey ? imin : getIndexFromKey(highDirtyKey);\n this._yPositions.calcHeights(imax, this._getHeight, imin);\n this.forceUpdate();\n }\n };\n\n /**\n * Get the height of the element at index `i`; first check the known heights,\n * fallback to `.props.itemHeightGetter(...)`.\n */\n _getHeight = (i: number) => {\n const key = this.props.getKeyFromIndex(i);\n const known = this._knownHeights.get(key);\n // known !== known iff known is NaN\n // eslint-disable-next-line no-self-compare\n if (known != null && known === known) {\n return known;\n }\n return this.props.itemHeightGetter(i, key);\n };\n\n render() {\n const {\n dataLength,\n getKeyFromIndex,\n initialDraw = DEFAULT_INITIAL_DRAW,\n itemRenderer,\n viewBuffer,\n viewBufferMin,\n } = this.props;\n const heightGetter = this._getHeight;\n const items = [];\n let start;\n let end;\n\n this._yPositions.profileData(dataLength);\n\n if (!this._wrapperElm) {\n start = 0;\n end = (initialDraw < dataLength ? initialDraw : dataLength) - 1;\n } else {\n if (this._isViewChanged()) {\n this._calcViewIndexes();\n }\n const maxStart = viewBufferMin > this._startIndex ? 0 : this._startIndex - viewBufferMin;\n const minEnd = viewBufferMin < dataLength - this._endIndex ? this._endIndex + viewBufferMin : dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n start = viewBuffer > this._startIndex ? 0 : this._startIndex - viewBuffer;\n end = this._endIndex + viewBuffer;\n if (end >= dataLength) {\n end = dataLength - 1;\n }\n } else {\n start = this._startIndexDrawn;\n end = this._endIndexDrawn > dataLength - 1 ? dataLength - 1 : this._endIndexDrawn;\n }\n }\n\n this._yPositions.calcHeights(end, heightGetter, start || -1);\n this._startIndexDrawn = start;\n this._endIndexDrawn = end;\n\n items.length = end - start + 1;\n for (let i = start; i <= end; i++) {\n const { y: top, height } = this._yPositions.getRowPosition(i, heightGetter);\n const style = {\n height,\n top,\n position: 'absolute',\n };\n const itemKey = getKeyFromIndex(i);\n const attrs = { 'data-item-key': itemKey };\n items.push(itemRenderer(itemKey, style, i, attrs));\n }\n const wrapperProps: TWrapperProps = {\n style: { position: 'relative' },\n ref: this._initWrapper,\n };\n if (!this.props.windowScroller) {\n wrapperProps.onScroll = this._onScroll;\n wrapperProps.style.height = '100%';\n wrapperProps.style.overflowY = 'auto';\n }\n const scrollerStyle = {\n position: 'relative' as 'relative',\n height: this._yPositions.getEstimatedHeight(),\n };\n return (\n
\n
\n \n {items}\n
\n
\n \n );\n }\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React from 'react';\n\nimport { TraceSpanReference } from '../types/trace';\n\nimport ExternalLinkContext from './externalLinkContext';\n\ntype ReferenceLinkProps = {\n reference: TraceSpanReference;\n children: React.ReactNode;\n className?: string;\n focusSpan: (spanID: string) => void;\n onClick?: () => void;\n};\n\nexport default function ReferenceLink(props: ReferenceLinkProps) {\n const { reference, children, className, focusSpan, ...otherProps } = props;\n delete otherProps.onClick;\n if (reference.span) {\n return (\n focusSpan(reference.spanID)} className={className} {...otherProps}>\n {children}\n \n );\n }\n\n return (\n \n {(createLinkToExternalSpan) => {\n if (!createLinkToExternalSpan) {\n throw new Error(\"ExternalLinkContext does not have a value, you probably forgot to setup it's provider\");\n }\n\n return (\n \n {children}\n \n );\n }}\n \n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { TraceSpanReference } from '../types/trace';\nimport ReferenceLink from '../url/ReferenceLink';\n\nexport const getStyles = () => {\n return {\n MultiParent: css`\n padding: 0 5px;\n & ~ & {\n margin-left: 5px;\n }\n `,\n TraceRefLink: css`\n display: flex;\n justify-content: space-between;\n `,\n NewWindowIcon: css`\n margin: 0.2em 0 0;\n `,\n tooltip: css`\n max-width: none;\n `,\n };\n};\n\ntype TReferencesButtonProps = {\n references: TraceSpanReference[];\n children: React.ReactNode;\n tooltipText: string;\n focusSpan: (spanID: string) => void;\n};\n\nconst ReferencesButton = (props: TReferencesButtonProps) => {\n const { references, children, tooltipText, focusSpan } = props;\n const styles = useStyles2(getStyles);\n\n // TODO: handle multiple items with some dropdown\n const ref = references[0];\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default ReferencesButton;\n","import React, { ReactElement, useRef } from 'react';\n\nimport { Popover as GrafanaPopover, PopoverController } from '@grafana/ui';\n\nexport type PopoverProps = {\n children: ReactElement;\n content: ReactElement;\n overlayClassName?: string;\n};\n\nexport function Popover({ children, content, overlayClassName }: PopoverProps) {\n const popoverRef = useRef(null);\n\n return (\n \n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {popoverRef.current && (\n \n )}\n\n {React.cloneElement(children, {\n ref: popoverRef,\n onMouseEnter: showPopper,\n onMouseLeave: hidePopper,\n })}\n \n );\n }}\n \n );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport copy from 'copy-to-clipboard';\nimport * as React from 'react';\n\nimport { Button, IconName, stylesFactory, Tooltip } from '@grafana/ui';\n\nconst getStyles = stylesFactory(() => {\n return {\n CopyIcon: css`\n background-color: transparent;\n border: none;\n color: inherit;\n height: 100%;\n overflow: hidden;\n padding: 0px;\n &:focus {\n background-color: rgba(255, 255, 255, 0.25);\n color: inherit;\n }\n `,\n };\n});\n\ntype PropsType = {\n className?: string;\n copyText: string;\n icon?: IconName;\n tooltipTitle: string;\n};\n\ntype StateType = {\n hasCopied: boolean;\n};\n\nexport default class CopyIcon extends React.PureComponent {\n static defaultProps: Partial = {\n className: undefined,\n icon: 'copy',\n };\n\n state = {\n hasCopied: false,\n };\n\n handleClick = () => {\n this.setState({\n hasCopied: true,\n });\n copy(this.props.copyText);\n };\n\n handleTooltipVisibilityChange = (visible: boolean) => {\n if (!visible && this.state.hasCopied) {\n this.setState({\n hasCopied: false,\n });\n }\n };\n\n render() {\n const styles = getStyles();\n return (\n \n \n \n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport CopyIcon from '../../common/CopyIcon';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { ubInlineBlock, uWidth100 } from '../../uberUtilityStyles';\n\nimport jsonMarkup from './jsonMarkup';\n\nconst copyIconClassName = 'copyIcon';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n KeyValueTable: css`\n label: KeyValueTable;\n background: ${autoColor(theme, '#fff')};\n border: 1px solid ${autoColor(theme, '#ddd')};\n margin-bottom: 0.5rem;\n max-height: 450px;\n overflow: auto;\n `,\n body: css`\n label: body;\n vertical-align: baseline;\n `,\n row: css`\n label: row;\n & > td {\n padding: 0rem 0.5rem;\n }\n &:nth-child(2n) > td {\n background: ${autoColor(theme, '#f5f5f5')};\n }\n &:not(:hover) .${copyIconClassName} {\n visibility: hidden;\n }\n `,\n keyColumn: css`\n label: keyColumn;\n color: ${autoColor(theme, '#888')};\n white-space: pre;\n width: 125px;\n `,\n copyColumn: css`\n label: copyColumn;\n text-align: right;\n `,\n linkIcon: css`\n label: linkIcon;\n vertical-align: middle;\n font-weight: bold;\n `,\n };\n};\n\nconst jsonObjectOrArrayStartRegex = /^(\\[|\\{)/;\n\nfunction parseIfComplexJson(value: any) {\n // if the value is a string representing actual json object or array, then use json-markup\n if (typeof value === 'string' && jsonObjectOrArrayStartRegex.test(value)) {\n // otherwise just return as is\n try {\n return JSON.parse(value);\n // eslint-disable-next-line no-empty\n } catch (_) {}\n }\n return value;\n}\n\nexport const LinkValue = (props: { href: string; title?: string; children: React.ReactNode }) => {\n return (\n \n {props.children} \n \n );\n};\n\nLinkValue.defaultProps = {\n title: '',\n};\n\ntype KeyValuesTableProps = {\n data: TraceKeyValuePair[];\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n};\n\nexport default function KeyValuesTable(props: KeyValuesTableProps) {\n const { data, linksGetter } = props;\n const styles = useStyles2(getStyles);\n return (\n
\n \n \n {data.map((row, i) => {\n const markup = {\n __html: jsonMarkup(parseIfComplexJson(row.value)),\n };\n const jsonTable =
;\n const links = linksGetter ? linksGetter(data, i) : null;\n let valueMarkup;\n if (links && links.length) {\n // TODO: handle multiple items\n valueMarkup = (\n
\n \n {jsonTable}\n \n
\n );\n } else {\n valueMarkup = jsonTable;\n }\n return (\n // `i` is necessary in the key because row.key can repeat\n
\n \n \n \n \n );\n })}\n \n
\n {row.key}\n {valueMarkup}\n \n
\n
\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, uTxEllipsis } from '../../uberUtilityStyles';\n\nimport * as markers from './AccordianKeyValues.markers';\nimport KeyValuesTable from './KeyValuesTable';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n label: header;\n cursor: pointer;\n overflow: hidden;\n padding: 0.25em 0.1em;\n text-overflow: ellipsis;\n white-space: nowrap;\n &:hover {\n background: ${autoColor(theme, '#e8e8e8')};\n }\n `,\n headerEmpty: css`\n label: headerEmpty;\n background: none;\n cursor: initial;\n `,\n headerHighContrast: css`\n label: headerHighContrast;\n &:hover {\n background: ${autoColor(theme, '#ddd')};\n }\n `,\n emptyIcon: css`\n label: emptyIcon;\n color: ${autoColor(theme, '#aaa')};\n `,\n summary: css`\n label: summary;\n display: inline;\n list-style: none;\n padding: 0;\n `,\n summaryItem: css`\n label: summaryItem;\n display: inline;\n margin-left: 0.7em;\n padding-right: 0.5rem;\n border-right: 1px solid ${autoColor(theme, '#ddd')};\n &:last-child {\n padding-right: 0;\n border-right: none;\n }\n `,\n summaryLabel: css`\n label: summaryLabel;\n color: ${autoColor(theme, '#777')};\n `,\n summaryDelim: css`\n label: summaryDelim;\n color: ${autoColor(theme, '#bbb')};\n padding: 0 0.2em;\n `,\n };\n};\n\ntype AccordianKeyValuesProps = {\n className?: string | TNil;\n data: TraceKeyValuePair[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n label: string;\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n onToggle?: null | (() => void);\n};\n\n// export for tests\nexport function KeyValuesSummary(props: { data?: TraceKeyValuePair[] }) {\n const { data } = props;\n const styles = useStyles2(getStyles);\n\n if (!Array.isArray(data) || !data.length) {\n return null;\n }\n\n return (\n
    \n {data.map((item, i) => (\n // `i` is necessary in the key because item.key can repeat\n
  • \n {item.key}\n =\n {String(item.value)}\n
  • \n ))}\n
\n );\n}\n\nKeyValuesSummary.defaultProps = {\n data: null,\n};\n\nexport default function AccordianKeyValues(props: AccordianKeyValuesProps) {\n const { className, data, highContrast, interactive, isOpen, label, linksGetter, onToggle } = props;\n const isEmpty = !Array.isArray(data) || !data.length;\n const styles = useStyles2(getStyles);\n const iconCls = cx(uAlignIcon, { [styles.emptyIcon]: isEmpty });\n let arrow: React.ReactNode | null = null;\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? : ;\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n return (\n
\n \n {arrow}\n \n {label}\n {isOpen || ':'}\n \n {!isOpen && }\n
\n {isOpen && }\n \n );\n}\n\nAccordianKeyValues.defaultProps = {\n className: null,\n highContrast: false,\n interactive: true,\n onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const LABEL = 'label';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { sortBy as _sortBy } from 'lodash';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceLog, TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n AccordianLogs: css`\n label: AccordianLogs;\n border: 1px solid ${autoColor(theme, '#d8d8d8')};\n position: relative;\n margin-bottom: 0.25rem;\n `,\n AccordianLogsHeader: css`\n label: AccordianLogsHeader;\n background: ${autoColor(theme, '#e4e4e4')};\n color: inherit;\n display: block;\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#dadada')};\n }\n `,\n AccordianLogsContent: css`\n label: AccordianLogsContent;\n background: ${autoColor(theme, '#f0f0f0')};\n border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n `,\n AccordianLogsFooter: css`\n label: AccordianLogsFooter;\n color: ${autoColor(theme, '#999')};\n `,\n };\n};\n\ntype AccordianLogsProps = {\n interactive?: boolean;\n isOpen: boolean;\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n logs: TraceLog[];\n onItemToggle?: (log: TraceLog) => void;\n onToggle?: () => void;\n openedItems?: Set;\n timestamp: number;\n};\n\nexport default function AccordianLogs(props: AccordianLogsProps) {\n const { interactive, isOpen, linksGetter, logs, openedItems, onItemToggle, onToggle, timestamp } = props;\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? : ;\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n
\n \n {arrow} Logs ({logs.length})\n \n {isOpen && (\n
\n {_sortBy(logs, 'timestamp').map((log, i) => (\n onItemToggle(log) : null}\n />\n ))}\n \n Log timestamps are relative to the start time of the full trace.\n \n
\n )}\n
\n );\n}\n\nAccordianLogs.defaultProps = {\n interactive: true,\n linksGetter: undefined,\n onItemToggle: undefined,\n onToggle: undefined,\n openedItems: undefined,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { groupBy as _groupBy } from 'lodash';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { Popover } from '../common/Popover';\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nimport AccordianLogs from './SpanDetail/AccordianLogs';\nimport { ViewedBoundsFunctionType } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n label: wrapper;\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n overflow: hidden;\n z-index: 0;\n `,\n bar: css`\n label: bar;\n border-radius: 3px;\n min-width: 2px;\n position: absolute;\n height: 36%;\n top: 32%;\n `,\n rpc: css`\n label: rpc;\n position: absolute;\n top: 35%;\n bottom: 35%;\n z-index: 1;\n `,\n label: css`\n label: label;\n color: #aaa;\n font-size: 12px;\n font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n line-height: 1em;\n white-space: nowrap;\n padding: 0 0.5em;\n position: absolute;\n `,\n logMarker: css`\n label: logMarker;\n background-color: ${autoColor(theme, '#2c3235')};\n cursor: pointer;\n height: 60%;\n min-width: 1px;\n position: absolute;\n top: 20%;\n &:hover {\n background-color: ${autoColor(theme, '#464c54')};\n }\n &::before,\n &::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n border: 1px solid transparent;\n }\n &::after {\n left: 0;\n }\n `,\n };\n};\n\ntype Props = {\n color: string;\n onClick?: (evt: React.MouseEvent) => void;\n viewEnd: number;\n viewStart: number;\n getViewedBounds: ViewedBoundsFunctionType;\n rpc:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n }\n | TNil;\n traceStartTime: number;\n span: TraceSpan;\n className?: string;\n labelClassName?: string;\n longLabel: string;\n shortLabel: string;\n};\n\nfunction toPercent(value: number) {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction SpanBar({\n viewEnd,\n viewStart,\n getViewedBounds,\n color,\n shortLabel,\n longLabel,\n onClick,\n rpc,\n traceStartTime,\n span,\n className,\n labelClassName,\n}: Props) {\n const [label, setLabel] = useState(shortLabel);\n const setShortLabel = () => setLabel(shortLabel);\n const setLongLabel = () => setLabel(longLabel);\n\n // group logs based on timestamps\n const logGroups = _groupBy(span.logs, (log) => {\n const posPercent = getViewedBounds(log.timestamp, log.timestamp).start;\n // round to the nearest 0.2%\n return toPercent(Math.round(posPercent * 500) / 500);\n });\n const styles = useStyles2(getStyles);\n\n return (\n \n \n
\n {label}\n
\n \n
\n {Object.keys(logGroups).map((positionKey) => (\n \n }\n >\n
\n \n ))}\n
\n {rpc && (\n \n )}\n
\n );\n}\n\nexport default React.memo(SpanBar);\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { find as _find, get as _get } from 'lodash';\n\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nfunction getFirstAncestor(span: TraceSpan): TraceSpan | TNil {\n return _get(\n _find(\n span.references,\n ({ span: ref, refType }) => ref && ref.spanID && (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM')\n ),\n 'span'\n );\n}\n\nexport default function spanAncestorIds(span: TraceSpan | TNil): string[] {\n const ancestorIDs: string[] = [];\n if (!span) {\n return ancestorIDs;\n }\n let ref = getFirstAncestor(span);\n while (ref) {\n ancestorIDs.push(ref.spanID);\n ref = getFirstAncestor(ref);\n }\n return ancestorIDs;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get } from 'lodash';\nimport React from 'react';\nimport IoChevronRight from 'react-icons/lib/io/chevron-right';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TraceSpan } from '../types/trace';\nimport spanAncestorIds from '../utils/span-ancestor-ids';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n SpanTreeOffset: css`\n label: SpanTreeOffset;\n color: ${autoColor(theme, '#000')};\n position: relative;\n `,\n SpanTreeOffsetParent: css`\n label: SpanTreeOffsetParent;\n &:hover {\n cursor: pointer;\n }\n `,\n indentGuide: css`\n label: indentGuide;\n /* The size of the indentGuide is based off of the iconWrapper */\n padding-right: calc(0.5rem + 12px);\n height: 100%;\n border-left: 3px solid transparent;\n display: inline-flex;\n &::before {\n content: '';\n padding-left: 1px;\n background-color: ${autoColor(theme, 'lightgrey')};\n }\n `,\n indentGuideActive: css`\n label: indentGuideActive;\n border-color: ${autoColor(theme, 'darkgrey')};\n &::before {\n background-color: transparent;\n }\n `,\n iconWrapper: css`\n label: iconWrapper;\n position: absolute;\n right: 0.25rem;\n `,\n };\n});\n\ntype TProps = {\n childrenVisible?: boolean;\n onClick?: () => void;\n span: TraceSpan;\n showChildrenIcon?: boolean;\n\n hoverIndentGuideIds: Set;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n};\n\nexport class UnthemedSpanTreeOffset extends React.PureComponent {\n static displayName = 'UnthemedSpanTreeOffset';\n\n ancestorIds: string[];\n\n static defaultProps = {\n childrenVisible: false,\n showChildrenIcon: true,\n };\n\n constructor(props: TProps) {\n super(props);\n\n this.ancestorIds = spanAncestorIds(props.span);\n // Some traces have multiple root-level spans, this connects them all under one guideline and adds the\n // necessary padding for the collapse icon on root-level spans.\n this.ancestorIds.push('root');\n\n this.ancestorIds.reverse();\n }\n\n /**\n * If the mouse leaves to anywhere except another span with the same ancestor id, this span's ancestor id is\n * removed from the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseleave. Includes the related target which is\n * the element the user is now hovering.\n * @param {string} ancestorId - The span id that the user was hovering over.\n */\n handleMouseLeave = (event: React.MouseEvent, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.removeHoverIndentGuideId(ancestorId);\n }\n };\n\n /**\n * If the mouse entered this span from anywhere except another span with the same ancestor id, this span's\n * ancestorId is added to the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseenter. Includes the related target which is\n * the last element the user was hovering.\n * @param {string} ancestorId - The span id that the user is now hovering over.\n */\n handleMouseEnter = (event: React.MouseEvent, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.addHoverIndentGuideId(ancestorId);\n }\n };\n\n render() {\n const { childrenVisible, onClick, showChildrenIcon, span, theme } = this.props;\n const { hasChildren, spanID } = span;\n const wrapperProps = hasChildren ? { onClick, role: 'switch', 'aria-checked': childrenVisible } : null;\n const icon = showChildrenIcon && hasChildren && (childrenVisible ? : );\n const styles = getStyles(theme);\n return (\n \n {this.ancestorIds.map((ancestorId) => (\n this.handleMouseEnter(event, ancestorId)}\n onMouseLeave={(event) => this.handleMouseLeave(event, ancestorId)}\n />\n ))}\n {icon && (\n this.handleMouseEnter(event, spanID)}\n onMouseLeave={(event) => this.handleMouseLeave(event, spanID)}\n data-test-id=\"icon-wrapper\"\n >\n {icon}\n \n )}\n \n );\n }\n}\n\nexport default withTheme2(UnthemedSpanTreeOffset);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, keyframes } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoAlert from 'react-icons/lib/io/alert';\nimport IoArrowRightA from 'react-icons/lib/io/arrow-right-a';\nimport MdFileUpload from 'react-icons/lib/md/file-upload';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanLinkFunc, TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nimport ReferencesButton from './ReferencesButton';\nimport SpanBar from './SpanBar';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport Ticks from './Ticks';\nimport TimelineRow from './TimelineRow';\nimport { formatDuration, ViewedBoundsFunctionType } from './utils';\n\nconst spanBarClassName = 'spanBar';\nconst spanBarLabelClassName = 'spanBarLabel';\nconst nameWrapperClassName = 'nameWrapper';\nconst nameWrapperMatchingFilterClassName = 'nameWrapperMatchingFilter';\nconst viewClassName = 'jaegerView';\nconst nameColumnClassName = 'nameColumn';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n const animations = {\n flash: keyframes`\n label: flash;\n from {\n background-color: ${autoColor(theme, '#68b9ff')};\n }\n to {\n background-color: default;\n }\n `,\n };\n\n return {\n nameWrapper: css`\n label: nameWrapper;\n line-height: 27px;\n overflow: hidden;\n display: flex;\n `,\n nameWrapperMatchingFilter: css`\n label: nameWrapperMatchingFilter;\n background-color: ${autoColor(theme, '#fffce4')};\n `,\n nameColumn: css`\n label: nameColumn;\n position: relative;\n white-space: nowrap;\n z-index: 1;\n &:hover {\n z-index: 1;\n }\n `,\n endpointName: css`\n label: endpointName;\n color: ${autoColor(theme, '#808080')};\n `,\n view: css`\n label: view;\n position: relative;\n `,\n viewExpanded: css`\n label: viewExpanded;\n background: ${autoColor(theme, '#f8f8f8')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n `,\n viewExpandedAndMatchingFilter: css`\n label: viewExpandedAndMatchingFilter;\n background: ${autoColor(theme, '#fff3d7')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n `,\n row: css`\n label: row;\n &:hover .${spanBarClassName} {\n opacity: 1;\n }\n &:hover .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n &:hover .${nameWrapperClassName} {\n background: #f8f8f8;\n background: linear-gradient(\n 90deg,\n ${autoColor(theme, '#fafafa')},\n ${autoColor(theme, '#f8f8f8')} 75%,\n ${autoColor(theme, '#eee')}\n );\n }\n &:hover .${viewClassName} {\n background-color: ${autoColor(theme, '#f5f5f5')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n }\n `,\n rowClippingLeft: css`\n label: rowClippingLeft;\n & .${nameColumnClassName}::before {\n content: ' ';\n height: 100%;\n position: absolute;\n width: 6px;\n background-image: linear-gradient(\n to right,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(32, 32, 32, 0)')}\n );\n left: 100%;\n z-index: -1;\n }\n `,\n rowClippingRight: css`\n label: rowClippingRight;\n & .${viewClassName}::before {\n content: ' ';\n height: 100%;\n position: absolute;\n width: 6px;\n background-image: linear-gradient(\n to left,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')}\n );\n right: 0%;\n z-index: 1;\n }\n `,\n rowExpanded: css`\n label: rowExpanded;\n & .${spanBarClassName} {\n opacity: 1;\n }\n & .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n & .${nameWrapperClassName}, &:hover .${nameWrapperClassName} {\n background: ${autoColor(theme, '#f0f0f0')};\n box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n }\n & .${nameWrapperMatchingFilterClassName} {\n background: ${autoColor(theme, '#fff3d7')};\n }\n &:hover .${viewClassName} {\n background: ${autoColor(theme, '#eee')};\n }\n `,\n rowMatchingFilter: css`\n label: rowMatchingFilter;\n background-color: ${autoColor(theme, '#fffbde')};\n &:hover .${nameWrapperClassName} {\n background: linear-gradient(\n 90deg,\n ${autoColor(theme, '#fffbde')},\n ${autoColor(theme, '#fffbde')} 75%,\n ${autoColor(theme, '#f7f1c6')}\n );\n }\n &:hover .${viewClassName} {\n background-color: ${autoColor(theme, '#f7f1c6')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n }\n `,\n rowFocused: css`\n label: rowFocused;\n background-color: ${autoColor(theme, '#cbe7ff')};\n animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n & .${nameWrapperClassName}, .${viewClassName}, .${nameWrapperMatchingFilterClassName} {\n background-color: ${autoColor(theme, '#cbe7ff')};\n animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n }\n & .${spanBarClassName} {\n opacity: 1;\n }\n & .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n &:hover .${nameWrapperClassName}, :hover .${viewClassName} {\n background: ${autoColor(theme, '#d5ebff')};\n box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n }\n `,\n\n rowExpandedAndMatchingFilter: css`\n label: rowExpandedAndMatchingFilter;\n &:hover .${viewClassName} {\n background: ${autoColor(theme, '#ffeccf')};\n }\n `,\n\n name: css`\n label: name;\n color: ${autoColor(theme, '#000')};\n cursor: pointer;\n flex: 1 1 auto;\n outline: none;\n overflow: hidden;\n padding-left: 4px;\n padding-right: 0.25em;\n position: relative;\n text-overflow: ellipsis;\n &::before {\n content: ' ';\n position: absolute;\n top: 4px;\n bottom: 4px;\n left: 0;\n border-left: 4px solid;\n border-left-color: inherit;\n }\n\n /* This is so the hit area of the span-name extends the rest of the width of the span-name column */\n &::after {\n background: transparent;\n bottom: 0;\n content: ' ';\n left: 0;\n position: absolute;\n top: 0;\n width: 1000px;\n }\n &:focus {\n text-decoration: none;\n }\n &:hover > small {\n color: ${autoColor(theme, '#000')};\n }\n `,\n nameDetailExpanded: css`\n label: nameDetailExpanded;\n &::before {\n bottom: 0;\n }\n `,\n svcName: css`\n label: svcName;\n padding: 0 0.25rem 0 0.5rem;\n font-size: 1.05em;\n `,\n svcNameChildrenCollapsed: css`\n label: svcNameChildrenCollapsed;\n font-weight: bold;\n font-style: italic;\n `,\n errorIcon: css`\n label: errorIcon;\n border-radius: 6.5px;\n color: ${autoColor(theme, '#fff')};\n font-size: 0.85em;\n margin-right: 0.25rem;\n padding: 1px;\n `,\n rpcColorMarker: css`\n label: rpcColorMarker;\n border-radius: 6.5px;\n display: inline-block;\n font-size: 0.85em;\n height: 1em;\n margin-right: 0.25rem;\n padding: 1px;\n width: 1em;\n vertical-align: middle;\n `,\n labelRight: css`\n label: labelRight;\n left: 100%;\n `,\n labelLeft: css`\n label: labelLeft;\n right: 100%;\n `,\n };\n});\n\ntype SpanBarRowProps = {\n className?: string;\n theme: GrafanaTheme2;\n color: string;\n columnDivision: number;\n isChildrenExpanded: boolean;\n isDetailExpanded: boolean;\n isMatchingFilter: boolean;\n isFocused: boolean;\n onDetailToggled: (spanID: string) => void;\n onChildrenToggled: (spanID: string) => void;\n numTicks: number;\n rpc?:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n operationName: string;\n serviceName: string;\n }\n | TNil;\n noInstrumentedServer?:\n | {\n color: string;\n serviceName: string;\n }\n | TNil;\n showErrorIcon: boolean;\n getViewedBounds: ViewedBoundsFunctionType;\n traceStartTime: number;\n span: TraceSpan;\n focusSpan: (spanID: string) => void;\n hoverIndentGuideIds: Set;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n clippingLeft?: boolean;\n clippingRight?: boolean;\n createSpanLink?: SpanLinkFunc;\n};\n\n/**\n * This was originally a stateless function, but changing to a PureComponent\n * reduced the render time of expanding a span row detail by ~50%. This is\n * even true in the case where the stateless function has the same prop types as\n * this class and arrow functions are created in the stateless function as\n * handlers to the onClick props. E.g. for now, the PureComponent is more\n * performance than the stateless function.\n */\nexport class UnthemedSpanBarRow extends React.PureComponent {\n static displayName = 'UnthemedSpanBarRow';\n static defaultProps: Partial = {\n className: '',\n rpc: null,\n };\n\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n _childrenToggle = () => {\n this.props.onChildrenToggled(this.props.span.spanID);\n };\n\n render() {\n const {\n className,\n color,\n columnDivision,\n isChildrenExpanded,\n isDetailExpanded,\n isMatchingFilter,\n isFocused,\n numTicks,\n rpc,\n noInstrumentedServer,\n showErrorIcon,\n getViewedBounds,\n traceStartTime,\n span,\n focusSpan,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n clippingLeft,\n clippingRight,\n theme,\n createSpanLink,\n } = this.props;\n const {\n duration,\n hasChildren: isParent,\n operationName,\n process: { serviceName },\n } = span;\n const label = formatDuration(duration);\n const viewBounds = getViewedBounds(span.startTime, span.startTime + span.duration);\n const viewStart = viewBounds.start;\n const viewEnd = viewBounds.end;\n const styles = getStyles(theme);\n\n const labelDetail = `${serviceName}::${operationName}`;\n let longLabel;\n let hintClassName;\n if (viewStart > 1 - viewEnd) {\n longLabel = `${labelDetail} | ${label}`;\n hintClassName = styles.labelLeft;\n } else {\n longLabel = `${label} | ${labelDetail}`;\n hintClassName = styles.labelRight;\n }\n\n return (\n \n \n \n \n \n \n {showErrorIcon && (\n \n )}\n {serviceName}{' '}\n {rpc && (\n \n \n {rpc.serviceName}\n \n )}\n {noInstrumentedServer && (\n \n {' '}\n \n {noInstrumentedServer.serviceName}\n \n )}\n \n {rpc ? rpc.operationName : operationName}\n | {label}\n \n {createSpanLink &&\n (() => {\n const link = createSpanLink(span);\n if (link) {\n return (\n {\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && link.onClick) {\n event.preventDefault();\n link.onClick(event);\n }\n }\n : undefined\n }\n >\n {link.content}\n \n );\n } else {\n return null;\n }\n })()}\n\n {span.references && span.references.length > 1 && (\n \n \n \n )}\n {span.subsidiarilyReferencedBy && span.subsidiarilyReferencedBy.length > 0 && (\n \n \n \n )}\n \n \n \n \n \n \n \n );\n }\n}\n\nexport default withTheme2(UnthemedSpanBarRow);\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n Divider: css`\n background: ${autoColor(theme, '#ddd')};\n `,\n\n DividerVertical: css`\n label: DividerVertical;\n display: inline-block;\n width: 1px;\n height: 0.9em;\n margin: 0 8px;\n vertical-align: middle;\n `,\n\n DividerHorizontal: css`\n label: DividerHorizontal;\n display: block;\n height: 1px;\n width: 100%;\n margin: 24px 0;\n clear: both;\n vertical-align: middle;\n position: relative;\n top: -0.06em;\n `,\n };\n};\n\ninterface Props {\n className?: string;\n style?: React.CSSProperties;\n type?: 'vertical' | 'horizontal';\n}\nexport function Divider({ className, style, type }: Props) {\n const styles = useStyles2(getStyles);\n return (\n \n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (divider: boolean) => (theme: GrafanaTheme2) => {\n return {\n LabeledList: css`\n label: LabeledList;\n list-style: none;\n margin: 0;\n padding: 0;\n ${divider === true &&\n `\n margin-right: -8px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n `}\n `,\n LabeledListItem: css`\n label: LabeledListItem;\n display: inline-block;\n ${divider === true &&\n `\n border-right: 1px solid ${autoColor(theme, '#ddd')};\n padding: 0 8px;\n `}\n `,\n LabeledListLabel: css`\n label: LabeledListLabel;\n color: ${theme.isLight ? '#999' : '#666'};\n margin-right: 0.25rem;\n `,\n LabeledListValue: css`\n label: LabeledListValue;\n margin-right: 0.55rem;\n `,\n };\n};\n\ntype LabeledListProps = {\n className?: string;\n divider?: boolean;\n items: Array<{ key: string; label: React.ReactNode; value: React.ReactNode }>;\n};\n\nexport default function LabeledList(props: LabeledListProps) {\n const { className, divider = false, items } = props;\n const styles = useStyles2(getStyles(divider));\n\n return (\n
    \n {items.map(({ key, label, value }) => {\n return (\n
  • \n {label}\n {value}\n
  • \n );\n })}\n
\n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport ReferenceLink from '../../url/ReferenceLink';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n AccordianReferenceItem: css`\n border-bottom: 1px solid ${autoColor(theme, '#d8d8d8')};\n `,\n AccordianKeyValues: css`\n margin-left: 10px;\n `,\n AccordianReferences: css`\n label: AccordianReferences;\n border: 1px solid ${autoColor(theme, '#d8d8d8')};\n position: relative;\n margin-bottom: 0.25rem;\n `,\n AccordianReferencesHeader: css`\n label: AccordianReferencesHeader;\n background: ${autoColor(theme, '#e4e4e4')};\n color: inherit;\n display: block;\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#dadada')};\n }\n `,\n AccordianReferencesContent: css`\n label: AccordianReferencesContent;\n background: ${autoColor(theme, '#f0f0f0')};\n border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n `,\n AccordianReferencesFooter: css`\n label: AccordianReferencesFooter;\n color: ${autoColor(theme, '#999')};\n `,\n ReferencesList: css`\n background: #fff;\n border: 1px solid #ddd;\n margin-bottom: 0.7em;\n max-height: 450px;\n overflow: auto;\n `,\n list: css`\n width: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n background: #fff;\n `,\n itemContent: css`\n padding: 0.25rem 0.5rem;\n display: flex;\n width: 100%;\n justify-content: space-between;\n `,\n item: css`\n &:nth-child(2n) {\n background: #f5f5f5;\n }\n `,\n debugInfo: css`\n letter-spacing: 0.25px;\n margin: 0.5em 0 0;\n flex-wrap: wrap;\n display: flex;\n justify-content: flex-end;\n `,\n debugLabel: css`\n margin: 0 5px 0 5px;\n &::before {\n color: #bbb;\n content: attr(data-label);\n }\n `,\n serviceName: css`\n margin-right: 8px;\n `,\n };\n};\n\ntype AccordianReferencesProps = {\n data: TraceSpanReference[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n openedItems?: Set;\n onItemToggle?: (reference: TraceSpanReference) => void;\n onToggle?: null | (() => void);\n focusSpan: (uiFind: string) => void;\n};\n\ntype ReferenceItemProps = {\n data: TraceSpanReference[];\n interactive?: boolean;\n openedItems?: Set;\n onItemToggle?: (reference: TraceSpanReference) => void;\n focusSpan: (uiFind: string) => void;\n};\n\n// export for test\nexport function References(props: ReferenceItemProps) {\n const { data, focusSpan, openedItems, onItemToggle, interactive } = props;\n const styles = useStyles2(getStyles);\n\n return (\n
\n {data.map((reference, i) => (\n
\n
\n \n \n {reference.span ? (\n \n \n {reference.span.process.serviceName}\n \n {reference.span.operationName}\n \n ) : (\n \n View Linked Span \n \n )}\n \n \n {reference.traceID}\n \n \n {reference.spanID}\n \n \n \n \n
\n {!!reference.tags?.length && (\n
\n onItemToggle(reference) : null}\n />\n
\n )}\n
\n ))}\n
\n );\n}\n\nconst AccordianReferences: React.FC = ({\n data,\n interactive = true,\n isOpen,\n onToggle,\n onItemToggle,\n openedItems,\n focusSpan,\n}) => {\n const isEmpty = !Array.isArray(data) || !data.length;\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? : ;\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n
\n \n {arrow}\n \n References\n {' '}\n ({data.length})\n \n {isOpen && (\n \n )}\n
\n );\n};\n\nexport default React.memo(AccordianReferences);\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n TextList: css`\n max-height: 450px;\n overflow: auto;\n `,\n List: css`\n width: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n `,\n item: css`\n padding: 0.25rem 0.5rem;\n vertical-align: top;\n &:nth-child(2n) {\n background: #f5f5f5;\n }\n `,\n };\n};\n\ntype TextListProps = {\n data: string[];\n};\n\nexport default function TextList(props: TextListProps) {\n const { data } = props;\n const styles = useStyles2(getStyles);\n return (\n
\n
    \n {data.map((row, i) => {\n return (\n // `i` is necessary in the key because row.key can repeat\n
  • \n {row}\n
  • \n );\n })}\n
\n
\n );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { uAlignIcon } from '../../uberUtilityStyles';\n\nimport { getStyles as getAccordianKeyValuesStyles } from './AccordianKeyValues';\nimport TextList from './TextList';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n cursor: pointer;\n overflow: hidden;\n padding: 0.25em 0.1em;\n text-overflow: ellipsis;\n white-space: nowrap;\n &:hover {\n background: ${autoColor(theme, '#e8e8e8')};\n }\n `,\n };\n};\n\ntype AccordianTextProps = {\n className?: string | TNil;\n headerClassName?: string | TNil;\n data: string[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n label: React.ReactNode | string;\n onToggle?: null | (() => void);\n TextComponent?: React.ElementType<{ data: string[] }>;\n};\n\nfunction DefaultTextComponent({ data }: { data: string[] }) {\n return ;\n}\n\nexport default function AccordianText(props: AccordianTextProps) {\n const {\n className,\n data,\n headerClassName,\n interactive,\n isOpen,\n label,\n onToggle,\n TextComponent = DefaultTextComponent,\n } = props;\n const isEmpty = !Array.isArray(data) || !data.length;\n const accordianKeyValuesStyles = useStyles2(getAccordianKeyValuesStyles);\n const iconCls = cx(uAlignIcon, { [accordianKeyValuesStyles.emptyIcon]: isEmpty });\n let arrow: React.ReactNode | null = null;\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? : ;\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n const styles = useStyles2(getStyles);\n return (\n
\n
\n {arrow}\n {label} ({data.length})\n
\n {isOpen && }\n
\n );\n}\n\nAccordianText.defaultProps = {\n className: null,\n highContrast: false,\n interactive: true,\n onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoLink from 'react-icons/lib/io/link';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { DataLinkButton, TextArea, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { Divider } from '../../common/Divider';\nimport LabeledList from '../../common/LabeledList';\nimport { SpanLinkFunc, TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink, TraceLog, TraceSpan, TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubM0, ubMb1, ubMy1, ubTxRightAlign } from '../../uberUtilityStyles';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\nimport AccordianLogs from './AccordianLogs';\nimport AccordianReferences from './AccordianReferences';\nimport AccordianText from './AccordianText';\nimport DetailState from './DetailState';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 0 1rem;\n margin-bottom: 0.25rem;\n `,\n listWrapper: css`\n overflow: hidden;\n `,\n debugInfo: css`\n label: debugInfo;\n display: block;\n letter-spacing: 0.25px;\n margin: 0.5em 0 -0.75em;\n text-align: right;\n `,\n debugLabel: css`\n label: debugLabel;\n &::before {\n color: ${autoColor(theme, '#bbb')};\n content: attr(data-label);\n }\n `,\n debugValue: css`\n label: debugValue;\n background-color: inherit;\n border: none;\n color: ${autoColor(theme, '#888')};\n cursor: pointer;\n &:hover {\n color: ${autoColor(theme, '#333')};\n }\n `,\n AccordianWarnings: css`\n label: AccordianWarnings;\n background: ${autoColor(theme, '#fafafa')};\n border: 1px solid ${autoColor(theme, '#e4e4e4')};\n margin-bottom: 0.25rem;\n `,\n AccordianWarningsHeader: css`\n label: AccordianWarningsHeader;\n background: ${autoColor(theme, '#fff7e6')};\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#ffe7ba')};\n }\n `,\n AccordianWarningsHeaderOpen: css`\n label: AccordianWarningsHeaderOpen;\n border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n `,\n AccordianWarningsLabel: css`\n label: AccordianWarningsLabel;\n color: ${autoColor(theme, '#d36c08')};\n `,\n Textarea: css`\n word-break: break-all;\n white-space: pre;\n `,\n LinkIcon: css`\n font-size: 1.5em;\n `,\n };\n};\n\ntype SpanDetailProps = {\n detailState: DetailState;\n linksGetter: ((links: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n span: TraceSpan;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n focusSpan: (uiFind: string) => void;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n};\n\nexport default function SpanDetail(props: SpanDetailProps) {\n const {\n detailState,\n linksGetter,\n logItemToggle,\n logsToggle,\n processToggle,\n span,\n tagsToggle,\n traceStartTime,\n warningsToggle,\n stackTracesToggle,\n referencesToggle,\n referenceItemToggle,\n focusSpan,\n createSpanLink,\n createFocusSpanLink,\n } = props;\n const {\n isTagsOpen,\n isProcessOpen,\n logs: logsState,\n isWarningsOpen,\n references: referencesState,\n isStackTracesOpen,\n } = detailState;\n const {\n operationName,\n process,\n duration,\n relativeStartTime,\n traceID,\n spanID,\n logs,\n tags,\n warnings,\n references,\n stackTraces,\n } = span;\n const overviewItems = [\n {\n key: 'svc',\n label: 'Service:',\n value: process.serviceName,\n },\n {\n key: 'duration',\n label: 'Duration:',\n value: formatDuration(duration),\n },\n {\n key: 'start',\n label: 'Start Time:',\n value: formatDuration(relativeStartTime),\n },\n ...(span.childSpanCount > 0\n ? [\n {\n key: 'child_count',\n label: 'Child Count:',\n value: span.childSpanCount,\n },\n ]\n : []),\n ];\n const styles = useStyles2(getStyles);\n const link = createSpanLink?.(span);\n const focusSpanLink = createFocusSpanLink(traceID, spanID);\n\n return (\n
\n
\n

{operationName}

\n
\n \n
\n
\n {link ? (\n \n ) : null}\n \n
\n
\n tagsToggle(spanID)}\n />\n {process.tags && (\n processToggle(spanID)}\n />\n )}\n
\n {logs && logs.length > 0 && (\n logsToggle(spanID)}\n onItemToggle={(logItem) => logItemToggle(spanID, logItem)}\n timestamp={traceStartTime}\n />\n )}\n {warnings && warnings.length > 0 && (\n Warnings}\n data={warnings}\n isOpen={isWarningsOpen}\n onToggle={() => warningsToggle(spanID)}\n />\n )}\n {stackTraces && stackTraces.length && (\n {\n let text;\n if (textComponentProps.data?.length > 1) {\n text = textComponentProps.data\n .map((stackTrace, index) => `StackTrace ${index + 1}:\\n${stackTrace}`)\n .join('\\n');\n } else {\n text = textComponentProps.data?.[0];\n }\n return (\n \n );\n }}\n onToggle={() => stackTracesToggle(spanID)}\n />\n )}\n {references && references.length > 0 && (references.length > 1 || references[0].refType !== 'CHILD_OF') && (\n referencesToggle(spanID)}\n onItemToggle={(reference) => referenceItemToggle(spanID, reference)}\n focusSpan={focusSpan}\n />\n )}\n \n {\n // click handling logic copied from react router:\n // https://github.com/remix-run/react-router/blob/997b4d67e506d39ac6571cb369d6d2d6b3dda557/packages/react-router-dom/index.tsx#L392-L394s\n if (\n focusSpanLink.onClick &&\n e.button === 0 && // Ignore everything but left clicks\n (!e.currentTarget.target || e.currentTarget.target === '_self') && // Let browser handle \"target=_blank\" etc.\n !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) // Ignore clicks with modifier keys\n ) {\n e.preventDefault();\n focusSpanLink.onClick(e);\n }\n }}\n >\n \n \n {spanID}\n \n
\n
\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanLinkFunc } from '../types';\nimport { TraceLog, TraceSpan, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\n\nimport SpanDetail from './SpanDetail';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport TimelineRow from './TimelineRow';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n expandedAccent: css`\n cursor: pointer;\n height: 100%;\n overflow: hidden;\n position: absolute;\n width: 100%;\n &::before {\n border-left: 4px solid;\n pointer-events: none;\n width: 1000px;\n }\n &::after {\n border-right: 1000px solid;\n border-color: inherit;\n cursor: pointer;\n opacity: 0.2;\n }\n\n /* border-color inherit must come AFTER other border declarations for accent */\n &::before,\n &::after {\n border-color: inherit;\n content: ' ';\n position: absolute;\n height: 100%;\n }\n\n &:hover::after {\n opacity: 0.35;\n }\n `,\n infoWrapper: css`\n label: infoWrapper;\n border: 1px solid ${autoColor(theme, '#d3d3d3')};\n border-top: 3px solid;\n padding: 0.75rem;\n `,\n };\n});\n\ntype SpanDetailRowProps = {\n color: string;\n columnDivision: number;\n detailState: DetailState;\n onDetailToggled: (spanID: string) => void;\n linksGetter: (span: TraceSpan, links: TraceKeyValuePair[], index: number) => TraceLink[];\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n span: TraceSpan;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n focusSpan: (uiFind: string) => void;\n hoverIndentGuideIds: Set;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n};\n\nexport class UnthemedSpanDetailRow extends React.PureComponent {\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n _linksGetter = (items: TraceKeyValuePair[], itemIndex: number) => {\n const { linksGetter, span } = this.props;\n return linksGetter(span, items, itemIndex);\n };\n\n render() {\n const {\n color,\n columnDivision,\n detailState,\n logItemToggle,\n logsToggle,\n processToggle,\n referenceItemToggle,\n referencesToggle,\n warningsToggle,\n stackTracesToggle,\n span,\n tagsToggle,\n traceStartTime,\n focusSpan,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n theme,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n } = this.props;\n const styles = getStyles(theme);\n return (\n \n \n \n \n \n \n \n \n
\n \n
\n
\n
\n );\n }\n}\n\nexport default withTheme2(UnthemedSpanDetailRow);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\nimport { createRef, RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2, ToolbarButton } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { PEER_SERVICE } from '../constants/tag-keys';\nimport { SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceLog, TraceSpan, Trace, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\nimport { getColorByKey } from '../utils/color-generator';\n\nimport ListView from './ListView';\nimport SpanBarRow from './SpanBarRow';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanDetailRow from './SpanDetailRow';\nimport {\n createViewedBoundsFunc,\n findServerChildSpan,\n isErrorSpan,\n isKindClient,\n spanContainsErredSpan,\n ViewedBoundsFunctionType,\n} from './utils';\n\ntype TExtractUiFindFromStateReturn = {\n uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory(() => {\n return {\n rowsWrapper: css`\n width: 100%;\n `,\n row: css`\n width: 100%;\n `,\n scrollToTopButton: css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n position: fixed;\n bottom: 30px;\n right: 30px;\n z-index: 1;\n `,\n };\n});\n\ntype RowState = {\n isDetail: boolean;\n span: TraceSpan;\n spanIndex: number;\n};\n\ntype TVirtualizedTraceViewOwnProps = {\n currentViewRangeTime: [number, number];\n findMatchesIDs: Set | TNil;\n scrollToFirstVisibleSpan: () => void;\n registerAccessors: (accesors: Accessors) => void;\n trace: Trace;\n focusSpan: (uiFind: string) => void;\n linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n childrenToggle: (spanID: string) => void;\n clearShouldScrollToFirstUiFindMatch: () => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n setSpanNameColumnWidth: (width: number) => void;\n setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n hoverIndentGuideIds: Set;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfExploreViewRef?: RefObject;\n};\n\ntype VirtualizedTraceViewProps = TVirtualizedTraceViewOwnProps & TExtractUiFindFromStateReturn & TTraceTimeline;\n\n// export for tests\nexport const DEFAULT_HEIGHTS = {\n bar: 28,\n detail: 161,\n detailWithLogs: 197,\n};\n\nconst NUM_TICKS = 5;\n\nfunction generateRowStates(\n spans: TraceSpan[] | TNil,\n childrenHiddenIDs: Set,\n detailStates: Map\n): RowState[] {\n if (!spans) {\n return [];\n }\n let collapseDepth = null;\n const rowStates = [];\n for (let i = 0; i < spans.length; i++) {\n const span = spans[i];\n const { spanID, depth } = span;\n let hidden = false;\n if (collapseDepth != null) {\n if (depth >= collapseDepth) {\n hidden = true;\n } else {\n collapseDepth = null;\n }\n }\n if (hidden) {\n continue;\n }\n if (childrenHiddenIDs.has(spanID)) {\n collapseDepth = depth + 1;\n }\n rowStates.push({\n span,\n isDetail: false,\n spanIndex: i,\n });\n if (detailStates.has(spanID)) {\n rowStates.push({\n span,\n isDetail: true,\n spanIndex: i,\n });\n }\n }\n return rowStates;\n}\n\nfunction getClipping(currentViewRange: [number, number]) {\n const [zoomStart, zoomEnd] = currentViewRange;\n return {\n left: zoomStart > 0,\n right: zoomEnd < 1,\n };\n}\n\nfunction generateRowStatesFromTrace(\n trace: Trace | TNil,\n childrenHiddenIDs: Set,\n detailStates: Map\n): RowState[] {\n return trace ? generateRowStates(trace.spans, childrenHiddenIDs, detailStates) : [];\n}\n\nconst memoizedGenerateRowStates = memoizeOne(generateRowStatesFromTrace);\nconst memoizedViewBoundsFunc = memoizeOne(createViewedBoundsFunc, isEqual);\nconst memoizedGetClipping = memoizeOne(getClipping, isEqual);\n\n// export from tests\nexport class UnthemedVirtualizedTraceView extends React.Component {\n listView: ListView | TNil;\n topTraceViewRef = createRef();\n\n constructor(props: VirtualizedTraceViewProps) {\n super(props);\n const { setTrace, trace, uiFind } = props;\n setTrace(trace, uiFind);\n }\n\n componentDidMount() {\n this.scrollToSpan(this.props.focusedSpanId);\n }\n\n shouldComponentUpdate(nextProps: VirtualizedTraceViewProps) {\n // If any prop updates, VirtualizedTraceViewImpl should update.\n const nextPropKeys = Object.keys(nextProps) as Array;\n for (let i = 0; i < nextPropKeys.length; i += 1) {\n if (nextProps[nextPropKeys[i]] !== this.props[nextPropKeys[i]]) {\n // Unless the only change was props.shouldScrollToFirstUiFindMatch changing to false.\n if (nextPropKeys[i] === 'shouldScrollToFirstUiFindMatch') {\n if (nextProps[nextPropKeys[i]]) {\n return true;\n }\n } else {\n return true;\n }\n }\n }\n return false;\n }\n\n componentDidUpdate(prevProps: Readonly) {\n const { registerAccessors, trace } = prevProps;\n const {\n shouldScrollToFirstUiFindMatch,\n clearShouldScrollToFirstUiFindMatch,\n scrollToFirstVisibleSpan,\n registerAccessors: nextRegisterAccessors,\n setTrace,\n trace: nextTrace,\n uiFind,\n focusedSpanId,\n focusedSpanIdForSearch,\n } = this.props;\n\n if (trace !== nextTrace) {\n setTrace(nextTrace, uiFind);\n }\n\n if (this.listView && registerAccessors !== nextRegisterAccessors) {\n nextRegisterAccessors(this.getAccessors());\n }\n\n if (shouldScrollToFirstUiFindMatch) {\n scrollToFirstVisibleSpan();\n clearShouldScrollToFirstUiFindMatch();\n }\n\n if (focusedSpanId !== prevProps.focusedSpanId) {\n this.scrollToSpan(focusedSpanId);\n }\n\n if (focusedSpanIdForSearch !== prevProps.focusedSpanIdForSearch) {\n this.scrollToSpan(focusedSpanIdForSearch);\n }\n }\n\n getRowStates(): RowState[] {\n const { childrenHiddenIDs, detailStates, trace } = this.props;\n return memoizedGenerateRowStates(trace, childrenHiddenIDs, detailStates);\n }\n\n getClipping(): { left: boolean; right: boolean } {\n const { currentViewRangeTime } = this.props;\n return memoizedGetClipping(currentViewRangeTime);\n }\n\n getViewedBounds(): ViewedBoundsFunctionType {\n const { currentViewRangeTime, trace } = this.props;\n const [zoomStart, zoomEnd] = currentViewRangeTime;\n\n return memoizedViewBoundsFunc({\n min: trace.startTime,\n max: trace.endTime,\n viewStart: zoomStart,\n viewEnd: zoomEnd,\n });\n }\n\n getAccessors() {\n const lv = this.listView;\n if (!lv) {\n throw new Error('ListView unavailable');\n }\n return {\n getViewRange: this.getViewRange,\n getSearchedSpanIDs: this.getSearchedSpanIDs,\n getCollapsedChildren: this.getCollapsedChildren,\n getViewHeight: lv.getViewHeight,\n getBottomRowIndexVisible: lv.getBottomVisibleIndex,\n getTopRowIndexVisible: lv.getTopVisibleIndex,\n getRowPosition: lv.getRowPosition,\n mapRowIndexToSpanIndex: this.mapRowIndexToSpanIndex,\n mapSpanIndexToRowIndex: this.mapSpanIndexToRowIndex,\n };\n }\n\n getViewRange = () => this.props.currentViewRangeTime;\n\n getSearchedSpanIDs = () => this.props.findMatchesIDs;\n\n getCollapsedChildren = () => this.props.childrenHiddenIDs;\n\n mapRowIndexToSpanIndex = (index: number) => this.getRowStates()[index].spanIndex;\n\n mapSpanIndexToRowIndex = (index: number) => {\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { spanIndex } = this.getRowStates()[i];\n if (spanIndex === index) {\n return i;\n }\n }\n throw new Error(`unable to find row for span index: ${index}`);\n };\n\n setListView = (listView: ListView | TNil) => {\n const isChanged = this.listView !== listView;\n this.listView = listView;\n if (listView && isChanged) {\n this.props.registerAccessors(this.getAccessors());\n }\n };\n\n // use long form syntax to avert flow error\n // https://github.com/facebook/flow/issues/3076#issuecomment-290944051\n getKeyFromIndex = (index: number) => {\n const { isDetail, span } = this.getRowStates()[index];\n return `${span.traceID}--${span.spanID}--${isDetail ? 'detail' : 'bar'}`;\n };\n\n getIndexFromKey = (key: string) => {\n const parts = key.split('--');\n const _traceID = parts[0];\n const _spanID = parts[1];\n const _isDetail = parts[2] === 'detail';\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { span, isDetail } = this.getRowStates()[i];\n if (span.spanID === _spanID && span.traceID === _traceID && isDetail === _isDetail) {\n return i;\n }\n }\n return -1;\n };\n\n getRowHeight = (index: number) => {\n const { span, isDetail } = this.getRowStates()[index];\n if (!isDetail) {\n return DEFAULT_HEIGHTS.bar;\n }\n if (Array.isArray(span.logs) && span.logs.length) {\n return DEFAULT_HEIGHTS.detailWithLogs;\n }\n return DEFAULT_HEIGHTS.detail;\n };\n\n renderRow = (key: string, style: React.CSSProperties, index: number, attrs: {}) => {\n const { isDetail, span, spanIndex } = this.getRowStates()[index];\n return isDetail\n ? this.renderSpanDetailRow(span, key, style, attrs)\n : this.renderSpanBarRow(span, spanIndex, key, style, attrs);\n };\n\n scrollToSpan = (spanID?: string) => {\n if (spanID == null) {\n return;\n }\n const i = this.getRowStates().findIndex((row) => row.span.spanID === spanID);\n if (i >= 0) {\n this.listView?.scrollToIndex(i);\n }\n };\n\n renderSpanBarRow(span: TraceSpan, spanIndex: number, key: string, style: React.CSSProperties, attrs: {}) {\n const { spanID } = span;\n const { serviceName } = span.process;\n const {\n childrenHiddenIDs,\n childrenToggle,\n detailStates,\n detailToggle,\n findMatchesIDs,\n spanNameColumnWidth,\n trace,\n focusSpan,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n theme,\n createSpanLink,\n focusedSpanId,\n focusedSpanIdForSearch,\n } = this.props;\n // to avert flow error\n if (!trace) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const isCollapsed = childrenHiddenIDs.has(spanID);\n const isDetailExpanded = detailStates.has(spanID);\n const isMatchingFilter = findMatchesIDs ? findMatchesIDs.has(spanID) : false;\n const isFocused = spanID === focusedSpanId || spanID === focusedSpanIdForSearch;\n const showErrorIcon = isErrorSpan(span) || (isCollapsed && spanContainsErredSpan(trace.spans, spanIndex));\n\n // Check for direct child \"server\" span if the span is a \"client\" span.\n let rpc = null;\n if (isCollapsed) {\n const rpcSpan = findServerChildSpan(trace.spans.slice(spanIndex));\n if (rpcSpan) {\n const rpcViewBounds = this.getViewedBounds()(rpcSpan.startTime, rpcSpan.startTime + rpcSpan.duration);\n rpc = {\n color: getColorByKey(rpcSpan.process.serviceName, theme),\n operationName: rpcSpan.operationName,\n serviceName: rpcSpan.process.serviceName,\n viewEnd: rpcViewBounds.end,\n viewStart: rpcViewBounds.start,\n };\n }\n }\n\n const peerServiceKV = span.tags.find((kv) => kv.key === PEER_SERVICE);\n // Leaf, kind == client and has peer.service.tag, is likely a client span that does a request\n // to an uninstrumented/external service\n let noInstrumentedServer = null;\n if (!span.hasChildren && peerServiceKV && isKindClient(span)) {\n noInstrumentedServer = {\n serviceName: peerServiceKV.value,\n color: getColorByKey(peerServiceKV.value, theme),\n };\n }\n\n const styles = getStyles();\n return (\n
\n \n
\n );\n }\n\n renderSpanDetailRow(span: TraceSpan, key: string, style: React.CSSProperties, attrs: {}) {\n const { spanID } = span;\n const { serviceName } = span.process;\n const {\n detailLogItemToggle,\n detailLogsToggle,\n detailProcessToggle,\n detailReferencesToggle,\n detailReferenceItemToggle,\n detailWarningsToggle,\n detailStackTracesToggle,\n detailStates,\n detailTagsToggle,\n detailToggle,\n spanNameColumnWidth,\n trace,\n focusSpan,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n linksGetter,\n theme,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n } = this.props;\n const detailState = detailStates.get(spanID);\n if (!trace || !detailState) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const styles = getStyles();\n return (\n
\n \n
\n );\n }\n\n scrollToTop = () => {\n const { topOfExploreViewRef } = this.props;\n topOfExploreViewRef?.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n render() {\n const styles = getStyles();\n const { scrollElement } = this.props;\n return (\n <>\n \n\n \n \n );\n }\n}\n\nexport default withTheme2(UnthemedVirtualizedTraceView);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const HTTP_METHOD = 'http.method' as 'http.method';\nexport const PEER_SERVICE = 'peer.service' as 'peer.service';\nexport const SPAN_KIND = 'span.kind' as 'span.kind';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React, { RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { autoColor } from '../Theme';\nimport { merge as mergeShortcuts } from '../keyboard-shortcuts';\nimport { SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceSpan, Trace, TraceLog, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\nimport ExternalLinkContext from '../url/externalLinkContext';\n\nimport TimelineHeaderRow from './TimelineHeaderRow';\nimport VirtualizedTraceView from './VirtualizedTraceView';\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from './types';\n\ntype TExtractUiFindFromStateReturn = {\n uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n TraceTimelineViewer: css`\n label: TraceTimelineViewer;\n border-bottom: 1px solid ${autoColor(theme, '#bbb')};\n\n & .json-markup {\n line-height: 17px;\n font-size: 13px;\n font-family: monospace;\n white-space: pre-wrap;\n }\n\n & .json-markup-key {\n font-weight: bold;\n }\n\n & .json-markup-bool {\n color: ${autoColor(theme, 'firebrick')};\n }\n\n & .json-markup-string {\n color: ${autoColor(theme, 'teal')};\n }\n\n & .json-markup-null {\n color: ${autoColor(theme, 'teal')};\n }\n\n & .json-markup-number {\n color: ${autoColor(theme, 'blue', 'black')};\n }\n `,\n };\n});\n\ntype TProps = TExtractUiFindFromStateReturn & {\n registerAccessors: (accessors: Accessors) => void;\n findMatchesIDs: Set | TNil;\n scrollToFirstVisibleSpan: () => void;\n traceTimeline: TTraceTimeline;\n trace: Trace;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRange: ViewRange;\n focusSpan: (uiFind: string) => void;\n createLinkToExternalSpan: (traceID: string, spanID: string) => string;\n\n setSpanNameColumnWidth: (width: number) => void;\n collapseAll: (spans: TraceSpan[]) => void;\n collapseOne: (spans: TraceSpan[]) => void;\n expandAll: () => void;\n expandOne: (spans: TraceSpan[]) => void;\n\n childrenToggle: (spanID: string) => void;\n clearShouldScrollToFirstUiFindMatch: () => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfExploreViewRef?: RefObject;\n};\n\ntype State = {\n // Will be set to real height of the component so it can be passed down to size some other elements.\n height: number;\n};\n\nconst NUM_TICKS = 5;\n\n/**\n * `TraceTimelineViewer` now renders the header row because it is sensitive to\n * `props.viewRange.time.cursor`. If `VirtualizedTraceView` renders it, it will\n * re-render the ListView every time the cursor is moved on the trace minimap\n * or `TimelineHeaderRow`.\n */\nexport class UnthemedTraceTimelineViewer extends React.PureComponent {\n constructor(props: TProps) {\n super(props);\n this.state = { height: 0 };\n }\n\n componentDidMount() {\n mergeShortcuts({\n collapseAll: this.collapseAll,\n expandAll: this.expandAll,\n collapseOne: this.collapseOne,\n expandOne: this.expandOne,\n });\n }\n\n collapseAll = () => {\n this.props.collapseAll(this.props.trace.spans);\n };\n\n collapseOne = () => {\n this.props.collapseOne(this.props.trace.spans);\n };\n\n expandAll = () => {\n this.props.expandAll();\n };\n\n expandOne = () => {\n this.props.expandOne(this.props.trace.spans);\n };\n\n render() {\n const {\n setSpanNameColumnWidth,\n updateNextViewRangeTime,\n updateViewRangeTime,\n viewRange,\n createLinkToExternalSpan,\n traceTimeline,\n theme,\n topOfExploreViewRef,\n focusedSpanIdForSearch,\n ...rest\n } = this.props;\n const { trace } = rest;\n const styles = getStyles(theme);\n\n return (\n \n ref && this.setState({ height: ref.getBoundingClientRect().height })}\n >\n \n \n \n \n );\n }\n}\n\nexport default withTheme2(UnthemedTraceTimelineViewer);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoAndroidOpen from 'react-icons/lib/io/android-open';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n return {\n NewWindowIconLarge: css`\n label: NewWindowIconLarge;\n font-size: 1.5em;\n `,\n };\n};\n\ntype Props = {\n isLarge?: boolean;\n className?: string;\n};\n\nexport default function NewWindowIcon(props: Props) {\n const { isLarge, className, ...rest } = props;\n const styles = useStyles2(getStyles);\n const cls = cx({ [styles.NewWindowIconLarge]: isLarge }, className);\n return ;\n}\n\nNewWindowIcon.defaultProps = {\n isLarge: false,\n};\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport NewWindowIcon from './NewWindowIcon';\n\ntype Link = {\n text: string;\n url: string;\n};\n\ntype ExternalLinksProps = {\n links: Link[];\n className?: string;\n};\n\nconst LinkValue = (props: { href: string; title?: string; children?: React.ReactNode; className?: string }) => (\n \n {props.children} \n \n);\n\nexport default function ExternalLinks(props: ExternalLinksProps) {\n const { links } = props;\n // TODO: handle multiple items\n return ;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const FALLBACK_DAG_MAX_NUM_SERVICES = 100 as 100;\nexport const FALLBACK_TRACE_NAME = '' as '';\n\nexport const FETCH_DONE = 'FETCH_DONE' as 'FETCH_DONE';\nexport const FETCH_ERROR = 'FETCH_ERROR' as 'FETCH_ERROR';\nexport const FETCH_LOADING = 'FETCH_LOADING' as 'FETCH_LOADING';\n\nexport const fetchedState = {\n DONE: FETCH_DONE,\n ERROR: FETCH_ERROR,\n LOADING: FETCH_LOADING,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n BreakableText: css`\n label: BreakableText;\n display: inline-block;\n white-space: pre;\n `,\n };\n};\n\nconst WORD_RX = /\\W*\\w+\\W*/g;\n\ntype Props = {\n text: string;\n className?: string;\n wordRegexp?: RegExp;\n};\n\n// TODO typescript doesn't understand text or null as react nodes\n// https://github.com/Microsoft/TypeScript/issues/21699\nexport default function BreakableText(\n props: Props\n): any /* React.ReactNode /* React.ReactElement | React.ReactElement[] \\*\\/ */ {\n const { className, text, wordRegexp = WORD_RX } = props;\n const styles = useStyles2(getStyles);\n if (!text) {\n return typeof text === 'string' ? text : null;\n }\n const spans = [];\n wordRegexp.exec('');\n // if the given text has no words, set the first match to the entire text\n let match: RegExpExecArray | string[] | null = wordRegexp.exec(text) || [text];\n while (match) {\n spans.push(\n \n {match[0]}\n \n );\n match = wordRegexp.exec(text);\n }\n return spans;\n}\n\nBreakableText.defaultProps = {\n wordRegexp: WORD_RX,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { FALLBACK_TRACE_NAME } from '../constants';\nimport { TNil } from '../types';\n\nimport BreakableText from './BreakableText';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TraceName: css`\n label: TraceName;\n font-size: ${theme.typography.size.lg};\n `,\n };\n};\n\ntype Props = {\n className?: string;\n traceName?: string | TNil;\n};\n\nexport default function TraceName(props: Props) {\n const { className, traceName } = props;\n const styles = useStyles2(getStyles);\n const text = String(traceName || FALLBACK_TRACE_NAME);\n const title = ;\n return {title};\n}\n","// \nvar hasOwn = function hasOwn(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n};\n\nfunction deepEquals(equals, deepObjects) {\n function deep(valueA, valueB) {\n if (equals(valueA, valueB)) {\n return true;\n }\n\n if (Array.isArray(valueA)) {\n if (!Array.isArray(valueB) || valueA.length !== valueB.length) {\n return false;\n } // Check deep equality of each value in A against the same indexed value in B\n\n\n if (!valueA.every(function (value, index) {\n return deep(value, valueB[index]);\n })) {\n return false;\n } // could not find unequal items\n\n\n return true;\n }\n\n if (Array.isArray(valueB)) {\n return false;\n }\n\n if (typeof valueA === \"object\") {\n if (typeof valueB !== \"object\") {\n return false;\n }\n\n var isANull = valueA === null;\n var isBNull = valueB === null;\n\n if (isANull || isBNull) {\n return isANull === isBNull;\n }\n\n var aKeys = Object.keys(valueA);\n var bKeys = Object.keys(valueB);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n } // Should we compare with shallow equivalence or deep equivalence?\n\n\n var equalityChecker = deepObjects ? deep : equals; // Check if objects share same keys, and each of those keys are equal\n\n if (!aKeys.every(function (aKey) {\n return hasOwn(valueA, aKey) && hasOwn(valueB, aKey) && equalityChecker(valueA[aKey], valueB[aKey]);\n })) {\n return false;\n } // could not find unequal keys or values\n\n\n return true;\n }\n\n return false;\n }\n\n return deep;\n}\n\n// \nvar findIndex = function findIndex(arr, fn) {\n for (var i = 0; i < arr.length; i++) {\n if (fn(arr[i])) {\n return i;\n }\n }\n\n return -1;\n};\n\nfunction lruCache(limit, equals) {\n var entries = [];\n\n function get(key) {\n var cacheIndex = findIndex(entries, function (entry) {\n return equals(key, entry.key);\n }); // We found a cached entry\n\n if (cacheIndex > -1) {\n var entry = entries[cacheIndex]; // Cached entry not at top of cache, move it to the top\n\n if (cacheIndex > 0) {\n entries.splice(cacheIndex, 1);\n entries.unshift(entry);\n }\n\n return entry.value;\n } // No entry found in cache, return null\n\n\n return undefined;\n }\n\n function put(key, value) {\n if (!get(key)) {\n entries.unshift({\n key: key,\n value: value\n });\n\n if (entries.length > limit) {\n entries.pop();\n }\n }\n }\n\n return {\n get: get,\n put: put\n };\n}\n\n// \nfunction singletonCache(equals) {\n var entry;\n return {\n get: function get(key) {\n if (entry && equals(key, entry.key)) {\n return entry.value;\n }\n },\n put: function put(key, value) {\n entry = {\n key: key,\n value: value\n };\n }\n };\n}\n\n// \n\nfunction createCache(limit, equals) {\n return limit === 1 ? singletonCache(equals) : lruCache(limit, equals);\n}\n\nfunction createEqualsFn(basicEquals, deepObjects) {\n // Choose strategy for basic or deep object equals\n var equals = deepObjects ? deepEquals(basicEquals, deepObjects) : basicEquals;\n return function (valueA, valueB) {\n // The arguments are always the argument array-like objects\n // Different lengths means they are not the same\n if (valueA.length !== valueB.length) {\n return false;\n } // Compare the values\n\n\n for (var index = 0; index < valueA.length; index += 1) {\n if (!equals(valueA[index], valueB[index])) {\n return false;\n }\n } // Found no conflicts\n\n\n return true;\n };\n}\n\nfunction memoize() {\n var limit = 1;\n\n var equals = function equals(valueA, valueB) {\n return valueA === valueB;\n };\n\n var deepObjects = false;\n\n for (var _len = arguments.length, config = new Array(_len), _key = 0; _key < _len; _key++) {\n config[_key] = arguments[_key];\n }\n\n if (typeof config[0] === \"number\") {\n limit = config.shift();\n }\n\n if (typeof config[0] === \"function\") {\n equals = config.shift();\n } else if (typeof config[0] === \"undefined\") {\n // Support passing undefined equal argument;\n config.shift();\n }\n\n if (typeof config[0] === \"boolean\") {\n deepObjects = config[0];\n }\n\n var cache = createCache(limit, createEqualsFn(equals, deepObjects));\n return function (fn) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var value = cache.get(args);\n\n if (value === undefined) {\n value = fn.apply(fn, args);\n cache.put(args, value);\n }\n\n return value;\n };\n };\n}\n\nexport default memoize;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport deepFreeze from 'deep-freeze';\n\nimport { FALLBACK_DAG_MAX_NUM_SERVICES } from './index';\n\nexport default deepFreeze(\n Object.defineProperty(\n {\n archiveEnabled: false,\n dependencies: {\n dagMaxNumServices: FALLBACK_DAG_MAX_NUM_SERVICES,\n menuEnabled: true,\n },\n linkPatterns: [],\n menu: [\n {\n label: 'About Jaeger',\n items: [\n {\n label: 'GitHub',\n url: 'https://github.com/uber/jaeger',\n },\n {\n label: 'Docs',\n url: 'http://jaeger.readthedocs.io/en/latest/',\n },\n {\n label: 'Twitter',\n url: 'https://twitter.com/JaegerTracing',\n },\n {\n label: 'Discussion Group',\n url: 'https://groups.google.com/forum/#!forum/jaeger-tracing',\n },\n {\n label: 'Gitter.im',\n url: 'https://gitter.im/jaegertracing/Lobby',\n },\n {\n label: 'Blog',\n url: 'https://medium.com/jaegertracing/',\n },\n ],\n },\n ],\n search: {\n maxLookback: {\n label: '2 Days',\n value: '2d',\n },\n maxLimit: 1500,\n },\n tracking: {\n gaID: null,\n trackErrors: true,\n },\n },\n // fields that should be individually merged vs wholesale replaced\n '__mergeFields',\n { value: ['dependencies', 'search', 'tracking'] }\n )\n);\n\nexport const deprecations = [\n {\n formerKey: 'dependenciesMenuEnabled',\n currentKey: 'dependencies.menuEnabled',\n },\n {\n formerKey: 'gaTrackingID',\n currentKey: 'tracking.gaID',\n },\n];\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport defaultConfig from '../../constants/default-config';\n\n/**\n * Merge the embedded config from the query service (if present) with the\n * default config from `../../constants/default-config`.\n */\nexport default function getConfig() {\n return defaultConfig;\n}\n\nexport function getConfigValue(path: string) {\n return _get(getConfig(), path);\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\n/**\n * Searches the span.references to find 'CHILD_OF' reference type or returns null.\n * @param {TraceSpan} span The span whose parent is to be returned.\n * @returns {TraceSpan|null} The parent span if there is one, null otherwise.\n */\nexport function getParent(span: TraceSpan) {\n const parentRef = span.references ? span.references.find((ref) => ref.refType === 'CHILD_OF') : null;\n return parentRef ? parentRef.span : null;\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { uniq as _uniq } from 'lodash';\nimport memoize from 'lru-memoize';\n\nimport { TNil } from '../types';\nimport { TraceSpan, TraceLink, TraceKeyValuePair, Trace } from '../types/trace';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getParent } from './span';\n\nconst parameterRegExp = /#\\{([^{}]*)\\}/g;\n\ntype ProcessedTemplate = {\n parameters: string[];\n template: (template: { [key: string]: any }) => string;\n};\n\ntype ProcessedLinkPattern = {\n object: any;\n type: (link: string) => boolean;\n key: (link: string) => boolean;\n value: (value: any) => boolean;\n url: ProcessedTemplate;\n text: ProcessedTemplate;\n parameters: string[];\n};\n\ntype TLinksRV = Array<{ url: string; text: string }>;\n\nfunction getParamNames(str: string) {\n const names = new Set();\n str.replace(parameterRegExp, (match, name) => {\n names.add(name);\n return match;\n });\n return Array.from(names);\n}\n\nfunction stringSupplant(str: string, encodeFn: (unencoded: any) => string, map: Record) {\n return str.replace(parameterRegExp, (_, name) => {\n const value = map[name];\n return value == null ? '' : encodeFn(value);\n });\n}\n\nexport function processTemplate(template: any, encodeFn: (unencoded: any) => string): ProcessedTemplate {\n if (typeof template !== 'string') {\n /*\n\n // kept on ice until #123 is implemented:\n if (template && Array.isArray(template.parameters) && (typeof template.template === 'function')) {\n return template;\n }\n\n */\n throw new Error('Invalid template');\n }\n return {\n parameters: getParamNames(template),\n template: stringSupplant.bind(null, template, encodeFn),\n };\n}\n\nexport function createTestFunction(entry: any) {\n if (typeof entry === 'string') {\n return (arg: any) => arg === entry;\n }\n if (Array.isArray(entry)) {\n return (arg: any) => entry.indexOf(arg) > -1;\n }\n /*\n\n // kept on ice until #123 is implemented:\n if (entry instanceof RegExp) {\n return (arg: any) => entry.test(arg);\n }\n if (typeof entry === 'function') {\n return entry;\n }\n\n */\n if (entry == null) {\n return () => true;\n }\n throw new Error(`Invalid value: ${entry}`);\n}\n\nconst identity = (a: any): typeof a => a;\n\nexport function processLinkPattern(pattern: any): ProcessedLinkPattern | TNil {\n try {\n const url = processTemplate(pattern.url, encodeURIComponent);\n const text = processTemplate(pattern.text, identity);\n return {\n object: pattern,\n type: createTestFunction(pattern.type),\n key: createTestFunction(pattern.key),\n value: createTestFunction(pattern.value),\n url,\n text,\n parameters: _uniq(url.parameters.concat(text.parameters)),\n };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Ignoring invalid link pattern: ${error}`, pattern);\n return null;\n }\n}\n\nexport function getParameterInArray(name: string, array: TraceKeyValuePair[]) {\n if (array) {\n return array.find((entry) => entry.key === name);\n }\n return undefined;\n}\n\nexport function getParameterInAncestor(name: string, span: TraceSpan) {\n let currentSpan: TraceSpan | TNil = span;\n while (currentSpan) {\n const result = getParameterInArray(name, currentSpan.tags) || getParameterInArray(name, currentSpan.process.tags);\n if (result) {\n return result;\n }\n currentSpan = getParent(currentSpan);\n }\n return undefined;\n}\n\nfunction callTemplate(template: ProcessedTemplate, data: any) {\n return template.template(data);\n}\n\nexport function computeTraceLink(linkPatterns: ProcessedLinkPattern[], trace: Trace) {\n const result: TLinksRV = [];\n const validKeys = (Object.keys(trace) as Array).filter(\n (key) => typeof trace[key] === 'string' || trace[key] === 'number'\n );\n\n linkPatterns\n .filter((pattern) => pattern.type('traces'))\n .forEach((pattern) => {\n const parameterValues: Record = {};\n const allParameters = pattern.parameters.every((parameter) => {\n const key = parameter as keyof Trace;\n if (validKeys.includes(key)) {\n // At this point is safe to access to trace object using parameter variable because\n // we validated parameter against validKeys, this implies that parameter a keyof Trace.\n parameterValues[parameter] = trace[key];\n return true;\n }\n return false;\n });\n if (allParameters) {\n result.push({\n url: callTemplate(pattern.url, parameterValues),\n text: callTemplate(pattern.text, parameterValues),\n });\n }\n });\n\n return result;\n}\n\nexport function computeLinks(\n linkPatterns: ProcessedLinkPattern[],\n span: TraceSpan,\n items: TraceKeyValuePair[],\n itemIndex: number\n) {\n const item = items[itemIndex];\n let type = 'logs';\n const processTags = span.process.tags === items;\n if (processTags) {\n type = 'process';\n }\n const spanTags = span.tags === items;\n if (spanTags) {\n type = 'tags';\n }\n const result: Array<{ url: string; text: string }> = [];\n linkPatterns.forEach((pattern) => {\n if (pattern.type(type) && pattern.key(item.key) && pattern.value(item.value)) {\n const parameterValues: Record = {};\n const allParameters = pattern.parameters.every((parameter) => {\n let entry = getParameterInArray(parameter, items);\n if (!entry && !processTags) {\n // do not look in ancestors for process tags because the same object may appear in different places in the hierarchy\n // and the cache in getLinks uses that object as a key\n entry = getParameterInAncestor(parameter, span);\n }\n if (entry) {\n parameterValues[parameter] = entry.value;\n return true;\n }\n // eslint-disable-next-line no-console\n console.warn(\n `Skipping link pattern, missing parameter ${parameter} for key ${item.key} in ${type}.`,\n pattern.object\n );\n return false;\n });\n if (allParameters) {\n result.push({\n url: callTemplate(pattern.url, parameterValues),\n text: callTemplate(pattern.text, parameterValues),\n });\n }\n }\n });\n return result;\n}\n\nexport function createGetLinks(linkPatterns: ProcessedLinkPattern[], cache: WeakMap) {\n return (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => {\n if (linkPatterns.length === 0) {\n return [];\n }\n const item = items[itemIndex];\n let result = cache.get(item);\n if (!result) {\n result = computeLinks(linkPatterns, span, items, itemIndex);\n cache.set(item, result);\n }\n return result;\n };\n}\n\nconst processedLinks: ProcessedLinkPattern[] = (getConfigValue('linkPatterns') || [])\n .map(processLinkPattern)\n .filter(Boolean);\n\nexport const getTraceLinks: (trace: Trace | undefined) => TLinksRV = memoize(10)((trace: Trace | undefined) => {\n const result: TLinksRV = [];\n if (!trace) {\n return result;\n }\n return computeTraceLink(processedLinks, trace);\n});\n\nexport default createGetLinks(processedLinks, new WeakMap());\n","// Copyright (c) 2020 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { memoize } from 'lodash';\n\nimport { TraceSpan } from '../types/trace';\n\nexport function _getTraceNameImpl(spans: TraceSpan[]) {\n // Use a span with no references to another span in given array\n // prefering the span with the fewest references\n // using start time as a tie breaker\n let candidateSpan: TraceSpan | undefined;\n const allIDs: Set = new Set(spans.map(({ spanID }) => spanID));\n\n for (let i = 0; i < spans.length; i++) {\n const hasInternalRef =\n spans[i].references &&\n spans[i].references.some(({ traceID, spanID }) => traceID === spans[i].traceID && allIDs.has(spanID));\n if (hasInternalRef) {\n continue;\n }\n\n if (!candidateSpan) {\n candidateSpan = spans[i];\n continue;\n }\n\n const thisRefLength = (spans[i].references && spans[i].references.length) || 0;\n const candidateRefLength = (candidateSpan.references && candidateSpan.references.length) || 0;\n\n if (\n thisRefLength < candidateRefLength ||\n (thisRefLength === candidateRefLength && spans[i].startTime < candidateSpan.startTime)\n ) {\n candidateSpan = spans[i];\n }\n }\n return candidateSpan ? `${candidateSpan.process.serviceName}: ${candidateSpan.operationName}` : '';\n}\n\nexport const getTraceName = memoize(_getTraceNameImpl, (spans: TraceSpan[]) => {\n if (!spans.length) {\n return 0;\n }\n return spans[0].traceID;\n});\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { getRgbColorByKey } from '../../utils/color-generator';\n\nimport renderIntoCanvas from './render-into-canvas';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n CanvasSpanGraph: css`\n label: CanvasSpanGraph;\n background: ${autoColor(theme, '#fafafa')};\n height: 60px;\n position: absolute;\n width: 100%;\n `,\n };\n});\n\ntype CanvasSpanGraphProps = {\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>;\n valueWidth: number;\n theme: GrafanaTheme2;\n};\n\nexport class UnthemedCanvasSpanGraph extends React.PureComponent {\n _canvasElm: HTMLCanvasElement | TNil;\n\n constructor(props: CanvasSpanGraphProps) {\n super(props);\n this._canvasElm = undefined;\n }\n\n getColor = (key: string) => getRgbColorByKey(key, this.props.theme);\n\n componentDidMount() {\n this._draw();\n }\n\n componentDidUpdate() {\n this._draw();\n }\n\n _setCanvasRef = (elm: HTMLCanvasElement | TNil) => {\n this._canvasElm = elm;\n };\n\n _draw() {\n if (this._canvasElm) {\n const { valueWidth: totalValueWidth, items } = this.props;\n renderIntoCanvas(this._canvasElm, items, totalValueWidth, this.getColor, autoColor(this.props.theme, '#fff'));\n }\n }\n\n render() {\n return ;\n }\n}\n\nexport default withTheme2(UnthemedCanvasSpanGraph);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../..';\n\n// exported for tests\nexport const ITEM_ALPHA = 0.8;\nexport const MIN_ITEM_HEIGHT = 2;\nexport const MAX_TOTAL_HEIGHT = 200;\nexport const MIN_ITEM_WIDTH = 10;\nexport const MIN_TOTAL_HEIGHT = 60;\nexport const MAX_ITEM_HEIGHT = 6;\n\nexport default function renderIntoCanvas(\n canvas: HTMLCanvasElement,\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>,\n totalValueWidth: number,\n getFillColor: (serviceName: string) => [number, number, number],\n bgColor: string\n) {\n const fillCache: Map = new Map();\n const cHeight = items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);\n const cWidth = window.innerWidth * 2;\n // eslint-disable-next-line no-param-reassign\n canvas.width = cWidth;\n // eslint-disable-next-line no-param-reassign\n canvas.height = cHeight;\n const itemHeight = Math.min(MAX_ITEM_HEIGHT, Math.max(MIN_ITEM_HEIGHT, cHeight / items.length));\n const itemYChange = cHeight / items.length;\n\n const ctx = canvas.getContext('2d', { alpha: false }) as CanvasRenderingContext2D;\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, cWidth, cHeight);\n for (let i = 0; i < items.length; i++) {\n const { valueWidth, valueOffset, serviceName } = items[i];\n const x = (valueOffset / totalValueWidth) * cWidth;\n let width = (valueWidth / totalValueWidth) * cWidth;\n if (width < MIN_ITEM_WIDTH) {\n width = MIN_ITEM_WIDTH;\n }\n let fillStyle = fillCache.get(serviceName);\n if (!fillStyle) {\n fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;\n fillCache.set(serviceName, fillStyle);\n }\n ctx.fillStyle = fillStyle;\n ctx.fillRect(x, i * itemYChange, width, itemHeight);\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { formatDuration } from '../../utils/date';\n\nconst getStyles = () => {\n return {\n TickLabels: css`\n label: TickLabels;\n height: 1rem;\n position: relative;\n `,\n TickLabelsLabel: css`\n label: TickLabelsLabel;\n color: #717171;\n font-size: 0.7rem;\n position: absolute;\n user-select: none;\n `,\n };\n};\n\ntype TickLabelsProps = {\n numTicks: number;\n duration: number;\n};\n\nexport default function TickLabels(props: TickLabelsProps) {\n const { numTicks, duration } = props;\n const styles = useStyles2(getStyles);\n\n const ticks = [];\n for (let i = 0; i < numTicks + 1; i++) {\n const portion = i / numTicks;\n const style = portion === 1 ? { right: '0%' } : { left: `${portion * 100}%` };\n ticks.push(\n
\n {formatDuration(duration * portion)}\n
\n );\n }\n\n return
{ticks}
;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n GraphTick: css`\n label: GraphTick;\n stroke: #aaa;\n stroke-width: 1px;\n `,\n };\n};\n\ntype GraphTicksProps = {\n numTicks: number;\n};\n\nexport default function GraphTicks(props: GraphTicksProps) {\n const { numTicks } = props;\n const styles = useStyles2(getStyles);\n const ticks = [];\n // i starts at 1, limit is `i < numTicks` so the first and last ticks aren't drawn\n for (let i = 1; i < numTicks; i++) {\n const x = `${(i / numTicks) * 100}%`;\n ticks.push();\n }\n\n return (\n \n {ticks}\n \n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n return {\n ScrubberHandleExpansion: cx(\n css`\n label: ScrubberHandleExpansion;\n cursor: col-resize;\n fill-opacity: 0;\n fill: #44f;\n `,\n 'scrubber-handle-expansion'\n ),\n ScrubberHandle: cx(\n css`\n label: ScrubberHandle;\n cursor: col-resize;\n fill: #555;\n `,\n 'scrubber-handle'\n ),\n ScrubberLine: cx(\n css`\n label: ScrubberLine;\n pointer-events: none;\n stroke: #555;\n `,\n 'scrubber-line'\n ),\n ScrubberDragging: css`\n label: ScrubberDragging;\n & .scrubber-handle-expansion {\n fill-opacity: 1;\n }\n & .scrubber-handle {\n fill: #44f;\n }\n & > .scrubber-line {\n stroke: #44f;\n }\n `,\n ScrubberHandles: css`\n label: ScrubberHandles;\n &:hover > .scrubber-handle-expansion {\n fill-opacity: 1;\n }\n &:hover > .scrubber-handle {\n fill: #44f;\n }\n &:hover + .scrubber.line {\n stroke: #44f;\n }\n `,\n };\n};\n\ntype ScrubberProps = {\n isDragging: boolean;\n position: number;\n onMouseDown: (evt: React.MouseEvent) => void;\n onMouseEnter: (evt: React.MouseEvent) => void;\n onMouseLeave: (evt: React.MouseEvent) => void;\n};\n\nexport default function Scrubber({ isDragging, onMouseDown, onMouseEnter, onMouseLeave, position }: ScrubberProps) {\n const xPercent = `${position * 100}%`;\n const styles = useStyles2(getStyles);\n const className = cx({ [styles.ScrubberDragging]: isDragging });\n return (\n \n \n {/* handleExpansion is only visible when `isDragging` is true */}\n \n \n \n \n \n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory, Button } from '@grafana/ui';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate, TNil } from '../..';\nimport { autoColor } from '../../Theme';\nimport DraggableManager, { DraggableBounds, DraggingUpdate, EUpdateTypes } from '../../utils/DraggableManager';\n\nimport GraphTicks from './GraphTicks';\nimport Scrubber from './Scrubber';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n // Need this cause emotion will merge emotion generated classes into single className if used with cx from emotion\n // package and the selector won't work\n const ViewingLayerResetZoomHoverClassName = 'JaegerUiComponents__ViewingLayerResetZoomHoverClassName';\n const ViewingLayerResetZoom = css`\n label: ViewingLayerResetZoom;\n display: none;\n position: absolute;\n right: 1%;\n top: 10%;\n z-index: 1;\n `;\n return {\n ViewingLayer: css`\n label: ViewingLayer;\n cursor: vertical-text;\n position: relative;\n z-index: 1;\n &:hover > .${ViewingLayerResetZoomHoverClassName} {\n display: unset;\n }\n `,\n ViewingLayerGraph: css`\n label: ViewingLayerGraph;\n border: 1px solid ${autoColor(theme, '#999')};\n /* need !important here to overcome something from semantic UI */\n overflow: visible !important;\n position: relative;\n transform-origin: 0 0;\n width: 100%;\n `,\n ViewingLayerInactive: css`\n label: ViewingLayerInactive;\n fill: ${autoColor(theme, 'rgba(214, 214, 214, 0.5)')};\n `,\n ViewingLayerCursorGuide: css`\n label: ViewingLayerCursorGuide;\n stroke: ${autoColor(theme, '#f44')};\n stroke-width: 1;\n `,\n ViewingLayerDraggedShift: css`\n label: ViewingLayerDraggedShift;\n fill-opacity: 0.2;\n `,\n ViewingLayerDrag: css`\n label: ViewingLayerDrag;\n fill: ${autoColor(theme, '#44f')};\n `,\n ViewingLayerFullOverlay: css`\n label: ViewingLayerFullOverlay;\n bottom: 0;\n cursor: col-resize;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n user-select: none;\n `,\n ViewingLayerResetZoom,\n ViewingLayerResetZoomHoverClassName,\n };\n});\n\ntype ViewingLayerProps = {\n height: number;\n numTicks: number;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n viewRange: ViewRange;\n theme: GrafanaTheme2;\n};\n\ntype ViewingLayerState = {\n /**\n * Cursor line should not be drawn when the mouse is over the scrubber handle.\n */\n preventCursorLine: boolean;\n};\n\n/**\n * Designate the tags for the different dragging managers. Exported for tests.\n */\nexport const dragTypes = {\n /**\n * Tag for dragging the right scrubber, e.g. end of the current view range.\n */\n SHIFT_END: 'SHIFT_END',\n /**\n * Tag for dragging the left scrubber, e.g. start of the current view range.\n */\n SHIFT_START: 'SHIFT_START',\n /**\n * Tag for dragging a new view range.\n */\n REFRAME: 'REFRAME',\n};\n\n/**\n * Returns the layout information for drawing the view-range differential, e.g.\n * show what will change when the mouse is released. Basically, this is the\n * difference from the start of the drag to the current position.\n *\n * @returns {{ x: string, width: string, leadginX: string }}\n */\nfunction getNextViewLayout(start: number, position: number) {\n const [left, right] = start < position ? [start, position] : [position, start];\n return {\n x: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n leadingX: `${position * 100}%`,\n };\n}\n\n/**\n * `ViewingLayer` is rendered on top of the Canvas rendering of the minimap and\n * handles showing the current view range and handles mouse UX for modifying it.\n */\nexport class UnthemedViewingLayer extends React.PureComponent {\n state: ViewingLayerState;\n\n _root: Element | TNil;\n\n /**\n * `_draggerReframe` handles clicking and dragging on the `ViewingLayer` to\n * redefined the view range.\n */\n _draggerReframe: DraggableManager;\n\n /**\n * `_draggerStart` handles dragging the left scrubber to adjust the start of\n * the view range.\n */\n _draggerStart: DraggableManager;\n\n /**\n * `_draggerEnd` handles dragging the right scrubber to adjust the end of\n * the view range.\n */\n _draggerEnd: DraggableManager;\n\n constructor(props: ViewingLayerProps) {\n super(props);\n\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseMove: this._handleReframeMouseMove,\n onMouseLeave: this._handleReframeMouseLeave,\n tag: dragTypes.REFRAME,\n });\n\n this._draggerStart = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_START,\n });\n\n this._draggerEnd = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_END,\n });\n\n this._root = undefined;\n this.state = {\n preventCursorLine: false,\n };\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n this._draggerEnd.dispose();\n this._draggerStart.dispose();\n }\n\n _setRoot = (elm: SVGElement | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (tag: string | TNil): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let maxValue = 1;\n let minValue = 0;\n if (tag === dragTypes.SHIFT_START) {\n maxValue = viewEnd;\n } else if (tag === dragTypes.SHIFT_END) {\n minValue = viewStart;\n }\n return { clientXLeft, maxValue, minValue, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n this.props.updateNextViewRangeTime({ cursor: value });\n };\n\n _handleReframeMouseLeave = () => {\n this.props.updateNextViewRangeTime({ cursor: null });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const shift = value;\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : value;\n const [start, end] = value < anchor ? [value, anchor] : [anchor, value];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'minimap');\n };\n\n _handleScrubberEnterLeave = ({ type }: DraggingUpdate) => {\n const preventCursorLine = type === EUpdateTypes.MouseEnter;\n this.setState({ preventCursorLine });\n };\n\n _handleScrubberDragUpdate = ({ event, tag, type, value }: DraggingUpdate) => {\n if (type === EUpdateTypes.DragStart) {\n event.stopPropagation();\n }\n if (tag === dragTypes.SHIFT_START) {\n this.props.updateNextViewRangeTime({ shiftStart: value });\n } else if (tag === dragTypes.SHIFT_END) {\n this.props.updateNextViewRangeTime({ shiftEnd: value });\n }\n };\n\n _handleScrubberDragEnd = ({ manager, tag, value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let update: [number, number];\n if (tag === dragTypes.SHIFT_START) {\n update = [value, viewEnd];\n } else if (tag === dragTypes.SHIFT_END) {\n update = [viewStart, value];\n } else {\n // to satisfy flow\n throw new Error('bad state');\n }\n manager.resetBounds();\n this.setState({ preventCursorLine: false });\n this.props.updateViewRangeTime(update[0], update[1], 'minimap');\n };\n\n /**\n * Resets the zoom to fully zoomed out.\n */\n _resetTimeZoomClickHandler = () => {\n this.props.updateViewRangeTime(0, 1);\n };\n\n /**\n * Renders the difference between where the drag started and the current\n * position, e.g. the red or blue highlight.\n *\n * @returns React.Node[]\n */\n _getMarkers(from: number, to: number) {\n const styles = getStyles(this.props.theme);\n const layout = getNextViewLayout(from, to);\n return [\n ,\n ,\n ];\n }\n\n render() {\n const { height, viewRange, numTicks, theme } = this.props;\n const { preventCursorLine } = this.state;\n const { current, cursor, shiftStart, shiftEnd, reframe } = viewRange.time;\n const haveNextTimeRange = shiftStart != null || shiftEnd != null || reframe != null;\n const [viewStart, viewEnd] = current;\n let leftInactive = 0;\n if (viewStart) {\n leftInactive = viewStart * 100;\n }\n let rightInactive = 100;\n if (viewEnd) {\n rightInactive = 100 - viewEnd * 100;\n }\n let cursorPosition: string | undefined;\n if (!haveNextTimeRange && cursor != null && !preventCursorLine) {\n cursorPosition = `${cursor * 100}%`;\n }\n const styles = getStyles(theme);\n\n return (\n
\n {(viewStart !== 0 || viewEnd !== 1) && (\n \n Reset Selection\n \n )}\n \n {leftInactive > 0 && (\n \n )}\n {rightInactive > 0 && (\n \n )}\n \n {cursorPosition && (\n \n )}\n {shiftStart != null && this._getMarkers(viewStart, shiftStart)}\n {shiftEnd != null && this._getMarkers(viewEnd, shiftEnd)}\n \n \n {reframe != null && this._getMarkers(reframe.anchor, reframe.shift)}\n \n {/* fullOverlay updates the mouse cursor blocks mouse events */}\n {haveNextTimeRange &&
}\n
\n );\n }\n}\n\nexport default withTheme2(UnthemedViewingLayer);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport cx from 'classnames';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '../..';\nimport { TraceSpan, Trace } from '../../types/trace';\nimport { ubPb2, ubPx2, ubRelative } from '../../uberUtilityStyles';\n\nimport CanvasSpanGraph from './CanvasSpanGraph';\nimport TickLabels from './TickLabels';\nimport ViewingLayer from './ViewingLayer';\n\nconst DEFAULT_HEIGHT = 60;\nconst TIMELINE_TICK_INTERVAL = 4;\n\ntype SpanGraphProps = {\n height?: number;\n trace: Trace;\n viewRange: ViewRange;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (nextUpdate: ViewRangeTimeUpdate) => void;\n};\n\ntype SpanItem = {\n valueOffset: number;\n valueWidth: number;\n serviceName: string;\n};\n\nfunction getItem(span: TraceSpan): SpanItem {\n return {\n valueOffset: span.relativeStartTime,\n valueWidth: span.duration,\n serviceName: span.process.serviceName,\n };\n}\n\nfunction getItems(trace: Trace): SpanItem[] {\n return trace.spans.map(getItem);\n}\n\nconst memoizedGetitems = memoizeOne(getItems);\n\nexport default class SpanGraph extends React.PureComponent {\n static defaultProps = {\n height: DEFAULT_HEIGHT,\n };\n\n render() {\n const { height, trace, viewRange, updateNextViewRangeTime, updateViewRangeTime } = this.props;\n if (!trace) {\n return
;\n }\n\n const items = memoizedGetitems(trace);\n return (\n
\n \n
\n \n \n
\n
\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get, maxBy as _maxBy, values as _values } from 'lodash';\nimport * as React from 'react';\nimport MdKeyboardArrowRight from 'react-icons/lib/md/keyboard-arrow-right';\n\nimport { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor, TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '..';\nimport ExternalLinks from '../common/ExternalLinks';\nimport LabeledList from '../common/LabeledList';\nimport TraceName from '../common/TraceName';\nimport { getTraceLinks } from '../model/link-patterns';\nimport { getTraceName } from '../model/trace-viewer';\nimport { Trace } from '../types/trace';\nimport { uTxMuted } from '../uberUtilityStyles';\nimport { formatDuration } from '../utils/date';\n\nimport SpanGraph from './SpanGraph';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TracePageHeader: css`\n label: TracePageHeader;\n & > :first-child {\n border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n }\n & > :nth-child(2) {\n background-color: ${autoColor(theme, '#eee')};\n border-bottom: 1px solid ${autoColor(theme, '#e4e4e4')};\n }\n & > :last-child {\n border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n }\n `,\n TracePageHeaderTitleRow: css`\n label: TracePageHeaderTitleRow;\n align-items: center;\n display: flex;\n `,\n TracePageHeaderBack: css`\n label: TracePageHeaderBack;\n align-items: center;\n align-self: stretch;\n background-color: #fafafa;\n border-bottom: 1px solid #ddd;\n border-right: 1px solid #ddd;\n color: inherit;\n display: flex;\n font-size: 1.4rem;\n padding: 0 1rem;\n margin-bottom: -1px;\n &:hover {\n background-color: #f0f0f0;\n border-color: #ccc;\n }\n `,\n TracePageHeaderTitleLink: css`\n label: TracePageHeaderTitleLink;\n align-items: center;\n display: flex;\n flex: 1;\n\n &:hover * {\n text-decoration: underline;\n }\n &:hover > *,\n &:hover small {\n text-decoration: none;\n }\n `,\n TracePageHeaderDetailToggle: css`\n label: TracePageHeaderDetailToggle;\n font-size: 2.5rem;\n transition: transform 0.07s ease-out;\n `,\n TracePageHeaderDetailToggleExpanded: css`\n label: TracePageHeaderDetailToggleExpanded;\n transform: rotate(90deg);\n `,\n TracePageHeaderTitle: css`\n label: TracePageHeaderTitle;\n color: inherit;\n flex: 1;\n font-size: 1.7em;\n line-height: 1em;\n margin: 0 0 0 0.5em;\n padding-bottom: 0.5em;\n `,\n TracePageHeaderTitleCollapsible: css`\n label: TracePageHeaderTitleCollapsible;\n margin-left: 0;\n `,\n TracePageHeaderOverviewItems: css`\n label: TracePageHeaderOverviewItems;\n border-bottom: 1px solid #e4e4e4;\n padding: 0.25rem 0.5rem !important;\n `,\n TracePageHeaderOverviewItemValueDetail: cx(\n css`\n label: TracePageHeaderOverviewItemValueDetail;\n color: #aaa;\n `,\n 'trace-item-value-detail'\n ),\n TracePageHeaderOverviewItemValue: css`\n label: TracePageHeaderOverviewItemValue;\n &:hover > .trace-item-value-detail {\n color: unset;\n }\n `,\n TracePageHeaderArchiveIcon: css`\n label: TracePageHeaderArchiveIcon;\n font-size: 1.78em;\n margin-right: 0.15em;\n `,\n TracePageHeaderTraceId: css`\n label: TracePageHeaderTraceId;\n white-space: nowrap;\n `,\n };\n};\n\ntype TracePageHeaderEmbedProps = {\n canCollapse: boolean;\n hideMap: boolean;\n hideSummary: boolean;\n onSlimViewClicked: () => void;\n onTraceGraphViewClicked: () => void;\n slimView: boolean;\n trace: Trace;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRange: ViewRange;\n timeZone: TimeZone;\n};\n\nexport const HEADER_ITEMS = [\n {\n key: 'timestamp',\n label: 'Trace Start:',\n renderer(trace: Trace, timeZone: TimeZone, styles: ReturnType) {\n // Convert date from micro to milli seconds\n const dateStr = dateTimeFormat(trace.startTime / 1000, { timeZone, defaultWithMS: true });\n const match = dateStr.match(/^(.+)(:\\d\\d\\.\\d+)$/);\n return match ? (\n \n {match[1]}\n {match[2]}\n \n ) : (\n dateStr\n );\n },\n },\n {\n key: 'duration',\n label: 'Duration:',\n renderer: (trace: Trace) => formatDuration(trace.duration),\n },\n {\n key: 'service-count',\n label: 'Services:',\n renderer: (trace: Trace) => new Set(_values(trace.processes).map((p) => p.serviceName)).size,\n },\n {\n key: 'depth',\n label: 'Depth:',\n renderer: (trace: Trace) => _get(_maxBy(trace.spans, 'depth'), 'depth', 0) + 1,\n },\n {\n key: 'span-count',\n label: 'Total Spans:',\n renderer: (trace: Trace) => trace.spans.length,\n },\n];\n\nexport default function TracePageHeader(props: TracePageHeaderEmbedProps) {\n const {\n canCollapse,\n hideMap,\n hideSummary,\n onSlimViewClicked,\n slimView,\n trace,\n updateNextViewRangeTime,\n updateViewRangeTime,\n viewRange,\n timeZone,\n } = props;\n\n const styles = useStyles2(getStyles);\n const links = React.useMemo(() => {\n if (!trace) {\n return [];\n }\n return getTraceLinks(trace);\n }, [trace]);\n\n if (!trace) {\n return null;\n }\n\n const summaryItems =\n !hideSummary &&\n !slimView &&\n HEADER_ITEMS.map((item) => {\n const { renderer, ...rest } = item;\n return { ...rest, value: renderer(trace, timeZone, styles) };\n });\n\n const title = (\n

\n {' '}\n {trace.traceID}\n

\n );\n\n return (\n
\n
\n {links && links.length > 0 && }\n {canCollapse ? (\n \n \n {title}\n \n ) : (\n title\n )}\n
\n {summaryItems && }\n {!hideMap && !slimView && (\n \n )}\n
\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceLog, TraceSpanReference } from '../../types/trace';\n\n/**\n * Which items of a {@link SpanDetail} component are expanded.\n */\nexport default class DetailState {\n isTagsOpen: boolean;\n isProcessOpen: boolean;\n logs: { isOpen: boolean; openedItems: Set };\n references: { isOpen: boolean; openedItems: Set };\n isWarningsOpen: boolean;\n isStackTracesOpen: boolean;\n isReferencesOpen: boolean;\n\n constructor(oldState?: DetailState) {\n const {\n isTagsOpen,\n isProcessOpen,\n isReferencesOpen,\n isWarningsOpen,\n isStackTracesOpen,\n logs,\n references,\n }: DetailState | Record = oldState || {};\n this.isTagsOpen = Boolean(isTagsOpen);\n this.isProcessOpen = Boolean(isProcessOpen);\n this.isReferencesOpen = Boolean(isReferencesOpen);\n this.isWarningsOpen = Boolean(isWarningsOpen);\n this.isStackTracesOpen = Boolean(isStackTracesOpen);\n this.logs = {\n isOpen: Boolean(logs && logs.isOpen),\n openedItems: logs && logs.openedItems ? new Set(logs.openedItems) : new Set(),\n };\n this.references = {\n isOpen: Boolean(references && references.isOpen),\n openedItems: references && references.openedItems ? new Set(references.openedItems) : new Set(),\n };\n }\n\n toggleTags() {\n const next = new DetailState(this);\n next.isTagsOpen = !this.isTagsOpen;\n return next;\n }\n\n toggleProcess() {\n const next = new DetailState(this);\n next.isProcessOpen = !this.isProcessOpen;\n return next;\n }\n\n toggleReferences() {\n const next = new DetailState(this);\n next.references.isOpen = !this.references.isOpen;\n return next;\n }\n\n toggleReferenceItem(reference: TraceSpanReference) {\n const next = new DetailState(this);\n if (next.references.openedItems.has(reference)) {\n next.references.openedItems.delete(reference);\n } else {\n next.references.openedItems.add(reference);\n }\n return next;\n }\n\n toggleWarnings() {\n const next = new DetailState(this);\n next.isWarningsOpen = !this.isWarningsOpen;\n return next;\n }\n\n toggleStackTraces() {\n const next = new DetailState(this);\n next.isStackTracesOpen = !this.isStackTracesOpen;\n return next;\n }\n\n toggleLogs() {\n const next = new DetailState(this);\n next.logs.isOpen = !this.logs.isOpen;\n return next;\n }\n\n toggleLogItem(logItem: TraceLog) {\n const next = new DetailState(this);\n if (next.logs.openedItems.has(logItem)) {\n next.logs.openedItems.delete(logItem);\n } else {\n next.logs.openedItems.add(logItem);\n }\n return next;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport default class TreeNode {\n static iterFunction(fn, depth = 0) {\n return (node) => fn(node.value, node, depth);\n }\n\n static searchFunction(search) {\n if (typeof search === 'function') {\n return search;\n }\n\n return (value, node) => (search instanceof TreeNode ? node === search : value === search);\n }\n\n constructor(value, children = []) {\n this.value = value;\n this.children = children;\n }\n\n get depth() {\n return this.children.reduce((depth, child) => Math.max(child.depth + 1, depth), 1);\n }\n\n get size() {\n let i = 0;\n this.walk(() => i++);\n return i;\n }\n\n addChild(child) {\n this.children.push(child instanceof TreeNode ? child : new TreeNode(child));\n return this;\n }\n\n find(search) {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n if (searchFn(this)) {\n return this;\n }\n for (let i = 0; i < this.children.length; i++) {\n const result = this.children[i].find(search);\n if (result) {\n return result;\n }\n }\n return null;\n }\n\n getPath(search) {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n\n const findPath = (currentNode, currentPath) => {\n // skip if we already found the result\n const attempt = currentPath.concat([currentNode]);\n // base case: return the array when there is a match\n if (searchFn(currentNode)) {\n return attempt;\n }\n for (let i = 0; i < currentNode.children.length; i++) {\n const child = currentNode.children[i];\n const match = findPath(child, attempt);\n if (match) {\n return match;\n }\n }\n return null;\n };\n\n return findPath(this, []);\n }\n\n walk(fn, depth = 0) {\n const nodeStack = [];\n let actualDepth = depth;\n nodeStack.push({ node: this, depth: actualDepth });\n while (nodeStack.length) {\n const { node, depth: nodeDepth } = nodeStack.pop();\n fn(node.value, node, nodeDepth);\n actualDepth = nodeDepth + 1;\n let i = node.children.length - 1;\n while (i >= 0) {\n nodeStack.push({ node: node.children[i], depth: actualDepth });\n i--;\n }\n }\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const getProcessServiceName = (proc) => proc.serviceName;\nexport const getProcessTags = (proc) => proc.tags;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport fuzzy from 'fuzzy';\nimport { createSelector } from 'reselect';\n\nimport { getProcessServiceName } from './process';\n\nexport const getSpanId = (span) => span.spanID;\nexport const getSpanName = (span) => span.operationName;\nexport const getSpanDuration = (span) => span.duration;\nexport const getSpanTimestamp = (span) => span.startTime;\nexport const getSpanProcessId = (span) => span.processID;\nexport const getSpanReferences = (span) => span.references || [];\nexport const getSpanReferenceByType = createSelector(\n createSelector(({ span }) => span, getSpanReferences),\n ({ type }) => type,\n (references, type) => references.find((ref) => ref.refType === type)\n);\nexport const getSpanParentId = createSelector(\n (span) => getSpanReferenceByType({ span, type: 'CHILD_OF' }),\n (childOfRef) => (childOfRef ? childOfRef.spanID : null)\n);\n\nexport const getSpanProcess = (span) => {\n if (!span.process) {\n throw new Error(\n `\n you must hydrate the spans with the processes, perhaps\n using hydrateSpansWithProcesses(), before accessing a span's process\n `\n );\n }\n\n return span.process;\n};\n\nexport const getSpanServiceName = createSelector(getSpanProcess, getProcessServiceName);\n\nexport const filterSpansForTimestamps = createSelector(\n ({ spans }) => spans,\n ({ leftBound }) => leftBound,\n ({ rightBound }) => rightBound,\n (spans, leftBound, rightBound) =>\n spans.filter((span) => getSpanTimestamp(span) >= leftBound && getSpanTimestamp(span) <= rightBound)\n);\n\nexport const filterSpansForText = createSelector(\n ({ spans }) => spans,\n ({ text }) => text,\n (spans, text) =>\n fuzzy\n .filter(text, spans, {\n extract: (span) => `${getSpanServiceName(span)} ${getSpanName(span)}`,\n })\n .map(({ original }) => original)\n);\n\nconst getTextFilterdSpansAsMap = createSelector(filterSpansForText, (matchingSpans) =>\n matchingSpans.reduce(\n (obj, span) => ({\n ...obj,\n [getSpanId(span)]: span,\n }),\n {}\n )\n);\n\nexport const highlightSpansForTextFilter = createSelector(\n ({ spans }) => spans,\n getTextFilterdSpansAsMap,\n (spans, textFilteredSpansMap) =>\n spans.map((span) => ({\n ...span,\n muted: !textFilteredSpansMap[getSpanId(span)],\n }))\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createSelector, createStructuredSelector } from 'reselect';\n\nimport TreeNode from '../utils/TreeNode';\nimport { formatMillisecondTime, formatSecondTime, ONE_SECOND } from '../utils/date';\nimport { numberSortComparator } from '../utils/sort';\n\nimport { getProcessServiceName } from './process';\nimport {\n getSpanId,\n getSpanName,\n getSpanServiceName,\n getSpanTimestamp,\n getSpanDuration,\n getSpanProcessId,\n} from './span';\n\nexport const getTraceId = (trace) => trace.traceID;\n\nexport const getTraceSpans = (trace) => trace.spans;\n\nconst getTraceProcesses = (trace) => trace.processes;\n\nconst getSpanWithProcess = createSelector(\n (state) => state.span,\n (state) => state.processes,\n (span, processes) => ({\n ...span,\n process: processes[getSpanProcessId(span)],\n })\n);\n\nexport const getTraceSpansAsMap = createSelector(getTraceSpans, (spans) =>\n spans.reduce((map, span) => map.set(getSpanId(span), span), new Map())\n);\n\nexport const TREE_ROOT_ID = '__root__';\n\n/**\n * Build a tree of { value: spanID, children } items derived from the\n * `span.references` information. The tree represents the grouping of parent /\n * child relationships. The root-most node is nominal in that\n * `.value === TREE_ROOT_ID`. This is done because a root span (the main trace\n * span) is not always included with the trace data. Thus, there can be\n * multiple top-level spans, and the root node acts as their common parent.\n *\n * The children are sorted by `span.startTime` after the tree is built.\n *\n * @param {Trace} trace The trace to build the tree of spanIDs.\n * @return {TreeNode} A tree of spanIDs derived from the relationships\n * between spans in the trace.\n */\nexport function getTraceSpanIdsAsTree(trace) {\n const nodesById = new Map(trace.spans.map((span) => [span.spanID, new TreeNode(span.spanID)]));\n const spansById = new Map(trace.spans.map((span) => [span.spanID, span]));\n const root = new TreeNode(TREE_ROOT_ID);\n trace.spans.forEach((span) => {\n const node = nodesById.get(span.spanID);\n if (Array.isArray(span.references) && span.references.length) {\n const { refType, spanID: parentID } = span.references[0];\n if (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM') {\n const parent = nodesById.get(parentID) || root;\n parent.children.push(node);\n } else {\n throw new Error(`Unrecognized ref type: ${refType}`);\n }\n } else {\n root.children.push(node);\n }\n });\n const comparator = (nodeA, nodeB) => {\n const a = spansById.get(nodeA.value);\n const b = spansById.get(nodeB.value);\n return +(a.startTime > b.startTime) || +(a.startTime === b.startTime) - 1;\n };\n trace.spans.forEach((span) => {\n const node = nodesById.get(span.spanID);\n if (node.children.length > 1) {\n node.children.sort(comparator);\n }\n });\n root.children.sort(comparator);\n return root;\n}\n\n// attach \"process\" as an object to each span.\nexport const hydrateSpansWithProcesses = (trace) => {\n const spans = getTraceSpans(trace);\n const processes = getTraceProcesses(trace);\n\n return {\n ...trace,\n spans: spans.map((span) => getSpanWithProcess({ span, processes })),\n };\n};\n\nexport const getTraceSpanCount = createSelector(getTraceSpans, (spans) => spans.length);\n\nexport const getTraceTimestamp = createSelector(getTraceSpans, (spans) =>\n spans.reduce(\n (prevTimestamp, span) => (prevTimestamp ? Math.min(prevTimestamp, getSpanTimestamp(span)) : getSpanTimestamp(span)),\n null\n )\n);\n\nexport const getTraceDuration = createSelector(getTraceSpans, getTraceTimestamp, (spans, timestamp) =>\n spans.reduce(\n (prevDuration, span) =>\n prevDuration\n ? Math.max(getSpanTimestamp(span) - timestamp + getSpanDuration(span), prevDuration)\n : getSpanDuration(span),\n null\n )\n);\n\nexport const getTraceEndTimestamp = createSelector(\n getTraceTimestamp,\n getTraceDuration,\n (timestamp, duration) => timestamp + duration\n);\n\nexport const getParentSpan = createSelector(\n getTraceSpanIdsAsTree,\n getTraceSpansAsMap,\n (tree, spanMap) =>\n tree.children\n .map((node) => spanMap.get(node.value))\n .sort((spanA, spanB) => numberSortComparator(getSpanTimestamp(spanA), getSpanTimestamp(spanB)))[0]\n);\n\nexport const getTraceDepth = createSelector(getTraceSpanIdsAsTree, (spanTree) => spanTree.depth - 1);\n\nexport const getSpanDepthForTrace = createSelector(\n createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n createSelector((state) => state.span, getSpanId),\n (node, spanID) => node.getPath(spanID).length - 1\n);\n\nexport const getTraceServices = createSelector(getTraceProcesses, (processes) =>\n Object.keys(processes).reduce(\n (services, processID) => services.add(getProcessServiceName(processes[processID])),\n new Set()\n )\n);\n\nexport const getTraceServiceCount = createSelector(getTraceServices, (services) => services.size);\n\n// establish constants to determine how math should be handled\n// for nanosecond-to-millisecond conversions.\nexport const DURATION_FORMATTERS = {\n ms: formatMillisecondTime,\n s: formatSecondTime,\n};\n\nconst getDurationFormatterForTrace = createSelector(getTraceDuration, (totalDuration) =>\n totalDuration >= ONE_SECOND ? DURATION_FORMATTERS.s : DURATION_FORMATTERS.ms\n);\n\nexport const formatDurationForUnit = createSelector(\n ({ duration }) => duration,\n ({ unit }) => DURATION_FORMATTERS[unit],\n (duration, formatter) => formatter(duration)\n);\n\nexport const formatDurationForTrace = createSelector(\n ({ duration }) => duration,\n createSelector(({ trace }) => trace, getDurationFormatterForTrace),\n (duration, formatter) => formatter(duration)\n);\n\nexport const getSortedSpans = createSelector(\n ({ trace }) => trace,\n ({ spans }) => spans,\n ({ sort }) => sort,\n (trace, spans, { dir, comparator, selector }) =>\n [...spans].sort((spanA, spanB) => dir * comparator(selector(spanA, trace), selector(spanB, trace)))\n);\n\nconst getTraceSpansByHierarchyPosition = createSelector(getTraceSpanIdsAsTree, (tree) => {\n const hierarchyPositionMap = new Map();\n let i = 0;\n tree.walk((spanID) => hierarchyPositionMap.set(spanID, i++));\n return hierarchyPositionMap;\n});\n\nexport const getTreeSizeForTraceSpan = createSelector(\n createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n createSelector((state) => state.span, getSpanId),\n (tree, spanID) => {\n const node = tree.find(spanID);\n if (!node) {\n return -1;\n }\n return node.size - 1;\n }\n);\n\nexport const getSpanHierarchySortPositionForTrace = createSelector(\n createSelector(({ trace }) => trace, getTraceSpansByHierarchyPosition),\n ({ span }) => span,\n (hierarchyPositionMap, span) => hierarchyPositionMap.get(getSpanId(span))\n);\n\nexport const getTraceName = createSelector(\n createSelector(\n createSelector(hydrateSpansWithProcesses, getParentSpan),\n createStructuredSelector({\n name: getSpanName,\n serviceName: getSpanServiceName,\n })\n ),\n ({ name, serviceName }) => `${serviceName}: ${name}`\n);\n\nexport const omitCollapsedSpans = createSelector(\n ({ spans }) => spans,\n createSelector(({ trace }) => trace, getTraceSpanIdsAsTree),\n ({ collapsed }) => collapsed,\n (spans, tree, collapse) => {\n const hiddenSpanIds = collapse.reduce((result, collapsedSpanId) => {\n tree.find(collapsedSpanId).walk((id) => id !== collapsedSpanId && result.add(id));\n return result;\n }, new Set());\n\n return hiddenSpanIds.size > 0 ? spans.filter((span) => !hiddenSpanIds.has(getSpanId(span))) : spans;\n }\n);\n\nexport const DEFAULT_TICK_INTERVAL = 4;\nexport const DEFAULT_TICK_WIDTH = 3;\nexport const getTicksForTrace = createSelector(\n ({ trace }) => trace,\n ({ interval = DEFAULT_TICK_INTERVAL }) => interval,\n ({ width = DEFAULT_TICK_WIDTH }) => width,\n (\n trace,\n interval,\n width\n // timestamps will be spaced over the interval, starting from the initial timestamp\n ) =>\n [...Array(interval + 1).keys()].map((num) => ({\n timestamp: getTraceTimestamp(trace) + getTraceDuration(trace) * (num / interval),\n width,\n }))\n);\n\n// TODO: delete this when the backend can ensure uniqueness\n/* istanbul ignore next */\nexport const enforceUniqueSpanIds = createSelector(\n /* istanbul ignore next */ (trace) => trace,\n getTraceSpans,\n /* istanbul ignore next */ (trace, spans) => {\n const map = new Map();\n\n return {\n ...trace,\n spans: spans.reduce((result, span) => {\n const spanID = map.has(getSpanId(span)) ? `${getSpanId(span)}_${map.get(getSpanId(span))}` : getSpanId(span);\n const updatedSpan = { ...span, spanID };\n\n if (spanID !== getSpanId(span)) {\n // eslint-disable-next-line no-console\n console.warn('duplicate spanID in trace replaced', getSpanId(span), 'new:', spanID);\n }\n\n // set the presence of the span in the map or increment the number\n map.set(getSpanId(span), (map.get(getSpanId(span)) || 0) + 1);\n\n return result.concat([updatedSpan]);\n }, []),\n };\n }\n);\n\n// TODO: delete this when the backend can ensure uniqueness\nexport const dropEmptyStartTimeSpans = createSelector(\n /* istanbul ignore next */ (trace) => trace,\n getTraceSpans,\n /* istanbul ignore next */ (trace, spans) => ({\n ...trace,\n spans: spans.filter((span) => !!getSpanTimestamp(span)),\n })\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport function localeStringComparator(itemA, itemB) {\n return itemA.localeCompare(itemB);\n}\n\nexport function numberSortComparator(itemA, itemB) {\n return itemA - itemB;\n}\n\nexport function classNameForSortDir(dir) {\n return `sorted ${dir === 1 ? 'ascending' : 'descending'}`;\n}\n\nexport function getNewSortForClick(prevSort, column) {\n const { defaultDir = 1 } = column;\n\n return {\n key: column.name,\n dir: prevSort.key === column.name ? -1 * prevSort.dir : defaultDir,\n };\n}\n\nexport function createSortClickHandler(column, currentSortKey, currentSortDir, updateSort) {\n return function onClickSortingElement() {\n const { key, dir } = getNewSortForClick({ key: currentSortKey, dir: currentSortDir }, column);\n updateSort(key, dir);\n };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { isEqual as _isEqual } from 'lodash';\n\n// @ts-ignore\nimport { getTraceSpanIdsAsTree } from '../selectors/trace';\nimport { TraceKeyValuePair, TraceSpan, Trace, TraceResponse } from '../types/trace';\n// @ts-ignore\nimport TreeNode from '../utils/TreeNode';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getTraceName } from './trace-viewer';\n\n// exported for tests\nexport function deduplicateTags(spanTags: TraceKeyValuePair[]) {\n const warningsHash: Map = new Map();\n const tags: TraceKeyValuePair[] = spanTags.reduce((uniqueTags, tag) => {\n if (!uniqueTags.some((t) => t.key === tag.key && t.value === tag.value)) {\n uniqueTags.push(tag);\n } else {\n warningsHash.set(`${tag.key}:${tag.value}`, `Duplicate tag \"${tag.key}:${tag.value}\"`);\n }\n return uniqueTags;\n }, []);\n const warnings = Array.from(warningsHash.values());\n return { tags, warnings };\n}\n\n// exported for tests\nexport function orderTags(spanTags: TraceKeyValuePair[], topPrefixes?: string[]) {\n const orderedTags: TraceKeyValuePair[] = spanTags.slice();\n const tp = (topPrefixes || []).map((p: string) => p.toLowerCase());\n\n orderedTags.sort((a, b) => {\n const aKey = a.key.toLowerCase();\n const bKey = b.key.toLowerCase();\n\n for (let i = 0; i < tp.length; i++) {\n const p = tp[i];\n if (aKey.startsWith(p) && !bKey.startsWith(p)) {\n return -1;\n }\n if (!aKey.startsWith(p) && bKey.startsWith(p)) {\n return 1;\n }\n }\n\n if (aKey > bKey) {\n return 1;\n }\n if (aKey < bKey) {\n return -1;\n }\n return 0;\n });\n\n return orderedTags;\n}\n\n/**\n * NOTE: Mutates `data` - Transform the HTTP response data into the form the app\n * generally requires.\n */\nexport default function transformTraceData(data: TraceResponse | undefined): Trace | null {\n if (!data?.traceID) {\n return null;\n }\n const traceID = data.traceID.toLowerCase();\n\n let traceEndTime = 0;\n let traceStartTime = Number.MAX_SAFE_INTEGER;\n const spanIdCounts = new Map();\n const spanMap = new Map();\n // filter out spans with empty start times\n // eslint-disable-next-line no-param-reassign\n data.spans = data.spans.filter((span) => Boolean(span.startTime));\n\n const max = data.spans.length;\n for (let i = 0; i < max; i++) {\n const span: TraceSpan = data.spans[i] as TraceSpan;\n const { startTime, duration, processID } = span;\n //\n let spanID = span.spanID;\n // check for start / end time for the trace\n if (startTime < traceStartTime) {\n traceStartTime = startTime;\n }\n if (startTime + duration > traceEndTime) {\n traceEndTime = startTime + duration;\n }\n // make sure span IDs are unique\n const idCount = spanIdCounts.get(spanID);\n if (idCount != null) {\n // eslint-disable-next-line no-console\n console.warn(`Dupe spanID, ${idCount + 1} x ${spanID}`, span, spanMap.get(spanID));\n if (_isEqual(span, spanMap.get(spanID))) {\n // eslint-disable-next-line no-console\n console.warn('\\t two spans with same ID have `isEqual(...) === true`');\n }\n spanIdCounts.set(spanID, idCount + 1);\n spanID = `${spanID}_${idCount}`;\n span.spanID = spanID;\n } else {\n spanIdCounts.set(spanID, 1);\n }\n span.process = data.processes[processID];\n spanMap.set(spanID, span);\n }\n // tree is necessary to sort the spans, so children follow parents, and\n // siblings are sorted by start time\n const tree = getTraceSpanIdsAsTree(data);\n const spans: TraceSpan[] = [];\n const svcCounts: Record = {};\n\n // Eslint complains about number type not needed but then TS complains it is implicitly any.\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n tree.walk((spanID: string, node: TreeNode, depth: number = 0) => {\n if (spanID === '__root__') {\n return;\n }\n const span = spanMap.get(spanID) as TraceSpan;\n if (!span) {\n return;\n }\n const { serviceName } = span.process;\n svcCounts[serviceName] = (svcCounts[serviceName] || 0) + 1;\n span.relativeStartTime = span.startTime - traceStartTime;\n span.depth = depth - 1;\n span.hasChildren = node.children.length > 0;\n span.childSpanCount = node.children.length;\n span.warnings = span.warnings || [];\n span.tags = span.tags || [];\n span.references = span.references || [];\n const tagsInfo = deduplicateTags(span.tags);\n span.tags = orderTags(tagsInfo.tags, getConfigValue('topTagPrefixes'));\n span.warnings = span.warnings.concat(tagsInfo.warnings);\n span.references.forEach((ref, index) => {\n const refSpan = spanMap.get(ref.spanID) as TraceSpan;\n if (refSpan) {\n // eslint-disable-next-line no-param-reassign\n ref.span = refSpan;\n if (index > 0) {\n // Don't take into account the parent, just other references.\n refSpan.subsidiarilyReferencedBy = refSpan.subsidiarilyReferencedBy || [];\n refSpan.subsidiarilyReferencedBy.push({\n spanID,\n traceID,\n span,\n refType: ref.refType,\n });\n }\n }\n });\n spans.push(span);\n });\n const traceName = getTraceName(spans);\n const services = Object.keys(svcCounts).map((name) => ({ name, numberOfSpans: svcCounts[name] }));\n return {\n services,\n spans,\n traceID,\n traceName,\n // can't use spread operator for intersection types\n // repl: https://goo.gl/4Z23MJ\n // issue: https://github.com/facebook/flow/issues/1511\n processes: data.processes,\n duration: traceEndTime - traceStartTime,\n startTime: traceStartTime,\n endTime: traceEndTime,\n };\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../types';\nimport { TraceKeyValuePair, TraceSpan } from '../types/trace';\n\nexport default function filterSpans(textFilter: string, spans: TraceSpan[] | TNil) {\n if (!spans) {\n return undefined;\n }\n\n // if a span field includes at least one filter in includeFilters, the span is a match\n const includeFilters: string[] = [];\n\n // values with keys that include text in any one of the excludeKeys will be ignored\n const excludeKeys: string[] = [];\n\n // split textFilter by whitespace, remove empty strings, and extract includeFilters and excludeKeys\n textFilter\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((w) => {\n if (w[0] === '-') {\n excludeKeys.push(w.slice(1).toLowerCase());\n } else {\n includeFilters.push(w.toLowerCase());\n }\n });\n\n const isTextInFilters = (filters: string[], text: string) =>\n filters.some((filter) => text.toLowerCase().includes(filter));\n\n const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>\n kvs\n ? kvs.some((kv) => {\n // ignore checking key and value for a match if key is in excludeKeys\n if (isTextInFilters(excludeKeys, kv.key)) {\n return false;\n }\n // match if key or value matches an item in includeFilters\n return isTextInFilters(includeFilters, kv.key) || isTextInFilters(includeFilters, kv.value.toString());\n })\n : false;\n\n const isSpanAMatch = (span: TraceSpan) =>\n isTextInFilters(includeFilters, span.operationName) ||\n isTextInFilters(includeFilters, span.process.serviceName) ||\n isTextInKeyValues(span.tags) ||\n (span.logs !== null && span.logs.some((log) => isTextInKeyValues(log.fields))) ||\n isTextInKeyValues(span.process.tags) ||\n includeFilters.some((filter) => filter === span.spanID);\n\n // declare as const because need to disambiguate the type\n const rv: Set = new Set(spans.filter(isSpanAMatch).map((span: TraceSpan) => span.spanID));\n return rv;\n}\n","import { css } from '@emotion/css';\n\nexport const ubRelative = css`\n position: relative;\n`;\n\nexport const ubMb1 = css`\n margin-bottom: 0.25rem;\n`;\n\nexport const ubMy1 = css`\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n`;\n\nexport const ubM0 = css`\n margin: 0;\n`;\n\nexport const ubPx2 = css`\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n`;\n\nexport const ubPb2 = css`\n padding-bottom: 0.5rem;\n`;\n\nexport const ubFlex = css`\n display: flex;\n`;\n\nexport const ubItemsCenter = css`\n align-items: center;\n`;\n\nexport const ubItemsStart = css`\n align-items: start;\n`;\n\nexport const ubFlexAuto = css`\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n`;\n\nexport const ubTxRightAlign = css`\n text-align: right;\n`;\n\nexport const ubInlineBlock = css`\n display: inline-block;\n`;\n\nexport const uAlignIcon = css`\n margin: -0.2rem 0.25rem 0 0;\n`;\n\nexport const uTxEllipsis = css`\n text-overflow: ellipsis;\n`;\n\nexport const uWidth100 = css`\n width: 100%;\n`;\n\nexport const uTxMuted = css`\n color: #aaa;\n`;\n\nexport const ubJustifyEnd = css`\n justify-content: flex-end;\n`;\n","/**\n * Get non overlapping duration of the ranges as they can overlap or have gaps.\n */\nimport { FieldType, MutableDataFrame, NodeGraphDataFrameFieldNames as Fields } from '@grafana/data';\n\nexport function getNonOverlappingDuration(ranges: Array<[number, number]>): number {\n ranges.sort((a, b) => a[0] - b[0]);\n const mergedRanges = ranges.reduce((acc, range) => {\n if (!acc.length) {\n return [range];\n }\n const tail = acc.slice(-1)[0];\n const [prevStart, prevEnd] = tail;\n const [start, end] = range;\n if (end < prevEnd) {\n // In this case the range is completely inside the prev range so we can just ignore it.\n return acc;\n }\n\n if (start > prevEnd) {\n // There is no overlap so we can just add it to stack\n return [...acc, range];\n }\n\n // We know there is overlap and current range ends later than previous so we can just extend the range\n return [...acc.slice(0, -1), [prevStart, end]] as Array<[number, number]>;\n }, [] as Array<[number, number]>);\n\n return mergedRanges.reduce((acc, range) => {\n return acc + (range[1] - range[0]);\n }, 0);\n}\n\n/**\n * Returns a map of the spans with children array for easier processing. It will also contain empty spans in case\n * span is missing but other spans are it's children. This is more generic because it needs to allow iterating over\n * both arrays and dataframe views.\n */\nexport function makeSpanMap(getSpan: (index: number) => { span: T; id: string; parentIds: string[] } | undefined): {\n [id: string]: { span: T; children: string[] };\n} {\n const spanMap: { [id: string]: { span?: T; children: string[] } } = {};\n\n let span;\n for (let index = 0; (span = getSpan(index)), !!span; index++) {\n if (!spanMap[span.id]) {\n spanMap[span.id] = {\n span: span.span,\n children: [],\n };\n } else {\n spanMap[span.id].span = span.span;\n }\n\n for (const parentId of span.parentIds) {\n if (parentId) {\n if (!spanMap[parentId]) {\n spanMap[parentId] = {\n span: undefined,\n children: [span.id],\n };\n } else {\n spanMap[parentId].children.push(span.id);\n }\n }\n }\n }\n return spanMap as { [id: string]: { span: T; children: string[] } };\n}\n\nexport function getStats(duration: number, traceDuration: number, selfDuration: number) {\n return {\n main: `${toFixedNoTrailingZeros(duration)}ms (${toFixedNoTrailingZeros((duration / traceDuration) * 100)}%)`,\n secondary: `${toFixedNoTrailingZeros(selfDuration)}ms (${toFixedNoTrailingZeros(\n (selfDuration / duration) * 100\n )}%)`,\n };\n}\n\nfunction toFixedNoTrailingZeros(n: number) {\n return parseFloat(n.toFixed(2));\n}\n\n/**\n * Create default frames used when returning data for node graph.\n */\nexport function makeFrames() {\n const nodesFrame = new MutableDataFrame({\n fields: [\n { name: Fields.id, type: FieldType.string },\n { name: Fields.title, type: FieldType.string },\n { name: Fields.subTitle, type: FieldType.string },\n { name: Fields.mainStat, type: FieldType.string, config: { displayName: 'Total time (% of trace)' } },\n { name: Fields.secondaryStat, type: FieldType.string, config: { displayName: 'Self time (% of total)' } },\n {\n name: Fields.color,\n type: FieldType.number,\n config: { color: { mode: 'continuous-GrYlRd' }, displayName: 'Self time / Trace duration' },\n },\n ],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n });\n\n const edgesFrame = new MutableDataFrame({\n fields: [\n { name: Fields.id, type: FieldType.string },\n { name: Fields.target, type: FieldType.string },\n { name: Fields.source, type: FieldType.string },\n ],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n });\n\n return [nodesFrame, edgesFrame];\n}\n","import {\n DataFrame,\n DataSourceInstanceSettings,\n FieldType,\n MutableDataFrame,\n TraceLog,\n TraceSpanRow,\n} from '@grafana/data';\nimport { transformTraceData } from '@jaegertracing/jaeger-ui-components';\n\nimport { JaegerResponse, Span, TraceProcess, TraceResponse } from './types';\n\nexport function createTraceFrame(data: TraceResponse): DataFrame {\n const spans = data.spans.map((s) => toSpanRow(s, data.processes));\n\n const frame = new MutableDataFrame({\n fields: [\n { name: 'traceID', type: FieldType.string },\n { name: 'spanID', type: FieldType.string },\n { name: 'parentSpanID', type: FieldType.string },\n { name: 'operationName', type: FieldType.string },\n { name: 'serviceName', type: FieldType.string },\n { name: 'serviceTags', type: FieldType.other },\n { name: 'startTime', type: FieldType.number },\n { name: 'duration', type: FieldType.number },\n { name: 'logs', type: FieldType.other },\n { name: 'tags', type: FieldType.other },\n { name: 'warnings', type: FieldType.other },\n { name: 'stackTraces', type: FieldType.other },\n ],\n meta: {\n preferredVisualisationType: 'trace',\n custom: {\n traceFormat: 'jaeger',\n },\n },\n });\n\n for (const span of spans) {\n frame.add(span);\n }\n\n return frame;\n}\n\nfunction toSpanRow(span: Span, processes: Record): TraceSpanRow {\n return {\n spanID: span.spanID,\n traceID: span.traceID,\n parentSpanID: span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID,\n operationName: span.operationName,\n // from micro to millis\n startTime: span.startTime / 1000,\n duration: span.duration / 1000,\n logs: span.logs.map((l) => ({\n ...l,\n timestamp: l.timestamp / 1000,\n })),\n tags: span.tags,\n warnings: span.warnings ?? undefined,\n stackTraces: span.stackTraces,\n serviceName: processes[span.processID].serviceName,\n serviceTags: processes[span.processID].tags,\n };\n}\n\nexport function createTableFrame(data: TraceResponse[], instanceSettings: DataSourceInstanceSettings): DataFrame {\n const frame = new MutableDataFrame({\n fields: [\n {\n name: 'traceID',\n type: FieldType.string,\n config: {\n unit: 'string',\n displayNameFromDS: 'Trace ID',\n links: [\n {\n title: 'Trace: ${__value.raw}',\n url: '',\n internal: {\n datasourceUid: instanceSettings.uid,\n datasourceName: instanceSettings.name,\n query: {\n query: '${__value.raw}',\n },\n },\n },\n ],\n },\n },\n { name: 'traceName', type: FieldType.string, config: { displayNameFromDS: 'Trace name' } },\n { name: 'startTime', type: FieldType.time, config: { displayNameFromDS: 'Start time' } },\n { name: 'duration', type: FieldType.number, config: { displayNameFromDS: 'Duration', unit: 'µs' } },\n ],\n meta: {\n preferredVisualisationType: 'table',\n },\n });\n // Show the most recent traces\n const traceData = data.map(transformToTraceData).sort((a, b) => b?.startTime! - a?.startTime!);\n\n for (const trace of traceData) {\n frame.add(trace);\n }\n\n return frame;\n}\n\nfunction transformToTraceData(data: TraceResponse) {\n const traceData = transformTraceData(data);\n if (!traceData) {\n return;\n }\n\n return {\n traceID: traceData.traceID,\n startTime: traceData.startTime / 1000,\n duration: traceData.duration,\n traceName: traceData.traceName,\n };\n}\n\nexport function transformToJaeger(data: MutableDataFrame): JaegerResponse {\n let traceResponse: TraceResponse = {\n traceID: '',\n spans: [],\n processes: {},\n warnings: null,\n };\n let processes: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const span = data.get(i);\n\n // Set traceID\n if (!traceResponse.traceID) {\n traceResponse.traceID = span.traceID;\n }\n\n // Create process if doesn't exist\n if (!processes.find((p) => p === span.serviceName)) {\n processes.push(span.serviceName);\n traceResponse.processes[`p${processes.length}`] = {\n serviceName: span.serviceName,\n tags: span.serviceTags,\n };\n }\n\n // Create span\n traceResponse.spans.push({\n traceID: span.traceID,\n spanID: span.spanID,\n duration: span.duration * 1000,\n references: span.parentSpanID\n ? [\n {\n refType: 'CHILD_OF',\n spanID: span.parentSpanID,\n traceID: span.traceID,\n },\n ]\n : [],\n flags: 0,\n logs: span.logs.map((l: TraceLog) => ({\n ...l,\n timestamp: l.timestamp * 1000,\n })),\n operationName: span.operationName,\n processID:\n Object.keys(traceResponse.processes).find(\n (key) => traceResponse.processes[key].serviceName === span.serviceName\n ) || '',\n startTime: span.startTime * 1000,\n tags: span.tags,\n warnings: span.warnings ? span.warnings : null,\n });\n }\n\n return { data: [traceResponse], total: 0, limit: 0, offset: 0, errors: null };\n}\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar IconBase = function IconBase(_ref, _ref2) {\n var children = _ref.children;\n var color = _ref.color;\n var size = _ref.size;\n var style = _ref.style;\n var width = _ref.width;\n var height = _ref.height;\n\n var props = _objectWithoutProperties(_ref, ['children', 'color', 'size', 'style', 'width', 'height']);\n\n var _ref2$reactIconBase = _ref2.reactIconBase;\n var reactIconBase = _ref2$reactIconBase === undefined ? {} : _ref2$reactIconBase;\n\n var computedSize = size || reactIconBase.size || '1em';\n return _react2.default.createElement('svg', _extends({\n children: children,\n fill: 'currentColor',\n preserveAspectRatio: 'xMidYMid meet',\n height: height || computedSize,\n width: width || computedSize\n }, reactIconBase, props, {\n style: _extends({\n verticalAlign: 'middle',\n color: color || reactIconBase.color\n }, reactIconBase.style || {}, style)\n }));\n};\n\nIconBase.propTypes = {\n color: _propTypes2.default.string,\n size: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n width: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n height: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),\n style: _propTypes2.default.object\n};\n\nIconBase.contextTypes = {\n reactIconBase: _propTypes2.default.shape(IconBase.propTypes)\n};\n\nexports.default = IconBase;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoAlert = function IoAlert(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm25 37.5h-10v-7.5h10v7.5z m-1.2-12.5h-7.5l-1.3-22.5h10z' })\n )\n );\n};\n\nexports.default = IoAlert;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoAndroidOpen = function IoAndroidOpen(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm31.6 31.6v-10.3h3.4v10.3c0 1.8-1.6 3.4-3.4 3.4h-23.2c-1.8 0-3.4-1.6-3.4-3.4v-23.2c0-1.8 1.6-3.4 3.4-3.4h10.4v3.4h-10.4v23.2h23.2z m-9.1-26.6h12.5v12.5h-3.4v-6.8l-16.8 16.8-2.3-2.3 16.8-16.8h-6.8v-3.4z' })\n )\n );\n};\n\nexports.default = IoAndroidOpen;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoArrowRightA = function IoArrowRightA(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm35 20l-15 15v-8.7h-15v-12.5h15v-8.8z' })\n )\n );\n};\n\nexports.default = IoArrowRightA;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoChevronRight = function IoChevronRight(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm23.3 20l-13.1-13.6c-0.3-0.3-0.3-0.9 0-1.2l2.4-2.4c0.3-0.3 0.9-0.4 1.2-0.1l16 16.7c0.1 0.1 0.2 0.4 0.2 0.6s-0.1 0.5-0.2 0.6l-16 16.7c-0.3 0.3-0.9 0.3-1.2 0l-2.4-2.5c-0.3-0.3-0.3-0.9 0-1.2z' })\n )\n );\n};\n\nexports.default = IoChevronRight;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoIosArrowDown = function IoIosArrowDown(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm31 12.5l1.5 1.6-12.5 13.4-12.5-13.4 1.5-1.6 11 11.7z' })\n )\n );\n};\n\nexports.default = IoIosArrowDown;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoIosArrowRight = function IoIosArrowRight(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm12.5 9l1.6-1.5 13.4 12.5-13.4 12.5-1.6-1.5 11.7-11z' })\n )\n );\n};\n\nexports.default = IoIosArrowRight;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IoLink = function IoLink(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm20 16.3z m8.8-3.8c3.4 0 6.2 2.8 6.2 6.3v2.5c0 3.4-2.8 6.2-6.2 6.2h-8.8c-2.6 0-4.7-1.6-5.7-3.7-0.3-0.8-0.5-1.6-0.5-2.5v-2.5h3.7v2.5c0 1.4 1.1 2.5 2.5 2.5h8.8c1.4 0 2.5-1.1 2.5-2.5v-2.5c0-1.5-1.1-2.5-2.5-2.5h-1.3c-0.5-2.5-2.5-3.8-2.5-3.8h3.8z m-3 3.8c0.3 0.7 0.5 1.6 0.5 2.5v2.5h-3.8v-2.5c0-1.5-1.1-2.5-2.5-2.5h-8.7c-1.5 0-2.5 1-2.5 2.5v2.5c0 1.4 1 2.5 2.5 2.5h1.2c0.5 2.4 2.5 3.7 2.5 3.7h-3.7c-3.5 0-6.3-2.8-6.3-6.2v-2.5c0-3.5 2.8-6.3 6.3-6.3h8.7c2.6 0 4.8 1.6 5.8 3.8z' })\n )\n );\n};\n\nexports.default = IoLink;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MdFileUpload = function MdFileUpload(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm8.4 30h23.2v3.4h-23.2v-3.4z m6.6-3.4v-10h-6.6l11.6-11.6 11.6 11.6h-6.6v10h-10z' })\n )\n );\n};\n\nexports.default = MdFileUpload;\nmodule.exports = exports['default'];","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactIconBase = require('react-icon-base');\n\nvar _reactIconBase2 = _interopRequireDefault(_reactIconBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MdKeyboardArrowRight = function MdKeyboardArrowRight(props) {\n return _react2.default.createElement(\n _reactIconBase2.default,\n _extends({ viewBox: '0 0 40 40' }, props),\n _react2.default.createElement(\n 'g',\n null,\n _react2.default.createElement('path', { d: 'm14.3 27.3l7.7-7.7-7.7-7.7 2.3-2.3 10 10-10 10z' })\n )\n );\n};\n\nexports.default = MdKeyboardArrowRight;\nmodule.exports = exports['default'];","// The MIT License (MIT)\n//\n// Copyright (c) 2014 Mathias Buus\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nconst INDENT = ' ';\n\nfunction inlineRule(objRule) {\n let str = '';\n objRule &&\n Object.keys(objRule).forEach(function (rule) {\n str += rule + ':' + objRule[rule] + ';';\n });\n return str;\n}\n\nfunction Stylize(styleFile) {\n function styleClass(cssClass) {\n return 'class=\"' + cssClass + '\"';\n }\n\n function styleInline(cssClass) {\n return 'style=\"' + inlineRule(styleFile['.' + cssClass]) + '\"';\n }\n\n if (!styleFile) {\n return styleClass;\n }\n return styleInline;\n}\n\nfunction type(doc) {\n if (doc === null) {\n return 'null';\n }\n if (Array.isArray(doc)) {\n return 'array';\n }\n if (typeof doc === 'string' && /^https?:/.test(doc)) {\n return 'link';\n }\n if (typeof doc === 'object' && typeof doc.toISOString === 'function') {\n return 'date';\n }\n\n return typeof doc;\n}\n\nfunction escape(str) {\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"');\n}\n\nmodule.exports = function (doc, styleFile) {\n let indent = '';\n const style = Stylize(styleFile);\n\n let forEach = function (list, start, end, fn) {\n if (!list.length) {\n return start + ' ' + end;\n }\n\n let out = start + '\\n';\n\n indent += INDENT;\n list.forEach(function (key, i) {\n out += indent + fn(key) + (i < list.length - 1 ? ',' : '') + '\\n';\n });\n indent = indent.slice(0, -INDENT.length);\n\n return out + indent + end;\n };\n\n function visit(obj) {\n if (obj === undefined) {\n return '';\n }\n\n switch (type(obj)) {\n case 'boolean':\n return '' + obj + '';\n\n case 'number':\n return '' + obj + '';\n\n case 'date':\n return '\"' + escape(obj.toISOString()) + '\"';\n\n case 'null':\n return 'null';\n\n case 'string':\n return '\"' + escape(obj.replace(/\\n/g, '\\n' + indent)) + '\"';\n\n case 'link':\n return (\n '\"' + escape(obj) + '\"'\n );\n\n case 'array':\n return forEach(obj, '[', ']', visit);\n\n case 'object':\n const keys = Object.keys(obj).filter(function (key) {\n return obj[key] !== undefined;\n });\n\n return forEach(keys, '{', '}', function (key) {\n return '\"' + escape(key) + '\": ' + visit(obj[key]);\n });\n }\n\n return '';\n }\n\n return '
' + visit(doc) + '
';\n};\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function (element, options) {\n var self = this\n var Combokeys = self.constructor\n\n /**\n * an object of passed options\n *\n * @type { storeInstancesGlobally?: true }\n */\n\n self.options = Object.assign({ storeInstancesGlobally: true }, options || {})\n\n /**\n * a list of all the callbacks setup via Combokeys.bind()\n *\n * @type {Object}\n */\n self.callbacks = {}\n\n /**\n * direct map of string combinations to callbacks used for trigger()\n *\n * @type {Object}\n */\n self.directMap = {}\n\n /**\n * keeps track of what level each sequence is at since multiple\n * sequences can start out with the same sequence\n *\n * @type {Object}\n */\n self.sequenceLevels = {}\n\n /**\n * variable to store the setTimeout call\n *\n * @type {null|number}\n */\n self.resetTimer = null\n\n /**\n * temporary state where we will ignore the next keyup\n *\n * @type {boolean|string}\n */\n self.ignoreNextKeyup = false\n\n /**\n * temporary state where we will ignore the next keypress\n *\n * @type {boolean}\n */\n self.ignoreNextKeypress = false\n\n /**\n * are we currently inside of a sequence?\n * type of action (\"keyup\" or \"keydown\" or \"keypress\") or false\n *\n * @type {boolean|string}\n */\n self.nextExpectedAction = false\n\n self.element = element\n\n self.addEvents()\n\n if (self.options.storeInstancesGlobally) {\n Combokeys.instances.push(self)\n }\n\n return self\n}\n\nmodule.exports.prototype.bind = require('./prototype/bind')\nmodule.exports.prototype.bindMultiple = require('./prototype/bindMultiple')\nmodule.exports.prototype.unbind = require('./prototype/unbind')\nmodule.exports.prototype.trigger = require('./prototype/trigger')\nmodule.exports.prototype.reset = require('./prototype/reset.js')\nmodule.exports.prototype.stopCallback = require('./prototype/stopCallback')\nmodule.exports.prototype.handleKey = require('./prototype/handleKey')\nmodule.exports.prototype.addEvents = require('./prototype/addEvents')\nmodule.exports.prototype.bindSingle = require('./prototype/bindSingle')\nmodule.exports.prototype.getKeyInfo = require('./prototype/getKeyInfo')\nmodule.exports.prototype.pickBestAction = require('./prototype/pickBestAction')\nmodule.exports.prototype.getReverseMap = require('./prototype/getReverseMap')\nmodule.exports.prototype.getMatches = require('./prototype/getMatches')\nmodule.exports.prototype.resetSequences = require('./prototype/resetSequences')\nmodule.exports.prototype.fireCallback = require('./prototype/fireCallback')\nmodule.exports.prototype.bindSequence = require('./prototype/bindSequence')\nmodule.exports.prototype.resetSequenceTimer = require('./prototype/resetSequenceTimer')\nmodule.exports.prototype.detach = require('./prototype/detach')\n\nmodule.exports.instances = []\nmodule.exports.reset = require('./reset')\n\n/**\n * variable to store the flipped version of MAP from above\n * needed to check if we should use keypress or not when no action\n * is specified\n *\n * @type {Object|undefined}\n */\nmodule.exports.REVERSE_MAP = null\n","/* eslint-env node, browser */\n'use strict'\nmodule.exports = function () {\n var self = this\n var on = require('./dom-event')\n var element = self.element\n\n self.eventHandler = require('./handleKeyEvent').bind(self)\n\n on(element, 'keypress', self.eventHandler)\n on(element, 'keydown', self.eventHandler)\n on(element, 'keyup', self.eventHandler)\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * binds an event to Combokeys\n *\n * can be a single key, a combination of keys separated with +,\n * an array of keys, or a sequence of keys separated by spaces\n *\n * be sure to list the modifier keys first to make sure that the\n * correct key ends up getting bound (the last key in the pattern)\n *\n * @param {string|Array} keys\n * @param {Function} callback\n * @param {string=} action - \"keypress\", \"keydown\", or \"keyup\"\n * @returns void\n */\nmodule.exports = function (keys, callback, action) {\n var self = this\n\n keys = keys instanceof Array ? keys : [keys]\n self.bindMultiple(keys, callback, action)\n return self\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds multiple combinations to the same callback\n *\n * @param {Array} combinations\n * @param {Function} callback\n * @param {string|undefined} action\n * @returns void\n */\nmodule.exports = function (combinations, callback, action) {\n var self = this\n\n for (var j = 0; j < combinations.length; ++j) {\n self.bindSingle(combinations[j], callback, action)\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a key sequence to an event\n *\n * @param {string} combo - combo specified in bind call\n * @param {Array} keys\n * @param {Function} callback\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (combo, keys, callback, action) {\n var self = this\n\n // start off by adding a sequence level record for this combination\n // and setting the level to 0\n self.sequenceLevels[combo] = 0\n\n /**\n * callback to increase the sequence level for this sequence and reset\n * all other sequences that were active\n *\n * @param {string} nextAction\n * @returns {Function}\n */\n function increaseSequence (nextAction) {\n return function () {\n self.nextExpectedAction = nextAction\n ++self.sequenceLevels[combo]\n self.resetSequenceTimer()\n }\n }\n\n /**\n * wraps the specified callback inside of another function in order\n * to reset all sequence counters as soon as this sequence is done\n *\n * @param {Event} e\n * @returns void\n */\n function callbackAndReset (e) {\n var characterFromEvent\n self.fireCallback(callback, e, combo)\n\n // we should ignore the next key up if the action is key down\n // or keypress. this is so if you finish a sequence and\n // release the key the final key will not trigger a keyup\n if (action !== 'keyup') {\n characterFromEvent = require('../../helpers/characterFromEvent')\n self.ignoreNextKeyup = characterFromEvent(e)\n }\n\n // weird race condition if a sequence ends with the key\n // another sequence begins with\n setTimeout(\n function () {\n self.resetSequences()\n },\n 10\n )\n }\n\n // loop through keys one at a time and bind the appropriate callback\n // function. for any key leading up to the final one it should\n // increase the sequence. after the final, it should reset all sequences\n //\n // if an action is specified in the original bind call then that will\n // be used throughout. otherwise we will pass the action that the\n // next key in the sequence should match. this allows a sequence\n // to mix and match keypress and keydown events depending on which\n // ones are better suited to the key provided\n for (var j = 0; j < keys.length; ++j) {\n var isFinal = j + 1 === keys.length\n var wrappedCallback = isFinal ? callbackAndReset : increaseSequence(action || self.getKeyInfo(keys[j + 1]).action)\n self.bindSingle(keys[j], wrappedCallback, action, combo, j)\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * binds a single keyboard combination\n *\n * @param {string} combination\n * @param {Function} callback\n * @param {string=} action\n * @param {string=} sequenceName - name of sequence if part of sequence\n * @param {number=} level - what part of the sequence the command is\n * @returns void\n */\nmodule.exports = function (combination, callback, action, sequenceName, level) {\n var self = this\n\n // store a direct mapped reference for use with Combokeys.trigger\n self.directMap[combination + ':' + action] = callback\n\n // make sure multiple spaces in a row become a single space\n combination = combination.replace(/\\s+/g, ' ')\n\n var sequence = combination.split(' ')\n var info\n\n // if this pattern is a sequence of keys then run through this method\n // to reprocess each pattern one key at a time\n if (sequence.length > 1) {\n self.bindSequence(combination, sequence, callback, action)\n return\n }\n\n info = self.getKeyInfo(combination, action)\n\n // make sure to initialize array if this is the first time\n // a callback is added for this key\n self.callbacks[info.key] = self.callbacks[info.key] || []\n\n // remove an existing match if there is one\n self.getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level)\n\n // add this call back to the array\n // if it is a sequence put it at the beginning\n // if not put it at the end\n //\n // this is important because the way these are processed expects\n // the sequence ones to come first\n self.callbacks[info.key][sequenceName ? 'unshift' : 'push']({\n callback: callback,\n modifiers: info.modifiers,\n action: info.action,\n seq: sequenceName,\n level: level,\n combo: combination\n })\n}\n","var off = require('./dom-event').off\nmodule.exports = function () {\n var self = this\n var element = self.element\n\n off(element, 'keypress', self.eventHandler)\n off(element, 'keydown', self.eventHandler)\n off(element, 'keyup', self.eventHandler)\n}\n","module.exports = on\nmodule.exports.on = on\nmodule.exports.off = off\n\nfunction on (element, event, callback, capture) {\n !element.addEventListener && (event = 'on' + event)\n ;(element.addEventListener || element.attachEvent).call(element, event, callback, capture)\n return callback\n}\n\nfunction off (element, event, callback, capture) {\n !element.removeEventListener && (event = 'on' + event)\n ;(element.removeEventListener || element.detachEvent).call(element, event, callback, capture)\n return callback\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * actually calls the callback function\n *\n * if your callback function returns false this will use the jquery\n * convention - prevent default and stop propogation on the event\n *\n * @param {Function} callback\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (callback, e, combo, sequence) {\n var self = this\n var preventDefault\n var stopPropagation\n\n // if this event should not happen stop here\n if (self.stopCallback(e, e.target || e.srcElement, combo, sequence)) {\n return\n }\n\n if (callback(e, combo) === false) {\n preventDefault = require('../../helpers/preventDefault')\n preventDefault(e)\n stopPropagation = require('../../helpers/stopPropagation')\n stopPropagation(e)\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Gets info for a specific key combination\n *\n * @param {string} combination key combination (\"command+s\" or \"a\" or \"*\")\n * @param {string=} action\n * @returns {Object}\n */\nmodule.exports = function (combination, action) {\n var self = this\n var keysFromString\n var keys\n var key\n var j\n var modifiers = []\n var SPECIAL_ALIASES\n var SHIFT_MAP\n var isModifier\n\n keysFromString = require('../../helpers/keysFromString')\n // take the keys from this pattern and figure out what the actual\n // pattern is all about\n keys = keysFromString(combination)\n\n SPECIAL_ALIASES = require('../../helpers/special-aliases')\n SHIFT_MAP = require('../../helpers/shift-map')\n isModifier = require('../../helpers/isModifier')\n for (j = 0; j < keys.length; ++j) {\n key = keys[j]\n\n // normalize key names\n if (SPECIAL_ALIASES[key]) {\n key = SPECIAL_ALIASES[key]\n }\n\n // if this is not a keypress event then we should\n // be smart about using shift keys\n // this will only work for US keyboards however\n if (action && action !== 'keypress' && SHIFT_MAP[key]) {\n key = SHIFT_MAP[key]\n modifiers.push('shift')\n }\n\n // if this key is a modifier then add it to the list of modifiers\n if (isModifier(key)) {\n modifiers.push(key)\n }\n }\n\n // depending on what the key combination is\n // we will try to pick the best event for it\n action = self.pickBestAction(key, modifiers, action)\n\n return {\n key: key,\n modifiers: modifiers,\n action: action\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * finds all callbacks that match based on the keycode, modifiers,\n * and action\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event|Object} e\n * @param {string=} sequenceName - name of the sequence we are looking for\n * @param {string=} combination\n * @param {number=} level\n * @returns {Array}\n */\nmodule.exports = function (character, modifiers, e, sequenceName, combination, level) {\n var self = this\n var j\n var callback\n var matches = []\n var action = e.type\n var isModifier\n var modifiersMatch\n\n if (\n action === 'keypress' &&\n // Firefox fires keypress for arrows\n !(e.code && e.code.slice(0, 5) === 'Arrow')\n ) {\n // 'any-character' callbacks are only on `keypress`\n var anyCharCallbacks = self.callbacks['any-character'] || []\n anyCharCallbacks.forEach(function (callback) {\n matches.push(callback)\n })\n }\n\n if (!self.callbacks[character]) { return matches }\n\n isModifier = require('../../helpers/isModifier')\n // if a modifier key is coming up on its own we should allow it\n if (action === 'keyup' && isModifier(character)) {\n modifiers = [character]\n }\n\n // loop through all callbacks for the key that was pressed\n // and see if any of them match\n for (j = 0; j < self.callbacks[character].length; ++j) {\n callback = self.callbacks[character][j]\n\n // if a sequence name is not specified, but this is a sequence at\n // the wrong level then move onto the next match\n if (!sequenceName && callback.seq && self.sequenceLevels[callback.seq] !== callback.level) {\n continue\n }\n\n // if the action we are looking for doesn't match the action we got\n // then we should keep going\n if (action !== callback.action) {\n continue\n }\n\n // if this is a keypress event and the meta key and control key\n // are not pressed that means that we need to only look at the\n // character, otherwise check the modifiers as well\n //\n // chrome will not fire a keypress if meta or control is down\n // safari will fire a keypress if meta or meta+shift is down\n // firefox will fire a keypress if meta or control is down\n modifiersMatch = require('./modifiersMatch')\n if ((action === 'keypress' && !e.metaKey && !e.ctrlKey) || modifiersMatch(modifiers, callback.modifiers)) {\n // when you bind a combination or sequence a second time it\n // should overwrite the first one. if a sequenceName or\n // combination is specified in this call it does just that\n //\n // @todo make deleting its own method?\n var deleteCombo = !sequenceName && callback.combo === combination\n var deleteSequence = sequenceName && callback.seq === sequenceName && callback.level === level\n if (deleteCombo || deleteSequence) {\n self.callbacks[character].splice(j, 1)\n }\n\n matches.push(callback)\n }\n }\n\n return matches\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * reverses the map lookup so that we can look for specific keys\n * to see what can and can't use keypress\n *\n * @return {Object}\n */\nmodule.exports = function () {\n var self = this\n var constructor = self.constructor\n var SPECIAL_KEYS_MAP\n\n if (!constructor.REVERSE_MAP) {\n constructor.REVERSE_MAP = {}\n SPECIAL_KEYS_MAP = require('../../helpers/special-keys-map')\n for (var key in SPECIAL_KEYS_MAP) {\n // pull out the numeric keypad from here cause keypress should\n // be able to detect the keys from the character\n if (key > 95 && key < 112) {\n continue\n }\n\n if (SPECIAL_KEYS_MAP.hasOwnProperty(key)) {\n constructor.REVERSE_MAP[SPECIAL_KEYS_MAP[key]] = key\n }\n }\n }\n return constructor.REVERSE_MAP\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a character key event\n *\n * @param {string} character\n * @param {Array} modifiers\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (character, modifiers, e) {\n var self = this\n var callbacks\n var j\n var doNotReset = {}\n var maxLevel = 0\n var processedSequenceCallback = false\n var isModifier\n var ignoreThisKeypress\n\n callbacks = self.getMatches(character, modifiers, e)\n // Calculate the maxLevel for sequences so we can only execute the longest callback sequence\n for (j = 0; j < callbacks.length; ++j) {\n if (callbacks[j].seq) {\n maxLevel = Math.max(maxLevel, callbacks[j].level)\n }\n }\n\n // loop through matching callbacks for this key event\n for (j = 0; j < callbacks.length; ++j) {\n // fire for all sequence callbacks\n // this is because if for example you have multiple sequences\n // bound such as \"g i\" and \"g t\" they both need to fire the\n // callback for matching g cause otherwise you can only ever\n // match the first one\n if (callbacks[j].seq) {\n // only fire callbacks for the maxLevel to prevent\n // subsequences from also firing\n //\n // for example 'a option b' should not cause 'option b' to fire\n // even though 'option b' is part of the other sequence\n //\n // any sequences that do not match here will be discarded\n // below by the resetSequences call\n if (callbacks[j].level !== maxLevel) {\n continue\n }\n\n processedSequenceCallback = true\n\n // keep a list of which sequences were matches for later\n doNotReset[callbacks[j].seq] = 1\n self.fireCallback(callbacks[j].callback, e, callbacks[j].combo, callbacks[j].seq)\n continue\n }\n\n // if there were no sequence matches but we are still here\n // that means this is a regular match so we should fire that\n if (!processedSequenceCallback) {\n self.fireCallback(callbacks[j].callback, e, callbacks[j].combo)\n }\n }\n\n // if the key you pressed matches the type of sequence without\n // being a modifier (ie \"keyup\" or \"keypress\") then we should\n // reset all sequences that were not matched by this event\n //\n // this is so, for example, if you have the sequence \"h a t\" and you\n // type \"h e a r t\" it does not match. in this case the \"e\" will\n // cause the sequence to reset\n //\n // modifier keys are ignored because you can have a sequence\n // that contains modifiers such as \"enter ctrl+space\" and in most\n // cases the modifier key will be pressed before the next key\n //\n // also if you have a sequence such as \"ctrl+b a\" then pressing the\n // \"b\" key will trigger a \"keypress\" and a \"keydown\"\n //\n // the \"keydown\" is expected when there is a modifier, but the\n // \"keypress\" ends up matching the nextExpectedAction since it occurs\n // after and that causes the sequence to reset\n //\n // we ignore keypresses in a sequence that directly follow a keydown\n // for the same character\n ignoreThisKeypress = e.type === 'keypress' && self.ignoreNextKeypress\n isModifier = require('../../helpers/isModifier')\n if (e.type === self.nextExpectedAction && !isModifier(character) && !ignoreThisKeypress) {\n self.resetSequences(doNotReset)\n }\n\n self.ignoreNextKeypress = processedSequenceCallback && e.type === 'keydown'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * handles a keydown event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n var self = this\n var characterFromEvent\n var eventModifiers\n\n // normalize e.which for key events\n // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion\n if (typeof e.which !== 'number') {\n e.which = e.keyCode\n }\n characterFromEvent = require('../../helpers/characterFromEvent')\n var character = characterFromEvent(e)\n\n // no character found then stop\n if (character === undefined) {\n return\n }\n\n // need to use === for the character check because the character can be 0\n if (e.type === 'keyup' && self.ignoreNextKeyup === character) {\n self.ignoreNextKeyup = false\n return\n }\n\n eventModifiers = require('../../helpers/eventModifiers')\n self.handleKey(character, eventModifiers(e), e)\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * checks if two arrays are equal\n *\n * @param {Array} modifiers1\n * @param {Array} modifiers2\n * @returns {boolean}\n */\nmodule.exports = function (modifiers1, modifiers2) {\n return modifiers1.sort().join(',') === modifiers2.sort().join(',')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * picks the best action based on the key combination\n *\n * @param {string} key - character for key\n * @param {Array} modifiers\n * @param {string=} action passed in\n */\nmodule.exports = function (key, modifiers, action) {\n var self = this\n\n // if no action was picked in we should try to pick the one\n // that we think would work best for this key\n if (!action) {\n action = self.getReverseMap()[key] ? 'keydown' : 'keypress'\n }\n\n // modifier keys don't work as expected with keypress,\n // switch to keydown\n if (action === 'keypress' && modifiers.length) {\n action = 'keydown'\n }\n\n return action\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets the library back to its initial state. This is useful\n * if you want to clear out the current keyboard shortcuts and bind\n * new ones - for example if you switch to another page\n *\n * @returns void\n */\nmodule.exports = function () {\n var self = this\n self.callbacks = {}\n self.directMap = {}\n return this\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * called to set a 1 second timeout on the specified sequence\n *\n * this is so after each key press in the sequence you have 1 second\n * to press the next key before you have to start over\n *\n * @returns void\n */\nmodule.exports = function () {\n var self = this\n\n clearTimeout(self.resetTimer)\n self.resetTimer = setTimeout(\n function () {\n self.resetSequences()\n },\n 1000\n )\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * resets all sequence counters except for the ones passed in\n *\n * @param {Object} doNotReset\n * @returns void\n */\nmodule.exports = function (doNotReset) {\n var self = this\n\n doNotReset = doNotReset || {}\n\n var activeSequences = false\n var key\n\n for (key in self.sequenceLevels) {\n if (doNotReset[key]) {\n activeSequences = true\n continue\n }\n self.sequenceLevels[key] = 0\n }\n\n if (!activeSequences) {\n self.nextExpectedAction = false\n }\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n* should we stop this event before firing off callbacks\n*\n* @param {Event} e\n* @param {Element} element\n* @return {boolean}\n*/\nmodule.exports = function (e, element) {\n // if the element has the class \"combokeys\" then no need to stop\n if ((' ' + element.className + ' ').indexOf(' combokeys ') > -1) {\n return false\n }\n\n var tagName = element.tagName.toLowerCase()\n\n // stop for input, select, and textarea\n return tagName === 'input' || tagName === 'select' || tagName === 'textarea' || element.isContentEditable\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * triggers an event that has already been bound\n *\n * @param {string} keys\n * @param {string=} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n var self = this\n if (self.directMap[keys + ':' + action]) {\n self.directMap[keys + ':' + action]({}, keys)\n }\n return this\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * unbinds an event to Combokeys\n *\n * the unbinding sets the callback function of the specified key combo\n * to an empty function and deletes the corresponding key in the\n * directMap dict.\n *\n * TODO: actually remove this from the callbacks dictionary instead\n * of binding an empty function\n *\n * the keycombo+action has to be exactly the same as\n * it was defined in the bind method\n *\n * @param {string|Array} keys\n * @param {string} action\n * @returns void\n */\nmodule.exports = function (keys, action) {\n var self = this\n\n return self.bind(keys, function () {}, action)\n}\n","/* eslint-env node, browser */\n'use strict'\n\nmodule.exports = function () {\n var self = this\n\n self.instances.forEach(function (combokeys) {\n combokeys.reset()\n })\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes the event and returns the key character\n *\n * @param {Event} e\n * @return {string}\n */\nmodule.exports = function (e) {\n var SPECIAL_KEYS_MAP,\n SPECIAL_CHARACTERS_MAP\n SPECIAL_KEYS_MAP = require('./special-keys-map')\n SPECIAL_CHARACTERS_MAP = require('./special-characters-map')\n\n // for keypress events we should return the character as is\n if (e.type === 'keypress') {\n var character = String.fromCharCode(e.which)\n\n // if the shift key is not pressed then it is safe to assume\n // that we want the character to be lowercase. this means if\n // you accidentally have caps lock on then your key bindings\n // will continue to work\n //\n // the only side effect that might not be desired is if you\n // bind something like 'A' cause you want to trigger an\n // event when capital A is pressed caps lock will no longer\n // trigger the event. shift+a will though.\n if (!e.shiftKey) {\n character = character.toLowerCase()\n }\n\n return character\n }\n\n // for non keypress events the special maps are needed\n if (SPECIAL_KEYS_MAP[e.which] !== undefined) {\n return SPECIAL_KEYS_MAP[e.which]\n }\n\n if (SPECIAL_CHARACTERS_MAP[e.which] !== undefined) {\n return SPECIAL_CHARACTERS_MAP[e.which]\n }\n\n // if it is not in the special map\n\n // with keydown and keyup events the character seems to always\n // come in as an uppercase character whether you are pressing shift\n // or not. we should make sure it is always lowercase for comparisons\n return String.fromCharCode(e.which).toLowerCase()\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * takes a key event and figures out what the modifiers are\n *\n * @param {Event} e\n * @returns {Array}\n */\nmodule.exports = function (e) {\n var modifiers = []\n\n if (e.shiftKey) {\n modifiers.push('shift')\n }\n\n if (e.altKey) {\n modifiers.push('alt')\n }\n\n if (e.ctrlKey) {\n modifiers.push('ctrl')\n }\n\n if (e.metaKey) {\n modifiers.push('meta')\n }\n\n return modifiers\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * determines if the keycode specified is a modifier key or not\n *\n * @param {string} key\n * @returns {boolean}\n */\nmodule.exports = function (key) {\n return key === 'shift' || key === 'ctrl' || key === 'alt' || key === 'meta'\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * Converts from a string key combination to an array\n *\n * @param {string} combination like \"command+shift+l\"\n * @return {Array}\n */\nmodule.exports = function (combination) {\n if (combination === '+') {\n return ['+']\n }\n\n return combination.split('+')\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * prevents default for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n if (e.preventDefault) {\n e.preventDefault()\n return\n }\n\n e.returnValue = false\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a mapping of keys that require shift on a US keypad\n * back to the non shift equivelents\n *\n * this is so you can use keyup events with these keys\n *\n * note that this will only work reliably on US keyboards\n *\n * @type {Object}\n */\nmodule.exports = {\n '~': '`',\n '!': '1',\n '@': '2',\n '#': '3',\n '$': '4',\n '%': '5',\n '^': '6',\n '&': '7',\n '*': '8',\n '(': '9',\n ')': '0',\n '_': '-',\n '+': '=',\n ':': ';',\n '\"': \"'\",\n '<': ',',\n '>': '.',\n '?': '/',\n '|': '\\\\'\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * this is a list of special strings you can use to map\n * to modifier keys when you specify your keyboard shortcuts\n *\n * @type {Object}\n */\nmodule.exports = {\n 'option': 'alt',\n 'command': 'meta',\n 'return': 'enter',\n 'escape': 'esc',\n 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl'\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping for special characters so they can support\n *\n * this dictionary is only used incase you want to bind a\n * keyup or keydown event to one of these keys\n *\n * @type {Object}\n */\nmodule.exports = {\n 106: '*',\n 107: 'plus',\n 109: 'minus',\n 110: '.',\n 111: '/',\n 186: ';',\n 187: '=',\n 188: ',',\n 189: '-',\n 190: '.',\n 191: '/',\n 192: '`',\n 219: '[',\n 220: '\\\\',\n 221: ']',\n 222: \"'\"\n}\n","/* eslint-env node, browser */\n'use strict'\n/**\n * mapping of special keycodes to their corresponding keys\n *\n * everything in this dictionary cannot use keypress events\n * so it has to be here to map to the correct keycodes for\n * keyup/keydown events\n *\n * @type {Object}\n */\nmodule.exports = {\n 8: 'backspace',\n 9: 'tab',\n 13: 'enter',\n 16: 'shift',\n 17: 'ctrl',\n 18: 'alt',\n 20: 'capslock',\n 27: 'esc',\n 32: 'space',\n 33: 'pageup',\n 34: 'pagedown',\n 35: 'end',\n 36: 'home',\n 37: 'left',\n 38: 'up',\n 39: 'right',\n 40: 'down',\n 45: 'ins',\n 46: 'del',\n 91: 'meta',\n 93: 'meta',\n 173: 'minus',\n 187: 'plus',\n 189: 'minus',\n 224: 'meta'\n}\n\n/**\n * loop through the f keys, f1 to f19 and add them to the map\n * programatically\n */\nfor (var i = 1; i < 20; ++i) {\n module.exports[111 + i] = 'f' + i\n}\n\n/**\n * loop through to map numbers on the numeric keypad\n */\nfor (i = 0; i <= 9; ++i) {\n module.exports[i + 96] = i\n}\n","/* eslint-env node, browser */\n'use strict'\n\n/**\n * stops propogation for this event\n *\n * @param {Event} e\n * @returns void\n */\nmodule.exports = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation()\n return\n }\n\n e.cancelBubble = true\n}\n","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar clipboardToIE11Formatting = {\n \"text/plain\": \"Text\",\n \"text/html\": \"Url\",\n \"default\": \"Text\"\n}\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n var debug,\n message,\n reselectPrevious,\n range,\n selection,\n mark,\n success = false;\n if (!options) {\n options = {};\n }\n debug = options.debug || false;\n try {\n reselectPrevious = deselectCurrent();\n\n range = document.createRange();\n selection = document.getSelection();\n\n mark = document.createElement(\"span\");\n mark.textContent = text;\n // reset user styles for span element\n mark.style.all = \"unset\";\n // prevents scrolling to the end of the page\n mark.style.position = \"fixed\";\n mark.style.top = 0;\n mark.style.clip = \"rect(0, 0, 0, 0)\";\n // used to preserve spaces and line breaks\n mark.style.whiteSpace = \"pre\";\n // do not inherit user-select (it may be `none`)\n mark.style.webkitUserSelect = \"text\";\n mark.style.MozUserSelect = \"text\";\n mark.style.msUserSelect = \"text\";\n mark.style.userSelect = \"text\";\n mark.addEventListener(\"copy\", function(e) {\n e.stopPropagation();\n if (options.format) {\n e.preventDefault();\n if (typeof e.clipboardData === \"undefined\") { // IE 11\n debug && console.warn(\"unable to use e.clipboardData\");\n debug && console.warn(\"trying IE specific stuff\");\n window.clipboardData.clearData();\n var format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting[\"default\"]\n window.clipboardData.setData(format, text);\n } else { // all other browsers\n e.clipboardData.clearData();\n e.clipboardData.setData(options.format, text);\n }\n }\n if (options.onCopy) {\n e.preventDefault();\n options.onCopy(e.clipboardData);\n }\n });\n\n document.body.appendChild(mark);\n\n range.selectNodeContents(mark);\n selection.addRange(range);\n\n var successful = document.execCommand(\"copy\");\n if (!successful) {\n throw new Error(\"copy command was unsuccessful\");\n }\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using execCommand: \", err);\n debug && console.warn(\"trying IE specific stuff\");\n try {\n window.clipboardData.setData(options.format || \"text\", text);\n options.onCopy && options.onCopy(window.clipboardData);\n success = true;\n } catch (err) {\n debug && console.error(\"unable to copy using clipboardData: \", err);\n debug && console.error(\"falling back to prompt\");\n message = format(\"message\" in options ? options.message : defaultMessage);\n window.prompt(message, text);\n }\n } finally {\n if (selection) {\n if (typeof selection.removeRange == \"function\") {\n selection.removeRange(range);\n } else {\n selection.removeAllRanges();\n }\n }\n\n if (mark) {\n document.body.removeChild(mark);\n }\n reselectPrevious();\n }\n\n return success;\n}\n\nmodule.exports = copy;\n","module.exports = function deepFreeze (o) {\n Object.freeze(o);\n\n Object.getOwnPropertyNames(o).forEach(function (prop) {\n if (o.hasOwnProperty(prop)\n && o[prop] !== null\n && (typeof o[prop] === \"object\" || typeof o[prop] === \"function\")\n && !Object.isFrozen(o[prop])) {\n deepFreeze(o[prop]);\n }\n });\n \n return o;\n};\n","/*\n * Fuzzy\n * https://github.com/myork/fuzzy\n *\n * Copyright (c) 2012 Matt York\n * Licensed under the MIT license.\n */\n\n(function() {\n\nvar root = this;\n\nvar fuzzy = {};\n\n// Use in node or in browser\nif (typeof exports !== 'undefined') {\n module.exports = fuzzy;\n} else {\n root.fuzzy = fuzzy;\n}\n\n// Return all elements of `array` that have a fuzzy\n// match against `pattern`.\nfuzzy.simpleFilter = function(pattern, array) {\n return array.filter(function(str) {\n return fuzzy.test(pattern, str);\n });\n};\n\n// Does `pattern` fuzzy match `str`?\nfuzzy.test = function(pattern, str) {\n return fuzzy.match(pattern, str) !== null;\n};\n\n// If `pattern` matches `str`, wrap each matching character\n// in `opts.pre` and `opts.post`. If no match, return null\nfuzzy.match = function(pattern, str, opts) {\n opts = opts || {};\n var patternIdx = 0\n , result = []\n , len = str.length\n , totalScore = 0\n , currScore = 0\n // prefix\n , pre = opts.pre || ''\n // suffix\n , post = opts.post || ''\n // String to compare against. This might be a lowercase version of the\n // raw string\n , compareString = opts.caseSensitive && str || str.toLowerCase()\n , ch;\n\n pattern = opts.caseSensitive && pattern || pattern.toLowerCase();\n\n // For each character in the string, either add it to the result\n // or wrap in template if it's the next string in the pattern\n for(var idx = 0; idx < len; idx++) {\n ch = str[idx];\n if(compareString[idx] === pattern[patternIdx]) {\n ch = pre + ch + post;\n patternIdx += 1;\n\n // consecutive characters should increase the score more than linearly\n currScore += 1 + currScore;\n } else {\n currScore = 0;\n }\n totalScore += currScore;\n result[result.length] = ch;\n }\n\n // return rendered string if we have a match for every char\n if(patternIdx === pattern.length) {\n // if the string is an exact match with pattern, totalScore should be maxed\n totalScore = (compareString === pattern) ? Infinity : totalScore;\n return {rendered: result.join(''), score: totalScore};\n }\n\n return null;\n};\n\n// The normal entry point. Filters `arr` for matches against `pattern`.\n// It returns an array with matching values of the type:\n//\n// [{\n// string: 'lah' // The rendered string\n// , index: 2 // The index of the element in `arr`\n// , original: 'blah' // The original element in `arr`\n// }]\n//\n// `opts` is an optional argument bag. Details:\n//\n// opts = {\n// // string to put before a matching character\n// pre: ''\n//\n// // string to put after matching character\n// , post: ''\n//\n// // Optional function. Input is an entry in the given arr`,\n// // output should be the string to test `pattern` against.\n// // In this example, if `arr = [{crying: 'koala'}]` we would return\n// // 'koala'.\n// , extract: function(arg) { return arg.crying; }\n// }\nfuzzy.filter = function(pattern, arr, opts) {\n if(!arr || arr.length === 0) {\n return [];\n }\n if (typeof pattern !== 'string') {\n return arr;\n }\n opts = opts || {};\n return arr\n .reduce(function(prev, element, idx, arr) {\n var str = element;\n if(opts.extract) {\n str = opts.extract(element);\n }\n var rendered = fuzzy.match(pattern, str, opts);\n if(rendered != null) {\n prev[prev.length] = {\n string: rendered.rendered\n , score: rendered.score\n , index: idx\n , original: element\n };\n }\n return prev;\n }, [])\n\n // Sort by score. Browsers are inconsistent wrt stable/unstable\n // sorting, so force stable by using the index in the case of tie.\n // See http://ofb.net/~sethml/is-sort-stable.html\n .sort(function(a,b) {\n var compare = b.score - a.score;\n if(compare) return compare;\n return a.index - b.index;\n });\n};\n\n\n}());\n\n","\nmodule.exports = function () {\n var selection = document.getSelection();\n if (!selection.rangeCount) {\n return function () {};\n }\n var active = document.activeElement;\n\n var ranges = [];\n for (var i = 0; i < selection.rangeCount; i++) {\n ranges.push(selection.getRangeAt(i));\n }\n\n switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n case 'INPUT':\n case 'TEXTAREA':\n active.blur();\n break;\n\n default:\n active = null;\n break;\n }\n\n selection.removeAllRanges();\n return function () {\n selection.type === 'Caret' &&\n selection.removeAllRanges();\n\n if (!selection.rangeCount) {\n ranges.forEach(function(range) {\n selection.addRange(range);\n });\n }\n\n active &&\n active.focus();\n };\n};\n"],"names":["insertWithoutScoping","cache","serialized","undefined","inserted","name","insert","sheet","merge","registered","css","className","registeredStyles","rawClassName","length","classnames","args","cls","i","arg","toAdd","Array","isArray","k","options","speedy","value","this","isSpeedy","compat","_len","arguments","_key","key","cx","_len4","_key4","injectGlobal","_len3","_key3","keyframes","_len2","_key2","animation","styles","hydrate","ids","forEach","flush","getRegisteredStyles","bind","_createEmotion","autoColor","theme","hex","base","isLight","color","tinycolor","clone","lighten","darken","includeFallbackColors","toHex8String","toHsl","l","newColor","scrollPageDown","binding","label","scrollPageUp","scrollToNextVisibleSpan","scrollToPrevVisibleSpan","panLeft","panLeftFast","panRight","panRightFast","zoomIn","zoomInFast","zoomOut","zoomOutFast","collapseAll","expandAll","collapseOne","expandOne","searchSpans","clearSearch","instance","getInstance","local","Combokeys","document","body","ExternalLinkContext","React","displayName","ONE_MILLISECOND","ONE_SECOND","ONE_MINUTE","ONE_HOUR","DEFAULT_MS_PRECISION","Math","log10","UNIT_STEPS","unit","microseconds","ofPrevious","quantizeDuration","duration","floatPrecision","conversionFactor","number","precision","targetPrecision","floor","abs","trunc","Number","toPrecision","toFloatPrecision","formatDuration","primaryUnit","secondaryUnit","_dropWhile","index","_round","primaryUnitString","secondaryValue","round","secondaryUnitString","spanHasTag","span","tags","some","tag","isClientSpan","isServerSpan","isErrorBool","isErrorStr","isErrorSpan","getStyles","Ticks","TicksTick","TicksTickLabel","TicksTickLabelEndAnchor","props","endTime","numTicks","showLabels","startTime","labels","viewingDuration","durationAtTick","push","useStyles2","ticks","portion","style","left","defaultProps","flexRow","TimelineRow","children","rest","TimelineRowCell","width","widthPercent","mergedStyle","flexBasis","maxWidth","ubRelative","Cell","TimelineCollapser","onExpandAll","onExpandOne","onCollapseAll","onCollapseOne","IconButton","tooltip","size","tooltipPlacement","onClick","EUpdateTypes","DraggableManager","constructor","getBounds","resetBoundsOnResize","_bounds","event","button","clientX","type","eventType","_isDragging","handler","_onMouseEnter","_onMouseLeave","Error","_onMouseMove","x","_getPosition","manager","window","addEventListener","_handleDragEvent","_get","userSelect","_onDragStart","_onDragMove","_stopDragging","_onDragEnd","handleMouseDown","handleMouseEnter","_handleMinorMouseEvent","handleMouseMove","handleMouseLeave","_resetBoundsOnResize","Boolean","resetBounds","onMouseEnter","onMouseLeave","onMouseMove","onDragStart","onDragMove","onDragEnd","_getBounds","clientXLeft","maxValue","minValue","removeEventListener","isDragging","dispose","stylesFactory","TimelineColumnResizer","wrapper","dragger","draggerDragging","draggerDraggingLeft","draggerDraggingRight","gripIcon","gripIconDragging","super","elm","_rootElm","getBoundingClientRect","min","max","setState","dragPosition","onChange","_dragManager","_getDraggingBounds","_handleDragEnd","_handleDragUpdate","state","componentWillUnmount","render","draggerStyle","position","columnResizeHandleHeight","gripStyle","isDraggingLeft","isDraggingRight","right","height","ref","_setRootElm","onMouseDown","TimelineViewingLayer","TimelineViewingLayerCursorGuide","TimelineViewingLayerDragged","TimelineViewingLayerDraggedDraggingLeft","TimelineViewingLayerDraggedDraggingRight","TimelineViewingLayerDraggedShiftDrag","TimelineViewingLayerDraggedReframeDrag","TimelineViewingLayerFullOverlay","mapFromViewSubRange","viewStart","viewEnd","mapToViewSubRange","getMarkers","from","to","isShift","layout","start","isOutOfView","getNextViewLayout","Reflect","has","_root","viewRangeTime","current","cursor","updateNextViewRangeTime","reframe","shift","update","anchor","end","updateViewRangeTime","_draggerReframe","_handleReframeDragEnd","_handleReframeDragUpdate","_handleReframeMouseLeave","_handleReframeMouseMove","UNSAFE_componentWillReceiveProps","nextProps","boundsInvalidator","shiftEnd","shiftStart","cusrorPosition","_setRoot","TimelineHeaderRow","TimelineHeaderRowTitle","TimelineHeaderWrapper","nameColumnWidth","onColummWidthChange","ubFlex","ubPx2","strToRgb","s","r","slice","g","b","parseInt","ColorGenerator","colorsHex","colorsRgb","map","Map","currentIdx","_getColorIndex","get","set","getColorByKey","getRgbColorByKey","clear","getGenerator","memoizeOne","colors","Positions","bufferLen","ys","heights","dataLen","lastI","profileData","dataLength","calcHeights","heightGetter","forcedLastI","_max","h","calcYs","yValue","confirmHeight","_i","chg","findFloorIndex","imin","imax","getRowPosition","y","getEstimatedHeight","known","DEFAULT_INITIAL_DRAW","ListView","_viewHeight","bottomY","_scrollTop","_yPositions","_getHeight","scrollElement","scrollElementTop","top","listViewOffset","scrollTop","_itemHolderElm","itemOffset","scrollTo","_isScrolledOrResized","requestAnimationFrame","_positionList","_wrapperElm","_calcViewIndexes","maxStart","viewBufferMin","_startIndex","minEnd","_endIndex","_startIndexDrawn","_endIndexDrawn","forceUpdate","windowScroller","clientHeight","_scanItemHeights","getIndexFromKey","lowDirtyKey","highDirtyKey","isDirty","nodes","childNodes","node","itemKey","getAttribute","console","warn","observed","firstElementChild","_knownHeights","getKeyFromIndex","itemHeightGetter","_htmlTopOffset","_windowScrollListenerAdded","_htmlElm","documentElement","componentDidMount","_onScroll","componentDidUpdate","_isViewChanged","useRoot","innerHeight","scrollY","yStart","yEnd","initialDraw","itemRenderer","viewBuffer","items","attrs","wrapperProps","_initWrapper","onScroll","overflowY","scrollerStyle","margin","padding","itemsWrapperClassName","_initItemHolder","ReferenceLink","reference","focusSpan","otherProps","role","spanID","createLinkToExternalSpan","href","traceID","target","rel","MultiParent","TraceRefLink","NewWindowIcon","references","tooltipText","Tooltip","content","Popover","overlayClassName","popoverRef","useRef","PopoverController","hideAfter","showPopper","hidePopper","popperProps","referenceElement","wrapperClassName","CopyIcon","hasCopied","copy","copyText","visible","tooltipTitle","Button","icon","handleClick","copyIconClassName","KeyValueTable","row","keyColumn","copyColumn","linkIcon","jsonObjectOrArrayStartRegex","parseIfComplexJson","test","JSON","parse","_","LinkValue","title","Icon","KeyValuesTable","data","linksGetter","uWidth100","markup","__html","jsonMarkup","jsonTable","ubInlineBlock","dangerouslySetInnerHTML","links","valueMarkup","url","text","stringify","header","headerEmpty","headerHighContrast","emptyIcon","summary","summaryItem","summaryLabel","summaryDelim","KeyValuesSummary","item","String","AccordianKeyValues","highContrast","interactive","isOpen","onToggle","isEmpty","iconCls","uAlignIcon","arrow","headerProps","uTxEllipsis","AccordianLogs","AccordianLogsHeader","AccordianLogsContent","AccordianLogsFooter","logs","openedItems","onItemToggle","timestamp","HeaderComponent","_sortBy","log","ubMb1","fields","bar","rpc","logMarker","toPercent","toFixed","SpanBar","getViewedBounds","shortLabel","longLabel","traceStartTime","labelClassName","setLabel","useState","logGroups","_groupBy","posPercent","onMouseOver","background","Object","keys","positionKey","getFirstAncestor","_find","refType","SpanTreeOffset","SpanTreeOffsetParent","indentGuide","indentGuideActive","iconWrapper","UnthemedSpanTreeOffset","ancestorId","relatedTarget","HTMLSpanElement","removeHoverIndentGuideId","addHoverIndentGuideId","ancestorIds","ancestorIDs","spanAncestorIds","reverse","childrenVisible","showChildrenIcon","hasChildren","hoverIndentGuideIds","withTheme2","spanBarClassName","spanBarLabelClassName","nameWrapperClassName","nameWrapperMatchingFilterClassName","viewClassName","nameColumnClassName","animations","nameWrapper","nameWrapperMatchingFilter","nameColumn","endpointName","view","viewExpanded","viewExpandedAndMatchingFilter","rowClippingLeft","rowClippingRight","rowExpanded","rowMatchingFilter","rowFocused","rowExpandedAndMatchingFilter","nameDetailExpanded","svcName","svcNameChildrenCollapsed","errorIcon","rpcColorMarker","labelRight","labelLeft","UnthemedSpanBarRow","onDetailToggled","onChildrenToggled","columnDivision","isChildrenExpanded","isDetailExpanded","isMatchingFilter","isFocused","noInstrumentedServer","showErrorIcon","clippingLeft","clippingRight","createSpanLink","isParent","operationName","process","serviceName","viewBounds","labelDetail","hintClassName","_childrenToggle","_detailToggle","borderColor","tabIndex","backgroundColor","errorIconColor","link","marginRight","ctrlKey","metaKey","shiftKey","preventDefault","subsidiarilyReferencedBy","Divider","DividerVertical","DividerHorizontal","LabeledList","divider","LabeledListItem","LabeledListLabel","LabeledListValue","AccordianReferenceItem","AccordianReferences","AccordianReferencesHeader","AccordianReferencesContent","AccordianReferencesFooter","ReferencesList","list","itemContent","debugInfo","debugLabel","References","TextList","List","DefaultTextComponent","AccordianText","headerClassName","TextComponent","accordianKeyValuesStyles","getAccordianKeyValuesStyles","listWrapper","debugValue","AccordianWarnings","AccordianWarningsHeader","AccordianWarningsHeaderOpen","AccordianWarningsLabel","Textarea","LinkIcon","SpanDetail","detailState","logItemToggle","logsToggle","processToggle","tagsToggle","warningsToggle","stackTracesToggle","referencesToggle","referenceItemToggle","createFocusSpanLink","isTagsOpen","isProcessOpen","logsState","isWarningsOpen","referencesState","isStackTracesOpen","relativeStartTime","warnings","stackTraces","overviewItems","childSpanCount","focusSpanLink","ubM0","ubTxRightAlign","DataLinkButton","buttonProps","ubMy1","logItem","textComponentProps","stackTrace","join","TextArea","readOnly","cols","rows","e","currentTarget","altKey","expandedAccent","infoWrapper","UnthemedSpanDetailRow","itemIndex","focusedSpanId","overflow","borderTopColor","_linksGetter","rowsWrapper","scrollToTopButton","DEFAULT_HEIGHTS","memoizedGenerateRowStates","trace","childrenHiddenIDs","detailStates","spans","collapseDepth","rowStates","depth","hidden","isDetail","spanIndex","generateRowStates","memoizedViewBoundsFunc","viewRange","viewMin","viewWindow","isEqual","memoizedGetClipping","currentViewRange","zoomStart","zoomEnd","UnthemedVirtualizedTraceView","createRef","currentViewRangeTime","findMatchesIDs","getRowStates","listView","isChanged","registerAccessors","getAccessors","parts","split","_traceID","_spanID","_isDetail","renderSpanDetailRow","renderSpanBarRow","findIndex","scrollToIndex","topOfExploreViewRef","scrollIntoView","behavior","setTrace","uiFind","scrollToSpan","shouldComponentUpdate","nextPropKeys","prevProps","shouldScrollToFirstUiFindMatch","clearShouldScrollToFirstUiFindMatch","scrollToFirstVisibleSpan","nextRegisterAccessors","nextTrace","focusedSpanIdForSearch","getClipping","lv","getViewRange","getSearchedSpanIDs","getCollapsedChildren","getViewHeight","getBottomRowIndexVisible","getBottomVisibleIndex","getTopRowIndexVisible","getTopVisibleIndex","mapRowIndexToSpanIndex","mapSpanIndexToRowIndex","childrenToggle","detailToggle","spanNameColumnWidth","isCollapsed","parentSpanIndex","spanContainsErredSpan","rpcSpan","spanChildDepth","findServerChildSpan","rpcViewBounds","peerServiceKV","find","kv","isKindClient","SpanBarRow","detailLogItemToggle","detailLogsToggle","detailProcessToggle","detailReferencesToggle","detailReferenceItemToggle","detailWarningsToggle","detailStackTracesToggle","detailTagsToggle","zIndex","SpanDetailRow","setListView","getRowHeight","renderRow","ToolbarButton","scrollToTop","TraceTimelineViewer","UnthemedTraceTimelineViewer","callbacks","inst","keysHandler","keyboardMappings","mergeShortcuts","setSpanNameColumnWidth","traceTimeline","time","VirtualizedTraceView","NewWindowIconLarge","isLarge","ExternalLinks","BreakableText","WORD_RX","wordRegexp","exec","match","TraceName","typography","lg","traceName","hasOwn","object","prototype","hasOwnProperty","call","createCache","limit","equals","entry","put","singletonCache","entries","cacheIndex","arr","fn","splice","unshift","pop","lruCache","createEqualsFn","basicEquals","deepObjects","deep","valueA","valueB","every","isANull","isBNull","aKeys","bKeys","equalityChecker","aKey","deepEquals","config","apply","deepFreeze","defineProperty","archiveEnabled","dependencies","dagMaxNumServices","menuEnabled","linkPatterns","menu","search","maxLookback","maxLimit","tracking","gaID","trackErrors","getConfigValue","path","defaultConfig","getParent","parentRef","parameterRegExp","getParamNames","str","names","Set","replace","add","stringSupplant","encodeFn","processTemplate","template","parameters","createTestFunction","indexOf","identity","a","getParameterInArray","array","callTemplate","computeLinks","processTags","result","pattern","parameterValues","allParameters","parameter","currentSpan","getParameterInAncestor","processedLinks","encodeURIComponent","_uniq","concat","error","filter","getTraceLinks","memoize","validKeys","includes","computeTraceLink","WeakMap","getTraceName","candidateSpan","allIDs","thisRefLength","candidateRefLength","CanvasSpanGraph","UnthemedCanvasSpanGraph","_canvasElm","_draw","valueWidth","totalValueWidth","canvas","getFillColor","bgColor","fillCache","cHeight","cWidth","innerWidth","itemHeight","itemYChange","ctx","getContext","alpha","fillStyle","fillRect","valueOffset","renderIntoCanvas","getColor","_setCanvasRef","TickLabels","TickLabelsLabel","GraphTick","GraphTicks","x1","y1","x2","y2","ScrubberHandleExpansion","ScrubberHandle","ScrubberLine","ScrubberDragging","ScrubberHandles","Scrubber","xPercent","transform","ViewingLayerResetZoomHoverClassName","ViewingLayerResetZoom","ViewingLayer","ViewingLayerGraph","ViewingLayerInactive","ViewingLayerCursorGuide","ViewingLayerDraggedShift","ViewingLayerDrag","ViewingLayerFullOverlay","dragTypes","UnthemedViewingLayer","preventCursorLine","stopPropagation","_draggerStart","_handleScrubberDragEnd","_handleScrubberDragUpdate","_handleScrubberEnterLeave","_draggerEnd","_getMarkers","leadingX","haveNextTimeRange","leftInactive","cursorPosition","rightInactive","_resetTimeZoomClickHandler","variant","strokeWidth","getItem","memoizedGetitems","SpanGraph","ubPb2","TracePageHeader","TracePageHeaderTitleRow","TracePageHeaderBack","TracePageHeaderTitleLink","TracePageHeaderDetailToggle","TracePageHeaderDetailToggleExpanded","TracePageHeaderTitle","TracePageHeaderTitleCollapsible","TracePageHeaderOverviewItems","TracePageHeaderOverviewItemValueDetail","TracePageHeaderOverviewItemValue","TracePageHeaderArchiveIcon","TracePageHeaderTraceId","HEADER_ITEMS","renderer","timeZone","dateStr","dateTimeFormat","defaultWithMS","_values","processes","p","_maxBy","canCollapse","hideMap","hideSummary","onSlimViewClicked","slimView","summaryItems","uTxMuted","DetailState","oldState","isReferencesOpen","toggleTags","next","toggleProcess","toggleReferences","toggleReferenceItem","delete","toggleWarnings","toggleStackTraces","toggleLogs","toggleLogItem","TreeNode","static","reduce","child","walk","addChild","iterFunction","searchFunction","searchFn","getPath","findPath","currentNode","currentPath","attempt","nodeStack","actualDepth","nodeDepth","getProcessServiceName","proc","getSpanId","getSpanName","getSpanDuration","getSpanTimestamp","getSpanProcessId","processID","getSpanReferenceByType","getSpanServiceName","childOfRef","filterSpansForText","leftBound","rightBound","extract","original","getTextFilterdSpansAsMap","matchingSpans","obj","getTraceSpans","textFilteredSpansMap","muted","getTraceProcesses","getSpanWithProcess","getTraceSpansAsMap","getTraceSpanIdsAsTree","nodesById","spansById","root","parentID","comparator","nodeA","nodeB","sort","getTraceTimestamp","prevTimestamp","getTraceDuration","prevDuration","getParentSpan","tree","spanMap","spanA","spanB","numberSortComparator","itemA","itemB","getTraceServices","spanTree","services","DURATION_FORMATTERS","ms","targetDuration","moment","asMilliseconds","asSeconds","getDurationFormatterForTrace","totalDuration","getTraceSpansByHierarchyPosition","formatter","dir","selector","hierarchyPositionMap","collapsed","collapse","hiddenSpanIds","collapsedSpanId","id","interval","num","updatedSpan","deduplicateTags","spanTags","warningsHash","uniqueTags","t","values","orderTags","topPrefixes","orderedTags","tp","toLowerCase","bKey","startsWith","transformTraceData","traceEndTime","MAX_SAFE_INTEGER","spanIdCounts","idCount","_isEqual","svcCounts","tagsInfo","refSpan","numberOfSpans","filterSpans","textFilter","includeFilters","excludeKeys","w","isTextInFilters","filters","isTextInKeyValues","kvs","toString","ubFlexAuto","ubJustifyEnd","getNonOverlappingDuration","ranges","acc","range","tail","prevStart","prevEnd","makeSpanMap","getSpan","parentId","parentIds","getStats","traceDuration","selfDuration","main","toFixedNoTrailingZeros","secondary","n","parseFloat","makeFrames","MutableDataFrame","Fields","FieldType","mode","meta","preferredVisualisationType","createTraceFrame","toSpanRow","parentSpanID","serviceTags","frame","custom","traceFormat","createTableFrame","instanceSettings","displayNameFromDS","internal","datasourceUid","uid","datasourceName","query","traceData","transformToTraceData","transformToJaeger","traceResponse","flags","total","offset","errors","exports","_extends","assign","source","_react2","_interopRequireDefault","_propTypes2","__esModule","default","IconBase","_ref","_ref2","_objectWithoutProperties","_ref2$reactIconBase","reactIconBase","computedSize","createElement","fill","preserveAspectRatio","verticalAlign","propTypes","string","oneOfType","contextTypes","shape","module","_reactIconBase2","viewBox","d","INDENT","Stylize","styleFile","cssClass","objRule","rule","inlineRule","escape","doc","indent","out","visit","toISOString","encodeURI","element","self","storeInstancesGlobally","directMap","sequenceLevels","resetTimer","ignoreNextKeyup","ignoreNextKeypress","nextExpectedAction","addEvents","instances","bindMultiple","unbind","trigger","reset","stopCallback","handleKey","bindSingle","getKeyInfo","pickBestAction","getReverseMap","getMatches","resetSequences","fireCallback","bindSequence","resetSequenceTimer","detach","REVERSE_MAP","on","eventHandler","callback","action","combinations","j","combo","increaseSequence","nextAction","callbackAndReset","characterFromEvent","setTimeout","wrappedCallback","combination","sequenceName","level","info","sequence","modifiers","seq","off","capture","attachEvent","detachEvent","srcElement","SPECIAL_ALIASES","SHIFT_MAP","isModifier","keysFromString","character","modifiersMatch","matches","code","deleteCombo","deleteSequence","SPECIAL_KEYS_MAP","ignoreThisKeypress","doNotReset","maxLevel","processedSequenceCallback","eventModifiers","which","keyCode","modifiers1","modifiers2","clearTimeout","activeSequences","tagName","isContentEditable","combokeys","SPECIAL_CHARACTERS_MAP","fromCharCode","returnValue","navigator","platform","cancelBubble","deselectCurrent","clipboardToIE11Formatting","debug","message","reselectPrevious","selection","mark","success","createRange","getSelection","textContent","all","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","format","clipboardData","clearData","setData","onCopy","appendChild","selectNodeContents","addRange","execCommand","err","copyKey","userAgent","prompt","removeRange","removeAllRanges","removeChild","o","freeze","getOwnPropertyNames","prop","isFrozen","fuzzy","simpleFilter","opts","ch","patternIdx","len","totalScore","currScore","pre","post","compareString","caseSensitive","idx","Infinity","rendered","score","prev","compare","rangeCount","active","activeElement","getRangeAt","toUpperCase","blur","focus"],"sourceRoot":""}