UNPKG

cytoscape-angular-ng17

Version:
178 lines 24.9 kB
class BaseLayoutOptionsImpl { ready(e) { // tslint:disable-next-line:no-console console.debug(`layout ready, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutready } stop(e) { // tslint:disable-next-line:no-console console.debug(`layout stop, cytoscape.LayoutEventObject: ${JSON.stringify(e)}`); // on layoutstop } } export class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl { name = 'null'; } export class AnimateLayoutOptionsImpl extends BaseLayoutOptionsImpl { // the zoom level to set (prob want fit = false if set) zoom = undefined; // the pan level to set (prob want fit = false if set) pan = undefined; // whether to transition the node positions animate = false; // duration of animation in ms if enabled animationDuration = 500; // easing of animation if enabled animationEasing = undefined; // a function that determines whether the node should be animated. // All nodes animated by default on animate enabled. Non-animated nodes are // positioned immediately when the layout starts animateFilter = (node, i) => true; } export class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl { name = 'preset'; fit; padding; // map of (node id) => (position obj); or function(node){ return somPos; } positions; // transform a given node position. Useful for changing flow direction in discrete layouts transform = (node, position) => position; } export class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl { // whether to fit to viewport fit = true; // fit padding padding = 30; // constrain layout bounds boundingBox = undefined; // prevents node overlap, may overflow boundingBox if not enough space avoidOverlap = true; // Excludes the label when calculating node bounding boxes for the layout algorithm nodeDimensionsIncludeLabels = false; // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up spacingFactor = 1.75; // a sorting function to order the nodes; e.g. function(a, b){ return a.data('weight') - b.data('weight') } sort = undefined; // transform a given node position. Useful for changing flow direction in discrete layouts transform = (node, position) => position; } export class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl { name = 'grid'; // extra spacing around nodes when avoidOverlap: true avoidOverlapPadding = 10; // uses all available space on false, uses minimal space on true condense = false; // force num of rows in the grid rows = undefined; // force num of columns in the grid cols = undefined; // returns { row, col } for element // (node: NodeSingular) => return { row: number; col: number; } position = null; } export class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl { name = 'random'; fit = true; padding = 20; // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } boundingBox = undefined; // transform a given node position. Useful for changing flow direction in discrete layouts transform = (node, position) => position; } export class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl { name = 'circle'; radius; // the radius of the circle startAngle = (3 / 2) * Math.PI; // where nodes start in radians sweep = undefined; // how many radians should be between the first and last node (defaults to full circle) clockwise; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) } // Note: "radius" is not part of concentric, imperfect extension export class ConcentricLayoutOptionsImpl { name = 'concentric'; // how many radians should be between the first and last node (defaults to full circle) sweep; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) clockwise; // where nodes start in radians, e.g. 3 / 2 * Math.PI, startAngle = (3 / 2) * Math.PI; fit; nodeDimensionsIncludeLabels; equidistant; // whether levels have an equal radial distance betwen them, may cause bounding box overflow minNodeSpacing = 10; // min spacing between outside of nodes (used for radius adjustment) boundingBox; // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } // height of layout area (overrides container height) height = null; // width of layout area (overrides container width) width = null; // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up spacingFactor; concentric(node) { return 0; } levelWidth(node) { return 0; } } export class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl { name = 'breadthfirst'; // whether the tree is directed downwards (or edges can point in any direction if false) directed = false; // put depths in concentric circles if true, put depths top down if false circle = false; // the roots of the trees roots; // how many times to try to position the nodes in a maximal way (i.e. no backtracking) maximalAdjustments; // whether to shift nodes down their natural BFS depths in order to avoid upwards edges (DAGS only) maximal = false; grid = false; // whether to create an even grid into which the DAG is placed (circle:false only) nodeDimensionsIncludeLabels = false; // Excludes the label when calculating node bounding boxes for the layout algorithm } export class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl { name = 'cose'; // The layout animates only after this many milliseconds for animate:true // (prevents flashing on fast runs) animationThreshold = 250; // Number of iterations between consecutive screen positions update refresh = 20; // Randomize the initial positions of the nodes (true) or use existing positions (false) randomize = false; // Extra spacing between components in non-compound graphs componentSpacing = 40; // Node repulsion (overlapping) multiplier nodeOverlap = 4; // Nesting factor (multiplier) to compute ideal edge length for nested edges nestingFactor = 1.2; // Gravity force (constant) gravity = 1; // Maximum number of iterations to perform numIter = 1000; // Initial temperature (maximum node displacement) initialTemp = 1000; // Cooling factor (how the temperature is reduced between consecutive iterations coolingFactor = 0.99; // Lower temperature threshold (below this point the layout will end) minTemp = 1.0; // Node repulsion (non overlapping) multiplier nodeRepulsion = (node) => 2048; // Ideal edge (non nested) length idealEdgeLength = (edge) => 32; // Divisor to compute edge forces edgeElasticity = (edge) => 32; } export class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl { constructor() { super(); } name = 'dagre'; nodeSep = undefined; // the separation between adjacent nodes in the same rank edgeSep = undefined; // the separation between adjacent edges in the same rank rankSep = undefined; // the separation between each rank in the layout // TB for top to bottom flow, 'LR' for left to right rankDir = 'TB'; // Type of algorithm to assign a rank to each node in the input graph. // Possible values: 'network-simplex', 'tight-tree' or 'longest-path' ranker = undefined; // number of ranks to keep between the source and target of the edge minLen = (edge) => 1; edgeWeight = (edge) => 1; // higher weight edges are generally made shorter and straighter than lower weight edges } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW9wdGlvbnMtaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N5dG9zY2FwZS1hbmd1bGFyL3NyYy9saWIvbGF5b3V0L2xheW91dC1vcHRpb25zLWltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxxQkFBcUI7SUFDekIsS0FBSyxDQUFDLENBQThCO1FBQ2xDLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xFLENBQUMsQ0FBQyxpQkFBaUI7SUFDdEIsQ0FBQztJQUVELElBQUksQ0FBQyxDQUE4QjtRQUNqQyxzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCw2Q0FBNkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNqRSxDQUFDLENBQUMsZ0JBQWdCO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxxQkFBcUI7SUFDOUQsSUFBSSxHQUFHLE1BQU0sQ0FBQztDQUNmO0FBRUQsTUFBTSxPQUFPLHdCQUNYLFNBQVEscUJBQXFCO0lBRzdCLHVEQUF1RDtJQUN2RCxJQUFJLEdBQVksU0FBUyxDQUFDO0lBQzFCLHNEQUFzRDtJQUN0RCxHQUFHLEdBQVksU0FBUyxDQUFDO0lBQ3pCLDJDQUEyQztJQUMzQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLHlDQUF5QztJQUN6QyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDeEIsaUNBQWlDO0lBQ2pDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDNUIsa0VBQWtFO0lBQ2xFLDRFQUE0RTtJQUM1RSxnREFBZ0Q7SUFDaEQsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0NBQ25DO0FBRUQsTUFBTSxPQUFPLHVCQUF3QixTQUFR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LEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztJQUUvQixpQ0FBaUM7SUFDakMsZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFL0IsaUNBQWlDO0lBQ2pDLGNBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0NBQy9CO0FBS0QsTUFBTSxPQUFPLHNCQUF1QixTQUFRLHVCQUF1QjtJQUNqRTtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVELElBQUksR0FBRyxPQUFPLENBQUM7SUFFZixPQUFPLEdBQVksU0FBUyxDQUFDLENBQUMseURBQXlEO0lBQ3ZGLE9BQU8sR0FBWSxTQUFTLENBQUMsQ0FBQyx5REFBeUQ7SUFDdkYsT0FBTyxHQUFZLFNBQVMsQ0FBQyxDQUFDLGlEQUFpRDtJQUMvRSxvREFBb0Q7SUFDcEQsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixzRUFBc0U7SUFDdEUscUVBQXFFO0lBQ3JFLE1BQU0sR0FBWSxTQUFTLENBQUM7SUFDNUIsb0VBQW9FO0lBQ3BFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsd0ZBQXdGO0NBQ25IIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQW5pbWF0ZWRMYXlvdXRPcHRpb25zLFxuICBCb3VuZGluZ0JveDEyLFxuICBCb3VuZGluZ0JveFdILFxuICBTb3J0aW5nRnVuY3Rpb24sXG59IGZyb20gJ2N5dG9zY2FwZSc7XG5cbmNsYXNzIEJhc2VMYXlvdXRPcHRpb25zSW1wbCB7XG4gIHJlYWR5KGU6IGN5dG9zY2FwZS5MYXlvdXRFdmVudE9iamVjdCk6IHZvaWQge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgIGBsYXlvdXQgcmVhZHksIGN5dG9zY2FwZS5MYXlvdXRFdmVudE9iamVjdDogJHtKU09OLnN0cmluZ2lmeShlKX1gXG4gICAgKTsgLy8gb24gbGF5b3V0cmVhZHlcbiAgfVxuXG4gIHN0b3AoZTogY3l0b3NjYXBlLkxheW91dEV2ZW50T2JqZWN0KTogdm9pZCB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgYGxheW91dCBzdG9wLCBjeXRvc2NhcGUuTGF5b3V0RXZlbnRPYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YFxuICAgICk7IC8vIG9uIGxheW91dHN0b3BcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTnVsbExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgQmFzZUxheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdudWxsJztcbn1cblxuZXhwb3J0IGNsYXNzIEFuaW1hdGVMYXlvdXRPcHRpb25zSW1wbFxuICBleHRlbmRzIEJhc2VMYXlvdXRPcHRpb25zSW1wbFxuICBpbXBsZW1lbnRzIEFuaW1hdGVkTGF5b3V0T3B0aW9uc1xue1xuICAvLyB0aGUgem9vbSBsZXZlbCB0byBzZXQgKHByb2Igd2FudCBmaXQgPSBmYWxzZSBpZiBzZXQpXG4gIHpvb20/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIC8vIHRoZSBwYW4gbGV2ZWwgdG8gc2V0IChwcm9iIHdhbnQgZml0ID0gZmFsc2UgaWYgc2V0KVxuICBwYW4/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIC8vIHdoZXRoZXIgdG8gdHJhbnNpdGlvbiB0aGUgbm9kZSBwb3NpdGlvbnNcbiAgYW5pbWF0ZSA9IGZhbHNlO1xuICAvLyBkdXJhdGlvbiBvZiBhbmltYXRpb24gaW4gbXMgaWYgZW5hYmxlZFxuICBhbmltYXRpb25EdXJhdGlvbiA9IDUwMDtcbiAgLy8gZWFzaW5nIG9mIGFuaW1hdGlvbiBpZiBlbmFibGVkXG4gIGFuaW1hdGlvbkVhc2luZyA9IHVuZGVmaW5lZDtcbiAgLy8gYSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgbm9kZSBzaG91bGQgYmUgYW5pbWF0ZWQuXG4gIC8vIEFsbCBub2RlcyBhbmltYXRlZCBieSBkZWZhdWx0IG9uIGFuaW1hdGUgZW5hYmxlZC4gIE5vbi1hbmltYXRlZCBub2RlcyBhcmVcbiAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBsYXlvdXQgc3RhcnRzXG4gIGFuaW1hdGVGaWx0ZXIgPSAobm9kZSwgaSkgPT4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFByZXNldExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgQW5pbWF0ZUxheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdwcmVzZXQnO1xuXG4gIGZpdD86IGJvb2xlYW47XG4gIHBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLy8gbWFwIG9mIChub2RlIGlkKSA9PiAocG9zaXRpb24gb2JqKTsgb3IgZnVuY3Rpb24obm9kZSl7IHJldHVybiBzb21Qb3M7IH1cbiAgcG9zaXRpb25zPzogbnVsbDtcbiAgLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG4gIHRyYW5zZm9ybSA9IChub2RlLCBwb3NpdGlvbikgPT4gcG9zaXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIEFuaW1hdGVMYXlvdXRPcHRpb25zSW1wbCB7XG4gIC8vIHdoZXRoZXIgdG8gZml0IHRvIHZpZXdwb3J0XG4gIGZpdCA9IHRydWU7XG4gIC8vIGZpdCBwYWRkaW5nXG4gIHBhZGRpbmcgPSAzMDtcbiAgLy8gY29uc3RyYWluIGxheW91dCBib3VuZHNcbiAgYm91bmRpbmdCb3g/OiBCb3VuZGluZ0JveDEyIHwgQm91bmRpbmdCb3hXSCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvLyBwcmV2ZW50cyBub2RlIG92ZXJsYXAsIG1heSBvdmVyZmxvdyBib3VuZGluZ0JveCBpZiBub3QgZW5vdWdoIHNwYWNlXG4gIGF2b2lkT3ZlcmxhcCA9IHRydWU7XG5cbiAgLy8gRXhjbHVkZXMgdGhlIGxhYmVsIHdoZW4gY2FsY3VsYXRpbmcgbm9kZSBib3VuZGluZyBib3hlcyBmb3IgdGhlIGxheW91dCBhbGdvcml0aG1cbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzID0gZmFsc2U7XG4gIC8vIEFwcGxpZXMgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgKD4wKSB0byBleHBhbmQgb3IgY29tcHJlc3MgdGhlIG92ZXJhbGwgYXJlYSB0aGF0IHRoZSBub2RlcyB0YWtlIHVwXG4gIHNwYWNpbmdGYWN0b3IgPSAxLjc1O1xuXG4gIC8vIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGEoJ3dlaWdodCcpIC0gYi5kYXRhKCd3ZWlnaHQnKSB9XG4gIHNvcnQ/OiBTb3J0aW5nRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gIC8vIHRyYW5zZm9ybSBhIGdpdmVuIG5vZGUgcG9zaXRpb24uIFVzZWZ1bCBmb3IgY2hhbmdpbmcgZmxvdyBkaXJlY3Rpb24gaW4gZGlzY3JldGUgbGF5b3V0c1xuICB0cmFuc2Zvcm0gPSAobm9kZSwgcG9zaXRpb24pID0+IHBvc2l0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgR3JpZExheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ2dyaWQnO1xuXG4gIC8vIGV4dHJhIHNwYWNpbmcgYXJvdW5kIG5vZGVzIHdoZW4gYXZvaWRPdmVybGFwOiB0cnVlXG4gIGF2b2lkT3ZlcmxhcFBhZGRpbmcgPSAxMDtcbiAgLy8gdXNlcyBhbGwgYXZhaWxhYmxlIHNwYWNlIG9uIGZhbHNlLCB1c2VzIG1pbmltYWwgc3BhY2Ugb24gdHJ1ZVxuICBjb25kZW5zZSA9IGZhbHNlO1xuICAvLyBmb3JjZSBudW0gb2Ygcm93cyBpbiB0aGUgZ3JpZFxuICByb3dzPzogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvLyBmb3JjZSBudW0gb2YgY29sdW1ucyBpbiB0aGUgZ3JpZFxuICBjb2xzPzogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvLyByZXR1cm5zIHsgcm93LCBjb2wgfSBmb3IgZWxlbWVudFxuICAvLyAobm9kZTogTm9kZVNpbmd1bGFyKSA9PiByZXR1cm4geyByb3c6IG51bWJlcjsgY29sOiBudW1iZXI7IH1cbiAgcG9zaXRpb24gPSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgUmFuZG9tTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBBbmltYXRlTGF5b3V0T3B0aW9uc0ltcGwge1xuICBuYW1lID0gJ3JhbmRvbSc7XG5cbiAgZml0ID0gdHJ1ZTtcbiAgcGFkZGluZyA9IDIwO1xuICAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgYm91bmRpbmdCb3g6IGN5dG9zY2FwZS5Cb3VuZGluZ0JveDEyIHwgY3l0b3NjYXBlLkJvdW5kaW5nQm94V0ggfCB1bmRlZmluZWQgPVxuICAgIHVuZGVmaW5lZDtcbiAgLy8gdHJhbnNmb3JtIGEgZ2l2ZW4gbm9kZSBwb3NpdGlvbi4gVXNlZnVsIGZvciBjaGFuZ2luZyBmbG93IGRpcmVjdGlvbiBpbiBkaXNjcmV0ZSBsYXlvdXRzXG4gIHRyYW5zZm9ybSA9IChub2RlLCBwb3NpdGlvbikgPT4gcG9zaXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBDaXJjbGVMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIFNoYXBlZExheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdjaXJjbGUnO1xuXG4gIHJhZGl1cz86IG51bWJlcjsgLy8gdGhlIHJhZGl1cyBvZiB0aGUgY2lyY2xlXG4gIHN0YXJ0QW5nbGU6IG51bWJlciA9ICgzIC8gMikgKiBNYXRoLlBJOyAvLyB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zXG4gIHN3ZWVwPzogbnVtYmVyID0gdW5kZWZpbmVkOyAvLyBob3cgbWFueSByYWRpYW5zIHNob3VsZCBiZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIChkZWZhdWx0cyB0byBmdWxsIGNpcmNsZSlcbiAgY2xvY2t3aXNlPzogdHJ1ZTsgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG59XG5cbi8vIE5vdGU6IFwicmFkaXVzXCIgaXMgbm90IHBhcnQgb2YgY29uY2VudHJpYywgaW1wZXJmZWN0IGV4dGVuc2lvblxuZXhwb3J0IGNsYXNzIENvbmNlbnRyaWNMYXlvdXRPcHRpb25zSW1wbCB7XG4gIG5hbWUgPSAnY29uY2VudHJpYyc7XG4gIC8vIGhvdyBtYW55IHJhZGlhbnMgc2hvdWxkIGJlIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgKGRlZmF1bHRzIHRvIGZ1bGwgY2lyY2xlKVxuICBzd2VlcD86IG51bWJlcjtcbiAgLy8gd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpXG4gIGNsb2Nrd2lzZT86IGJvb2xlYW47XG4gIC8vIHdoZXJlIG5vZGVzIHN0YXJ0IGluIHJhZGlhbnMsIGUuZy4gMyAvIDIgKiBNYXRoLlBJLFxuICBzdGFydEFuZ2xlOiBudW1iZXIgPSAoMyAvIDIpICogTWF0aC5QSTtcbiAgZml0PzogYm9vbGVhbjtcbiAgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzPzogdHJ1ZTtcbiAgZXF1aWRpc3RhbnQ/OiBmYWxzZTsgLy8gd2hldGhlciBsZXZlbHMgaGF2ZSBhbiBlcXVhbCByYWRpYWwgZGlzdGFuY2UgYmV0d2VuIHRoZW0sIG1heSBjYXVzZSBib3VuZGluZyBib3ggb3ZlcmZsb3dcbiAgbWluTm9kZVNwYWNpbmc/ID0gMTA7IC8vIG1pbiBzcGFjaW5nIGJldHdlZW4gb3V0c2lkZSBvZiBub2RlcyAodXNlZCBmb3IgcmFkaXVzIGFkanVzdG1lbnQpXG4gIGJvdW5kaW5nQm94PzogYW55OyAvLyBjb25zdHJhaW4gbGF5b3V0IGJvdW5kczsgeyB4MSwgeTEsIHgyLCB5MiB9IG9yIHsgeDEsIHkxLCB3LCBoIH1cbiAgLy8gaGVpZ2h0IG9mIGxheW91dCBhcmVhIChvdmVycmlkZXMgY29udGFpbmVyIGhlaWdodClcbiAgaGVpZ2h0ID0gbnVsbDtcbiAgLy8gd2lkdGggb2YgbGF5b3V0IGFyZWEgKG92ZXJyaWRlcyBjb250YWluZXIgd2lkdGgpXG4gIHdpZHRoID0gbnVsbDtcbiAgLy8gQXBwbGllcyBhIG11bHRpcGxpY2F0aXZlIGZhY3RvciAoPjApIHRvIGV4cGFuZCBvciBjb21wcmVzcyB0aGUgb3ZlcmFsbCBhcmVhIHRoYXQgdGhlIG5vZGVzIHRha2UgdXBcbiAgc3BhY2luZ0ZhY3Rvcj86IG51bWJlcjtcblxuICBjb25jZW50cmljKG5vZGU6IHsgZGVncmVlKCk6IG51bWJlciB9KTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldmVsV2lkdGgobm9kZTogeyBtYXhEZWdyZWUoKTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCcmVhZHRoRmlyc3RMYXlvdXRPcHRpb25zSW1wbCBleHRlbmRzIFNoYXBlZExheW91dE9wdGlvbnNJbXBsIHtcbiAgbmFtZSA9ICdicmVhZHRoZmlyc3QnO1xuXG4gIC8vIHdoZXRoZXIgdGhlIHRyZWUgaXMgZGlyZWN0ZWQgZG93bndhcmRzIChvciBlZGdlcyBjYW4gcG9pbnQgaW4gYW55IGRpcmVjdGlvbiBpZiBmYWxzZSlcbiAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgLy8gcHV0IGRlcHRocyBpbiBjb25jZW50cmljIGNpcmNsZXMgaWYgdHJ1ZSwgcHV0IGRlcHRocyB0b3AgZG93biBpZiBmYWxzZVxuICBjaXJjbGUgPSBmYWxzZTtcbiAgLy8gdGhlIHJvb3RzIG9mIHRoZSB0cmVlc1xuICByb290cz86IHN0cmluZztcbiAgLy8gaG93IG1hbnkgdGltZXMgdG8gdHJ5IHRvIHBvc2l0aW9uIHRoZSBub2RlcyBpbiBhIG1heGltYWwgd2F5IChpLmUuIG5vIGJhY2t0cmFja2luZylcbiAgbWF4aW1hbEFkanVzdG1lbnRzPzogbnVtYmVyO1xuICAvLyB3aGV0aGVyIHRvIHNoaWZ0IG5vZGVzIGRvd24gdGhlaXIgbmF0dXJhbCBCRlMgZGVwdGhzIGluIG9yZGVyIHRvIGF2b2lkIHVwd2FyZHMgZWRnZXMgKERBR1Mgb25seSlcbiAgbWF4aW1hbCA9IGZhbHNlO1xuICBncmlkID0gZmFsc2U7IC8vIHdoZXRoZXIgdG8gY3JlYXRlIGFuIGV2ZW4gZ3JpZCBpbnRvIHdoaWNoIHRoZSBEQUcgaXMgcGxhY2VkIChjaXJjbGU6ZmFsc2Ugb25seSlcbiAgb3ZlcnJpZGUgbm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzID0gZmFsc2U7IC8vIEV4Y2x1ZGVzIHRoZSBsYWJlbCB3aGVuIGNhbGN1bGF0aW5nIG5vZGUgYm91bmRpbmcgYm94ZXMgZm9yIHRoZSBsYXlvdXQgYWxnb3JpdGhtXG59XG5cbmV4cG9ydCBjbGFzcyBDb3NlTGF5b3V0T3B0aW9uc0ltcGwgZXh0ZW5kcyBTaGFwZWRMYXlvdXRPcHRpb25zSW1wbCB7XG4gIG5hbWUgPSAnY29zZSc7XG5cbiAgLy8gVGhlIGxheW91dCBhbmltYXRlcyBvbmx5IGFmdGVyIHRoaXMgbWFueSBtaWxsaXNlY29uZHMgZm9yIGFuaW1hdGU6dHJ1ZVxuICAvLyAocHJldmVudHMgZmxhc2hpbmcgb24gZmFzdCBydW5zKVxuICBhbmltYXRpb25UaHJlc2hvbGQgPSAyNTA7XG5cbiAgLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbnMgYmV0d2VlbiBjb25zZWN1dGl2ZSBzY3JlZW4gcG9zaXRpb25zIHVwZGF0ZVxuICByZWZyZXNoID0gMjA7XG5cbiAgLy8gUmFuZG9taXplIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiB0aGUgbm9kZXMgKHRydWUpIG9yIHVzZSBleGlzdGluZyBwb3NpdGlvbnMgKGZhbHNlKVxuICByYW5kb21pemUgPSBmYWxzZTtcblxuICAvLyBFeHRyYSBzcGFjaW5nIGJldHdlZW4gY29tcG9uZW50cyBpbiBub24tY29tcG91bmQgZ3JhcGhzXG4gIGNvbXBvbmVudFNwYWNpbmcgPSA0MDtcblxuICAvLyBOb2RlIHJlcHVsc2lvbiAob3ZlcmxhcHBpbmcpIG11bHRpcGxpZXJcbiAgbm9kZU92ZXJsYXAgPSA0O1xuXG4gIC8vIE5lc3RpbmcgZmFjdG9yIChtdWx0aXBsaWVyKSB0byBjb21wdXRlIGlkZWFsIGVkZ2UgbGVuZ3RoIGZvciBuZXN0ZWQgZWRnZXNcbiAgbmVzdGluZ0ZhY3RvciA9IDEuMjtcblxuICAvLyBHcmF2aXR5IGZvcmNlIChjb25zdGFudClcbiAgZ3Jhdml0eSA9IDE7XG5cbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtXG4gIG51bUl0ZXIgPSAxMDAwO1xuXG4gIC8vIEluaXRpYWwgdGVtcGVyYXR1cmUgKG1heGltdW0gbm9kZSBkaXNwbGFjZW1lbnQpXG4gIGluaXRpYWxUZW1wID0gMTAwMDtcblxuICAvLyBDb29saW5nIGZhY3RvciAoaG93IHRoZSB0ZW1wZXJhdHVyZSBpcyByZWR1Y2VkIGJldHdlZW4gY29uc2VjdXRpdmUgaXRlcmF0aW9uc1xuICBjb29saW5nRmFjdG9yID0gMC45OTtcblxuICAvLyBMb3dlciB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgKGJlbG93IHRoaXMgcG9pbnQgdGhlIGxheW91dCB3aWxsIGVuZClcbiAgbWluVGVtcCA9IDEuMDtcblxuICAvLyBOb2RlIHJlcHVsc2lvbiAobm9uIG92ZXJsYXBwaW5nKSBtdWx0aXBsaWVyXG4gIG5vZGVSZXB1bHNpb24gPSAobm9kZSkgPT4gMjA0ODtcblxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoID0gKGVkZ2UpID0+IDMyO1xuXG4gIC8vIERpdmlzb3IgdG8gY29tcHV0ZSBlZGdlIGZvcmNlc1xuICBlZGdlRWxhc3RpY2l0eSA9IChlZGdlKSA9PiAzMjtcbn1cblxudHlwZSBSYW5rRGlyID0gJ0xSJyB8ICdUQic7XG50eXBlIFJhbmtlciA9ICduZXR3b3JrLXNpbXBsZXgnIHwgJ3RpZ2h0LXRyZWUnIHwgJ2xvbmdlc3QtcGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEYWdyZUxheW91dE9wdGlvbnNJbXBsIGV4dGVuZHMgU2hhcGVkTGF5b3V0T3B0aW9uc0ltcGwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmFtZSA9ICdkYWdyZSc7XG5cbiAgbm9kZVNlcD86IG51bWJlciA9IHVuZGVmaW5lZDsgLy8gdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBhZGphY2VudCBub2RlcyBpbiB0aGUgc2FtZSByYW5rXG4gIGVkZ2VTZXA/OiBudW1iZXIgPSB1bmRlZmluZWQ7IC8vIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gYWRqYWNlbnQgZWRnZXMgaW4gdGhlIHNhbWUgcmFua1xuICByYW5rU2VwPzogbnVtYmVyID0gdW5kZWZpbmVkOyAvLyB0aGUgc2VwYXJhdGlvbiBiZXR3ZWVuIGVhY2ggcmFuayBpbiB0aGUgbGF5b3V0XG4gIC8vIFRCIGZvciB0b3AgdG8gYm90dG9tIGZsb3csICdMUicgZm9yIGxlZnQgdG8gcmlnaHRcbiAgcmFua0RpcjogUmFua0RpciA9ICdUQic7XG4gIC8vIFR5cGUgb2YgYWxnb3JpdGhtIHRvIGFzc2lnbiBhIHJhbmsgdG8gZWFjaCBub2RlIGluIHRoZSBpbnB1dCBncmFwaC5cbiAgLy8gUG9zc2libGUgdmFsdWVzOiAnbmV0d29yay1zaW1wbGV4JywgJ3RpZ2h0LXRyZWUnIG9yICdsb25nZXN0LXBhdGgnXG4gIHJhbmtlcj86IFJhbmtlciA9IHVuZGVmaW5lZDtcbiAgLy8gbnVtYmVyIG9mIHJhbmtzIHRvIGtlZXAgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2YgdGhlIGVkZ2VcbiAgbWluTGVuID0gKGVkZ2UpID0+IDE7XG4gIGVkZ2VXZWlnaHQgPSAoZWRnZSkgPT4gMTsgLy8gaGlnaGVyIHdlaWdodCBlZGdlcyBhcmUgZ2VuZXJhbGx5IG1hZGUgc2hvcnRlciBhbmQgc3RyYWlnaHRlciB0aGFuIGxvd2VyIHdlaWdodCBlZGdlc1xufVxuIl19