| // clang-format off |
| /* eslint-disable */ |
| (function(f) { |
| if (typeof exports === 'object' && typeof module !== 'undefined') { |
| module.exports = f() |
| } else if (typeof define === 'function' && define.amd) { |
| define([], f) |
| } else { |
| var g; |
| if (typeof window !== 'undefined') { |
| g = window |
| } else if (typeof global !== 'undefined') { |
| g = global |
| } else if (typeof self !== 'undefined') { |
| g = self |
| } else { |
| g = this |
| } |
| g.dagre = f() |
| } |
| })(function() { |
| var define, module, exports; |
| return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c='function'==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error('Cannot find module \''+i+'\'');throw a.code='MODULE_NOT_FOUND',a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u='function'==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ |
| /* |
| Copyright (c) 2012-2014 Chris Pettitt |
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy |
| of this software and associated documentation files (the "Software"), to deal |
| in the Software without restriction, including without limitation the rights |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| copies of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be included in |
| all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| THE SOFTWARE. |
| */ |
| |
| module.exports = { |
| graphlib: require('./lib/graphlib'), |
| |
| layout: require('./lib/layout'), |
| debug: require('./lib/debug'), |
| util: { |
| time: require('./lib/util').time, |
| notime: require('./lib/util').notime |
| }, |
| version: require('./lib/version') |
| }; |
| |
| },{'./lib/debug':6,'./lib/graphlib':7,'./lib/layout':9,'./lib/util':29,'./lib/version':30}],2:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'), |
| greedyFAS = require('./greedy-fas'); |
| |
| module.exports = { |
| run: run, |
| undo: undo |
| }; |
| |
| function run(g) { |
| var fas = (g.graph().acyclicer === 'greedy' |
| ? greedyFAS(g, weightFn(g)) |
| : dfsFAS(g)); |
| _.forEach(fas, function(e) { |
| var label = g.edge(e); |
| g.removeEdge(e); |
| label.forwardName = e.name; |
| label.reversed = true; |
| g.setEdge(e.w, e.v, label, _.uniqueId('rev')); |
| }); |
| |
| function weightFn(g) { |
| return function(e) { |
| return g.edge(e).weight; |
| }; |
| } |
| } |
| |
| function dfsFAS(g) { |
| var fas = [], |
| stack = {}, |
| visited = {}; |
| |
| function dfs(v) { |
| if (_.has(visited, v)) { |
| return; |
| } |
| visited[v] = true; |
| stack[v] = true; |
| _.forEach(g.outEdges(v), function(e) { |
| if (_.has(stack, e.w)) { |
| fas.push(e); |
| } else { |
| dfs(e.w); |
| } |
| }); |
| delete stack[v]; |
| } |
| |
| _.forEach(g.nodes(), dfs); |
| return fas; |
| } |
| |
| function undo(g) { |
| _.forEach(g.edges(), function(e) { |
| var label = g.edge(e); |
| if (label.reversed) { |
| g.removeEdge(e); |
| |
| var forwardName = label.forwardName; |
| delete label.reversed; |
| delete label.forwardName; |
| g.setEdge(e.w, e.v, label, forwardName); |
| } |
| }); |
| } |
| |
| },{'./greedy-fas':8,'./lodash':10}],3:[function(require,module,exports){ |
| var _ = require('./lodash'), |
| util = require('./util'); |
| |
| module.exports = addBorderSegments; |
| |
| function addBorderSegments(g) { |
| function dfs(v) { |
| var children = g.children(v), |
| node = g.node(v); |
| if (children.length) { |
| _.forEach(children, dfs); |
| } |
| |
| if (_.has(node, 'minRank')) { |
| node.borderLeft = []; |
| node.borderRight = []; |
| for (var rank = node.minRank, maxRank = node.maxRank + 1; |
| rank < maxRank; |
| ++rank) { |
| addBorderNode(g, 'borderLeft', '_bl', v, node, rank); |
| addBorderNode(g, 'borderRight', '_br', v, node, rank); |
| } |
| } |
| } |
| |
| _.forEach(g.children(), dfs); |
| } |
| |
| function addBorderNode(g, prop, prefix, sg, sgNode, rank) { |
| var label = { width: 0, height: 0, rank: rank, borderType: prop }, |
| prev = sgNode[prop][rank - 1], |
| curr = util.addDummyNode(g, 'border', label, prefix); |
| sgNode[prop][rank] = curr; |
| g.setParent(curr, sg); |
| if (prev) { |
| g.setEdge(prev, curr, { weight: 1 }); |
| } |
| } |
| |
| },{'./lodash':10,'./util':29}],4:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'); |
| |
| module.exports = { |
| adjust: adjust, |
| undo: undo |
| }; |
| |
| function adjust(g) { |
| var rankDir = g.graph().rankdir.toLowerCase(); |
| if (rankDir === 'lr' || rankDir === 'rl') { |
| swapWidthHeight(g); |
| } |
| } |
| |
| function undo(g) { |
| var rankDir = g.graph().rankdir.toLowerCase(); |
| if (rankDir === 'bt' || rankDir === 'rl') { |
| reverseY(g); |
| } |
| |
| if (rankDir === 'lr' || rankDir === 'rl') { |
| swapXY(g); |
| swapWidthHeight(g); |
| } |
| } |
| |
| function swapWidthHeight(g) { |
| _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); }); |
| _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); }); |
| } |
| |
| function swapWidthHeightOne(attrs) { |
| var w = attrs.width; |
| attrs.width = attrs.height; |
| attrs.height = w; |
| } |
| |
| function reverseY(g) { |
| _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); }); |
| |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| _.forEach(edge.points, reverseYOne); |
| if (_.has(edge, 'y')) { |
| reverseYOne(edge); |
| } |
| }); |
| } |
| |
| function reverseYOne(attrs) { |
| attrs.y = -attrs.y; |
| } |
| |
| function swapXY(g) { |
| _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); }); |
| |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| _.forEach(edge.points, swapXYOne); |
| if (_.has(edge, 'x')) { |
| swapXYOne(edge); |
| } |
| }); |
| } |
| |
| function swapXYOne(attrs) { |
| var x = attrs.x; |
| attrs.x = attrs.y; |
| attrs.y = x; |
| } |
| |
| },{'./lodash':10}],5:[function(require,module,exports){ |
| /* |
| * Simple doubly linked list implementation derived from Cormen, et al., |
| * "Introduction to Algorithms". |
| */ |
| |
| module.exports = List; |
| |
| function List() { |
| var sentinel = {}; |
| sentinel._next = sentinel._prev = sentinel; |
| this._sentinel = sentinel; |
| } |
| |
| List.prototype.dequeue = function() { |
| var sentinel = this._sentinel, |
| entry = sentinel._prev; |
| if (entry !== sentinel) { |
| unlink(entry); |
| return entry; |
| } |
| }; |
| |
| List.prototype.enqueue = function(entry) { |
| var sentinel = this._sentinel; |
| if (entry._prev && entry._next) { |
| unlink(entry); |
| } |
| entry._next = sentinel._next; |
| sentinel._next._prev = entry; |
| sentinel._next = entry; |
| entry._prev = sentinel; |
| }; |
| |
| List.prototype.toString = function() { |
| var strs = [], |
| sentinel = this._sentinel, |
| curr = sentinel._prev; |
| while (curr !== sentinel) { |
| strs.push(JSON.stringify(curr, filterOutLinks)); |
| curr = curr._prev; |
| } |
| return '[' + strs.join(', ') + ']'; |
| }; |
| |
| function unlink(entry) { |
| entry._prev._next = entry._next; |
| entry._next._prev = entry._prev; |
| delete entry._next; |
| delete entry._prev; |
| } |
| |
| function filterOutLinks(k, v) { |
| if (k !== '_next' && k !== '_prev') { |
| return v; |
| } |
| } |
| |
| },{}],6:[function(require,module,exports){ |
| var _ = require('./lodash'), |
| util = require('./util'), |
| Graph = require('./graphlib').Graph; |
| |
| module.exports = { |
| debugOrdering: debugOrdering |
| }; |
| |
| /* istanbul ignore next */ |
| function debugOrdering(g) { |
| var layerMatrix = util.buildLayerMatrix(g); |
| |
| var h = new Graph({ compound: true, multigraph: true }).setGraph({}); |
| |
| _.forEach(g.nodes(), function(v) { |
| h.setNode(v, { label: v }); |
| h.setParent(v, 'layer' + g.node(v).rank); |
| }); |
| |
| _.forEach(g.edges(), function(e) { |
| h.setEdge(e.v, e.w, {}, e.name); |
| }); |
| |
| _.forEach(layerMatrix, function(layer, i) { |
| var layerV = 'layer' + i; |
| h.setNode(layerV, { rank: 'same' }); |
| _.reduce(layer, function(u, v) { |
| h.setEdge(u, v, { style: 'invis' }); |
| return v; |
| }); |
| }); |
| |
| return h; |
| } |
| |
| },{'./graphlib':7,'./lodash':10,'./util':29}],7:[function(require,module,exports){ |
| /* global window */ |
| |
| var graphlib; |
| |
| if (typeof require === 'function') { |
| try { |
| graphlib = require('graphlib'); |
| } catch (e) {} |
| } |
| |
| if (!graphlib) { |
| graphlib = window.graphlib; |
| } |
| |
| module.exports = graphlib; |
| |
| },{'graphlib':31}],8:[function(require,module,exports){ |
| var _ = require('./lodash'), |
| Graph = require('./graphlib').Graph, |
| List = require('./data/list'); |
| |
| /* |
| * A greedy heuristic for finding a feedback arc set for a graph. A feedback |
| * arc set is a set of edges that can be removed to make a graph acyclic. |
| * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and |
| * effective heuristic for the feedback arc set problem." This implementation |
| * adjusts that from the paper to allow for weighted edges. |
| */ |
| module.exports = greedyFAS; |
| |
| var DEFAULT_WEIGHT_FN = _.constant(1); |
| |
| function greedyFAS(g, weightFn) { |
| if (g.nodeCount() <= 1) { |
| return []; |
| } |
| var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN); |
| var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx); |
| |
| // Expand multi-edges |
| return _.flatten(_.map(results, function(e) { |
| return g.outEdges(e.v, e.w); |
| }), true); |
| } |
| |
| function doGreedyFAS(g, buckets, zeroIdx) { |
| var results = [], |
| sources = buckets[buckets.length - 1], |
| sinks = buckets[0]; |
| |
| var entry; |
| while (g.nodeCount()) { |
| while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } |
| while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); } |
| if (g.nodeCount()) { |
| for (var i = buckets.length - 2; i > 0; --i) { |
| entry = buckets[i].dequeue(); |
| if (entry) { |
| results = results.concat(removeNode(g, buckets, zeroIdx, entry, true)); |
| break; |
| } |
| } |
| } |
| } |
| |
| return results; |
| } |
| |
| function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) { |
| var results = collectPredecessors ? [] : undefined; |
| |
| _.forEach(g.inEdges(entry.v), function(edge) { |
| var weight = g.edge(edge), |
| uEntry = g.node(edge.v); |
| |
| if (collectPredecessors) { |
| results.push({ v: edge.v, w: edge.w }); |
| } |
| |
| uEntry.out -= weight; |
| assignBucket(buckets, zeroIdx, uEntry); |
| }); |
| |
| _.forEach(g.outEdges(entry.v), function(edge) { |
| var weight = g.edge(edge), |
| w = edge.w, |
| wEntry = g.node(w); |
| wEntry['in'] -= weight; |
| assignBucket(buckets, zeroIdx, wEntry); |
| }); |
| |
| g.removeNode(entry.v); |
| |
| return results; |
| } |
| |
| function buildState(g, weightFn) { |
| var fasGraph = new Graph(), |
| maxIn = 0, |
| maxOut = 0; |
| |
| _.forEach(g.nodes(), function(v) { |
| fasGraph.setNode(v, { v: v, 'in': 0, out: 0 }); |
| }); |
| |
| // Aggregate weights on nodes, but also sum the weights across multi-edges |
| // into a single edge for the fasGraph. |
| _.forEach(g.edges(), function(e) { |
| var prevWeight = fasGraph.edge(e.v, e.w) || 0, |
| weight = weightFn(e), |
| edgeWeight = prevWeight + weight; |
| fasGraph.setEdge(e.v, e.w, edgeWeight); |
| maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight); |
| maxIn = Math.max(maxIn, fasGraph.node(e.w)['in'] += weight); |
| }); |
| |
| var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); }); |
| var zeroIdx = maxIn + 1; |
| |
| _.forEach(fasGraph.nodes(), function(v) { |
| assignBucket(buckets, zeroIdx, fasGraph.node(v)); |
| }); |
| |
| return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx }; |
| } |
| |
| function assignBucket(buckets, zeroIdx, entry) { |
| if (!entry.out) { |
| buckets[0].enqueue(entry); |
| } else if (!entry['in']) { |
| buckets[buckets.length - 1].enqueue(entry); |
| } else { |
| buckets[entry.out - entry['in'] + zeroIdx].enqueue(entry); |
| } |
| } |
| |
| },{'./data/list':5,'./graphlib':7,'./lodash':10}],9:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'), |
| acyclic = require('./acyclic'), |
| normalize = require('./normalize'), |
| rank = require('./rank'), |
| normalizeRanks = require('./util').normalizeRanks, |
| parentDummyChains = require('./parent-dummy-chains'), |
| removeEmptyRanks = require('./util').removeEmptyRanks, |
| nestingGraph = require('./nesting-graph'), |
| addBorderSegments = require('./add-border-segments'), |
| coordinateSystem = require('./coordinate-system'), |
| order = require('./order'), |
| position = require('./position'), |
| util = require('./util'), |
| Graph = require('./graphlib').Graph; |
| |
| module.exports = layout; |
| |
| function layout(g, opts) { |
| var time = opts && opts.debugTiming ? util.time : util.notime; |
| time('layout', function() { |
| var layoutGraph = time(' buildLayoutGraph', |
| function() { return buildLayoutGraph(g); }); |
| time(' runLayout', function() { runLayout(layoutGraph, time); }); |
| time(' updateInputGraph', function() { updateInputGraph(g, layoutGraph); }); |
| }); |
| } |
| |
| function runLayout(g, time) { |
| time(' makeSpaceForEdgeLabels', function() { makeSpaceForEdgeLabels(g); }); |
| time(' removeSelfEdges', function() { removeSelfEdges(g); }); |
| time(' acyclic', function() { acyclic.run(g); }); |
| time(' nestingGraph.run', function() { nestingGraph.run(g); }); |
| time(' rank', function() { rank(util.asNonCompoundGraph(g)); }); |
| time(' injectEdgeLabelProxies', function() { injectEdgeLabelProxies(g); }); |
| time(' removeEmptyRanks', function() { removeEmptyRanks(g); }); |
| time(' nestingGraph.cleanup', function() { nestingGraph.cleanup(g); }); |
| time(' normalizeRanks', function() { normalizeRanks(g); }); |
| time(' assignRankMinMax', function() { assignRankMinMax(g); }); |
| time(' removeEdgeLabelProxies', function() { removeEdgeLabelProxies(g); }); |
| time(' normalize.run', function() { normalize.run(g); }); |
| time(' parentDummyChains', function() { parentDummyChains(g); }); |
| time(' addBorderSegments', function() { addBorderSegments(g); }); |
| time(' order', function() { order(g); }); |
| time(' insertSelfEdges', function() { insertSelfEdges(g); }); |
| time(' adjustCoordinateSystem', function() { coordinateSystem.adjust(g); }); |
| time(' position', function() { position(g); }); |
| time(' positionSelfEdges', function() { positionSelfEdges(g); }); |
| time(' removeBorderNodes', function() { removeBorderNodes(g); }); |
| time(' normalize.undo', function() { normalize.undo(g); }); |
| time(' fixupEdgeLabelCoords', function() { fixupEdgeLabelCoords(g); }); |
| time(' undoCoordinateSystem', function() { coordinateSystem.undo(g); }); |
| time(' translateGraph', function() { translateGraph(g); }); |
| time(' assignNodeIntersects', function() { assignNodeIntersects(g); }); |
| time(' reversePoints', function() { reversePointsForReversedEdges(g); }); |
| time(' acyclic.undo', function() { acyclic.undo(g); }); |
| } |
| |
| /* |
| * Copies final layout information from the layout graph back to the input |
| * graph. This process only copies whitelisted attributes from the layout graph |
| * to the input graph, so it serves as a good place to determine what |
| * attributes can influence layout. |
| */ |
| function updateInputGraph(inputGraph, layoutGraph) { |
| _.forEach(inputGraph.nodes(), function(v) { |
| var inputLabel = inputGraph.node(v), |
| layoutLabel = layoutGraph.node(v); |
| |
| if (inputLabel) { |
| inputLabel.x = layoutLabel.x; |
| inputLabel.y = layoutLabel.y; |
| |
| if (layoutGraph.children(v).length) { |
| inputLabel.width = layoutLabel.width; |
| inputLabel.height = layoutLabel.height; |
| } |
| } |
| }); |
| |
| _.forEach(inputGraph.edges(), function(e) { |
| var inputLabel = inputGraph.edge(e), |
| layoutLabel = layoutGraph.edge(e); |
| |
| inputLabel.points = layoutLabel.points; |
| if (_.has(layoutLabel, 'x')) { |
| inputLabel.x = layoutLabel.x; |
| inputLabel.y = layoutLabel.y; |
| } |
| }); |
| |
| inputGraph.graph().width = layoutGraph.graph().width; |
| inputGraph.graph().height = layoutGraph.graph().height; |
| } |
| |
| var graphNumAttrs = ['nodesep', 'edgesep', 'ranksep', 'marginx', 'marginy'], |
| graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: 'tb' }, |
| graphAttrs = ['acyclicer', 'ranker', 'rankdir', 'align'], |
| nodeNumAttrs = ['width', 'height'], |
| nodeDefaults = { width: 0, height: 0 }, |
| edgeNumAttrs = ['minlen', 'weight', 'width', 'height', 'labeloffset'], |
| edgeDefaults = { |
| minlen: 1, weight: 1, width: 0, height: 0, |
| labeloffset: 10, labelpos: 'r' |
| }, |
| edgeAttrs = ['labelpos']; |
| |
| /* |
| * Constructs a new graph from the input graph, which can be used for layout. |
| * This process copies only whitelisted attributes from the input graph to the |
| * layout graph. Thus this function serves as a good place to determine what |
| * attributes can influence layout. |
| */ |
| function buildLayoutGraph(inputGraph) { |
| var g = new Graph({ multigraph: true, compound: true }), |
| graph = canonicalize(inputGraph.graph()); |
| |
| g.setGraph(_.merge({}, |
| graphDefaults, |
| selectNumberAttrs(graph, graphNumAttrs), |
| _.pick(graph, graphAttrs))); |
| |
| _.forEach(inputGraph.nodes(), function(v) { |
| var node = canonicalize(inputGraph.node(v)); |
| g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults)); |
| g.setParent(v, inputGraph.parent(v)); |
| }); |
| |
| _.forEach(inputGraph.edges(), function(e) { |
| var edge = canonicalize(inputGraph.edge(e)); |
| g.setEdge(e, _.merge({}, |
| edgeDefaults, |
| selectNumberAttrs(edge, edgeNumAttrs), |
| _.pick(edge, edgeAttrs))); |
| }); |
| |
| return g; |
| } |
| |
| /* |
| * This idea comes from the Gansner paper: to account for edge labels in our |
| * layout we split each rank in half by doubling minlen and halving ranksep. |
| * Then we can place labels at these mid-points between nodes. |
| * |
| * We also add some minimal padding to the width to push the label for the edge |
| * away from the edge itself a bit. |
| */ |
| function makeSpaceForEdgeLabels(g) { |
| var graph = g.graph(); |
| graph.ranksep /= 2; |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| edge.minlen *= 2; |
| if (edge.labelpos.toLowerCase() !== 'c') { |
| if (graph.rankdir === 'TB' || graph.rankdir === 'BT') { |
| edge.width += edge.labeloffset; |
| } else { |
| edge.height += edge.labeloffset; |
| } |
| } |
| }); |
| } |
| |
| /* |
| * Creates temporary dummy nodes that capture the rank in which each edge's |
| * label is going to, if it has one of non-zero width and height. We do this |
| * so that we can safely remove empty ranks while preserving balance for the |
| * label's position. |
| */ |
| function injectEdgeLabelProxies(g) { |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| if (edge.width && edge.height) { |
| var v = g.node(e.v), |
| w = g.node(e.w), |
| label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e }; |
| util.addDummyNode(g, 'edge-proxy', label, '_ep'); |
| } |
| }); |
| } |
| |
| function assignRankMinMax(g) { |
| var maxRank = 0; |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v); |
| if (node.borderTop) { |
| node.minRank = g.node(node.borderTop).rank; |
| node.maxRank = g.node(node.borderBottom).rank; |
| maxRank = _.max(maxRank, node.maxRank); |
| } |
| }); |
| g.graph().maxRank = maxRank; |
| } |
| |
| function removeEdgeLabelProxies(g) { |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v); |
| if (node.dummy === 'edge-proxy') { |
| g.edge(node.e).labelRank = node.rank; |
| g.removeNode(v); |
| } |
| }); |
| } |
| |
| function translateGraph(g) { |
| var minX = Number.POSITIVE_INFINITY, |
| maxX = 0, |
| minY = Number.POSITIVE_INFINITY, |
| maxY = 0, |
| graphLabel = g.graph(), |
| marginX = graphLabel.marginx || 0, |
| marginY = graphLabel.marginy || 0; |
| |
| function getExtremes(attrs) { |
| var x = attrs.x, |
| y = attrs.y, |
| w = attrs.width, |
| h = attrs.height; |
| minX = Math.min(minX, x - w / 2); |
| maxX = Math.max(maxX, x + w / 2); |
| minY = Math.min(minY, y - h / 2); |
| maxY = Math.max(maxY, y + h / 2); |
| } |
| |
| _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); }); |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| if (_.has(edge, 'x')) { |
| getExtremes(edge); |
| } |
| }); |
| |
| minX -= marginX; |
| minY -= marginY; |
| |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v); |
| node.x -= minX; |
| node.y -= minY; |
| }); |
| |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| _.forEach(edge.points, function(p) { |
| p.x -= minX; |
| p.y -= minY; |
| }); |
| if (_.has(edge, 'x')) { edge.x -= minX; } |
| if (_.has(edge, 'y')) { edge.y -= minY; } |
| }); |
| |
| graphLabel.width = maxX - minX + marginX; |
| graphLabel.height = maxY - minY + marginY; |
| } |
| |
| function assignNodeIntersects(g) { |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e), |
| nodeV = g.node(e.v), |
| nodeW = g.node(e.w), |
| p1, p2; |
| if (!edge.points) { |
| edge.points = []; |
| p1 = nodeW; |
| p2 = nodeV; |
| } else { |
| p1 = edge.points[0]; |
| p2 = edge.points[edge.points.length - 1]; |
| } |
| edge.points.unshift(util.intersectRect(nodeV, p1)); |
| edge.points.push(util.intersectRect(nodeW, p2)); |
| }); |
| } |
| |
| function fixupEdgeLabelCoords(g) { |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| if (_.has(edge, 'x')) { |
| if (edge.labelpos === 'l' || edge.labelpos === 'r') { |
| edge.width -= edge.labeloffset; |
| } |
| switch (edge.labelpos) { |
| case 'l': edge.x -= edge.width / 2 + edge.labeloffset; break; |
| case 'r': edge.x += edge.width / 2 + edge.labeloffset; break; |
| } |
| } |
| }); |
| } |
| |
| function reversePointsForReversedEdges(g) { |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| if (edge.reversed) { |
| edge.points.reverse(); |
| } |
| }); |
| } |
| |
| function removeBorderNodes(g) { |
| _.forEach(g.nodes(), function(v) { |
| if (g.children(v).length) { |
| var node = g.node(v), |
| t = g.node(node.borderTop), |
| b = g.node(node.borderBottom), |
| l = g.node(_.last(node.borderLeft)), |
| r = g.node(_.last(node.borderRight)); |
| |
| node.width = Math.abs(r.x - l.x); |
| node.height = Math.abs(b.y - t.y); |
| node.x = l.x + node.width / 2; |
| node.y = t.y + node.height / 2; |
| } |
| }); |
| |
| _.forEach(g.nodes(), function(v) { |
| if (g.node(v).dummy === 'border') { |
| g.removeNode(v); |
| } |
| }); |
| } |
| |
| function removeSelfEdges(g) { |
| _.forEach(g.edges(), function(e) { |
| if (e.v === e.w) { |
| var node = g.node(e.v); |
| if (!node.selfEdges) { |
| node.selfEdges = []; |
| } |
| node.selfEdges.push({ e: e, label: g.edge(e) }); |
| g.removeEdge(e); |
| } |
| }); |
| } |
| |
| function insertSelfEdges(g) { |
| var layers = util.buildLayerMatrix(g); |
| _.forEach(layers, function(layer) { |
| var orderShift = 0; |
| _.forEach(layer, function(v, i) { |
| var node = g.node(v); |
| node.order = i + orderShift; |
| _.forEach(node.selfEdges, function(selfEdge) { |
| util.addDummyNode(g, 'selfedge', { |
| width: selfEdge.label.width, |
| height: selfEdge.label.height, |
| rank: node.rank, |
| order: i + (++orderShift), |
| e: selfEdge.e, |
| label: selfEdge.label |
| }, '_se'); |
| }); |
| delete node.selfEdges; |
| }); |
| }); |
| } |
| |
| function positionSelfEdges(g) { |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v); |
| if (node.dummy === 'selfedge') { |
| var selfNode = g.node(node.e.v), |
| x = selfNode.x + selfNode.width / 2, |
| y = selfNode.y, |
| dx = node.x - x, |
| dy = selfNode.height / 2; |
| g.setEdge(node.e, node.label); |
| g.removeNode(v); |
| node.label.points = [ |
| { x: x + 2 * dx / 3, y: y - dy }, |
| { x: x + 5 * dx / 6, y: y - dy }, |
| { x: x + dx , y: y }, |
| { x: x + 5 * dx / 6, y: y + dy }, |
| { x: x + 2 * dx / 3, y: y + dy } |
| ]; |
| node.label.x = node.x; |
| node.label.y = node.y; |
| } |
| }); |
| } |
| |
| function selectNumberAttrs(obj, attrs) { |
| return _.mapValues(_.pick(obj, attrs), Number); |
| } |
| |
| function canonicalize(attrs) { |
| var newAttrs = {}; |
| _.forEach(attrs, function(v, k) { |
| newAttrs[k.toLowerCase()] = v; |
| }); |
| return newAttrs; |
| } |
| |
| },{'./acyclic':2,'./add-border-segments':3,'./coordinate-system':4,'./graphlib':7,'./lodash':10,'./nesting-graph':11,'./normalize':12,'./order':17,'./parent-dummy-chains':22,'./position':24,'./rank':26,'./util':29}],10:[function(require,module,exports){ |
| /* global window */ |
| |
| var lodash; |
| |
| if (typeof require === 'function') { |
| try { |
| lodash = { |
| cloneDeep: require('lodash/cloneDeep'), |
| constant: require('lodash/constant'), |
| defaults: require('lodash/defaults'), |
| each: require('lodash/each'), |
| filter: require('lodash/filter'), |
| find: require('lodash/find'), |
| flatten: require('lodash/flatten'), |
| forEach: require('lodash/forEach'), |
| forIn: require('lodash/forIn'), |
| has: require('lodash/has'), |
| isUndefined: require('lodash/isUndefined'), |
| last: require('lodash/last'), |
| map: require('lodash/map'), |
| mapValues: require('lodash/mapValues'), |
| max: require('lodash/max'), |
| merge: require('lodash/merge'), |
| min: require('lodash/min'), |
| minBy: require('lodash/minBy'), |
| now: require('lodash/now'), |
| pick: require('lodash/pick'), |
| range: require('lodash/range'), |
| reduce: require('lodash/reduce'), |
| sortBy: require('lodash/sortBy'), |
| uniqueId: require('lodash/uniqueId'), |
| values: require('lodash/values'), |
| zipObject: require('lodash/zipObject'), |
| }; |
| } catch (e) {} |
| } |
| |
| if (!lodash) { |
| lodash = window._; |
| } |
| |
| module.exports = lodash; |
| |
| },{'lodash/cloneDeep':227,'lodash/constant':228,'lodash/defaults':229,'lodash/each':230,'lodash/filter':232,'lodash/find':233,'lodash/flatten':235,'lodash/forEach':236,'lodash/forIn':237,'lodash/has':239,'lodash/isUndefined':258,'lodash/last':261,'lodash/map':262,'lodash/mapValues':263,'lodash/max':264,'lodash/merge':266,'lodash/min':267,'lodash/minBy':268,'lodash/now':270,'lodash/pick':271,'lodash/range':273,'lodash/reduce':274,'lodash/sortBy':276,'lodash/uniqueId':286,'lodash/values':287,'lodash/zipObject':288}],11:[function(require,module,exports){ |
| var _ = require('./lodash'), |
| util = require('./util'); |
| |
| module.exports = { |
| run: run, |
| cleanup: cleanup |
| }; |
| |
| /* |
| * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs, |
| * adds appropriate edges to ensure that all cluster nodes are placed between |
| * these boundries, and ensures that the graph is connected. |
| * |
| * In addition we ensure, through the use of the minlen property, that nodes |
| * and subgraph border nodes to not end up on the same rank. |
| * |
| * Preconditions: |
| * |
| * 1. Input graph is a DAG |
| * 2. Nodes in the input graph has a minlen attribute |
| * |
| * Postconditions: |
| * |
| * 1. Input graph is connected. |
| * 2. Dummy nodes are added for the tops and bottoms of subgraphs. |
| * 3. The minlen attribute for nodes is adjusted to ensure nodes do not |
| * get placed on the same rank as subgraph border nodes. |
| * |
| * The nesting graph idea comes from Sander, "Layout of Compound Directed |
| * Graphs." |
| */ |
| function run(g) { |
| var root = util.addDummyNode(g, 'root', {}, '_root'); |
| var depths = treeDepths(g); |
| var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array |
| var nodeSep = 2 * height + 1; |
| |
| g.graph().nestingRoot = root; |
| |
| // Multiply minlen by nodeSep to align nodes on non-border ranks. |
| _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; }); |
| |
| // Calculate a weight that is sufficient to keep subgraphs vertically compact |
| var weight = sumWeights(g) + 1; |
| |
| // Create border nodes and link them up |
| _.forEach(g.children(), function(child) { |
| dfs(g, root, nodeSep, weight, height, depths, child); |
| }); |
| |
| // Save the multiplier for node layers for later removal of empty border |
| // layers. |
| g.graph().nodeRankFactor = nodeSep; |
| } |
| |
| function dfs(g, root, nodeSep, weight, height, depths, v) { |
| var children = g.children(v); |
| if (!children.length) { |
| if (v !== root) { |
| g.setEdge(root, v, { weight: 0, minlen: nodeSep }); |
| } |
| return; |
| } |
| |
| var top = util.addBorderNode(g, '_bt'), |
| bottom = util.addBorderNode(g, '_bb'), |
| label = g.node(v); |
| |
| g.setParent(top, v); |
| label.borderTop = top; |
| g.setParent(bottom, v); |
| label.borderBottom = bottom; |
| |
| _.forEach(children, function(child) { |
| dfs(g, root, nodeSep, weight, height, depths, child); |
| |
| var childNode = g.node(child), |
| childTop = childNode.borderTop ? childNode.borderTop : child, |
| childBottom = childNode.borderBottom ? childNode.borderBottom : child, |
| thisWeight = childNode.borderTop ? weight : 2 * weight, |
| minlen = childTop !== childBottom ? 1 : height - depths[v] + 1; |
| |
| g.setEdge(top, childTop, { |
| weight: thisWeight, |
| minlen: minlen, |
| nestingEdge: true |
| }); |
| |
| g.setEdge(childBottom, bottom, { |
| weight: thisWeight, |
| minlen: minlen, |
| nestingEdge: true |
| }); |
| }); |
| |
| if (!g.parent(v)) { |
| g.setEdge(root, top, { weight: 0, minlen: height + depths[v] }); |
| } |
| } |
| |
| function treeDepths(g) { |
| var depths = {}; |
| function dfs(v, depth) { |
| var children = g.children(v); |
| if (children && children.length) { |
| _.forEach(children, function(child) { |
| dfs(child, depth + 1); |
| }); |
| } |
| depths[v] = depth; |
| } |
| _.forEach(g.children(), function(v) { dfs(v, 1); }); |
| return depths; |
| } |
| |
| function sumWeights(g) { |
| return _.reduce(g.edges(), function(acc, e) { |
| return acc + g.edge(e).weight; |
| }, 0); |
| } |
| |
| function cleanup(g) { |
| var graphLabel = g.graph(); |
| g.removeNode(graphLabel.nestingRoot); |
| delete graphLabel.nestingRoot; |
| _.forEach(g.edges(), function(e) { |
| var edge = g.edge(e); |
| if (edge.nestingEdge) { |
| g.removeEdge(e); |
| } |
| }); |
| } |
| |
| },{'./lodash':10,'./util':29}],12:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'), |
| util = require('./util'); |
| |
| module.exports = { |
| run: run, |
| undo: undo |
| }; |
| |
| /* |
| * Breaks any long edges in the graph into short segments that span 1 layer |
| * each. This operation is undoable with the denormalize function. |
| * |
| * Pre-conditions: |
| * |
| * 1. The input graph is a DAG. |
| * 2. Each node in the graph has a "rank" property. |
| * |
| * Post-condition: |
| * |
| * 1. All edges in the graph have a length of 1. |
| * 2. Dummy nodes are added where edges have been split into segments. |
| * 3. The graph is augmented with a "dummyChains" attribute which contains |
| * the first dummy in each chain of dummy nodes produced. |
| */ |
| function run(g) { |
| g.graph().dummyChains = []; |
| _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); }); |
| } |
| |
| function normalizeEdge(g, e) { |
| var v = e.v, |
| vRank = g.node(v).rank, |
| w = e.w, |
| wRank = g.node(w).rank, |
| name = e.name, |
| edgeLabel = g.edge(e), |
| labelRank = edgeLabel.labelRank; |
| |
| if (wRank === vRank + 1) return; |
| |
| g.removeEdge(e); |
| |
| var dummy, attrs, i; |
| for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) { |
| edgeLabel.points = []; |
| attrs = { |
| width: 0, height: 0, |
| edgeLabel: edgeLabel, edgeObj: e, |
| rank: vRank |
| }; |
| dummy = util.addDummyNode(g, 'edge', attrs, '_d'); |
| if (vRank === labelRank) { |
| attrs.width = edgeLabel.width; |
| attrs.height = edgeLabel.height; |
| attrs.dummy = 'edge-label'; |
| attrs.labelpos = edgeLabel.labelpos; |
| } |
| g.setEdge(v, dummy, { weight: edgeLabel.weight }, name); |
| if (i === 0) { |
| g.graph().dummyChains.push(dummy); |
| } |
| v = dummy; |
| } |
| |
| g.setEdge(v, w, { weight: edgeLabel.weight }, name); |
| } |
| |
| function undo(g) { |
| _.forEach(g.graph().dummyChains, function(v) { |
| var node = g.node(v), |
| origLabel = node.edgeLabel, |
| w; |
| g.setEdge(node.edgeObj, origLabel); |
| while (node.dummy) { |
| w = g.successors(v)[0]; |
| g.removeNode(v); |
| origLabel.points.push({ x: node.x, y: node.y }); |
| if (node.dummy === 'edge-label') { |
| origLabel.x = node.x; |
| origLabel.y = node.y; |
| origLabel.width = node.width; |
| origLabel.height = node.height; |
| } |
| v = w; |
| node = g.node(v); |
| } |
| }); |
| } |
| |
| },{'./lodash':10,'./util':29}],13:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = addSubgraphConstraints; |
| |
| function addSubgraphConstraints(g, cg, vs) { |
| var prev = {}, |
| rootPrev; |
| |
| _.forEach(vs, function(v) { |
| var child = g.parent(v), |
| parent, |
| prevChild; |
| while (child) { |
| parent = g.parent(child); |
| if (parent) { |
| prevChild = prev[parent]; |
| prev[parent] = child; |
| } else { |
| prevChild = rootPrev; |
| rootPrev = child; |
| } |
| if (prevChild && prevChild !== child) { |
| cg.setEdge(prevChild, child); |
| return; |
| } |
| child = parent; |
| } |
| }); |
| |
| /* |
| function dfs(v) { |
| var children = v ? g.children(v) : g.children(); |
| if (children.length) { |
| var min = Number.POSITIVE_INFINITY, |
| subgraphs = []; |
| _.each(children, function(child) { |
| var childMin = dfs(child); |
| if (g.children(child).length) { |
| subgraphs.push({ v: child, order: childMin }); |
| } |
| min = Math.min(min, childMin); |
| }); |
| _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) { |
| cg.setEdge(prev.v, curr.v); |
| return curr; |
| }); |
| return min; |
| } |
| return g.node(v).order; |
| } |
| dfs(undefined); |
| */ |
| } |
| |
| },{'../lodash':10}],14:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = barycenter; |
| |
| function barycenter(g, movable) { |
| return _.map(movable, function(v) { |
| var inV = g.inEdges(v); |
| if (!inV.length) { |
| return { v: v }; |
| } else { |
| var result = _.reduce(inV, function(acc, e) { |
| var edge = g.edge(e), |
| nodeU = g.node(e.v); |
| return { |
| sum: acc.sum + (edge.weight * nodeU.order), |
| weight: acc.weight + edge.weight |
| }; |
| }, { sum: 0, weight: 0 }); |
| |
| return { |
| v: v, |
| barycenter: result.sum / result.weight, |
| weight: result.weight |
| }; |
| } |
| }); |
| } |
| |
| |
| },{'../lodash':10}],15:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| Graph = require('../graphlib').Graph; |
| |
| module.exports = buildLayerGraph; |
| |
| /* |
| * Constructs a graph that can be used to sort a layer of nodes. The graph will |
| * contain all base and subgraph nodes from the request layer in their original |
| * hierarchy and any edges that are incident on these nodes and are of the type |
| * requested by the "relationship" parameter. |
| * |
| * Nodes from the requested rank that do not have parents are assigned a root |
| * node in the output graph, which is set in the root graph attribute. This |
| * makes it easy to walk the hierarchy of movable nodes during ordering. |
| * |
| * Pre-conditions: |
| * |
| * 1. Input graph is a DAG |
| * 2. Base nodes in the input graph have a rank attribute |
| * 3. Subgraph nodes in the input graph has minRank and maxRank attributes |
| * 4. Edges have an assigned weight |
| * |
| * Post-conditions: |
| * |
| * 1. Output graph has all nodes in the movable rank with preserved |
| * hierarchy. |
| * 2. Root nodes in the movable layer are made children of the node |
| * indicated by the root attribute of the graph. |
| * 3. Non-movable nodes incident on movable nodes, selected by the |
| * relationship parameter, are included in the graph (without hierarchy). |
| * 4. Edges incident on movable nodes, selected by the relationship |
| * parameter, are added to the output graph. |
| * 5. The weights for copied edges are aggregated as need, since the output |
| * graph is not a multi-graph. |
| */ |
| function buildLayerGraph(g, rank, relationship) { |
| var root = createRootNode(g), |
| result = new Graph({ compound: true }).setGraph({ root: root }) |
| .setDefaultNodeLabel(function(v) { return g.node(v); }); |
| |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v), |
| parent = g.parent(v); |
| |
| if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) { |
| result.setNode(v); |
| result.setParent(v, parent || root); |
| |
| // This assumes we have only short edges! |
| _.forEach(g[relationship](v), function(e) { |
| var u = e.v === v ? e.w : e.v, |
| edge = result.edge(u, v), |
| weight = !_.isUndefined(edge) ? edge.weight : 0; |
| result.setEdge(u, v, { weight: g.edge(e).weight + weight }); |
| }); |
| |
| if (_.has(node, 'minRank')) { |
| result.setNode(v, { |
| borderLeft: node.borderLeft[rank], |
| borderRight: node.borderRight[rank] |
| }); |
| } |
| } |
| }); |
| |
| return result; |
| } |
| |
| function createRootNode(g) { |
| var v; |
| while (g.hasNode((v = _.uniqueId('_root')))); |
| return v; |
| } |
| |
| },{'../graphlib':7,'../lodash':10}],16:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'); |
| |
| module.exports = crossCount; |
| |
| /* |
| * A function that takes a layering (an array of layers, each with an array of |
| * ordererd nodes) and a graph and returns a weighted crossing count. |
| * |
| * Pre-conditions: |
| * |
| * 1. Input graph must be simple (not a multigraph), directed, and include |
| * only simple edges. |
| * 2. Edges in the input graph must have assigned weights. |
| * |
| * Post-conditions: |
| * |
| * 1. The graph and layering matrix are left unchanged. |
| * |
| * This algorithm is derived from Barth, et al., "Bilayer Cross Counting." |
| */ |
| function crossCount(g, layering) { |
| var cc = 0; |
| for (var i = 1; i < layering.length; ++i) { |
| cc += twoLayerCrossCount(g, layering[i-1], layering[i]); |
| } |
| return cc; |
| } |
| |
| function twoLayerCrossCount(g, northLayer, southLayer) { |
| // Sort all of the edges between the north and south layers by their position |
| // in the north layer and then the south. Map these edges to the position of |
| // their head in the south layer. |
| var southPos = _.zipObject(southLayer, |
| _.map(southLayer, function (v, i) { return i; })); |
| var southEntries = _.flatten(_.map(northLayer, function(v) { |
| return _.sortBy(_.map(g.outEdges(v), function(e) { |
| return { pos: southPos[e.w], weight: g.edge(e).weight }; |
| }), 'pos'); |
| }), true); |
| |
| // Build the accumulator tree |
| var firstIndex = 1; |
| while (firstIndex < southLayer.length) firstIndex <<= 1; |
| var treeSize = 2 * firstIndex - 1; |
| firstIndex -= 1; |
| var tree = _.map(new Array(treeSize), function() { return 0; }); |
| |
| // Calculate the weighted crossings |
| var cc = 0; |
| _.forEach(southEntries.forEach(function(entry) { |
| var index = entry.pos + firstIndex; |
| tree[index] += entry.weight; |
| var weightSum = 0; |
| while (index > 0) { |
| if (index % 2) { |
| weightSum += tree[index + 1]; |
| } |
| index = (index - 1) >> 1; |
| tree[index] += entry.weight; |
| } |
| cc += entry.weight * weightSum; |
| })); |
| |
| return cc; |
| } |
| |
| },{'../lodash':10}],17:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'), |
| initOrder = require('./init-order'), |
| crossCount = require('./cross-count'), |
| sortSubgraph = require('./sort-subgraph'), |
| buildLayerGraph = require('./build-layer-graph'), |
| addSubgraphConstraints = require('./add-subgraph-constraints'), |
| Graph = require('../graphlib').Graph, |
| util = require('../util'); |
| |
| module.exports = order; |
| |
| /* |
| * Applies heuristics to minimize edge crossings in the graph and sets the best |
| * order solution as an order attribute on each node. |
| * |
| * Pre-conditions: |
| * |
| * 1. Graph must be DAG |
| * 2. Graph nodes must be objects with a "rank" attribute |
| * 3. Graph edges must have the "weight" attribute |
| * |
| * Post-conditions: |
| * |
| * 1. Graph nodes will have an "order" attribute based on the results of the |
| * algorithm. |
| */ |
| function order(g) { |
| var maxRank = util.maxRank(g), |
| downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), 'inEdges'), |
| upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), 'outEdges'); |
| |
| var layering = initOrder(g); |
| assignOrder(g, layering); |
| |
| var bestCC = Number.POSITIVE_INFINITY, |
| best; |
| |
| for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) { |
| sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2); |
| |
| layering = util.buildLayerMatrix(g); |
| var cc = crossCount(g, layering); |
| if (cc < bestCC) { |
| lastBest = 0; |
| best = _.cloneDeep(layering); |
| bestCC = cc; |
| } |
| } |
| |
| assignOrder(g, best); |
| } |
| |
| function buildLayerGraphs(g, ranks, relationship) { |
| return _.map(ranks, function(rank) { |
| return buildLayerGraph(g, rank, relationship); |
| }); |
| } |
| |
| function sweepLayerGraphs(layerGraphs, biasRight) { |
| var cg = new Graph(); |
| _.forEach(layerGraphs, function(lg) { |
| var root = lg.graph().root; |
| var sorted = sortSubgraph(lg, root, cg, biasRight); |
| _.forEach(sorted.vs, function(v, i) { |
| lg.node(v).order = i; |
| }); |
| addSubgraphConstraints(lg, cg, sorted.vs); |
| }); |
| } |
| |
| function assignOrder(g, layering) { |
| _.forEach(layering, function(layer) { |
| _.forEach(layer, function(v, i) { |
| g.node(v).order = i; |
| }); |
| }); |
| } |
| |
| },{'../graphlib':7,'../lodash':10,'../util':29,'./add-subgraph-constraints':13,'./build-layer-graph':15,'./cross-count':16,'./init-order':18,'./sort-subgraph':20}],18:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'); |
| |
| module.exports = initOrder; |
| |
| /* |
| * Assigns an initial order value for each node by performing a DFS search |
| * starting from nodes in the first rank. Nodes are assigned an order in their |
| * rank as they are first visited. |
| * |
| * This approach comes from Gansner, et al., "A Technique for Drawing Directed |
| * Graphs." |
| * |
| * Returns a layering matrix with an array per layer and each layer sorted by |
| * the order of its nodes. |
| */ |
| function initOrder(g) { |
| var visited = {}, |
| simpleNodes = _.filter(g.nodes(), function(v) { |
| return !g.children(v).length; |
| }), |
| maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; })), |
| layers = _.map(_.range(maxRank + 1), function() { return []; }); |
| |
| function dfs(v) { |
| if (_.has(visited, v)) return; |
| visited[v] = true; |
| var node = g.node(v); |
| layers[node.rank].push(v); |
| _.forEach(g.successors(v), dfs); |
| } |
| |
| var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; }); |
| _.forEach(orderedVs, dfs); |
| |
| return layers; |
| } |
| |
| },{'../lodash':10}],19:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'); |
| |
| module.exports = resolveConflicts; |
| |
| /* |
| * Given a list of entries of the form {v, barycenter, weight} and a |
| * constraint graph this function will resolve any conflicts between the |
| * constraint graph and the barycenters for the entries. If the barycenters for |
| * an entry would violate a constraint in the constraint graph then we coalesce |
| * the nodes in the conflict into a new node that respects the contraint and |
| * aggregates barycenter and weight information. |
| * |
| * This implementation is based on the description in Forster, "A Fast and |
| * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it |
| * differs in some specific details. |
| * |
| * Pre-conditions: |
| * |
| * 1. Each entry has the form {v, barycenter, weight}, or if the node has |
| * no barycenter, then {v}. |
| * |
| * Returns: |
| * |
| * A new list of entries of the form {vs, i, barycenter, weight}. The list |
| * `vs` may either be a singleton or it may be an aggregation of nodes |
| * ordered such that they do not violate constraints from the constraint |
| * graph. The property `i` is the lowest original index of any of the |
| * elements in `vs`. |
| */ |
| function resolveConflicts(entries, cg) { |
| var mappedEntries = {}; |
| _.forEach(entries, function(entry, i) { |
| var tmp = mappedEntries[entry.v] = { |
| indegree: 0, |
| 'in': [], |
| out: [], |
| vs: [entry.v], |
| i: i |
| }; |
| if (!_.isUndefined(entry.barycenter)) { |
| tmp.barycenter = entry.barycenter; |
| tmp.weight = entry.weight; |
| } |
| }); |
| |
| _.forEach(cg.edges(), function(e) { |
| var entryV = mappedEntries[e.v], |
| entryW = mappedEntries[e.w]; |
| if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) { |
| entryW.indegree++; |
| entryV.out.push(mappedEntries[e.w]); |
| } |
| }); |
| |
| var sourceSet = _.filter(mappedEntries, function(entry) { |
| return !entry.indegree; |
| }); |
| |
| return doResolveConflicts(sourceSet); |
| } |
| |
| function doResolveConflicts(sourceSet) { |
| var entries = []; |
| |
| function handleIn(vEntry) { |
| return function(uEntry) { |
| if (uEntry.merged) { |
| return; |
| } |
| if (_.isUndefined(uEntry.barycenter) || |
| _.isUndefined(vEntry.barycenter) || |
| uEntry.barycenter >= vEntry.barycenter) { |
| mergeEntries(vEntry, uEntry); |
| } |
| }; |
| } |
| |
| function handleOut(vEntry) { |
| return function(wEntry) { |
| wEntry['in'].push(vEntry); |
| if (--wEntry.indegree === 0) { |
| sourceSet.push(wEntry); |
| } |
| }; |
| } |
| |
| while (sourceSet.length) { |
| var entry = sourceSet.pop(); |
| entries.push(entry); |
| _.forEach(entry['in'].reverse(), handleIn(entry)); |
| _.forEach(entry.out, handleOut(entry)); |
| } |
| |
| return _.map(_.filter(entries, function(entry) { return !entry.merged; }), |
| function(entry) { |
| return _.pick(entry, ['vs', 'i', 'barycenter', 'weight']); |
| }); |
| |
| } |
| |
| function mergeEntries(target, source) { |
| var sum = 0, |
| weight = 0; |
| |
| if (target.weight) { |
| sum += target.barycenter * target.weight; |
| weight += target.weight; |
| } |
| |
| if (source.weight) { |
| sum += source.barycenter * source.weight; |
| weight += source.weight; |
| } |
| |
| target.vs = source.vs.concat(target.vs); |
| target.barycenter = sum / weight; |
| target.weight = weight; |
| target.i = Math.min(source.i, target.i); |
| source.merged = true; |
| } |
| |
| },{'../lodash':10}],20:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| barycenter = require('./barycenter'), |
| resolveConflicts = require('./resolve-conflicts'), |
| sort = require('./sort'); |
| |
| module.exports = sortSubgraph; |
| |
| function sortSubgraph(g, v, cg, biasRight) { |
| var movable = g.children(v), |
| node = g.node(v), |
| bl = node ? node.borderLeft : undefined, |
| br = node ? node.borderRight: undefined, |
| subgraphs = {}; |
| |
| if (bl) { |
| movable = _.filter(movable, function(w) { |
| return w !== bl && w !== br; |
| }); |
| } |
| |
| var barycenters = barycenter(g, movable); |
| _.forEach(barycenters, function(entry) { |
| if (g.children(entry.v).length) { |
| var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight); |
| subgraphs[entry.v] = subgraphResult; |
| if (_.has(subgraphResult, 'barycenter')) { |
| mergeBarycenters(entry, subgraphResult); |
| } |
| } |
| }); |
| |
| var entries = resolveConflicts(barycenters, cg); |
| expandSubgraphs(entries, subgraphs); |
| |
| var result = sort(entries, biasRight); |
| |
| if (bl) { |
| result.vs = _.flatten([bl, result.vs, br], true); |
| if (g.predecessors(bl).length) { |
| var blPred = g.node(g.predecessors(bl)[0]), |
| brPred = g.node(g.predecessors(br)[0]); |
| if (!_.has(result, 'barycenter')) { |
| result.barycenter = 0; |
| result.weight = 0; |
| } |
| result.barycenter = (result.barycenter * result.weight + |
| blPred.order + brPred.order) / (result.weight + 2); |
| result.weight += 2; |
| } |
| } |
| |
| return result; |
| } |
| |
| function expandSubgraphs(entries, subgraphs) { |
| _.forEach(entries, function(entry) { |
| entry.vs = _.flatten(entry.vs.map(function(v) { |
| if (subgraphs[v]) { |
| return subgraphs[v].vs; |
| } |
| return v; |
| }), true); |
| }); |
| } |
| |
| function mergeBarycenters(target, other) { |
| if (!_.isUndefined(target.barycenter)) { |
| target.barycenter = (target.barycenter * target.weight + |
| other.barycenter * other.weight) / |
| (target.weight + other.weight); |
| target.weight += other.weight; |
| } else { |
| target.barycenter = other.barycenter; |
| target.weight = other.weight; |
| } |
| } |
| |
| },{'../lodash':10,'./barycenter':14,'./resolve-conflicts':19,'./sort':21}],21:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| util = require('../util'); |
| |
| module.exports = sort; |
| |
| function sort(entries, biasRight) { |
| var parts = util.partition(entries, function(entry) { |
| return _.has(entry, 'barycenter'); |
| }); |
| var sortable = parts.lhs, |
| unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }), |
| vs = [], |
| sum = 0, |
| weight = 0, |
| vsIndex = 0; |
| |
| sortable.sort(compareWithBias(!!biasRight)); |
| |
| vsIndex = consumeUnsortable(vs, unsortable, vsIndex); |
| |
| _.forEach(sortable, function (entry) { |
| vsIndex += entry.vs.length; |
| vs.push(entry.vs); |
| sum += entry.barycenter * entry.weight; |
| weight += entry.weight; |
| vsIndex = consumeUnsortable(vs, unsortable, vsIndex); |
| }); |
| |
| var result = { vs: _.flatten(vs, true) }; |
| if (weight) { |
| result.barycenter = sum / weight; |
| result.weight = weight; |
| } |
| return result; |
| } |
| |
| function consumeUnsortable(vs, unsortable, index) { |
| var last; |
| while (unsortable.length && (last = _.last(unsortable)).i <= index) { |
| unsortable.pop(); |
| vs.push(last.vs); |
| index++; |
| } |
| return index; |
| } |
| |
| function compareWithBias(bias) { |
| return function(entryV, entryW) { |
| if (entryV.barycenter < entryW.barycenter) { |
| return -1; |
| } else if (entryV.barycenter > entryW.barycenter) { |
| return 1; |
| } |
| |
| return !bias ? entryV.i - entryW.i : entryW.i - entryV.i; |
| }; |
| } |
| |
| },{'../lodash':10,'../util':29}],22:[function(require,module,exports){ |
| var _ = require('./lodash'); |
| |
| module.exports = parentDummyChains; |
| |
| function parentDummyChains(g) { |
| var postorderNums = postorder(g); |
| |
| _.forEach(g.graph().dummyChains, function(v) { |
| var node = g.node(v), |
| edgeObj = node.edgeObj, |
| pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w), |
| path = pathData.path, |
| lca = pathData.lca, |
| pathIdx = 0, |
| pathV = path[pathIdx], |
| ascending = true; |
| |
| while (v !== edgeObj.w) { |
| node = g.node(v); |
| |
| if (ascending) { |
| while ((pathV = path[pathIdx]) !== lca && |
| g.node(pathV).maxRank < node.rank) { |
| pathIdx++; |
| } |
| |
| if (pathV === lca) { |
| ascending = false; |
| } |
| } |
| |
| if (!ascending) { |
| while (pathIdx < path.length - 1 && |
| g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) { |
| pathIdx++; |
| } |
| pathV = path[pathIdx]; |
| } |
| |
| g.setParent(v, pathV); |
| v = g.successors(v)[0]; |
| } |
| }); |
| } |
| |
| // Find a path from v to w through the lowest common ancestor (LCA). Return the |
| // full path and the LCA. |
| function findPath(g, postorderNums, v, w) { |
| var vPath = [], |
| wPath = [], |
| low = Math.min(postorderNums[v].low, postorderNums[w].low), |
| lim = Math.max(postorderNums[v].lim, postorderNums[w].lim), |
| parent, |
| lca; |
| |
| // Traverse up from v to find the LCA |
| parent = v; |
| do { |
| parent = g.parent(parent); |
| vPath.push(parent); |
| } while (parent && |
| (postorderNums[parent].low > low || lim > postorderNums[parent].lim)); |
| lca = parent; |
| |
| // Traverse from w to LCA |
| parent = w; |
| while ((parent = g.parent(parent)) !== lca) { |
| wPath.push(parent); |
| } |
| |
| return { path: vPath.concat(wPath.reverse()), lca: lca }; |
| } |
| |
| function postorder(g) { |
| var result = {}, |
| lim = 0; |
| |
| function dfs(v) { |
| var low = lim; |
| _.forEach(g.children(v), dfs); |
| result[v] = { low: low, lim: lim++ }; |
| } |
| _.forEach(g.children(), dfs); |
| |
| return result; |
| } |
| |
| },{'./lodash':10}],23:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'), |
| Graph = require('../graphlib').Graph, |
| util = require('../util'); |
| |
| /* |
| * This module provides coordinate assignment based on Brandes and Köpf, "Fast |
| * and Simple Horizontal Coordinate Assignment." |
| */ |
| |
| module.exports = { |
| positionX: positionX, |
| findType1Conflicts: findType1Conflicts, |
| findType2Conflicts: findType2Conflicts, |
| addConflict: addConflict, |
| hasConflict: hasConflict, |
| verticalAlignment: verticalAlignment, |
| horizontalCompaction: horizontalCompaction, |
| alignCoordinates: alignCoordinates, |
| findSmallestWidthAlignment: findSmallestWidthAlignment, |
| balance: balance |
| }; |
| |
| /* |
| * Marks all edges in the graph with a type-1 conflict with the "type1Conflict" |
| * property. A type-1 conflict is one where a non-inner segment crosses an |
| * inner segment. An inner segment is an edge with both incident nodes marked |
| * with the "dummy" property. |
| * |
| * This algorithm scans layer by layer, starting with the second, for type-1 |
| * conflicts between the current layer and the previous layer. For each layer |
| * it scans the nodes from left to right until it reaches one that is incident |
| * on an inner segment. It then scans predecessors to determine if they have |
| * edges that cross that inner segment. At the end a final scan is done for all |
| * nodes on the current rank to see if they cross the last visited inner |
| * segment. |
| * |
| * This algorithm (safely) assumes that a dummy node will only be incident on a |
| * single node in the layers being scanned. |
| */ |
| function findType1Conflicts(g, layering) { |
| var conflicts = {}; |
| |
| function visitLayer(prevLayer, layer) { |
| var |
| // last visited node in the previous layer that is incident on an inner |
| // segment. |
| k0 = 0, |
| // Tracks the last node in this layer scanned for crossings with a type-1 |
| // segment. |
| scanPos = 0, |
| prevLayerLength = prevLayer.length, |
| lastNode = _.last(layer); |
| |
| _.forEach(layer, function(v, i) { |
| var w = findOtherInnerSegmentNode(g, v), |
| k1 = w ? g.node(w).order : prevLayerLength; |
| |
| if (w || v === lastNode) { |
| _.forEach(layer.slice(scanPos, i +1), function(scanNode) { |
| _.forEach(g.predecessors(scanNode), function(u) { |
| var uLabel = g.node(u), |
| uPos = uLabel.order; |
| if ((uPos < k0 || k1 < uPos) && |
| !(uLabel.dummy && g.node(scanNode).dummy)) { |
| addConflict(conflicts, u, scanNode); |
| } |
| }); |
| }); |
| scanPos = i + 1; |
| k0 = k1; |
| } |
| }); |
| |
| return layer; |
| } |
| |
| _.reduce(layering, visitLayer); |
| return conflicts; |
| } |
| |
| function findType2Conflicts(g, layering) { |
| var conflicts = {}; |
| |
| function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) { |
| var v; |
| _.forEach(_.range(southPos, southEnd), function(i) { |
| v = south[i]; |
| if (g.node(v).dummy) { |
| _.forEach(g.predecessors(v), function(u) { |
| var uNode = g.node(u); |
| if (uNode.dummy && |
| (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) { |
| addConflict(conflicts, u, v); |
| } |
| }); |
| } |
| }); |
| } |
| |
| |
| function visitLayer(north, south) { |
| var prevNorthPos = -1, |
| nextNorthPos, |
| southPos = 0; |
| |
| _.forEach(south, function(v, southLookahead) { |
| if (g.node(v).dummy === 'border') { |
| var predecessors = g.predecessors(v); |
| if (predecessors.length) { |
| nextNorthPos = g.node(predecessors[0]).order; |
| scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos); |
| southPos = southLookahead; |
| prevNorthPos = nextNorthPos; |
| } |
| } |
| scan(south, southPos, south.length, nextNorthPos, north.length); |
| }); |
| |
| return south; |
| } |
| |
| _.reduce(layering, visitLayer); |
| return conflicts; |
| } |
| |
| function findOtherInnerSegmentNode(g, v) { |
| if (g.node(v).dummy) { |
| return _.find(g.predecessors(v), function(u) { |
| return g.node(u).dummy; |
| }); |
| } |
| } |
| |
| function addConflict(conflicts, v, w) { |
| if (v > w) { |
| var tmp = v; |
| v = w; |
| w = tmp; |
| } |
| |
| var conflictsV = conflicts[v]; |
| if (!conflictsV) { |
| conflicts[v] = conflictsV = {}; |
| } |
| conflictsV[w] = true; |
| } |
| |
| function hasConflict(conflicts, v, w) { |
| if (v > w) { |
| var tmp = v; |
| v = w; |
| w = tmp; |
| } |
| return _.has(conflicts[v], w); |
| } |
| |
| /* |
| * Try to align nodes into vertical "blocks" where possible. This algorithm |
| * attempts to align a node with one of its median neighbors. If the edge |
| * connecting a neighbor is a type-1 conflict then we ignore that possibility. |
| * If a previous node has already formed a block with a node after the node |
| * we're trying to form a block with, we also ignore that possibility - our |
| * blocks would be split in that scenario. |
| */ |
| function verticalAlignment(g, layering, conflicts, neighborFn) { |
| var root = {}, |
| align = {}, |
| pos = {}; |
| |
| // We cache the position here based on the layering because the graph and |
| // layering may be out of sync. The layering matrix is manipulated to |
| // generate different extreme alignments. |
| _.forEach(layering, function(layer) { |
| _.forEach(layer, function(v, order) { |
| root[v] = v; |
| align[v] = v; |
| pos[v] = order; |
| }); |
| }); |
| |
| _.forEach(layering, function(layer) { |
| var prevIdx = -1; |
| _.forEach(layer, function(v) { |
| var ws = neighborFn(v); |
| if (ws.length) { |
| ws = _.sortBy(ws, function(w) { return pos[w]; }); |
| var mp = (ws.length - 1) / 2; |
| for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) { |
| var w = ws[i]; |
| if (align[v] === v && |
| prevIdx < pos[w] && |
| !hasConflict(conflicts, v, w)) { |
| align[w] = v; |
| align[v] = root[v] = root[w]; |
| prevIdx = pos[w]; |
| } |
| } |
| } |
| }); |
| }); |
| |
| return { root: root, align: align }; |
| } |
| |
| function horizontalCompaction(g, layering, root, align, reverseSep) { |
| // This portion of the algorithm differs from BK due to a number of problems. |
| // Instead of their algorithm we construct a new block graph and do two |
| // sweeps. The first sweep places blocks with the smallest possible |
| // coordinates. The second sweep removes unused space by moving blocks to the |
| // greatest coordinates without violating separation. |
| var xs = {}, |
| blockG = buildBlockGraph(g, layering, root, reverseSep), |
| borderType = reverseSep ? 'borderLeft' : 'borderRight'; |
| |
| function iterate(setXsFunc, nextNodesFunc) { |
| var stack = blockG.nodes(); |
| var elem = stack.pop(); |
| var visited = {}; |
| while (elem) { |
| if (visited[elem]) { |
| setXsFunc(elem); |
| } else { |
| visited[elem] = true; |
| stack.push(elem); |
| stack = stack.concat(nextNodesFunc(elem)); |
| } |
| |
| elem = stack.pop(); |
| } |
| } |
| |
| // First pass, assign smallest coordinates |
| function pass1(elem) { |
| xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) { |
| return Math.max(acc, xs[e.v] + blockG.edge(e)); |
| }, 0); |
| } |
| |
| // Second pass, assign greatest coordinates |
| function pass2(elem) { |
| var min = blockG.outEdges(elem).reduce(function(acc, e) { |
| return Math.min(acc, xs[e.w] - blockG.edge(e)); |
| }, Number.POSITIVE_INFINITY); |
| |
| var node = g.node(elem); |
| if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) { |
| xs[elem] = Math.max(xs[elem], min); |
| } |
| } |
| |
| iterate(pass1, blockG.predecessors.bind(blockG)); |
| iterate(pass2, blockG.successors.bind(blockG)); |
| |
| // Assign x coordinates to all nodes |
| _.forEach(align, function(v) { |
| xs[v] = xs[root[v]]; |
| }); |
| |
| return xs; |
| } |
| |
| |
| function buildBlockGraph(g, layering, root, reverseSep) { |
| var blockGraph = new Graph(), |
| graphLabel = g.graph(), |
| sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep); |
| |
| _.forEach(layering, function(layer) { |
| var u; |
| _.forEach(layer, function(v) { |
| var vRoot = root[v]; |
| blockGraph.setNode(vRoot); |
| if (u) { |
| var uRoot = root[u], |
| prevMax = blockGraph.edge(uRoot, vRoot); |
| blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0)); |
| } |
| u = v; |
| }); |
| }); |
| |
| return blockGraph; |
| } |
| |
| /* |
| * Returns the alignment that has the smallest width of the given alignments. |
| */ |
| function findSmallestWidthAlignment(g, xss) { |
| return _.minBy(_.values(xss), function (xs) { |
| var max = Number.NEGATIVE_INFINITY; |
| var min = Number.POSITIVE_INFINITY; |
| |
| _.forIn(xs, function (x, v) { |
| var halfWidth = width(g, v) / 2; |
| |
| max = Math.max(x + halfWidth, max); |
| min = Math.min(x - halfWidth, min); |
| }); |
| |
| return max - min; |
| }); |
| } |
| |
| /* |
| * Align the coordinates of each of the layout alignments such that |
| * left-biased alignments have their minimum coordinate at the same point as |
| * the minimum coordinate of the smallest width alignment and right-biased |
| * alignments have their maximum coordinate at the same point as the maximum |
| * coordinate of the smallest width alignment. |
| */ |
| function alignCoordinates(xss, alignTo) { |
| var alignToVals = _.values(alignTo), |
| alignToMin = _.min(alignToVals), |
| alignToMax = _.max(alignToVals); |
| |
| _.forEach(['u', 'd'], function(vert) { |
| _.forEach(['l', 'r'], function(horiz) { |
| var alignment = vert + horiz, |
| xs = xss[alignment], |
| delta; |
| if (xs === alignTo) return; |
| |
| var xsVals = _.values(xs); |
| delta = horiz === 'l' ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals); |
| |
| if (delta) { |
| xss[alignment] = _.mapValues(xs, function(x) { return x + delta; }); |
| } |
| }); |
| }); |
| } |
| |
| function balance(xss, align) { |
| return _.mapValues(xss.ul, function(ignore, v) { |
| if (align) { |
| return xss[align.toLowerCase()][v]; |
| } else { |
| var xs = _.sortBy(_.map(xss, v)); |
| return (xs[1] + xs[2]) / 2; |
| } |
| }); |
| } |
| |
| function positionX(g) { |
| var layering = util.buildLayerMatrix(g), |
| conflicts = _.merge(findType1Conflicts(g, layering), |
| findType2Conflicts(g, layering)); |
| |
| var xss = {}, |
| adjustedLayering; |
| _.forEach(['u', 'd'], function(vert) { |
| adjustedLayering = vert === 'u' ? layering : _.values(layering).reverse(); |
| _.forEach(['l', 'r'], function(horiz) { |
| if (horiz === 'r') { |
| adjustedLayering = _.map(adjustedLayering, function(inner) { |
| return _.values(inner).reverse(); |
| }); |
| } |
| |
| var neighborFn = (vert === 'u' ? g.predecessors : g.successors).bind(g); |
| var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn); |
| var xs = horizontalCompaction(g, adjustedLayering, |
| align.root, align.align, |
| horiz === 'r'); |
| if (horiz === 'r') { |
| xs = _.mapValues(xs, function(x) { return -x; }); |
| } |
| xss[vert + horiz] = xs; |
| }); |
| }); |
| |
| var smallestWidth = findSmallestWidthAlignment(g, xss); |
| alignCoordinates(xss, smallestWidth); |
| return balance(xss, g.graph().align); |
| } |
| |
| function sep(nodeSep, edgeSep, reverseSep) { |
| return function(g, v, w) { |
| var vLabel = g.node(v), |
| wLabel = g.node(w), |
| sum = 0, |
| delta; |
| |
| sum += vLabel.width / 2; |
| if (_.has(vLabel, 'labelpos')) { |
| switch (vLabel.labelpos.toLowerCase()) { |
| case 'l': delta = -vLabel.width / 2; break; |
| case 'r': delta = vLabel.width / 2; break; |
| } |
| } |
| if (delta) { |
| sum += reverseSep ? delta : -delta; |
| } |
| delta = 0; |
| |
| sum += (vLabel.dummy ? edgeSep : nodeSep) / 2; |
| sum += (wLabel.dummy ? edgeSep : nodeSep) / 2; |
| |
| sum += wLabel.width / 2; |
| if (_.has(wLabel, 'labelpos')) { |
| switch (wLabel.labelpos.toLowerCase()) { |
| case 'l': delta = wLabel.width / 2; break; |
| case 'r': delta = -wLabel.width / 2; break; |
| } |
| } |
| if (delta) { |
| sum += reverseSep ? delta : -delta; |
| } |
| delta = 0; |
| |
| return sum; |
| }; |
| } |
| |
| function width(g, v) { |
| return g.node(v).width; |
| } |
| |
| },{'../graphlib':7,'../lodash':10,'../util':29}],24:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'), |
| util = require('../util'), |
| positionX = require('./bk').positionX; |
| |
| module.exports = position; |
| |
| function position(g) { |
| g = util.asNonCompoundGraph(g); |
| |
| positionY(g); |
| _.forEach(positionX(g), function(x, v) { |
| g.node(v).x = x; |
| }); |
| } |
| |
| function positionY(g) { |
| var layering = util.buildLayerMatrix(g), |
| rankSep = g.graph().ranksep, |
| prevY = 0; |
| _.forEach(layering, function(layer) { |
| var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; })); |
| _.forEach(layer, function(v) { |
| g.node(v).y = prevY + maxHeight / 2; |
| }); |
| prevY += maxHeight + rankSep; |
| }); |
| } |
| |
| |
| },{'../lodash':10,'../util':29,'./bk':23}],25:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'), |
| Graph = require('../graphlib').Graph, |
| slack = require('./util').slack; |
| |
| module.exports = feasibleTree; |
| |
| /* |
| * Constructs a spanning tree with tight edges and adjusted the input node's |
| * ranks to achieve this. A tight edge is one that is has a length that matches |
| * its "minlen" attribute. |
| * |
| * The basic structure for this function is derived from Gansner, et al., "A |
| * Technique for Drawing Directed Graphs." |
| * |
| * Pre-conditions: |
| * |
| * 1. Graph must be a DAG. |
| * 2. Graph must be connected. |
| * 3. Graph must have at least one node. |
| * 5. Graph nodes must have been previously assigned a "rank" property that |
| * respects the "minlen" property of incident edges. |
| * 6. Graph edges must have a "minlen" property. |
| * |
| * Post-conditions: |
| * |
| * - Graph nodes will have their rank adjusted to ensure that all edges are |
| * tight. |
| * |
| * Returns a tree (undirected graph) that is constructed using only "tight" |
| * edges. |
| */ |
| function feasibleTree(g) { |
| var t = new Graph({ directed: false }); |
| |
| // Choose arbitrary node from which to start our tree |
| var start = g.nodes()[0], |
| size = g.nodeCount(); |
| t.setNode(start, {}); |
| |
| var edge, delta; |
| while (tightTree(t, g) < size) { |
| edge = findMinSlackEdge(t, g); |
| delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge); |
| shiftRanks(t, g, delta); |
| } |
| |
| return t; |
| } |
| |
| /* |
| * Finds a maximal tree of tight edges and returns the number of nodes in the |
| * tree. |
| */ |
| function tightTree(t, g) { |
| function dfs(v) { |
| _.forEach(g.nodeEdges(v), function(e) { |
| var edgeV = e.v, |
| w = (v === edgeV) ? e.w : edgeV; |
| if (!t.hasNode(w) && !slack(g, e)) { |
| t.setNode(w, {}); |
| t.setEdge(v, w, {}); |
| dfs(w); |
| } |
| }); |
| } |
| |
| _.forEach(t.nodes(), dfs); |
| return t.nodeCount(); |
| } |
| |
| /* |
| * Finds the edge with the smallest slack that is incident on tree and returns |
| * it. |
| */ |
| function findMinSlackEdge(t, g) { |
| return _.minBy(g.edges(), function(e) { |
| if (t.hasNode(e.v) !== t.hasNode(e.w)) { |
| return slack(g, e); |
| } |
| }); |
| } |
| |
| function shiftRanks(t, g, delta) { |
| _.forEach(t.nodes(), function(v) { |
| g.node(v).rank += delta; |
| }); |
| } |
| |
| },{'../graphlib':7,'../lodash':10,'./util':28}],26:[function(require,module,exports){ |
| 'use strict'; |
| |
| var rankUtil = require('./util'), |
| longestPath = rankUtil.longestPath, |
| feasibleTree = require('./feasible-tree'), |
| networkSimplex = require('./network-simplex'); |
| |
| module.exports = rank; |
| |
| /* |
| * Assigns a rank to each node in the input graph that respects the "minlen" |
| * constraint specified on edges between nodes. |
| * |
| * This basic structure is derived from Gansner, et al., "A Technique for |
| * Drawing Directed Graphs." |
| * |
| * Pre-conditions: |
| * |
| * 1. Graph must be a connected DAG |
| * 2. Graph nodes must be objects |
| * 3. Graph edges must have "weight" and "minlen" attributes |
| * |
| * Post-conditions: |
| * |
| * 1. Graph nodes will have a "rank" attribute based on the results of the |
| * algorithm. Ranks can start at any index (including negative), we'll |
| * fix them up later. |
| */ |
| function rank(g) { |
| switch(g.graph().ranker) { |
| case 'network-simplex': networkSimplexRanker(g); break; |
| case 'tight-tree': tightTreeRanker(g); break; |
| case 'longest-path': longestPathRanker(g); break; |
| default: networkSimplexRanker(g); |
| } |
| } |
| |
| // A fast and simple ranker, but results are far from optimal. |
| var longestPathRanker = longestPath; |
| |
| function tightTreeRanker(g) { |
| longestPath(g); |
| feasibleTree(g); |
| } |
| |
| function networkSimplexRanker(g) { |
| networkSimplex(g); |
| } |
| |
| },{'./feasible-tree':25,'./network-simplex':27,'./util':28}],27:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'), |
| feasibleTree = require('./feasible-tree'), |
| slack = require('./util').slack, |
| initRank = require('./util').longestPath, |
| preorder = require('../graphlib').alg.preorder, |
| postorder = require('../graphlib').alg.postorder, |
| simplify = require('../util').simplify; |
| |
| module.exports = networkSimplex; |
| |
| // Expose some internals for testing purposes |
| networkSimplex.initLowLimValues = initLowLimValues; |
| networkSimplex.initCutValues = initCutValues; |
| networkSimplex.calcCutValue = calcCutValue; |
| networkSimplex.leaveEdge = leaveEdge; |
| networkSimplex.enterEdge = enterEdge; |
| networkSimplex.exchangeEdges = exchangeEdges; |
| |
| /* |
| * The network simplex algorithm assigns ranks to each node in the input graph |
| * and iteratively improves the ranking to reduce the length of edges. |
| * |
| * Preconditions: |
| * |
| * 1. The input graph must be a DAG. |
| * 2. All nodes in the graph must have an object value. |
| * 3. All edges in the graph must have "minlen" and "weight" attributes. |
| * |
| * Postconditions: |
| * |
| * 1. All nodes in the graph will have an assigned "rank" attribute that has |
| * been optimized by the network simplex algorithm. Ranks start at 0. |
| * |
| * |
| * A rough sketch of the algorithm is as follows: |
| * |
| * 1. Assign initial ranks to each node. We use the longest path algorithm, |
| * which assigns ranks to the lowest position possible. In general this |
| * leads to very wide bottom ranks and unnecessarily long edges. |
| * 2. Construct a feasible tight tree. A tight tree is one such that all |
| * edges in the tree have no slack (difference between length of edge |
| * and minlen for the edge). This by itself greatly improves the assigned |
| * rankings by shorting edges. |
| * 3. Iteratively find edges that have negative cut values. Generally a |
| * negative cut value indicates that the edge could be removed and a new |
| * tree edge could be added to produce a more compact graph. |
| * |
| * Much of the algorithms here are derived from Gansner, et al., "A Technique |
| * for Drawing Directed Graphs." The structure of the file roughly follows the |
| * structure of the overall algorithm. |
| */ |
| function networkSimplex(g) { |
| g = simplify(g); |
| initRank(g); |
| var t = feasibleTree(g); |
| initLowLimValues(t); |
| initCutValues(t, g); |
| |
| var e, f; |
| while ((e = leaveEdge(t))) { |
| f = enterEdge(t, g, e); |
| exchangeEdges(t, g, e, f); |
| } |
| } |
| |
| /* |
| * Initializes cut values for all edges in the tree. |
| */ |
| function initCutValues(t, g) { |
| var vs = postorder(t, t.nodes()); |
| vs = vs.slice(0, vs.length - 1); |
| _.forEach(vs, function(v) { |
| assignCutValue(t, g, v); |
| }); |
| } |
| |
| function assignCutValue(t, g, child) { |
| var childLab = t.node(child), |
| parent = childLab.parent; |
| t.edge(child, parent).cutvalue = calcCutValue(t, g, child); |
| } |
| |
| /* |
| * Given the tight tree, its graph, and a child in the graph calculate and |
| * return the cut value for the edge between the child and its parent. |
| */ |
| function calcCutValue(t, g, child) { |
| var childLab = t.node(child), |
| parent = childLab.parent, |
| // True if the child is on the tail end of the edge in the directed graph |
| childIsTail = true, |
| // The graph's view of the tree edge we're inspecting |
| graphEdge = g.edge(child, parent), |
| // The accumulated cut value for the edge between this node and its parent |
| cutValue = 0; |
| |
| if (!graphEdge) { |
| childIsTail = false; |
| graphEdge = g.edge(parent, child); |
| } |
| |
| cutValue = graphEdge.weight; |
| |
| _.forEach(g.nodeEdges(child), function(e) { |
| var isOutEdge = e.v === child, |
| other = isOutEdge ? e.w : e.v; |
| |
| if (other !== parent) { |
| var pointsToHead = isOutEdge === childIsTail, |
| otherWeight = g.edge(e).weight; |
| |
| cutValue += pointsToHead ? otherWeight : -otherWeight; |
| if (isTreeEdge(t, child, other)) { |
| var otherCutValue = t.edge(child, other).cutvalue; |
| cutValue += pointsToHead ? -otherCutValue : otherCutValue; |
| } |
| } |
| }); |
| |
| return cutValue; |
| } |
| |
| function initLowLimValues(tree, root) { |
| if (arguments.length < 2) { |
| root = tree.nodes()[0]; |
| } |
| dfsAssignLowLim(tree, {}, 1, root); |
| } |
| |
| function dfsAssignLowLim(tree, visited, nextLim, v, parent) { |
| var low = nextLim, |
| label = tree.node(v); |
| |
| visited[v] = true; |
| _.forEach(tree.neighbors(v), function(w) { |
| if (!_.has(visited, w)) { |
| nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v); |
| } |
| }); |
| |
| label.low = low; |
| label.lim = nextLim++; |
| if (parent) { |
| label.parent = parent; |
| } else { |
| // TODO should be able to remove this when we incrementally update low lim |
| delete label.parent; |
| } |
| |
| return nextLim; |
| } |
| |
| function leaveEdge(tree) { |
| return _.find(tree.edges(), function(e) { |
| return tree.edge(e).cutvalue < 0; |
| }); |
| } |
| |
| function enterEdge(t, g, edge) { |
| var v = edge.v, |
| w = edge.w; |
| |
| // For the rest of this function we assume that v is the tail and w is the |
| // head, so if we don't have this edge in the graph we should flip it to |
| // match the correct orientation. |
| if (!g.hasEdge(v, w)) { |
| v = edge.w; |
| w = edge.v; |
| } |
| |
| var vLabel = t.node(v), |
| wLabel = t.node(w), |
| tailLabel = vLabel, |
| flip = false; |
| |
| // If the root is in the tail of the edge then we need to flip the logic that |
| // checks for the head and tail nodes in the candidates function below. |
| if (vLabel.lim > wLabel.lim) { |
| tailLabel = wLabel; |
| flip = true; |
| } |
| |
| var candidates = _.filter(g.edges(), function(edge) { |
| return flip === isDescendant(t, t.node(edge.v), tailLabel) && |
| flip !== isDescendant(t, t.node(edge.w), tailLabel); |
| }); |
| |
| return _.minBy(candidates, function(edge) { return slack(g, edge); }); |
| } |
| |
| function exchangeEdges(t, g, e, f) { |
| var v = e.v, |
| w = e.w; |
| t.removeEdge(v, w); |
| t.setEdge(f.v, f.w, {}); |
| initLowLimValues(t); |
| initCutValues(t, g); |
| updateRanks(t, g); |
| } |
| |
| function updateRanks(t, g) { |
| var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; }), |
| vs = preorder(t, root); |
| vs = vs.slice(1); |
| _.forEach(vs, function(v) { |
| var parent = t.node(v).parent, |
| edge = g.edge(v, parent), |
| flipped = false; |
| |
| if (!edge) { |
| edge = g.edge(parent, v); |
| flipped = true; |
| } |
| |
| g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen); |
| }); |
| } |
| |
| /* |
| * Returns true if the edge is in the tree. |
| */ |
| function isTreeEdge(tree, u, v) { |
| return tree.hasEdge(u, v); |
| } |
| |
| /* |
| * Returns true if the specified node is descendant of the root node per the |
| * assigned low and lim attributes in the tree. |
| */ |
| function isDescendant(tree, vLabel, rootLabel) { |
| return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim; |
| } |
| |
| },{'../graphlib':7,'../lodash':10,'../util':29,'./feasible-tree':25,'./util':28}],28:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('../lodash'); |
| |
| module.exports = { |
| longestPath: longestPath, |
| slack: slack |
| }; |
| |
| /* |
| * Initializes ranks for the input graph using the longest path algorithm. This |
| * algorithm scales well and is fast in practice, it yields rather poor |
| * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom |
| * ranks wide and leaving edges longer than necessary. However, due to its |
| * speed, this algorithm is good for getting an initial ranking that can be fed |
| * into other algorithms. |
| * |
| * This algorithm does not normalize layers because it will be used by other |
| * algorithms in most cases. If using this algorithm directly, be sure to |
| * run normalize at the end. |
| * |
| * Pre-conditions: |
| * |
| * 1. Input graph is a DAG. |
| * 2. Input graph node labels can be assigned properties. |
| * |
| * Post-conditions: |
| * |
| * 1. Each node will be assign an (unnormalized) "rank" property. |
| */ |
| function longestPath(g) { |
| var visited = {}; |
| |
| function dfs(v) { |
| var label = g.node(v); |
| if (_.has(visited, v)) { |
| return label.rank; |
| } |
| visited[v] = true; |
| |
| var rank = _.min(_.map(g.outEdges(v), function(e) { |
| return dfs(e.w) - g.edge(e).minlen; |
| })); |
| |
| if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3 |
| rank === undefined || // return value of _.map([]) for Lodash 4 |
| rank === null) { // return value of _.map([null]) |
| rank = 0; |
| } |
| |
| return (label.rank = rank); |
| } |
| |
| _.forEach(g.sources(), dfs); |
| } |
| |
| /* |
| * Returns the amount of slack for the given edge. The slack is defined as the |
| * difference between the length of the edge and its minimum length. |
| */ |
| function slack(g, e) { |
| return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen; |
| } |
| |
| },{'../lodash':10}],29:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'), |
| Graph = require('./graphlib').Graph; |
| |
| module.exports = { |
| addDummyNode: addDummyNode, |
| simplify: simplify, |
| asNonCompoundGraph: asNonCompoundGraph, |
| successorWeights: successorWeights, |
| predecessorWeights: predecessorWeights, |
| intersectRect: intersectRect, |
| buildLayerMatrix: buildLayerMatrix, |
| normalizeRanks: normalizeRanks, |
| removeEmptyRanks: removeEmptyRanks, |
| addBorderNode: addBorderNode, |
| maxRank: maxRank, |
| partition: partition, |
| time: time, |
| notime: notime |
| }; |
| |
| /* |
| * Adds a dummy node to the graph and return v. |
| */ |
| function addDummyNode(g, type, attrs, name) { |
| var v; |
| do { |
| v = _.uniqueId(name); |
| } while (g.hasNode(v)); |
| |
| attrs.dummy = type; |
| g.setNode(v, attrs); |
| return v; |
| } |
| |
| /* |
| * Returns a new graph with only simple edges. Handles aggregation of data |
| * associated with multi-edges. |
| */ |
| function simplify(g) { |
| var simplified = new Graph().setGraph(g.graph()); |
| _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); }); |
| _.forEach(g.edges(), function(e) { |
| var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 }, |
| label = g.edge(e); |
| simplified.setEdge(e.v, e.w, { |
| weight: simpleLabel.weight + label.weight, |
| minlen: Math.max(simpleLabel.minlen, label.minlen) |
| }); |
| }); |
| return simplified; |
| } |
| |
| function asNonCompoundGraph(g) { |
| var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph()); |
| _.forEach(g.nodes(), function(v) { |
| if (!g.children(v).length) { |
| simplified.setNode(v, g.node(v)); |
| } |
| }); |
| _.forEach(g.edges(), function(e) { |
| simplified.setEdge(e, g.edge(e)); |
| }); |
| return simplified; |
| } |
| |
| function successorWeights(g) { |
| var weightMap = _.map(g.nodes(), function(v) { |
| var sucs = {}; |
| _.forEach(g.outEdges(v), function(e) { |
| sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight; |
| }); |
| return sucs; |
| }); |
| return _.zipObject(g.nodes(), weightMap); |
| } |
| |
| function predecessorWeights(g) { |
| var weightMap = _.map(g.nodes(), function(v) { |
| var preds = {}; |
| _.forEach(g.inEdges(v), function(e) { |
| preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight; |
| }); |
| return preds; |
| }); |
| return _.zipObject(g.nodes(), weightMap); |
| } |
| |
| /* |
| * Finds where a line starting at point ({x, y}) would intersect a rectangle |
| * ({x, y, width, height}) if it were pointing at the rectangle's center. |
| */ |
| function intersectRect(rect, point) { |
| var x = rect.x; |
| var y = rect.y; |
| |
| // Rectangle intersection algorithm from: |
| // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes |
| var dx = point.x - x; |
| var dy = point.y - y; |
| var w = rect.width / 2; |
| var h = rect.height / 2; |
| |
| if (!dx && !dy) { |
| throw new Error('Not possible to find intersection inside of the rectangle'); |
| } |
| |
| var sx, sy; |
| if (Math.abs(dy) * w > Math.abs(dx) * h) { |
| // Intersection is top or bottom of rect. |
| if (dy < 0) { |
| h = -h; |
| } |
| sx = h * dx / dy; |
| sy = h; |
| } else { |
| // Intersection is left or right of rect. |
| if (dx < 0) { |
| w = -w; |
| } |
| sx = w; |
| sy = w * dy / dx; |
| } |
| |
| return { x: x + sx, y: y + sy }; |
| } |
| |
| /* |
| * Given a DAG with each node assigned "rank" and "order" properties, this |
| * function will produce a matrix with the ids of each node. |
| */ |
| function buildLayerMatrix(g) { |
| var layering = _.map(_.range(maxRank(g) + 1), function() { return []; }); |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v), |
| rank = node.rank; |
| if (!_.isUndefined(rank)) { |
| layering[rank][node.order] = v; |
| } |
| }); |
| return layering; |
| } |
| |
| /* |
| * Adjusts the ranks for all nodes in the graph such that all nodes v have |
| * rank(v) >= 0 and at least one node w has rank(w) = 0. |
| */ |
| function normalizeRanks(g) { |
| var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); |
| _.forEach(g.nodes(), function(v) { |
| var node = g.node(v); |
| if (_.has(node, 'rank')) { |
| node.rank -= min; |
| } |
| }); |
| } |
| |
| function removeEmptyRanks(g) { |
| // Ranks may not start at 0, so we need to offset them |
| var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; })); |
| |
| var layers = []; |
| _.forEach(g.nodes(), function(v) { |
| var rank = g.node(v).rank - offset; |
| if (!layers[rank]) { |
| layers[rank] = []; |
| } |
| layers[rank].push(v); |
| }); |
| |
| var delta = 0, |
| nodeRankFactor = g.graph().nodeRankFactor; |
| _.forEach(layers, function(vs, i) { |
| if (_.isUndefined(vs) && i % nodeRankFactor !== 0) { |
| --delta; |
| } else if (delta) { |
| _.forEach(vs, function(v) { g.node(v).rank += delta; }); |
| } |
| }); |
| } |
| |
| function addBorderNode(g, prefix, rank, order) { |
| var node = { |
| width: 0, |
| height: 0 |
| }; |
| if (arguments.length >= 4) { |
| node.rank = rank; |
| node.order = order; |
| } |
| return addDummyNode(g, 'border', node, prefix); |
| } |
| |
| function maxRank(g) { |
| return _.max(_.map(g.nodes(), function(v) { |
| var rank = g.node(v).rank; |
| if (!_.isUndefined(rank)) { |
| return rank; |
| } |
| })); |
| } |
| |
| /* |
| * Partition a collection into two groups: `lhs` and `rhs`. If the supplied |
| * function returns true for an entry it goes into `lhs`. Otherwise it goes |
| * into `rhs. |
| */ |
| function partition(collection, fn) { |
| var result = { lhs: [], rhs: [] }; |
| _.forEach(collection, function(value) { |
| if (fn(value)) { |
| result.lhs.push(value); |
| } else { |
| result.rhs.push(value); |
| } |
| }); |
| return result; |
| } |
| |
| /* |
| * Returns a new function that wraps `fn` with a timer. The wrapper logs the |
| * time it takes to execute the function. |
| */ |
| function time(name, fn) { |
| var start = _.now(); |
| try { |
| return fn(); |
| } finally { |
| console.log(name + ' time: ' + (_.now() - start) + 'ms'); |
| } |
| } |
| |
| function notime(name, fn) { |
| return fn(); |
| } |
| |
| },{'./graphlib':7,'./lodash':10}],30:[function(require,module,exports){ |
| module.exports = '0.8.4'; |
| |
| },{}],31:[function(require,module,exports){ |
| /** |
| * Copyright (c) 2014, Chris Pettitt |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3. Neither the name of the copyright holder nor the names of its contributors |
| * may be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| var lib = require('./lib'); |
| |
| module.exports = { |
| Graph: lib.Graph, |
| json: require('./lib/json'), |
| alg: require('./lib/alg'), |
| version: lib.version |
| }; |
| |
| },{'./lib':47,'./lib/alg':38,'./lib/json':48}],32:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = components; |
| |
| function components(g) { |
| var visited = {}, |
| cmpts = [], |
| cmpt; |
| |
| function dfs(v) { |
| if (_.has(visited, v)) return; |
| visited[v] = true; |
| cmpt.push(v); |
| _.each(g.successors(v), dfs); |
| _.each(g.predecessors(v), dfs); |
| } |
| |
| _.each(g.nodes(), function(v) { |
| cmpt = []; |
| dfs(v); |
| if (cmpt.length) { |
| cmpts.push(cmpt); |
| } |
| }); |
| |
| return cmpts; |
| } |
| |
| },{'../lodash':49}],33:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = dfs; |
| |
| /* |
| * A helper that preforms a pre- or post-order traversal on the input graph |
| * and returns the nodes in the order they were visited. If the graph is |
| * undirected then this algorithm will navigate using neighbors. If the graph |
| * is directed then this algorithm will navigate using successors. |
| * |
| * Order must be one of "pre" or "post". |
| */ |
| function dfs(g, vs, order) { |
| if (!_.isArray(vs)) { |
| vs = [vs]; |
| } |
| |
| var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g); |
| |
| var acc = [], |
| visited = {}; |
| _.each(vs, function(v) { |
| if (!g.hasNode(v)) { |
| throw new Error('Graph does not have node: ' + v); |
| } |
| |
| doDfs(g, v, order === 'post', visited, navigation, acc); |
| }); |
| return acc; |
| } |
| |
| function doDfs(g, v, postorder, visited, navigation, acc) { |
| if (!_.has(visited, v)) { |
| visited[v] = true; |
| |
| if (!postorder) { acc.push(v); } |
| _.each(navigation(v), function(w) { |
| doDfs(g, w, postorder, visited, navigation, acc); |
| }); |
| if (postorder) { acc.push(v); } |
| } |
| } |
| |
| },{'../lodash':49}],34:[function(require,module,exports){ |
| var dijkstra = require('./dijkstra'), |
| _ = require('../lodash'); |
| |
| module.exports = dijkstraAll; |
| |
| function dijkstraAll(g, weightFunc, edgeFunc) { |
| return _.transform(g.nodes(), function(acc, v) { |
| acc[v] = dijkstra(g, v, weightFunc, edgeFunc); |
| }, {}); |
| } |
| |
| },{'../lodash':49,'./dijkstra':35}],35:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| PriorityQueue = require('../data/priority-queue'); |
| |
| module.exports = dijkstra; |
| |
| var DEFAULT_WEIGHT_FUNC = _.constant(1); |
| |
| function dijkstra(g, source, weightFn, edgeFn) { |
| return runDijkstra(g, String(source), |
| weightFn || DEFAULT_WEIGHT_FUNC, |
| edgeFn || function(v) { return g.outEdges(v); }); |
| } |
| |
| function runDijkstra(g, source, weightFn, edgeFn) { |
| var results = {}, |
| pq = new PriorityQueue(), |
| v, vEntry; |
| |
| var updateNeighbors = function(edge) { |
| var w = edge.v !== v ? edge.v : edge.w, |
| wEntry = results[w], |
| weight = weightFn(edge), |
| distance = vEntry.distance + weight; |
| |
| if (weight < 0) { |
| throw new Error('dijkstra does not allow negative edge weights. ' + |
| 'Bad edge: ' + edge + ' Weight: ' + weight); |
| } |
| |
| if (distance < wEntry.distance) { |
| wEntry.distance = distance; |
| wEntry.predecessor = v; |
| pq.decrease(w, distance); |
| } |
| }; |
| |
| g.nodes().forEach(function(v) { |
| var distance = v === source ? 0 : Number.POSITIVE_INFINITY; |
| results[v] = { distance: distance }; |
| pq.add(v, distance); |
| }); |
| |
| while (pq.size() > 0) { |
| v = pq.removeMin(); |
| vEntry = results[v]; |
| if (vEntry.distance === Number.POSITIVE_INFINITY) { |
| break; |
| } |
| |
| edgeFn(v).forEach(updateNeighbors); |
| } |
| |
| return results; |
| } |
| |
| },{'../data/priority-queue':45,'../lodash':49}],36:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| tarjan = require('./tarjan'); |
| |
| module.exports = findCycles; |
| |
| function findCycles(g) { |
| return _.filter(tarjan(g), function(cmpt) { |
| return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0])); |
| }); |
| } |
| |
| },{'../lodash':49,'./tarjan':43}],37:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = floydWarshall; |
| |
| var DEFAULT_WEIGHT_FUNC = _.constant(1); |
| |
| function floydWarshall(g, weightFn, edgeFn) { |
| return runFloydWarshall(g, |
| weightFn || DEFAULT_WEIGHT_FUNC, |
| edgeFn || function(v) { return g.outEdges(v); }); |
| } |
| |
| function runFloydWarshall(g, weightFn, edgeFn) { |
| var results = {}, |
| nodes = g.nodes(); |
| |
| nodes.forEach(function(v) { |
| results[v] = {}; |
| results[v][v] = { distance: 0 }; |
| nodes.forEach(function(w) { |
| if (v !== w) { |
| results[v][w] = { distance: Number.POSITIVE_INFINITY }; |
| } |
| }); |
| edgeFn(v).forEach(function(edge) { |
| var w = edge.v === v ? edge.w : edge.v, |
| d = weightFn(edge); |
| results[v][w] = { distance: d, predecessor: v }; |
| }); |
| }); |
| |
| nodes.forEach(function(k) { |
| var rowK = results[k]; |
| nodes.forEach(function(i) { |
| var rowI = results[i]; |
| nodes.forEach(function(j) { |
| var ik = rowI[k]; |
| var kj = rowK[j]; |
| var ij = rowI[j]; |
| var altDistance = ik.distance + kj.distance; |
| if (altDistance < ij.distance) { |
| ij.distance = altDistance; |
| ij.predecessor = kj.predecessor; |
| } |
| }); |
| }); |
| }); |
| |
| return results; |
| } |
| |
| },{'../lodash':49}],38:[function(require,module,exports){ |
| module.exports = { |
| components: require('./components'), |
| dijkstra: require('./dijkstra'), |
| dijkstraAll: require('./dijkstra-all'), |
| findCycles: require('./find-cycles'), |
| floydWarshall: require('./floyd-warshall'), |
| isAcyclic: require('./is-acyclic'), |
| postorder: require('./postorder'), |
| preorder: require('./preorder'), |
| prim: require('./prim'), |
| tarjan: require('./tarjan'), |
| topsort: require('./topsort') |
| }; |
| |
| },{'./components':32,'./dijkstra':35,'./dijkstra-all':34,'./find-cycles':36,'./floyd-warshall':37,'./is-acyclic':39,'./postorder':40,'./preorder':41,'./prim':42,'./tarjan':43,'./topsort':44}],39:[function(require,module,exports){ |
| var topsort = require('./topsort'); |
| |
| module.exports = isAcyclic; |
| |
| function isAcyclic(g) { |
| try { |
| topsort(g); |
| } catch (e) { |
| if (e instanceof topsort.CycleException) { |
| return false; |
| } |
| throw e; |
| } |
| return true; |
| } |
| |
| },{'./topsort':44}],40:[function(require,module,exports){ |
| var dfs = require('./dfs'); |
| |
| module.exports = postorder; |
| |
| function postorder(g, vs) { |
| return dfs(g, vs, 'post'); |
| } |
| |
| },{'./dfs':33}],41:[function(require,module,exports){ |
| var dfs = require('./dfs'); |
| |
| module.exports = preorder; |
| |
| function preorder(g, vs) { |
| return dfs(g, vs, 'pre'); |
| } |
| |
| },{'./dfs':33}],42:[function(require,module,exports){ |
| var _ = require('../lodash'), |
| Graph = require('../graph'), |
| PriorityQueue = require('../data/priority-queue'); |
| |
| module.exports = prim; |
| |
| function prim(g, weightFunc) { |
| var result = new Graph(), |
| parents = {}, |
| pq = new PriorityQueue(), |
| v; |
| |
| function updateNeighbors(edge) { |
| var w = edge.v === v ? edge.w : edge.v, |
| pri = pq.priority(w); |
| if (pri !== undefined) { |
| var edgeWeight = weightFunc(edge); |
| if (edgeWeight < pri) { |
| parents[w] = v; |
| pq.decrease(w, edgeWeight); |
| } |
| } |
| } |
| |
| if (g.nodeCount() === 0) { |
| return result; |
| } |
| |
| _.each(g.nodes(), function(v) { |
| pq.add(v, Number.POSITIVE_INFINITY); |
| result.setNode(v); |
| }); |
| |
| // Start from an arbitrary node |
| pq.decrease(g.nodes()[0], 0); |
| |
| var init = false; |
| while (pq.size() > 0) { |
| v = pq.removeMin(); |
| if (_.has(parents, v)) { |
| result.setEdge(v, parents[v]); |
| } else if (init) { |
| throw new Error('Input graph is not connected: ' + g); |
| } else { |
| init = true; |
| } |
| |
| g.nodeEdges(v).forEach(updateNeighbors); |
| } |
| |
| return result; |
| } |
| |
| },{'../data/priority-queue':45,'../graph':46,'../lodash':49}],43:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = tarjan; |
| |
| function tarjan(g) { |
| var index = 0, |
| stack = [], |
| visited = {}, // node id -> { onStack, lowlink, index } |
| results = []; |
| |
| function dfs(v) { |
| var entry = visited[v] = { |
| onStack: true, |
| lowlink: index, |
| index: index++ |
| }; |
| stack.push(v); |
| |
| g.successors(v).forEach(function(w) { |
| if (!_.has(visited, w)) { |
| dfs(w); |
| entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink); |
| } else if (visited[w].onStack) { |
| entry.lowlink = Math.min(entry.lowlink, visited[w].index); |
| } |
| }); |
| |
| if (entry.lowlink === entry.index) { |
| var cmpt = [], |
| w; |
| do { |
| w = stack.pop(); |
| visited[w].onStack = false; |
| cmpt.push(w); |
| } while (v !== w); |
| results.push(cmpt); |
| } |
| } |
| |
| g.nodes().forEach(function(v) { |
| if (!_.has(visited, v)) { |
| dfs(v); |
| } |
| }); |
| |
| return results; |
| } |
| |
| },{'../lodash':49}],44:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = topsort; |
| topsort.CycleException = CycleException; |
| |
| function topsort(g) { |
| var visited = {}, |
| stack = {}, |
| results = []; |
| |
| function visit(node) { |
| if (_.has(stack, node)) { |
| throw new CycleException(); |
| } |
| |
| if (!_.has(visited, node)) { |
| stack[node] = true; |
| visited[node] = true; |
| _.each(g.predecessors(node), visit); |
| delete stack[node]; |
| results.push(node); |
| } |
| } |
| |
| _.each(g.sinks(), visit); |
| |
| if (_.size(visited) !== g.nodeCount()) { |
| throw new CycleException(); |
| } |
| |
| return results; |
| } |
| |
| function CycleException() {} |
| CycleException.prototype = new Error(); // must be an instance of Error to pass testing |
| },{'../lodash':49}],45:[function(require,module,exports){ |
| var _ = require('../lodash'); |
| |
| module.exports = PriorityQueue; |
| |
| /** |
| * A min-priority queue data structure. This algorithm is derived from Cormen, |
| * et al., "Introduction to Algorithms". The basic idea of a min-priority |
| * queue is that you can efficiently (in O(1) time) get the smallest key in |
| * the queue. Adding and removing elements takes O(log n) time. A key can |
| * have its priority decreased in O(log n) time. |
| */ |
| function PriorityQueue() { |
| this._arr = []; |
| this._keyIndices = {}; |
| } |
| |
| /** |
| * Returns the number of elements in the queue. Takes `O(1)` time. |
| */ |
| PriorityQueue.prototype.size = function() { |
| return this._arr.length; |
| }; |
| |
| /** |
| * Returns the keys that are in the queue. Takes `O(n)` time. |
| */ |
| PriorityQueue.prototype.keys = function() { |
| return this._arr.map(function(x) { return x.key; }); |
| }; |
| |
| /** |
| * Returns `true` if **key** is in the queue and `false` if not. |
| */ |
| PriorityQueue.prototype.has = function(key) { |
| return _.has(this._keyIndices, key); |
| }; |
| |
| /** |
| * Returns the priority for **key**. If **key** is not present in the queue |
| * then this function returns `undefined`. Takes `O(1)` time. |
| * |
| * @param {Object} key |
| */ |
| PriorityQueue.prototype.priority = function(key) { |
| var index = this._keyIndices[key]; |
| if (index !== undefined) { |
| return this._arr[index].priority; |
| } |
| }; |
| |
| /** |
| * Returns the key for the minimum element in this queue. If the queue is |
| * empty this function throws an Error. Takes `O(1)` time. |
| */ |
| PriorityQueue.prototype.min = function() { |
| if (this.size() === 0) { |
| throw new Error('Queue underflow'); |
| } |
| return this._arr[0].key; |
| }; |
| |
| /** |
| * Inserts a new key into the priority queue. If the key already exists in |
| * the queue this function returns `false`; otherwise it will return `true`. |
| * Takes `O(n)` time. |
| * |
| * @param {Object} key the key to add |
| * @param {Number} priority the initial priority for the key |
| */ |
| PriorityQueue.prototype.add = function(key, priority) { |
| var keyIndices = this._keyIndices; |
| key = String(key); |
| if (!_.has(keyIndices, key)) { |
| var arr = this._arr; |
| var index = arr.length; |
| keyIndices[key] = index; |
| arr.push({key: key, priority: priority}); |
| this._decrease(index); |
| return true; |
| } |
| return false; |
| }; |
| |
| /** |
| * Removes and returns the smallest key in the queue. Takes `O(log n)` time. |
| */ |
| PriorityQueue.prototype.removeMin = function() { |
| this._swap(0, this._arr.length - 1); |
| var min = this._arr.pop(); |
| delete this._keyIndices[min.key]; |
| this._heapify(0); |
| return min.key; |
| }; |
| |
| /** |
| * Decreases the priority for **key** to **priority**. If the new priority is |
| * greater than the previous priority, this function will throw an Error. |
| * |
| * @param {Object} key the key for which to raise priority |
| * @param {Number} priority the new priority for the key |
| */ |
| PriorityQueue.prototype.decrease = function(key, priority) { |
| var index = this._keyIndices[key]; |
| if (priority > this._arr[index].priority) { |
| throw new Error('New priority is greater than current priority. ' + |
| 'Key: ' + key + ' Old: ' + this._arr[index].priority + ' New: ' + priority); |
| } |
| this._arr[index].priority = priority; |
| this._decrease(index); |
| }; |
| |
| PriorityQueue.prototype._heapify = function(i) { |
| var arr = this._arr; |
| var l = 2 * i, |
| r = l + 1, |
| largest = i; |
| if (l < arr.length) { |
| largest = arr[l].priority < arr[largest].priority ? l : largest; |
| if (r < arr.length) { |
| largest = arr[r].priority < arr[largest].priority ? r : largest; |
| } |
| if (largest !== i) { |
| this._swap(i, largest); |
| this._heapify(largest); |
| } |
| } |
| }; |
| |
| PriorityQueue.prototype._decrease = function(index) { |
| var arr = this._arr; |
| var priority = arr[index].priority; |
| var parent; |
| while (index !== 0) { |
| parent = index >> 1; |
| if (arr[parent].priority < priority) { |
| break; |
| } |
| this._swap(index, parent); |
| index = parent; |
| } |
| }; |
| |
| PriorityQueue.prototype._swap = function(i, j) { |
| var arr = this._arr; |
| var keyIndices = this._keyIndices; |
| var origArrI = arr[i]; |
| var origArrJ = arr[j]; |
| arr[i] = origArrJ; |
| arr[j] = origArrI; |
| keyIndices[origArrJ.key] = i; |
| keyIndices[origArrI.key] = j; |
| }; |
| |
| },{'../lodash':49}],46:[function(require,module,exports){ |
| 'use strict'; |
| |
| var _ = require('./lodash'); |
| |
| module.exports = Graph; |
| |
| var DEFAULT_EDGE_NAME = '\x00', |
| GRAPH_NODE = '\x00', |
| EDGE_KEY_DELIM = '\x01'; |
| |
| // Implementation notes: |
| // |
| // * Node id query functions should return string ids for the nodes |
| // * Edge id query functions should return an "edgeObj", edge object, that is |
| // composed of enough information to uniquely identify an edge: {v, w, name}. |
| // * Internally we use an "edgeId", a stringified form of the edgeObj, to |
| // reference edges. This is because we need a performant way to look these |
| // edges up and, object properties, which have string keys, are the closest |
| // we're going to get to a performant hashtable in JavaScript. |
| |
| function Graph(opts) { |
| this._isDirected = _.has(opts, 'directed') ? opts.directed : true; |
| this._isMultigraph = _.has(opts, 'multigraph') ? opts.multigraph : false; |
| this._isCompound = _.has(opts, 'compound') ? opts.compound : false; |
| |
| // Label for the graph itself |
| this._label = undefined; |
| |
| // Defaults to be set when creating a new node |
| this._defaultNodeLabelFn = _.constant(undefined); |
| |
| // Defaults to be set when creating a new edge |
| this._defaultEdgeLabelFn = _.constant(undefined); |
| |
| // v -> label |
| this._nodes = {}; |
| |
| if (this._isCompound) { |
| // v -> parent |
| this._parent = {}; |
| |
| // v -> children |
| this._children = {}; |
| this._children[GRAPH_NODE] = {}; |
| } |
| |
| // v -> edgeObj |
| this._in = {}; |
| |
| // u -> v -> Number |
| this._preds = {}; |
| |
| // v -> edgeObj |
| this._out = {}; |
| |
| // v -> w -> Number |
| this._sucs = {}; |
| |
| // e -> edgeObj |
| this._edgeObjs = {}; |
| |
| // e -> label |
| this._edgeLabels = {}; |
| } |
| |
| /* Number of nodes in the graph. Should only be changed by the implementation. */ |
| Graph.prototype._nodeCount = 0; |
| |
| /* Number of edges in the graph. Should only be changed by the implementation. */ |
| Graph.prototype._edgeCount = 0; |
| |
| |
| /* === Graph functions ========= */ |
| |
| Graph.prototype.isDirected = function() { |
| return this._isDirected; |
| }; |
| |
| Graph.prototype.isMultigraph = function() { |
| return this._isMultigraph; |
| }; |
| |
| Graph.prototype.isCompound = function() { |
| return this._isCompound; |
| }; |
| |
| Graph.prototype.setGraph = function(label) { |
| this._label = label; |
| return this; |
| }; |
| |
| Graph.prototype.graph = function() { |
| return this._label; |
| }; |
| |
| |
| /* === Node functions ========== */ |
| |
| Graph.prototype.setDefaultNodeLabel = function(newDefault) { |
| if (!_.isFunction(newDefault)) { |
| newDefault = _.constant(newDefault); |
| } |
| this._defaultNodeLabelFn = newDefault; |
| return this; |
| }; |
| |
| Graph.prototype.nodeCount = function() { |
| return this._nodeCount; |
| }; |
| |
| Graph.prototype.nodes = function() { |
| return _.keys(this._nodes); |
| }; |
| |
| Graph.prototype.sources = function() { |
| var self = this; |
| return _.filter(this.nodes(), function(v) { |
| return _.isEmpty(self._in[v]); |
| }); |
| }; |
| |
| Graph.prototype.sinks = function() { |
| var self = this; |
| return _.filter(this.nodes(), function(v) { |
| return _.isEmpty(self._out[v]); |
| }); |
| }; |
| |
| Graph.prototype.setNodes = function(vs, value) { |
| var args = arguments; |
| var self = this; |
| _.each(vs, function(v) { |
| if (args.length > 1) { |
| self.setNode(v, value); |
| } else { |
| self.setNode(v); |
| } |
| }); |
| return this; |
| }; |
| |
| Graph.prototype.setNode = function(v, value) { |
| if (_.has(this._nodes, v)) { |
| if (arguments.length > 1) { |
| this._nodes[v] = value; |
| } |
| return this; |
| } |
| |
| this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v); |
| if (this._isCompound) { |
| this._parent[v] = GRAPH_NODE; |
| this._children[v] = {}; |
| this._children[GRAPH_NODE][v] = true; |
| } |
| this._in[v] = {}; |
| this._preds[v] = {}; |
| this._out[v] = {}; |
| this._sucs[v] = {}; |
| ++this._nodeCount; |
| return this; |
| }; |
| |
| Graph.prototype.node = function(v) { |
| return this._nodes[v]; |
| }; |
| |
| Graph.prototype.hasNode = function(v) { |
| return _.has(this._nodes, v); |
| }; |
| |
| Graph.prototype.removeNode = function(v) { |
| var self = this; |
| if (_.has(this._nodes, v)) { |
| var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); }; |
| delete this._nodes[v]; |
| if (this._isCompound) { |
| this._removeFromParentsChildList(v); |
| delete this._parent[v]; |
| _.each(this.children(v), function(child) { |
| self.setParent(child); |
| }); |
| delete this._children[v]; |
| } |
| _.each(_.keys(this._in[v]), removeEdge); |
| delete this._in[v]; |
| delete this._preds[v]; |
| _.each(_.keys(this._out[v]), removeEdge); |
| delete this._out[v]; |
| delete this._sucs[v]; |
| --this._nodeCount; |
| } |
| return this; |
| }; |
| |
| Graph.prototype.setParent = function(v, parent) { |
| if (!this._isCompound) { |
| throw new Error('Cannot set parent in a non-compound graph'); |
| } |
| |
| if (_.isUndefined(parent)) { |
| parent = GRAPH_NODE; |
| } else { |
| // Coerce parent to string |
| parent += ''; |
| for (var ancestor = parent; |
| !_.isUndefined(ancestor); |
| ancestor = this.parent(ancestor)) { |
| if (ancestor === v) { |
| throw new Error('Setting ' + parent+ ' as parent of ' + v + |
| ' would create a cycle'); |
| } |
| } |
| |
| this.setNode(parent); |
| } |
| |
| this.setNode(v); |
| this._removeFromParentsChildList(v); |
| this._parent[v] = parent; |
| this._children[parent][v] = true; |
| return this; |
| }; |
| |
| Graph.prototype._removeFromParentsChildList = function(v) { |
| delete this._children[this._parent[v]][v]; |
| }; |
| |
| Graph.prototype.parent = function(v) { |
| if (this._isCompound) { |
| var parent = this._parent[v]; |
| if (parent !== GRAPH_NODE) { |
| return parent; |
| } |
| } |
| }; |
| |
| Graph.prototype.children = function(v) { |
| if (_.isUndefined(v)) { |
| v = GRAPH_NODE; |
| } |
| |
| if (this._isCompound) { |
| var children = this._children[v]; |
| if (children) { |
| return _.keys(children); |
| } |
| } else if (v === GRAPH_NODE) { |
| return this.nodes(); |
| } else if (this.hasNode(v)) { |
| return []; |
| } |
| }; |
| |
| Graph.prototype.predecessors = function(v) { |
| var predsV = this._preds[v]; |
| if (predsV) { |
| return _.keys(predsV); |
| } |
| }; |
| |
| Graph.prototype.successors = function(v) { |
| var sucsV = this._sucs[v]; |
| if (sucsV) { |
| return _.keys(sucsV); |
| } |
| }; |
| |
| Graph.prototype.neighbors = function(v) { |
| var preds = this.predecessors(v); |
| if (preds) { |
| return _.union(preds, this.successors(v)); |
| } |
| }; |
| |
| Graph.prototype.isLeaf = function (v) { |
| var neighbors; |
| if (this.isDirected()) { |
| neighbors = this.successors(v); |
| } else { |
| neighbors = this.neighbors(v); |
| } |
| return neighbors.length === 0; |
| }; |
| |
| Graph.prototype.filterNodes = function(filter) { |
| var copy = new this.constructor({ |
| directed: this._isDirected, |
| multigraph: this._isMultigraph, |
| compound: this._isCompound |
| }); |
| |
| copy.setGraph(this.graph()); |
| |
| var self = this; |
| _.each(this._nodes, function(value, v) { |
| if (filter(v)) { |
| copy.setNode(v, value); |
| } |
| }); |
| |
| _.each(this._edgeObjs, function(e) { |
| if (copy.hasNode(e.v) && copy.hasNode(e.w)) { |
| copy.setEdge(e, self.edge(e)); |
| } |
| }); |
| |
| var parents = {}; |
| function findParent(v) { |
| var parent = self.parent(v); |
| if (parent === undefined || copy.hasNode(parent)) { |
| parents[v] = parent; |
| return parent; |
| } else if (parent in parents) { |
| return parents[parent]; |
| } else { |
| return findParent(parent); |
| } |
| } |
| |
| if (this._isCompound) { |
| _.each(copy.nodes(), function(v) { |
| copy.setParent(v, findParent(v)); |
| }); |
| } |
| |
| return copy; |
| }; |
| |
| /* === Edge functions ========== */ |
| |
| Graph.prototype.setDefaultEdgeLabel = function(newDefault) { |
| if (!_.isFunction(newDefault)) { |
| newDefault = _.constant(newDefault); |
| } |
| this._defaultEdgeLabelFn = newDefault; |
| return this; |
| }; |
| |
| Graph.prototype.edgeCount = function() { |
| return this._edgeCount; |
| }; |
| |
| Graph.prototype.edges = function() { |
| return _.values(this._edgeObjs); |
| }; |
| |
| Graph.prototype.setPath = function(vs, value) { |
| var self = this, |
| args = arguments; |
| _.reduce(vs, function(v, w) { |
| if (args.length > 1) { |
| self.setEdge(v, w, value); |
| } else { |
| self.setEdge(v, w); |
| } |
| return w; |
| }); |
| return this; |
| }; |
| |
| /* |
| * setEdge(v, w, [value, [name]]) |
| * setEdge({ v, w, [name] }, [value]) |
| */ |
| Graph.prototype.setEdge = function() { |
| var v, w, name, value, |
| valueSpecified = false, |
| arg0 = arguments[0]; |
| |
| if (typeof arg0 === 'object' && arg0 !== null && 'v' in arg0) { |
| v = arg0.v; |
| w = arg0.w; |
| name = arg0.name; |
| if (arguments.length === 2) { |
| value = arguments[1]; |
| valueSpecified = true; |
| } |
| } else { |
| v = arg0; |
| w = arguments[1]; |
| name = arguments[3]; |
| if (arguments.length > 2) { |
| value = arguments[2]; |
| valueSpecified = true; |
| } |
| } |
| |
| v = '' + v; |
| w = '' + w; |
| if (!_.isUndefined(name)) { |
| name = '' + name; |
| } |
| |
| var e = edgeArgsToId(this._isDirected, v, w, name); |
| if (_.has(this._edgeLabels, e)) { |
| if (valueSpecified) { |
| this._edgeLabels[e] = value; |
| } |
| return this; |
| } |
| |
| if (!_.isUndefined(name) && !this._isMultigraph) { |
| throw new Error('Cannot set a named edge when isMultigraph = false'); |
| } |
| |
| // It didn't exist, so we need to create it. |
| // First ensure the nodes exist. |
| this.setNode(v); |
| this.setNode(w); |
| |
| this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name); |
| |
| var edgeObj = edgeArgsToObj(this._isDirected, v, w, name); |
| // Ensure we add undirected edges in a consistent way. |
| v = edgeObj.v; |
| w = edgeObj.w; |
| |
| Object.freeze(edgeObj); |
| this._edgeObjs[e] = edgeObj; |
| incrementOrInitEntry(this._preds[w], v); |
| incrementOrInitEntry(this._sucs[v], w); |
| this._in[w][e] = edgeObj; |
| this._out[v][e] = edgeObj; |
| this._edgeCount++; |
| return this; |
| }; |
| |
| Graph.prototype.edge = function(v, w, name) { |
| var e = (arguments.length === 1 |
| ? edgeObjToId(this._isDirected, arguments[0]) |
| : edgeArgsToId(this._isDirected, v, w, name)); |
| return this._edgeLabels[e]; |
| }; |
| |
| Graph.prototype.hasEdge = function(v, w, name) { |
| var e = (arguments.length === 1 |
| ? edgeObjToId(this._isDirected, arguments[0]) |
| : edgeArgsToId(this._isDirected, v, w, name)); |
| return _.has(this._edgeLabels, e); |
| }; |
| |
| Graph.prototype.removeEdge = function(v, w, name) { |
| var e = (arguments.length === 1 |
| ? edgeObjToId(this._isDirected, arguments[0]) |
| : edgeArgsToId(this._isDirected, v, w, name)), |
| edge = this._edgeObjs[e]; |
| if (edge) { |
| v = edge.v; |
| w = edge.w; |
| delete this._edgeLabels[e]; |
| delete this._edgeObjs[e]; |
| decrementOrRemoveEntry(this._preds[w], v); |
| decrementOrRemoveEntry(this._sucs[v], w); |
| delete this._in[w][e]; |
| delete this._out[v][e]; |
| this._edgeCount--; |
| } |
| return this; |
| }; |
| |
| Graph.prototype.inEdges = function(v, u) { |
| var inV = this._in[v]; |
| if (inV) { |
| var edges = _.values(inV); |
| if (!u) { |
| return edges; |
| } |
| return _.filter(edges, function(edge) { return edge.v === u; }); |
| } |
| }; |
| |
| Graph.prototype.outEdges = function(v, w) { |
| var outV = this._out[v]; |
| if (outV) { |
| var edges = _.values(outV); |
| if (!w) { |
| return edges; |
| } |
| return _.filter(edges, function(edge) { return edge.w === w; }); |
| } |
| }; |
| |
| Graph.prototype.nodeEdges = function(v, w) { |
| var inEdges = this.inEdges(v, w); |
| if (inEdges) { |
| return inEdges.concat(this.outEdges(v, w)); |
| } |
| }; |
| |
| function incrementOrInitEntry(map, k) { |
| if (map[k]) { |
| map[k]++; |
| } else { |
| map[k] = 1; |
| } |
| } |
| |
| function decrementOrRemoveEntry(map, k) { |
| if (!--map[k]) { delete map[k]; } |
| } |
| |
| function edgeArgsToId(isDirected, v_, w_, name) { |
| var v = '' + v_; |
| var w = '' + w_; |
| if (!isDirected && v > w) { |
| var tmp = v; |
| v = w; |
| w = tmp; |
| } |
| return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + |
| (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name); |
| } |
| |
| function edgeArgsToObj(isDirected, v_, w_, name) { |
| var v = '' + v_; |
| var w = '' + w_; |
| if (!isDirected && v > w) { |
| var tmp = v; |
| v = w; |
| w = tmp; |
| } |
| var edgeObj = { v: v, w: w }; |
| if (name) { |
| edgeObj.name = name; |
| } |
| return edgeObj; |
| } |
| |
| function edgeObjToId(isDirected, edgeObj) { |
| return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name); |
| } |
| |
| },{'./lodash':49}],47:[function(require,module,exports){ |
| // Includes only the "core" of graphlib |
| module.exports = { |
| Graph: require('./graph'), |
| version: require('./version') |
| }; |
| |
| },{'./graph':46,'./version':50}],48:[function(require,module,exports){ |
| var _ = require('./lodash'), |
| Graph = require('./graph'); |
| |
| module.exports = { |
| write: write, |
| read: read |
| }; |
| |
| function write(g) { |
| var json = { |
| options: { |
| directed: g.isDirected(), |
| multigraph: g.isMultigraph(), |
| compound: g.isCompound() |
| }, |
| nodes: writeNodes(g), |
| edges: writeEdges(g) |
| }; |
| if (!_.isUndefined(g.graph())) { |
| json.value = _.clone(g.graph()); |
| } |
| return json; |
| } |
| |
| function writeNodes(g) { |
| return _.map(g.nodes(), function(v) { |
| var nodeValue = g.node(v), |
| parent = g.parent(v), |
| node = { v: v }; |
| if (!_.isUndefined(nodeValue)) { |
| node.value = nodeValue; |
| } |
| if (!_.isUndefined(parent)) { |
| node.parent = parent; |
| } |
| return node; |
| }); |
| } |
| |
| function writeEdges(g) { |
| return _.map(g.edges(), function(e) { |
| var edgeValue = g.edge(e), |
| edge = { v: e.v, w: e.w }; |
| if (!_.isUndefined(e.name)) { |
| edge.name = e.name; |
| } |
| if (!_.isUndefined(edgeValue)) { |
| edge.value = edgeValue; |
| } |
| return edge; |
| }); |
| } |
| |
| function read(json) { |
| var g = new Graph(json.options).setGraph(json.value); |
| _.each(json.nodes, function(entry) { |
| g.setNode(entry.v, entry.value); |
| if (entry.parent) { |
| g.setParent(entry.v, entry.parent); |
| } |
| }); |
| _.each(json.edges, function(entry) { |
| g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value); |
| }); |
| return g; |
| } |
| |
| },{'./graph':46,'./lodash':49}],49:[function(require,module,exports){ |
| /* global window */ |
| |
| var lodash; |
| |
| if (typeof require === 'function') { |
| try { |
| lodash = { |
| clone: require('lodash/clone'), |
| constant: require('lodash/constant'), |
| each: require('lodash/each'), |
| filter: require('lodash/filter'), |
| has: require('lodash/has'), |
| isArray: require('lodash/isArray'), |
| isEmpty: require('lodash/isEmpty'), |
| isFunction: require('lodash/isFunction'), |
| isUndefined: require('lodash/isUndefined'), |
| keys: require('lodash/keys'), |
| map: require('lodash/map'), |
| reduce: require('lodash/reduce'), |
| size: require('lodash/size'), |
| transform: require('lodash/transform'), |
| union: require('lodash/union'), |
| values: require('lodash/values') |
| }; |
| } catch (e) {} |
| } |
| |
| if (!lodash) { |
| lodash = window._; |
| } |
| |
| module.exports = lodash; |
| |
| },{'lodash/clone':226,'lodash/constant':228,'lodash/each':230,'lodash/filter':232,'lodash/has':239,'lodash/isArray':243,'lodash/isEmpty':247,'lodash/isFunction':248,'lodash/isUndefined':258,'lodash/keys':259,'lodash/map':262,'lodash/reduce':274,'lodash/size':275,'lodash/transform':284,'lodash/union':285,'lodash/values':287}],50:[function(require,module,exports){ |
| module.exports = '2.1.7'; |
| |
| },{}],51:[function(require,module,exports){ |
| var getNative = require('./_getNative'), |
| root = require('./_root'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var DataView = getNative(root, 'DataView'); |
| |
| module.exports = DataView; |
| |
| },{'./_getNative':163,'./_root':208}],52:[function(require,module,exports){ |
| var hashClear = require('./_hashClear'), |
| hashDelete = require('./_hashDelete'), |
| hashGet = require('./_hashGet'), |
| hashHas = require('./_hashHas'), |
| hashSet = require('./_hashSet'); |
| |
| /** |
| * Creates a hash object. |
| * |
| * @private |
| * @constructor |
| * @param {Array} [entries] The key-value pairs to cache. |
| */ |
| function Hash(entries) { |
| var index = -1, |
| length = entries == null ? 0 : entries.length; |
| |
| this.clear(); |
| while (++index < length) { |
| var entry = entries[index]; |
| this.set(entry[0], entry[1]); |
| } |
| } |
| |
| // Add methods to `Hash`. |
| Hash.prototype.clear = hashClear; |
| Hash.prototype['delete'] = hashDelete; |
| Hash.prototype.get = hashGet; |
| Hash.prototype.has = hashHas; |
| Hash.prototype.set = hashSet; |
| |
| module.exports = Hash; |
| |
| },{'./_hashClear':172,'./_hashDelete':173,'./_hashGet':174,'./_hashHas':175,'./_hashSet':176}],53:[function(require,module,exports){ |
| var listCacheClear = require('./_listCacheClear'), |
| listCacheDelete = require('./_listCacheDelete'), |
| listCacheGet = require('./_listCacheGet'), |
| listCacheHas = require('./_listCacheHas'), |
| listCacheSet = require('./_listCacheSet'); |
| |
| /** |
| * Creates an list cache object. |
| * |
| * @private |
| * @constructor |
| * @param {Array} [entries] The key-value pairs to cache. |
| */ |
| function ListCache(entries) { |
| var index = -1, |
| length = entries == null ? 0 : entries.length; |
| |
| this.clear(); |
| while (++index < length) { |
| var entry = entries[index]; |
| this.set(entry[0], entry[1]); |
| } |
| } |
| |
| // Add methods to `ListCache`. |
| ListCache.prototype.clear = listCacheClear; |
| ListCache.prototype['delete'] = listCacheDelete; |
| ListCache.prototype.get = listCacheGet; |
| ListCache.prototype.has = listCacheHas; |
| ListCache.prototype.set = listCacheSet; |
| |
| module.exports = ListCache; |
| |
| },{'./_listCacheClear':188,'./_listCacheDelete':189,'./_listCacheGet':190,'./_listCacheHas':191,'./_listCacheSet':192}],54:[function(require,module,exports){ |
| var getNative = require('./_getNative'), |
| root = require('./_root'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var Map = getNative(root, 'Map'); |
| |
| module.exports = Map; |
| |
| },{'./_getNative':163,'./_root':208}],55:[function(require,module,exports){ |
| var mapCacheClear = require('./_mapCacheClear'), |
| mapCacheDelete = require('./_mapCacheDelete'), |
| mapCacheGet = require('./_mapCacheGet'), |
| mapCacheHas = require('./_mapCacheHas'), |
| mapCacheSet = require('./_mapCacheSet'); |
| |
| /** |
| * Creates a map cache object to store key-value pairs. |
| * |
| * @private |
| * @constructor |
| * @param {Array} [entries] The key-value pairs to cache. |
| */ |
| function MapCache(entries) { |
| var index = -1, |
| length = entries == null ? 0 : entries.length; |
| |
| this.clear(); |
| while (++index < length) { |
| var entry = entries[index]; |
| this.set(entry[0], entry[1]); |
| } |
| } |
| |
| // Add methods to `MapCache`. |
| MapCache.prototype.clear = mapCacheClear; |
| MapCache.prototype['delete'] = mapCacheDelete; |
| MapCache.prototype.get = mapCacheGet; |
| MapCache.prototype.has = mapCacheHas; |
| MapCache.prototype.set = mapCacheSet; |
| |
| module.exports = MapCache; |
| |
| },{'./_mapCacheClear':193,'./_mapCacheDelete':194,'./_mapCacheGet':195,'./_mapCacheHas':196,'./_mapCacheSet':197}],56:[function(require,module,exports){ |
| var getNative = require('./_getNative'), |
| root = require('./_root'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var Promise = getNative(root, 'Promise'); |
| |
| module.exports = Promise; |
| |
| },{'./_getNative':163,'./_root':208}],57:[function(require,module,exports){ |
| var getNative = require('./_getNative'), |
| root = require('./_root'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var Set = getNative(root, 'Set'); |
| |
| module.exports = Set; |
| |
| },{'./_getNative':163,'./_root':208}],58:[function(require,module,exports){ |
| var MapCache = require('./_MapCache'), |
| setCacheAdd = require('./_setCacheAdd'), |
| setCacheHas = require('./_setCacheHas'); |
| |
| /** |
| * |
| * Creates an array cache object to store unique values. |
| * |
| * @private |
| * @constructor |
| * @param {Array} [values] The values to cache. |
| */ |
| function SetCache(values) { |
| var index = -1, |
| length = values == null ? 0 : values.length; |
| |
| this.__data__ = new MapCache; |
| while (++index < length) { |
| this.add(values[index]); |
| } |
| } |
| |
| // Add methods to `SetCache`. |
| SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; |
| SetCache.prototype.has = setCacheHas; |
| |
| module.exports = SetCache; |
| |
| },{'./_MapCache':55,'./_setCacheAdd':210,'./_setCacheHas':211}],59:[function(require,module,exports){ |
| var ListCache = require('./_ListCache'), |
| stackClear = require('./_stackClear'), |
| stackDelete = require('./_stackDelete'), |
| stackGet = require('./_stackGet'), |
| stackHas = require('./_stackHas'), |
| stackSet = require('./_stackSet'); |
| |
| /** |
| * Creates a stack cache object to store key-value pairs. |
| * |
| * @private |
| * @constructor |
| * @param {Array} [entries] The key-value pairs to cache. |
| */ |
| function Stack(entries) { |
| var data = this.__data__ = new ListCache(entries); |
| this.size = data.size; |
| } |
| |
| // Add methods to `Stack`. |
| Stack.prototype.clear = stackClear; |
| Stack.prototype['delete'] = stackDelete; |
| Stack.prototype.get = stackGet; |
| Stack.prototype.has = stackHas; |
| Stack.prototype.set = stackSet; |
| |
| module.exports = Stack; |
| |
| },{'./_ListCache':53,'./_stackClear':215,'./_stackDelete':216,'./_stackGet':217,'./_stackHas':218,'./_stackSet':219}],60:[function(require,module,exports){ |
| var root = require('./_root'); |
| |
| /** Built-in value references. */ |
| var Symbol = root.Symbol; |
| |
| module.exports = Symbol; |
| |
| },{'./_root':208}],61:[function(require,module,exports){ |
| var root = require('./_root'); |
| |
| /** Built-in value references. */ |
| var Uint8Array = root.Uint8Array; |
| |
| module.exports = Uint8Array; |
| |
| },{'./_root':208}],62:[function(require,module,exports){ |
| var getNative = require('./_getNative'), |
| root = require('./_root'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var WeakMap = getNative(root, 'WeakMap'); |
| |
| module.exports = WeakMap; |
| |
| },{'./_getNative':163,'./_root':208}],63:[function(require,module,exports){ |
| /** |
| * A faster alternative to `Function#apply`, this function invokes `func` |
| * with the `this` binding of `thisArg` and the arguments of `args`. |
| * |
| * @private |
| * @param {Function} func The function to invoke. |
| * @param {*} thisArg The `this` binding of `func`. |
| * @param {Array} args The arguments to invoke `func` with. |
| * @returns {*} Returns the result of `func`. |
| */ |
| function apply(func, thisArg, args) { |
| switch (args.length) { |
| case 0: return func.call(thisArg); |
| case 1: return func.call(thisArg, args[0]); |
| case 2: return func.call(thisArg, args[0], args[1]); |
| case 3: return func.call(thisArg, args[0], args[1], args[2]); |
| } |
| return func.apply(thisArg, args); |
| } |
| |
| module.exports = apply; |
| |
| },{}],64:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.forEach` for arrays without support for |
| * iteratee shorthands. |
| * |
| * @private |
| * @param {Array} [array] The array to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Array} Returns `array`. |
| */ |
| function arrayEach(array, iteratee) { |
| var index = -1, |
| length = array == null ? 0 : array.length; |
| |
| while (++index < length) { |
| if (iteratee(array[index], index, array) === false) { |
| break; |
| } |
| } |
| return array; |
| } |
| |
| module.exports = arrayEach; |
| |
| },{}],65:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.filter` for arrays without support for |
| * iteratee shorthands. |
| * |
| * @private |
| * @param {Array} [array] The array to iterate over. |
| * @param {Function} predicate The function invoked per iteration. |
| * @returns {Array} Returns the new filtered array. |
| */ |
| function arrayFilter(array, predicate) { |
| var index = -1, |
| length = array == null ? 0 : array.length, |
| resIndex = 0, |
| result = []; |
| |
| while (++index < length) { |
| var value = array[index]; |
| if (predicate(value, index, array)) { |
| result[resIndex++] = value; |
| } |
| } |
| return result; |
| } |
| |
| module.exports = arrayFilter; |
| |
| },{}],66:[function(require,module,exports){ |
| var baseIndexOf = require('./_baseIndexOf'); |
| |
| /** |
| * A specialized version of `_.includes` for arrays without support for |
| * specifying an index to search from. |
| * |
| * @private |
| * @param {Array} [array] The array to inspect. |
| * @param {*} target The value to search for. |
| * @returns {boolean} Returns `true` if `target` is found, else `false`. |
| */ |
| function arrayIncludes(array, value) { |
| var length = array == null ? 0 : array.length; |
| return !!length && baseIndexOf(array, value, 0) > -1; |
| } |
| |
| module.exports = arrayIncludes; |
| |
| },{'./_baseIndexOf':95}],67:[function(require,module,exports){ |
| /** |
| * This function is like `arrayIncludes` except that it accepts a comparator. |
| * |
| * @private |
| * @param {Array} [array] The array to inspect. |
| * @param {*} target The value to search for. |
| * @param {Function} comparator The comparator invoked per element. |
| * @returns {boolean} Returns `true` if `target` is found, else `false`. |
| */ |
| function arrayIncludesWith(array, value, comparator) { |
| var index = -1, |
| length = array == null ? 0 : array.length; |
| |
| while (++index < length) { |
| if (comparator(value, array[index])) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| module.exports = arrayIncludesWith; |
| |
| },{}],68:[function(require,module,exports){ |
| var baseTimes = require('./_baseTimes'), |
| isArguments = require('./isArguments'), |
| isArray = require('./isArray'), |
| isBuffer = require('./isBuffer'), |
| isIndex = require('./_isIndex'), |
| isTypedArray = require('./isTypedArray'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Creates an array of the enumerable property names of the array-like `value`. |
| * |
| * @private |
| * @param {*} value The value to query. |
| * @param {boolean} inherited Specify returning inherited property names. |
| * @returns {Array} Returns the array of property names. |
| */ |
| function arrayLikeKeys(value, inherited) { |
| var isArr = isArray(value), |
| isArg = !isArr && isArguments(value), |
| isBuff = !isArr && !isArg && isBuffer(value), |
| isType = !isArr && !isArg && !isBuff && isTypedArray(value), |
| skipIndexes = isArr || isArg || isBuff || isType, |
| result = skipIndexes ? baseTimes(value.length, String) : [], |
| length = result.length; |
| |
| for (var key in value) { |
| if ((inherited || hasOwnProperty.call(value, key)) && |
| !(skipIndexes && ( |
| // Safari 9 has enumerable `arguments.length` in strict mode. |
| key == 'length' || |
| // Node.js 0.10 has enumerable non-index properties on buffers. |
| (isBuff && (key == 'offset' || key == 'parent')) || |
| // PhantomJS 2 has enumerable non-index properties on typed arrays. |
| (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || |
| // Skip index properties. |
| isIndex(key, length) |
| ))) { |
| result.push(key); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = arrayLikeKeys; |
| |
| },{'./_baseTimes':125,'./_isIndex':181,'./isArguments':242,'./isArray':243,'./isBuffer':246,'./isTypedArray':257}],69:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.map` for arrays without support for iteratee |
| * shorthands. |
| * |
| * @private |
| * @param {Array} [array] The array to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Array} Returns the new mapped array. |
| */ |
| function arrayMap(array, iteratee) { |
| var index = -1, |
| length = array == null ? 0 : array.length, |
| result = Array(length); |
| |
| while (++index < length) { |
| result[index] = iteratee(array[index], index, array); |
| } |
| return result; |
| } |
| |
| module.exports = arrayMap; |
| |
| },{}],70:[function(require,module,exports){ |
| /** |
| * Appends the elements of `values` to `array`. |
| * |
| * @private |
| * @param {Array} array The array to modify. |
| * @param {Array} values The values to append. |
| * @returns {Array} Returns `array`. |
| */ |
| function arrayPush(array, values) { |
| var index = -1, |
| length = values.length, |
| offset = array.length; |
| |
| while (++index < length) { |
| array[offset + index] = values[index]; |
| } |
| return array; |
| } |
| |
| module.exports = arrayPush; |
| |
| },{}],71:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.reduce` for arrays without support for |
| * iteratee shorthands. |
| * |
| * @private |
| * @param {Array} [array] The array to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @param {*} [accumulator] The initial value. |
| * @param {boolean} [initAccum] Specify using the first element of `array` as |
| * the initial value. |
| * @returns {*} Returns the accumulated value. |
| */ |
| function arrayReduce(array, iteratee, accumulator, initAccum) { |
| var index = -1, |
| length = array == null ? 0 : array.length; |
| |
| if (initAccum && length) { |
| accumulator = array[++index]; |
| } |
| while (++index < length) { |
| accumulator = iteratee(accumulator, array[index], index, array); |
| } |
| return accumulator; |
| } |
| |
| module.exports = arrayReduce; |
| |
| },{}],72:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.some` for arrays without support for iteratee |
| * shorthands. |
| * |
| * @private |
| * @param {Array} [array] The array to iterate over. |
| * @param {Function} predicate The function invoked per iteration. |
| * @returns {boolean} Returns `true` if any element passes the predicate check, |
| * else `false`. |
| */ |
| function arraySome(array, predicate) { |
| var index = -1, |
| length = array == null ? 0 : array.length; |
| |
| while (++index < length) { |
| if (predicate(array[index], index, array)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| module.exports = arraySome; |
| |
| },{}],73:[function(require,module,exports){ |
| var baseProperty = require('./_baseProperty'); |
| |
| /** |
| * Gets the size of an ASCII `string`. |
| * |
| * @private |
| * @param {string} string The string inspect. |
| * @returns {number} Returns the string size. |
| */ |
| var asciiSize = baseProperty('length'); |
| |
| module.exports = asciiSize; |
| |
| },{'./_baseProperty':117}],74:[function(require,module,exports){ |
| var baseAssignValue = require('./_baseAssignValue'), |
| eq = require('./eq'); |
| |
| /** |
| * This function is like `assignValue` except that it doesn't assign |
| * `undefined` values. |
| * |
| * @private |
| * @param {Object} object The object to modify. |
| * @param {string} key The key of the property to assign. |
| * @param {*} value The value to assign. |
| */ |
| function assignMergeValue(object, key, value) { |
| if ((value !== undefined && !eq(object[key], value)) || |
| (value === undefined && !(key in object))) { |
| baseAssignValue(object, key, value); |
| } |
| } |
| |
| module.exports = assignMergeValue; |
| |
| },{'./_baseAssignValue':79,'./eq':231}],75:[function(require,module,exports){ |
| var baseAssignValue = require('./_baseAssignValue'), |
| eq = require('./eq'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Assigns `value` to `key` of `object` if the existing value is not equivalent |
| * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
| * for equality comparisons. |
| * |
| * @private |
| * @param {Object} object The object to modify. |
| * @param {string} key The key of the property to assign. |
| * @param {*} value The value to assign. |
| */ |
| function assignValue(object, key, value) { |
| var objValue = object[key]; |
| if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || |
| (value === undefined && !(key in object))) { |
| baseAssignValue(object, key, value); |
| } |
| } |
| |
| module.exports = assignValue; |
| |
| },{'./_baseAssignValue':79,'./eq':231}],76:[function(require,module,exports){ |
| var eq = require('./eq'); |
| |
| /** |
| * Gets the index at which the `key` is found in `array` of key-value pairs. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {*} key The key to search for. |
| * @returns {number} Returns the index of the matched value, else `-1`. |
| */ |
| function assocIndexOf(array, key) { |
| var length = array.length; |
| while (length--) { |
| if (eq(array[length][0], key)) { |
| return length; |
| } |
| } |
| return -1; |
| } |
| |
| module.exports = assocIndexOf; |
| |
| },{'./eq':231}],77:[function(require,module,exports){ |
| var copyObject = require('./_copyObject'), |
| keys = require('./keys'); |
| |
| /** |
| * The base implementation of `_.assign` without support for multiple sources |
| * or `customizer` functions. |
| * |
| * @private |
| * @param {Object} object The destination object. |
| * @param {Object} source The source object. |
| * @returns {Object} Returns `object`. |
| */ |
| function baseAssign(object, source) { |
| return object && copyObject(source, keys(source), object); |
| } |
| |
| module.exports = baseAssign; |
| |
| },{'./_copyObject':143,'./keys':259}],78:[function(require,module,exports){ |
| var copyObject = require('./_copyObject'), |
| keysIn = require('./keysIn'); |
| |
| /** |
| * The base implementation of `_.assignIn` without support for multiple sources |
| * or `customizer` functions. |
| * |
| * @private |
| * @param {Object} object The destination object. |
| * @param {Object} source The source object. |
| * @returns {Object} Returns `object`. |
| */ |
| function baseAssignIn(object, source) { |
| return object && copyObject(source, keysIn(source), object); |
| } |
| |
| module.exports = baseAssignIn; |
| |
| },{'./_copyObject':143,'./keysIn':260}],79:[function(require,module,exports){ |
| var defineProperty = require('./_defineProperty'); |
| |
| /** |
| * The base implementation of `assignValue` and `assignMergeValue` without |
| * value checks. |
| * |
| * @private |
| * @param {Object} object The object to modify. |
| * @param {string} key The key of the property to assign. |
| * @param {*} value The value to assign. |
| */ |
| function baseAssignValue(object, key, value) { |
| if (key == '__proto__' && defineProperty) { |
| defineProperty(object, key, { |
| 'configurable': true, |
| 'enumerable': true, |
| 'value': value, |
| 'writable': true |
| }); |
| } else { |
| object[key] = value; |
| } |
| } |
| |
| module.exports = baseAssignValue; |
| |
| },{'./_defineProperty':153}],80:[function(require,module,exports){ |
| var Stack = require('./_Stack'), |
| arrayEach = require('./_arrayEach'), |
| assignValue = require('./_assignValue'), |
| baseAssign = require('./_baseAssign'), |
| baseAssignIn = require('./_baseAssignIn'), |
| cloneBuffer = require('./_cloneBuffer'), |
| copyArray = require('./_copyArray'), |
| copySymbols = require('./_copySymbols'), |
| copySymbolsIn = require('./_copySymbolsIn'), |
| getAllKeys = require('./_getAllKeys'), |
| getAllKeysIn = require('./_getAllKeysIn'), |
| getTag = require('./_getTag'), |
| initCloneArray = require('./_initCloneArray'), |
| initCloneByTag = require('./_initCloneByTag'), |
| initCloneObject = require('./_initCloneObject'), |
| isArray = require('./isArray'), |
| isBuffer = require('./isBuffer'), |
| isMap = require('./isMap'), |
| isObject = require('./isObject'), |
| isSet = require('./isSet'), |
| keys = require('./keys'); |
| |
| /** Used to compose bitmasks for cloning. */ |
| var CLONE_DEEP_FLAG = 1, |
| CLONE_FLAT_FLAG = 2, |
| CLONE_SYMBOLS_FLAG = 4; |
| |
| /** `Object#toString` result references. */ |
| var argsTag = '[object Arguments]', |
| arrayTag = '[object Array]', |
| boolTag = '[object Boolean]', |
| dateTag = '[object Date]', |
| errorTag = '[object Error]', |
| funcTag = '[object Function]', |
| genTag = '[object GeneratorFunction]', |
| mapTag = '[object Map]', |
| numberTag = '[object Number]', |
| objectTag = '[object Object]', |
| regexpTag = '[object RegExp]', |
| setTag = '[object Set]', |
| stringTag = '[object String]', |
| symbolTag = '[object Symbol]', |
| weakMapTag = '[object WeakMap]'; |
| |
| var arrayBufferTag = '[object ArrayBuffer]', |
| dataViewTag = '[object DataView]', |
| float32Tag = '[object Float32Array]', |
| float64Tag = '[object Float64Array]', |
| int8Tag = '[object Int8Array]', |
| int16Tag = '[object Int16Array]', |
| int32Tag = '[object Int32Array]', |
| uint8Tag = '[object Uint8Array]', |
| uint8ClampedTag = '[object Uint8ClampedArray]', |
| uint16Tag = '[object Uint16Array]', |
| uint32Tag = '[object Uint32Array]'; |
| |
| /** Used to identify `toStringTag` values supported by `_.clone`. */ |
| var cloneableTags = {}; |
| cloneableTags[argsTag] = cloneableTags[arrayTag] = |
| cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = |
| cloneableTags[boolTag] = cloneableTags[dateTag] = |
| cloneableTags[float32Tag] = cloneableTags[float64Tag] = |
| cloneableTags[int8Tag] = cloneableTags[int16Tag] = |
| cloneableTags[int32Tag] = cloneableTags[mapTag] = |
| cloneableTags[numberTag] = cloneableTags[objectTag] = |
| cloneableTags[regexpTag] = cloneableTags[setTag] = |
| cloneableTags[stringTag] = cloneableTags[symbolTag] = |
| cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = |
| cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; |
| cloneableTags[errorTag] = cloneableTags[funcTag] = |
| cloneableTags[weakMapTag] = false; |
| |
| /** |
| * The base implementation of `_.clone` and `_.cloneDeep` which tracks |
| * traversed objects. |
| * |
| * @private |
| * @param {*} value The value to clone. |
| * @param {boolean} bitmask The bitmask flags. |
| * 1 - Deep clone |
| * 2 - Flatten inherited properties |
| * 4 - Clone symbols |
| * @param {Function} [customizer] The function to customize cloning. |
| * @param {string} [key] The key of `value`. |
| * @param {Object} [object] The parent object of `value`. |
| * @param {Object} [stack] Tracks traversed objects and their clone counterparts. |
| * @returns {*} Returns the cloned value. |
| */ |
| function baseClone(value, bitmask, customizer, key, object, stack) { |
| var result, |
| isDeep = bitmask & CLONE_DEEP_FLAG, |
| isFlat = bitmask & CLONE_FLAT_FLAG, |
| isFull = bitmask & CLONE_SYMBOLS_FLAG; |
| |
| if (customizer) { |
| result = object ? customizer(value, key, object, stack) : customizer(value); |
| } |
| if (result !== undefined) { |
| return result; |
| } |
| if (!isObject(value)) { |
| return value; |
| } |
| var isArr = isArray(value); |
| if (isArr) { |
| result = initCloneArray(value); |
| if (!isDeep) { |
| return copyArray(value, result); |
| } |
| } else { |
| var tag = getTag(value), |
| isFunc = tag == funcTag || tag == genTag; |
| |
| if (isBuffer(value)) { |
| return cloneBuffer(value, isDeep); |
| } |
| if (tag == objectTag || tag == argsTag || (isFunc && !object)) { |
| result = (isFlat || isFunc) ? {} : initCloneObject(value); |
| if (!isDeep) { |
| return isFlat |
| ? copySymbolsIn(value, baseAssignIn(result, value)) |
| : copySymbols(value, baseAssign(result, value)); |
| } |
| } else { |
| if (!cloneableTags[tag]) { |
| return object ? value : {}; |
| } |
| result = initCloneByTag(value, tag, isDeep); |
| } |
| } |
| // Check for circular references and return its corresponding clone. |
| stack || (stack = new Stack); |
| var stacked = stack.get(value); |
| if (stacked) { |
| return stacked; |
| } |
| stack.set(value, result); |
| |
| if (isSet(value)) { |
| value.forEach(function(subValue) { |
| result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); |
| }); |
| |
| return result; |
| } |
| |
| if (isMap(value)) { |
| value.forEach(function(subValue, key) { |
| result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
| }); |
| |
| return result; |
| } |
| |
| var keysFunc = isFull |
| ? (isFlat ? getAllKeysIn : getAllKeys) |
| : (isFlat ? keysIn : keys); |
| |
| var props = isArr ? undefined : keysFunc(value); |
| arrayEach(props || value, function(subValue, key) { |
| if (props) { |
| key = subValue; |
| subValue = value[key]; |
| } |
| // Recursively populate clone (susceptible to call stack limits). |
| assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
| }); |
| return result; |
| } |
| |
| module.exports = baseClone; |
| |
| },{'./_Stack':59,'./_arrayEach':64,'./_assignValue':75,'./_baseAssign':77,'./_baseAssignIn':78,'./_cloneBuffer':135,'./_copyArray':142,'./_copySymbols':144,'./_copySymbolsIn':145,'./_getAllKeys':159,'./_getAllKeysIn':160,'./_getTag':168,'./_initCloneArray':177,'./_initCloneByTag':178,'./_initCloneObject':179,'./isArray':243,'./isBuffer':246,'./isMap':250,'./isObject':251,'./isSet':254,'./keys':259}],81:[function(require,module,exports){ |
| var isObject = require('./isObject'); |
| |
| /** Built-in value references. */ |
| var objectCreate = Object.create; |
| |
| /** |
| * The base implementation of `_.create` without support for assigning |
| * properties to the created object. |
| * |
| * @private |
| * @param {Object} proto The object to inherit from. |
| * @returns {Object} Returns the new object. |
| */ |
| var baseCreate = (function() { |
| function object() {} |
| return function(proto) { |
| if (!isObject(proto)) { |
| return {}; |
| } |
| if (objectCreate) { |
| return objectCreate(proto); |
| } |
| object.prototype = proto; |
| var result = new object; |
| object.prototype = undefined; |
| return result; |
| }; |
| }()); |
| |
| module.exports = baseCreate; |
| |
| },{'./isObject':251}],82:[function(require,module,exports){ |
| var baseForOwn = require('./_baseForOwn'), |
| createBaseEach = require('./_createBaseEach'); |
| |
| /** |
| * The base implementation of `_.forEach` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Array|Object} Returns `collection`. |
| */ |
| var baseEach = createBaseEach(baseForOwn); |
| |
| module.exports = baseEach; |
| |
| },{'./_baseForOwn':88,'./_createBaseEach':148}],83:[function(require,module,exports){ |
| var isSymbol = require('./isSymbol'); |
| |
| /** |
| * The base implementation of methods like `_.max` and `_.min` which accepts a |
| * `comparator` to determine the extremum value. |
| * |
| * @private |
| * @param {Array} array The array to iterate over. |
| * @param {Function} iteratee The iteratee invoked per iteration. |
| * @param {Function} comparator The comparator used to compare values. |
| * @returns {*} Returns the extremum value. |
| */ |
| function baseExtremum(array, iteratee, comparator) { |
| var index = -1, |
| length = array.length; |
| |
| while (++index < length) { |
| var value = array[index], |
| current = iteratee(value); |
| |
| if (current != null && (computed === undefined |
| ? (current === current && !isSymbol(current)) |
| : comparator(current, computed) |
| )) { |
| var computed = current, |
| result = value; |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseExtremum; |
| |
| },{'./isSymbol':256}],84:[function(require,module,exports){ |
| var baseEach = require('./_baseEach'); |
| |
| /** |
| * The base implementation of `_.filter` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} predicate The function invoked per iteration. |
| * @returns {Array} Returns the new filtered array. |
| */ |
| function baseFilter(collection, predicate) { |
| var result = []; |
| baseEach(collection, function(value, index, collection) { |
| if (predicate(value, index, collection)) { |
| result.push(value); |
| } |
| }); |
| return result; |
| } |
| |
| module.exports = baseFilter; |
| |
| },{'./_baseEach':82}],85:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.findIndex` and `_.findLastIndex` without |
| * support for iteratee shorthands. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {Function} predicate The function invoked per iteration. |
| * @param {number} fromIndex The index to search from. |
| * @param {boolean} [fromRight] Specify iterating from right to left. |
| * @returns {number} Returns the index of the matched value, else `-1`. |
| */ |
| function baseFindIndex(array, predicate, fromIndex, fromRight) { |
| var length = array.length, |
| index = fromIndex + (fromRight ? 1 : -1); |
| |
| while ((fromRight ? index-- : ++index < length)) { |
| if (predicate(array[index], index, array)) { |
| return index; |
| } |
| } |
| return -1; |
| } |
| |
| module.exports = baseFindIndex; |
| |
| },{}],86:[function(require,module,exports){ |
| var arrayPush = require('./_arrayPush'), |
| isFlattenable = require('./_isFlattenable'); |
| |
| /** |
| * The base implementation of `_.flatten` with support for restricting flattening. |
| * |
| * @private |
| * @param {Array} array The array to flatten. |
| * @param {number} depth The maximum recursion depth. |
| * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. |
| * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. |
| * @param {Array} [result=[]] The initial result value. |
| * @returns {Array} Returns the new flattened array. |
| */ |
| function baseFlatten(array, depth, predicate, isStrict, result) { |
| var index = -1, |
| length = array.length; |
| |
| predicate || (predicate = isFlattenable); |
| result || (result = []); |
| |
| while (++index < length) { |
| var value = array[index]; |
| if (depth > 0 && predicate(value)) { |
| if (depth > 1) { |
| // Recursively flatten arrays (susceptible to call stack limits). |
| baseFlatten(value, depth - 1, predicate, isStrict, result); |
| } else { |
| arrayPush(result, value); |
| } |
| } else if (!isStrict) { |
| result[result.length] = value; |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseFlatten; |
| |
| },{'./_arrayPush':70,'./_isFlattenable':180}],87:[function(require,module,exports){ |
| var createBaseFor = require('./_createBaseFor'); |
| |
| /** |
| * The base implementation of `baseForOwn` which iterates over `object` |
| * properties returned by `keysFunc` and invokes `iteratee` for each property. |
| * Iteratee functions may exit iteration early by explicitly returning `false`. |
| * |
| * @private |
| * @param {Object} object The object to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @param {Function} keysFunc The function to get the keys of `object`. |
| * @returns {Object} Returns `object`. |
| */ |
| var baseFor = createBaseFor(); |
| |
| module.exports = baseFor; |
| |
| },{'./_createBaseFor':149}],88:[function(require,module,exports){ |
| var baseFor = require('./_baseFor'), |
| keys = require('./keys'); |
| |
| /** |
| * The base implementation of `_.forOwn` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Object} object The object to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Object} Returns `object`. |
| */ |
| function baseForOwn(object, iteratee) { |
| return object && baseFor(object, iteratee, keys); |
| } |
| |
| module.exports = baseForOwn; |
| |
| },{'./_baseFor':87,'./keys':259}],89:[function(require,module,exports){ |
| var castPath = require('./_castPath'), |
| toKey = require('./_toKey'); |
| |
| /** |
| * The base implementation of `_.get` without support for default values. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {Array|string} path The path of the property to get. |
| * @returns {*} Returns the resolved value. |
| */ |
| function baseGet(object, path) { |
| path = castPath(path, object); |
| |
| var index = 0, |
| length = path.length; |
| |
| while (object != null && index < length) { |
| object = object[toKey(path[index++])]; |
| } |
| return (index && index == length) ? object : undefined; |
| } |
| |
| module.exports = baseGet; |
| |
| },{'./_castPath':133,'./_toKey':223}],90:[function(require,module,exports){ |
| var arrayPush = require('./_arrayPush'), |
| isArray = require('./isArray'); |
| |
| /** |
| * The base implementation of `getAllKeys` and `getAllKeysIn` which uses |
| * `keysFunc` and `symbolsFunc` to get the enumerable property names and |
| * symbols of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {Function} keysFunc The function to get the keys of `object`. |
| * @param {Function} symbolsFunc The function to get the symbols of `object`. |
| * @returns {Array} Returns the array of property names and symbols. |
| */ |
| function baseGetAllKeys(object, keysFunc, symbolsFunc) { |
| var result = keysFunc(object); |
| return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); |
| } |
| |
| module.exports = baseGetAllKeys; |
| |
| },{'./_arrayPush':70,'./isArray':243}],91:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'), |
| getRawTag = require('./_getRawTag'), |
| objectToString = require('./_objectToString'); |
| |
| /** `Object#toString` result references. */ |
| var nullTag = '[object Null]', |
| undefinedTag = '[object Undefined]'; |
| |
| /** Built-in value references. */ |
| var symToStringTag = Symbol ? Symbol.toStringTag : undefined; |
| |
| /** |
| * The base implementation of `getTag` without fallbacks for buggy environments. |
| * |
| * @private |
| * @param {*} value The value to query. |
| * @returns {string} Returns the `toStringTag`. |
| */ |
| function baseGetTag(value) { |
| if (value == null) { |
| return value === undefined ? undefinedTag : nullTag; |
| } |
| return (symToStringTag && symToStringTag in Object(value)) |
| ? getRawTag(value) |
| : objectToString(value); |
| } |
| |
| module.exports = baseGetTag; |
| |
| },{'./_Symbol':60,'./_getRawTag':165,'./_objectToString':205}],92:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.gt` which doesn't coerce arguments. |
| * |
| * @private |
| * @param {*} value The value to compare. |
| * @param {*} other The other value to compare. |
| * @returns {boolean} Returns `true` if `value` is greater than `other`, |
| * else `false`. |
| */ |
| function baseGt(value, other) { |
| return value > other; |
| } |
| |
| module.exports = baseGt; |
| |
| },{}],93:[function(require,module,exports){ |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * The base implementation of `_.has` without support for deep paths. |
| * |
| * @private |
| * @param {Object} [object] The object to query. |
| * @param {Array|string} key The key to check. |
| * @returns {boolean} Returns `true` if `key` exists, else `false`. |
| */ |
| function baseHas(object, key) { |
| return object != null && hasOwnProperty.call(object, key); |
| } |
| |
| module.exports = baseHas; |
| |
| },{}],94:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.hasIn` without support for deep paths. |
| * |
| * @private |
| * @param {Object} [object] The object to query. |
| * @param {Array|string} key The key to check. |
| * @returns {boolean} Returns `true` if `key` exists, else `false`. |
| */ |
| function baseHasIn(object, key) { |
| return object != null && key in Object(object); |
| } |
| |
| module.exports = baseHasIn; |
| |
| },{}],95:[function(require,module,exports){ |
| var baseFindIndex = require('./_baseFindIndex'), |
| baseIsNaN = require('./_baseIsNaN'), |
| strictIndexOf = require('./_strictIndexOf'); |
| |
| /** |
| * The base implementation of `_.indexOf` without `fromIndex` bounds checks. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {*} value The value to search for. |
| * @param {number} fromIndex The index to search from. |
| * @returns {number} Returns the index of the matched value, else `-1`. |
| */ |
| function baseIndexOf(array, value, fromIndex) { |
| return value === value |
| ? strictIndexOf(array, value, fromIndex) |
| : baseFindIndex(array, baseIsNaN, fromIndex); |
| } |
| |
| module.exports = baseIndexOf; |
| |
| },{'./_baseFindIndex':85,'./_baseIsNaN':101,'./_strictIndexOf':220}],96:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var argsTag = '[object Arguments]'; |
| |
| /** |
| * The base implementation of `_.isArguments`. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, |
| */ |
| function baseIsArguments(value) { |
| return isObjectLike(value) && baseGetTag(value) == argsTag; |
| } |
| |
| module.exports = baseIsArguments; |
| |
| },{'./_baseGetTag':91,'./isObjectLike':252}],97:[function(require,module,exports){ |
| var baseIsEqualDeep = require('./_baseIsEqualDeep'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** |
| * The base implementation of `_.isEqual` which supports partial comparisons |
| * and tracks traversed objects. |
| * |
| * @private |
| * @param {*} value The value to compare. |
| * @param {*} other The other value to compare. |
| * @param {boolean} bitmask The bitmask flags. |
| * 1 - Unordered comparison |
| * 2 - Partial comparison |
| * @param {Function} [customizer] The function to customize comparisons. |
| * @param {Object} [stack] Tracks traversed `value` and `other` objects. |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
| */ |
| function baseIsEqual(value, other, bitmask, customizer, stack) { |
| if (value === other) { |
| return true; |
| } |
| if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { |
| return value !== value && other !== other; |
| } |
| return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); |
| } |
| |
| module.exports = baseIsEqual; |
| |
| },{'./_baseIsEqualDeep':98,'./isObjectLike':252}],98:[function(require,module,exports){ |
| var Stack = require('./_Stack'), |
| equalArrays = require('./_equalArrays'), |
| equalByTag = require('./_equalByTag'), |
| equalObjects = require('./_equalObjects'), |
| getTag = require('./_getTag'), |
| isArray = require('./isArray'), |
| isBuffer = require('./isBuffer'), |
| isTypedArray = require('./isTypedArray'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1; |
| |
| /** `Object#toString` result references. */ |
| var argsTag = '[object Arguments]', |
| arrayTag = '[object Array]', |
| objectTag = '[object Object]'; |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * A specialized version of `baseIsEqual` for arrays and objects which performs |
| * deep comparisons and tracks traversed objects enabling objects with circular |
| * references to be compared. |
| * |
| * @private |
| * @param {Object} object The object to compare. |
| * @param {Object} other The other object to compare. |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| * @param {Function} customizer The function to customize comparisons. |
| * @param {Function} equalFunc The function to determine equivalents of values. |
| * @param {Object} [stack] Tracks traversed `object` and `other` objects. |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
| */ |
| function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { |
| var objIsArr = isArray(object), |
| othIsArr = isArray(other), |
| objTag = objIsArr ? arrayTag : getTag(object), |
| othTag = othIsArr ? arrayTag : getTag(other); |
| |
| objTag = objTag == argsTag ? objectTag : objTag; |
| othTag = othTag == argsTag ? objectTag : othTag; |
| |
| var objIsObj = objTag == objectTag, |
| othIsObj = othTag == objectTag, |
| isSameTag = objTag == othTag; |
| |
| if (isSameTag && isBuffer(object)) { |
| if (!isBuffer(other)) { |
| return false; |
| } |
| objIsArr = true; |
| objIsObj = false; |
| } |
| if (isSameTag && !objIsObj) { |
| stack || (stack = new Stack); |
| return (objIsArr || isTypedArray(object)) |
| ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) |
| : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); |
| } |
| if (!(bitmask & COMPARE_PARTIAL_FLAG)) { |
| var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), |
| othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); |
| |
| if (objIsWrapped || othIsWrapped) { |
| var objUnwrapped = objIsWrapped ? object.value() : object, |
| othUnwrapped = othIsWrapped ? other.value() : other; |
| |
| stack || (stack = new Stack); |
| return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); |
| } |
| } |
| if (!isSameTag) { |
| return false; |
| } |
| stack || (stack = new Stack); |
| return equalObjects(object, other, bitmask, customizer, equalFunc, stack); |
| } |
| |
| module.exports = baseIsEqualDeep; |
| |
| },{'./_Stack':59,'./_equalArrays':154,'./_equalByTag':155,'./_equalObjects':156,'./_getTag':168,'./isArray':243,'./isBuffer':246,'./isTypedArray':257}],99:[function(require,module,exports){ |
| var getTag = require('./_getTag'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var mapTag = '[object Map]'; |
| |
| /** |
| * The base implementation of `_.isMap` without Node.js optimizations. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a map, else `false`. |
| */ |
| function baseIsMap(value) { |
| return isObjectLike(value) && getTag(value) == mapTag; |
| } |
| |
| module.exports = baseIsMap; |
| |
| },{'./_getTag':168,'./isObjectLike':252}],100:[function(require,module,exports){ |
| var Stack = require('./_Stack'), |
| baseIsEqual = require('./_baseIsEqual'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1, |
| COMPARE_UNORDERED_FLAG = 2; |
| |
| /** |
| * The base implementation of `_.isMatch` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Object} object The object to inspect. |
| * @param {Object} source The object of property values to match. |
| * @param {Array} matchData The property names, values, and compare flags to match. |
| * @param {Function} [customizer] The function to customize comparisons. |
| * @returns {boolean} Returns `true` if `object` is a match, else `false`. |
| */ |
| function baseIsMatch(object, source, matchData, customizer) { |
| var index = matchData.length, |
| length = index, |
| noCustomizer = !customizer; |
| |
| if (object == null) { |
| return !length; |
| } |
| object = Object(object); |
| while (index--) { |
| var data = matchData[index]; |
| if ((noCustomizer && data[2]) |
| ? data[1] !== object[data[0]] |
| : !(data[0] in object) |
| ) { |
| return false; |
| } |
| } |
| while (++index < length) { |
| data = matchData[index]; |
| var key = data[0], |
| objValue = object[key], |
| srcValue = data[1]; |
| |
| if (noCustomizer && data[2]) { |
| if (objValue === undefined && !(key in object)) { |
| return false; |
| } |
| } else { |
| var stack = new Stack; |
| if (customizer) { |
| var result = customizer(objValue, srcValue, key, object, source, stack); |
| } |
| if (!(result === undefined |
| ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) |
| : result |
| )) { |
| return false; |
| } |
| } |
| } |
| return true; |
| } |
| |
| module.exports = baseIsMatch; |
| |
| },{'./_Stack':59,'./_baseIsEqual':97}],101:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.isNaN` without support for number objects. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. |
| */ |
| function baseIsNaN(value) { |
| return value !== value; |
| } |
| |
| module.exports = baseIsNaN; |
| |
| },{}],102:[function(require,module,exports){ |
| var isFunction = require('./isFunction'), |
| isMasked = require('./_isMasked'), |
| isObject = require('./isObject'), |
| toSource = require('./_toSource'); |
| |
| /** |
| * Used to match `RegExp` |
| * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). |
| */ |
| var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; |
| |
| /** Used to detect host constructors (Safari). */ |
| var reIsHostCtor = /^\[object .+?Constructor\]$/; |
| |
| /** Used for built-in method references. */ |
| var funcProto = Function.prototype, |
| objectProto = Object.prototype; |
| |
| /** Used to resolve the decompiled source of functions. */ |
| var funcToString = funcProto.toString; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** Used to detect if a method is native. */ |
| var reIsNative = RegExp('^' + |
| funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') |
| .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' |
| ); |
| |
| /** |
| * The base implementation of `_.isNative` without bad shim checks. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a native function, |
| * else `false`. |
| */ |
| function baseIsNative(value) { |
| if (!isObject(value) || isMasked(value)) { |
| return false; |
| } |
| var pattern = isFunction(value) ? reIsNative : reIsHostCtor; |
| return pattern.test(toSource(value)); |
| } |
| |
| module.exports = baseIsNative; |
| |
| },{'./_isMasked':185,'./_toSource':224,'./isFunction':248,'./isObject':251}],103:[function(require,module,exports){ |
| var getTag = require('./_getTag'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var setTag = '[object Set]'; |
| |
| /** |
| * The base implementation of `_.isSet` without Node.js optimizations. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a set, else `false`. |
| */ |
| function baseIsSet(value) { |
| return isObjectLike(value) && getTag(value) == setTag; |
| } |
| |
| module.exports = baseIsSet; |
| |
| },{'./_getTag':168,'./isObjectLike':252}],104:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| isLength = require('./isLength'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var argsTag = '[object Arguments]', |
| arrayTag = '[object Array]', |
| boolTag = '[object Boolean]', |
| dateTag = '[object Date]', |
| errorTag = '[object Error]', |
| funcTag = '[object Function]', |
| mapTag = '[object Map]', |
| numberTag = '[object Number]', |
| objectTag = '[object Object]', |
| regexpTag = '[object RegExp]', |
| setTag = '[object Set]', |
| stringTag = '[object String]', |
| weakMapTag = '[object WeakMap]'; |
| |
| var arrayBufferTag = '[object ArrayBuffer]', |
| dataViewTag = '[object DataView]', |
| float32Tag = '[object Float32Array]', |
| float64Tag = '[object Float64Array]', |
| int8Tag = '[object Int8Array]', |
| int16Tag = '[object Int16Array]', |
| int32Tag = '[object Int32Array]', |
| uint8Tag = '[object Uint8Array]', |
| uint8ClampedTag = '[object Uint8ClampedArray]', |
| uint16Tag = '[object Uint16Array]', |
| uint32Tag = '[object Uint32Array]'; |
| |
| /** Used to identify `toStringTag` values of typed arrays. */ |
| var typedArrayTags = {}; |
| typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = |
| typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = |
| typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = |
| typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = |
| typedArrayTags[uint32Tag] = true; |
| typedArrayTags[argsTag] = typedArrayTags[arrayTag] = |
| typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = |
| typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = |
| typedArrayTags[errorTag] = typedArrayTags[funcTag] = |
| typedArrayTags[mapTag] = typedArrayTags[numberTag] = |
| typedArrayTags[objectTag] = typedArrayTags[regexpTag] = |
| typedArrayTags[setTag] = typedArrayTags[stringTag] = |
| typedArrayTags[weakMapTag] = false; |
| |
| /** |
| * The base implementation of `_.isTypedArray` without Node.js optimizations. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. |
| */ |
| function baseIsTypedArray(value) { |
| return isObjectLike(value) && |
| isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; |
| } |
| |
| module.exports = baseIsTypedArray; |
| |
| },{'./_baseGetTag':91,'./isLength':249,'./isObjectLike':252}],105:[function(require,module,exports){ |
| var baseMatches = require('./_baseMatches'), |
| baseMatchesProperty = require('./_baseMatchesProperty'), |
| identity = require('./identity'), |
| isArray = require('./isArray'), |
| property = require('./property'); |
| |
| /** |
| * The base implementation of `_.iteratee`. |
| * |
| * @private |
| * @param {*} [value=_.identity] The value to convert to an iteratee. |
| * @returns {Function} Returns the iteratee. |
| */ |
| function baseIteratee(value) { |
| // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. |
| // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. |
| if (typeof value == 'function') { |
| return value; |
| } |
| if (value == null) { |
| return identity; |
| } |
| if (typeof value == 'object') { |
| return isArray(value) |
| ? baseMatchesProperty(value[0], value[1]) |
| : baseMatches(value); |
| } |
| return property(value); |
| } |
| |
| module.exports = baseIteratee; |
| |
| },{'./_baseMatches':110,'./_baseMatchesProperty':111,'./identity':241,'./isArray':243,'./property':272}],106:[function(require,module,exports){ |
| var isPrototype = require('./_isPrototype'), |
| nativeKeys = require('./_nativeKeys'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names. |
| */ |
| function baseKeys(object) { |
| if (!isPrototype(object)) { |
| return nativeKeys(object); |
| } |
| var result = []; |
| for (var key in Object(object)) { |
| if (hasOwnProperty.call(object, key) && key != 'constructor') { |
| result.push(key); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseKeys; |
| |
| },{'./_isPrototype':186,'./_nativeKeys':202}],107:[function(require,module,exports){ |
| var isObject = require('./isObject'), |
| isPrototype = require('./_isPrototype'), |
| nativeKeysIn = require('./_nativeKeysIn'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names. |
| */ |
| function baseKeysIn(object) { |
| if (!isObject(object)) { |
| return nativeKeysIn(object); |
| } |
| var isProto = isPrototype(object), |
| result = []; |
| |
| for (var key in object) { |
| if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { |
| result.push(key); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseKeysIn; |
| |
| },{'./_isPrototype':186,'./_nativeKeysIn':203,'./isObject':251}],108:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.lt` which doesn't coerce arguments. |
| * |
| * @private |
| * @param {*} value The value to compare. |
| * @param {*} other The other value to compare. |
| * @returns {boolean} Returns `true` if `value` is less than `other`, |
| * else `false`. |
| */ |
| function baseLt(value, other) { |
| return value < other; |
| } |
| |
| module.exports = baseLt; |
| |
| },{}],109:[function(require,module,exports){ |
| var baseEach = require('./_baseEach'), |
| isArrayLike = require('./isArrayLike'); |
| |
| /** |
| * The base implementation of `_.map` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Array} Returns the new mapped array. |
| */ |
| function baseMap(collection, iteratee) { |
| var index = -1, |
| result = isArrayLike(collection) ? Array(collection.length) : []; |
| |
| baseEach(collection, function(value, key, collection) { |
| result[++index] = iteratee(value, key, collection); |
| }); |
| return result; |
| } |
| |
| module.exports = baseMap; |
| |
| },{'./_baseEach':82,'./isArrayLike':244}],110:[function(require,module,exports){ |
| var baseIsMatch = require('./_baseIsMatch'), |
| getMatchData = require('./_getMatchData'), |
| matchesStrictComparable = require('./_matchesStrictComparable'); |
| |
| /** |
| * The base implementation of `_.matches` which doesn't clone `source`. |
| * |
| * @private |
| * @param {Object} source The object of property values to match. |
| * @returns {Function} Returns the new spec function. |
| */ |
| function baseMatches(source) { |
| var matchData = getMatchData(source); |
| if (matchData.length == 1 && matchData[0][2]) { |
| return matchesStrictComparable(matchData[0][0], matchData[0][1]); |
| } |
| return function(object) { |
| return object === source || baseIsMatch(object, source, matchData); |
| }; |
| } |
| |
| module.exports = baseMatches; |
| |
| },{'./_baseIsMatch':100,'./_getMatchData':162,'./_matchesStrictComparable':199}],111:[function(require,module,exports){ |
| var baseIsEqual = require('./_baseIsEqual'), |
| get = require('./get'), |
| hasIn = require('./hasIn'), |
| isKey = require('./_isKey'), |
| isStrictComparable = require('./_isStrictComparable'), |
| matchesStrictComparable = require('./_matchesStrictComparable'), |
| toKey = require('./_toKey'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1, |
| COMPARE_UNORDERED_FLAG = 2; |
| |
| /** |
| * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. |
| * |
| * @private |
| * @param {string} path The path of the property to get. |
| * @param {*} srcValue The value to match. |
| * @returns {Function} Returns the new spec function. |
| */ |
| function baseMatchesProperty(path, srcValue) { |
| if (isKey(path) && isStrictComparable(srcValue)) { |
| return matchesStrictComparable(toKey(path), srcValue); |
| } |
| return function(object) { |
| var objValue = get(object, path); |
| return (objValue === undefined && objValue === srcValue) |
| ? hasIn(object, path) |
| : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); |
| }; |
| } |
| |
| module.exports = baseMatchesProperty; |
| |
| },{'./_baseIsEqual':97,'./_isKey':183,'./_isStrictComparable':187,'./_matchesStrictComparable':199,'./_toKey':223,'./get':238,'./hasIn':240}],112:[function(require,module,exports){ |
| var Stack = require('./_Stack'), |
| assignMergeValue = require('./_assignMergeValue'), |
| baseFor = require('./_baseFor'), |
| baseMergeDeep = require('./_baseMergeDeep'), |
| isObject = require('./isObject'), |
| keysIn = require('./keysIn'), |
| safeGet = require('./_safeGet'); |
| |
| /** |
| * The base implementation of `_.merge` without support for multiple sources. |
| * |
| * @private |
| * @param {Object} object The destination object. |
| * @param {Object} source The source object. |
| * @param {number} srcIndex The index of `source`. |
| * @param {Function} [customizer] The function to customize merged values. |
| * @param {Object} [stack] Tracks traversed source values and their merged |
| * counterparts. |
| */ |
| function baseMerge(object, source, srcIndex, customizer, stack) { |
| if (object === source) { |
| return; |
| } |
| baseFor(source, function(srcValue, key) { |
| if (isObject(srcValue)) { |
| stack || (stack = new Stack); |
| baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); |
| } |
| else { |
| var newValue = customizer |
| ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) |
| : undefined; |
| |
| if (newValue === undefined) { |
| newValue = srcValue; |
| } |
| assignMergeValue(object, key, newValue); |
| } |
| }, keysIn); |
| } |
| |
| module.exports = baseMerge; |
| |
| },{'./_Stack':59,'./_assignMergeValue':74,'./_baseFor':87,'./_baseMergeDeep':113,'./_safeGet':209,'./isObject':251,'./keysIn':260}],113:[function(require,module,exports){ |
| var assignMergeValue = require('./_assignMergeValue'), |
| cloneBuffer = require('./_cloneBuffer'), |
| cloneTypedArray = require('./_cloneTypedArray'), |
| copyArray = require('./_copyArray'), |
| initCloneObject = require('./_initCloneObject'), |
| isArguments = require('./isArguments'), |
| isArray = require('./isArray'), |
| isArrayLikeObject = require('./isArrayLikeObject'), |
| isBuffer = require('./isBuffer'), |
| isFunction = require('./isFunction'), |
| isObject = require('./isObject'), |
| isPlainObject = require('./isPlainObject'), |
| isTypedArray = require('./isTypedArray'), |
| safeGet = require('./_safeGet'), |
| toPlainObject = require('./toPlainObject'); |
| |
| /** |
| * A specialized version of `baseMerge` for arrays and objects which performs |
| * deep merges and tracks traversed objects enabling objects with circular |
| * references to be merged. |
| * |
| * @private |
| * @param {Object} object The destination object. |
| * @param {Object} source The source object. |
| * @param {string} key The key of the value to merge. |
| * @param {number} srcIndex The index of `source`. |
| * @param {Function} mergeFunc The function to merge values. |
| * @param {Function} [customizer] The function to customize assigned values. |
| * @param {Object} [stack] Tracks traversed source values and their merged |
| * counterparts. |
| */ |
| function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { |
| var objValue = safeGet(object, key), |
| srcValue = safeGet(source, key), |
| stacked = stack.get(srcValue); |
| |
| if (stacked) { |
| assignMergeValue(object, key, stacked); |
| return; |
| } |
| var newValue = customizer |
| ? customizer(objValue, srcValue, (key + ''), object, source, stack) |
| : undefined; |
| |
| var isCommon = newValue === undefined; |
| |
| if (isCommon) { |
| var isArr = isArray(srcValue), |
| isBuff = !isArr && isBuffer(srcValue), |
| isTyped = !isArr && !isBuff && isTypedArray(srcValue); |
| |
| newValue = srcValue; |
| if (isArr || isBuff || isTyped) { |
| if (isArray(objValue)) { |
| newValue = objValue; |
| } |
| else if (isArrayLikeObject(objValue)) { |
| newValue = copyArray(objValue); |
| } |
| else if (isBuff) { |
| isCommon = false; |
| newValue = cloneBuffer(srcValue, true); |
| } |
| else if (isTyped) { |
| isCommon = false; |
| newValue = cloneTypedArray(srcValue, true); |
| } |
| else { |
| newValue = []; |
| } |
| } |
| else if (isPlainObject(srcValue) || isArguments(srcValue)) { |
| newValue = objValue; |
| if (isArguments(objValue)) { |
| newValue = toPlainObject(objValue); |
| } |
| else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { |
| newValue = initCloneObject(srcValue); |
| } |
| } |
| else { |
| isCommon = false; |
| } |
| } |
| if (isCommon) { |
| // Recursively merge objects and arrays (susceptible to call stack limits). |
| stack.set(srcValue, newValue); |
| mergeFunc(newValue, srcValue, srcIndex, customizer, stack); |
| stack['delete'](srcValue); |
| } |
| assignMergeValue(object, key, newValue); |
| } |
| |
| module.exports = baseMergeDeep; |
| |
| },{'./_assignMergeValue':74,'./_cloneBuffer':135,'./_cloneTypedArray':139,'./_copyArray':142,'./_initCloneObject':179,'./_safeGet':209,'./isArguments':242,'./isArray':243,'./isArrayLikeObject':245,'./isBuffer':246,'./isFunction':248,'./isObject':251,'./isPlainObject':253,'./isTypedArray':257,'./toPlainObject':282}],114:[function(require,module,exports){ |
| var arrayMap = require('./_arrayMap'), |
| baseIteratee = require('./_baseIteratee'), |
| baseMap = require('./_baseMap'), |
| baseSortBy = require('./_baseSortBy'), |
| baseUnary = require('./_baseUnary'), |
| compareMultiple = require('./_compareMultiple'), |
| identity = require('./identity'); |
| |
| /** |
| * The base implementation of `_.orderBy` without param guards. |
| * |
| * @private |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. |
| * @param {string[]} orders The sort orders of `iteratees`. |
| * @returns {Array} Returns the new sorted array. |
| */ |
| function baseOrderBy(collection, iteratees, orders) { |
| var index = -1; |
| iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee)); |
| |
| var result = baseMap(collection, function(value, key, collection) { |
| var criteria = arrayMap(iteratees, function(iteratee) { |
| return iteratee(value); |
| }); |
| return { 'criteria': criteria, 'index': ++index, 'value': value }; |
| }); |
| |
| return baseSortBy(result, function(object, other) { |
| return compareMultiple(object, other, orders); |
| }); |
| } |
| |
| module.exports = baseOrderBy; |
| |
| },{'./_arrayMap':69,'./_baseIteratee':105,'./_baseMap':109,'./_baseSortBy':124,'./_baseUnary':127,'./_compareMultiple':141,'./identity':241}],115:[function(require,module,exports){ |
| var basePickBy = require('./_basePickBy'), |
| hasIn = require('./hasIn'); |
| |
| /** |
| * The base implementation of `_.pick` without support for individual |
| * property identifiers. |
| * |
| * @private |
| * @param {Object} object The source object. |
| * @param {string[]} paths The property paths to pick. |
| * @returns {Object} Returns the new object. |
| */ |
| function basePick(object, paths) { |
| return basePickBy(object, paths, function(value, path) { |
| return hasIn(object, path); |
| }); |
| } |
| |
| module.exports = basePick; |
| |
| },{'./_basePickBy':116,'./hasIn':240}],116:[function(require,module,exports){ |
| var baseGet = require('./_baseGet'), |
| baseSet = require('./_baseSet'), |
| castPath = require('./_castPath'); |
| |
| /** |
| * The base implementation of `_.pickBy` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Object} object The source object. |
| * @param {string[]} paths The property paths to pick. |
| * @param {Function} predicate The function invoked per property. |
| * @returns {Object} Returns the new object. |
| */ |
| function basePickBy(object, paths, predicate) { |
| var index = -1, |
| length = paths.length, |
| result = {}; |
| |
| while (++index < length) { |
| var path = paths[index], |
| value = baseGet(object, path); |
| |
| if (predicate(value, path)) { |
| baseSet(result, castPath(path, object), value); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = basePickBy; |
| |
| },{'./_baseGet':89,'./_baseSet':122,'./_castPath':133}],117:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.property` without support for deep paths. |
| * |
| * @private |
| * @param {string} key The key of the property to get. |
| * @returns {Function} Returns the new accessor function. |
| */ |
| function baseProperty(key) { |
| return function(object) { |
| return object == null ? undefined : object[key]; |
| }; |
| } |
| |
| module.exports = baseProperty; |
| |
| },{}],118:[function(require,module,exports){ |
| var baseGet = require('./_baseGet'); |
| |
| /** |
| * A specialized version of `baseProperty` which supports deep paths. |
| * |
| * @private |
| * @param {Array|string} path The path of the property to get. |
| * @returns {Function} Returns the new accessor function. |
| */ |
| function basePropertyDeep(path) { |
| return function(object) { |
| return baseGet(object, path); |
| }; |
| } |
| |
| module.exports = basePropertyDeep; |
| |
| },{'./_baseGet':89}],119:[function(require,module,exports){ |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeCeil = Math.ceil, |
| nativeMax = Math.max; |
| |
| /** |
| * The base implementation of `_.range` and `_.rangeRight` which doesn't |
| * coerce arguments. |
| * |
| * @private |
| * @param {number} start The start of the range. |
| * @param {number} end The end of the range. |
| * @param {number} step The value to increment or decrement by. |
| * @param {boolean} [fromRight] Specify iterating from right to left. |
| * @returns {Array} Returns the range of numbers. |
| */ |
| function baseRange(start, end, step, fromRight) { |
| var index = -1, |
| length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), |
| result = Array(length); |
| |
| while (length--) { |
| result[fromRight ? length : ++index] = start; |
| start += step; |
| } |
| return result; |
| } |
| |
| module.exports = baseRange; |
| |
| },{}],120:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.reduce` and `_.reduceRight`, without support |
| * for iteratee shorthands, which iterates over `collection` using `eachFunc`. |
| * |
| * @private |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @param {*} accumulator The initial value. |
| * @param {boolean} initAccum Specify using the first or last element of |
| * `collection` as the initial value. |
| * @param {Function} eachFunc The function to iterate over `collection`. |
| * @returns {*} Returns the accumulated value. |
| */ |
| function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { |
| eachFunc(collection, function(value, index, collection) { |
| accumulator = initAccum |
| ? (initAccum = false, value) |
| : iteratee(accumulator, value, index, collection); |
| }); |
| return accumulator; |
| } |
| |
| module.exports = baseReduce; |
| |
| },{}],121:[function(require,module,exports){ |
| var identity = require('./identity'), |
| overRest = require('./_overRest'), |
| setToString = require('./_setToString'); |
| |
| /** |
| * The base implementation of `_.rest` which doesn't validate or coerce arguments. |
| * |
| * @private |
| * @param {Function} func The function to apply a rest parameter to. |
| * @param {number} [start=func.length-1] The start position of the rest parameter. |
| * @returns {Function} Returns the new function. |
| */ |
| function baseRest(func, start) { |
| return setToString(overRest(func, start, identity), func + ''); |
| } |
| |
| module.exports = baseRest; |
| |
| },{'./_overRest':207,'./_setToString':213,'./identity':241}],122:[function(require,module,exports){ |
| var assignValue = require('./_assignValue'), |
| castPath = require('./_castPath'), |
| isIndex = require('./_isIndex'), |
| isObject = require('./isObject'), |
| toKey = require('./_toKey'); |
| |
| /** |
| * The base implementation of `_.set`. |
| * |
| * @private |
| * @param {Object} object The object to modify. |
| * @param {Array|string} path The path of the property to set. |
| * @param {*} value The value to set. |
| * @param {Function} [customizer] The function to customize path creation. |
| * @returns {Object} Returns `object`. |
| */ |
| function baseSet(object, path, value, customizer) { |
| if (!isObject(object)) { |
| return object; |
| } |
| path = castPath(path, object); |
| |
| var index = -1, |
| length = path.length, |
| lastIndex = length - 1, |
| nested = object; |
| |
| while (nested != null && ++index < length) { |
| var key = toKey(path[index]), |
| newValue = value; |
| |
| if (index != lastIndex) { |
| var objValue = nested[key]; |
| newValue = customizer ? customizer(objValue, key, nested) : undefined; |
| if (newValue === undefined) { |
| newValue = isObject(objValue) |
| ? objValue |
| : (isIndex(path[index + 1]) ? [] : {}); |
| } |
| } |
| assignValue(nested, key, newValue); |
| nested = nested[key]; |
| } |
| return object; |
| } |
| |
| module.exports = baseSet; |
| |
| },{'./_assignValue':75,'./_castPath':133,'./_isIndex':181,'./_toKey':223,'./isObject':251}],123:[function(require,module,exports){ |
| var constant = require('./constant'), |
| defineProperty = require('./_defineProperty'), |
| identity = require('./identity'); |
| |
| /** |
| * The base implementation of `setToString` without support for hot loop shorting. |
| * |
| * @private |
| * @param {Function} func The function to modify. |
| * @param {Function} string The `toString` result. |
| * @returns {Function} Returns `func`. |
| */ |
| var baseSetToString = !defineProperty ? identity : function(func, string) { |
| return defineProperty(func, 'toString', { |
| 'configurable': true, |
| 'enumerable': false, |
| 'value': constant(string), |
| 'writable': true |
| }); |
| }; |
| |
| module.exports = baseSetToString; |
| |
| },{'./_defineProperty':153,'./constant':228,'./identity':241}],124:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.sortBy` which uses `comparer` to define the |
| * sort order of `array` and replaces criteria objects with their corresponding |
| * values. |
| * |
| * @private |
| * @param {Array} array The array to sort. |
| * @param {Function} comparer The function to define sort order. |
| * @returns {Array} Returns `array`. |
| */ |
| function baseSortBy(array, comparer) { |
| var length = array.length; |
| |
| array.sort(comparer); |
| while (length--) { |
| array[length] = array[length].value; |
| } |
| return array; |
| } |
| |
| module.exports = baseSortBy; |
| |
| },{}],125:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.times` without support for iteratee shorthands |
| * or max array length checks. |
| * |
| * @private |
| * @param {number} n The number of times to invoke `iteratee`. |
| * @param {Function} iteratee The function invoked per iteration. |
| * @returns {Array} Returns the array of results. |
| */ |
| function baseTimes(n, iteratee) { |
| var index = -1, |
| result = Array(n); |
| |
| while (++index < n) { |
| result[index] = iteratee(index); |
| } |
| return result; |
| } |
| |
| module.exports = baseTimes; |
| |
| },{}],126:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'), |
| arrayMap = require('./_arrayMap'), |
| isArray = require('./isArray'), |
| isSymbol = require('./isSymbol'); |
| |
| /** Used as references for various `Number` constants. */ |
| var INFINITY = 1 / 0; |
| |
| /** Used to convert symbols to primitives and strings. */ |
| var symbolProto = Symbol ? Symbol.prototype : undefined, |
| symbolToString = symbolProto ? symbolProto.toString : undefined; |
| |
| /** |
| * The base implementation of `_.toString` which doesn't convert nullish |
| * values to empty strings. |
| * |
| * @private |
| * @param {*} value The value to process. |
| * @returns {string} Returns the string. |
| */ |
| function baseToString(value) { |
| // Exit early for strings to avoid a performance hit in some environments. |
| if (typeof value == 'string') { |
| return value; |
| } |
| if (isArray(value)) { |
| // Recursively convert values (susceptible to call stack limits). |
| return arrayMap(value, baseToString) + ''; |
| } |
| if (isSymbol(value)) { |
| return symbolToString ? symbolToString.call(value) : ''; |
| } |
| var result = (value + ''); |
| return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; |
| } |
| |
| module.exports = baseToString; |
| |
| },{'./_Symbol':60,'./_arrayMap':69,'./isArray':243,'./isSymbol':256}],127:[function(require,module,exports){ |
| /** |
| * The base implementation of `_.unary` without support for storing metadata. |
| * |
| * @private |
| * @param {Function} func The function to cap arguments for. |
| * @returns {Function} Returns the new capped function. |
| */ |
| function baseUnary(func) { |
| return function(value) { |
| return func(value); |
| }; |
| } |
| |
| module.exports = baseUnary; |
| |
| },{}],128:[function(require,module,exports){ |
| var SetCache = require('./_SetCache'), |
| arrayIncludes = require('./_arrayIncludes'), |
| arrayIncludesWith = require('./_arrayIncludesWith'), |
| cacheHas = require('./_cacheHas'), |
| createSet = require('./_createSet'), |
| setToArray = require('./_setToArray'); |
| |
| /** Used as the size to enable large array optimizations. */ |
| var LARGE_ARRAY_SIZE = 200; |
| |
| /** |
| * The base implementation of `_.uniqBy` without support for iteratee shorthands. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {Function} [iteratee] The iteratee invoked per element. |
| * @param {Function} [comparator] The comparator invoked per element. |
| * @returns {Array} Returns the new duplicate free array. |
| */ |
| function baseUniq(array, iteratee, comparator) { |
| var index = -1, |
| includes = arrayIncludes, |
| length = array.length, |
| isCommon = true, |
| result = [], |
| seen = result; |
| |
| if (comparator) { |
| isCommon = false; |
| includes = arrayIncludesWith; |
| } |
| else if (length >= LARGE_ARRAY_SIZE) { |
| var set = iteratee ? null : createSet(array); |
| if (set) { |
| return setToArray(set); |
| } |
| isCommon = false; |
| includes = cacheHas; |
| seen = new SetCache; |
| } |
| else { |
| seen = iteratee ? [] : result; |
| } |
| outer: |
| while (++index < length) { |
| var value = array[index], |
| computed = iteratee ? iteratee(value) : value; |
| |
| value = (comparator || value !== 0) ? value : 0; |
| if (isCommon && computed === computed) { |
| var seenIndex = seen.length; |
| while (seenIndex--) { |
| if (seen[seenIndex] === computed) { |
| continue outer; |
| } |
| } |
| if (iteratee) { |
| seen.push(computed); |
| } |
| result.push(value); |
| } |
| else if (!includes(seen, computed, comparator)) { |
| if (seen !== result) { |
| seen.push(computed); |
| } |
| result.push(value); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = baseUniq; |
| |
| },{'./_SetCache':58,'./_arrayIncludes':66,'./_arrayIncludesWith':67,'./_cacheHas':131,'./_createSet':152,'./_setToArray':212}],129:[function(require,module,exports){ |
| var arrayMap = require('./_arrayMap'); |
| |
| /** |
| * The base implementation of `_.values` and `_.valuesIn` which creates an |
| * array of `object` property values corresponding to the property names |
| * of `props`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {Array} props The property names to get values for. |
| * @returns {Object} Returns the array of property values. |
| */ |
| function baseValues(object, props) { |
| return arrayMap(props, function(key) { |
| return object[key]; |
| }); |
| } |
| |
| module.exports = baseValues; |
| |
| },{'./_arrayMap':69}],130:[function(require,module,exports){ |
| /** |
| * This base implementation of `_.zipObject` which assigns values using `assignFunc`. |
| * |
| * @private |
| * @param {Array} props The property identifiers. |
| * @param {Array} values The property values. |
| * @param {Function} assignFunc The function to assign values. |
| * @returns {Object} Returns the new object. |
| */ |
| function baseZipObject(props, values, assignFunc) { |
| var index = -1, |
| length = props.length, |
| valsLength = values.length, |
| result = {}; |
| |
| while (++index < length) { |
| var value = index < valsLength ? values[index] : undefined; |
| assignFunc(result, props[index], value); |
| } |
| return result; |
| } |
| |
| module.exports = baseZipObject; |
| |
| },{}],131:[function(require,module,exports){ |
| /** |
| * Checks if a `cache` value for `key` exists. |
| * |
| * @private |
| * @param {Object} cache The cache to query. |
| * @param {string} key The key of the entry to check. |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
| */ |
| function cacheHas(cache, key) { |
| return cache.has(key); |
| } |
| |
| module.exports = cacheHas; |
| |
| },{}],132:[function(require,module,exports){ |
| var identity = require('./identity'); |
| |
| /** |
| * Casts `value` to `identity` if it's not a function. |
| * |
| * @private |
| * @param {*} value The value to inspect. |
| * @returns {Function} Returns cast function. |
| */ |
| function castFunction(value) { |
| return typeof value == 'function' ? value : identity; |
| } |
| |
| module.exports = castFunction; |
| |
| },{'./identity':241}],133:[function(require,module,exports){ |
| var isArray = require('./isArray'), |
| isKey = require('./_isKey'), |
| stringToPath = require('./_stringToPath'), |
| toString = require('./toString'); |
| |
| /** |
| * Casts `value` to a path array if it's not one. |
| * |
| * @private |
| * @param {*} value The value to inspect. |
| * @param {Object} [object] The object to query keys on. |
| * @returns {Array} Returns the cast property path array. |
| */ |
| function castPath(value, object) { |
| if (isArray(value)) { |
| return value; |
| } |
| return isKey(value, object) ? [value] : stringToPath(toString(value)); |
| } |
| |
| module.exports = castPath; |
| |
| },{'./_isKey':183,'./_stringToPath':222,'./isArray':243,'./toString':283}],134:[function(require,module,exports){ |
| var Uint8Array = require('./_Uint8Array'); |
| |
| /** |
| * Creates a clone of `arrayBuffer`. |
| * |
| * @private |
| * @param {ArrayBuffer} arrayBuffer The array buffer to clone. |
| * @returns {ArrayBuffer} Returns the cloned array buffer. |
| */ |
| function cloneArrayBuffer(arrayBuffer) { |
| var result = new arrayBuffer.constructor(arrayBuffer.byteLength); |
| new Uint8Array(result).set(new Uint8Array(arrayBuffer)); |
| return result; |
| } |
| |
| module.exports = cloneArrayBuffer; |
| |
| },{'./_Uint8Array':61}],135:[function(require,module,exports){ |
| var root = require('./_root'); |
| |
| /** Detect free variable `exports`. */ |
| var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; |
| |
| /** Detect free variable `module`. */ |
| var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; |
| |
| /** Detect the popular CommonJS extension `module.exports`. */ |
| var moduleExports = freeModule && freeModule.exports === freeExports; |
| |
| /** Built-in value references. */ |
| var Buffer = moduleExports ? root.Buffer : undefined, |
| allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; |
| |
| /** |
| * Creates a clone of `buffer`. |
| * |
| * @private |
| * @param {Buffer} buffer The buffer to clone. |
| * @param {boolean} [isDeep] Specify a deep clone. |
| * @returns {Buffer} Returns the cloned buffer. |
| */ |
| function cloneBuffer(buffer, isDeep) { |
| if (isDeep) { |
| return buffer.slice(); |
| } |
| var length = buffer.length, |
| result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); |
| |
| buffer.copy(result); |
| return result; |
| } |
| |
| module.exports = cloneBuffer; |
| |
| },{'./_root':208}],136:[function(require,module,exports){ |
| var cloneArrayBuffer = require('./_cloneArrayBuffer'); |
| |
| /** |
| * Creates a clone of `dataView`. |
| * |
| * @private |
| * @param {Object} dataView The data view to clone. |
| * @param {boolean} [isDeep] Specify a deep clone. |
| * @returns {Object} Returns the cloned data view. |
| */ |
| function cloneDataView(dataView, isDeep) { |
| var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; |
| return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); |
| } |
| |
| module.exports = cloneDataView; |
| |
| },{'./_cloneArrayBuffer':134}],137:[function(require,module,exports){ |
| /** Used to match `RegExp` flags from their coerced string values. */ |
| var reFlags = /\w*$/; |
| |
| /** |
| * Creates a clone of `regexp`. |
| * |
| * @private |
| * @param {Object} regexp The regexp to clone. |
| * @returns {Object} Returns the cloned regexp. |
| */ |
| function cloneRegExp(regexp) { |
| var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); |
| result.lastIndex = regexp.lastIndex; |
| return result; |
| } |
| |
| module.exports = cloneRegExp; |
| |
| },{}],138:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'); |
| |
| /** Used to convert symbols to primitives and strings. */ |
| var symbolProto = Symbol ? Symbol.prototype : undefined, |
| symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; |
| |
| /** |
| * Creates a clone of the `symbol` object. |
| * |
| * @private |
| * @param {Object} symbol The symbol object to clone. |
| * @returns {Object} Returns the cloned symbol object. |
| */ |
| function cloneSymbol(symbol) { |
| return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; |
| } |
| |
| module.exports = cloneSymbol; |
| |
| },{'./_Symbol':60}],139:[function(require,module,exports){ |
| var cloneArrayBuffer = require('./_cloneArrayBuffer'); |
| |
| /** |
| * Creates a clone of `typedArray`. |
| * |
| * @private |
| * @param {Object} typedArray The typed array to clone. |
| * @param {boolean} [isDeep] Specify a deep clone. |
| * @returns {Object} Returns the cloned typed array. |
| */ |
| function cloneTypedArray(typedArray, isDeep) { |
| var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; |
| return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); |
| } |
| |
| module.exports = cloneTypedArray; |
| |
| },{'./_cloneArrayBuffer':134}],140:[function(require,module,exports){ |
| var isSymbol = require('./isSymbol'); |
| |
| /** |
| * Compares values to sort them in ascending order. |
| * |
| * @private |
| * @param {*} value The value to compare. |
| * @param {*} other The other value to compare. |
| * @returns {number} Returns the sort order indicator for `value`. |
| */ |
| function compareAscending(value, other) { |
| if (value !== other) { |
| var valIsDefined = value !== undefined, |
| valIsNull = value === null, |
| valIsReflexive = value === value, |
| valIsSymbol = isSymbol(value); |
| |
| var othIsDefined = other !== undefined, |
| othIsNull = other === null, |
| othIsReflexive = other === other, |
| othIsSymbol = isSymbol(other); |
| |
| if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || |
| (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || |
| (valIsNull && othIsDefined && othIsReflexive) || |
| (!valIsDefined && othIsReflexive) || |
| !valIsReflexive) { |
| return 1; |
| } |
| if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || |
| (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || |
| (othIsNull && valIsDefined && valIsReflexive) || |
| (!othIsDefined && valIsReflexive) || |
| !othIsReflexive) { |
| return -1; |
| } |
| } |
| return 0; |
| } |
| |
| module.exports = compareAscending; |
| |
| },{'./isSymbol':256}],141:[function(require,module,exports){ |
| var compareAscending = require('./_compareAscending'); |
| |
| /** |
| * Used by `_.orderBy` to compare multiple properties of a value to another |
| * and stable sort them. |
| * |
| * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, |
| * specify an order of "desc" for descending or "asc" for ascending sort order |
| * of corresponding values. |
| * |
| * @private |
| * @param {Object} object The object to compare. |
| * @param {Object} other The other object to compare. |
| * @param {boolean[]|string[]} orders The order to sort by for each property. |
| * @returns {number} Returns the sort order indicator for `object`. |
| */ |
| function compareMultiple(object, other, orders) { |
| var index = -1, |
| objCriteria = object.criteria, |
| othCriteria = other.criteria, |
| length = objCriteria.length, |
| ordersLength = orders.length; |
| |
| while (++index < length) { |
| var result = compareAscending(objCriteria[index], othCriteria[index]); |
| if (result) { |
| if (index >= ordersLength) { |
| return result; |
| } |
| var order = orders[index]; |
| return result * (order == 'desc' ? -1 : 1); |
| } |
| } |
| // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications |
| // that causes it, under certain circumstances, to provide the same value for |
| // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 |
| // for more details. |
| // |
| // This also ensures a stable sort in V8 and other engines. |
| // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. |
| return object.index - other.index; |
| } |
| |
| module.exports = compareMultiple; |
| |
| },{'./_compareAscending':140}],142:[function(require,module,exports){ |
| /** |
| * Copies the values of `source` to `array`. |
| * |
| * @private |
| * @param {Array} source The array to copy values from. |
| * @param {Array} [array=[]] The array to copy values to. |
| * @returns {Array} Returns `array`. |
| */ |
| function copyArray(source, array) { |
| var index = -1, |
| length = source.length; |
| |
| array || (array = Array(length)); |
| while (++index < length) { |
| array[index] = source[index]; |
| } |
| return array; |
| } |
| |
| module.exports = copyArray; |
| |
| },{}],143:[function(require,module,exports){ |
| var assignValue = require('./_assignValue'), |
| baseAssignValue = require('./_baseAssignValue'); |
| |
| /** |
| * Copies properties of `source` to `object`. |
| * |
| * @private |
| * @param {Object} source The object to copy properties from. |
| * @param {Array} props The property identifiers to copy. |
| * @param {Object} [object={}] The object to copy properties to. |
| * @param {Function} [customizer] The function to customize copied values. |
| * @returns {Object} Returns `object`. |
| */ |
| function copyObject(source, props, object, customizer) { |
| var isNew = !object; |
| object || (object = {}); |
| |
| var index = -1, |
| length = props.length; |
| |
| while (++index < length) { |
| var key = props[index]; |
| |
| var newValue = customizer |
| ? customizer(object[key], source[key], key, object, source) |
| : undefined; |
| |
| if (newValue === undefined) { |
| newValue = source[key]; |
| } |
| if (isNew) { |
| baseAssignValue(object, key, newValue); |
| } else { |
| assignValue(object, key, newValue); |
| } |
| } |
| return object; |
| } |
| |
| module.exports = copyObject; |
| |
| },{'./_assignValue':75,'./_baseAssignValue':79}],144:[function(require,module,exports){ |
| var copyObject = require('./_copyObject'), |
| getSymbols = require('./_getSymbols'); |
| |
| /** |
| * Copies own symbols of `source` to `object`. |
| * |
| * @private |
| * @param {Object} source The object to copy symbols from. |
| * @param {Object} [object={}] The object to copy symbols to. |
| * @returns {Object} Returns `object`. |
| */ |
| function copySymbols(source, object) { |
| return copyObject(source, getSymbols(source), object); |
| } |
| |
| module.exports = copySymbols; |
| |
| },{'./_copyObject':143,'./_getSymbols':166}],145:[function(require,module,exports){ |
| var copyObject = require('./_copyObject'), |
| getSymbolsIn = require('./_getSymbolsIn'); |
| |
| /** |
| * Copies own and inherited symbols of `source` to `object`. |
| * |
| * @private |
| * @param {Object} source The object to copy symbols from. |
| * @param {Object} [object={}] The object to copy symbols to. |
| * @returns {Object} Returns `object`. |
| */ |
| function copySymbolsIn(source, object) { |
| return copyObject(source, getSymbolsIn(source), object); |
| } |
| |
| module.exports = copySymbolsIn; |
| |
| },{'./_copyObject':143,'./_getSymbolsIn':167}],146:[function(require,module,exports){ |
| var root = require('./_root'); |
| |
| /** Used to detect overreaching core-js shims. */ |
| var coreJsData = root['__core-js_shared__']; |
| |
| module.exports = coreJsData; |
| |
| },{'./_root':208}],147:[function(require,module,exports){ |
| var baseRest = require('./_baseRest'), |
| isIterateeCall = require('./_isIterateeCall'); |
| |
| /** |
| * Creates a function like `_.assign`. |
| * |
| * @private |
| * @param {Function} assigner The function to assign values. |
| * @returns {Function} Returns the new assigner function. |
| */ |
| function createAssigner(assigner) { |
| return baseRest(function(object, sources) { |
| var index = -1, |
| length = sources.length, |
| customizer = length > 1 ? sources[length - 1] : undefined, |
| guard = length > 2 ? sources[2] : undefined; |
| |
| customizer = (assigner.length > 3 && typeof customizer == 'function') |
| ? (length--, customizer) |
| : undefined; |
| |
| if (guard && isIterateeCall(sources[0], sources[1], guard)) { |
| customizer = length < 3 ? undefined : customizer; |
| length = 1; |
| } |
| object = Object(object); |
| while (++index < length) { |
| var source = sources[index]; |
| if (source) { |
| assigner(object, source, index, customizer); |
| } |
| } |
| return object; |
| }); |
| } |
| |
| module.exports = createAssigner; |
| |
| },{'./_baseRest':121,'./_isIterateeCall':182}],148:[function(require,module,exports){ |
| var isArrayLike = require('./isArrayLike'); |
| |
| /** |
| * Creates a `baseEach` or `baseEachRight` function. |
| * |
| * @private |
| * @param {Function} eachFunc The function to iterate over a collection. |
| * @param {boolean} [fromRight] Specify iterating from right to left. |
| * @returns {Function} Returns the new base function. |
| */ |
| function createBaseEach(eachFunc, fromRight) { |
| return function(collection, iteratee) { |
| if (collection == null) { |
| return collection; |
| } |
| if (!isArrayLike(collection)) { |
| return eachFunc(collection, iteratee); |
| } |
| var length = collection.length, |
| index = fromRight ? length : -1, |
| iterable = Object(collection); |
| |
| while ((fromRight ? index-- : ++index < length)) { |
| if (iteratee(iterable[index], index, iterable) === false) { |
| break; |
| } |
| } |
| return collection; |
| }; |
| } |
| |
| module.exports = createBaseEach; |
| |
| },{'./isArrayLike':244}],149:[function(require,module,exports){ |
| /** |
| * Creates a base function for methods like `_.forIn` and `_.forOwn`. |
| * |
| * @private |
| * @param {boolean} [fromRight] Specify iterating from right to left. |
| * @returns {Function} Returns the new base function. |
| */ |
| function createBaseFor(fromRight) { |
| return function(object, iteratee, keysFunc) { |
| var index = -1, |
| iterable = Object(object), |
| props = keysFunc(object), |
| length = props.length; |
| |
| while (length--) { |
| var key = props[fromRight ? length : ++index]; |
| if (iteratee(iterable[key], key, iterable) === false) { |
| break; |
| } |
| } |
| return object; |
| }; |
| } |
| |
| module.exports = createBaseFor; |
| |
| },{}],150:[function(require,module,exports){ |
| var baseIteratee = require('./_baseIteratee'), |
| isArrayLike = require('./isArrayLike'), |
| keys = require('./keys'); |
| |
| /** |
| * Creates a `_.find` or `_.findLast` function. |
| * |
| * @private |
| * @param {Function} findIndexFunc The function to find the collection index. |
| * @returns {Function} Returns the new find function. |
| */ |
| function createFind(findIndexFunc) { |
| return function(collection, predicate, fromIndex) { |
| var iterable = Object(collection); |
| if (!isArrayLike(collection)) { |
| var iteratee = baseIteratee(predicate, 3); |
| collection = keys(collection); |
| predicate = function(key) { return iteratee(iterable[key], key, iterable); }; |
| } |
| var index = findIndexFunc(collection, predicate, fromIndex); |
| return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; |
| }; |
| } |
| |
| module.exports = createFind; |
| |
| },{'./_baseIteratee':105,'./isArrayLike':244,'./keys':259}],151:[function(require,module,exports){ |
| var baseRange = require('./_baseRange'), |
| isIterateeCall = require('./_isIterateeCall'), |
| toFinite = require('./toFinite'); |
| |
| /** |
| * Creates a `_.range` or `_.rangeRight` function. |
| * |
| * @private |
| * @param {boolean} [fromRight] Specify iterating from right to left. |
| * @returns {Function} Returns the new range function. |
| */ |
| function createRange(fromRight) { |
| return function(start, end, step) { |
| if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { |
| end = step = undefined; |
| } |
| // Ensure the sign of `-0` is preserved. |
| start = toFinite(start); |
| if (end === undefined) { |
| end = start; |
| start = 0; |
| } else { |
| end = toFinite(end); |
| } |
| step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); |
| return baseRange(start, end, step, fromRight); |
| }; |
| } |
| |
| module.exports = createRange; |
| |
| },{'./_baseRange':119,'./_isIterateeCall':182,'./toFinite':279}],152:[function(require,module,exports){ |
| var Set = require('./_Set'), |
| noop = require('./noop'), |
| setToArray = require('./_setToArray'); |
| |
| /** Used as references for various `Number` constants. */ |
| var INFINITY = 1 / 0; |
| |
| /** |
| * Creates a set object of `values`. |
| * |
| * @private |
| * @param {Array} values The values to add to the set. |
| * @returns {Object} Returns the new set. |
| */ |
| var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { |
| return new Set(values); |
| }; |
| |
| module.exports = createSet; |
| |
| },{'./_Set':57,'./_setToArray':212,'./noop':269}],153:[function(require,module,exports){ |
| var getNative = require('./_getNative'); |
| |
| var defineProperty = (function() { |
| try { |
| var func = getNative(Object, 'defineProperty'); |
| func({}, '', {}); |
| return func; |
| } catch (e) {} |
| }()); |
| |
| module.exports = defineProperty; |
| |
| },{'./_getNative':163}],154:[function(require,module,exports){ |
| var SetCache = require('./_SetCache'), |
| arraySome = require('./_arraySome'), |
| cacheHas = require('./_cacheHas'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1, |
| COMPARE_UNORDERED_FLAG = 2; |
| |
| /** |
| * A specialized version of `baseIsEqualDeep` for arrays with support for |
| * partial deep comparisons. |
| * |
| * @private |
| * @param {Array} array The array to compare. |
| * @param {Array} other The other array to compare. |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| * @param {Function} customizer The function to customize comparisons. |
| * @param {Function} equalFunc The function to determine equivalents of values. |
| * @param {Object} stack Tracks traversed `array` and `other` objects. |
| * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. |
| */ |
| function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { |
| var isPartial = bitmask & COMPARE_PARTIAL_FLAG, |
| arrLength = array.length, |
| othLength = other.length; |
| |
| if (arrLength != othLength && !(isPartial && othLength > arrLength)) { |
| return false; |
| } |
| // Assume cyclic values are equal. |
| var stacked = stack.get(array); |
| if (stacked && stack.get(other)) { |
| return stacked == other; |
| } |
| var index = -1, |
| result = true, |
| seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; |
| |
| stack.set(array, other); |
| stack.set(other, array); |
| |
| // Ignore non-index properties. |
| while (++index < arrLength) { |
| var arrValue = array[index], |
| othValue = other[index]; |
| |
| if (customizer) { |
| var compared = isPartial |
| ? customizer(othValue, arrValue, index, other, array, stack) |
| : customizer(arrValue, othValue, index, array, other, stack); |
| } |
| if (compared !== undefined) { |
| if (compared) { |
| continue; |
| } |
| result = false; |
| break; |
| } |
| // Recursively compare arrays (susceptible to call stack limits). |
| if (seen) { |
| if (!arraySome(other, function(othValue, othIndex) { |
| if (!cacheHas(seen, othIndex) && |
| (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { |
| return seen.push(othIndex); |
| } |
| })) { |
| result = false; |
| break; |
| } |
| } else if (!( |
| arrValue === othValue || |
| equalFunc(arrValue, othValue, bitmask, customizer, stack) |
| )) { |
| result = false; |
| break; |
| } |
| } |
| stack['delete'](array); |
| stack['delete'](other); |
| return result; |
| } |
| |
| module.exports = equalArrays; |
| |
| },{'./_SetCache':58,'./_arraySome':72,'./_cacheHas':131}],155:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'), |
| Uint8Array = require('./_Uint8Array'), |
| eq = require('./eq'), |
| equalArrays = require('./_equalArrays'), |
| mapToArray = require('./_mapToArray'), |
| setToArray = require('./_setToArray'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1, |
| COMPARE_UNORDERED_FLAG = 2; |
| |
| /** `Object#toString` result references. */ |
| var boolTag = '[object Boolean]', |
| dateTag = '[object Date]', |
| errorTag = '[object Error]', |
| mapTag = '[object Map]', |
| numberTag = '[object Number]', |
| regexpTag = '[object RegExp]', |
| setTag = '[object Set]', |
| stringTag = '[object String]', |
| symbolTag = '[object Symbol]'; |
| |
| var arrayBufferTag = '[object ArrayBuffer]', |
| dataViewTag = '[object DataView]'; |
| |
| /** Used to convert symbols to primitives and strings. */ |
| var symbolProto = Symbol ? Symbol.prototype : undefined, |
| symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; |
| |
| /** |
| * A specialized version of `baseIsEqualDeep` for comparing objects of |
| * the same `toStringTag`. |
| * |
| * **Note:** This function only supports comparing values with tags of |
| * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. |
| * |
| * @private |
| * @param {Object} object The object to compare. |
| * @param {Object} other The other object to compare. |
| * @param {string} tag The `toStringTag` of the objects to compare. |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| * @param {Function} customizer The function to customize comparisons. |
| * @param {Function} equalFunc The function to determine equivalents of values. |
| * @param {Object} stack Tracks traversed `object` and `other` objects. |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
| */ |
| function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { |
| switch (tag) { |
| case dataViewTag: |
| if ((object.byteLength != other.byteLength) || |
| (object.byteOffset != other.byteOffset)) { |
| return false; |
| } |
| object = object.buffer; |
| other = other.buffer; |
| |
| case arrayBufferTag: |
| if ((object.byteLength != other.byteLength) || |
| !equalFunc(new Uint8Array(object), new Uint8Array(other))) { |
| return false; |
| } |
| return true; |
| |
| case boolTag: |
| case dateTag: |
| case numberTag: |
| // Coerce booleans to `1` or `0` and dates to milliseconds. |
| // Invalid dates are coerced to `NaN`. |
| return eq(+object, +other); |
| |
| case errorTag: |
| return object.name == other.name && object.message == other.message; |
| |
| case regexpTag: |
| case stringTag: |
| // Coerce regexes to strings and treat strings, primitives and objects, |
| // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring |
| // for more details. |
| return object == (other + ''); |
| |
| case mapTag: |
| var convert = mapToArray; |
| |
| case setTag: |
| var isPartial = bitmask & COMPARE_PARTIAL_FLAG; |
| convert || (convert = setToArray); |
| |
| if (object.size != other.size && !isPartial) { |
| return false; |
| } |
| // Assume cyclic values are equal. |
| var stacked = stack.get(object); |
| if (stacked) { |
| return stacked == other; |
| } |
| bitmask |= COMPARE_UNORDERED_FLAG; |
| |
| // Recursively compare objects (susceptible to call stack limits). |
| stack.set(object, other); |
| var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); |
| stack['delete'](object); |
| return result; |
| |
| case symbolTag: |
| if (symbolValueOf) { |
| return symbolValueOf.call(object) == symbolValueOf.call(other); |
| } |
| } |
| return false; |
| } |
| |
| module.exports = equalByTag; |
| |
| },{'./_Symbol':60,'./_Uint8Array':61,'./_equalArrays':154,'./_mapToArray':198,'./_setToArray':212,'./eq':231}],156:[function(require,module,exports){ |
| var getAllKeys = require('./_getAllKeys'); |
| |
| /** Used to compose bitmasks for value comparisons. */ |
| var COMPARE_PARTIAL_FLAG = 1; |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * A specialized version of `baseIsEqualDeep` for objects with support for |
| * partial deep comparisons. |
| * |
| * @private |
| * @param {Object} object The object to compare. |
| * @param {Object} other The other object to compare. |
| * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
| * @param {Function} customizer The function to customize comparisons. |
| * @param {Function} equalFunc The function to determine equivalents of values. |
| * @param {Object} stack Tracks traversed `object` and `other` objects. |
| * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
| */ |
| function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { |
| var isPartial = bitmask & COMPARE_PARTIAL_FLAG, |
| objProps = getAllKeys(object), |
| objLength = objProps.length, |
| othProps = getAllKeys(other), |
| othLength = othProps.length; |
| |
| if (objLength != othLength && !isPartial) { |
| return false; |
| } |
| var index = objLength; |
| while (index--) { |
| var key = objProps[index]; |
| if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { |
| return false; |
| } |
| } |
| // Assume cyclic values are equal. |
| var stacked = stack.get(object); |
| if (stacked && stack.get(other)) { |
| return stacked == other; |
| } |
| var result = true; |
| stack.set(object, other); |
| stack.set(other, object); |
| |
| var skipCtor = isPartial; |
| while (++index < objLength) { |
| key = objProps[index]; |
| var objValue = object[key], |
| othValue = other[key]; |
| |
| if (customizer) { |
| var compared = isPartial |
| ? customizer(othValue, objValue, key, other, object, stack) |
| : customizer(objValue, othValue, key, object, other, stack); |
| } |
| // Recursively compare objects (susceptible to call stack limits). |
| if (!(compared === undefined |
| ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) |
| : compared |
| )) { |
| result = false; |
| break; |
| } |
| skipCtor || (skipCtor = key == 'constructor'); |
| } |
| if (result && !skipCtor) { |
| var objCtor = object.constructor, |
| othCtor = other.constructor; |
| |
| // Non `Object` object instances with different constructors are not equal. |
| if (objCtor != othCtor && |
| ('constructor' in object && 'constructor' in other) && |
| !(typeof objCtor == 'function' && objCtor instanceof objCtor && |
| typeof othCtor == 'function' && othCtor instanceof othCtor)) { |
| result = false; |
| } |
| } |
| stack['delete'](object); |
| stack['delete'](other); |
| return result; |
| } |
| |
| module.exports = equalObjects; |
| |
| },{'./_getAllKeys':159}],157:[function(require,module,exports){ |
| var flatten = require('./flatten'), |
| overRest = require('./_overRest'), |
| setToString = require('./_setToString'); |
| |
| /** |
| * A specialized version of `baseRest` which flattens the rest array. |
| * |
| * @private |
| * @param {Function} func The function to apply a rest parameter to. |
| * @returns {Function} Returns the new function. |
| */ |
| function flatRest(func) { |
| return setToString(overRest(func, undefined, flatten), func + ''); |
| } |
| |
| module.exports = flatRest; |
| |
| },{'./_overRest':207,'./_setToString':213,'./flatten':235}],158:[function(require,module,exports){ |
| (function (global){ |
| /** Detect free variable `global` from Node.js. */ |
| var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; |
| |
| module.exports = freeGlobal; |
| |
| }).call(this,typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {}) |
| },{}],159:[function(require,module,exports){ |
| var baseGetAllKeys = require('./_baseGetAllKeys'), |
| getSymbols = require('./_getSymbols'), |
| keys = require('./keys'); |
| |
| /** |
| * Creates an array of own enumerable property names and symbols of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names and symbols. |
| */ |
| function getAllKeys(object) { |
| return baseGetAllKeys(object, keys, getSymbols); |
| } |
| |
| module.exports = getAllKeys; |
| |
| },{'./_baseGetAllKeys':90,'./_getSymbols':166,'./keys':259}],160:[function(require,module,exports){ |
| var baseGetAllKeys = require('./_baseGetAllKeys'), |
| getSymbolsIn = require('./_getSymbolsIn'), |
| keysIn = require('./keysIn'); |
| |
| /** |
| * Creates an array of own and inherited enumerable property names and |
| * symbols of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names and symbols. |
| */ |
| function getAllKeysIn(object) { |
| return baseGetAllKeys(object, keysIn, getSymbolsIn); |
| } |
| |
| module.exports = getAllKeysIn; |
| |
| },{'./_baseGetAllKeys':90,'./_getSymbolsIn':167,'./keysIn':260}],161:[function(require,module,exports){ |
| var isKeyable = require('./_isKeyable'); |
| |
| /** |
| * Gets the data for `map`. |
| * |
| * @private |
| * @param {Object} map The map to query. |
| * @param {string} key The reference key. |
| * @returns {*} Returns the map data. |
| */ |
| function getMapData(map, key) { |
| var data = map.__data__; |
| return isKeyable(key) |
| ? data[typeof key == 'string' ? 'string' : 'hash'] |
| : data.map; |
| } |
| |
| module.exports = getMapData; |
| |
| },{'./_isKeyable':184}],162:[function(require,module,exports){ |
| var isStrictComparable = require('./_isStrictComparable'), |
| keys = require('./keys'); |
| |
| /** |
| * Gets the property names, values, and compare flags of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the match data of `object`. |
| */ |
| function getMatchData(object) { |
| var result = keys(object), |
| length = result.length; |
| |
| while (length--) { |
| var key = result[length], |
| value = object[key]; |
| |
| result[length] = [key, value, isStrictComparable(value)]; |
| } |
| return result; |
| } |
| |
| module.exports = getMatchData; |
| |
| },{'./_isStrictComparable':187,'./keys':259}],163:[function(require,module,exports){ |
| var baseIsNative = require('./_baseIsNative'), |
| getValue = require('./_getValue'); |
| |
| /** |
| * Gets the native function at `key` of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {string} key The key of the method to get. |
| * @returns {*} Returns the function if it's native, else `undefined`. |
| */ |
| function getNative(object, key) { |
| var value = getValue(object, key); |
| return baseIsNative(value) ? value : undefined; |
| } |
| |
| module.exports = getNative; |
| |
| },{'./_baseIsNative':102,'./_getValue':169}],164:[function(require,module,exports){ |
| var overArg = require('./_overArg'); |
| |
| /** Built-in value references. */ |
| var getPrototype = overArg(Object.getPrototypeOf, Object); |
| |
| module.exports = getPrototype; |
| |
| },{'./_overArg':206}],165:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Used to resolve the |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) |
| * of values. |
| */ |
| var nativeObjectToString = objectProto.toString; |
| |
| /** Built-in value references. */ |
| var symToStringTag = Symbol ? Symbol.toStringTag : undefined; |
| |
| /** |
| * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. |
| * |
| * @private |
| * @param {*} value The value to query. |
| * @returns {string} Returns the raw `toStringTag`. |
| */ |
| function getRawTag(value) { |
| var isOwn = hasOwnProperty.call(value, symToStringTag), |
| tag = value[symToStringTag]; |
| |
| try { |
| value[symToStringTag] = undefined; |
| var unmasked = true; |
| } catch (e) {} |
| |
| var result = nativeObjectToString.call(value); |
| if (unmasked) { |
| if (isOwn) { |
| value[symToStringTag] = tag; |
| } else { |
| delete value[symToStringTag]; |
| } |
| } |
| return result; |
| } |
| |
| module.exports = getRawTag; |
| |
| },{'./_Symbol':60}],166:[function(require,module,exports){ |
| var arrayFilter = require('./_arrayFilter'), |
| stubArray = require('./stubArray'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Built-in value references. */ |
| var propertyIsEnumerable = objectProto.propertyIsEnumerable; |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeGetSymbols = Object.getOwnPropertySymbols; |
| |
| /** |
| * Creates an array of the own enumerable symbols of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of symbols. |
| */ |
| var getSymbols = !nativeGetSymbols ? stubArray : function(object) { |
| if (object == null) { |
| return []; |
| } |
| object = Object(object); |
| return arrayFilter(nativeGetSymbols(object), function(symbol) { |
| return propertyIsEnumerable.call(object, symbol); |
| }); |
| }; |
| |
| module.exports = getSymbols; |
| |
| },{'./_arrayFilter':65,'./stubArray':277}],167:[function(require,module,exports){ |
| var arrayPush = require('./_arrayPush'), |
| getPrototype = require('./_getPrototype'), |
| getSymbols = require('./_getSymbols'), |
| stubArray = require('./stubArray'); |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeGetSymbols = Object.getOwnPropertySymbols; |
| |
| /** |
| * Creates an array of the own and inherited enumerable symbols of `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of symbols. |
| */ |
| var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { |
| var result = []; |
| while (object) { |
| arrayPush(result, getSymbols(object)); |
| object = getPrototype(object); |
| } |
| return result; |
| }; |
| |
| module.exports = getSymbolsIn; |
| |
| },{'./_arrayPush':70,'./_getPrototype':164,'./_getSymbols':166,'./stubArray':277}],168:[function(require,module,exports){ |
| var DataView = require('./_DataView'), |
| Map = require('./_Map'), |
| Promise = require('./_Promise'), |
| Set = require('./_Set'), |
| WeakMap = require('./_WeakMap'), |
| baseGetTag = require('./_baseGetTag'), |
| toSource = require('./_toSource'); |
| |
| /** `Object#toString` result references. */ |
| var mapTag = '[object Map]', |
| objectTag = '[object Object]', |
| promiseTag = '[object Promise]', |
| setTag = '[object Set]', |
| weakMapTag = '[object WeakMap]'; |
| |
| var dataViewTag = '[object DataView]'; |
| |
| /** Used to detect maps, sets, and weakmaps. */ |
| var dataViewCtorString = toSource(DataView), |
| mapCtorString = toSource(Map), |
| promiseCtorString = toSource(Promise), |
| setCtorString = toSource(Set), |
| weakMapCtorString = toSource(WeakMap); |
| |
| /** |
| * Gets the `toStringTag` of `value`. |
| * |
| * @private |
| * @param {*} value The value to query. |
| * @returns {string} Returns the `toStringTag`. |
| */ |
| var getTag = baseGetTag; |
| |
| // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. |
| if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || |
| (Map && getTag(new Map) != mapTag) || |
| (Promise && getTag(Promise.resolve()) != promiseTag) || |
| (Set && getTag(new Set) != setTag) || |
| (WeakMap && getTag(new WeakMap) != weakMapTag)) { |
| getTag = function(value) { |
| var result = baseGetTag(value), |
| Ctor = result == objectTag ? value.constructor : undefined, |
| ctorString = Ctor ? toSource(Ctor) : ''; |
| |
| if (ctorString) { |
| switch (ctorString) { |
| case dataViewCtorString: return dataViewTag; |
| case mapCtorString: return mapTag; |
| case promiseCtorString: return promiseTag; |
| case setCtorString: return setTag; |
| case weakMapCtorString: return weakMapTag; |
| } |
| } |
| return result; |
| }; |
| } |
| |
| module.exports = getTag; |
| |
| },{'./_DataView':51,'./_Map':54,'./_Promise':56,'./_Set':57,'./_WeakMap':62,'./_baseGetTag':91,'./_toSource':224}],169:[function(require,module,exports){ |
| /** |
| * Gets the value at `key` of `object`. |
| * |
| * @private |
| * @param {Object} [object] The object to query. |
| * @param {string} key The key of the property to get. |
| * @returns {*} Returns the property value. |
| */ |
| function getValue(object, key) { |
| return object == null ? undefined : object[key]; |
| } |
| |
| module.exports = getValue; |
| |
| },{}],170:[function(require,module,exports){ |
| var castPath = require('./_castPath'), |
| isArguments = require('./isArguments'), |
| isArray = require('./isArray'), |
| isIndex = require('./_isIndex'), |
| isLength = require('./isLength'), |
| toKey = require('./_toKey'); |
| |
| /** |
| * Checks if `path` exists on `object`. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {Array|string} path The path to check. |
| * @param {Function} hasFunc The function to check properties. |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. |
| */ |
| function hasPath(object, path, hasFunc) { |
| path = castPath(path, object); |
| |
| var index = -1, |
| length = path.length, |
| result = false; |
| |
| while (++index < length) { |
| var key = toKey(path[index]); |
| if (!(result = object != null && hasFunc(object, key))) { |
| break; |
| } |
| object = object[key]; |
| } |
| if (result || ++index != length) { |
| return result; |
| } |
| length = object == null ? 0 : object.length; |
| return !!length && isLength(length) && isIndex(key, length) && |
| (isArray(object) || isArguments(object)); |
| } |
| |
| module.exports = hasPath; |
| |
| },{'./_castPath':133,'./_isIndex':181,'./_toKey':223,'./isArguments':242,'./isArray':243,'./isLength':249}],171:[function(require,module,exports){ |
| /** Used to compose unicode character classes. */ |
| var rsAstralRange = '\\ud800-\\udfff', |
| rsComboMarksRange = '\\u0300-\\u036f', |
| reComboHalfMarksRange = '\\ufe20-\\ufe2f', |
| rsComboSymbolsRange = '\\u20d0-\\u20ff', |
| rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, |
| rsVarRange = '\\ufe0e\\ufe0f'; |
| |
| /** Used to compose unicode capture groups. */ |
| var rsZWJ = '\\u200d'; |
| |
| /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ |
| var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); |
| |
| /** |
| * Checks if `string` contains Unicode symbols. |
| * |
| * @private |
| * @param {string} string The string to inspect. |
| * @returns {boolean} Returns `true` if a symbol is found, else `false`. |
| */ |
| function hasUnicode(string) { |
| return reHasUnicode.test(string); |
| } |
| |
| module.exports = hasUnicode; |
| |
| },{}],172:[function(require,module,exports){ |
| var nativeCreate = require('./_nativeCreate'); |
| |
| /** |
| * Removes all key-value entries from the hash. |
| * |
| * @private |
| * @name clear |
| * @memberOf Hash |
| */ |
| function hashClear() { |
| this.__data__ = nativeCreate ? nativeCreate(null) : {}; |
| this.size = 0; |
| } |
| |
| module.exports = hashClear; |
| |
| },{'./_nativeCreate':201}],173:[function(require,module,exports){ |
| /** |
| * Removes `key` and its value from the hash. |
| * |
| * @private |
| * @name delete |
| * @memberOf Hash |
| * @param {Object} hash The hash to modify. |
| * @param {string} key The key of the value to remove. |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
| */ |
| function hashDelete(key) { |
| var result = this.has(key) && delete this.__data__[key]; |
| this.size -= result ? 1 : 0; |
| return result; |
| } |
| |
| module.exports = hashDelete; |
| |
| },{}],174:[function(require,module,exports){ |
| var nativeCreate = require('./_nativeCreate'); |
| |
| /** Used to stand-in for `undefined` hash values. */ |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Gets the hash value for `key`. |
| * |
| * @private |
| * @name get |
| * @memberOf Hash |
| * @param {string} key The key of the value to get. |
| * @returns {*} Returns the entry value. |
| */ |
| function hashGet(key) { |
| var data = this.__data__; |
| if (nativeCreate) { |
| var result = data[key]; |
| return result === HASH_UNDEFINED ? undefined : result; |
| } |
| return hasOwnProperty.call(data, key) ? data[key] : undefined; |
| } |
| |
| module.exports = hashGet; |
| |
| },{'./_nativeCreate':201}],175:[function(require,module,exports){ |
| var nativeCreate = require('./_nativeCreate'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Checks if a hash value for `key` exists. |
| * |
| * @private |
| * @name has |
| * @memberOf Hash |
| * @param {string} key The key of the entry to check. |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
| */ |
| function hashHas(key) { |
| var data = this.__data__; |
| return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); |
| } |
| |
| module.exports = hashHas; |
| |
| },{'./_nativeCreate':201}],176:[function(require,module,exports){ |
| var nativeCreate = require('./_nativeCreate'); |
| |
| /** Used to stand-in for `undefined` hash values. */ |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; |
| |
| /** |
| * Sets the hash `key` to `value`. |
| * |
| * @private |
| * @name set |
| * @memberOf Hash |
| * @param {string} key The key of the value to set. |
| * @param {*} value The value to set. |
| * @returns {Object} Returns the hash instance. |
| */ |
| function hashSet(key, value) { |
| var data = this.__data__; |
| this.size += this.has(key) ? 0 : 1; |
| data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; |
| return this; |
| } |
| |
| module.exports = hashSet; |
| |
| },{'./_nativeCreate':201}],177:[function(require,module,exports){ |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Initializes an array clone. |
| * |
| * @private |
| * @param {Array} array The array to clone. |
| * @returns {Array} Returns the initialized clone. |
| */ |
| function initCloneArray(array) { |
| var length = array.length, |
| result = new array.constructor(length); |
| |
| // Add properties assigned by `RegExp#exec`. |
| if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { |
| result.index = array.index; |
| result.input = array.input; |
| } |
| return result; |
| } |
| |
| module.exports = initCloneArray; |
| |
| },{}],178:[function(require,module,exports){ |
| var cloneArrayBuffer = require('./_cloneArrayBuffer'), |
| cloneDataView = require('./_cloneDataView'), |
| cloneRegExp = require('./_cloneRegExp'), |
| cloneSymbol = require('./_cloneSymbol'), |
| cloneTypedArray = require('./_cloneTypedArray'); |
| |
| /** `Object#toString` result references. */ |
| var boolTag = '[object Boolean]', |
| dateTag = '[object Date]', |
| mapTag = '[object Map]', |
| numberTag = '[object Number]', |
| regexpTag = '[object RegExp]', |
| setTag = '[object Set]', |
| stringTag = '[object String]', |
| symbolTag = '[object Symbol]'; |
| |
| var arrayBufferTag = '[object ArrayBuffer]', |
| dataViewTag = '[object DataView]', |
| float32Tag = '[object Float32Array]', |
| float64Tag = '[object Float64Array]', |
| int8Tag = '[object Int8Array]', |
| int16Tag = '[object Int16Array]', |
| int32Tag = '[object Int32Array]', |
| uint8Tag = '[object Uint8Array]', |
| uint8ClampedTag = '[object Uint8ClampedArray]', |
| uint16Tag = '[object Uint16Array]', |
| uint32Tag = '[object Uint32Array]'; |
| |
| /** |
| * Initializes an object clone based on its `toStringTag`. |
| * |
| * **Note:** This function only supports cloning values with tags of |
| * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. |
| * |
| * @private |
| * @param {Object} object The object to clone. |
| * @param {string} tag The `toStringTag` of the object to clone. |
| * @param {boolean} [isDeep] Specify a deep clone. |
| * @returns {Object} Returns the initialized clone. |
| */ |
| function initCloneByTag(object, tag, isDeep) { |
| var Ctor = object.constructor; |
| switch (tag) { |
| case arrayBufferTag: |
| return cloneArrayBuffer(object); |
| |
| case boolTag: |
| case dateTag: |
| return new Ctor(+object); |
| |
| case dataViewTag: |
| return cloneDataView(object, isDeep); |
| |
| case float32Tag: case float64Tag: |
| case int8Tag: case int16Tag: case int32Tag: |
| case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: |
| return cloneTypedArray(object, isDeep); |
| |
| case mapTag: |
| return new Ctor; |
| |
| case numberTag: |
| case stringTag: |
| return new Ctor(object); |
| |
| case regexpTag: |
| return cloneRegExp(object); |
| |
| case setTag: |
| return new Ctor; |
| |
| case symbolTag: |
| return cloneSymbol(object); |
| } |
| } |
| |
| module.exports = initCloneByTag; |
| |
| },{'./_cloneArrayBuffer':134,'./_cloneDataView':136,'./_cloneRegExp':137,'./_cloneSymbol':138,'./_cloneTypedArray':139}],179:[function(require,module,exports){ |
| var baseCreate = require('./_baseCreate'), |
| getPrototype = require('./_getPrototype'), |
| isPrototype = require('./_isPrototype'); |
| |
| /** |
| * Initializes an object clone. |
| * |
| * @private |
| * @param {Object} object The object to clone. |
| * @returns {Object} Returns the initialized clone. |
| */ |
| function initCloneObject(object) { |
| return (typeof object.constructor == 'function' && !isPrototype(object)) |
| ? baseCreate(getPrototype(object)) |
| : {}; |
| } |
| |
| module.exports = initCloneObject; |
| |
| },{'./_baseCreate':81,'./_getPrototype':164,'./_isPrototype':186}],180:[function(require,module,exports){ |
| var Symbol = require('./_Symbol'), |
| isArguments = require('./isArguments'), |
| isArray = require('./isArray'); |
| |
| /** Built-in value references. */ |
| var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; |
| |
| /** |
| * Checks if `value` is a flattenable `arguments` object or array. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. |
| */ |
| function isFlattenable(value) { |
| return isArray(value) || isArguments(value) || |
| !!(spreadableSymbol && value && value[spreadableSymbol]); |
| } |
| |
| module.exports = isFlattenable; |
| |
| },{'./_Symbol':60,'./isArguments':242,'./isArray':243}],181:[function(require,module,exports){ |
| /** Used as references for various `Number` constants. */ |
| var MAX_SAFE_INTEGER = 9007199254740991; |
| |
| /** Used to detect unsigned integer values. */ |
| var reIsUint = /^(?:0|[1-9]\d*)$/; |
| |
| /** |
| * Checks if `value` is a valid array-like index. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. |
| * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. |
| */ |
| function isIndex(value, length) { |
| var type = typeof value; |
| length = length == null ? MAX_SAFE_INTEGER : length; |
| |
| return !!length && |
| (type == 'number' || |
| (type != 'symbol' && reIsUint.test(value))) && |
| (value > -1 && value % 1 == 0 && value < length); |
| } |
| |
| module.exports = isIndex; |
| |
| },{}],182:[function(require,module,exports){ |
| var eq = require('./eq'), |
| isArrayLike = require('./isArrayLike'), |
| isIndex = require('./_isIndex'), |
| isObject = require('./isObject'); |
| |
| /** |
| * Checks if the given arguments are from an iteratee call. |
| * |
| * @private |
| * @param {*} value The potential iteratee value argument. |
| * @param {*} index The potential iteratee index or key argument. |
| * @param {*} object The potential iteratee object argument. |
| * @returns {boolean} Returns `true` if the arguments are from an iteratee call, |
| * else `false`. |
| */ |
| function isIterateeCall(value, index, object) { |
| if (!isObject(object)) { |
| return false; |
| } |
| var type = typeof index; |
| if (type == 'number' |
| ? (isArrayLike(object) && isIndex(index, object.length)) |
| : (type == 'string' && index in object) |
| ) { |
| return eq(object[index], value); |
| } |
| return false; |
| } |
| |
| module.exports = isIterateeCall; |
| |
| },{'./_isIndex':181,'./eq':231,'./isArrayLike':244,'./isObject':251}],183:[function(require,module,exports){ |
| var isArray = require('./isArray'), |
| isSymbol = require('./isSymbol'); |
| |
| /** Used to match property names within property paths. */ |
| var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, |
| reIsPlainProp = /^\w*$/; |
| |
| /** |
| * Checks if `value` is a property name and not a property path. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @param {Object} [object] The object to query keys on. |
| * @returns {boolean} Returns `true` if `value` is a property name, else `false`. |
| */ |
| function isKey(value, object) { |
| if (isArray(value)) { |
| return false; |
| } |
| var type = typeof value; |
| if (type == 'number' || type == 'symbol' || type == 'boolean' || |
| value == null || isSymbol(value)) { |
| return true; |
| } |
| return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || |
| (object != null && value in Object(object)); |
| } |
| |
| module.exports = isKey; |
| |
| },{'./isArray':243,'./isSymbol':256}],184:[function(require,module,exports){ |
| /** |
| * Checks if `value` is suitable for use as unique object key. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is suitable, else `false`. |
| */ |
| function isKeyable(value) { |
| var type = typeof value; |
| return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') |
| ? (value !== '__proto__') |
| : (value === null); |
| } |
| |
| module.exports = isKeyable; |
| |
| },{}],185:[function(require,module,exports){ |
| var coreJsData = require('./_coreJsData'); |
| |
| /** Used to detect methods masquerading as native. */ |
| var maskSrcKey = (function() { |
| var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); |
| return uid ? ('Symbol(src)_1.' + uid) : ''; |
| }()); |
| |
| /** |
| * Checks if `func` has its source masked. |
| * |
| * @private |
| * @param {Function} func The function to check. |
| * @returns {boolean} Returns `true` if `func` is masked, else `false`. |
| */ |
| function isMasked(func) { |
| return !!maskSrcKey && (maskSrcKey in func); |
| } |
| |
| module.exports = isMasked; |
| |
| },{'./_coreJsData':146}],186:[function(require,module,exports){ |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** |
| * Checks if `value` is likely a prototype object. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. |
| */ |
| function isPrototype(value) { |
| var Ctor = value && value.constructor, |
| proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; |
| |
| return value === proto; |
| } |
| |
| module.exports = isPrototype; |
| |
| },{}],187:[function(require,module,exports){ |
| var isObject = require('./isObject'); |
| |
| /** |
| * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. |
| * |
| * @private |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` if suitable for strict |
| * equality comparisons, else `false`. |
| */ |
| function isStrictComparable(value) { |
| return value === value && !isObject(value); |
| } |
| |
| module.exports = isStrictComparable; |
| |
| },{'./isObject':251}],188:[function(require,module,exports){ |
| /** |
| * Removes all key-value entries from the list cache. |
| * |
| * @private |
| * @name clear |
| * @memberOf ListCache |
| */ |
| function listCacheClear() { |
| this.__data__ = []; |
| this.size = 0; |
| } |
| |
| module.exports = listCacheClear; |
| |
| },{}],189:[function(require,module,exports){ |
| var assocIndexOf = require('./_assocIndexOf'); |
| |
| /** Used for built-in method references. */ |
| var arrayProto = Array.prototype; |
| |
| /** Built-in value references. */ |
| var splice = arrayProto.splice; |
| |
| /** |
| * Removes `key` and its value from the list cache. |
| * |
| * @private |
| * @name delete |
| * @memberOf ListCache |
| * @param {string} key The key of the value to remove. |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
| */ |
| function listCacheDelete(key) { |
| var data = this.__data__, |
| index = assocIndexOf(data, key); |
| |
| if (index < 0) { |
| return false; |
| } |
| var lastIndex = data.length - 1; |
| if (index == lastIndex) { |
| data.pop(); |
| } else { |
| splice.call(data, index, 1); |
| } |
| --this.size; |
| return true; |
| } |
| |
| module.exports = listCacheDelete; |
| |
| },{'./_assocIndexOf':76}],190:[function(require,module,exports){ |
| var assocIndexOf = require('./_assocIndexOf'); |
| |
| /** |
| * Gets the list cache value for `key`. |
| * |
| * @private |
| * @name get |
| * @memberOf ListCache |
| * @param {string} key The key of the value to get. |
| * @returns {*} Returns the entry value. |
| */ |
| function listCacheGet(key) { |
| var data = this.__data__, |
| index = assocIndexOf(data, key); |
| |
| return index < 0 ? undefined : data[index][1]; |
| } |
| |
| module.exports = listCacheGet; |
| |
| },{'./_assocIndexOf':76}],191:[function(require,module,exports){ |
| var assocIndexOf = require('./_assocIndexOf'); |
| |
| /** |
| * Checks if a list cache value for `key` exists. |
| * |
| * @private |
| * @name has |
| * @memberOf ListCache |
| * @param {string} key The key of the entry to check. |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
| */ |
| function listCacheHas(key) { |
| return assocIndexOf(this.__data__, key) > -1; |
| } |
| |
| module.exports = listCacheHas; |
| |
| },{'./_assocIndexOf':76}],192:[function(require,module,exports){ |
| var assocIndexOf = require('./_assocIndexOf'); |
| |
| /** |
| * Sets the list cache `key` to `value`. |
| * |
| * @private |
| * @name set |
| * @memberOf ListCache |
| * @param {string} key The key of the value to set. |
| * @param {*} value The value to set. |
| * @returns {Object} Returns the list cache instance. |
| */ |
| function listCacheSet(key, value) { |
| var data = this.__data__, |
| index = assocIndexOf(data, key); |
| |
| if (index < 0) { |
| ++this.size; |
| data.push([key, value]); |
| } else { |
| data[index][1] = value; |
| } |
| return this; |
| } |
| |
| module.exports = listCacheSet; |
| |
| },{'./_assocIndexOf':76}],193:[function(require,module,exports){ |
| var Hash = require('./_Hash'), |
| ListCache = require('./_ListCache'), |
| Map = require('./_Map'); |
| |
| /** |
| * Removes all key-value entries from the map. |
| * |
| * @private |
| * @name clear |
| * @memberOf MapCache |
| */ |
| function mapCacheClear() { |
| this.size = 0; |
| this.__data__ = { |
| 'hash': new Hash, |
| 'map': new (Map || ListCache), |
| 'string': new Hash |
| }; |
| } |
| |
| module.exports = mapCacheClear; |
| |
| },{'./_Hash':52,'./_ListCache':53,'./_Map':54}],194:[function(require,module,exports){ |
| var getMapData = require('./_getMapData'); |
| |
| /** |
| * Removes `key` and its value from the map. |
| * |
| * @private |
| * @name delete |
| * @memberOf MapCache |
| * @param {string} key The key of the value to remove. |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
| */ |
| function mapCacheDelete(key) { |
| var result = getMapData(this, key)['delete'](key); |
| this.size -= result ? 1 : 0; |
| return result; |
| } |
| |
| module.exports = mapCacheDelete; |
| |
| },{'./_getMapData':161}],195:[function(require,module,exports){ |
| var getMapData = require('./_getMapData'); |
| |
| /** |
| * Gets the map value for `key`. |
| * |
| * @private |
| * @name get |
| * @memberOf MapCache |
| * @param {string} key The key of the value to get. |
| * @returns {*} Returns the entry value. |
| */ |
| function mapCacheGet(key) { |
| return getMapData(this, key).get(key); |
| } |
| |
| module.exports = mapCacheGet; |
| |
| },{'./_getMapData':161}],196:[function(require,module,exports){ |
| var getMapData = require('./_getMapData'); |
| |
| /** |
| * Checks if a map value for `key` exists. |
| * |
| * @private |
| * @name has |
| * @memberOf MapCache |
| * @param {string} key The key of the entry to check. |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
| */ |
| function mapCacheHas(key) { |
| return getMapData(this, key).has(key); |
| } |
| |
| module.exports = mapCacheHas; |
| |
| },{'./_getMapData':161}],197:[function(require,module,exports){ |
| var getMapData = require('./_getMapData'); |
| |
| /** |
| * Sets the map `key` to `value`. |
| * |
| * @private |
| * @name set |
| * @memberOf MapCache |
| * @param {string} key The key of the value to set. |
| * @param {*} value The value to set. |
| * @returns {Object} Returns the map cache instance. |
| */ |
| function mapCacheSet(key, value) { |
| var data = getMapData(this, key), |
| size = data.size; |
| |
| data.set(key, value); |
| this.size += data.size == size ? 0 : 1; |
| return this; |
| } |
| |
| module.exports = mapCacheSet; |
| |
| },{'./_getMapData':161}],198:[function(require,module,exports){ |
| /** |
| * Converts `map` to its key-value pairs. |
| * |
| * @private |
| * @param {Object} map The map to convert. |
| * @returns {Array} Returns the key-value pairs. |
| */ |
| function mapToArray(map) { |
| var index = -1, |
| result = Array(map.size); |
| |
| map.forEach(function(value, key) { |
| result[++index] = [key, value]; |
| }); |
| return result; |
| } |
| |
| module.exports = mapToArray; |
| |
| },{}],199:[function(require,module,exports){ |
| /** |
| * A specialized version of `matchesProperty` for source values suitable |
| * for strict equality comparisons, i.e. `===`. |
| * |
| * @private |
| * @param {string} key The key of the property to get. |
| * @param {*} srcValue The value to match. |
| * @returns {Function} Returns the new spec function. |
| */ |
| function matchesStrictComparable(key, srcValue) { |
| return function(object) { |
| if (object == null) { |
| return false; |
| } |
| return object[key] === srcValue && |
| (srcValue !== undefined || (key in Object(object))); |
| }; |
| } |
| |
| module.exports = matchesStrictComparable; |
| |
| },{}],200:[function(require,module,exports){ |
| var memoize = require('./memoize'); |
| |
| /** Used as the maximum memoize cache size. */ |
| var MAX_MEMOIZE_SIZE = 500; |
| |
| /** |
| * A specialized version of `_.memoize` which clears the memoized function's |
| * cache when it exceeds `MAX_MEMOIZE_SIZE`. |
| * |
| * @private |
| * @param {Function} func The function to have its output memoized. |
| * @returns {Function} Returns the new memoized function. |
| */ |
| function memoizeCapped(func) { |
| var result = memoize(func, function(key) { |
| if (cache.size === MAX_MEMOIZE_SIZE) { |
| cache.clear(); |
| } |
| return key; |
| }); |
| |
| var cache = result.cache; |
| return result; |
| } |
| |
| module.exports = memoizeCapped; |
| |
| },{'./memoize':265}],201:[function(require,module,exports){ |
| var getNative = require('./_getNative'); |
| |
| /* Built-in method references that are verified to be native. */ |
| var nativeCreate = getNative(Object, 'create'); |
| |
| module.exports = nativeCreate; |
| |
| },{'./_getNative':163}],202:[function(require,module,exports){ |
| var overArg = require('./_overArg'); |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeKeys = overArg(Object.keys, Object); |
| |
| module.exports = nativeKeys; |
| |
| },{'./_overArg':206}],203:[function(require,module,exports){ |
| /** |
| * This function is like |
| * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) |
| * except that it includes inherited enumerable properties. |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names. |
| */ |
| function nativeKeysIn(object) { |
| var result = []; |
| if (object != null) { |
| for (var key in Object(object)) { |
| result.push(key); |
| } |
| } |
| return result; |
| } |
| |
| module.exports = nativeKeysIn; |
| |
| },{}],204:[function(require,module,exports){ |
| var freeGlobal = require('./_freeGlobal'); |
| |
| /** Detect free variable `exports`. */ |
| var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; |
| |
| /** Detect free variable `module`. */ |
| var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; |
| |
| /** Detect the popular CommonJS extension `module.exports`. */ |
| var moduleExports = freeModule && freeModule.exports === freeExports; |
| |
| /** Detect free variable `process` from Node.js. */ |
| var freeProcess = moduleExports && freeGlobal.process; |
| |
| /** Used to access faster Node.js helpers. */ |
| var nodeUtil = (function() { |
| try { |
| // Use `util.types` for Node.js 10+. |
| var types = freeModule && freeModule.require && freeModule.require('util').types; |
| |
| if (types) { |
| return types; |
| } |
| |
| // Legacy `process.binding('util')` for Node.js < 10. |
| return freeProcess && freeProcess.binding && freeProcess.binding('util'); |
| } catch (e) {} |
| }()); |
| |
| module.exports = nodeUtil; |
| |
| },{'./_freeGlobal':158}],205:[function(require,module,exports){ |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** |
| * Used to resolve the |
| * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) |
| * of values. |
| */ |
| var nativeObjectToString = objectProto.toString; |
| |
| /** |
| * Converts `value` to a string using `Object.prototype.toString`. |
| * |
| * @private |
| * @param {*} value The value to convert. |
| * @returns {string} Returns the converted string. |
| */ |
| function objectToString(value) { |
| return nativeObjectToString.call(value); |
| } |
| |
| module.exports = objectToString; |
| |
| },{}],206:[function(require,module,exports){ |
| /** |
| * Creates a unary function that invokes `func` with its argument transformed. |
| * |
| * @private |
| * @param {Function} func The function to wrap. |
| * @param {Function} transform The argument transform. |
| * @returns {Function} Returns the new function. |
| */ |
| function overArg(func, transform) { |
| return function(arg) { |
| return func(transform(arg)); |
| }; |
| } |
| |
| module.exports = overArg; |
| |
| },{}],207:[function(require,module,exports){ |
| var apply = require('./_apply'); |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeMax = Math.max; |
| |
| /** |
| * A specialized version of `baseRest` which transforms the rest array. |
| * |
| * @private |
| * @param {Function} func The function to apply a rest parameter to. |
| * @param {number} [start=func.length-1] The start position of the rest parameter. |
| * @param {Function} transform The rest array transform. |
| * @returns {Function} Returns the new function. |
| */ |
| function overRest(func, start, transform) { |
| start = nativeMax(start === undefined ? (func.length - 1) : start, 0); |
| return function() { |
| var args = arguments, |
| index = -1, |
| length = nativeMax(args.length - start, 0), |
| array = Array(length); |
| |
| while (++index < length) { |
| array[index] = args[start + index]; |
| } |
| index = -1; |
| var otherArgs = Array(start + 1); |
| while (++index < start) { |
| otherArgs[index] = args[index]; |
| } |
| otherArgs[start] = transform(array); |
| return apply(func, this, otherArgs); |
| }; |
| } |
| |
| module.exports = overRest; |
| |
| },{'./_apply':63}],208:[function(require,module,exports){ |
| var freeGlobal = require('./_freeGlobal'); |
| |
| /** Detect free variable `self`. */ |
| var freeSelf = typeof self == 'object' && self && self.Object === Object && self; |
| |
| /** Used as a reference to the global object. */ |
| var root = freeGlobal || freeSelf || Function('return this')(); |
| |
| module.exports = root; |
| |
| },{'./_freeGlobal':158}],209:[function(require,module,exports){ |
| /** |
| * Gets the value at `key`, unless `key` is "__proto__". |
| * |
| * @private |
| * @param {Object} object The object to query. |
| * @param {string} key The key of the property to get. |
| * @returns {*} Returns the property value. |
| */ |
| function safeGet(object, key) { |
| return key == '__proto__' |
| ? undefined |
| : object[key]; |
| } |
| |
| module.exports = safeGet; |
| |
| },{}],210:[function(require,module,exports){ |
| /** Used to stand-in for `undefined` hash values. */ |
| var HASH_UNDEFINED = '__lodash_hash_undefined__'; |
| |
| /** |
| * Adds `value` to the array cache. |
| * |
| * @private |
| * @name add |
| * @memberOf SetCache |
| * @alias push |
| * @param {*} value The value to cache. |
| * @returns {Object} Returns the cache instance. |
| */ |
| function setCacheAdd(value) { |
| this.__data__.set(value, HASH_UNDEFINED); |
| return this; |
| } |
| |
| module.exports = setCacheAdd; |
| |
| },{}],211:[function(require,module,exports){ |
| /** |
| * Checks if `value` is in the array cache. |
| * |
| * @private |
| * @name has |
| * @memberOf SetCache |
| * @param {*} value The value to search for. |
| * @returns {number} Returns `true` if `value` is found, else `false`. |
| */ |
| function setCacheHas(value) { |
| return this.__data__.has(value); |
| } |
| |
| module.exports = setCacheHas; |
| |
| },{}],212:[function(require,module,exports){ |
| /** |
| * Converts `set` to an array of its values. |
| * |
| * @private |
| * @param {Object} set The set to convert. |
| * @returns {Array} Returns the values. |
| */ |
| function setToArray(set) { |
| var index = -1, |
| result = Array(set.size); |
| |
| set.forEach(function(value) { |
| result[++index] = value; |
| }); |
| return result; |
| } |
| |
| module.exports = setToArray; |
| |
| },{}],213:[function(require,module,exports){ |
| var baseSetToString = require('./_baseSetToString'), |
| shortOut = require('./_shortOut'); |
| |
| /** |
| * Sets the `toString` method of `func` to return `string`. |
| * |
| * @private |
| * @param {Function} func The function to modify. |
| * @param {Function} string The `toString` result. |
| * @returns {Function} Returns `func`. |
| */ |
| var setToString = shortOut(baseSetToString); |
| |
| module.exports = setToString; |
| |
| },{'./_baseSetToString':123,'./_shortOut':214}],214:[function(require,module,exports){ |
| /** Used to detect hot functions by number of calls within a span of milliseconds. */ |
| var HOT_COUNT = 800, |
| HOT_SPAN = 16; |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeNow = Date.now; |
| |
| /** |
| * Creates a function that'll short out and invoke `identity` instead |
| * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` |
| * milliseconds. |
| * |
| * @private |
| * @param {Function} func The function to restrict. |
| * @returns {Function} Returns the new shortable function. |
| */ |
| function shortOut(func) { |
| var count = 0, |
| lastCalled = 0; |
| |
| return function() { |
| var stamp = nativeNow(), |
| remaining = HOT_SPAN - (stamp - lastCalled); |
| |
| lastCalled = stamp; |
| if (remaining > 0) { |
| if (++count >= HOT_COUNT) { |
| return arguments[0]; |
| } |
| } else { |
| count = 0; |
| } |
| return func.apply(undefined, arguments); |
| }; |
| } |
| |
| module.exports = shortOut; |
| |
| },{}],215:[function(require,module,exports){ |
| var ListCache = require('./_ListCache'); |
| |
| /** |
| * Removes all key-value entries from the stack. |
| * |
| * @private |
| * @name clear |
| * @memberOf Stack |
| */ |
| function stackClear() { |
| this.__data__ = new ListCache; |
| this.size = 0; |
| } |
| |
| module.exports = stackClear; |
| |
| },{'./_ListCache':53}],216:[function(require,module,exports){ |
| /** |
| * Removes `key` and its value from the stack. |
| * |
| * @private |
| * @name delete |
| * @memberOf Stack |
| * @param {string} key The key of the value to remove. |
| * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
| */ |
| function stackDelete(key) { |
| var data = this.__data__, |
| result = data['delete'](key); |
| |
| this.size = data.size; |
| return result; |
| } |
| |
| module.exports = stackDelete; |
| |
| },{}],217:[function(require,module,exports){ |
| /** |
| * Gets the stack value for `key`. |
| * |
| * @private |
| * @name get |
| * @memberOf Stack |
| * @param {string} key The key of the value to get. |
| * @returns {*} Returns the entry value. |
| */ |
| function stackGet(key) { |
| return this.__data__.get(key); |
| } |
| |
| module.exports = stackGet; |
| |
| },{}],218:[function(require,module,exports){ |
| /** |
| * Checks if a stack value for `key` exists. |
| * |
| * @private |
| * @name has |
| * @memberOf Stack |
| * @param {string} key The key of the entry to check. |
| * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
| */ |
| function stackHas(key) { |
| return this.__data__.has(key); |
| } |
| |
| module.exports = stackHas; |
| |
| },{}],219:[function(require,module,exports){ |
| var ListCache = require('./_ListCache'), |
| Map = require('./_Map'), |
| MapCache = require('./_MapCache'); |
| |
| /** Used as the size to enable large array optimizations. */ |
| var LARGE_ARRAY_SIZE = 200; |
| |
| /** |
| * Sets the stack `key` to `value`. |
| * |
| * @private |
| * @name set |
| * @memberOf Stack |
| * @param {string} key The key of the value to set. |
| * @param {*} value The value to set. |
| * @returns {Object} Returns the stack cache instance. |
| */ |
| function stackSet(key, value) { |
| var data = this.__data__; |
| if (data instanceof ListCache) { |
| var pairs = data.__data__; |
| if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { |
| pairs.push([key, value]); |
| this.size = ++data.size; |
| return this; |
| } |
| data = this.__data__ = new MapCache(pairs); |
| } |
| data.set(key, value); |
| this.size = data.size; |
| return this; |
| } |
| |
| module.exports = stackSet; |
| |
| },{'./_ListCache':53,'./_Map':54,'./_MapCache':55}],220:[function(require,module,exports){ |
| /** |
| * A specialized version of `_.indexOf` which performs strict equality |
| * comparisons of values, i.e. `===`. |
| * |
| * @private |
| * @param {Array} array The array to inspect. |
| * @param {*} value The value to search for. |
| * @param {number} fromIndex The index to search from. |
| * @returns {number} Returns the index of the matched value, else `-1`. |
| */ |
| function strictIndexOf(array, value, fromIndex) { |
| var index = fromIndex - 1, |
| length = array.length; |
| |
| while (++index < length) { |
| if (array[index] === value) { |
| return index; |
| } |
| } |
| return -1; |
| } |
| |
| module.exports = strictIndexOf; |
| |
| },{}],221:[function(require,module,exports){ |
| var asciiSize = require('./_asciiSize'), |
| hasUnicode = require('./_hasUnicode'), |
| unicodeSize = require('./_unicodeSize'); |
| |
| /** |
| * Gets the number of symbols in `string`. |
| * |
| * @private |
| * @param {string} string The string to inspect. |
| * @returns {number} Returns the string size. |
| */ |
| function stringSize(string) { |
| return hasUnicode(string) |
| ? unicodeSize(string) |
| : asciiSize(string); |
| } |
| |
| module.exports = stringSize; |
| |
| },{'./_asciiSize':73,'./_hasUnicode':171,'./_unicodeSize':225}],222:[function(require,module,exports){ |
| var memoizeCapped = require('./_memoizeCapped'); |
| |
| /** Used to match property names within property paths. */ |
| var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; |
| |
| /** Used to match backslashes in property paths. */ |
| var reEscapeChar = /\\(\\)?/g; |
| |
| /** |
| * Converts `string` to a property path array. |
| * |
| * @private |
| * @param {string} string The string to convert. |
| * @returns {Array} Returns the property path array. |
| */ |
| var stringToPath = memoizeCapped(function(string) { |
| var result = []; |
| if (string.charCodeAt(0) === 46 /* . */) { |
| result.push(''); |
| } |
| string.replace(rePropName, function(match, number, quote, subString) { |
| result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); |
| }); |
| return result; |
| }); |
| |
| module.exports = stringToPath; |
| |
| },{'./_memoizeCapped':200}],223:[function(require,module,exports){ |
| var isSymbol = require('./isSymbol'); |
| |
| /** Used as references for various `Number` constants. */ |
| var INFINITY = 1 / 0; |
| |
| /** |
| * Converts `value` to a string key if it's not a string or symbol. |
| * |
| * @private |
| * @param {*} value The value to inspect. |
| * @returns {string|symbol} Returns the key. |
| */ |
| function toKey(value) { |
| if (typeof value == 'string' || isSymbol(value)) { |
| return value; |
| } |
| var result = (value + ''); |
| return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; |
| } |
| |
| module.exports = toKey; |
| |
| },{'./isSymbol':256}],224:[function(require,module,exports){ |
| /** Used for built-in method references. */ |
| var funcProto = Function.prototype; |
| |
| /** Used to resolve the decompiled source of functions. */ |
| var funcToString = funcProto.toString; |
| |
| /** |
| * Converts `func` to its source code. |
| * |
| * @private |
| * @param {Function} func The function to convert. |
| * @returns {string} Returns the source code. |
| */ |
| function toSource(func) { |
| if (func != null) { |
| try { |
| return funcToString.call(func); |
| } catch (e) {} |
| try { |
| return (func + ''); |
| } catch (e) {} |
| } |
| return ''; |
| } |
| |
| module.exports = toSource; |
| |
| },{}],225:[function(require,module,exports){ |
| /** Used to compose unicode character classes. */ |
| var rsAstralRange = '\\ud800-\\udfff', |
| rsComboMarksRange = '\\u0300-\\u036f', |
| reComboHalfMarksRange = '\\ufe20-\\ufe2f', |
| rsComboSymbolsRange = '\\u20d0-\\u20ff', |
| rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, |
| rsVarRange = '\\ufe0e\\ufe0f'; |
| |
| /** Used to compose unicode capture groups. */ |
| var rsAstral = '[' + rsAstralRange + ']', |
| rsCombo = '[' + rsComboRange + ']', |
| rsFitz = '\\ud83c[\\udffb-\\udfff]', |
| rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', |
| rsNonAstral = '[^' + rsAstralRange + ']', |
| rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', |
| rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', |
| rsZWJ = '\\u200d'; |
| |
| /** Used to compose unicode regexes. */ |
| var reOptMod = rsModifier + '?', |
| rsOptVar = '[' + rsVarRange + ']?', |
| rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', |
| rsSeq = rsOptVar + reOptMod + rsOptJoin, |
| rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; |
| |
| /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ |
| var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); |
| |
| /** |
| * Gets the size of a Unicode `string`. |
| * |
| * @private |
| * @param {string} string The string inspect. |
| * @returns {number} Returns the string size. |
| */ |
| function unicodeSize(string) { |
| var result = reUnicode.lastIndex = 0; |
| while (reUnicode.test(string)) { |
| ++result; |
| } |
| return result; |
| } |
| |
| module.exports = unicodeSize; |
| |
| },{}],226:[function(require,module,exports){ |
| var baseClone = require('./_baseClone'); |
| |
| /** Used to compose bitmasks for cloning. */ |
| var CLONE_SYMBOLS_FLAG = 4; |
| |
| /** |
| * Creates a shallow clone of `value`. |
| * |
| * **Note:** This method is loosely based on the |
| * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) |
| * and supports cloning arrays, array buffers, booleans, date objects, maps, |
| * numbers, `Object` objects, regexes, sets, strings, symbols, and typed |
| * arrays. The own enumerable properties of `arguments` objects are cloned |
| * as plain objects. An empty object is returned for uncloneable values such |
| * as error objects, functions, DOM nodes, and WeakMaps. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to clone. |
| * @returns {*} Returns the cloned value. |
| * @see _.cloneDeep |
| * @example |
| * |
| * var objects = [{ 'a': 1 }, { 'b': 2 }]; |
| * |
| * var shallow = _.clone(objects); |
| * console.log(shallow[0] === objects[0]); |
| * // => true |
| */ |
| function clone(value) { |
| return baseClone(value, CLONE_SYMBOLS_FLAG); |
| } |
| |
| module.exports = clone; |
| |
| },{'./_baseClone':80}],227:[function(require,module,exports){ |
| var baseClone = require('./_baseClone'); |
| |
| /** Used to compose bitmasks for cloning. */ |
| var CLONE_DEEP_FLAG = 1, |
| CLONE_SYMBOLS_FLAG = 4; |
| |
| /** |
| * This method is like `_.clone` except that it recursively clones `value`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 1.0.0 |
| * @category Lang |
| * @param {*} value The value to recursively clone. |
| * @returns {*} Returns the deep cloned value. |
| * @see _.clone |
| * @example |
| * |
| * var objects = [{ 'a': 1 }, { 'b': 2 }]; |
| * |
| * var deep = _.cloneDeep(objects); |
| * console.log(deep[0] === objects[0]); |
| * // => false |
| */ |
| function cloneDeep(value) { |
| return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); |
| } |
| |
| module.exports = cloneDeep; |
| |
| },{'./_baseClone':80}],228:[function(require,module,exports){ |
| /** |
| * Creates a function that returns `value`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 2.4.0 |
| * @category Util |
| * @param {*} value The value to return from the new function. |
| * @returns {Function} Returns the new constant function. |
| * @example |
| * |
| * var objects = _.times(2, _.constant({ 'a': 1 })); |
| * |
| * console.log(objects); |
| * // => [{ 'a': 1 }, { 'a': 1 }] |
| * |
| * console.log(objects[0] === objects[1]); |
| * // => true |
| */ |
| function constant(value) { |
| return function() { |
| return value; |
| }; |
| } |
| |
| module.exports = constant; |
| |
| },{}],229:[function(require,module,exports){ |
| var baseRest = require('./_baseRest'), |
| eq = require('./eq'), |
| isIterateeCall = require('./_isIterateeCall'), |
| keysIn = require('./keysIn'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Assigns own and inherited enumerable string keyed properties of source |
| * objects to the destination object for all destination properties that |
| * resolve to `undefined`. Source objects are applied from left to right. |
| * Once a property is set, additional values of the same property are ignored. |
| * |
| * **Note:** This method mutates `object`. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Object |
| * @param {Object} object The destination object. |
| * @param {...Object} [sources] The source objects. |
| * @returns {Object} Returns `object`. |
| * @see _.defaultsDeep |
| * @example |
| * |
| * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); |
| * // => { 'a': 1, 'b': 2 } |
| */ |
| var defaults = baseRest(function(object, sources) { |
| object = Object(object); |
| |
| var index = -1; |
| var length = sources.length; |
| var guard = length > 2 ? sources[2] : undefined; |
| |
| if (guard && isIterateeCall(sources[0], sources[1], guard)) { |
| length = 1; |
| } |
| |
| while (++index < length) { |
| var source = sources[index]; |
| var props = keysIn(source); |
| var propsIndex = -1; |
| var propsLength = props.length; |
| |
| while (++propsIndex < propsLength) { |
| var key = props[propsIndex]; |
| var value = object[key]; |
| |
| if (value === undefined || |
| (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { |
| object[key] = source[key]; |
| } |
| } |
| } |
| |
| return object; |
| }); |
| |
| module.exports = defaults; |
| |
| },{'./_baseRest':121,'./_isIterateeCall':182,'./eq':231,'./keysIn':260}],230:[function(require,module,exports){ |
| module.exports = require('./forEach'); |
| |
| },{'./forEach':236}],231:[function(require,module,exports){ |
| /** |
| * Performs a |
| * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
| * comparison between two values to determine if they are equivalent. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to compare. |
| * @param {*} other The other value to compare. |
| * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
| * @example |
| * |
| * var object = { 'a': 1 }; |
| * var other = { 'a': 1 }; |
| * |
| * _.eq(object, object); |
| * // => true |
| * |
| * _.eq(object, other); |
| * // => false |
| * |
| * _.eq('a', 'a'); |
| * // => true |
| * |
| * _.eq('a', Object('a')); |
| * // => false |
| * |
| * _.eq(NaN, NaN); |
| * // => true |
| */ |
| function eq(value, other) { |
| return value === other || (value !== value && other !== other); |
| } |
| |
| module.exports = eq; |
| |
| },{}],232:[function(require,module,exports){ |
| var arrayFilter = require('./_arrayFilter'), |
| baseFilter = require('./_baseFilter'), |
| baseIteratee = require('./_baseIteratee'), |
| isArray = require('./isArray'); |
| |
| /** |
| * Iterates over elements of `collection`, returning an array of all elements |
| * `predicate` returns truthy for. The predicate is invoked with three |
| * arguments: (value, index|key, collection). |
| * |
| * **Note:** Unlike `_.remove`, this method returns a new array. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. |
| * @returns {Array} Returns the new filtered array. |
| * @see _.reject |
| * @example |
| * |
| * var users = [ |
| * { 'user': 'barney', 'age': 36, 'active': true }, |
| * { 'user': 'fred', 'age': 40, 'active': false } |
| * ]; |
| * |
| * _.filter(users, function(o) { return !o.active; }); |
| * // => objects for ['fred'] |
| * |
| * // The `_.matches` iteratee shorthand. |
| * _.filter(users, { 'age': 36, 'active': true }); |
| * // => objects for ['barney'] |
| * |
| * // The `_.matchesProperty` iteratee shorthand. |
| * _.filter(users, ['active', false]); |
| * // => objects for ['fred'] |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.filter(users, 'active'); |
| * // => objects for ['barney'] |
| */ |
| function filter(collection, predicate) { |
| var func = isArray(collection) ? arrayFilter : baseFilter; |
| return func(collection, baseIteratee(predicate, 3)); |
| } |
| |
| module.exports = filter; |
| |
| },{'./_arrayFilter':65,'./_baseFilter':84,'./_baseIteratee':105,'./isArray':243}],233:[function(require,module,exports){ |
| var createFind = require('./_createFind'), |
| findIndex = require('./findIndex'); |
| |
| /** |
| * Iterates over elements of `collection`, returning the first element |
| * `predicate` returns truthy for. The predicate is invoked with three |
| * arguments: (value, index|key, collection). |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object} collection The collection to inspect. |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. |
| * @param {number} [fromIndex=0] The index to search from. |
| * @returns {*} Returns the matched element, else `undefined`. |
| * @example |
| * |
| * var users = [ |
| * { 'user': 'barney', 'age': 36, 'active': true }, |
| * { 'user': 'fred', 'age': 40, 'active': false }, |
| * { 'user': 'pebbles', 'age': 1, 'active': true } |
| * ]; |
| * |
| * _.find(users, function(o) { return o.age < 40; }); |
| * // => object for 'barney' |
| * |
| * // The `_.matches` iteratee shorthand. |
| * _.find(users, { 'age': 1, 'active': true }); |
| * // => object for 'pebbles' |
| * |
| * // The `_.matchesProperty` iteratee shorthand. |
| * _.find(users, ['active', false]); |
| * // => object for 'fred' |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.find(users, 'active'); |
| * // => object for 'barney' |
| */ |
| var find = createFind(findIndex); |
| |
| module.exports = find; |
| |
| },{'./_createFind':150,'./findIndex':234}],234:[function(require,module,exports){ |
| var baseFindIndex = require('./_baseFindIndex'), |
| baseIteratee = require('./_baseIteratee'), |
| toInteger = require('./toInteger'); |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeMax = Math.max; |
| |
| /** |
| * This method is like `_.find` except that it returns the index of the first |
| * element `predicate` returns truthy for instead of the element itself. |
| * |
| * @static |
| * @memberOf _ |
| * @since 1.1.0 |
| * @category Array |
| * @param {Array} array The array to inspect. |
| * @param {Function} [predicate=_.identity] The function invoked per iteration. |
| * @param {number} [fromIndex=0] The index to search from. |
| * @returns {number} Returns the index of the found element, else `-1`. |
| * @example |
| * |
| * var users = [ |
| * { 'user': 'barney', 'active': false }, |
| * { 'user': 'fred', 'active': false }, |
| * { 'user': 'pebbles', 'active': true } |
| * ]; |
| * |
| * _.findIndex(users, function(o) { return o.user == 'barney'; }); |
| * // => 0 |
| * |
| * // The `_.matches` iteratee shorthand. |
| * _.findIndex(users, { 'user': 'fred', 'active': false }); |
| * // => 1 |
| * |
| * // The `_.matchesProperty` iteratee shorthand. |
| * _.findIndex(users, ['active', false]); |
| * // => 0 |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.findIndex(users, 'active'); |
| * // => 2 |
| */ |
| function findIndex(array, predicate, fromIndex) { |
| var length = array == null ? 0 : array.length; |
| if (!length) { |
| return -1; |
| } |
| var index = fromIndex == null ? 0 : toInteger(fromIndex); |
| if (index < 0) { |
| index = nativeMax(length + index, 0); |
| } |
| return baseFindIndex(array, baseIteratee(predicate, 3), index); |
| } |
| |
| module.exports = findIndex; |
| |
| },{'./_baseFindIndex':85,'./_baseIteratee':105,'./toInteger':280}],235:[function(require,module,exports){ |
| var baseFlatten = require('./_baseFlatten'); |
| |
| /** |
| * Flattens `array` a single level deep. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Array |
| * @param {Array} array The array to flatten. |
| * @returns {Array} Returns the new flattened array. |
| * @example |
| * |
| * _.flatten([1, [2, [3, [4]], 5]]); |
| * // => [1, 2, [3, [4]], 5] |
| */ |
| function flatten(array) { |
| var length = array == null ? 0 : array.length; |
| return length ? baseFlatten(array, 1) : []; |
| } |
| |
| module.exports = flatten; |
| |
| },{'./_baseFlatten':86}],236:[function(require,module,exports){ |
| var arrayEach = require('./_arrayEach'), |
| baseEach = require('./_baseEach'), |
| castFunction = require('./_castFunction'), |
| isArray = require('./isArray'); |
| |
| /** |
| * Iterates over elements of `collection` and invokes `iteratee` for each element. |
| * The iteratee is invoked with three arguments: (value, index|key, collection). |
| * Iteratee functions may exit iteration early by explicitly returning `false`. |
| * |
| * **Note:** As with other "Collections" methods, objects with a "length" |
| * property are iterated like arrays. To avoid this behavior use `_.forIn` |
| * or `_.forOwn` for object iteration. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @alias each |
| * @category Collection |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @returns {Array|Object} Returns `collection`. |
| * @see _.forEachRight |
| * @example |
| * |
| * _.forEach([1, 2], function(value) { |
| * console.log(value); |
| * }); |
| * // => Logs `1` then `2`. |
| * |
| * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { |
| * console.log(key); |
| * }); |
| * // => Logs 'a' then 'b' (iteration order is not guaranteed). |
| */ |
| function forEach(collection, iteratee) { |
| var func = isArray(collection) ? arrayEach : baseEach; |
| return func(collection, castFunction(iteratee)); |
| } |
| |
| module.exports = forEach; |
| |
| },{'./_arrayEach':64,'./_baseEach':82,'./_castFunction':132,'./isArray':243}],237:[function(require,module,exports){ |
| var baseFor = require('./_baseFor'), |
| castFunction = require('./_castFunction'), |
| keysIn = require('./keysIn'); |
| |
| /** |
| * Iterates over own and inherited enumerable string keyed properties of an |
| * object and invokes `iteratee` for each property. The iteratee is invoked |
| * with three arguments: (value, key, object). Iteratee functions may exit |
| * iteration early by explicitly returning `false`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.3.0 |
| * @category Object |
| * @param {Object} object The object to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @returns {Object} Returns `object`. |
| * @see _.forInRight |
| * @example |
| * |
| * function Foo() { |
| * this.a = 1; |
| * this.b = 2; |
| * } |
| * |
| * Foo.prototype.c = 3; |
| * |
| * _.forIn(new Foo, function(value, key) { |
| * console.log(key); |
| * }); |
| * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). |
| */ |
| function forIn(object, iteratee) { |
| return object == null |
| ? object |
| : baseFor(object, castFunction(iteratee), keysIn); |
| } |
| |
| module.exports = forIn; |
| |
| },{'./_baseFor':87,'./_castFunction':132,'./keysIn':260}],238:[function(require,module,exports){ |
| var baseGet = require('./_baseGet'); |
| |
| /** |
| * Gets the value at `path` of `object`. If the resolved value is |
| * `undefined`, the `defaultValue` is returned in its place. |
| * |
| * @static |
| * @memberOf _ |
| * @since 3.7.0 |
| * @category Object |
| * @param {Object} object The object to query. |
| * @param {Array|string} path The path of the property to get. |
| * @param {*} [defaultValue] The value returned for `undefined` resolved values. |
| * @returns {*} Returns the resolved value. |
| * @example |
| * |
| * var object = { 'a': [{ 'b': { 'c': 3 } }] }; |
| * |
| * _.get(object, 'a[0].b.c'); |
| * // => 3 |
| * |
| * _.get(object, ['a', '0', 'b', 'c']); |
| * // => 3 |
| * |
| * _.get(object, 'a.b.c', 'default'); |
| * // => 'default' |
| */ |
| function get(object, path, defaultValue) { |
| var result = object == null ? undefined : baseGet(object, path); |
| return result === undefined ? defaultValue : result; |
| } |
| |
| module.exports = get; |
| |
| },{'./_baseGet':89}],239:[function(require,module,exports){ |
| var baseHas = require('./_baseHas'), |
| hasPath = require('./_hasPath'); |
| |
| /** |
| * Checks if `path` is a direct property of `object`. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Object |
| * @param {Object} object The object to query. |
| * @param {Array|string} path The path to check. |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. |
| * @example |
| * |
| * var object = { 'a': { 'b': 2 } }; |
| * var other = _.create({ 'a': _.create({ 'b': 2 }) }); |
| * |
| * _.has(object, 'a'); |
| * // => true |
| * |
| * _.has(object, 'a.b'); |
| * // => true |
| * |
| * _.has(object, ['a', 'b']); |
| * // => true |
| * |
| * _.has(other, 'a'); |
| * // => false |
| */ |
| function has(object, path) { |
| return object != null && hasPath(object, path, baseHas); |
| } |
| |
| module.exports = has; |
| |
| },{'./_baseHas':93,'./_hasPath':170}],240:[function(require,module,exports){ |
| var baseHasIn = require('./_baseHasIn'), |
| hasPath = require('./_hasPath'); |
| |
| /** |
| * Checks if `path` is a direct or inherited property of `object`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Object |
| * @param {Object} object The object to query. |
| * @param {Array|string} path The path to check. |
| * @returns {boolean} Returns `true` if `path` exists, else `false`. |
| * @example |
| * |
| * var object = _.create({ 'a': _.create({ 'b': 2 }) }); |
| * |
| * _.hasIn(object, 'a'); |
| * // => true |
| * |
| * _.hasIn(object, 'a.b'); |
| * // => true |
| * |
| * _.hasIn(object, ['a', 'b']); |
| * // => true |
| * |
| * _.hasIn(object, 'b'); |
| * // => false |
| */ |
| function hasIn(object, path) { |
| return object != null && hasPath(object, path, baseHasIn); |
| } |
| |
| module.exports = hasIn; |
| |
| },{'./_baseHasIn':94,'./_hasPath':170}],241:[function(require,module,exports){ |
| /** |
| * This method returns the first argument it receives. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Util |
| * @param {*} value Any value. |
| * @returns {*} Returns `value`. |
| * @example |
| * |
| * var object = { 'a': 1 }; |
| * |
| * console.log(_.identity(object) === object); |
| * // => true |
| */ |
| function identity(value) { |
| return value; |
| } |
| |
| module.exports = identity; |
| |
| },{}],242:[function(require,module,exports){ |
| var baseIsArguments = require('./_baseIsArguments'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** Built-in value references. */ |
| var propertyIsEnumerable = objectProto.propertyIsEnumerable; |
| |
| /** |
| * Checks if `value` is likely an `arguments` object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is an `arguments` object, |
| * else `false`. |
| * @example |
| * |
| * _.isArguments(function() { return arguments; }()); |
| * // => true |
| * |
| * _.isArguments([1, 2, 3]); |
| * // => false |
| */ |
| var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { |
| return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && |
| !propertyIsEnumerable.call(value, 'callee'); |
| }; |
| |
| module.exports = isArguments; |
| |
| },{'./_baseIsArguments':96,'./isObjectLike':252}],243:[function(require,module,exports){ |
| /** |
| * Checks if `value` is classified as an `Array` object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is an array, else `false`. |
| * @example |
| * |
| * _.isArray([1, 2, 3]); |
| * // => true |
| * |
| * _.isArray(document.body.children); |
| * // => false |
| * |
| * _.isArray('abc'); |
| * // => false |
| * |
| * _.isArray(_.noop); |
| * // => false |
| */ |
| var isArray = Array.isArray; |
| |
| module.exports = isArray; |
| |
| },{}],244:[function(require,module,exports){ |
| var isFunction = require('./isFunction'), |
| isLength = require('./isLength'); |
| |
| /** |
| * Checks if `value` is array-like. A value is considered array-like if it's |
| * not a function and has a `value.length` that's an integer greater than or |
| * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is array-like, else `false`. |
| * @example |
| * |
| * _.isArrayLike([1, 2, 3]); |
| * // => true |
| * |
| * _.isArrayLike(document.body.children); |
| * // => true |
| * |
| * _.isArrayLike('abc'); |
| * // => true |
| * |
| * _.isArrayLike(_.noop); |
| * // => false |
| */ |
| function isArrayLike(value) { |
| return value != null && isLength(value.length) && !isFunction(value); |
| } |
| |
| module.exports = isArrayLike; |
| |
| },{'./isFunction':248,'./isLength':249}],245:[function(require,module,exports){ |
| var isArrayLike = require('./isArrayLike'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** |
| * This method is like `_.isArrayLike` except that it also checks if `value` |
| * is an object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is an array-like object, |
| * else `false`. |
| * @example |
| * |
| * _.isArrayLikeObject([1, 2, 3]); |
| * // => true |
| * |
| * _.isArrayLikeObject(document.body.children); |
| * // => true |
| * |
| * _.isArrayLikeObject('abc'); |
| * // => false |
| * |
| * _.isArrayLikeObject(_.noop); |
| * // => false |
| */ |
| function isArrayLikeObject(value) { |
| return isObjectLike(value) && isArrayLike(value); |
| } |
| |
| module.exports = isArrayLikeObject; |
| |
| },{'./isArrayLike':244,'./isObjectLike':252}],246:[function(require,module,exports){ |
| var root = require('./_root'), |
| stubFalse = require('./stubFalse'); |
| |
| /** Detect free variable `exports`. */ |
| var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; |
| |
| /** Detect free variable `module`. */ |
| var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; |
| |
| /** Detect the popular CommonJS extension `module.exports`. */ |
| var moduleExports = freeModule && freeModule.exports === freeExports; |
| |
| /** Built-in value references. */ |
| var Buffer = moduleExports ? root.Buffer : undefined; |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; |
| |
| /** |
| * Checks if `value` is a buffer. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.3.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. |
| * @example |
| * |
| * _.isBuffer(new Buffer(2)); |
| * // => true |
| * |
| * _.isBuffer(new Uint8Array(2)); |
| * // => false |
| */ |
| var isBuffer = nativeIsBuffer || stubFalse; |
| |
| module.exports = isBuffer; |
| |
| },{'./_root':208,'./stubFalse':278}],247:[function(require,module,exports){ |
| var baseKeys = require('./_baseKeys'), |
| getTag = require('./_getTag'), |
| isArguments = require('./isArguments'), |
| isArray = require('./isArray'), |
| isArrayLike = require('./isArrayLike'), |
| isBuffer = require('./isBuffer'), |
| isPrototype = require('./_isPrototype'), |
| isTypedArray = require('./isTypedArray'); |
| |
| /** `Object#toString` result references. */ |
| var mapTag = '[object Map]', |
| setTag = '[object Set]'; |
| |
| /** Used for built-in method references. */ |
| var objectProto = Object.prototype; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** |
| * Checks if `value` is an empty object, collection, map, or set. |
| * |
| * Objects are considered empty if they have no own enumerable string keyed |
| * properties. |
| * |
| * Array-like values such as `arguments` objects, arrays, buffers, strings, or |
| * jQuery-like collections are considered empty if they have a `length` of `0`. |
| * Similarly, maps and sets are considered empty if they have a `size` of `0`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is empty, else `false`. |
| * @example |
| * |
| * _.isEmpty(null); |
| * // => true |
| * |
| * _.isEmpty(true); |
| * // => true |
| * |
| * _.isEmpty(1); |
| * // => true |
| * |
| * _.isEmpty([1, 2, 3]); |
| * // => false |
| * |
| * _.isEmpty({ 'a': 1 }); |
| * // => false |
| */ |
| function isEmpty(value) { |
| if (value == null) { |
| return true; |
| } |
| if (isArrayLike(value) && |
| (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || |
| isBuffer(value) || isTypedArray(value) || isArguments(value))) { |
| return !value.length; |
| } |
| var tag = getTag(value); |
| if (tag == mapTag || tag == setTag) { |
| return !value.size; |
| } |
| if (isPrototype(value)) { |
| return !baseKeys(value).length; |
| } |
| for (var key in value) { |
| if (hasOwnProperty.call(value, key)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| module.exports = isEmpty; |
| |
| },{'./_baseKeys':106,'./_getTag':168,'./_isPrototype':186,'./isArguments':242,'./isArray':243,'./isArrayLike':244,'./isBuffer':246,'./isTypedArray':257}],248:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| isObject = require('./isObject'); |
| |
| /** `Object#toString` result references. */ |
| var asyncTag = '[object AsyncFunction]', |
| funcTag = '[object Function]', |
| genTag = '[object GeneratorFunction]', |
| proxyTag = '[object Proxy]'; |
| |
| /** |
| * Checks if `value` is classified as a `Function` object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a function, else `false`. |
| * @example |
| * |
| * _.isFunction(_); |
| * // => true |
| * |
| * _.isFunction(/abc/); |
| * // => false |
| */ |
| function isFunction(value) { |
| if (!isObject(value)) { |
| return false; |
| } |
| // The use of `Object#toString` avoids issues with the `typeof` operator |
| // in Safari 9 which returns 'object' for typed arrays and other constructors. |
| var tag = baseGetTag(value); |
| return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; |
| } |
| |
| module.exports = isFunction; |
| |
| },{'./_baseGetTag':91,'./isObject':251}],249:[function(require,module,exports){ |
| /** Used as references for various `Number` constants. */ |
| var MAX_SAFE_INTEGER = 9007199254740991; |
| |
| /** |
| * Checks if `value` is a valid array-like length. |
| * |
| * **Note:** This method is loosely based on |
| * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. |
| * @example |
| * |
| * _.isLength(3); |
| * // => true |
| * |
| * _.isLength(Number.MIN_VALUE); |
| * // => false |
| * |
| * _.isLength(Infinity); |
| * // => false |
| * |
| * _.isLength('3'); |
| * // => false |
| */ |
| function isLength(value) { |
| return typeof value == 'number' && |
| value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; |
| } |
| |
| module.exports = isLength; |
| |
| },{}],250:[function(require,module,exports){ |
| var baseIsMap = require('./_baseIsMap'), |
| baseUnary = require('./_baseUnary'), |
| nodeUtil = require('./_nodeUtil'); |
| |
| /* Node.js helper references. */ |
| var nodeIsMap = nodeUtil && nodeUtil.isMap; |
| |
| /** |
| * Checks if `value` is classified as a `Map` object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.3.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a map, else `false`. |
| * @example |
| * |
| * _.isMap(new Map); |
| * // => true |
| * |
| * _.isMap(new WeakMap); |
| * // => false |
| */ |
| var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; |
| |
| module.exports = isMap; |
| |
| },{'./_baseIsMap':99,'./_baseUnary':127,'./_nodeUtil':204}],251:[function(require,module,exports){ |
| /** |
| * Checks if `value` is the |
| * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) |
| * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is an object, else `false`. |
| * @example |
| * |
| * _.isObject({}); |
| * // => true |
| * |
| * _.isObject([1, 2, 3]); |
| * // => true |
| * |
| * _.isObject(_.noop); |
| * // => true |
| * |
| * _.isObject(null); |
| * // => false |
| */ |
| function isObject(value) { |
| var type = typeof value; |
| return value != null && (type == 'object' || type == 'function'); |
| } |
| |
| module.exports = isObject; |
| |
| },{}],252:[function(require,module,exports){ |
| /** |
| * Checks if `value` is object-like. A value is object-like if it's not `null` |
| * and has a `typeof` result of "object". |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is object-like, else `false`. |
| * @example |
| * |
| * _.isObjectLike({}); |
| * // => true |
| * |
| * _.isObjectLike([1, 2, 3]); |
| * // => true |
| * |
| * _.isObjectLike(_.noop); |
| * // => false |
| * |
| * _.isObjectLike(null); |
| * // => false |
| */ |
| function isObjectLike(value) { |
| return value != null && typeof value == 'object'; |
| } |
| |
| module.exports = isObjectLike; |
| |
| },{}],253:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| getPrototype = require('./_getPrototype'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var objectTag = '[object Object]'; |
| |
| /** Used for built-in method references. */ |
| var funcProto = Function.prototype, |
| objectProto = Object.prototype; |
| |
| /** Used to resolve the decompiled source of functions. */ |
| var funcToString = funcProto.toString; |
| |
| /** Used to check objects for own properties. */ |
| var hasOwnProperty = objectProto.hasOwnProperty; |
| |
| /** Used to infer the `Object` constructor. */ |
| var objectCtorString = funcToString.call(Object); |
| |
| /** |
| * Checks if `value` is a plain object, that is, an object created by the |
| * `Object` constructor or one with a `[[Prototype]]` of `null`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.8.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. |
| * @example |
| * |
| * function Foo() { |
| * this.a = 1; |
| * } |
| * |
| * _.isPlainObject(new Foo); |
| * // => false |
| * |
| * _.isPlainObject([1, 2, 3]); |
| * // => false |
| * |
| * _.isPlainObject({ 'x': 0, 'y': 0 }); |
| * // => true |
| * |
| * _.isPlainObject(Object.create(null)); |
| * // => true |
| */ |
| function isPlainObject(value) { |
| if (!isObjectLike(value) || baseGetTag(value) != objectTag) { |
| return false; |
| } |
| var proto = getPrototype(value); |
| if (proto === null) { |
| return true; |
| } |
| var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; |
| return typeof Ctor == 'function' && Ctor instanceof Ctor && |
| funcToString.call(Ctor) == objectCtorString; |
| } |
| |
| module.exports = isPlainObject; |
| |
| },{'./_baseGetTag':91,'./_getPrototype':164,'./isObjectLike':252}],254:[function(require,module,exports){ |
| var baseIsSet = require('./_baseIsSet'), |
| baseUnary = require('./_baseUnary'), |
| nodeUtil = require('./_nodeUtil'); |
| |
| /* Node.js helper references. */ |
| var nodeIsSet = nodeUtil && nodeUtil.isSet; |
| |
| /** |
| * Checks if `value` is classified as a `Set` object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.3.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a set, else `false`. |
| * @example |
| * |
| * _.isSet(new Set); |
| * // => true |
| * |
| * _.isSet(new WeakSet); |
| * // => false |
| */ |
| var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; |
| |
| module.exports = isSet; |
| |
| },{'./_baseIsSet':103,'./_baseUnary':127,'./_nodeUtil':204}],255:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| isArray = require('./isArray'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var stringTag = '[object String]'; |
| |
| /** |
| * Checks if `value` is classified as a `String` primitive or object. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a string, else `false`. |
| * @example |
| * |
| * _.isString('abc'); |
| * // => true |
| * |
| * _.isString(1); |
| * // => false |
| */ |
| function isString(value) { |
| return typeof value == 'string' || |
| (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); |
| } |
| |
| module.exports = isString; |
| |
| },{'./_baseGetTag':91,'./isArray':243,'./isObjectLike':252}],256:[function(require,module,exports){ |
| var baseGetTag = require('./_baseGetTag'), |
| isObjectLike = require('./isObjectLike'); |
| |
| /** `Object#toString` result references. */ |
| var symbolTag = '[object Symbol]'; |
| |
| /** |
| * Checks if `value` is classified as a `Symbol` primitive or object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. |
| * @example |
| * |
| * _.isSymbol(Symbol.iterator); |
| * // => true |
| * |
| * _.isSymbol('abc'); |
| * // => false |
| */ |
| function isSymbol(value) { |
| return typeof value == 'symbol' || |
| (isObjectLike(value) && baseGetTag(value) == symbolTag); |
| } |
| |
| module.exports = isSymbol; |
| |
| },{'./_baseGetTag':91,'./isObjectLike':252}],257:[function(require,module,exports){ |
| var baseIsTypedArray = require('./_baseIsTypedArray'), |
| baseUnary = require('./_baseUnary'), |
| nodeUtil = require('./_nodeUtil'); |
| |
| /* Node.js helper references. */ |
| var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; |
| |
| /** |
| * Checks if `value` is classified as a typed array. |
| * |
| * @static |
| * @memberOf _ |
| * @since 3.0.0 |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. |
| * @example |
| * |
| * _.isTypedArray(new Uint8Array); |
| * // => true |
| * |
| * _.isTypedArray([]); |
| * // => false |
| */ |
| var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; |
| |
| module.exports = isTypedArray; |
| |
| },{'./_baseIsTypedArray':104,'./_baseUnary':127,'./_nodeUtil':204}],258:[function(require,module,exports){ |
| /** |
| * Checks if `value` is `undefined`. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Lang |
| * @param {*} value The value to check. |
| * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. |
| * @example |
| * |
| * _.isUndefined(void 0); |
| * // => true |
| * |
| * _.isUndefined(null); |
| * // => false |
| */ |
| function isUndefined(value) { |
| return value === undefined; |
| } |
| |
| module.exports = isUndefined; |
| |
| },{}],259:[function(require,module,exports){ |
| var arrayLikeKeys = require('./_arrayLikeKeys'), |
| baseKeys = require('./_baseKeys'), |
| isArrayLike = require('./isArrayLike'); |
| |
| /** |
| * Creates an array of the own enumerable property names of `object`. |
| * |
| * **Note:** Non-object values are coerced to objects. See the |
| * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) |
| * for more details. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Object |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names. |
| * @example |
| * |
| * function Foo() { |
| * this.a = 1; |
| * this.b = 2; |
| * } |
| * |
| * Foo.prototype.c = 3; |
| * |
| * _.keys(new Foo); |
| * // => ['a', 'b'] (iteration order is not guaranteed) |
| * |
| * _.keys('hi'); |
| * // => ['0', '1'] |
| */ |
| function keys(object) { |
| return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); |
| } |
| |
| module.exports = keys; |
| |
| },{'./_arrayLikeKeys':68,'./_baseKeys':106,'./isArrayLike':244}],260:[function(require,module,exports){ |
| var arrayLikeKeys = require('./_arrayLikeKeys'), |
| baseKeysIn = require('./_baseKeysIn'), |
| isArrayLike = require('./isArrayLike'); |
| |
| /** |
| * Creates an array of the own and inherited enumerable property names of `object`. |
| * |
| * **Note:** Non-object values are coerced to objects. |
| * |
| * @static |
| * @memberOf _ |
| * @since 3.0.0 |
| * @category Object |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property names. |
| * @example |
| * |
| * function Foo() { |
| * this.a = 1; |
| * this.b = 2; |
| * } |
| * |
| * Foo.prototype.c = 3; |
| * |
| * _.keysIn(new Foo); |
| * // => ['a', 'b', 'c'] (iteration order is not guaranteed) |
| */ |
| function keysIn(object) { |
| return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); |
| } |
| |
| module.exports = keysIn; |
| |
| },{'./_arrayLikeKeys':68,'./_baseKeysIn':107,'./isArrayLike':244}],261:[function(require,module,exports){ |
| /** |
| * Gets the last element of `array`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Array |
| * @param {Array} array The array to query. |
| * @returns {*} Returns the last element of `array`. |
| * @example |
| * |
| * _.last([1, 2, 3]); |
| * // => 3 |
| */ |
| function last(array) { |
| var length = array == null ? 0 : array.length; |
| return length ? array[length - 1] : undefined; |
| } |
| |
| module.exports = last; |
| |
| },{}],262:[function(require,module,exports){ |
| var arrayMap = require('./_arrayMap'), |
| baseIteratee = require('./_baseIteratee'), |
| baseMap = require('./_baseMap'), |
| isArray = require('./isArray'); |
| |
| /** |
| * Creates an array of values by running each element in `collection` thru |
| * `iteratee`. The iteratee is invoked with three arguments: |
| * (value, index|key, collection). |
| * |
| * Many lodash methods are guarded to work as iteratees for methods like |
| * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. |
| * |
| * The guarded methods are: |
| * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, |
| * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, |
| * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, |
| * `template`, `trim`, `trimEnd`, `trimStart`, and `words` |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @returns {Array} Returns the new mapped array. |
| * @example |
| * |
| * function square(n) { |
| * return n * n; |
| * } |
| * |
| * _.map([4, 8], square); |
| * // => [16, 64] |
| * |
| * _.map({ 'a': 4, 'b': 8 }, square); |
| * // => [16, 64] (iteration order is not guaranteed) |
| * |
| * var users = [ |
| * { 'user': 'barney' }, |
| * { 'user': 'fred' } |
| * ]; |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.map(users, 'user'); |
| * // => ['barney', 'fred'] |
| */ |
| function map(collection, iteratee) { |
| var func = isArray(collection) ? arrayMap : baseMap; |
| return func(collection, baseIteratee(iteratee, 3)); |
| } |
| |
| module.exports = map; |
| |
| },{'./_arrayMap':69,'./_baseIteratee':105,'./_baseMap':109,'./isArray':243}],263:[function(require,module,exports){ |
| var baseAssignValue = require('./_baseAssignValue'), |
| baseForOwn = require('./_baseForOwn'), |
| baseIteratee = require('./_baseIteratee'); |
| |
| /** |
| * Creates an object with the same keys as `object` and values generated |
| * by running each own enumerable string keyed property of `object` thru |
| * `iteratee`. The iteratee is invoked with three arguments: |
| * (value, key, object). |
| * |
| * @static |
| * @memberOf _ |
| * @since 2.4.0 |
| * @category Object |
| * @param {Object} object The object to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @returns {Object} Returns the new mapped object. |
| * @see _.mapKeys |
| * @example |
| * |
| * var users = { |
| * 'fred': { 'user': 'fred', 'age': 40 }, |
| * 'pebbles': { 'user': 'pebbles', 'age': 1 } |
| * }; |
| * |
| * _.mapValues(users, function(o) { return o.age; }); |
| * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.mapValues(users, 'age'); |
| * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) |
| */ |
| function mapValues(object, iteratee) { |
| var result = {}; |
| iteratee = baseIteratee(iteratee, 3); |
| |
| baseForOwn(object, function(value, key, object) { |
| baseAssignValue(result, key, iteratee(value, key, object)); |
| }); |
| return result; |
| } |
| |
| module.exports = mapValues; |
| |
| },{'./_baseAssignValue':79,'./_baseForOwn':88,'./_baseIteratee':105}],264:[function(require,module,exports){ |
| var baseExtremum = require('./_baseExtremum'), |
| baseGt = require('./_baseGt'), |
| identity = require('./identity'); |
| |
| /** |
| * Computes the maximum value of `array`. If `array` is empty or falsey, |
| * `undefined` is returned. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Math |
| * @param {Array} array The array to iterate over. |
| * @returns {*} Returns the maximum value. |
| * @example |
| * |
| * _.max([4, 2, 8, 6]); |
| * // => 8 |
| * |
| * _.max([]); |
| * // => undefined |
| */ |
| function max(array) { |
| return (array && array.length) |
| ? baseExtremum(array, identity, baseGt) |
| : undefined; |
| } |
| |
| module.exports = max; |
| |
| },{'./_baseExtremum':83,'./_baseGt':92,'./identity':241}],265:[function(require,module,exports){ |
| var MapCache = require('./_MapCache'); |
| |
| /** Error message constants. */ |
| var FUNC_ERROR_TEXT = 'Expected a function'; |
| |
| /** |
| * Creates a function that memoizes the result of `func`. If `resolver` is |
| * provided, it determines the cache key for storing the result based on the |
| * arguments provided to the memoized function. By default, the first argument |
| * provided to the memoized function is used as the map cache key. The `func` |
| * is invoked with the `this` binding of the memoized function. |
| * |
| * **Note:** The cache is exposed as the `cache` property on the memoized |
| * function. Its creation may be customized by replacing the `_.memoize.Cache` |
| * constructor with one whose instances implement the |
| * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) |
| * method interface of `clear`, `delete`, `get`, `has`, and `set`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Function |
| * @param {Function} func The function to have its output memoized. |
| * @param {Function} [resolver] The function to resolve the cache key. |
| * @returns {Function} Returns the new memoized function. |
| * @example |
| * |
| * var object = { 'a': 1, 'b': 2 }; |
| * var other = { 'c': 3, 'd': 4 }; |
| * |
| * var values = _.memoize(_.values); |
| * values(object); |
| * // => [1, 2] |
| * |
| * values(other); |
| * // => [3, 4] |
| * |
| * object.a = 2; |
| * values(object); |
| * // => [1, 2] |
| * |
| * // Modify the result cache. |
| * values.cache.set(object, ['a', 'b']); |
| * values(object); |
| * // => ['a', 'b'] |
| * |
| * // Replace `_.memoize.Cache`. |
| * _.memoize.Cache = WeakMap; |
| */ |
| function memoize(func, resolver) { |
| if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { |
| throw new TypeError(FUNC_ERROR_TEXT); |
| } |
| var memoized = function() { |
| var args = arguments, |
| key = resolver ? resolver.apply(this, args) : args[0], |
| cache = memoized.cache; |
| |
| if (cache.has(key)) { |
| return cache.get(key); |
| } |
| var result = func.apply(this, args); |
| memoized.cache = cache.set(key, result) || cache; |
| return result; |
| }; |
| memoized.cache = new (memoize.Cache || MapCache); |
| return memoized; |
| } |
| |
| // Expose `MapCache`. |
| memoize.Cache = MapCache; |
| |
| module.exports = memoize; |
| |
| },{'./_MapCache':55}],266:[function(require,module,exports){ |
| var baseMerge = require('./_baseMerge'), |
| createAssigner = require('./_createAssigner'); |
| |
| /** |
| * This method is like `_.assign` except that it recursively merges own and |
| * inherited enumerable string keyed properties of source objects into the |
| * destination object. Source properties that resolve to `undefined` are |
| * skipped if a destination value exists. Array and plain object properties |
| * are merged recursively. Other objects and value types are overridden by |
| * assignment. Source objects are applied from left to right. Subsequent |
| * sources overwrite property assignments of previous sources. |
| * |
| * **Note:** This method mutates `object`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.5.0 |
| * @category Object |
| * @param {Object} object The destination object. |
| * @param {...Object} [sources] The source objects. |
| * @returns {Object} Returns `object`. |
| * @example |
| * |
| * var object = { |
| * 'a': [{ 'b': 2 }, { 'd': 4 }] |
| * }; |
| * |
| * var other = { |
| * 'a': [{ 'c': 3 }, { 'e': 5 }] |
| * }; |
| * |
| * _.merge(object, other); |
| * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } |
| */ |
| var merge = createAssigner(function(object, source, srcIndex) { |
| baseMerge(object, source, srcIndex); |
| }); |
| |
| module.exports = merge; |
| |
| },{'./_baseMerge':112,'./_createAssigner':147}],267:[function(require,module,exports){ |
| var baseExtremum = require('./_baseExtremum'), |
| baseLt = require('./_baseLt'), |
| identity = require('./identity'); |
| |
| /** |
| * Computes the minimum value of `array`. If `array` is empty or falsey, |
| * `undefined` is returned. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Math |
| * @param {Array} array The array to iterate over. |
| * @returns {*} Returns the minimum value. |
| * @example |
| * |
| * _.min([4, 2, 8, 6]); |
| * // => 2 |
| * |
| * _.min([]); |
| * // => undefined |
| */ |
| function min(array) { |
| return (array && array.length) |
| ? baseExtremum(array, identity, baseLt) |
| : undefined; |
| } |
| |
| module.exports = min; |
| |
| },{'./_baseExtremum':83,'./_baseLt':108,'./identity':241}],268:[function(require,module,exports){ |
| var baseExtremum = require('./_baseExtremum'), |
| baseIteratee = require('./_baseIteratee'), |
| baseLt = require('./_baseLt'); |
| |
| /** |
| * This method is like `_.min` except that it accepts `iteratee` which is |
| * invoked for each element in `array` to generate the criterion by which |
| * the value is ranked. The iteratee is invoked with one argument: (value). |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Math |
| * @param {Array} array The array to iterate over. |
| * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
| * @returns {*} Returns the minimum value. |
| * @example |
| * |
| * var objects = [{ 'n': 1 }, { 'n': 2 }]; |
| * |
| * _.minBy(objects, function(o) { return o.n; }); |
| * // => { 'n': 1 } |
| * |
| * // The `_.property` iteratee shorthand. |
| * _.minBy(objects, 'n'); |
| * // => { 'n': 1 } |
| */ |
| function minBy(array, iteratee) { |
| return (array && array.length) |
| ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) |
| : undefined; |
| } |
| |
| module.exports = minBy; |
| |
| },{'./_baseExtremum':83,'./_baseIteratee':105,'./_baseLt':108}],269:[function(require,module,exports){ |
| /** |
| * This method returns `undefined`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 2.3.0 |
| * @category Util |
| * @example |
| * |
| * _.times(2, _.noop); |
| * // => [undefined, undefined] |
| */ |
| function noop() { |
| // No operation performed. |
| } |
| |
| module.exports = noop; |
| |
| },{}],270:[function(require,module,exports){ |
| var root = require('./_root'); |
| |
| /** |
| * Gets the timestamp of the number of milliseconds that have elapsed since |
| * the Unix epoch (1 January 1970 00:00:00 UTC). |
| * |
| * @static |
| * @memberOf _ |
| * @since 2.4.0 |
| * @category Date |
| * @returns {number} Returns the timestamp. |
| * @example |
| * |
| * _.defer(function(stamp) { |
| * console.log(_.now() - stamp); |
| * }, _.now()); |
| * // => Logs the number of milliseconds it took for the deferred invocation. |
| */ |
| var now = function() { |
| return root.Date.now(); |
| }; |
| |
| module.exports = now; |
| |
| },{'./_root':208}],271:[function(require,module,exports){ |
| var basePick = require('./_basePick'), |
| flatRest = require('./_flatRest'); |
| |
| /** |
| * Creates an object composed of the picked `object` properties. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Object |
| * @param {Object} object The source object. |
| * @param {...(string|string[])} [paths] The property paths to pick. |
| * @returns {Object} Returns the new object. |
| * @example |
| * |
| * var object = { 'a': 1, 'b': '2', 'c': 3 }; |
| * |
| * _.pick(object, ['a', 'c']); |
| * // => { 'a': 1, 'c': 3 } |
| */ |
| var pick = flatRest(function(object, paths) { |
| return object == null ? {} : basePick(object, paths); |
| }); |
| |
| module.exports = pick; |
| |
| },{'./_basePick':115,'./_flatRest':157}],272:[function(require,module,exports){ |
| var baseProperty = require('./_baseProperty'), |
| basePropertyDeep = require('./_basePropertyDeep'), |
| isKey = require('./_isKey'), |
| toKey = require('./_toKey'); |
| |
| /** |
| * Creates a function that returns the value at `path` of a given object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 2.4.0 |
| * @category Util |
| * @param {Array|string} path The path of the property to get. |
| * @returns {Function} Returns the new accessor function. |
| * @example |
| * |
| * var objects = [ |
| * { 'a': { 'b': 2 } }, |
| * { 'a': { 'b': 1 } } |
| * ]; |
| * |
| * _.map(objects, _.property('a.b')); |
| * // => [2, 1] |
| * |
| * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); |
| * // => [1, 2] |
| */ |
| function property(path) { |
| return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); |
| } |
| |
| module.exports = property; |
| |
| },{'./_baseProperty':117,'./_basePropertyDeep':118,'./_isKey':183,'./_toKey':223}],273:[function(require,module,exports){ |
| var createRange = require('./_createRange'); |
| |
| /** |
| * Creates an array of numbers (positive and/or negative) progressing from |
| * `start` up to, but not including, `end`. A step of `-1` is used if a negative |
| * `start` is specified without an `end` or `step`. If `end` is not specified, |
| * it's set to `start` with `start` then set to `0`. |
| * |
| * **Note:** JavaScript follows the IEEE-754 standard for resolving |
| * floating-point values which can produce unexpected results. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Util |
| * @param {number} [start=0] The start of the range. |
| * @param {number} end The end of the range. |
| * @param {number} [step=1] The value to increment or decrement by. |
| * @returns {Array} Returns the range of numbers. |
| * @see _.inRange, _.rangeRight |
| * @example |
| * |
| * _.range(4); |
| * // => [0, 1, 2, 3] |
| * |
| * _.range(-4); |
| * // => [0, -1, -2, -3] |
| * |
| * _.range(1, 5); |
| * // => [1, 2, 3, 4] |
| * |
| * _.range(0, 20, 5); |
| * // => [0, 5, 10, 15] |
| * |
| * _.range(0, -4, -1); |
| * // => [0, -1, -2, -3] |
| * |
| * _.range(1, 4, 0); |
| * // => [1, 1, 1] |
| * |
| * _.range(0); |
| * // => [] |
| */ |
| var range = createRange(); |
| |
| module.exports = range; |
| |
| },{'./_createRange':151}],274:[function(require,module,exports){ |
| var arrayReduce = require('./_arrayReduce'), |
| baseEach = require('./_baseEach'), |
| baseIteratee = require('./_baseIteratee'), |
| baseReduce = require('./_baseReduce'), |
| isArray = require('./isArray'); |
| |
| /** |
| * Reduces `collection` to a value which is the accumulated result of running |
| * each element in `collection` thru `iteratee`, where each successive |
| * invocation is supplied the return value of the previous. If `accumulator` |
| * is not given, the first element of `collection` is used as the initial |
| * value. The iteratee is invoked with four arguments: |
| * (accumulator, value, index|key, collection). |
| * |
| * Many lodash methods are guarded to work as iteratees for methods like |
| * `_.reduce`, `_.reduceRight`, and `_.transform`. |
| * |
| * The guarded methods are: |
| * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, |
| * and `sortBy` |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @param {*} [accumulator] The initial value. |
| * @returns {*} Returns the accumulated value. |
| * @see _.reduceRight |
| * @example |
| * |
| * _.reduce([1, 2], function(sum, n) { |
| * return sum + n; |
| * }, 0); |
| * // => 3 |
| * |
| * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { |
| * (result[value] || (result[value] = [])).push(key); |
| * return result; |
| * }, {}); |
| * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) |
| */ |
| function reduce(collection, iteratee, accumulator) { |
| var func = isArray(collection) ? arrayReduce : baseReduce, |
| initAccum = arguments.length < 3; |
| |
| return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach); |
| } |
| |
| module.exports = reduce; |
| |
| },{'./_arrayReduce':71,'./_baseEach':82,'./_baseIteratee':105,'./_baseReduce':120,'./isArray':243}],275:[function(require,module,exports){ |
| var baseKeys = require('./_baseKeys'), |
| getTag = require('./_getTag'), |
| isArrayLike = require('./isArrayLike'), |
| isString = require('./isString'), |
| stringSize = require('./_stringSize'); |
| |
| /** `Object#toString` result references. */ |
| var mapTag = '[object Map]', |
| setTag = '[object Set]'; |
| |
| /** |
| * Gets the size of `collection` by returning its length for array-like |
| * values or the number of own enumerable string keyed properties for objects. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object|string} collection The collection to inspect. |
| * @returns {number} Returns the collection size. |
| * @example |
| * |
| * _.size([1, 2, 3]); |
| * // => 3 |
| * |
| * _.size({ 'a': 1, 'b': 2 }); |
| * // => 2 |
| * |
| * _.size('pebbles'); |
| * // => 7 |
| */ |
| function size(collection) { |
| if (collection == null) { |
| return 0; |
| } |
| if (isArrayLike(collection)) { |
| return isString(collection) ? stringSize(collection) : collection.length; |
| } |
| var tag = getTag(collection); |
| if (tag == mapTag || tag == setTag) { |
| return collection.size; |
| } |
| return baseKeys(collection).length; |
| } |
| |
| module.exports = size; |
| |
| },{'./_baseKeys':106,'./_getTag':168,'./_stringSize':221,'./isArrayLike':244,'./isString':255}],276:[function(require,module,exports){ |
| var baseFlatten = require('./_baseFlatten'), |
| baseOrderBy = require('./_baseOrderBy'), |
| baseRest = require('./_baseRest'), |
| isIterateeCall = require('./_isIterateeCall'); |
| |
| /** |
| * Creates an array of elements, sorted in ascending order by the results of |
| * running each element in a collection thru each iteratee. This method |
| * performs a stable sort, that is, it preserves the original sort order of |
| * equal elements. The iteratees are invoked with one argument: (value). |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Collection |
| * @param {Array|Object} collection The collection to iterate over. |
| * @param {...(Function|Function[])} [iteratees=[_.identity]] |
| * The iteratees to sort by. |
| * @returns {Array} Returns the new sorted array. |
| * @example |
| * |
| * var users = [ |
| * { 'user': 'fred', 'age': 48 }, |
| * { 'user': 'barney', 'age': 36 }, |
| * { 'user': 'fred', 'age': 40 }, |
| * { 'user': 'barney', 'age': 34 } |
| * ]; |
| * |
| * _.sortBy(users, [function(o) { return o.user; }]); |
| * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] |
| * |
| * _.sortBy(users, ['user', 'age']); |
| * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] |
| */ |
| var sortBy = baseRest(function(collection, iteratees) { |
| if (collection == null) { |
| return []; |
| } |
| var length = iteratees.length; |
| if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { |
| iteratees = []; |
| } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { |
| iteratees = [iteratees[0]]; |
| } |
| return baseOrderBy(collection, baseFlatten(iteratees, 1), []); |
| }); |
| |
| module.exports = sortBy; |
| |
| },{'./_baseFlatten':86,'./_baseOrderBy':114,'./_baseRest':121,'./_isIterateeCall':182}],277:[function(require,module,exports){ |
| /** |
| * This method returns a new empty array. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.13.0 |
| * @category Util |
| * @returns {Array} Returns the new empty array. |
| * @example |
| * |
| * var arrays = _.times(2, _.stubArray); |
| * |
| * console.log(arrays); |
| * // => [[], []] |
| * |
| * console.log(arrays[0] === arrays[1]); |
| * // => false |
| */ |
| function stubArray() { |
| return []; |
| } |
| |
| module.exports = stubArray; |
| |
| },{}],278:[function(require,module,exports){ |
| /** |
| * This method returns `false`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.13.0 |
| * @category Util |
| * @returns {boolean} Returns `false`. |
| * @example |
| * |
| * _.times(2, _.stubFalse); |
| * // => [false, false] |
| */ |
| function stubFalse() { |
| return false; |
| } |
| |
| module.exports = stubFalse; |
| |
| },{}],279:[function(require,module,exports){ |
| var toNumber = require('./toNumber'); |
| |
| /** Used as references for various `Number` constants. */ |
| var INFINITY = 1 / 0, |
| MAX_INTEGER = 1.7976931348623157e+308; |
| |
| /** |
| * Converts `value` to a finite number. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.12.0 |
| * @category Lang |
| * @param {*} value The value to convert. |
| * @returns {number} Returns the converted number. |
| * @example |
| * |
| * _.toFinite(3.2); |
| * // => 3.2 |
| * |
| * _.toFinite(Number.MIN_VALUE); |
| * // => 5e-324 |
| * |
| * _.toFinite(Infinity); |
| * // => 1.7976931348623157e+308 |
| * |
| * _.toFinite('3.2'); |
| * // => 3.2 |
| */ |
| function toFinite(value) { |
| if (!value) { |
| return value === 0 ? value : 0; |
| } |
| value = toNumber(value); |
| if (value === INFINITY || value === -INFINITY) { |
| var sign = (value < 0 ? -1 : 1); |
| return sign * MAX_INTEGER; |
| } |
| return value === value ? value : 0; |
| } |
| |
| module.exports = toFinite; |
| |
| },{'./toNumber':281}],280:[function(require,module,exports){ |
| var toFinite = require('./toFinite'); |
| |
| /** |
| * Converts `value` to an integer. |
| * |
| * **Note:** This method is loosely based on |
| * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to convert. |
| * @returns {number} Returns the converted integer. |
| * @example |
| * |
| * _.toInteger(3.2); |
| * // => 3 |
| * |
| * _.toInteger(Number.MIN_VALUE); |
| * // => 0 |
| * |
| * _.toInteger(Infinity); |
| * // => 1.7976931348623157e+308 |
| * |
| * _.toInteger('3.2'); |
| * // => 3 |
| */ |
| function toInteger(value) { |
| var result = toFinite(value), |
| remainder = result % 1; |
| |
| return result === result ? (remainder ? result - remainder : result) : 0; |
| } |
| |
| module.exports = toInteger; |
| |
| },{'./toFinite':279}],281:[function(require,module,exports){ |
| var isObject = require('./isObject'), |
| isSymbol = require('./isSymbol'); |
| |
| /** Used as references for various `Number` constants. */ |
| var NAN = 0 / 0; |
| |
| /** Used to match leading and trailing whitespace. */ |
| var reTrim = /^\s+|\s+$/g; |
| |
| /** Used to detect bad signed hexadecimal string values. */ |
| var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; |
| |
| /** Used to detect binary string values. */ |
| var reIsBinary = /^0b[01]+$/i; |
| |
| /** Used to detect octal string values. */ |
| var reIsOctal = /^0o[0-7]+$/i; |
| |
| /** Built-in method references without a dependency on `root`. */ |
| var freeParseInt = parseInt; |
| |
| /** |
| * Converts `value` to a number. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to process. |
| * @returns {number} Returns the number. |
| * @example |
| * |
| * _.toNumber(3.2); |
| * // => 3.2 |
| * |
| * _.toNumber(Number.MIN_VALUE); |
| * // => 5e-324 |
| * |
| * _.toNumber(Infinity); |
| * // => Infinity |
| * |
| * _.toNumber('3.2'); |
| * // => 3.2 |
| */ |
| function toNumber(value) { |
| if (typeof value == 'number') { |
| return value; |
| } |
| if (isSymbol(value)) { |
| return NAN; |
| } |
| if (isObject(value)) { |
| var other = typeof value.valueOf == 'function' ? value.valueOf() : value; |
| value = isObject(other) ? (other + '') : other; |
| } |
| if (typeof value != 'string') { |
| return value === 0 ? value : +value; |
| } |
| value = value.replace(reTrim, ''); |
| var isBinary = reIsBinary.test(value); |
| return (isBinary || reIsOctal.test(value)) |
| ? freeParseInt(value.slice(2), isBinary ? 2 : 8) |
| : (reIsBadHex.test(value) ? NAN : +value); |
| } |
| |
| module.exports = toNumber; |
| |
| },{'./isObject':251,'./isSymbol':256}],282:[function(require,module,exports){ |
| var copyObject = require('./_copyObject'), |
| keysIn = require('./keysIn'); |
| |
| /** |
| * Converts `value` to a plain object flattening inherited enumerable string |
| * keyed properties of `value` to own properties of the plain object. |
| * |
| * @static |
| * @memberOf _ |
| * @since 3.0.0 |
| * @category Lang |
| * @param {*} value The value to convert. |
| * @returns {Object} Returns the converted plain object. |
| * @example |
| * |
| * function Foo() { |
| * this.b = 2; |
| * } |
| * |
| * Foo.prototype.c = 3; |
| * |
| * _.assign({ 'a': 1 }, new Foo); |
| * // => { 'a': 1, 'b': 2 } |
| * |
| * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); |
| * // => { 'a': 1, 'b': 2, 'c': 3 } |
| */ |
| function toPlainObject(value) { |
| return copyObject(value, keysIn(value)); |
| } |
| |
| module.exports = toPlainObject; |
| |
| },{'./_copyObject':143,'./keysIn':260}],283:[function(require,module,exports){ |
| var baseToString = require('./_baseToString'); |
| |
| /** |
| * Converts `value` to a string. An empty string is returned for `null` |
| * and `undefined` values. The sign of `-0` is preserved. |
| * |
| * @static |
| * @memberOf _ |
| * @since 4.0.0 |
| * @category Lang |
| * @param {*} value The value to convert. |
| * @returns {string} Returns the converted string. |
| * @example |
| * |
| * _.toString(null); |
| * // => '' |
| * |
| * _.toString(-0); |
| * // => '-0' |
| * |
| * _.toString([1, 2, 3]); |
| * // => '1,2,3' |
| */ |
| function toString(value) { |
| return value == null ? '' : baseToString(value); |
| } |
| |
| module.exports = toString; |
| |
| },{'./_baseToString':126}],284:[function(require,module,exports){ |
| var arrayEach = require('./_arrayEach'), |
| baseCreate = require('./_baseCreate'), |
| baseForOwn = require('./_baseForOwn'), |
| baseIteratee = require('./_baseIteratee'), |
| getPrototype = require('./_getPrototype'), |
| isArray = require('./isArray'), |
| isBuffer = require('./isBuffer'), |
| isFunction = require('./isFunction'), |
| isObject = require('./isObject'), |
| isTypedArray = require('./isTypedArray'); |
| |
| /** |
| * An alternative to `_.reduce`; this method transforms `object` to a new |
| * `accumulator` object which is the result of running each of its own |
| * enumerable string keyed properties thru `iteratee`, with each invocation |
| * potentially mutating the `accumulator` object. If `accumulator` is not |
| * provided, a new object with the same `[[Prototype]]` will be used. The |
| * iteratee is invoked with four arguments: (accumulator, value, key, object). |
| * Iteratee functions may exit iteration early by explicitly returning `false`. |
| * |
| * @static |
| * @memberOf _ |
| * @since 1.3.0 |
| * @category Object |
| * @param {Object} object The object to iterate over. |
| * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
| * @param {*} [accumulator] The custom accumulator value. |
| * @returns {*} Returns the accumulated value. |
| * @example |
| * |
| * _.transform([2, 3, 4], function(result, n) { |
| * result.push(n *= n); |
| * return n % 2 == 0; |
| * }, []); |
| * // => [4, 9] |
| * |
| * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { |
| * (result[value] || (result[value] = [])).push(key); |
| * }, {}); |
| * // => { '1': ['a', 'c'], '2': ['b'] } |
| */ |
| function transform(object, iteratee, accumulator) { |
| var isArr = isArray(object), |
| isArrLike = isArr || isBuffer(object) || isTypedArray(object); |
| |
| iteratee = baseIteratee(iteratee, 4); |
| if (accumulator == null) { |
| var Ctor = object && object.constructor; |
| if (isArrLike) { |
| accumulator = isArr ? new Ctor : []; |
| } |
| else if (isObject(object)) { |
| accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; |
| } |
| else { |
| accumulator = {}; |
| } |
| } |
| (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { |
| return iteratee(accumulator, value, index, object); |
| }); |
| return accumulator; |
| } |
| |
| module.exports = transform; |
| |
| },{'./_arrayEach':64,'./_baseCreate':81,'./_baseForOwn':88,'./_baseIteratee':105,'./_getPrototype':164,'./isArray':243,'./isBuffer':246,'./isFunction':248,'./isObject':251,'./isTypedArray':257}],285:[function(require,module,exports){ |
| var baseFlatten = require('./_baseFlatten'), |
| baseRest = require('./_baseRest'), |
| baseUniq = require('./_baseUniq'), |
| isArrayLikeObject = require('./isArrayLikeObject'); |
| |
| /** |
| * Creates an array of unique values, in order, from all given arrays using |
| * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
| * for equality comparisons. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.1.0 |
| * @category Array |
| * @param {...Array} [arrays] The arrays to inspect. |
| * @returns {Array} Returns the new array of combined values. |
| * @example |
| * |
| * _.union([2], [1, 2]); |
| * // => [2, 1] |
| */ |
| var union = baseRest(function(arrays) { |
| return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); |
| }); |
| |
| module.exports = union; |
| |
| },{'./_baseFlatten':86,'./_baseRest':121,'./_baseUniq':128,'./isArrayLikeObject':245}],286:[function(require,module,exports){ |
| var toString = require('./toString'); |
| |
| /** Used to generate unique IDs. */ |
| var idCounter = 0; |
| |
| /** |
| * Generates a unique ID. If `prefix` is given, the ID is appended to it. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Util |
| * @param {string} [prefix=''] The value to prefix the ID with. |
| * @returns {string} Returns the unique ID. |
| * @example |
| * |
| * _.uniqueId('contact_'); |
| * // => 'contact_104' |
| * |
| * _.uniqueId(); |
| * // => '105' |
| */ |
| function uniqueId(prefix) { |
| var id = ++idCounter; |
| return toString(prefix) + id; |
| } |
| |
| module.exports = uniqueId; |
| |
| },{'./toString':283}],287:[function(require,module,exports){ |
| var baseValues = require('./_baseValues'), |
| keys = require('./keys'); |
| |
| /** |
| * Creates an array of the own enumerable string keyed property values of `object`. |
| * |
| * **Note:** Non-object values are coerced to objects. |
| * |
| * @static |
| * @since 0.1.0 |
| * @memberOf _ |
| * @category Object |
| * @param {Object} object The object to query. |
| * @returns {Array} Returns the array of property values. |
| * @example |
| * |
| * function Foo() { |
| * this.a = 1; |
| * this.b = 2; |
| * } |
| * |
| * Foo.prototype.c = 3; |
| * |
| * _.values(new Foo); |
| * // => [1, 2] (iteration order is not guaranteed) |
| * |
| * _.values('hi'); |
| * // => ['h', 'i'] |
| */ |
| function values(object) { |
| return object == null ? [] : baseValues(object, keys(object)); |
| } |
| |
| module.exports = values; |
| |
| },{'./_baseValues':129,'./keys':259}],288:[function(require,module,exports){ |
| var assignValue = require('./_assignValue'), |
| baseZipObject = require('./_baseZipObject'); |
| |
| /** |
| * This method is like `_.fromPairs` except that it accepts two arrays, |
| * one of property identifiers and one of corresponding values. |
| * |
| * @static |
| * @memberOf _ |
| * @since 0.4.0 |
| * @category Array |
| * @param {Array} [props=[]] The property identifiers. |
| * @param {Array} [values=[]] The property values. |
| * @returns {Object} Returns the new object. |
| * @example |
| * |
| * _.zipObject(['a', 'b'], [1, 2]); |
| * // => { 'a': 1, 'b': 2 } |
| */ |
| function zipObject(props, values) { |
| return baseZipObject(props || [], values || [], assignValue); |
| } |
| |
| module.exports = zipObject; |
| |
| },{'./_assignValue':75,'./_baseZipObject':130}]},{},[1])(1) |
| }); |