{"version":3,"file":"index.umd.cjs","names":["interval","interval","interval","interval"],"sources":["../src/__package__.ts","../../../node_modules/d3-timer/src/timer.js","../src/Audio.ts","../../../node_modules/javascript-autocomplete/auto-complete.js","../src/AutoCompleteText.css","../src/AutoCompleteText.ts","../../../node_modules/d3-time/src/interval.js","../../../node_modules/d3-time/src/duration.js","../../../node_modules/d3-time/src/day.js","../../../node_modules/d3-time/src/week.js","../../../node_modules/d3-time/src/month.js","../../../node_modules/d3-time/src/year.js","../src/CalendarHeatMap.ts","../src/Comms.ts","../src/ESP.ts","../../../node_modules/simpleheat/simpleheat.js","../src/HeatMap.ts","../src/HPCCBadge.ts","../src/Html.ts","../src/IconList.ts","../src/Paginator.ts","../src/Table.ts","../src/Legend.ts","../src/MorphText.ts","../src/NestedTable.ts","../src/Opportunity.ts","../src/Persist.ts","../src/PropertyEditor.ts","../src/RadioCheckbox.ts","../src/Select.ts","../src/ThemeEditor.ts"],"sourcesContent":["export const PKG_NAME = \"__PACKAGE_NAME__\";\nexport const PKG_VERSION = \"__PACKAGE_VERSION__\";\nexport const BUILD_VERSION = \"__BUILD_VERSION__\";\n","var frame = 0, // is an animation frame pending?\n    timeout = 0, // is a timeout pending?\n    interval = 0, // are any timers active?\n    pokeDelay = 1000, // how frequently we check for clock skew\n    taskHead,\n    taskTail,\n    clockLast = 0,\n    clockNow = 0,\n    clockSkew = 0,\n    clock = typeof performance === \"object\" && performance.now ? performance : Date,\n    setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n  return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n  clockNow = 0;\n}\n\nexport function Timer() {\n  this._call =\n  this._time =\n  this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n  constructor: Timer,\n  restart: function(callback, delay, time) {\n    if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n    time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n    if (!this._next && taskTail !== this) {\n      if (taskTail) taskTail._next = this;\n      else taskHead = this;\n      taskTail = this;\n    }\n    this._call = callback;\n    this._time = time;\n    sleep();\n  },\n  stop: function() {\n    if (this._call) {\n      this._call = null;\n      this._time = Infinity;\n      sleep();\n    }\n  }\n};\n\nexport function timer(callback, delay, time) {\n  var t = new Timer;\n  t.restart(callback, delay, time);\n  return t;\n}\n\nexport function timerFlush() {\n  now(); // Get the current time, if not already set.\n  ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n  var t = taskHead, e;\n  while (t) {\n    if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n    t = t._next;\n  }\n  --frame;\n}\n\nfunction wake() {\n  clockNow = (clockLast = clock.now()) + clockSkew;\n  frame = timeout = 0;\n  try {\n    timerFlush();\n  } finally {\n    frame = 0;\n    nap();\n    clockNow = 0;\n  }\n}\n\nfunction poke() {\n  var now = clock.now(), delay = now - clockLast;\n  if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n  var t0, t1 = taskHead, t2, time = Infinity;\n  while (t1) {\n    if (t1._call) {\n      if (time > t1._time) time = t1._time;\n      t0 = t1, t1 = t1._next;\n    } else {\n      t2 = t1._next, t1._next = null;\n      t1 = t0 ? t0._next = t2 : taskHead = t2;\n    }\n  }\n  taskTail = t0;\n  sleep(time);\n}\n\nfunction sleep(time) {\n  if (frame) return; // Soonest alarm already set, or will be.\n  if (timeout) timeout = clearTimeout(timeout);\n  var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n  if (delay > 24) {\n    if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n    if (interval) interval = clearInterval(interval);\n  } else {\n    if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n    frame = 1, setFrame(wake);\n  }\n}\n","import { HTMLWidget } from \"@hpcc-js/common\";\nimport { timer as d3Timer } from \"d3-timer\";\n\nexport class Audio extends HTMLWidget {\n    _sections;\n\n    constructor() {\n        super();\n        this._tag = \"audio\";\n\n        this._sections = {};\n    }\n\n    section(label, offset, beatLength, beatCount) {\n        if (!arguments.length) return this._sections;\n        if (arguments.length === 1) return this._sections[label];\n        this._sections[label] = {\n            label,\n            offset,\n            beatLength,\n            beatCount,\n            endOffset: offset + beatCount * beatLength\n        };\n        return this;\n    }\n\n    getType(fileExt) {\n        switch (fileExt) {\n            case \"mp3\":\n                return \"audio/mpeg; codecs='mp3'\";\n            case \"ogg\":\n                return \"audio/ogg; codecs='vorbis'\";\n        }\n        return \"\";\n    }\n\n    enter(domNode, element) {\n        const context = this;\n        element.on(\"play\", function (d) { context.onPlay(d); });\n    }\n\n    update(domNode, element) {\n        const source = element.selectAll(\"source\").data(this.source(), function (d) { return d; });\n        source.enter().append(\"source\")\n            .attr(\"src\", function (d) { return d; })\n            ;\n    }\n\n    createTimer(params, startTime, beat) {\n        const context = this;\n        d3Timer(function () {\n            context.onTick(params.label, beat, params);\n            return true;\n        }, beat * params.beatLength, startTime + params.offset);\n    }\n\n    onTick(label, beat, params) {\n    }\n\n    onPlay(d) {\n        const startTime = Date.now();\n        for (const key in this._sections) {\n            const section = this._sections[key];\n            for (let i = 0; i < section.beatCount; ++i) {\n                this.createTimer(section, startTime, i);\n            }\n        }\n    }\n\n    play(d) {\n        const context = this;\n        this._element.on(\"canplaythrough\", function (d2) {\n            context.node().play();\n        });\n        this.node().load();\n    }\n}\nAudio.prototype._class += \" other_Audio\";\n\nexport interface Audio {\n    source(): string;\n    source(_: string): this;\n    source_exists(): boolean;\n}\n\nAudio.prototype.publish(\"source\", \"\", \"string\", \"Audio Source\");\n","/*\n    JavaScript autoComplete v1.0.5\n    Copyright (c) 2014 Simon Steinberger / Pixabay\n    GitHub: https://github.com/Pixabay/JavaScript-autoComplete\n    License: http://www.opensource.org/licenses/mit-license.php\n*/\n\nvar autoComplete = (function(){\n    // \"use strict\";\n    function autoComplete(options){\n        if (!document.querySelector) return;\n\n        // helpers\n        function hasClass(el, className){ return el.classList ? el.classList.contains(className) : new RegExp('\\\\b'+ className+'\\\\b').test(el.className); }\n\n        function addEvent(el, type, handler){\n            if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler);\n        }\n        function removeEvent(el, type, handler){\n            // if (el.removeEventListener) not working in IE11\n            if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler);\n        }\n        function live(elClass, event, cb, context){\n            addEvent(context || document, event, function(e){\n                var found, el = e.target || e.srcElement;\n                while (el && !(found = hasClass(el, elClass))) el = el.parentElement;\n                if (found) cb.call(el, e);\n            });\n        }\n\n        var o = {\n            selector: 0,\n            source: 0,\n            minChars: 3,\n            delay: 150,\n            offsetLeft: 0,\n            offsetTop: 1,\n            cache: 1,\n            menuClass: '',\n            renderItem: function (item, search){\n                // escape special characters\n                search = search.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n                var re = new RegExp(\"(\" + search.split(' ').join('|') + \")\", \"gi\");\n                return '<div class=\"autocomplete-suggestion\" data-val=\"' + item + '\">' + item.replace(re, \"<b>$1</b>\") + '</div>';\n            },\n            onSelect: function(e, term, item){}\n        };\n        for (var k in options) { if (options.hasOwnProperty(k)) o[k] = options[k]; }\n\n        // init\n        var elems = typeof o.selector == 'object' ? [o.selector] : document.querySelectorAll(o.selector);\n        for (var i=0; i<elems.length; i++) {\n            var that = elems[i];\n\n            // create suggestions container \"sc\"\n            that.sc = document.createElement('div');\n            that.sc.className = 'autocomplete-suggestions '+o.menuClass;\n\n            that.autocompleteAttr = that.getAttribute('autocomplete');\n            that.setAttribute('autocomplete', 'off');\n            that.cache = {};\n            that.last_val = '';\n\n            that.updateSC = function(resize, next){\n                var rect = that.getBoundingClientRect();\n                that.sc.style.left = Math.round(rect.left + (window.pageXOffset || document.documentElement.scrollLeft) + o.offsetLeft) + 'px';\n                that.sc.style.top = Math.round(rect.bottom + (window.pageYOffset || document.documentElement.scrollTop) + o.offsetTop) + 'px';\n                that.sc.style.width = Math.round(rect.right - rect.left) + 'px'; // outerWidth\n                if (!resize) {\n                    that.sc.style.display = 'block';\n                    that.sc.classList.remove('hide')\n                    if (!that.sc.maxHeight) { that.sc.maxHeight = parseInt((window.getComputedStyle ? getComputedStyle(that.sc, null) : that.sc.currentStyle).maxHeight); }\n                    if (!that.sc.suggestionHeight) that.sc.suggestionHeight = that.sc.querySelector('.autocomplete-suggestion').offsetHeight;\n                    if (that.sc.suggestionHeight)\n                        if (!next) that.sc.scrollTop = 0;\n                        else {\n                            var scrTop = that.sc.scrollTop, selTop = next.getBoundingClientRect().top - that.sc.getBoundingClientRect().top;\n                            if (selTop + that.sc.suggestionHeight - that.sc.maxHeight > 0)\n                                that.sc.scrollTop = selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight;\n                            else if (selTop < 0)\n                                that.sc.scrollTop = selTop + scrTop;\n                        }\n                }\n            }\n            addEvent(window, 'resize', that.updateSC);\n            document.body.appendChild(that.sc);\n\n            live('autocomplete-suggestion', 'mouseleave', function(e){\n                var sel = that.sc.querySelector('.autocomplete-suggestion.selected');\n                if (sel) setTimeout(function(){ sel.className = sel.className.replace('selected', ''); }, 20);\n            }, that.sc);\n\n            live('autocomplete-suggestion', 'mouseover', function(e){\n                var sel = that.sc.querySelector('.autocomplete-suggestion.selected');\n                if (sel) sel.className = sel.className.replace('selected', '');\n                this.className += ' selected';\n            }, that.sc);\n\n            live('autocomplete-suggestion', 'mousedown', function(e){\n                if (hasClass(this, 'autocomplete-suggestion')) { // else outside click\n                    var v = this.getAttribute('data-val');\n                    that.value = v;\n                    o.onSelect(e, v, this);\n                    that.sc.style.display = 'none';\n                    that.sc.classList.add(\"hide\");\n\n                }\n            }, that.sc);\n\n            that.blurHandler = function(){\n                try { var over_sb = document.querySelector('.autocomplete-suggestions:hover'); } catch(e){ var over_sb = 0; }\n                if (!over_sb) {\n                    that.last_val = that.value;\n                    that.sc.style.display = 'none';\n                    that.sc.classList.add(\"hide\");\n                    setTimeout(function(){\n                      that.sc.style.display = 'none';\n                      that.sc.classList.add(\"hide\");\n                    }, 350); // hide suggestions on fast input\n                } else if (that !== document.activeElement) setTimeout(function(){ that.focus(); }, 20);\n            };\n            addEvent(that, 'blur', that.blurHandler);\n\n            var suggest = function(data, val){\n                if (!val) {\n                    var val = that.value;\n                }\n                that.cache[val] = data;\n                if (data.length && val.length >= o.minChars) {\n                    var s = '';\n                    for (var i=0;i<data.length;i++) s += o.renderItem(data[i], val);\n                    that.sc.innerHTML = s;\n                    that.updateSC(0);\n                }\n                else {\n                    that.sc.style.display = 'none';\n                    that.sc.classList.add(\"hide\");\n                }\n            }\n\n            that.keydownHandler = function(e){\n                var key = window.event ? e.keyCode : e.which;\n                // down (40), up (38)\n                if ((key == 40 || key == 38) && that.sc.innerHTML) {\n                    var next, sel = that.sc.querySelector('.autocomplete-suggestion.selected');\n                    if (!sel) {\n                        next = (key == 40) ? that.sc.querySelector('.autocomplete-suggestion') : that.sc.childNodes[that.sc.childNodes.length - 1]; // first : last\n                        next.className += ' selected';\n                        that.value = next.getAttribute('data-val');\n                    } else {\n                        next = (key == 40) ? sel.nextSibling : sel.previousSibling;\n                        if (next) {\n                            sel.className = sel.className.replace('selected', '');\n                            next.className += ' selected';\n                            that.value = next.getAttribute('data-val');\n                        }\n                        else { sel.className = sel.className.replace('selected', ''); that.value = that.last_val; next = 0; }\n                    }\n                    that.updateSC(0, next);\n                    return false;\n                }\n                // esc\n                else if (key == 27) {\n                  that.value = that.last_val;\n                  that.sc.style.display = 'none';\n                  that.sc.classList.add(\"hide\");\n                }\n                // enter\n                else if (key == 13 || key == 9) {\n                    if (that.sc.style.display !== 'none') {\n                        e.preventDefault();\n                    }\n                    var sel = that.sc.querySelector('.autocomplete-suggestion.selected');\n                    if (sel && that.sc.style.display != 'none') {\n                      o.onSelect(e, sel.getAttribute('data-val'), sel);\n                      setTimeout(function(){\n                        that.sc.style.display = 'none';\n                        that.sc.classList.add(\"hide\");\n                    }, 20); }\n                }\n            };\n            addEvent(that, 'keydown', that.keydownHandler);\n\n            that.keyupHandler = function(e){\n                var key = window.event ? e.keyCode : e.which;\n                if (!key || (key < 35 || key > 40) && key != 13 && key != 27) {\n                    var val = that.value;\n                    if (val.length >= o.minChars) {\n                        if (val != that.last_val) {\n                            that.last_val = val;\n                            clearTimeout(that.timer);\n                            if (o.cache) {\n                                if (val in that.cache) { suggest(that.cache[val]); return; }\n                                // no requests if previous suggestions were empty\n                                for (var i=1; i<val.length-o.minChars; i++) {\n                                    var part = val.slice(0, val.length-i);\n                                    if (part in that.cache && !that.cache[part].length) { suggest([]); return; }\n                                }\n                            }\n                            that.timer = setTimeout(function(){ o.source(val, suggest) }, o.delay);\n                        }\n                    } else {\n                        that.last_val = val;\n                        that.sc.style.display = 'none';\n                        that.sc.classList.add(\"hide\");\n                    }\n                }\n            };\n            addEvent(that, 'keyup', that.keyupHandler);\n\n            that.focusHandler = function(e){\n                that.last_val = '\\n';\n                that.keyupHandler(e)\n            };\n            if (!o.minChars) addEvent(that, 'focus', that.focusHandler);\n        }\n\n        // public destroy method\n        this.destroy = function(){\n            for (var i=0; i<elems.length; i++) {\n                var that = elems[i];\n                removeEvent(window, 'resize', that.updateSC);\n                removeEvent(that, 'blur', that.blurHandler);\n                removeEvent(that, 'focus', that.focusHandler);\n                removeEvent(that, 'keydown', that.keydownHandler);\n                removeEvent(that, 'keyup', that.keyupHandler);\n                if (that.autocompleteAttr)\n                    that.setAttribute('autocomplete', that.autocompleteAttr);\n                else\n                    that.removeAttribute('autocomplete');\n                document.body.removeChild(that.sc);\n                that = null;\n            }\n        };\n    }\n    return autoComplete;\n})();\n\n(function(){\n    if (typeof define === 'function' && define.amd)\n        define('autoComplete', function () { return autoComplete; });\n    else if (typeof module !== 'undefined' && module.exports)\n        module.exports = autoComplete;\n    else\n        window.autoComplete = autoComplete;\n})();\n",".other_autoCompleteText label {\n    display: inline-block;\n    vertical-align: top;\n}\n\n.other_autoCompleteText input {\n    width: 100%;\n    max-width: 600px;\n    outline: 0;\n    border-radius: 100;\n}\n\n.autocomplete-suggestions {\n    text-align: left;\n    cursor: default;\n    border: 1px solid #ccc;\n    border-top: 0;\n    background: #fff;\n    box-shadow: -1px 1px 3px rgba(0, 0, 0, .1);\n    /* core styles should not be changed */\n    position: absolute;\n    display: none;\n    z-index: 9999;\n    max-height: 254px;\n    overflow: hidden;\n    overflow-y: auto;\n    box-sizing: border-box;\n}\n\n.autocomplete-suggestion {\n    position: relative;\n    padding: 0 .6em;\n    line-height: 23px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    font-size: 1.02em;\n    color: #333;\n}\n\n.autocomplete-suggestion b {\n    font-weight: normal;\n    color: #1f8dd6;\n}\n\n.autocomplete-suggestion.selected {\n    background: #f0f0f0;\n}","import { HTMLWidget } from \"@hpcc-js/common\";\nimport AutoComplete from \"javascript-autocomplete\";\n\nimport \"../src/AutoCompleteText.css\";\n\nexport class AutoCompleteText extends HTMLWidget {\n    _span;\n    _prompt;\n    _input;\n    _prevMinCharsText;\n    _autoComplete;\n\n    constructor() {\n        super();\n        this._tag = \"div\";\n    }\n\n    autoCompleteTextData() {\n        if (this.data().length === 0) return [];\n        const view = this._db.rollupView([this.textColumn(), this.valueColumn()]);\n        return view.entries().map(function (row, idx) {\n            return {\n                idx,\n                text: row.key,\n                value: row.values.length ? row.values[0].key : \"\",\n                origRow: row.values.length && row.values[0].value.length ? row.values[0].value[0] : []\n            };\n        }, this);\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        this._span = element.append(\"span\");\n        this._prompt = this._span.append(\"label\")\n            .attr(\"for\", this.id() + \"_input\")\n            ;\n        this._input = this._span.append(\"input\")\n            .attr(\"id\", this.id() + \"_input\")\n            .attr(\"name\", this.id() + \"_input_name\")\n            .attr(\"type\", \"text\")\n            .attr(\"placeholder\", this.placeholder())\n            ;\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        this._prompt.text(this.label());\n        this._input.style(\"width\", this.textboxWidth_exists() ? this.textboxWidth() + \"px\" : null);\n\n        if (this._prevMinCharsText !== this.minCharsText()) {\n            this._prevMinCharsText = this.minCharsText();\n\n            if (this._autoComplete) {\n                this._autoComplete.destroy();\n            }\n            const context = this;\n            this._autoComplete = new AutoComplete({\n                selector: \"#\" + this.id() + \"_input\",\n                minChars: this.minCharsText(),\n                delay: 150,\n                offsetLeft: 0,\n                offsetTop: 1,\n                source: (term, suggest) => {\n                    const field = context._db.fieldByLabel(context.textColumn());\n                    if (field) {\n                        term = term.toLowerCase();\n                        const suggestions = context.autoCompleteTextData().filter(function (row) {\n                            return row.origRow[field.idx].toLowerCase().indexOf(term) >= 0;\n                        }).map(function (row) {\n                            return {\n                                text: row.origRow[field.idx],\n                                rowIdx: row.idx\n                            };\n                        });\n                        suggest(suggestions);\n                    }\n                },\n                renderItem: (item, search) => {\n                    search = search.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n                    const re = new RegExp(\"(\" + search.split(\" \").join(\"|\") + \")\", \"gi\");\n                    return '<div class=\"autocomplete-suggestion\" data-val=\"' + item.text + '\" data-row-idx=\"' + item.rowIdx + '\">' + item.text.replace(re, \"<b>$1</b>\") + \"</div>\";\n                },\n                onSelect: (e, term, item) => {\n                    const rowIdx = +item.getAttribute(\"data-row-idx\");\n                    const row = context.autoCompleteTextData()[rowIdx];\n                    context.click(context.rowToObj(row.origRow), context.valueColumn(), true);\n                }\n            });\n        }\n    }\n\n    exit(domNode, element) {\n        if (this._autoComplete) {\n            this._autoComplete.destroy();\n        }\n        this._span.remove();\n        super.exit(domNode, element);\n    }\n\n    click(row, column, selected) {\n    }\n}\nAutoCompleteText.prototype._class += \" other_AutoCompleteText\";\n\nexport interface AutoCompleteText {\n    label(): string;\n    label(_: string): this;\n    label_exists(): boolean;\n    textboxWidth(): number;\n    textboxWidth(_: number): this;\n    textboxWidth_exists(): boolean;\n    placeholder(): string;\n    placeholder(_: string): this;\n    placeholder_exists(): boolean;\n    valueColumn(): string;\n    valueColumn(_: string): this;\n    valueColumn_exists(): boolean;\n    textColumn(): string;\n    textColumn(_: string): this;\n    textColumn_exists(): boolean;\n    minCharsText(): number;\n    minCharsText(_: number): this;\n    minCharsText_exists(): boolean;\n}\n\nAutoCompleteText.prototype.publish(\"label\", \"Label: \", \"string\", \"Label for AutoCompleteText\");\nAutoCompleteText.prototype.publish(\"textboxWidth\", null, \"number\", \"width of textbox\", null, { optional: true });\nAutoCompleteText.prototype.publish(\"placeholder\", \"Search...\", \"string\", \"Placeholder for AutoCompleteText\");\nAutoCompleteText.prototype.publish(\"valueColumn\", null, \"set\", \"Select column for autocomplete\", function () { return this.columns(); }, { optional: true });\nAutoCompleteText.prototype.publish(\"textColumn\", null, \"set\", \"Select value(s)\", function () { return this.columns(); }, { optional: true });\nAutoCompleteText.prototype.publish(\"minCharsText\", 1, \"number\", \"Size of multiAutoCompleteText box\");\n","var t0 = new Date,\n    t1 = new Date;\n\nexport default function newInterval(floori, offseti, count, field) {\n\n  function interval(date) {\n    return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n  }\n\n  interval.floor = function(date) {\n    return floori(date = new Date(+date)), date;\n  };\n\n  interval.ceil = function(date) {\n    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n  };\n\n  interval.round = function(date) {\n    var d0 = interval(date),\n        d1 = interval.ceil(date);\n    return date - d0 < d1 - date ? d0 : d1;\n  };\n\n  interval.offset = function(date, step) {\n    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n  };\n\n  interval.range = function(start, stop, step) {\n    var range = [], previous;\n    start = interval.ceil(start);\n    step = step == null ? 1 : Math.floor(step);\n    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n    while (previous < start && start < stop);\n    return range;\n  };\n\n  interval.filter = function(test) {\n    return newInterval(function(date) {\n      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n    }, function(date, step) {\n      if (date >= date) {\n        if (step < 0) while (++step <= 0) {\n          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n        } else while (--step >= 0) {\n          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n        }\n      }\n    });\n  };\n\n  if (count) {\n    interval.count = function(start, end) {\n      t0.setTime(+start), t1.setTime(+end);\n      floori(t0), floori(t1);\n      return Math.floor(count(t0, t1));\n    };\n\n    interval.every = function(step) {\n      step = Math.floor(step);\n      return !isFinite(step) || !(step > 0) ? null\n          : !(step > 1) ? interval\n          : interval.filter(field\n              ? function(d) { return field(d) % step === 0; }\n              : function(d) { return interval.count(0, d) % step === 0; });\n    };\n  }\n\n  return interval;\n}\n","export var durationSecond = 1e3;\nexport var durationMinute = 6e4;\nexport var durationHour = 36e5;\nexport var durationDay = 864e5;\nexport var durationWeek = 6048e5;\n","import interval from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nvar day = interval(function(date) {\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setDate(date.getDate() + step);\n}, function(start, end) {\n  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;\n}, function(date) {\n  return date.getDate() - 1;\n});\n\nexport default day;\nexport var days = day.range;\n","import interval from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction weekday(i) {\n  return interval(function(date) {\n    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setDate(date.getDate() + step * 7);\n  }, function(start, end) {\n    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n  });\n}\n\nexport var sunday = weekday(0);\nexport var monday = weekday(1);\nexport var tuesday = weekday(2);\nexport var wednesday = weekday(3);\nexport var thursday = weekday(4);\nexport var friday = weekday(5);\nexport var saturday = weekday(6);\n\nexport var sundays = sunday.range;\nexport var mondays = monday.range;\nexport var tuesdays = tuesday.range;\nexport var wednesdays = wednesday.range;\nexport var thursdays = thursday.range;\nexport var fridays = friday.range;\nexport var saturdays = saturday.range;\n","import interval from \"./interval.js\";\n\nvar month = interval(function(date) {\n  date.setDate(1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n  return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n  return date.getMonth();\n});\n\nexport default month;\nexport var months = month.range;\n","import interval from \"./interval.js\";\n\nvar year = interval(function(date) {\n  date.setMonth(0, 1);\n  date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n  date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n  return end.getFullYear() - start.getFullYear();\n}, function(date) {\n  return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : interval(function(date) {\n    date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n  }, function(date, step) {\n    date.setFullYear(date.getFullYear() + step * k);\n  });\n};\n\nexport default year;\nexport var years = year.range;\n","import { HTMLWidget, Palette, Utility } from \"@hpcc-js/common\";\nimport { extent as d3Extent, range as d3Range } from \"d3-array\";\nimport { map as d3Map } from \"d3-collection\";\nimport { format as d3Format } from \"d3-format\";\nimport { select as d3Select } from \"d3-selection\";\nimport { timeDays as d3TimeDays, timeMonths as d3TimeMonths, timeWeek as d3TimeWeek, timeYear as d3TimeYear } from \"d3-time\";\nimport { timeParse as d3TimeParse } from \"d3-time-format\";\n\nimport \"../src/CalendarHeatMap.css\";\n\nexport class CalendarHeatMap extends HTMLWidget {\n    _prevDateColumn;\n    _prevAggrType;\n    _prevAggrColumn;\n    _prevAggrDeltaColumn;\n    _view;\n    _parentNode;\n\n    constructor() {\n        super();\n\n        Utility.SimpleSelectionMixin.call(this);\n    }\n\n    calendarData() {\n        if (this.fields().length === 0 || this.data().length === 0) {\n            return [];\n        }\n        const dateParser = d3TimeParse(this.datePattern());\n        const valueFormatter = this.aggrDeltaColumn() ? d3Format(\".1%\") : d3Format(\"s\");\n        if (this._prevDateColumn !== this.dateColumn() ||\n            this._prevAggrType !== this.aggrType() ||\n            this._prevAggrColumn !== this.aggrColumn() ||\n            this._prevAggrDeltaColumn !== this.aggrDeltaColumn()) {\n            this._prevDateColumn = this.dateColumn();\n            this._prevAggrType = this.aggrType();\n            this._prevAggrColumn = this.aggrColumn();\n            this._prevAggrDeltaColumn = this.aggrDeltaColumn();\n            this._view = this._db.aggregateView([this.dateColumn()], this.aggrType(), this.aggrColumn(), this.aggrDeltaColumn());\n        }\n        return this._view.entries().map(function (row) {\n            row.dateKey = dateParser(row.key);\n            row.formattedValues = valueFormatter(row.value.aggregate);\n            row.origRows = row.value;\n            return row;\n        });\n    }\n\n    calcDelta(row) {\n        return (row.Close - row.Open) / row.Open;\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        d3Select(domNode.parentNode)\n            .style(\"overflow-y\", \"scroll\")\n            .style(\"overflow-x\", \"hidden\")\n            .style(\"height\", \"100%\")\n            .style(\"width\", \"100%\")\n            ;\n        this._selection.widgetElement(element);\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n        this._palette = this._palette.switch(this.paletteID());\n\n        const width = this.width();\n        const cellSize = (width / 12) / 5;\n        const height = cellSize * 8;\n\n        const data = this.calendarData();\n        const mappedData = d3Map(data, function (d: any) { return d.dateKey; });\n        const dateExtent = d3Extent(data, function (d: any) {\n            return d.dateKey.getFullYear();\n        });\n        const context = this;\n        const svg = element.selectAll(\"svg\").data(d3Range(+dateExtent[0], +dateExtent[1] + 1));\n        const svgUpdate = svg.enter().append(\"svg\")\n            .each(function (d) {\n                const svgElement = d3Select(this);\n                const g = svgElement.append(\"g\");\n                g.append(\"text\")\n                    .style(\"text-anchor\", \"middle\")\n                    ;\n                g.append(\"g\")\n                    .attr(\"class\", \"days\")\n                    ;\n\n                const _d3TimeMonths = d3TimeMonths(new Date(d, 0, 1), new Date(d + 1, 0, 1));\n                const _months = g.append(\"g\").attr(\"class\", \"months\");\n                _d3TimeMonths.forEach(function (_m) {\n                    _months.append(\"path\")\n                        .attr(\"class\", \"month\")\n                        .attr(\"d\", calcMonthPath(_m))\n                        .style(\"stroke\", context.monthStrokeColor())\n                        .style(\"stroke-width\", context.monthStrokeWidth())\n                        ;\n                });\n            })\n            .merge(svg)\n            .attr(\"width\", width)\n            .attr(\"height\", height)\n            ;\n        svgUpdate.select(\"g\")\n            .attr(\"transform\", \"translate(\" + ((width - cellSize * 53) / 2) + \",\" + (height - cellSize * 7 - 1) + \")\")\n            ;\n        svgUpdate.select(\"text\")\n            .attr(\"transform\", \"translate(-6,\" + cellSize * 3.5 + \")rotate(-90)\")\n            .text(d => d)\n            ;\n        svg.exit().remove();\n\n        let dataExtent: [any, any] = d3Extent<number>(data, function (d: any) {\n            return d.value.aggregate;\n        });\n        if (this.aggrDeltaColumn()) {\n            const max = Math.max(Math.abs(+dataExtent[0]), Math.abs(+dataExtent[1]));\n            dataExtent = [-max, max];\n        }\n        const dayRect = svgUpdate.select(\".days\").selectAll(\".day\").data(function (d) { return d3TimeDays(new Date(d, 0, 1), new Date(d + 1, 0, 1)); });\n        const dayRectUpdate = dayRect.enter().append(\"rect\")\n            .attr(\"class\", \"day\")\n            .call(this._selection.enter.bind(this._selection))\n            .on(\"click\", function (d) {\n                const data2 = mappedData.get(d);\n                if (data2 && data2.value && data2.value && data2.value.length) {\n                    context.click(context.rowToObj(data2.value[0]), context.dateColumn(), context._selection.selected(this));\n                }\n            })\n            .on(\"dblclick\", function (d) {\n                const data2 = mappedData.get(d);\n                if (data2 && data2.value && data2.value && data2.value.length) {\n                    context.dblclick(context.rowToObj(data2.value[0]), context.dateColumn(), context._selection.selected(this));\n                }\n            }).each(function (d) {\n                const dayRectElement = d3Select(this);\n                dayRectElement.append(\"title\");\n            })\n            .merge(dayRect)\n            .attr(\"x\", function (d) { return d3TimeWeek.count(d3TimeYear(d), d) * cellSize; })\n            .attr(\"y\", function (d) { return d.getDay() * cellSize; })\n            .attr(\"width\", cellSize)\n            .attr(\"height\", cellSize)\n            .style(\"stroke\", this.dayStrokeColor())\n            .style(\"stroke-width\", this.dayStrokeWidth())\n            .style(\"fill\", null)\n            ;\n        dayRectUpdate.select(\"title\")\n            .text(d => d)\n            ;\n        dayRectUpdate.filter(function (d) { return mappedData.has(d); })\n            .style(\"fill\", function (d) {\n                const row = mappedData.get(d);\n                if (!row || !row.value || !row.value.aggregate) {\n                    return null;\n                }\n                return context._palette(row.value.aggregate, dataExtent[0], dataExtent[1]);\n            })\n            .select(\"title\")\n            .text(function (d) {\n                const data2 = mappedData.get(d);\n                return data2.key + \": \" + data2.formattedValues;\n            })\n            ;\n        dayRect.exit().remove();\n\n        const monthPath = svg.select(\".months\").selectAll(\".month\").data(function (d) { return d3TimeMonths(new Date(d, 0, 1), new Date(d + 1, 0, 1)); });\n        monthPath.enter().append(\"path\")\n            .attr(\"class\", \"month\")\n            .merge(monthPath)\n            .attr(\"d\", calcMonthPath)\n            .style(\"stroke\", this.monthStrokeColor())\n            .style(\"stroke-width\", this.monthStrokeWidth())\n            ;\n        monthPath.exit().remove();\n\n        function calcMonthPath(t0) {\n            const t1 = new Date(t0.getFullYear(), t0.getMonth() + 1, 0);\n            const d0 = t0.getDay();\n            const w0 = d3TimeWeek.count(d3TimeYear(t0), t0);\n            const d1 = t1.getDay();\n            const w1 = d3TimeWeek.count(d3TimeYear(t1), t1);\n            return \"M\" + (w0 + 1) * cellSize + \",\" + d0 * cellSize +\n                \"H\" + w0 * cellSize + \"V\" + 7 * cellSize +\n                \"H\" + w1 * cellSize + \"V\" + (d1 + 1) * cellSize +\n                \"H\" + (w1 + 1) * cellSize + \"V\" + 0 +\n                \"H\" + (w0 + 1) * cellSize + \"Z\";\n        }\n    }\n\n    exit(domNode, element) {\n        super.exit(domNode, element);\n    }\n\n    //  Events  ---\n    click(row, column, selected) {\n    }\n\n    dblclick(row, column, selected) {\n    }\n}\nCalendarHeatMap.prototype._class += \" other_CalendarHeatMap\";\nCalendarHeatMap.prototype.mixin(Utility.SimpleSelectionMixin);\nCalendarHeatMap.prototype._palette = Palette.rainbow(\"default\");\n\nexport interface CalendarHeatMap {\n    _palette;\n\n    // SimpleSelectionMixin  ---\n    _selection\n\n    //  Properties  ---\n    paletteID(): string;\n    paletteID(_: string): this;\n    paletteID_exists(): boolean;\n    datePattern(): string;\n    datePattern(_: string): this;\n    datePattern_exists(): boolean;\n    dayStrokeColor(): string;\n    dayStrokeColor(_: string): this;\n    monthStrokeColor(): string;\n    monthStrokeColor(_: string): this;\n    dayStrokeWidth(): number;\n    dayStrokeWidth(_: number): this;\n    monthStrokeWidth(): number;\n    monthStrokeWidth(_: number): this;\n    dateColumn(): string;\n    dateColumn(_: string): this;\n    dateColumn_exists(): boolean;\n    aggrType(): string;\n    aggrType(_: string): this;\n    aggrType_exists(): boolean;\n    aggrColumn(): string;\n    aggrColumn(_: string): this;\n    aggrColumn_exists(): boolean;\n    aggrDeltaColumn(): string;\n    aggrDeltaColumn(_: string): this;\n    aggrDeltaColumn_exists(): boolean;\n}\nCalendarHeatMap.prototype.publish(\"paletteID\", \"YlOrRd\", \"set\", \"Color palette for this widget\", CalendarHeatMap.prototype._palette.switch(), { tags: [\"Basic\", \"Shared\"] });\nCalendarHeatMap.prototype.publish(\"dayStrokeColor\", \"#ccc\", \"html-color\", \"Color of day border\");\nCalendarHeatMap.prototype.publish(\"monthStrokeColor\", \"#000\", \"html-color\", \"Color of month border\");\nCalendarHeatMap.prototype.publish(\"dayStrokeWidth\", 1, \"number\", \"Pixel width of day border\");\nCalendarHeatMap.prototype.publish(\"monthStrokeWidth\", 2, \"number\", \"Pixel width of month border\");\nCalendarHeatMap.prototype.publish(\"dateColumn\", null, \"set\", \"Date Column\", function () { return this.columns(); }, { optional: true });\nCalendarHeatMap.prototype.publish(\"datePattern\", \"%Y-%m-%d\", \"string\", \"Date Pattern\");\nCalendarHeatMap.prototype.publish(\"aggrType\", null, \"set\", \"Aggregation Type\", [null, \"mean\", \"median\", \"sum\", \"min\", \"max\"], { optional: true });\nCalendarHeatMap.prototype.publish(\"aggrColumn\", null, \"set\", \"Aggregation Field\", function () { return this.columns(); }, { optional: true, disable: (w) => !w.aggrType() });\nCalendarHeatMap.prototype.publish(\"aggrDeltaColumn\", null, \"set\", \"Aggregation Field\", function () { return this.columns(); }, { optional: true, disable: (w) => !w.aggrType() });\n","import { Utility } from \"@hpcc-js/common\";\n\nconst TIMEOUT_DEFAULT = 60;\nfunction espValFix(val) {\n    if (val === undefined || val === null) {\n        return null;\n    }\n    if (!val.trim) {\n        if (val.Row) {\n            return espRowFix(val.Row);\n        }\n        return val;\n    }\n    const retVal = val.trim();\n    if (retVal !== \"\" && !isNaN(retVal)) {\n        if (retVal.length <= 1 || retVal[0] !== \"0\" || retVal[1] === \".\") {\n            return Number(retVal);\n        }\n    }\n    return retVal;\n}\n\nfunction espRowFix(row) {\n    for (const key in row) {\n        row[key] = espValFix(row[key]);\n    }\n    return row;\n}\n\nexport class ESPUrl {\n    protected _protocol = \"http:\";\n    protected _hostname = \"localhost\";\n    protected _url;\n    protected _port;\n    protected _search;\n    protected _pathname;\n    protected _params;\n    protected _hash;\n    protected _host;\n\n    constructor() {\n    }\n\n    url(_: string): this;\n    url(): string;\n    url(_?): string | this {\n        if (!arguments.length) return this._url;\n        this._url = _;\n        const parser = document.createElement(\"a\");\n        parser.href = this._url;\n\n        const params = {};\n        if (parser.search.length) {\n            let tmp: any = parser.search;\n            if (tmp[0] === \"?\") {\n                tmp = tmp.substring(1);\n            }\n            tmp = tmp.split(\"&\");\n            tmp.map(function (item) {\n                const tmpItem = item.split(\"=\");\n                params[decodeURIComponent(tmpItem[0])] = decodeURIComponent(tmpItem[1]);\n            });\n        }\n        this._protocol = parser.protocol;\n        this._hostname = parser.hostname;\n        this._port = parser.port;\n        this._pathname = parser.pathname;\n        while (this._pathname.length && this._pathname[0] === \"/\") {\n            this._pathname = this._pathname.substring(1);\n        }\n        this._search = parser.search;\n        this._params = params;\n        this._hash = parser.hash;\n        this._host = parser.host;\n\n        return this;\n    }\n\n    protocol(_: string): this;\n    protocol(): string;\n    protocol(_?: string): string | this {\n        if (!arguments.length) return this._protocol;\n        this._protocol = _;\n        return this;\n    }\n\n    hostname(_: string): this;\n    hostname(): string;\n    hostname(_?: string): string | this {\n        if (!arguments.length) return this._hostname;\n        this._hostname = _;\n        return this;\n    }\n\n    port(_: string): this;\n    port(): string;\n    port(_?: string) {\n        if (!arguments.length) return this._port;\n        this._port = _;\n        return this;\n    }\n\n    search(_: string): this;\n    search(): string;\n    search(_?: string) {\n        if (!arguments.length) return this._search;\n        this._search = _;\n        return this;\n    }\n\n    pathname(_: string): this;\n    pathname(): string;\n    pathname(_?: string) {\n        if (!arguments.length) return this._pathname;\n        this._pathname = _;\n        return this;\n    }\n\n    hash(_: string): this;\n    hash(): string;\n    hash(_?: string) {\n        if (!arguments.length) return this._hash;\n        this._hash = _;\n        return this;\n    }\n\n    host(_: string): this;\n    host(): string;\n    host(_?: string) {\n        if (!arguments.length) return this._host;\n        this._host = _;\n        return this;\n    }\n\n    params(_: string): this;\n    params(): string;\n    params(_?: string) {\n        if (!arguments.length) return this._params;\n        this._params = _;\n        return this;\n    }\n\n    param(key: string) {\n        return this._params[key];\n    }\n\n    isWsWorkunits() {\n        return this._pathname.toLowerCase().indexOf(\"wsworkunits\") >= 0 || this._params[\"Wuid\"];\n    }\n\n    isWorkunitResult() {\n        return this.isWsWorkunits() && (this._params[\"Sequence\"] || this._params[\"ResultName\"]);\n    }\n\n    isWsEcl() {\n        return this._pathname.toLowerCase().indexOf(\"wsecl\") >= 0 || (this._params[\"QuerySetId\"] && this._params[\"Id\"]);\n    }\n\n    isWsWorkunits_GetStats() {\n        return this._pathname.toLowerCase().indexOf(\"wsworkunits/wugetstats\") >= 0 && this._params[\"WUID\"];\n    }\n\n    getUrl(overrides) {\n        overrides = overrides || {};\n        return (overrides.protocol !== undefined ? overrides.protocol : this._protocol) + \"//\" +\n            (overrides.hostname !== undefined ? overrides.hostname : this._hostname) + \":\" +\n            (overrides.port !== undefined ? overrides.port : this._port) + \"/\" +\n            (overrides.pathname !== undefined ? overrides.pathname : this._pathname);\n    }\n}\n\nexport function ESPMappings(mappings) {\n    this._mappings = mappings;\n    this._reverseMappings = {};\n    for (const resultName in this._mappings) {\n        this._reverseMappings[resultName] = {};\n        for (const key in this._mappings[resultName]) {\n            this._reverseMappings[resultName][this._mappings[resultName][key]] = key;\n        }\n    }\n}\n\nESPMappings.prototype.contains = function (resultName, origField) {\n    return Utility.exists(resultName + \".\" + origField, this._mappings);\n};\n\nESPMappings.prototype.mapResult = function (response, resultName) {\n    const mapping = this._mappings[resultName];\n    if (mapping) {\n        response[resultName] = response[resultName].map(function (item) {\n            let row = [];\n            if (mapping.x && mapping.x instanceof Array) {\n                //  LINE Mapping  ---\n                row = [];\n                for (let i = 0; i < mapping.x.length; ++i) {\n                    row.push(item[mapping.y[i]]);\n                }\n            } else {\n                //  Regular Mapping  ---\n                for (const key in mapping) {\n                    if (mapping[key] === \"label\") {\n                        row[0] = item[key];\n                    } else if (mapping[key] === \"weight\") {\n                        row[1] = item[key];\n                    }\n                }\n            }\n            return row;\n        }, this);\n    }\n};\n\nESPMappings.prototype.mapResponse = function (response) {\n    for (const key in response) {\n        this.mapResult(response, key);\n    }\n};\n\nconst serialize = function (obj) {\n    const str = [];\n    for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            const val = obj[key];\n            if (val !== undefined && val !== null) {\n                str.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(val));\n            }\n        }\n    }\n    return str.join(\"&\");\n};\n\nlet jsonp = function (url, request, timeout) {\n    return new Promise(function (resolve, reject) {\n        let respondedTimeout = timeout * 1000;\n        const respondedTick = 5000;\n        const callbackName = \"jsonp_callback_\" + Math.round(Math.random() * 999999);\n        window[callbackName] = function (response) {\n            respondedTimeout = 0;\n            doCallback();\n            resolve(response);\n        };\n        const script = document.createElement(\"script\");\n        script.src = url + (url.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + \"jsonp=\" + callbackName + \"&\" + serialize(request);\n        document.body.appendChild(script);\n        const progress = setInterval(function () {\n            if (respondedTimeout <= 0) {\n                clearInterval(progress);\n            } else {\n                respondedTimeout -= respondedTick;\n                if (respondedTimeout <= 0) {\n                    clearInterval(progress);\n                    doCallback();\n                    reject(Error(\"Request timeout:  \" + script.src));\n                }\n            }\n        }, respondedTick);\n\n        function doCallback() {\n            delete window[callbackName];\n            document.body.removeChild(script);\n        }\n    });\n};\n\nexport class Comms extends ESPUrl {\n    protected _proxyMappings;\n    protected _mappings;\n    protected _timeout;\n    protected _hipieResults;\n    protected _hipieResultsLength;\n\n    constructor() {\n        super();\n        this._proxyMappings = {};\n        this._mappings = new ESPMappings({});\n        this._timeout = TIMEOUT_DEFAULT;\n        this._hipieResults = {};\n    }\n\n    hipieResults(_) {\n        if (!arguments.length) return this._hipieResults;\n        this._hipieResultsLength = 0;\n        this._hipieResults = {};\n        const context = this;\n        _.forEach(function (item) {\n            context._hipieResultsLength++;\n            context._hipieResults[item.id] = item;\n        });\n        return this;\n    }\n\n    jsonp(url, request) {\n        for (const key in this._proxyMappings) {\n            const newUrlParts = url.split(key);\n            const newUrl = newUrlParts[0];\n            if (newUrlParts.length > 1) {\n                const espUrl = new ESPUrl()\n                    .url(url)\n                    ;\n                url = newUrl + this._proxyMappings[key];\n                request.IP = espUrl.hostname();\n                request.PORT = espUrl.port();\n                if (newUrlParts.length > 0) {\n                    request.PATH = newUrlParts[1];\n                }\n                break;\n            }\n        }\n        return jsonp(url, request, this.timeout());\n    }\n\n    ajax(method, url, request?) {\n        return new Promise(function (resolve, reject) {\n            let uri = url;\n            if (method === \"GET\" && request) {\n                uri += \"?\" + serialize(request);\n            }\n            const xhr: any = new XMLHttpRequest();\n            xhr.onload = function (e) {\n                if (this.status >= 200 && this.status < 300) {\n                    resolve(JSON.parse(this.response));\n                } else {\n                    reject(Error(this.statusText));\n                }\n            };\n            xhr.onerror = function () {\n                reject(Error(this.statusText));\n            };\n            xhr.open(method, uri);\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            if (method === \"GET\") {\n                xhr.send();\n            } else {\n                xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n                xhr.send(serialize(request));\n            }\n        });\n    }\n\n    get(url, request?) {\n        return this.ajax(\"GET\", url, request);\n    }\n\n    post(url, request) {\n        return this.ajax(\"POST\", url, request);\n    }\n\n    mappings(_?) {\n        if (!arguments.length) return this._mappings;\n        this._mappings = new ESPMappings(_);\n        return this;\n    }\n\n    proxyMappings(_?) {\n        if (!arguments.length) return this._proxyMappings;\n        this._proxyMappings = _;\n        return this;\n    }\n\n    timeout(_?) {\n        if (!arguments.length) return this._timeout;\n        this._timeout = _ || TIMEOUT_DEFAULT;\n        return this;\n    }\n}\n\nexport class Basic extends Comms {\n\n    protected _cacheCalls;\n\n    constructor() {\n        super();\n    }\n\n    cacheCalls(_?) {\n        if (!arguments.length) return this._cacheCalls;\n        this._cacheCalls = _;\n        return this;\n    }\n\n    call(request, callback) {\n        const url = this._url + (this._url.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + serialize(request);\n        if (this._cacheCalls) {\n            const context = this;\n            return new Promise(function (resolve, reject) {\n                const response = JSON.parse(localStorage.getItem(\"hpcc.viz.\" + url));\n                if (!response) {\n                    throw Error(\"not cached\");\n                }\n                if (callback) {\n                    console.error(\"Deprecated:  callback, use promise (Basic.prototype.call)\");\n                    callback(response);\n                }\n                resolve(response);\n            }).catch(function (response) {\n                return context.get(url).then(function (response2) {\n                    localStorage.setItem(\"hpcc.viz.\" + url, JSON.stringify(response2));\n                    if (callback) {\n                        console.error(\"Deprecated:  callback, use promise (Basic.prototype.call)\");\n                        callback(response2);\n                    }\n                    return response2;\n                });\n            });\n        } else {\n            localStorage.removeItem(\"hpcc.viz.\" + url);\n            return this.get(url).then(function (response) {\n                if (callback) {\n                    console.error(\"Deprecated:  callback, use promise (Basic.prototype.call)\");\n                    callback(response);\n                }\n                return response;\n            });\n        }\n    }\n}\n\nfunction locateRoxieResponse(response): object {\n    // v5 and v6 compatible ---\n    for (const key in response) {\n        if (response[key].Row && response[key].Row instanceof Array) {\n            return response;\n        }\n        let retVal;\n        if (typeof (response[key]) !== \"string\") {\n            retVal = locateRoxieResponse(response[key]);\n        }\n        if (retVal) {\n            return retVal;\n        }\n    }\n    return null;\n}\n\nfunction locateRoxieException(response) {\n    for (const key in response) {\n        if (response[key].Exception && response[key].Exception instanceof Array) {\n            return response[key];\n        }\n        const retVal = locateRoxieException(response[key]);\n        if (retVal) {\n            return retVal;\n        }\n    }\n    return null;\n}\n\nexport class WsECL extends Comms {\n\n    protected _target;\n    protected _query;\n\n    constructor() {\n        super();\n\n        this._port = \"8002\";\n        this._target = \"\";\n        this._query = \"\";\n    }\n\n    url(_?) {\n        const retVal = super.url.apply(this, arguments);\n        if (arguments.length) {\n            //  http://localhost:8010/esp/files/stub.htm?QuerySetId=roxie&Id=stock.3&Widget=QuerySetDetailsWidget\n            this._port = this._port === \"8010\" ? \"8002\" : this._port;  //  Need a better way  ---\n            for (const key in this._params) {\n                switch (key) {\n                    case \"QuerySetId\":\n                        this.target(this._params[key]);\n                        break;\n                    case \"Id\":\n                        this.query(this._params[key]);\n                        break;\n                }\n            }\n\n            let pathParts;\n            let queryParts;\n            if (!this._target || !this._query) {\n                // http://localhost:8002/WsEcl/forms/default/query/roxie/wecare\n                pathParts = this._pathname.split(\"/query/\");\n                if (pathParts.length >= 2) {\n                    queryParts = pathParts[1].split(\"/\");\n                    if (queryParts.length >= 2) {\n                        this.target(queryParts[0]);\n                        this.query(queryParts[1]);\n                    }\n                }\n            }\n        }\n        return retVal;\n    }\n\n    target(_?) {\n        if (!arguments.length) return this._target;\n        this._target = _;\n        return this;\n    }\n\n    query(_?) {\n        if (!arguments.length) return this._query;\n        this._query = _;\n        return this;\n    }\n\n    constructUrl() {\n        return Comms.prototype.getUrl.call(this, {\n            pathname: \"WsEcl/submit/query/\" + this._target + \"/\" + this._query + \"/json\"\n        });\n    }\n\n    call(target, request, callback) {\n        target = target || {};\n        target.target = target.target || this._target;\n        target.query = target.query || this._query;\n        const context = this;\n        const url = this.getUrl({\n            pathname: \"WsEcl/submit/query/\" + target.target + \"/\" + target.query + \"/json\"\n        });\n        return this.jsonp(url, request).then(function (response: any) {\n            let _response = locateRoxieResponse(response);\n            if (!_response) {\n                _response = locateRoxieException(response);\n            }\n            response = _response;\n\n            // Check for exceptions\n            if (response.Exception) {\n                throw Error(response.Exception.reduce(function (previousValue, exception, index, array) {\n                    if (previousValue.length) {\n                        previousValue += \"\\n\";\n                    }\n                    return previousValue + exception.Source + \" \" + exception.Code + \":  \" + exception.Message;\n                }, \"\"));\n            }\n            // Remove \"response.result.Row\"\n            for (const key in response) {\n                if (response[key].Row) {\n                    response[key] = response[key].Row.map(espRowFix);\n                }\n            }\n            context._mappings.mapResponse(response);\n            if (callback) {\n                console.error(\"Deprecated:  callback, use promise (WsECL.prototype.call)\");\n                callback(response);\n            }\n            return response;\n        });\n    }\n\n    send(request, callback) {\n        return this.call({ target: this._target, query: this._query }, request, callback);\n    }\n}\n\nexport class WsWorkunits extends Comms {\n\n    protected _wuid = \"\";\n    protected _jobname = \"\";\n    protected _sequence = null;\n    protected _resultName = null;\n\n    protected _fetchResultNamesPromise = null;\n    protected _fetchResultPromise = {};\n    protected _resultNameCache = {};\n    protected _resultNameCacheCount = 0;\n    protected _total;\n\n    constructor() {\n        super();\n        this._port = \"8010\";\n    }\n\n    url(_?) {\n        const retVal = Comms.prototype.url.apply(this, arguments);\n        if (arguments.length) {\n            //  http://localhost:8010/WsWorkunit/WuResult?Wuid=xxx&ResultName=yyy\n            for (const key in this._params) {\n                switch (key) {\n                    case \"Wuid\":\n                        this.wuid(this._params[key]);\n                        break;\n                    case \"ResultName\":\n                        this.resultName(this._params[key]);\n                        break;\n                    case \"Sequence\":\n                        this.sequence(this._params[key]);\n                        break;\n                }\n            }\n            if (!this._wuid) {\n                //  http://localhost:8010/WsWorkunits/res/W20140922-213329/c:/temp/index.html\n                const urlParts = this._url.split(\"/res/\");\n                if (urlParts.length >= 2) {\n                    const urlParts2 = urlParts[1].split(\"/\");\n                    this.wuid(urlParts2[0]);\n                }\n            }\n        }\n        return retVal;\n    }\n\n    wuid(_?) {\n        if (!arguments.length) return this._wuid;\n        this._wuid = _;\n        return this;\n    }\n\n    jobname(_?) {\n        if (!arguments.length) return this._jobname;\n        this._jobname = _;\n        return this;\n    }\n\n    sequence(_?) {\n        if (!arguments.length) return this._sequence;\n        this._sequence = _;\n        return this;\n    }\n\n    resultName(_?) {\n        if (!arguments.length) return this._resultName;\n        this._resultName = _;\n        return this;\n    }\n\n    appendParam(label, value, params) {\n        if (value) {\n            if (params) {\n                params += \"&\";\n            }\n            return params + label + \"=\" + value;\n        }\n        return params;\n    }\n\n    constructUrl() {\n        const url = Comms.prototype.getUrl.call(this, {\n            pathname: \"WsWorkunits/res/\" + this._wuid + \"/\"\n        });\n        let params = \"\";\n        params = this.appendParam(\"ResultName\", this._resultName, params);\n        return url + (params ? \"?\" + params : \"\");\n    }\n\n    _fetchResult(target, callback, skipMapping) {\n        target = target || {};\n        if (!this._fetchResultPromise[target.resultname]) {\n            target._start = target._start || 0;\n            target._count = target._count || -1;\n            const url = this.getUrl({\n                pathname: \"WsWorkunits/WUResult.json\"\n            });\n            const request = {\n                Wuid: target.wuid,\n                ResultName: target.resultname,\n                SuppressXmlSchema: true,\n                Start: target._start,\n                Count: target._count\n            };\n            this._resultNameCache[target.resultname] = {};\n            const context = this;\n            this._fetchResultPromise[target.resultname] = this.jsonp(url, request).then(function (response: any) {\n                // Remove \"xxxResponse.Result\"\n                for (const key in response) {\n                    if (!response[key].Result) {\n                        throw new Error(\"No result found.\");\n                    }\n                    context._total = response[key].Total;\n                    response = response[key].Result;\n                    for (const responseKey in response) {\n                        response = response[responseKey].Row.map(espRowFix);\n                        break;\n                    }\n                    break;\n                }\n                context._resultNameCache[target.resultname] = response;\n                if (!skipMapping) {\n                    context._mappings.mapResult(context._resultNameCache, target.resultname);\n                }\n                if (callback) {\n                    console.error(\"Deprecated:  callback, use promise (WsWorkunits.prototype._fetchResult)\");\n                    callback(context._resultNameCache[target.resultname]);\n                }\n                return context._resultNameCache[target.resultname];\n            });\n        }\n        return this._fetchResultPromise[target.resultname];\n    }\n\n    fetchResult(target, callback, skipMapping) {\n        if (target.wuid) {\n            return this._fetchResult(target, callback, skipMapping);\n        } else if (target.jobname) {\n            const context = this;\n            return this.WUQuery(target, function (response) {\n                target.wuid = response[0].Wuid;\n                return context._fetchResult(target, callback, skipMapping);\n            });\n        }\n    }\n\n    WUQuery(_request, callback) {\n        const url = this.getUrl({\n            pathname: \"WsWorkunits/WUQuery.json\"\n        });\n        const request = {\n            Jobname: _request.jobname,\n            Count: 1\n        };\n\n        this._resultNameCache = {};\n        this._resultNameCacheCount = 0;\n        return this.jsonp(url, request).then(function (response: any) {\n            if (!Utility.exists(\"WUQueryResponse.Workunits.ECLWorkunit\", response)) {\n                throw Error(\"No workunit found.\");\n            }\n            response = response.WUQueryResponse.Workunits.ECLWorkunit;\n            if (callback) {\n                console.error(\"Deprecated:  callback, use promise (WsWorkunits.prototype.WUQuery)\");\n                callback(response);\n            }\n            return response;\n        });\n    }\n\n    fetchResultNames(callback?) {\n        if (!this._fetchResultNamesPromise) {\n            const url = this.getUrl({\n                pathname: \"WsWorkunits/WUInfo.json\"\n            });\n            const request = {\n                Wuid: this._wuid,\n                TruncateEclTo64k: true,\n                IncludeExceptions: false,\n                IncludeGraphs: false,\n                IncludeSourceFiles: false,\n                IncludeResults: true,\n                IncludeResultsViewNames: false,\n                IncludeVariables: false,\n                IncludeTimers: false,\n                IncludeResourceURLs: false,\n                IncludeDebugValues: false,\n                IncludeApplicationValues: false,\n                IncludeWorkflows: false,\n                IncludeXmlSchemas: false,\n                SuppressResultSchemas: true\n            };\n\n            this._resultNameCache = {};\n            this._resultNameCacheCount = 0;\n            const context = this;\n            this._fetchResultNamesPromise = this.jsonp(url, request).then(function (response: any) {\n                if (Utility.exists(\"WUInfoResponse.Workunit.Archived\", response) && response.WUInfoResponse.Workunit.Archived) {\n                    console.warn(\"WU is archived:  \" + url + \" \" + JSON.stringify(request));\n                }\n                if (Utility.exists(\"WUInfoResponse.Workunit.Results.ECLResult\", response)) {\n                    response.WUInfoResponse.Workunit.Results.ECLResult.map(function (item) {\n                        context._resultNameCache[item.Name] = [];\n                        ++context._resultNameCacheCount;\n                    });\n                }\n                if (callback) {\n                    console.error(\"Deprecated:  callback, use promise (WsWorkunits.prototype.fetchResultNames)\");\n                    callback(context._resultNameCache);\n                }\n                return context._resultNameCache;\n            });\n        }\n        return this._fetchResultNamesPromise;\n    }\n\n    fetchResults(callback, skipMapping) {\n        const context = this;\n        return this.fetchResultNames().then(function (response) {\n            const fetchArray = [];\n            for (const key in context._resultNameCache) {\n                fetchArray.push(context.fetchResult({ wuid: context._wuid, resultname: key }, null, skipMapping));\n            }\n            return Promise.all(fetchArray).then(function (responseArray) {\n                if (callback) {\n                    console.error(\"Deprecated:  callback, use promise (WsWorkunits.prototype.fetchResults)\");\n                    callback(context._resultNameCache);\n                }\n                return context._resultNameCache;\n            });\n        });\n    }\n\n    postFilter(request, response) {\n        const retVal = {};\n        for (const key in response) {\n            retVal[key] = response[key].filter(function (row, idx) {\n                for (const request_key in request) {\n                    if (row[request_key] !== undefined && request[request_key] !== undefined && row[request_key] != request[request_key]) {\n                        return false;\n                    }\n                }\n                return true;\n            });\n        }\n        this._mappings.mapResponse(retVal);\n        return retVal;\n    }\n\n    send(request, callback) {\n        const context = this;\n        if (!this._resultNameCacheCount) {\n            this.fetchResults(function (response) {\n                callback(context.postFilter(request, response));\n            }, true);\n        } else {\n            callback(context.postFilter(request, this._resultNameCache));\n        }\n    }\n}\n\nfunction WsWorkunits_GetStats() {\n    Comms.call(this);\n\n    this._port = \"8010\";\n    this._wuid = null;\n}\nWsWorkunits_GetStats.prototype = Object.create(Comms.prototype);\n\nWsWorkunits_GetStats.prototype.url = function (_) {\n    const retVal = Comms.prototype.url.apply(this, arguments);\n    if (arguments.length) {\n        //  http://localhost:8010/WsWorkunits/WUGetStats?WUID=\"xxx\"\n        for (const key in this._params) {\n            switch (key) {\n                case \"WUID\":\n                    this.wuid(this._params[key]);\n                    break;\n            }\n        }\n    }\n    return retVal;\n};\n\nWsWorkunits_GetStats.prototype.wuid = function (_) {\n    if (!arguments.length) return this._wuid;\n    this._wuid = _;\n    return this;\n};\n\nWsWorkunits_GetStats.prototype.constructUrl = function () {\n    return Comms.prototype.getUrl.call(this, {\n        pathname: \"WsWorkunits/WUGetStats?WUID=\" + this._wuid\n    });\n};\n\nWsWorkunits_GetStats.prototype.send = function (request, callback) {\n    const url = this.getUrl({\n        pathname: \"WsWorkunits/WUGetStats.json?WUID=\" + this._wuid\n    });\n    return this.jsonp(url, request).then(function (response) {\n        if (Utility.exists(\"WUGetStatsResponse.Statistics.WUStatisticItem\", response)) {\n            if (callback) {\n                console.error(\"Deprecated:  callback, use promise (WsWorkunits_GetStats.prototype.send)\");\n                callback(response.WUGetStatsResponse.Statistics.WUStatisticItem);\n            }\n            return response.WUGetStatsResponse.Statistics.WUStatisticItem;\n        } else {\n            if (callback) {\n                console.error(\"Deprecated:  callback, use promise (WsWorkunits_GetStats.prototype.send)\");\n                callback([]);\n            }\n            return [];\n        }\n    });\n};\n\n//  HIPIERoxie  ---\nfunction HIPIERoxie() {\n    Comms.call(this);\n}\nHIPIERoxie.prototype = Object.create(Comms.prototype);\n\nHIPIERoxie.prototype.fetchResults = function (request, callback) {\n    const url = this.getUrl({});\n    this._resultNameCache = {};\n    this._resultNameCacheCount = 0;\n    const context = this;\n    return this.jsonp(url, request).then(function (response) {\n        let _response = locateRoxieResponse(response);\n        if (!_response) {\n            _response = locateRoxieException(response);\n        }\n        response = _response;\n\n        // Check for exceptions\n        if (response.Exception) {\n            throw Error(response.Exception.reduce(function (previousValue, exception, index, array) {\n                if (previousValue.length) {\n                    previousValue += \"\\n\";\n                }\n                return previousValue + exception.Source + \" \" + exception.Code + \":  \" + exception.Message;\n            }, \"\"));\n        }\n        // Remove \"response.result.Row\"\n        for (const key in response) {\n            if (response[key].Row) {\n                context._resultNameCache[key] = response[key].Row.map(espRowFix);\n                ++context._resultNameCacheCount;\n            }\n        }\n        if (callback) {\n            console.error(\"Deprecated:  callback, use promise (HIPIERoxie.prototype.fetchResults)\");\n            callback(context._resultNameCache);\n        }\n        return context._resultNameCache;\n    });\n};\n\nHIPIERoxie.prototype.fetchResult = function (name, callback) {\n    const context = this;\n    return new Promise(function (resolve, reject) {\n        if (callback) {\n            console.error(\"Deprecated:  callback, use promise (HIPIERoxie.prototype.fetchResult)\");\n            callback(context._resultNameCache[name]);\n        }\n        resolve(context._resultNameCache[name]);\n    });\n};\n\nHIPIERoxie.prototype.call = function (request, callback) {\n    const context = this;\n    return this.fetchResults(request, callback).then(function (response) {\n        const retVal = {};\n        for (const hipieKey in context._hipieResults) {\n            const item = context._hipieResults[hipieKey];\n            retVal[item.id] = response[item.from];\n        }\n        return retVal;\n    });\n};\n\n//  HIPIEWorkunit  ---\nfunction HIPIEWorkunit() {\n    WsWorkunits.call(this);\n}\nHIPIEWorkunit.prototype = Object.create(WsWorkunits.prototype);\n\nHIPIEWorkunit.prototype.fetchResults = function (callback) {\n    const context = this;\n    return WsWorkunits.prototype.fetchResultNames.call(this).then(function (response) {\n        const fetchArray = [];\n        for (const key in context._hipieResults) {\n            const item = context._hipieResults[key];\n            fetchArray.push(context.fetchResult(item.from));\n        }\n        return Promise.all(fetchArray).then(function (response2) {\n            if (callback) {\n                console.error(\"Deprecated:  callback, use promise (HIPIEWorkunit.prototype.fetchResults)\");\n                callback(context._resultNameCache);\n            }\n            return context._resultNameCache;\n        });\n    });\n};\n\nHIPIEWorkunit.prototype.fetchResult = function (name, callback) {\n    return WsWorkunits.prototype.fetchResult.call(this, { wuid: this._wuid, resultname: name }).then(function (response) {\n        if (callback) {\n            console.error(\"Deprecated:  callback, use promise (HIPIEWorkunit.prototype.fetchResult)\");\n            callback(response);\n        }\n        return response;\n    });\n};\n\nHIPIEWorkunit.prototype.call = function (request, callback) {\n    const context = this;\n    if (request.refresh || !this._resultNameCache || !this._resultNameCacheCount) {\n        return this.fetchResults(callback).then(function (response) {\n            return filterResults(request);\n        });\n    } else {\n        return new Promise(function (resolve, reject) {\n            resolve(filterResults(request));\n        });\n    }\n\n    function filterResults(request2) {\n        const changedFilter = {};\n        for (const key in request2) {\n            if (request2[key + \"_changed\"] !== undefined) {\n                changedFilter[key] = {\n                    value: request2[key]\n                };\n            }\n        }\n        const retVal = {};\n        for (const hipieKey in context._hipieResults) {\n            const hipieResult = context._hipieResults[hipieKey];\n            const outputFilter = {};\n            for (let i = 0; i < hipieResult.filters.length; ++i) {\n                const filter = hipieResult.filters[i];\n                if (!filter.isRange()) {\n                    outputFilter[filter.fieldid] = changedFilter[filter.fieldid] || { value: undefined };\n                    outputFilter[filter.fieldid].filter = filter;\n                }\n            }\n            retVal[hipieResult.id] = context._resultNameCache[hipieResult.from].filter(function (row) {\n                for (const key2 in outputFilter) {\n                    if (!outputFilter[key2].filter.matches(row, outputFilter[key2].value)) {\n                        return false;\n                    }\n                }\n                return true;\n            });\n        }\n        return retVal;\n    }\n};\n\n//  HIPIEDatabomb  ---\nfunction HIPIEDatabomb() {\n    HIPIEWorkunit.call(this);\n}\nHIPIEDatabomb.prototype = Object.create(HIPIEWorkunit.prototype);\n\nHIPIEDatabomb.prototype.databomb = function (_) {\n    if (!arguments.length) return this._databomb;\n    this._databomb = _;\n    return this;\n};\n\nHIPIEDatabomb.prototype.databombOutput = function (from, id) {\n    if (!arguments.length) return undefined;\n    this._resultNameCacheCount++;\n    if (this._databomb instanceof Array) {\n        this._resultNameCache[from] = this._databomb.map(espRowFix);\n    } else {\n        this._resultNameCache[from] = this._databomb[from].map(espRowFix);\n    }\n    return this;\n};\n\nHIPIEDatabomb.prototype.fetchResults = function (callback) {\n    const context = this;\n    return new Promise(function (resolve, reject) {\n        if (callback) {\n            console.error(\"Deprecated:  callback, use promise (HIPIEDatabomb.prototype.fetchResults)\");\n            callback(context._resultNameCache);\n        }\n        resolve(context._resultNameCache);\n    });\n};\n\nexport function createESPConnection(url) {\n    url = url || document.URL;\n    const testURL = new ESPUrl()\n        .url(url)\n        ;\n    if (testURL.isWsWorkunits_GetStats()) {\n        return new WsWorkunits_GetStats()\n            .url(url)\n            ;\n    }\n    if (testURL.isWsWorkunits()) {\n        return new WsWorkunits()\n            .url(url)\n            ;\n    }\n    if (testURL.isWsEcl()) {\n        return new WsECL()\n            .url(url)\n            ;\n    }\n    return null;\n}\n\nexport function hookJsonp(func) {\n    jsonp = func;\n}\n\nexport {\n    HIPIEWorkunit,\n    HIPIERoxie,\n    HIPIEDatabomb\n};\n","import { Utility } from \"@hpcc-js/common\";\nimport * as Comms from \"./Comms.ts\";\n\nfunction nestedRowFix(row) {\n    if (row.Row && row.Row instanceof Array) {\n        return row.Row.map(nestedRowFix);\n    } else if (row instanceof Object) {\n        for (const key in row) {\n            row[key] = nestedRowFix(row[key]);\n        }\n    }\n    return row;\n}\n\n//  Basic Comms  ---\nlet enableBasicCommsCache = false;\nlet basicCommsCache = {};\nfunction BasicComms() {\n    Comms.Basic.call(this);\n}\nBasicComms.prototype = Object.create(Comms.Basic.prototype);\n\nBasicComms.prototype.jsonp = function (url, request) {\n    const requestStr = JSON.stringify(request);\n    if (enableBasicCommsCache && basicCommsCache[url] && basicCommsCache[url][requestStr]) {\n        return Promise.resolve(basicCommsCache[url][requestStr]);\n    }\n    return Comms.Basic.prototype.jsonp.apply(this, arguments).then(function (response) {\n        if (enableBasicCommsCache) {\n            if (!basicCommsCache[url]) {\n                basicCommsCache[url] = {};\n            }\n            basicCommsCache[url][requestStr] = response;\n        }\n        return response;\n    });\n};\n\n//  WsWorkunits  ---\nfunction WsWorkunits(baseUrl) {\n    BasicComms.call(this);\n\n    this.url(baseUrl + \"WsWorkunits/\");\n}\nWsWorkunits.prototype = Object.create(BasicComms.prototype);\n\nWsWorkunits.prototype.wuQuery = function (options) {\n    const url = this.getUrl({\n        pathname: \"WsWorkunits/WUQuery.json\"\n    });\n    const request = {\n        Wuid: \"\",\n        Type: \"\",\n        Cluster: \"\",\n        RoxieCluster: \"\",\n        Owner: \"\",\n        State: \"\",\n        StartDate: \"\",\n        EndDate: \"\",\n        ECL: \"\",\n        Jobname: \"\",\n        LogicalFile: \"\",\n        LogicalFileSearchType: \"\",\n        /*\n        ApplicationValues>\n         ApplicationValue>\n          Application: \"\",\n          Name: \"\",\n          Value: \"\",\n         /ApplicationValue>\n        /ApplicationValues>\n        */\n        After: \"\",\n        Before: \"\",\n        Count: \"\",\n        PageSize: 100,\n        PageStartFrom: 0,\n        PageEndAt: \"\",\n        LastNDays: \"\",\n        Sortby: \"\",\n        Descending: 0,\n        CacheHint: \"\"\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    return this.jsonp(url, request).then(function (response) {\n        if (response.WUQueryResponse && response.WUQueryResponse.Workunits) {\n            return response.WUQueryResponse.Workunits.ECLWorkunit;\n        }\n        return [];\n    });\n};\n\n//  Workunit  ---\nfunction Workunit(baseUrl, wuid) {\n    BasicComms.call(this);\n\n    this.url(baseUrl + \"WsWorkunits/\");\n    this._wuid = wuid;\n}\nWorkunit.prototype = Object.create(BasicComms.prototype);\n\nWorkunit.prototype.wuInfo = function (options) {\n    const url = this.getUrl({\n        pathname: \"WsWorkunits/WUInfo.json\"\n    });\n    const request = {\n        Wuid: this._wuid,\n        TruncateEclTo64k: true,\n        IncludeExceptions: false,\n        IncludeGraphs: false,\n        IncludeSourceFiles: false,\n        IncludeResults: false,\n        IncludeResultsViewNames: false,\n        IncludeVariables: false,\n        IncludeTimers: false,\n        IncludeResourceURLs: false,\n        IncludeDebugValues: false,\n        IncludeApplicationValues: false,\n        IncludeWorkflows: false,\n        IncludeXmlSchemas: false,\n        SuppressResultSchemas: true\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    return this.jsonp(url, request).then(function (response) {\n        if (enableBasicCommsCache) {\n            const retVal = { WUInfoResponse: { Workunit: {} } };\n            for (const key in options) {\n                const includeKey = key.substring(7);\n                retVal.WUInfoResponse.Workunit[includeKey] = response.WUInfoResponse.Workunit[includeKey];\n            }\n            basicCommsCache[url][JSON.stringify(request)] = retVal;\n        }\n        return response;\n    });\n};\n\nWorkunit.prototype.wuUpdate = function (options) {\n    const url = this.getUrl({\n        pathname: \"WsWorkunits/WUUpdate.json\"\n    });\n    const request = {\n        Wuid: this._wuid\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    return this.post(url, request);\n};\n\nWorkunit.prototype.appData = function (appID, key, _) {\n    if (arguments.length === 2) {\n        return this.wuInfo({\n            IncludeApplicationValues: true\n        }).then(function (response) {\n            let persistString;\n            if (response.WUInfoResponse && response.WUInfoResponse.Workunit && response.WUInfoResponse.Workunit.ApplicationValues && response.WUInfoResponse.Workunit.ApplicationValues.ApplicationValue) {\n                response.WUInfoResponse.Workunit.ApplicationValues.ApplicationValue.filter(function (row) {\n                    return row.Application === appID && row.Name === key;\n                }).forEach(function (row) {\n                    persistString = row.Value;\n                });\n            }\n            return persistString;\n        });\n    } else if (arguments.length === 3) {\n        return this.wuUpdate({\n            \"ApplicationValues.ApplicationValue.0.Application\": appID,\n            \"ApplicationValues.ApplicationValue.0.Name\": key,\n            \"ApplicationValues.ApplicationValue.0.Value\": _,\n            \"ApplicationValues.ApplicationValue.itemcount\": 1\n        });\n    }\n};\n\nWorkunit.prototype.results = function () {\n    const context = this;\n    return this.wuInfo({\n        IncludeResults: true\n    }).then(function (response) {\n        let retVal = [];\n        if (Utility.exists(\"WUInfoResponse.Workunit.Results.ECLResult\", response)) {\n            retVal = response.WUInfoResponse.Workunit.Results.ECLResult.map(function (result) {\n                return new WUResult(context.getUrl({ pathname: \"WsWorkunits/\" }), context._wuid, result.Name);\n            });\n        }\n        return retVal;\n    });\n};\n\nWorkunit.prototype.result = function (dataSource, resultName) {\n    dataSource = dataSource || this._wuid;\n    return createResult(dataSource, resultName);\n};\n\n//  Workunit Result  ---\nfunction WUResult(baseUrl, wuid, name) {\n    BasicComms.call(this);\n    this.url(baseUrl + \"WUResult.json\");\n    this._wuid = wuid;\n    this._name = name;\n    this._xmlSchema = null;\n}\nWUResult.prototype = Object.create(BasicComms.prototype);\n\nWUResult.prototype.wuid = function (_) {\n    if (!arguments.length) return this._wuid;\n    this._wuid = _;\n    return this;\n};\n\nWUResult.prototype.name = function (_) {\n    if (!arguments.length) return this._name;\n    this._name = _;\n    return this;\n};\n\nWUResult.prototype.query = function (options, filter) {\n    options = options || {};\n    filter = filter || {};\n    const request = {\n        Wuid: this._wuid,\n        ResultName: this._name,\n        SuppressXmlSchema: true,\n        Start: 0,\n        Count: -1\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    let filterIdx = 0;\n    for (const fKey in filter) {\n        request[\"FilterBy.NamedValue.\" + filterIdx + \".Name\"] = fKey;\n        request[\"FilterBy.NamedValue.\" + filterIdx + \".Value\"] = filter[fKey];\n        ++filterIdx;\n    }\n    if (filterIdx) {\n        request[\"FilterBy.NamedValue.itemcount\"] = filterIdx;\n    }\n    const context = this;\n    return this.jsonp(this.url(), request).then(function (response) {\n        if (response.WUResultResponse &&\n            response.WUResultResponse.Result &&\n            response.WUResultResponse.Result[context._name]) {\n            if (enableBasicCommsCache) {\n                basicCommsCache[context.url()][JSON.stringify(request)] = {\n                    WUResultResponse: {\n                        Result: response.WUResultResponse.Result\n                    }\n                };\n            }\n            context._xmlSchema = response.WUResultResponse.Result.XmlSchema;\n            return nestedRowFix(response.WUResultResponse.Result[context._name]);\n        }\n        return [];\n    });\n};\n\n//  Logical File  ---\nfunction LogicalFile(baseUrl, logicalName) {\n    BasicComms.call(this);\n    this.url(baseUrl + \"WUResult.json\");\n    this._logicalName = logicalName;\n    this._xmlSchema = null;\n}\nLogicalFile.prototype = Object.create(BasicComms.prototype);\n\nLogicalFile.prototype.query = function (options, filter) {\n    options = options || {};\n    filter = filter || {};\n    const request = {\n        Cluster: \"hthor\",  //  TODO:  Should not be needed  ---\n        LogicalName: this._logicalName,\n        SuppressXmlSchema: this._xmlSchema !== null,\n        Start: 0,\n        Count: -1\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    let filterIdx = 0;\n    for (const fKey in filter) {\n        request[\"FilterBy.NamedValue.\" + filterIdx + \".Name\"] = fKey;\n        request[\"FilterBy.NamedValue.\" + filterIdx + \".Value\"] = filter[fKey];\n        ++filterIdx;\n    }\n    if (filterIdx) {\n        request[\"FilterBy.NamedValue.itemcount\"] = filterIdx;\n    }\n    const context = this;\n    return this.jsonp(this.url(), request).then(function (response) {\n        if (response.WUResultResponse &&\n            response.WUResultResponse.Result &&\n            response.WUResultResponse.Result.Row) {\n            context._xmlSchema = response.WUResultResponse.Result.XmlSchema;\n            return nestedRowFix(response.WUResultResponse.Result.Row);\n        }\n        return [];\n    });\n};\n\n//  Roxie Query  ---\nfunction RoxieQuery(baseUrl, resultName) {\n    BasicComms.call(this);\n    const urlParts = baseUrl.split(\"/\");\n    let queryName = urlParts.pop();\n    if (queryName.toLowerCase() === \"json\") {\n        queryName = urlParts.pop();\n    }\n    this._queryName = queryName;\n    this._resultName = resultName;\n    this.url(urlParts.join(\"/\") + \"/\" + queryName + \"/json\");\n}\nRoxieQuery.prototype = Object.create(BasicComms.prototype);\n\nfunction trimRight(str) {\n    if (str && str.replace) {\n        return str.replace(/ +$/, \"\");\n    }\n    return str;\n}\n\nfunction postFilter(results, filter) {\n    return results.filter(function (row) {\n        for (const key in filter) {\n            if (row[key] !== undefined && trimRight(filter[key]) !== trimRight(row[key])) {\n                return false;\n            }\n        }\n        return true;\n    });\n}\n\nfunction locateRoxieResponse(response) {\n    // v5 and v6 compatible ---\n    for (const key in response) {\n        if (response[key].Row && response[key].Row instanceof Array) {\n            return response;\n        }\n        const retVal = locateRoxieResponse(response[key]);\n        if (retVal) {\n            return retVal;\n        }\n    }\n    return null;\n}\n\nRoxieQuery.prototype.query = function (options, filter) {\n    options = options || {};\n    filter = filter || {};\n    const request = {\n    };\n    for (const key in options) {\n        request[key] = options[key];\n    }\n    for (const fKey in filter) {\n        request[fKey] = filter[fKey];\n    }\n    const context = this;\n    return this.jsonp(this.url(), request).then(function (response) {\n        response = locateRoxieResponse(response);\n        if (response) {\n            if (context._resultName) {\n                if (response && response[context._resultName] && response[context._resultName].Row) {\n                    return nestedRowFix(postFilter(response[context._resultName].Row, filter));\n                }\n            } else {\n                for (const key in response) {\n                    if (response[key].Row) {\n                        return nestedRowFix(postFilter(response[key].Row, filter));\n                    }\n                }\n            }\n        }\n        return [];\n    });\n};\n\nexport function createResult(_espUrl, dataSource, resultName?) {\n    const espUrl = new Comms.ESPUrl()\n        .url(_espUrl)\n        ;\n    if (dataSource.indexOf(\"http\") === 0) {\n        return new RoxieQuery(dataSource, resultName);\n    } else if (dataSource.indexOf(\"~\") === 0 || dataSource.indexOf(\"::\") >= 0) {\n        return new LogicalFile(espUrl.getUrl({ pathname: \"WsWorkunits/\" }), dataSource);\n    } else if (dataSource) {\n        return new WUResult(espUrl.getUrl({ pathname: \"WsWorkunits/\" }), dataSource, resultName);\n    }\n    return null;\n}\n\nexport function enableCache(_?: any): any | undefined {\n    if (!arguments.length) return enableBasicCommsCache;\n    enableBasicCommsCache = _;\n    if (!_) {\n        basicCommsCache = {};\n    }\n}\nexport function cache(_?: any): any | undefined {\n    if (!arguments.length) return basicCommsCache;\n    basicCommsCache = _;\n}\nexport function createConnection(url) {\n    url = url || document.URL;\n    const testURL = new Comms.ESPUrl()\n        .url(url)\n        ;\n    if (testURL.isWsWorkunits()) {\n        const espConnection = Comms.createESPConnection(url);\n        if (espConnection instanceof Comms.WsWorkunits && espConnection.wuid()) {\n            return new Workunit(espConnection.getUrl({ pathname: \"\" }), espConnection.wuid())\n                .url(url)\n                ;\n        }\n    }\n    return null;\n}\nexport function flattenResult(result, mappings) {\n    const retVal = {\n        columns: [],\n        data: []\n    };\n    if (result && result.length) {\n        const colIdx = {};\n        if (mappings && mappings.length) {\n            mappings.forEach(function (mapping) {\n                colIdx[mapping.value.toLowerCase()] = retVal.columns.length;\n                retVal.columns.push(mapping.key);\n            });\n        } else {\n            for (const key in result[0]) {\n                colIdx[key.toLowerCase()] = retVal.columns.length;\n                retVal.columns.push(key);\n            }\n        }\n        result.forEach(function (row, rowIdx) {\n            const rowArr = [];\n            for (const key in row) {\n                if (colIdx[key.toLowerCase()] !== undefined) {\n                    rowArr[colIdx[key.toLowerCase()]] = row[key];\n                }\n            }\n            retVal.data.push(rowArr);\n        });\n    }\n    return retVal;\n}\n","'use strict';\n\nif (typeof module !== 'undefined') module.exports = simpleheat;\n\nfunction simpleheat(canvas) {\n    if (!(this instanceof simpleheat)) return new simpleheat(canvas);\n\n    this._canvas = canvas = typeof canvas === 'string' ? document.getElementById(canvas) : canvas;\n\n    this._ctx = canvas.getContext('2d');\n    this._width = canvas.width;\n    this._height = canvas.height;\n\n    this._max = 1;\n    this._data = [];\n}\n\nsimpleheat.prototype = {\n\n    defaultRadius: 25,\n\n    defaultGradient: {\n        0.4: 'blue',\n        0.6: 'cyan',\n        0.7: 'lime',\n        0.8: 'yellow',\n        1.0: 'red'\n    },\n\n    data: function (data) {\n        this._data = data;\n        return this;\n    },\n\n    max: function (max) {\n        this._max = max;\n        return this;\n    },\n\n    add: function (point) {\n        this._data.push(point);\n        return this;\n    },\n\n    clear: function () {\n        this._data = [];\n        return this;\n    },\n\n    radius: function (r, blur) {\n        blur = blur === undefined ? 15 : blur;\n\n        // create a grayscale blurred circle image that we'll use for drawing points\n        var circle = this._circle = this._createCanvas(),\n            ctx = circle.getContext('2d'),\n            r2 = this._r = r + blur;\n\n        circle.width = circle.height = r2 * 2;\n\n        ctx.shadowOffsetX = ctx.shadowOffsetY = r2 * 2;\n        ctx.shadowBlur = blur;\n        ctx.shadowColor = 'black';\n\n        ctx.beginPath();\n        ctx.arc(-r2, -r2, r, 0, Math.PI * 2, true);\n        ctx.closePath();\n        ctx.fill();\n\n        return this;\n    },\n\n    resize: function () {\n        this._width = this._canvas.width;\n        this._height = this._canvas.height;\n    },\n\n    gradient: function (grad) {\n        // create a 256x1 gradient that we'll use to turn a grayscale heatmap into a colored one\n        var canvas = this._createCanvas(),\n            ctx = canvas.getContext('2d'),\n            gradient = ctx.createLinearGradient(0, 0, 0, 256);\n\n        canvas.width = 1;\n        canvas.height = 256;\n\n        for (var i in grad) {\n            gradient.addColorStop(+i, grad[i]);\n        }\n\n        ctx.fillStyle = gradient;\n        ctx.fillRect(0, 0, 1, 256);\n\n        this._grad = ctx.getImageData(0, 0, 1, 256).data;\n\n        return this;\n    },\n\n    draw: function (minOpacity) {\n        if (!this._circle) this.radius(this.defaultRadius);\n        if (!this._grad) this.gradient(this.defaultGradient);\n\n        var ctx = this._ctx;\n\n        ctx.clearRect(0, 0, this._width, this._height);\n\n        // draw a grayscale heatmap by putting a blurred circle at each data point\n        for (var i = 0, len = this._data.length, p; i < len; i++) {\n            p = this._data[i];\n            ctx.globalAlpha = Math.max(p[2] / this._max, minOpacity === undefined ? 0.05 : minOpacity);\n            ctx.drawImage(this._circle, p[0] - this._r, p[1] - this._r);\n        }\n\n        // colorize the heatmap, using opacity value of each pixel to get the right color from our gradient\n        var colored = ctx.getImageData(0, 0, this._width, this._height);\n        this._colorize(colored.data, this._grad);\n        ctx.putImageData(colored, 0, 0);\n\n        return this;\n    },\n\n    _colorize: function (pixels, gradient) {\n        for (var i = 0, len = pixels.length, j; i < len; i += 4) {\n            j = pixels[i + 3] * 4; // get gradient color from opacity value\n\n            if (j) {\n                pixels[i] = gradient[j];\n                pixels[i + 1] = gradient[j + 1];\n                pixels[i + 2] = gradient[j + 2];\n            }\n        }\n    },\n\n    _createCanvas: function () {\n        if (typeof document !== 'undefined') {\n            return document.createElement('canvas');\n        } else {\n            // create a new canvas instance in node.js\n            // the canvas class needs to have a default constructor without any parameter\n            return new this._canvas.constructor();\n        }\n    }\n};\n","import { CanvasWidget, Palette } from \"@hpcc-js/common\";\nimport * as _simpleheat from \"simpleheat\";\n\nconst simpleheat = (window as any).simpleheat || (_simpleheat && _simpleheat.default) || _simpleheat;\n\nexport class HeatMap extends CanvasWidget {\n    _heat;\n\n    constructor() {\n        super();\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        // canvas size needs to be set before render\n        this.resize(this._size);\n        this._heat = simpleheat(domNode);\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        this._palette = this._palette.switch(this.paletteID());\n        if (this.useClonedPalette()) {\n            this._palette = this._palette.cloneNotExists(this.paletteID() + \"_\" + this.id());\n        }\n\n        if (this.topLeftX_exists() && this.topLeftY_exists() && this.bottomRightX_exists() && this.bottomRightY_exists()) {\n            this._heat.data(this.skewedData());\n        } else {\n            this._heat.data(this.data());\n        }\n\n        if (this.radius()) {\n            this._heat.radius(this.radius(), this.blur());\n        }\n        if (this.usePalette()) {\n            const grad = {};\n            for (let idx = 1; idx <= this.colorCount(); idx++) {\n                const value = idx / this.colorCount();\n                grad[value] = this._palette(idx, 1, this.colorCount());\n            }\n            this._heat.defaultGradient = grad;\n            this._heat.gradient(grad);\n        } else if (this.gradient()) {\n            this._heat.defaultGradient = this.gradient();\n            this._heat.gradient(this.gradient());\n        }\n\n        this._heat.draw();\n    }\n\n    exit(domNode, element) {\n        delete this._heat;\n        super.exit(domNode, element);\n    }\n\n    resize(size: any): this {\n        const retVal = CanvasWidget.prototype.resize.apply(this, arguments);\n        if (this._heat !== undefined) {\n            this._heat.resize();\n        }\n        return retVal;\n    }\n\n    skewedData() {\n        const context = this;\n        const retArr = [];\n        const arr = this.data();\n        const box = this.size();\n\n        const coordsWidth = this.bottomRightX() - this.topLeftX();\n        const coordsHeight = this.bottomRightY() - this.topLeftY();\n\n        const pixelValueX = coordsWidth / box.width;\n        const pixelValueY = coordsHeight / box.height;\n\n        arr.forEach(function (n) {\n            const left = Math.abs(n[0] - context.topLeftX());\n            const top = Math.abs(n[1] - context.topLeftY());\n\n            const newX = left / pixelValueX;\n            const newY = top / pixelValueY;\n\n            retArr.push([newX, newY, n[2]]);\n        });\n\n        return retArr;\n    }\n}\nHeatMap.prototype._class += \" other_HeatMap\";\nHeatMap.prototype._palette = Palette.rainbow(\"default\");\n\nexport interface HeatMap {\n    _palette;\n\n    radius(): number;\n    radius(_: number): this;\n    radius_exists(): boolean;\n    blur(): number;\n    blur(_: number): this;\n    blur_exists(): boolean;\n    max(): number;\n    max(_: number): this;\n    max_exists(): boolean;\n    gradient(): object;\n    gradient(_: object): this;\n    gradient_exists(): boolean;\n    usePalette(): boolean;\n    usePalette(_: boolean): this;\n    usePalette_exists(): boolean;\n    colorCount(): number;\n    colorCount(_: number): this;\n    colorCount_exists(): boolean;\n    paletteID(): string;\n    paletteID(_: string): this;\n    paletteID_exists(): boolean;\n    useClonedPalette(): boolean;\n    useClonedPalette(_: boolean): this;\n    useClonedPalette_exists(): boolean;\n    topLeftX(): number;\n    topLeftX(_: number): this;\n    topLeftX_exists(): boolean;\n    topLeftY(): number;\n    topLeftY(_: number): this;\n    topLeftY_exists(): boolean;\n    bottomRightX(): number;\n    bottomRightX(_: number): this;\n    bottomRightX_exists(): boolean;\n    bottomRightY(): number;\n    bottomRightY(_: number): this;\n    bottomRightY_exists(): boolean;\n}\n\nHeatMap.prototype.publish(\"radius\", 15, \"number\", \"Set point radius\", null, { tags: [\"Basic\"] });\nHeatMap.prototype.publish(\"blur\", 15, \"number\", \"Set point blur\", null, { tags: [\"Basic\"] });\nHeatMap.prototype.publish(\"max\", 1, \"number\", \"Set max data value\", null, { tags: [\"Basic\"] });\n\nHeatMap.prototype.publish(\"gradient\", { 0.4: \"blue\", 0.6: \"cyan\", 0.7: \"lime\", 0.8: \"yellow\", 1.0: \"red\" }, \"object\", \"Set gradient colors\", null, { tags: [\"Basic\"] });\n\nHeatMap.prototype.publish(\"usePalette\", false, \"boolean\", \"If true, uses paletteID and colorCount to determine gradient\", null, { tags: [\"Basic\"] });\n\nHeatMap.prototype.publish(\"colorCount\", 10, \"number\", \"Top left x-value\", null, { tags: [\"Basic\"] });\nHeatMap.prototype.publish(\"paletteID\", \"default\", \"set\", \"Color palette for this widget\", HeatMap.prototype._palette.switch(), { tags: [\"Basic\"] });\nHeatMap.prototype.publish(\"useClonedPalette\", false, \"boolean\", \"Enable or disable using a cloned palette\", null, { tags: [\"Intermediate\", \"Shared\"] });\n\nHeatMap.prototype.publish(\"topLeftX\", null, \"number\", \"Top left x-value\", null, { tags: [\"Basic\"], optional: true });\nHeatMap.prototype.publish(\"topLeftY\", null, \"number\", \"Top left y-value\", null, { tags: [\"Basic\"], optional: true });\nHeatMap.prototype.publish(\"bottomRightX\", null, \"number\", \"Bottom right x-value\", null, { tags: [\"Basic\"], optional: true });\nHeatMap.prototype.publish(\"bottomRightY\", null, \"number\", \"Bottom right y-value\", null, { tags: [\"Basic\"], optional: true });\n","import { SVGWidget } from \"@hpcc-js/common\";\n\nexport class HPCCBadge extends SVGWidget {\n    protected root;\n    protected logo;\n    protected logo_accent;\n    protected logo_circles;\n    protected line;\n    protected circle_1;\n    protected circle_2;\n    protected circle_3;\n    protected circle_4;\n    protected circle_5;\n    protected circle_6;\n    protected circle_7;\n    protected circle_8;\n    protected circle_accent;\n    protected text;\n    protected text_hpccsystems;\n    protected text_r;\n    protected text_tm;\n\n    constructor() {\n        super();\n    }\n\n    testData(domNode, element) {\n        return this;\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n\n        this.root = element.append(\"g\");\n        this.logo = this.root.append(\"g\");\n        this.logo_accent = this.root.append(\"g\");\n        this.line = this.logo_accent.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"m 189.38849,364.55373 c 191.6,3.8 0,0 191.6,3.8 l 0.1,-4.2 c -191.7,0.4 0,0 -191.7,0.4 z\")\n            ;\n        this.circle_accent = this.logo_accent.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#6E6E73\")\n            .attr(\"d\", \"M421.3,354.2c6.9,6.9,3.1,18.7-8.6,26.1c-11.8,7.4-26.3,6.9-32.1-0.6c-5.5-7.2-1.1-18.2,9.6-25C401,348,414.7,347.6,421.3,354.2z\")\n            ;\n        this.logo_circles = this.logo.append(\"g\");\n        this.circle_1 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"m 258.9815,363.84947 c 1.3,-3 1.5,-5.9 0.4,-8.1 -2.6,-5.4 -11.8,-5.1 -20.6,0.4 -3.5,2.2 -6.5,4.9 -8.7,7.8 -0.11933,0.35821 -0.39477,0.60735 -0.6,0.9 -2.9,4.1 -4.2,8.3 -3,11.6 2.1,6 11.4,6.3 20.9,0.4 5,-3.2 8.9,-7.3 11,-11.4 -0.59813,0.54778 0.47385,-1.28911 0.6,-1.6 z\")\n            ;\n        this.circle_2 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M291.3,349.3c9.5-5.9,14.1-15,10.5-20c-3.5-4.8-13.3-4.2-22.1,1.3c-8.8,5.5-13.7,14.1-10.9,19.3C271.7,355.4,281.9,355.2,291.3,349.3z\")\n            ;\n        this.circle_3 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M335.3,321.7c9.5-5.9,13.3-14.5,8.9-19c-4.3-4.3-14.8-3.2-23.6,2.3c-8.8,5.5-13.1,13.7-9.4,18.4C315,328.3,325.9,327.7,335.3,321.7z\")\n            ;\n        this.circle_4 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M273.2,384c-3.2-6.5-13.5-6.7-23.2-0.7c-9.7,6-15.6,16.4-13.2,23.4c2.5,7.3,13.1,8.2,23.6,1.7 C270.8,401.9,276.5,390.8,273.2,384z\")\n            ;\n        this.circle_5 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"m 320.84499,363.83119 c 1,-3.4 0.8,-6.6 -1,-9.1 -4.2,-5.9 -15.3,-5.6 -25,0.5 -3.89999,2.4 -7.09999,5.5 -9.19999,8.7 -1.18854,2.2092 -0.0404,-0.09 -1.2,2.2 -2.2,4.1 -2.7,8.3 -0.9,11.5 3.6,6.7 15.09999,7 25.59999,0.5 5,-3.2 8.7,-7.2 10.7,-11.3 0.95557,-2.97582 0.0423,0.0306 1,-3 z\")\n            ;\n        this.circle_6 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M330.4,348.2c4.6,6,17,5.8,27.5-0.8c10.5-6.6,14.3-16.5,8.9-22c-5.2-5.3-17.1-4.4-26.8,1.6C330.3,333.1,325.9,342.4,330.4,348.2z\")\n            ;\n        this.circle_7 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M264.1,417.4c-10.8,6.7-17.2,19-14.2,27.8c3.2,9.2,15.4,11.1,27.2,3.7c11.8-7.4,17.8-20.6,13.6-29.2C286.6,411.6,274.8,410.7,264.1,417.4z\")\n            ;\n        this.circle_8 = this.logo_circles.append(\"path\")\n            .attr(\"fill-rule\", \"evenodd\")\n            .attr(\"clip-rule\", \"evenodd\")\n            .attr(\"fill\", \"#179BD7\")\n            .attr(\"d\", \"M314.2,386.1c-10.8,6.7-16.2,18.4-11.9,26.4c4.5,8.4,17.8,9.5,29.6,2.2c11.8-7.4,16.6-19.9,11.1-27.7C337.7,379.6,324.9,379.3,314.2,386.1z\")\n            ;\n\n        //  Text  ---\n        this.text = this.root.append(\"g\");\n        this.text_hpccsystems = this.text.append(\"path\")\n            .attr(\"fill\", \"#6E6E73\")\n            .attr(\"d\", \"M224.2,476.3c0.1-1.3,0.1-2.7,0.2-4.1c-0.3,0-0.5,0.1-0.8,0.1c-0.3,0-0.5,0-0.8,0c-0.3,0-0.5,0-0.8,0c-0.3,0-0.5-0.1-0.8-0.1c0.1,1.4,0.1,2.8,0.2,4.1c0.1,1.3,0.1,2.7,0.1,4.1v1.1c-1.1,0-2.3,0-3.3,0.1c-1.1,0-2.2,0-3.3,0c-1.1,0-2.3,0-3.3,0c-1.1,0-2.2,0-3.3-0.1v-1.1c0-1.4,0-2.8,0.1-4.1c0.1-1.3,0.1-2.7,0.2-4.1c-0.3,0-0.5,0.1-0.8,0.1c-0.3,0-0.5,0-0.8,0c-0.3,0-0.5,0-0.8,0c-0.3,0-0.5-0.1-0.8-0.1c0.1,1.4,0.1,2.8,0.2,4.1c0.1,1.3,0.1,2.7,0.1,4.1v5.5c0,1.4,0,2.8-0.1,4.1c-0.1,1.4-0.1,2.7-0.2,4c0.5,0,1-0.1,1.6-0.1c0.6,0,1.1,0,1.6,0.1c-0.1-1.3-0.1-2.7-0.2-4c-0.1-1.4-0.1-2.7-0.1-4.1v-2.9c1.1,0,2.3,0,3.3,0c1.1,0,2.2,0,3.3,0c1.1,0,2.3,0,3.3,0c1.1,0,2.2,0,3.3,0v2.9c0,1.4,0,2.8-0.1,4.1c-0.1,1.4-0.1,2.7-0.2,4c0.5,0,1-0.1,1.6-0.1c0.6,0,1.1,0,1.6,0.1c-0.1-1.3-0.1-2.7-0.2-4c-0.1-1.4-0.1-2.7-0.1-4.1v-5.5C224.1,479,224.1,477.7,224.2,476.3z M242.7,473.8c-0.4-0.4-0.9-0.7-1.4-0.9c-0.5-0.2-1-0.4-1.5-0.5c-0.5-0.1-1-0.2-1.5-0.2c-0.5,0-0.9,0-1.2,0c-0.2,0-0.5,0-0.9,0c-0.3,0-0.7,0-1.1,0c-0.4,0-0.7,0-1.1,0c-0.4,0-0.7,0-0.9,0c-0.5,0-1,0-1.5,0c-0.5,0-1-0.1-1.5-0.1c0.1,1.4,0.1,2.8,0.2,4.1c0.1,1.3,0.1,2.7,0.1,4.1v5.5c0,1.4,0,2.8-0.1,4.1c-0.1,1.4-0.1,2.7-0.2,4c0.5,0,1-0.1,1.6-0.1c0.6,0,1.1,0,1.6,0.1c-0.1-1.3-0.1-2.7-0.2-4c-0.1-1.4-0.1-2.7-0.1-4.1v-1.8c0.4,0,0.8,0.1,1.2,0.1c0.4,0,0.8,0,1.3,0c0.8,0,1.6-0.1,2.6-0.3c1-0.2,1.9-0.5,2.8-1c0.9-0.5,1.6-1.2,2.2-2c0.6-0.9,0.9-2,0.9-3.4c0-0.9-0.1-1.6-0.4-2.2C243.5,474.7,243.1,474.2,242.7,473.8z M240.6,480.4c-0.4,0.7-0.9,1.2-1.4,1.6c-0.6,0.4-1.2,0.7-1.9,0.8c-0.7,0.1-1.4,0.2-2,0.2c-0.8,0-1.5-0.1-2.3-0.3v-9.5h2.9c0.8,0,1.6,0.1,2.2,0.2c0.7,0.1,1.2,0.3,1.7,0.7c0.5,0.3,0.8,0.8,1.1,1.3c0.3,0.6,0.4,1.3,0.4,2.2C241.2,478.8,241,479.7,240.6,480.4z M251.9,475.4c0.8-0.8,1.7-1.5,2.8-1.9c1.1-0.4,2.2-0.6,3.5-0.6c0.8,0,1.5,0.1,2.1,0.3c0.6,0.2,1.2,0.5,1.7,0.7c0.5,0.3,1,0.6,1.3,0.9c0.4,0.3,0.7,0.6,0.9,0.9l0.2-0.1c0.1-0.3,0.1-0.8,0.3-1.3c0.1-0.5,0.2-0.9,0.4-1.2c-0.9-0.4-1.9-0.7-3.1-1c-1.2-0.3-2.4-0.4-3.8-0.4c-1.8,0-3.4,0.3-4.8,0.8c-1.5,0.5-2.7,1.3-3.8,2.2c-1.1,1-1.9,2.2-2.5,3.6c-0.6,1.4-0.9,3-0.9,4.8c0,1.8,0.3,3.4,0.9,4.8c0.6,1.4,1.4,2.6,2.4,3.6c1,1,2.3,1.7,3.7,2.2c1.4,0.5,3,0.7,4.7,0.7c0.8,0,1.5-0.1,2.3-0.2c0.7-0.1,1.4-0.3,2-0.4c0.6-0.2,1.1-0.3,1.5-0.5c0.4-0.2,0.7-0.4,0.9-0.6l0.3-1.9l-0.1-0.1c-0.3,0.2-0.7,0.5-1.1,0.8c-0.4,0.3-0.9,0.6-1.5,0.9c-0.5,0.3-1.1,0.5-1.8,0.7c-0.6,0.2-1.4,0.3-2.1,0.3c-1.3,0-2.4-0.2-3.5-0.6c-1.1-0.4-2-1-2.8-1.9c-0.8-0.8-1.4-1.9-1.9-3.2c-0.4-1.3-0.7-2.8-0.7-4.6c0-1.8,0.2-3.3,0.7-4.6 C250.5,477.3,251.1,476.3,251.9,475.4z M273.2,475.4c0.8-0.8,1.7-1.5,2.8-1.9c1.1-0.4,2.2-0.6,3.5-0.6c0.8,0,1.5,0.1,2.1,0.3c0.6,0.2,1.2,0.5,1.7,0.7c0.5,0.3,1,0.6,1.3,0.9c0.4,0.3,0.7,0.6,0.9,0.9l0.2-0.1c0.1-0.3,0.1-0.8,0.3-1.3c0.1-0.5,0.2-0.9,0.4-1.2c-0.9-0.4-1.9-0.7-3.1-1c-1.2-0.3-2.4-0.4-3.8-0.4c-1.8,0-3.4,0.3-4.8,0.8c-1.5,0.5-2.7,1.3-3.8,2.2c-1.1,1-1.9,2.2-2.5,3.6c-0.6,1.4-0.9,3-0.9,4.8c0,1.8,0.3,3.4,0.9,4.8c0.6,1.4,1.4,2.6,2.4,3.6c1,1,2.3,1.7,3.7,2.2c1.4,0.5,3,0.7,4.7,0.7c0.8,0,1.5-0.1,2.3-0.2c0.7-0.1,1.4-0.3,2-0.4c0.6-0.2,1.1-0.3,1.5-0.5c0.4-0.2,0.7-0.4,0.9-0.6l0.3-1.9l-0.1-0.1c-0.3,0.2-0.7,0.5-1.1,0.8c-0.4,0.3-0.9,0.6-1.5,0.9c-0.5,0.3-1.1,0.5-1.8,0.7c-0.6,0.2-1.4,0.3-2.1,0.3c-1.3,0-2.4-0.2-3.5-0.6c-1.1-0.4-2-1-2.8-1.9c-0.8-0.8-1.4-1.9-1.9-3.2c-0.4-1.3-0.7-2.8-0.7-4.6c0-1.8,0.2-3.3,0.7-4.6 C271.8,477.3,272.4,476.3,273.2,475.4z M308.2,482.9c-0.7-0.4-1.5-0.8-2.4-1.1c-0.9-0.3-1.7-0.7-2.4-1.1c-0.7-0.4-1.4-0.9-1.9-1.5c-0.5-0.6-0.7-1.4-0.7-2.4c0-0.6,0.1-1.1,0.3-1.6c0.2-0.5,0.5-0.9,0.9-1.3c0.4-0.4,0.8-0.6,1.3-0.8c0.5-0.2,1-0.3,1.6-0.3c0.6,0,1.1,0.1,1.5,0.3c0.4,0.2,0.8,0.5,1.1,0.7c0.3,0.3,0.6,0.6,0.7,1c0.2,0.4,0.3,0.7,0.4,1h0.4c0.1-0.6,0.3-1.1,0.4-1.5c0.1-0.4,0.3-0.8,0.5-1.1c-0.6-0.5-1.3-0.9-2.1-1.1c-0.7-0.2-1.6-0.4-2.6-0.4c-1.1,0-2,0.1-2.9,0.4c-0.9,0.3-1.6,0.7-2.2,1.2c-0.6,0.5-1.1,1.2-1.4,1.9c-0.3,0.7-0.5,1.5-0.5,2.4c0,1.3,0.2,2.3,0.7,3c0.5,0.7,1.1,1.4,1.9,1.8c0.7,0.5,1.5,0.9,2.4,1.2c0.9,0.3,1.7,0.7,2.4,1.1c0.7,0.4,1.4,0.9,1.9,1.4c0.5,0.6,0.7,1.3,0.7,2.3c0,0.6-0.1,1.2-0.3,1.8c-0.2,0.6-0.5,1.1-0.9,1.5c-0.4,0.4-0.9,0.7-1.4,1c-0.6,0.2-1.2,0.4-1.9,0.4c-0.7,0-1.3-0.1-1.8-0.3c-0.6-0.2-1-0.5-1.5-0.8c-0.4-0.3-0.8-0.7-1.1-1.1c-0.3-0.4-0.5-0.8-0.7-1.2h-0.4c-0.1,0.6-0.1,1.1-0.2,1.5c-0.1,0.4-0.2,0.8-0.4,1.3c0.6,0.4,1.2,0.8,2.1,1.2c0.8,0.4,1.9,0.5,3.2,0.5c1.2,0,2.3-0.2,3.3-0.5c1-0.4,1.8-0.8,2.5-1.5c0.7-0.6,1.2-1.4,1.5-2.3c0.4-0.9,0.5-1.8,0.5-2.8c0-1.2-0.2-2.1-0.7-2.8C309.6,483.9,309,483.3,308.2,482.9z M328.6,472.2c-0.4,0.9-0.9,1.9-1.4,2.8c-0.5,1-1,1.9-1.5,2.9c-0.5,1-1.1,1.9-1.6,2.8c-0.5,0.9-1,1.8-1.5,2.5c-1.1-1.9-2.2-3.8-3.1-5.6c-1-1.8-2-3.6-2.9-5.5c-0.3,0-0.6,0.1-0.9,0.1c-0.3,0-0.6,0-0.9,0c-0.3,0-0.6,0-0.9,0c-0.3,0-0.6-0.1-0.9-0.1c0.2,0.3,0.5,0.8,0.9,1.5c0.4,0.7,0.9,1.4,1.4,2.3c0.5,0.8,1,1.7,1.6,2.6c0.6,0.9,1.1,1.8,1.6,2.6c0.5,0.8,1,1.6,1.4,2.3c0.4,0.7,0.7,1.2,0.9,1.6c0,1.7,0,3.4,0,4.9c0,1.6-0.1,2.9-0.2,4c0.5,0,1-0.1,1.6-0.1c0.6,0,1.1,0,1.6,0.1c0-0.4-0.1-1-0.1-1.8c0-0.7-0.1-1.5-0.1-2.4c0-0.9,0-1.7,0-2.6c0-0.9,0-1.7,0-2.5c0.3-0.7,0.7-1.4,1.2-2.2c0.5-0.8,1-1.7,1.6-2.8c0.6-1,1.3-2.2,2.1-3.4c0.8-1.3,1.7-2.7,2.7-4.2c-0.5,0.1-0.9,0.2-1.2,0.2C329.5,472.3,329.1,472.3,328.6,472.2z M343.6,482.9c-0.7-0.4-1.5-0.8-2.4-1.1c-0.9-0.3-1.7-0.7-2.4-1.1c-0.7-0.4-1.4-0.9-1.9-1.5c-0.5-0.6-0.7-1.4-0.7-2.4c0-0.6,0.1-1.1,0.3-1.6c0.2-0.5,0.5-0.9,0.9-1.3c0.4-0.4,0.8-0.6,1.3-0.8c0.5-0.2,1-0.3,1.6-0.3c0.6,0,1.1,0.1,1.5,0.3c0.4,0.2,0.8,0.5,1.1,0.7c0.3,0.3,0.6,0.6,0.7,1c0.2,0.4,0.3,0.7,0.4,1h0.4c0.1-0.6,0.3-1.1,0.4-1.5c0.1-0.4,0.3-0.8,0.5-1.1c-0.6-0.5-1.3-0.9-2.1-1.1c-0.7-0.2-1.6-0.4-2.6-0.4c-1.1,0-2,0.1-2.9,0.4c-0.9,0.3-1.6,0.7-2.2,1.2c-0.6,0.5-1.1,1.2-1.4,1.9c-0.3,0.7-0.5,1.5-0.5,2.4c0,1.3,0.2,2.3,0.7,3c0.5,0.7,1.1,1.4,1.9,1.8c0.7,0.5,1.5,0.9,2.4,1.2c0.9,0.3,1.7,0.7,2.4,1.1c0.7,0.4,1.4,0.9,1.9,1.4c0.5,0.6,0.7,1.3,0.7,2.3c0,0.6-0.1,1.2-0.3,1.8c-0.2,0.6-0.5,1.1-0.9,1.5c-0.4,0.4-0.9,0.7-1.4,1c-0.6,0.2-1.2,0.4-1.9,0.4c-0.7,0-1.3-0.1-1.8-0.3c-0.6-0.2-1-0.5-1.5-0.8c-0.4-0.3-0.8-0.7-1.1-1.1c-0.3-0.4-0.5-0.8-0.7-1.2h-0.4c-0.1,0.6-0.1,1.1-0.2,1.5c-0.1,0.4-0.2,0.8-0.4,1.3c0.6,0.4,1.2,0.8,2.1,1.2c0.8,0.4,1.9,0.5,3.2,0.5c1.2,0,2.3-0.2,3.3-0.5c1-0.4,1.8-0.8,2.5-1.5c0.7-0.6,1.2-1.4,1.5-2.3c0.4-0.9,0.5-1.8,0.5-2.8c0-1.2-0.2-2.1-0.7-2.8C345,483.9,344.4,483.3,343.6,482.9z M360.7,472.3c-1.3,0-2.7,0-4.1,0c-1.4,0-2.8,0-4.1,0c-1.3,0-2.7-0.1-4.1-0.1c0.1,0.4,0.2,0.8,0.2,1c0,0.3-0.1,0.6-0.2,1c0.4-0.1,1-0.1,1.5-0.2c0.6,0,1.1-0.1,1.8-0.1c0.6,0,1.2-0.1,1.8-0.1c0.6,0,1.2,0,1.7,0c0.1,2.2,0.1,4.4,0.1,6.6v5.5c0,1.4,0,2.8-0.1,4.1c-0.1,1.4-0.1,2.7-0.2,4c0.5,0,1-0.1,1.6-0.1c0.6,0,1.1,0,1.6,0.1c-0.1-1.3-0.1-2.7-0.2-4c-0.1-1.4-0.1-2.7-0.1-4.1v-5.5c0-2.2,0-4.4,0.1-6.6c0.6,0,1.1,0,1.7,0c0.6,0,1.2,0,1.8,0.1c0.6,0,1.2,0.1,1.8,0.1c0.6,0,1.1,0.1,1.5,0.2c-0.1-0.4-0.2-0.7-0.2-1c0-0.3,0.1-0.6,0.2-1C363.4,472.2,362,472.3,360.7,472.3z M379.8,492.3c-0.5,0.1-1.1,0.2-1.8,0.2c-0.7,0.1-1.4,0.1-2.2,0.1c-0.8,0-1.6,0-2.4,0h-2.2c0-0.4,0-1,0-1.8c0-0.8,0-1.8,0-3v-3.2c0-0.3,0-0.6,0-0.8c0-0.2,0-0.4,0-0.6c0.4,0,0.9,0,1.5,0c0.6,0,1.3,0,2.1,0c0.7,0,1.5,0,2.2,0.1c0.7,0,1.4,0.1,1.9,0.2c-0.1-0.3-0.1-0.6-0.1-1c0-0.3,0-0.7,0.1-1c-0.5,0-1,0.1-1.5,0.1c-0.5,0-1.1,0.1-1.7,0.1c-0.6,0-1.3,0.1-2,0.1c-0.7,0-1.6,0-2.5,0c0-0.4,0-1,0-1.8c0-0.8,0-1.6,0-2.4c0-0.8,0-1.5,0-2.1c0-0.6,0.1-1.3,0.1-1.9c1,0,1.9,0,2.7,0c0.7,0,1.4,0.1,2.1,0.1c0.6,0,1.2,0.1,1.8,0.1c0.6,0,1.2,0.1,1.9,0.1c-0.1-0.3-0.1-0.6-0.1-1c0-0.3,0-0.6,0.1-1c-1,0-1.9,0.1-2.8,0.1c-0.9,0-1.9,0-2.8,0c-1,0-1.9,0-2.9,0c-0.9,0-1.9-0.1-2.9-0.1c0.1,1.4,0.1,2.7,0.2,4.1c0.1,1.4,0.1,2.7,0.1,4.1v5.5c0,1.4,0,2.8-0.1,4.1c-0.1,1.4-0.1,2.7-0.2,4.1c1,0,1.9-0.1,2.9-0.1h5.8c0.9,0,1.9,0,2.9,0.1c-0.1-0.2-0.1-0.5-0.1-0.8c0-0.1,0-0.3,0-0.5C379.7,492.6,379.8,492.4,379.8,492.3z M406.8,483.3c-0.2-1.8-0.4-3.7-0.6-5.6c-0.2-1.9-0.4-3.9-0.7-5.9h-0.4c-0.5,1-1.1,2-1.7,3.2c-0.6,1.1-1.2,2.3-1.9,3.4c-0.6,1.2-1.2,2.3-1.8,3.5c-0.6,1.1-1.2,2.2-1.7,3.2c-0.5,1-1,1.8-1.4,2.6c-0.4,0.8-0.7,1.3-0.9,1.7c-1.6-3-3.2-5.9-4.7-8.8c-1.5-2.8-3-5.8-4.4-8.8H386c-0.2,1.7-0.4,3.5-0.6,5.4c-0.2,1.9-0.5,3.8-0.8,5.7c-0.3,1.9-0.6,3.9-0.9,5.8c-0.3,1.9-0.6,3.7-0.9,5.5c0.3,0,0.7-0.1,1.1-0.1c0.4,0,0.8,0,1.1,0.1c0-0.9,0.1-1.9,0.2-3.3c0.1-1.3,0.2-2.7,0.4-4.2c0.1-1.5,0.3-3,0.5-4.6c0.2-1.5,0.3-3,0.5-4.3h0.1c1.4,2.8,2.8,5.6,4.2,8.2c1.4,2.7,2.7,5.4,4,8h0.3c1.3-2.9,2.6-5.7,4-8.3c1.4-2.6,2.9-5.3,4.3-8h0.1c0.3,2.8,0.6,5.5,0.9,8.1c0.2,2.7,0.5,5.4,0.7,8.2c0.3,0,0.5-0.1,0.7-0.1h1.5c0.2,0,0.5,0,0.7,0.1c-0.3-1.8-0.5-3.5-0.7-5.3 C407.2,486.9,407,485.1,406.8,483.3z M423.4,484.6c-0.5-0.7-1.1-1.3-1.9-1.7c-0.7-0.4-1.5-0.8-2.4-1.1c-0.9-0.3-1.7-0.7-2.4-1.1c-0.7-0.4-1.4-0.9-1.9-1.5c-0.5-0.6-0.7-1.4-0.7-2.4c0-0.6,0.1-1.1,0.3-1.6c0.2-0.5,0.5-0.9,0.9-1.3c0.4-0.4,0.8-0.6,1.3-0.8c0.5-0.2,1-0.3,1.6-0.3c0.6,0,1.1,0.1,1.5,0.3c0.4,0.2,0.8,0.5,1.1,0.7c0.3,0.3,0.6,0.6,0.7,1c0.2,0.4,0.3,0.7,0.4,1h0.4c0.1-0.6,0.3-1.1,0.4-1.5c0.1-0.4,0.3-0.8,0.5-1.1c-0.6-0.5-1.3-0.9-2.1-1.1c-0.7-0.2-1.6-0.4-2.6-0.4c-1.1,0-2,0.1-2.9,0.4c-0.9,0.3-1.6,0.7-2.2,1.2c-0.6,0.5-1.1,1.2-1.4,1.9c-0.3,0.7-0.5,1.5-0.5,2.4c0,1.3,0.2,2.3,0.7,3c0.5,0.7,1.1,1.4,1.9,1.8c0.7,0.5,1.5,0.9,2.4,1.2c0.9,0.3,1.7,0.7,2.4,1.1c0.7,0.4,1.4,0.9,1.9,1.4c0.5,0.6,0.7,1.3,0.7,2.3c0,0.6-0.1,1.2-0.3,1.8c-0.2,0.6-0.5,1.1-0.9,1.5c-0.4,0.4-0.9,0.7-1.4,1c-0.6,0.2-1.2,0.4-1.9,0.4c-0.7,0-1.3-0.1-1.8-0.3c-0.6-0.2-1-0.5-1.5-0.8c-0.4-0.3-0.8-0.7-1.1-1.1c-0.3-0.4-0.5-0.8-0.7-1.2h-0.4c-0.1,0.6-0.1,1.1-0.2,1.5c-0.1,0.4-0.2,0.8-0.4,1.3c0.6,0.4,1.2,0.8,2.1,1.2c0.8,0.4,1.9,0.5,3.2,0.5c1.2,0,2.3-0.2,3.3-0.5c1-0.4,1.8-0.8,2.5-1.5c0.7-0.6,1.2-1.4,1.5-2.3c0.4-0.9,0.5-1.8,0.5-2.8 C424.2,486.3,423.9,485.3,423.4,484.6z\")\n            ;\n        this.text_r = this.text.append(\"path\")\n            .attr(\"fill\", \"#6E6E73\")\n            .attr(\"d\", \"M433.1,472.1c2.2,0,3.9,1.8,3.9,3.9c0,2.2-1.8,3.9-3.9,3.9c-2.2,0-3.9-1.8-3.9-3.9 C429.2,473.8,430.9,472.1,433.1,472.1z M433.1,479.5c1.9,0,3.5-1.6,3.5-3.5s-1.5-3.5-3.5-3.5s-3.5,1.6-3.5,3.5 S431.2,479.5,433.1,479.5z M431.7,475c0-0.5,0-1.1-0.1-1.5c0.3,0,0.6,0.1,0.9,0.1c0.3,0,0.6-0.1,0.9-0.1c0.8,0,1.4,0.4,1.4,1.1c0,0.9-1,1.3-1.5,1.4c0.6,0.7,1.5,2,1.9,2.4v0.1c-0.1,0-0.3-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1c-0.5-0.8-1.1-1.6-1.8-2.4h-0.4v0.8c0,0.5,0,1.1,0.1,1.6c-0.1,0-0.2-0.1-0.4-0.1c-0.1,0-0.2,0-0.4,0.1c0-0.5,0.1-1,0.1-1.5V475z M432.2,475.7c0.1,0,0.3,0,0.5,0c0.7,0,1.4-0.3,1.4-1.1c0-0.6-0.4-0.9-1-0.9c-0.3,0-0.5,0-0.8,0.1c0,0.3-0.1,0.7-0.1,1V475.7z\")\n            ;\n        this.text_tm = this.text.append(\"path\")\n            .attr(\"fill\", \"#6E6E73\")\n            .attr(\"d\", \"M376.1,322.1c0-0.6,0-1.2,0-1.9c-0.6,0-1.4,0-1.9,0.1c0-0.1,0-0.2,0-0.3c0-0.1,0-0.2,0-0.3c0.8,0,1.5,0,2.3,0s1.5,0,2.3,0c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3c-0.5-0.1-1.3-0.1-1.9-0.1c0,0.6,0,1.2,0,1.9v1.5c0,0.8,0,1.6,0.1,2.3c-0.2,0-0.3,0-0.4,0c-0.1,0-0.3,0-0.4,0c0-0.8,0.1-1.6,0.1-2.3V322.1zM380.5,319.7c0.8,1.7,1.7,3.3,2.6,5c0.4-0.7,1.8-3.3,2.7-5h0.1c0.3,2.3,0.5,4.3,0.7,6.3c-0.1,0-0.3,0-0.4,0c-0.1,0-0.3,0-0.4,0c-0.1-1.6-0.3-3.1-0.4-4.6h0c-0.8,1.5-1.6,3-2.4,4.6h-0.1c-0.7-1.5-1.5-3-2.3-4.6h0c-0.2,1.5-0.4,3.6-0.4,4.6c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0-0.3,0c0.3-2,0.7-4.4,0.9-6.3H380.5z\")\n            ;\n\n        const bbox = this.root.node().getBBox();\n        const centerX = bbox.x + bbox.width / 2;\n        const centerY = bbox.y + bbox.height / 2;\n        const scale = Math.min(this.width(), this.height()) / Math.max(bbox.width, bbox.height);\n        this.root\n            .attr(\"transform\", \"translate(\" + (-centerX * scale) + \",\" + (-centerY * scale) + \")scale(\" + scale + \")\")\n            ;\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        switch (this.animation()) {\n            case \"none\":\n                break;\n            case \"accentInOut\":\n                this.logo.attr(\"opacity\", 0);\n                this.logo_accent.attr(\"transform\", \"translate(-400, 0)\");\n                this.text.attr(\"opacity\", 0);\n\n                this.logo.transition().duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                this.logo_accent.transition().delay(500).duration(1500)\n                    .attr(\"transform\", \"translate(0, 0)\")\n                    ;\n                this.text.transition().delay(100).duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                this.logo_accent.transition().ease(\"back\").delay(7000).duration(1500)\n                    .attr(\"transform\", \"translate(400, 0)\")\n                    ;\n                this.text.transition().delay(8400).duration(1000)\n                    .attr(\"opacity\", 0)\n                    ;\n                this.logo_accent.transition().delay(8500).duration(1000)\n                    .attr(\"opacity\", 0)\n                    ;\n                this.logo.transition().delay(8500).duration(1000)\n                    .attr(\"opacity\", 0)\n                    ;\n                break;\n            case \"accentIn\":\n                this.logo.attr(\"opacity\", 0);\n                this.logo_accent.attr(\"transform\", \"translate(-400, 0)\");\n                this.text.attr(\"opacity\", 0);\n\n                this.logo.transition().duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                this.logo_accent.transition().delay(500).duration(1500)\n                    .attr(\"transform\", \"translate(0, 0)\")\n                    ;\n                this.text.transition().delay(100).duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                break;\n            case \"fade_in\":\n                this.logo.attr(\"opacity\", 0);\n                // this.logo_accent.attr(\"transform\", \"translate(-400, 0)\");\n                this.logo_accent.attr(\"opacity\", 0);\n                this.text.attr(\"opacity\", 0);\n\n                this.logo.transition().duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                /*\n                this.logo_accent.transition().delay(500).duration(1500)\n                    .attr(\"transform\", \"translate(0, 0)\")\n                ;\n                */\n                this.logo_accent.transition().duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                this.text.transition().delay(100).duration(1000)\n                    .attr(\"opacity\", 1)\n                    ;\n                /*\n                this.logo_accent.transition().ease(\"back\").delay(7000).duration(1500)\n                    .attr(\"transform\", \"translate(400, 0)\")\n                ;\n                */\n                /*\n                this.text.transition().delay(8400).duration(1000)\n                    .attr(\"opacity\", 0)\n                ;\n                this.logo_accent.transition().delay(8500).duration(1000)\n                    .attr(\"opacity\", 0)\n                ;\n                this.logo.transition().delay(8500).duration(1000)\n                    .attr(\"opacity\", 0)\n                ;\n                */\n                break;\n            default:\n                break;\n        }\n    }\n}\nHPCCBadge.prototype._class += \" other_HPCCBadge\";\n\nexport interface HPCCBadge {\n    animation(): \"none\" | \"accentInOut\" | \"accentIn\" | \"fade_in\";\n    animation(_: \"none\" | \"accentInOut\" | \"accentIn\" | \"fade_in\"): this;\n}\n\nHPCCBadge.prototype.publish(\"animation\", \"none\", \"set\", \"Animation Style\", [\"none\", \"accentInOut\", \"accentIn\", \"fade_in\"]);\n","import { HTMLWidget } from \"@hpcc-js/common\";\n\nimport \"../src/Html.css\";\n\nexport class Html extends HTMLWidget {\n    constructor() {\n        super();\n\n        this._tag = \"div\";\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        element\n            .style(\"overflow-x\", this.overflowX_exists() ? this.overflowX() : \"\")\n            .style(\"overflow-y\", this.overflowY_exists() ? this.overflowY() : \"\")\n            ;\n\n        const html = element.selectAll(\".htmlWrapper\").data(this.data().length > 0 ? this.data() : [this.html()]);\n        html.enter().append(\"div\")\n            .attr(\"class\", \"htmlWrapper\")\n            .merge(html)\n            .html(function (d) { return d; })\n            ;\n        html.exit().remove();\n    }\n}\nHtml.prototype._class += \" other_Html\";\n\nexport interface Html {\n    html(): string;\n    html(_: string): Html;\n    overflowX(): string;\n    overflowX(_: string): Html;\n    overflowX_exists(): boolean;\n    overflowY(): string;\n    overflowY(_: string): Html;\n    overflowY_exists(): boolean;\n}\n\nHtml.prototype.publish(\"html\", \"\", \"string\", \"Html to render\", null, { tags: [\"Basic\"] });\nHtml.prototype.publish(\"overflowX\", null, \"set\", \"CSS overflow-x\", [\"\", \"visible\", \"hidden\", \"scroll\", \"auto\", \"initial\", \"inherit\"], { tags: [\"Basic\"], optional: true });\nHtml.prototype.publish(\"overflowY\", null, \"set\", \"CSS overflow-y\", [\"\", \"visible\", \"hidden\", \"scroll\", \"auto\", \"initial\", \"inherit\"], { tags: [\"Basic\"], optional: true });\n","import { Entity, HTMLWidget } from \"@hpcc-js/common\";\nimport { HorizontalList, VerticalList } from \"@hpcc-js/layout\";\nimport { select as d3Select } from \"d3-selection\";\nimport { Html } from \"./Html.ts\";\n\nimport \"../src/IconList.css\";\n\nexport class IconList extends HTMLWidget {\n    protected _list;\n    protected _entity_list = [];\n    protected _content_list = [];\n    constructor() {\n        super();\n        this._list = new HorizontalList()\n            .orientation_default(\"horizontal\")\n            .flexWrap_default(\"nowrap\")\n            ;\n    }\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        element\n            .style(\"height\", \"100%\")\n            .style(\"width\", \"100%\")\n            ;\n        d3Select(domNode.parentElement)\n            .style(\"height\", \"100%\")\n            .style(\"width\", \"100%\")\n            ;\n        this._list.target(domNode);\n    }\n    update(domNode, element) {\n        super.update(domNode, element);\n        const listWidgets = this._list.widgets();\n        this.data().forEach((row, idx) => {\n            if (!listWidgets[idx]) {\n                listWidgets[idx] = this.updateListProperties(new VerticalList(), idx)\n                    .widgets([\n                        this.updateEntityProperties(new Entity(), idx),\n                        new Html().html(this.data()[idx][this.htmlColumnIndex_exists() ? this.htmlColumnIndex() : 1])\n                    ]);\n            } else {\n                listWidgets[idx] = this.updateListProperties(listWidgets[idx], idx);\n                this.updateEntityProperties(listWidgets[idx].widgets()[0], idx);\n                listWidgets[idx]\n                    .widgets()[1]\n                    .html(this.data()[idx][this.htmlColumnIndex_exists() ? this.htmlColumnIndex() : 1])\n                    ;\n            }\n        });\n        this._list.widgets(listWidgets.slice(0, this.data().length));\n        this._list.resize().render();\n    }\n    updateListProperties(list, idx) {\n        return list\n            .disableScroll(true)\n            .widgetsFlexBasis([this.iconSize() + \"px\", `calc(100% - ${this.iconSize()}px)`])\n            ;\n    }\n    updateEntityProperties(entity, idx) {\n        return entity\n            .icon(this.iconColumnIndex_exists() ? this.data()[idx][this.iconColumnIndex()] : \"?\")\n            .iconColor(this.iconColorColumnIndex_exists() ? this.data()[idx][this.iconColorColumnIndex()] : \"#000\")\n            .iconDiameter(this.iconSize())\n            .iconPaddingPercent(0)\n            ;\n    }\n}\nIconList.prototype._class += \" other_IconList\";\n\nexport interface IconList {\n    iconSize(): number;\n    iconSize(_: number): this;\n    iconColumnIndex(): number;\n    iconColumnIndex(_: number): this;\n    iconColumnIndex_exists(): boolean;\n    iconColorColumnIndex(): number;\n    iconColorColumnIndex(_: number): this;\n    iconColorColumnIndex_exists(): boolean;\n    htmlColumnIndex(): number;\n    htmlColumnIndex(_: number): this;\n    htmlColumnIndex_exists(): boolean;\n}\nIconList.prototype.publish(\"iconSize\", 72, \"number\", \"Size of icon (pixels)\");\nIconList.prototype.publish(\"iconColumnIndex\", 0, \"number\", \"Index of column containing icon character\");\nIconList.prototype.publish(\"iconColorColumnIndex\", 1, \"number\", \"Index of column containing icon color\");\nIconList.prototype.publish(\"htmlColumnIndex\", 2, \"number\", \"Index of column containing html string\");\n","import { d3Event, HTMLWidget, select as d3Select } from \"@hpcc-js/common\";\n\nimport \"../src/Paginator.css\";\n\nexport class Paginator extends HTMLWidget {\n    _tNumPages;\n    _numList;\n    paginator;\n    side;\n    _onSelect;\n\n    constructor() {\n        super();\n\n        this._tag = \"div\";\n\n        this._tNumPages = 1; // np\n\n        this._numList = []; // pn\n    }\n\n    postUpdate(domNode, element) { }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        const context = this;\n\n        this.paginator = element.append(\"ul\").attr(\"class\", \"paginator pagination pagination-sm\");\n        this.side = element.append(\"div\").attr(\"class\", \"paginator pagination side\");\n\n        this.side.append(\"span\")\n            .classed(\"side\", true)\n            .text(\"Page \")\n            ;\n\n        this.side.append(\"input\")\n            .attr(\"type\", \"number\")\n            .attr(\"class\", \"currentPageNumber\")\n            .property(\"value\", 1)\n            .attr(\"min\", 1)\n            .on(\"change\", function () {\n                context.pageNumber(this.value);\n                context._onSelect(this.value);\n            })\n            ;\n\n        this.side.append(\"span\")\n            .classed(\"side total\", true)\n            .text(\" of 1\")\n            ;\n    }\n\n    update(domNode, element) {\n        const context = this;\n        element\n            .style(\"bottom\", this.bottom() + \"px\")\n            .style(\"right\", this.right() + \"px\")\n            ;\n\n        this._tNumPages = Math.ceil(this.numItems() / this.itemsPerPage()) || 1;\n\n        if (this.pageNumber() > this._tNumPages) { this.pageNumber(1); }\n\n        this._numList = [];\n        if (this.numItems()) {\n            this._numList.push(\"first\");\n            for (let x = -this.adjacentPages(); x <= this.adjacentPages(); x++) {\n                if (this.pageNumber() + x > 0 && this.pageNumber() + x <= this._tNumPages) {\n                    this._numList.push(this.pageNumber() + x);\n                }\n            }\n            this._numList.push(\"last\");\n        }\n\n        this.side.select(\".total\").text(\" of \" + this._tNumPages);\n        this.side.select(\".currentPageNumber\").property(\"value\", this.pageNumber());\n        this.side.select(\".currentPageNumber\").attr(\"max\", this._tNumPages);\n\n        const page = this.paginator.selectAll(\"li\").data(this._numList, function (d) { return d; });\n        page\n            .enter()\n            .append(function (d) {\n                const li = document.createElement(\"li\");\n\n                if (d !== context.pageNumber()) {\n                    const a = document.createElement(\"a\");\n                    const linkText = document.createTextNode(d);\n\n                    a.appendChild(linkText);\n                    a.href = \"#\";\n                    li.appendChild(a);\n\n                    return li;\n                } else {\n                    const span = document.createElement(\"span\");\n                    span.innerHTML = d;\n\n                    li.appendChild(span);\n\n                    return li;\n                }\n            })\n            .on(\"click\", function (d, i) {\n                d3Event().preventDefault();\n                context.side.select(\".currentPageNumber\").property(\"value\", context.pageNumber());\n                switch (d) {\n                    case \"first\":\n                        if (context.pageNumber() !== 1) {\n                            context.pageNumber(1);\n                            context._onSelect(1, \"previous\");\n                        }\n                        break;\n                    case \"last\":\n                        if (context.pageNumber() !== context._tNumPages) {\n                            context.pageNumber(context._tNumPages);\n                            context._onSelect(context._tNumPages, \"previous\");\n                        }\n                        break;\n                    default:\n                        context.pageNumber(d);\n                        context._onSelect(d);\n                }\n            })\n            ;\n\n        page.classed(\"active\", function (e, j) { return e === context.pageNumber(); })\n            .select(\"a\")\n            .text(function (d) { return d; })\n            ;\n\n        page.exit().remove();\n        page.order();\n\n        if (this.numItems() === 0) {\n            d3Select(domNode).remove();\n        }\n    }\n\n    exit(domNode, element) {\n        super.exit(domNode, element);\n    }\n}\nPaginator.prototype._class += \" other_Paginator\";\n\nexport interface Paginator {\n    itemsPerPage(): number;\n    itemsPerPage(_: number): this;\n    itemsPerPage_exists(): boolean;\n    numItems(): number;\n    numItems(_: number): this;\n    numItems_exists(): boolean;\n    pageNumber(): number;\n    pageNumber(_: number): this;\n    pageNumber_exists(): boolean;\n    adjacentPages(): number;\n    adjacentPages(_: number): this;\n    adjacentPages_exists(): boolean\n    bottom(): number;\n    bottom(_: number): this;\n    bottom_exists(): boolean;\n    right(): number;\n    right(_: number): this;\n    right_exists(): boolean;\n}\n\nPaginator.prototype.publish(\"itemsPerPage\", 2, \"number\", \"Pagination items per page\", null, { tags: [\"Private\"] });\n\nPaginator.prototype.publish(\"numItems\", 10, \"number\", \"Pagination total number of items\", null, { tags: [\"Private\"] });\nPaginator.prototype.publish(\"pageNumber\", 1, \"number\", \"Pagination set or get the page number\", null, { tags: [\"Private\"] });\nPaginator.prototype.publish(\"adjacentPages\", 2, \"number\", \"Number of page indexes either side of current one\", null, { tags: [\"Private\"] });\nPaginator.prototype.publish(\"bottom\", 20, \"number\", \"Pagination bottom offset\", null, { tags: [\"Private\"] });\nPaginator.prototype.publish(\"right\", 20, \"number\", \"Pagination right offset\", null, { tags: [\"Private\"] });\n","import { d3Event, HTMLWidget, Platform, select as d3Select, selectAll as d3SelectAll, Utility, Widget } from \"@hpcc-js/common\";\nimport { Paginator } from \"./Paginator.ts\";\n\nimport \"../src/Table.css\";\n\nexport class Table extends HTMLWidget {\n    protected _paginator;\n    protected _selectionBag;\n    protected _selectionPrevClick;\n    protected _paginatorTableSpacing;\n\n    tableDiv;\n    thead;\n    table;\n    fixedHead;\n    fixedHeadTable;\n    fixedThead;\n    unfixedThead;\n    tbody;\n    tfoot;\n    fixedCol;\n    fixedColTable;\n    fixedColHead;\n    fixedColHeadRow;\n    fixedColBody;\n    fixedColFoot;\n    fixedColFootRow;\n    protected _prevDescending;\n    protected _prevSortByFieldIndex;\n    protected _hasChildWidgets;\n    protected _tNumPages;\n    protected _empty_col_idx_arr: any[];\n\n    constructor() {\n        super();\n        this._tag = \"div\";\n        this.columns([]);\n        this._paginator = new Paginator();\n        this._selectionBag = new Utility.Selection(this);\n        this._selectionPrevClick = null;\n        this._paginatorTableSpacing = 4;\n    }\n\n    size(): any;\n    size(_): Widget;\n    size(_?): any | Widget {\n        const retVal = super.size.apply(this, arguments);\n        if (arguments.length) {\n            if (this.tableDiv) {\n                const topMargin = this.showHeader() && this.fixedHeader() ? this.thead.property(\"offsetHeight\") : 0;\n                this.tableDiv\n                    .style(\"width\", this._size.width + \"px\")\n                    .style(\"height\", this._size.height - topMargin + \"px\")\n                    ;\n                this._element\n                    .style(\"width\", this._size.width + \"px\")\n                    .style(\"height\", this._size.height + \"px\")\n                    ;\n            }\n        }\n\n        return retVal;\n    }\n\n    isHidden(colIdx) {\n        if (this.pivot()) return false;\n        if (this.hiddenColumns().indexOf(colIdx) !== -1) return true;\n        const fields = this.fields();\n        if (fields && fields[colIdx] && (fields[colIdx].type() === \"hidden\" || this._empty_col_idx_arr.indexOf(colIdx) !== -1)) {\n            return true;\n        }\n        return false;\n    }\n\n    tableColumns(_?: string[]): string[] {\n        const retVal = this.columns.apply(this, arguments);\n        if (!arguments.length && this.pivot()) {\n            return this._db.column(0);\n        }\n        return retVal;\n    }\n\n    tableData(_?) {\n        const retVal = this.data.apply(this, arguments);\n        if (!arguments.length && this.pivot()) {\n            return this._db.columns().filter(function (col, idx) { return idx > 0; });\n        }\n        return retVal;\n    }\n\n    field(rowIdx, colIdx) {\n        const noTransform = { transform: d => d };\n        if (this.pivot()) {\n            if (colIdx === 0) return noTransform;\n            return this.fields()[rowIdx + 1];\n        }\n        if (rowIdx === -1) return noTransform;\n        return this.fields()[colIdx];\n    }\n\n    calcFieldsIndex(colIdx) {\n        let i = -1;\n        let offset = 0;\n        const colLen = this.columns().length;\n        let visibleCount = 0;\n        while (i < colLen && visibleCount <= colIdx) {\n            i++;\n            if (this.isHidden(i)) {\n                offset++;\n            } else {\n                visibleCount++;\n            }\n        }\n        return colIdx + offset;\n    }\n\n    getEmptyColumnIdxArr(columns, data) {\n        const ret_arr = [];\n        if (this.hideEmptyColumns()) {\n            for (let col_idx = 0; col_idx < columns.length; col_idx++) {\n                let column_is_empty = true;\n                for (let row_idx = 0; row_idx < data.length; row_idx++) {\n                    if ([\"\", null, undefined].indexOf(data[row_idx][col_idx]) === -1) {\n                        column_is_empty = false;\n                        break;\n                    }\n                }\n                if (column_is_empty) {\n                    ret_arr.push(col_idx);\n                }\n            }\n        }\n        return ret_arr;\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        this._placeholderElement.style(\"overflow\", \"hidden\");\n\n        this.tableDiv = element.append(\"div\").attr(\"class\", \"tableDiv\");\n        this.table = this.tableDiv.append(\"table\");\n        this.fixedHead = element.append(\"div\").classed(\"header-wrapper\", true);\n        this.fixedHeadTable = this.fixedHead.append(\"table\");\n        this.fixedThead = this.fixedHeadTable.append(\"thead\").append(\"tr\");\n        this.unfixedThead = this.table.append(\"thead\").append(\"tr\");\n        this.tbody = this.table.append(\"tbody\");\n        this.tfoot = this.table.append(\"tfoot\").append(\"tr\");\n        this.fixedCol = element.append(\"div\").classed(\"rows-wrapper\", true);\n        this.fixedColTable = this.fixedCol.append(\"table\");\n        this.fixedColHead = this.fixedColTable.append(\"thead\");\n        this.fixedColHeadRow = this.fixedColHead.append(\"tr\");\n        this.fixedColBody = this.fixedColTable.append(\"tbody\");\n        this.fixedColFoot = this.fixedColTable.append(\"tfoot\");\n        this.fixedColFootRow = this.fixedColFoot.append(\"tr\");\n\n        this.tableDiv\n            .style(\"overflow\", \"auto\")\n            ;\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n        const context = this;\n        const columns = context.tableColumns();\n        const data = context.tableData();\n        const scrollLeft = this.tableDiv.node().scrollLeft;\n        this._empty_col_idx_arr = this.getEmptyColumnIdxArr(columns, data);\n\n        this.element().selectAll(\"table,tbody,th,td\").style(\"width\", null);\n\n        if (this.sortByFieldIndex_exists() && (this._prevSortByFieldIndex !== this.sortByFieldIndex() || this._prevDescending !== this.descending())) {\n            Utility.multiSort(data, [{ idx: this.sortByFieldIndex(), reverse: this.descending() }]);\n            this._prevSortByFieldIndex = this.sortByFieldIndex();\n            this._prevDescending = this.descending();\n        }\n\n        this._hasChildWidgets = false;\n\n        if (this.fixedHeader()) {\n            this.thead = this.fixedThead;\n        } else {\n            this.thead = this.unfixedThead;\n        }\n        this.fixedHead.style(\"display\", this.fixedHeader() ? \"table-row\" : \"none\");\n        this.unfixedThead.style(\"display\", this.fixedHeader() ? \"none\" : \"table-row\");\n\n        const thSel = this.thead.selectAll(\"th\").data(this.showHeader() ? columns.filter(function (col, idx) {\n            return !context.isHidden(idx) && context._empty_col_idx_arr.indexOf(idx) === -1;\n        }) : []);\n        const thUpdate = thSel.enter().append(\"th\")\n            .each(function (d) {\n                const element2 = d3Select(this);\n                element2\n                    .append(\"span\")\n                    .attr(\"class\", \"thText\")\n                    ;\n                element2\n                    .append(\"span\")\n                    .attr(\"class\", \"thIcon\")\n                    ;\n            })\n            .on(\"click\", function (column, idx) {\n                context.headerClick(column, idx);\n            })\n            .merge(thSel)\n            .style(\"background-color\", this.theadRowBackgroundColor())\n            .style(\"border-color\", this.theadCellBorderColor())\n            .style(\"color\", this.theadFontColor())\n            .style(\"font-size\", this.theadFontSize())\n            ;\n        thUpdate.select(\".thText\")\n            .style(\"font-family\", this.theadFontFamily())\n            .text(function (column, idx) {\n                const fieldsIdx = context.calcFieldsIndex(idx);\n                return context.field(-1, fieldsIdx).transform(column);\n            })\n            ;\n        thUpdate.select(\".thIcon\")\n            .text(function (column, idx) {\n                if (context.descending()) {\n                    return context.sortByFieldIndex() === idx ? \"\\uf078\" : \"\";\n                } else {\n                    return context.sortByFieldIndex() === idx ? \"\\uf077\" : \"\";\n                }\n            })\n            ;\n        thSel.exit()\n            .remove()\n            ;\n        thUpdate.order();\n\n        if (this.paginationLimit()) {\n            this.pagination(data.length >= parseInt(this.paginationLimit()) ? true : false);\n        }\n        if (this.pagination()) {\n            if (this._paginator.target() === null) {\n                this._paginator.target(element.node());\n            }\n\n            const ipp = this._calcRowsPerPage(thUpdate);\n            this.itemsPerPage(ipp);\n\n            this._paginator.numItems(data.length);\n            this._tNumPages = Math.ceil(this._paginator.numItems() / this.itemsPerPage()) || 1;\n            if (this.pageNumber() > this._tNumPages || this.pageNumber() <= 0) { this.pageNumber(1); } // resets if current pagenum selected out of range\n\n            this._paginator._onSelect = function (p, d) {\n                context.pageNumber(p);\n                context.render();\n                return;\n            };\n        } else {\n            this._paginator.numItems(0); // remove widget\n        }\n\n        // pageNumber starts at index 1\n        const startIndex = this.pageNumber() - 1;\n        const itemsOnPage = this.itemsPerPage();\n\n        const start = startIndex * itemsOnPage;\n        const end = startIndex * parseInt(itemsOnPage) + parseInt(itemsOnPage);\n\n        let tData;\n\n        if (this.topN()) {\n            tData = data.slice(0, this.topN());\n        } else if (this.pagination()) {\n            tData = data.slice(start, end);\n        } else {\n            tData = data;\n        }\n\n        const totalRow: any[] = [this.totalledLabel() ? this.totalledLabel() : null];\n        if (this.totalledColumns().length !== 0) {\n            for (let i = 0; i < this.totalledColumns().length; i++) this.totalledColumns()[i] = +this.totalledColumns()[i];\n            for (let j = 1; j < columns.length; j++) {\n                let sum = 0;\n                if (this.totalledColumns().indexOf(j) !== -1) {\n                    for (let k = 0; k < tData.length; k++) {\n                        sum = sum + tData[k][j];\n                    }\n                    totalRow.push(sum);\n                } else {\n                    totalRow.push(\"\");\n                }\n            }\n\n            const tfSel = this.tfoot.selectAll(\"td\").data(totalRow);\n            tfSel.enter()\n                .append(\"td\")\n                .merge(tfSel)\n                .style(\"background-color\", this.tfootRowBackgroundColor())\n                .style(\"border-color\", this.tfootCellBorderColor())\n                .style(\"color\", this.tfootFontColor())\n                .style(\"font-size\", this.tfootFontSize())\n            [this.renderHtmlDataCells() ? \"html\" : \"text\"](function (d, idx) {\n                return context.fields()[idx].transform(d);\n            });\n            tfSel.exit()\n                .remove()\n                ;\n        }\n\n        const rowsSel = this.tbody.selectAll(\"tr.tr_\" + this.id()).data(tData.map(function (d, idx) {\n            //  TODO - Move fix closer to data source?\n            for (let i = 0; i < d.length; ++i) {\n                if (d[i] === undefined) {\n                    d[i] = null;\n                }\n            }\n            return {\n                rowIdx: idx,\n                row: d\n            };\n        }));\n        const rowsUpdate = rowsSel.enter().append(\"tr\")\n            .attr(\"class\", \"tr_\" + this.id())\n            .on(\"click.selectionBag\", function (_d) {\n                if (_d.row) {\n                    const d = _d.row;\n                    const i = _d.rowIdx;\n                    context.selectionBagClick(d, i);\n                    context.applyRowStyles(context.getBodyRow(i));\n                    context.applyFirstColRowStyles(context.getFixedRow(i));\n                }\n            }, true)  //  capture=true:  event is caught on the way down the DOM before the cell click.\n            .on(\"mouseover\", function (_d) {\n                if (_d.row) {\n                    const i = _d.rowIdx;\n                    const fixedLeftRows = context.getFixedRow(i);\n                    if (!fixedLeftRows.empty()) {\n                        fixedLeftRows.classed(\"hover\", true);\n                    }\n                    const tbodyRows = context.getBodyRow(i);\n                    tbodyRows.classed(\"hover\", true);\n                    context.applyStyleToRows(tbodyRows);\n                    context.applyFirstColRowStyles(fixedLeftRows);\n                }\n            })\n            .on(\"mouseout\", function (_d) {\n                if (_d.row) {\n                    const i = _d.rowIdx;\n                    const fixedLeftRows = context.getFixedRow(i);\n                    fixedLeftRows.classed(\"hover\", false);\n                    const tbodyRows = context.getBodyRow(i);\n                    tbodyRows.classed(\"hover\", false);\n                    context.applyStyleToRows(tbodyRows);\n                    context.applyFirstColRowStyles(fixedLeftRows);\n                }\n            })\n            .merge(rowsSel)\n            .classed(\"selected\", function (_d) {\n                const d = _d.row;\n                return context._selectionBag.isSelected(context._createSelectionObject(d));\n            })\n            .classed(\"trId\" + this._id, true)\n            ;\n        rowsSel.exit()\n            .remove()\n            ;\n        this.applyStyleToRows(rowsUpdate);\n\n        const cellsSel = rowsUpdate.selectAll(\".td_\" + this.id()).data(function (_d, _trIdx) {\n            return _d.row.filter(function (cell, idx) {\n                return idx < columns.length && !context.isHidden(idx) && context._empty_col_idx_arr.indexOf(idx) === -1;\n            }).map(function (cell, idx) {\n                return {\n                    rowInfo: _d,\n                    colIdx: idx,\n                    cell\n                };\n            });\n        });\n        cellsSel.enter()\n            .append(\"td\")\n            .attr(\"class\", \"td_\" + this.id())\n            .on(\"click\", function (tdContents) {\n                if (tdContents.rowInfo) {\n                    context.click(context.rowToObj(tdContents.rowInfo.row), context.columns()[tdContents.colIdx], context._selectionBag.isSelected(context._createSelectionObject(tdContents.rowInfo.row)));\n                }\n            })\n            .on(\"dblclick\", function (tdContents, idx) {\n                if (tdContents.rowInfo) {\n                    context.dblclick(context.rowToObj(tdContents.rowInfo.row), context.columns()[tdContents.colIdx], context._selectionBag.isSelected(context._createSelectionObject(tdContents.rowInfo.row)));\n                }\n            })\n            .each(function (tdContents, tdIdx) {\n                const alignment = context.getColumnAlignment(tdContents.rowInfo.rowIdx, tdContents.colIdx, tdContents.cell);\n                const el = d3Select(this);\n                el\n                    .style(\"height\", null)\n                    .style(\"text-align\", alignment)\n                    .style(\"vertical-align\", context.verticalAlign())\n                    .classed(\"tr-\" + tdContents.rowInfo.rowIdx + \"-td-\" + tdIdx, true)\n                    ;\n            })\n            .merge(cellsSel)\n            .each(function (tdContents) {\n                const el = d3Select(this);\n                if (tdContents.cell instanceof Widget) {\n                    el[context.renderHtmlDataCells() ? \"html\" : \"text\"](null);\n                    const widgetDiv = el.selectAll(\".div_\" + context.id()).data([tdContents.cell], function (d: any) { return d.id(); });\n                    widgetDiv.exit()\n                        .each(function (d: any) {\n                            d.target(null);\n                        })\n                        .remove()\n                        ;\n                    widgetDiv.enter().append(\"div\")\n                        .attr(\"class\", \"div_\" + context.id())\n                        .style(\"width\", context.minWidgetWidth() + \"px\")\n                        .style(\"height\", context.minWidgetHeight() + \"px\")\n                        .each(function (d) {\n                            const widgetDiv2 = d3Select(this);\n                            d._parentWidget = context;\n                            if (d._class.indexOf(\"childWidget\") < 0) {\n                                d._class = \"childWidget \" + d._class;\n                            }\n                            d\n                                .target(null)\n                                .target(widgetDiv2.node())\n                                ;\n                        })\n                        .merge(widgetDiv as any)\n                        .each(function (d) {\n                            d\n                                .resize()\n                                .lazyRender()\n                                ;\n                            context._hasChildWidgets = true;\n                        })\n                        ;\n                } else {\n                    el.selectAll(\".div_\" + context.id()).remove();\n                    const fieldsIdx = context.calcFieldsIndex(tdContents.colIdx);\n                    el[context.renderHtmlDataCells() ? \"html\" : \"text\"](\n                        context.field(tdContents.rowInfo.rowIdx, fieldsIdx).transform(tdContents.cell)\n                    );\n                }\n            })\n            ;\n        cellsSel.exit()\n            .remove()\n            ;\n        const tableMarginHeight = parseInt(this.thead.node().offsetHeight);\n\n        if (this.pagination() && this._hasChildWidgets) {\n            this.tableDiv.style(\"overflow-y\", \"auto\");\n            this.table.style(\"margin-bottom\", \"50px\");\n            console.warn(\"Warning: displaying another widget in the table may cause problems with pagination\");\n        } else {\n            this.tableDiv.style(\"overflow-y\", null);\n            this.table.style(\"margin-bottom\", null);\n\n        }\n        this.size(this._size);\n\n        let fixedColWidth = 0;\n        const fixedColThSel = this.fixedColHeadRow.selectAll(\"th\").data(this.fixedColumn() && this.showHeader() ? [columns[0]] : []);\n        const fixedColThUpdate = fixedColThSel.enter().append(\"th\")\n            .each(function (d) {\n                const element2 = d3Select(this);\n                element2\n                    .append(\"span\")\n                    .attr(\"class\", \"thText\")\n                    ;\n                element2\n                    .append(\"span\")\n                    .attr(\"class\", \"thIcon\")\n                    ;\n            })\n            .on(\"click\", function (column, idx) {\n                context.headerClick(column, idx);\n            })\n            .merge(fixedColThSel)\n            .style(\"background-color\", this.theadRowBackgroundColor())\n            .style(\"border-color\", this.theadCellBorderColor())\n            .style(\"color\", this.theadFontColor())\n            .style(\"font-size\", this.theadFontSize())\n            ;\n        fixedColThUpdate.select(\".thText\")\n            .style(\"font-family\", this.theadFontFamily())\n            .text(function (column) {\n                return column;\n            })\n            ;\n        fixedColThUpdate.select(\".thIcon\")\n            .text(function (column, idx) {\n                if (context.descending()) {\n                    return context.sortByFieldIndex() === idx ? \"\\uf078\" : \"\";\n                } else {\n                    return context.sortByFieldIndex() === idx ? \"\\uf077\" : \"\";\n                }\n            })\n            ;\n        fixedColThSel.exit()\n            .remove()\n            ;\n\n        const fixedColTrSel = this.fixedColBody.selectAll(\"tr\").data(this.fixedColumn() ? tData : []);\n        const fixedColTrUpdate = fixedColTrSel.enter().append(\"tr\")\n            .attr(\"class\", function () {\n                return \"trId\" + context._id;\n            })\n            .merge(fixedColTrSel)\n            .on(\"click\", function (d, i) {\n                (d3Select(rowsUpdate[0][i]).on(\"click.selectionBag\") as any)(rowsUpdate.data()[i], i)\n                    ;\n            })\n            .on(\"mouseover\", function (d, i) {\n                (d3Select(rowsUpdate[0][i]).on(\"mouseover\") as any)(rowsUpdate.data()[i], i)\n                    ;\n            })\n            .on(\"mouseout\", function (d, i) {\n                (d3Select(rowsUpdate[0][i]).on(\"mouseout\") as any)(rowsUpdate.data()[i], i)\n                    ;\n            })\n            .classed(\"selected\", function (d) {\n                return context._selectionBag.isSelected(context._createSelectionObject(d));\n            })\n            ;\n        fixedColTrSel.exit()\n            .remove()\n            ;\n        const fixedColTdSel = fixedColTrUpdate.selectAll(\"td\").data(function (d, i) {\n            return [d[0]];\n        });\n        const fixedColTdUpdate = fixedColTdSel.enter().append(\"td\")\n            .merge(fixedColTdSel)[this.renderHtmlDataCells() ? \"html\" : \"text\"](function (d): any {\n                if (typeof (d) === \"string\") {\n                    return d.trim();\n                } else if (typeof (d) === \"number\") {\n                    return d;\n                }\n                return \"\";\n            });\n        fixedColTdSel.exit()\n            .remove()\n            ;\n\n        const fixedColFootTdSel = this.fixedColFootRow.selectAll(\"td\").data(this.fixedColumn() && this.totalledLabel() ? [this.totalledLabel()] : []);\n        const fixedColFootTdUpdate = fixedColFootTdSel.enter().append(\"td\")\n            .merge(fixedColFootTdSel)[this.renderHtmlDataCells() ? \"html\" : \"text\"](function (d): any {\n                if (typeof (d) === \"string\") {\n                    return d.trim();\n                } else if (typeof (d) === \"number\") {\n                    return d;\n                }\n                return \"\";\n            });\n        fixedColFootTdSel.exit()\n            .remove()\n            ;\n\n        if (this.fixedColumn() && !this.fixedSize() && fixedColFootTdUpdate.length) {\n            if (this.showHeader()) {\n                fixedColWidth = fixedColFootTdUpdate.property(\"offsetWidth\") > fixedColFootTdUpdate.property(\"offsetWidth\") ? fixedColFootTdUpdate.property(\"offsetWidth\") : fixedColFootTdUpdate.property(\"offsetWidth\");\n            } else {\n                fixedColWidth = fixedColFootTdUpdate.property(\"offsetWidth\");\n            }\n            this.fixedCol\n                .style(\"position\", \"absolute\")\n                .style(\"margin-top\", -this.tableDiv.property(\"scrollTop\") + tableMarginHeight + \"px\")\n                ;\n            fixedColTdUpdate\n                .style(\"width\", fixedColWidth + \"px\")\n                ;\n            this.fixedColHead\n                .style(\"position\", \"absolute\")\n                .style(\"margin-top\", (this.fixedHeader() ? this.tableDiv.property(\"scrollTop\") : 0) - tableMarginHeight + \"px\")\n                ;\n            fixedColThUpdate\n                .style(\"width\", fixedColWidth + \"px\")\n                ;\n            rowsUpdate.each(function (d, i) {\n                const height = d3Select(this).select(\"td\").property(\"offsetHeight\");\n                d3Select(fixedColTdUpdate[i][0]).style(\"height\", height + \"px\");\n            });\n        }\n\n        this.table\n            .style(\"margin-left\", -fixedColWidth + \"px\")\n            ;\n        this.tableDiv\n            .style(\"margin-left\", fixedColWidth + \"px\")\n            .style(\"width\", this.width() - fixedColWidth + \"px\")\n            ;\n\n        if (!rowsUpdate.empty()) this.setColumnWidths(rowsUpdate);\n\n        let box;\n        let newTableHeight;\n        let finalWidth;\n        let maxWidth;\n        if (this.fixedSize()) {\n            const node = d3Select(\".tableDiv > table\").node();\n            if (node) {\n                box = (node as any).getBoundingClientRect();\n                let newTableHeight;\n                let finalWidth;\n                if (box.width !== 0 && box.height !== 0) {\n                    calcWidth();\n                    calcHeight();\n                } else {\n                    if (box.height - tableMarginHeight <= context.tableDiv.property(\"offsetHeight\")) {\n                        calcHeight();\n                    } else {\n                        if (context.fixedHeader()) {\n                            newTableHeight = context.tableDiv.property(\"offsetHeight\"); //  is tableDiv correct?\n                            newTableHeight = newTableHeight + \"px\";\n                        } else {\n                            newTableHeight = \"100%\";\n                        }\n                    }\n                    if (box.width - fixedColWidth < context.tableDiv.property(\"offsetWidth\")) {\n                        calcWidth();\n                    } else {\n                        if (context.fixedColumn()) {\n                            finalWidth = context.tableDiv.property(\"offsetWidth\") - fixedColWidth; //  is tableDiv correct?\n                            finalWidth = finalWidth + \"px\";\n                        } else {\n                            finalWidth = \"100%\";\n                        }\n                    }\n                }\n                if (element.classed(\"childWidget\")) {\n                    context._placeholderElement\n                        .style(\"width\", finalWidth + \"px\")\n                        .style(\"height\", newTableHeight + \"px\")\n                        ;\n                    context.tableDiv\n                        .style(\"overflow\", \"hidden\")\n                        ;\n                }\n                context.size({ width: finalWidth, height: newTableHeight });\n            }\n        }\n\n        this.setOnScrollEvents(this.tableDiv.node(), tableMarginHeight);\n\n        function calcWidth() {\n            const newTableWidth = box.width;\n            maxWidth = context.tbody.property(\"offsetWidth\") + 1;\n            finalWidth = newTableWidth > maxWidth ? maxWidth : newTableWidth;\n            finalWidth = finalWidth;\n        }\n\n        function calcHeight() {\n            newTableHeight = context.tbody.property(\"offsetHeight\") + tableMarginHeight;\n            newTableHeight = newTableHeight;\n        }\n\n        this._paginator.render();\n        setTimeout(function () {\n            context._paginator\n                .right((context.hasVScroll(element) ? Platform.getScrollbarWidth() : 0) + context._paginatorTableSpacing)\n                .bottom((context.hasHScroll(element) ? Platform.getScrollbarWidth() : 0) + context._paginatorTableSpacing)\n                .render(function () {\n                    context.tableDiv.node().scrollLeft = scrollLeft;\n                })\n                ;\n        }, 0);\n    }\n\n    exit(domNode, element) {\n        this._paginator.target(null);\n        super.exit(domNode, element);\n    }\n\n    setColumnWidths(rows) {\n        const context = this;\n        const firstRow = rows.filter(function (d, i) { return i === 0; });\n\n        let tds = d3Select(null);\n        firstRow.each(function (d) {\n            tds = d3SelectAll(this.childNodes);\n        });\n\n        const tableMarginHeight = this.fixedHeader() ? this.thead.property(\"offsetHeight\") : 0;\n        let totalWidth = 1;\n        const tdWidths = {};\n\n        tds.each(function (d, i) {\n            tdWidths[i] = (this as any).offsetWidth;\n        });\n\n        const th = this.thead.selectAll(\"th\");\n        th.each(function (d, i) {\n            const thwidth = this.offsetWidth;\n            const tdwidth = tds.empty() ? 0 : tdWidths[i];\n            const usewidth = thwidth >= tdwidth ? thwidth : tdwidth;\n            this.style.width = usewidth + \"px\";\n            tds\n                .filter((_d, idx) => idx === 0)\n                .each(function () {\n                    d3Select(this).style(\"width\", usewidth + \"px\");\n                })\n                ;\n            totalWidth += usewidth;\n        });\n        this.thead\n            .style(\"position\", this.fixedHeader() ? \"absolute\" : \"relative\")\n            .style(\"width\", totalWidth + \"px\")\n            .style(\"margin-top\", \"0px\")\n            ;\n        this.table\n            .style(\"width\", totalWidth + \"px\")\n            ;\n        this.tableDiv\n            .style(\"margin-top\", (context.fixedHeader() ? tableMarginHeight : 0) + \"px\")\n            ;\n        this.tbody\n            .style(\"width\", totalWidth + \"px\")\n            ;\n    }\n\n    getBodyRow(i) {\n        return this.table.selectAll(\"tbody tr.trId\" + this._id)\n            .filter(function (d, idx) {\n                return idx === i;\n            })\n            ;\n    }\n\n    getFixedRow(i) {\n        return this._element.selectAll(\".rows-wrapper tbody tr\")\n            .filter(function (d, idx) {\n                return idx === i;\n            })\n            ;\n    }\n\n    setOnScrollEvents(scrollNode, margHeight) {\n        const context = this;\n        scrollNode.onscroll = function (e) {\n            const topDelta = e.target.scrollTop;\n            const leftDelta = e.target.scrollLeft;\n            if (context.fixedHeader()) {\n                context.thead\n                    .style(\"margin-left\", -leftDelta + \"px\")\n                    ;\n            }\n            if (context.fixedColumn()) {\n                context.fixedCol\n                    .style(\"margin-top\", -topDelta + margHeight + \"px\")\n                    ;\n                if (context.fixedHeader()) {\n                    context.fixedColHead\n                        .style(\"margin-top\", topDelta - margHeight + \"px\")\n                        ;\n                }\n            }\n        };\n    }\n\n    _generateTempRow() {\n        const trow = this.tbody.append(\"tr\");\n        trow.append(\"td\").text(\"QQQ\");\n        return trow;\n    }\n\n    _createSelectionObject(d) {\n        const context = this;\n        return {\n            _id: d,\n            element: () => context.tbody ? context.tbody.selectAll(\"tr\").filter(function (d2) { return d2 === d; }) : d3Select(null)\n        };\n    }\n\n    _calcRowsPerPage(th) {\n        if (this._paginator.numItems() === 0) { // only run on first render\n            this._paginator.numItems(1);\n            this.itemsPerPage(1);\n        }\n        this._paginator.render();\n\n        const thHeight = this.thead.selectAll(\"th\").node() ? this.thead.selectAll(\"th\").node().clientHeight : 0;\n        const tfootHeight = this.tfoot.selectAll(\"td\").node() ? this.tfoot.selectAll(\"td\").node().clientHeight : 0;\n        const tmpRow = this._generateTempRow();\n        const tcellHeight = tmpRow.node().clientHeight;\n        tmpRow.remove();\n        const paginatorHeight = this.calcHeight(this._paginator.element());\n        let ipp = Math.floor((this.height() - thHeight - tfootHeight - paginatorHeight - (this.table.style(\"width\") >= this.table.style(\"width\") ? Platform.getScrollbarWidth() : 0) - this._paginatorTableSpacing * 2) / tcellHeight) || 1;\n        if (this.totalledColumns().length !== 0) {\n            ipp -= 1;\n        }\n        return ipp;\n    }\n\n    sort(idx) {\n        if (this.sortByFieldIndex() !== idx) {\n            this.descending(false);\n        } else {\n            this.descending(!this.descending());\n        }\n        this.sortByFieldIndex(idx);\n\n        return this;\n    }\n\n    selection(_) {\n        if (!arguments.length) return this._selectionBag.get().map(function (d) { return d._id; });\n        this._selectionBag.set(_.map(function (row) {\n            return this._createSelectionObject(row);\n        }, this));\n        return this;\n    }\n\n    selectionBagClick(d, i) {\n        if (this.multiSelect() && d3Event().shiftKey && this._selectionPrevClick) {\n            let inRange = false;\n            const rows = [];\n            const selection = this.tableData().filter(function (row, i2) {\n                let lastInRangeRow = false;\n                if (row === d || row === this._selectionPrevClick) {\n                    if (inRange) {\n                        lastInRangeRow = true;\n                    }\n                    inRange = !inRange;\n                    rows.push(i2);\n                }\n                return inRange || lastInRangeRow;\n            }, this);\n            this.selection(selection);\n        } else if (this.multiSelect()) {\n            this._selectionBag.click(this._createSelectionObject(d), d3Event);\n            this._selectionPrevClick = d;\n        } else {\n            const selObj = this._createSelectionObject(d);\n            this._selectionBag.click(selObj, { ctrlKey: this._selectionBag.isSelected(selObj) });\n            this._selectionPrevClick = d;\n        }\n        this.render();\n    }\n\n    applyHoverRowStyles(row) {\n        const context = this;\n        row\n            .style(\"color\", context.tbodyHoverRowFontColor())\n            .style(\"background-color\", context.tbodyHoverRowBackgroundColor())\n            ;\n    }\n    applySelectedRowStyles(row) {\n        const context = this;\n        row\n            .style(\"color\", context.tbodySelectedRowFontColor())\n            .style(\"background-color\", context.tbodySelectedRowBackgroundColor())\n            ;\n    }\n    applyRowStyles(row, isFirstCol: boolean = false) {\n        const dataRow = row.datum().row;\n        row\n            .style(\"color\", isFirstCol ? this.tbodyFirstColFontColor() : this.tbodyFontColor())\n            .style(\"background-color\", isFirstCol ? this.tbodyFirstColBackgroundColor() : this.tableZebraColor_exists() && this.tableData().indexOf(dataRow) % 2 ? this.tbodyRowBackgroundColor() : this.tableZebraColor())\n            ;\n    }\n    applyFirstColRowStyles(rows) {\n        this.applyStyleToRows(rows, true);\n    }\n    applyStyleToRows(rows, isFirstCol: boolean = false) {\n        isFirstCol = typeof isFirstCol !== \"undefined\" ? isFirstCol : false;\n        const context = this;\n        rows.each(function () {\n            const tr = d3Select(this);\n            if (tr.classed(\"hover\")) {\n                context.applyHoverRowStyles(tr);\n            } else if (tr.classed(\"selected\")) {\n                context.applySelectedRowStyles(tr);\n            } else {\n                context.applyRowStyles(tr, isFirstCol);\n            }\n        })\n            ;\n    }\n\n    getColumnAlignment(rowIdx, colIdx, cell) {\n        const fieldsIdx = this.calcFieldsIndex(colIdx);\n        const field = this.field(rowIdx, fieldsIdx);\n        switch ((field as any).__prop_type) {\n            case \"string\":\n                return this.stringAlign();\n            case \"number\":\n                return this.numberAlign();\n            case \"\":\n            case undefined:\n                switch (typeof cell) {\n                    case \"string\":\n                        return this.stringAlign();\n                    case \"number\":\n                        return this.numberAlign();\n                }\n        }\n        return null;\n    }\n\n    serializeState() {\n        return {\n            selection: this._selectionBag.get().map(function (d) {\n                return d._id;\n            }),\n            data: this.data()\n        };\n    }\n\n    deserializeState(state) {\n        if (state) {\n            if (state.selection) {\n                const context = this;\n                this._selectionBag.set(state.selection.map(function (d) {\n                    return context._createSelectionObject(d);\n                }));\n            }\n            if (state.data) {\n                this.data(state.data);\n            }\n        }\n        return this;\n    }\n\n    click(row, column, selected) {\n    }\n\n    dblclick(row, column, selected) {\n    }\n\n    headerClick(column, idx) {\n        this\n            .sort(idx)\n            .render()\n            ;\n    }\n}\nTable.prototype._class += \" other_Table\";\n\nexport interface Table {\n    renderHtmlDataCells(): boolean;\n    renderHtmlDataCells(_: boolean): this;\n    pagination(): boolean;\n    pagination(_: boolean): this;\n    paginationLimit(): any;\n    paginationLimit(_: any): this;\n    itemsPerPage(): any;\n    itemsPerPage(_: any): this;\n    pageNumber(): number;\n    pageNumber(_: number): this;\n    adjacentPages(): number;\n    adjacentPages(_: number): this;\n    topN(): number;\n    topN(_: number): this;\n    pivot(): boolean;\n    pivot(_: boolean): this;\n    showHeader(): boolean;\n    showHeader(_: boolean): this;\n    fixedHeader(): boolean;\n    fixedHeader(_: boolean): this;\n    fixedColumn(): boolean;\n    fixedColumn(_: boolean): this;\n    multiSelect(): boolean;\n    multiSelect(_: boolean): this;\n\n    fixedSize(): boolean;\n    fixedSize(_: boolean): this;\n\n    hideEmptyColumns(): boolean;\n    hideEmptyColumns(_: boolean): this;\n\n    theadFontSize(): string;\n    theadFontSize(_: string): this;\n    tbodyFontSize(): string;\n    tbodyFontSize(_: string): this;\n    tfootFontSize(): string;\n    tfootFontSize(_: string): this;\n    theadFontColor(): string;\n    theadFontColor(_: string): this;\n    tbodyFontColor(): string;\n    tbodyFontColor(_: string): this;\n    tfootFontColor(): string;\n    tfootFontColor(_: string): this;\n    theadFontFamily(): string;\n    theadFontFamily(_: string): this;\n    tbodyFontFamily(): string;\n    tbodyFontFamily(_: string): this;\n    tfootFontFamily(): string;\n    tfootFontFamily(_: string): this;\n\n    theadCellBorderColor(): string;\n    theadCellBorderColor(_: string): this;\n    tfootCellBorderColor(): string;\n    tfootCellBorderColor(_: string): this;\n    theadRowBackgroundColor(): string;\n    theadRowBackgroundColor(_: string): this;\n    tfootRowBackgroundColor(): string;\n    tfootRowBackgroundColor(_: string): this;\n\n    tbodyCellBorderColor(): string;\n    tbodyCellBorderColor(_: string): this;\n\n    tbodyRowBackgroundColor(): string;\n    tbodyRowBackgroundColor(_: string): this;\n    tbodyFirstColFontColor(): string;\n    tbodyFirstColFontColor(_: string): this;\n    tbodyFirstColBackgroundColor(): string;\n    tbodyFirstColBackgroundColor(_: string): this;\n\n    tbodyHoverRowFontColor(): string;\n    tbodyHoverRowFontColor(_: string): this;\n    tbodyHoverRowBackgroundColor(): string;\n    tbodyHoverRowBackgroundColor(_: string): this;\n\n    tbodySelectedRowFontColor(): string;\n    tbodySelectedRowFontColor(_: string): this;\n    tbodySelectedRowBackgroundColor(): string;\n    tbodySelectedRowBackgroundColor(_: string): this;\n    tableZebraColor(): string;\n    tableZebraColor(_: string): this;\n    tableZebraColor_exists(): boolean;\n    totalledColumns(): any[];\n    totalledColumns(_: any[]): this;\n    totalledLabel(): string;\n    totalledLabel(_: string): this;\n    hiddenColumns(): any[];\n    hiddenColumns(_: any[]): this;\n\n    stringAlign(): string;\n    stringAlign(_: string): this;\n    numberAlign(): string;\n    numberAlign(_: string): this;\n    verticalAlign(): string;\n    verticalAlign(_: string): this;\n\n    minWidgetWidth(): number;\n    minWidgetWidth(_: number): this;\n    minWidgetHeight(): number;\n    minWidgetHeight(_: number): this;\n\n    sortByFieldIndex(): number;\n    sortByFieldIndex(_: number): this;\n    sortByFieldIndex_exists(): boolean;\n    descending(): boolean;\n    descending(_: boolean): this;\n}\n\nTable.prototype.publish(\"renderHtmlDataCells\", false, \"boolean\", \"enable or disable HTML within cells\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"pagination\", true, \"boolean\", \"Enable or disable pagination\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"paginationLimit\", null, \"number\", \"Maximum number of rows allowed before pagination defaults to on\", null, { tags: [\"Private\"] });\nTable.prototype.publishProxy(\"itemsPerPage\", \"_paginator\");\nTable.prototype.publishProxy(\"pageNumber\", \"_paginator\", \"pageNumber\", 1);\nTable.prototype.publishProxy(\"adjacentPages\", \"_paginator\");\nTable.prototype.publish(\"topN\", null, \"number\", \"Total number or rows of data to be displayed in the table\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"pivot\", false, \"boolean\", \"Pivot Table\");\nTable.prototype.publish(\"showHeader\", true, \"boolean\", \"Show or hide the table header\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"fixedHeader\", true, \"boolean\", \"Enable or disable fixed table header\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"fixedColumn\", false, \"boolean\", \"Enable or disable fixed first column\", null, { tags: [\"Private\"] });\nTable.prototype.publish(\"multiSelect\", false, \"boolean\", \"Multiple Selection\", null, { tags: [\"Basic\"] });\n\nTable.prototype.publish(\"fixedSize\", false, \"boolean\", \"Fix Size to Min Width/Height\");\n\nTable.prototype.publish(\"hideEmptyColumns\", false, \"boolean\", \"Hide columns with all empty cells\");\n\nTable.prototype.publish(\"theadFontSize\", null, \"string\", \"Table head font size\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyFontSize\", null, \"string\", \"Table body font size\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tfootFontSize\", null, \"string\", \"Table body font size\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"theadFontColor\", null, \"html-color\", \"Table head font color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyFontColor\", null, \"html-color\", \"Table body font color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tfootFontColor\", null, \"html-color\", \"Table body font color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"theadFontFamily\", null, \"string\", \"Table head font family\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyFontFamily\", null, \"string\", \"Table body font family\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tfootFontFamily\", null, \"string\", \"Table body font family\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"theadCellBorderColor\", null, \"html-color\", \"Table head cell border color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tfootCellBorderColor\", null, \"html-color\", \"Table head cell border color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"theadRowBackgroundColor\", null, \"html-color\", \"Table head row color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tfootRowBackgroundColor\", null, \"html-color\", \"Table head row color\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"tbodyCellBorderColor\", null, \"html-color\", \"Table body cell border color\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"tbodyRowBackgroundColor\", null, \"html-color\", \"Table body row color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyFirstColFontColor\", null, \"html-color\", \"Table body first column font color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyFirstColBackgroundColor\", null, \"html-color\", \"Table body first column background color\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"tbodyHoverRowFontColor\", null, \"html-color\", \"Table body hover row font color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodyHoverRowBackgroundColor\", null, \"html-color\", \"Table body hover row background color\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"tbodySelectedRowFontColor\", null, \"html-color\", \"Table body selected row color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tbodySelectedRowBackgroundColor\", null, \"html-color\", \"Table body selected row color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"tableZebraColor\", null, \"html-color\", \"Table zebra row color\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"totalledColumns\", [], \"array\", \"Array of indices of the columns to be totalled\", null, { tags: [\"Basic\"], optional: true, disable: (w: any) => w.pivot() });\nTable.prototype.publish(\"totalledLabel\", null, \"string\", \"Adds a label to the first column of the 'Totalled' row\", null, { tags: [\"Basic\"], optional: true, disable: (w: any) => w.pivot() });\nTable.prototype.publish(\"hiddenColumns\", [], \"array\", \"Array of indices of the columns to be hidden\", null, { tags: [\"Basic\"], optional: true, disable: (w) => w.pivot() });\n\nTable.prototype.publish(\"stringAlign\", \"left\", \"set\", \"Cell alignment for strings\", [\"left\", \"right\", \"center\"], { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"numberAlign\", \"right\", \"set\", \"Cell alignment for numbers\", [\"left\", \"right\", \"center\"], { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"verticalAlign\", null, \"set\", \"Cell vertical alignment\", [null, \"middle\", \"top\", \"bottom\"], { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"minWidgetWidth\", 320, \"number\", \"Minimum width of a child widget\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"minWidgetHeight\", 240, \"number\", \"Minimum height of a child widget\", null, { tags: [\"Basic\"], optional: true });\n\nTable.prototype.publish(\"sortByFieldIndex\", null, \"number\", \"Index for the field/column to sort the data\", null, { tags: [\"Basic\"], optional: true });\nTable.prototype.publish(\"descending\", false, \"boolean\", \"Direction for sorting the data: ascending (true) or descending (false)\", null, { tags: [\"Basic\"], optional: true });\n","import { Palette, Platform } from \"@hpcc-js/common\";\nimport { format as d3Format } from \"d3-format\";\nimport { select as d3Select } from \"d3-selection\";\nimport { Table } from \"./Table.ts\";\n\nimport \"../src/Legend.css\";\n\nfunction _htmlColorBlock(hexColor) {\n    return \"<div class=\\\"colorBlock\\\" style=\\\"background-color:\" + hexColor + \";\\\"></div>\";\n}\n\nexport class Legend extends Table {\n    _targetWidget;\n    _targetWidgetMonitor;\n\n    constructor() {\n        super();\n\n        this.showHeader(false);\n        this.pagination(false);\n    }\n\n    isRainbow() {\n        const widget = this.getWidget();\n        return widget && widget._palette && widget._palette.type() === \"rainbow\";\n    }\n\n    targetWidget(): any;\n    targetWidget(_: any): this;\n    targetWidget(_?: any): any | this {\n        if (!arguments.length) return this._targetWidget;\n        this._targetWidget = _;\n        if (this._targetWidgetMonitor) {\n            this._targetWidgetMonitor.remove();\n            delete this._targetWidgetMonitor;\n        }\n        const context = this;\n        this._targetWidgetMonitor = this._targetWidget.monitor(function (key, newProp, oldProp, source) {\n            switch (key) {\n                case \"chart\":\n                case \"columns\":\n                case \"data\":\n                case \"paletteID\":\n                    context.lazyRender();\n                    break;\n            }\n        });\n        return this;\n    }\n\n    getWidget() {\n        if (this._targetWidget) {\n            switch (this._targetWidget.classID()) {\n                case \"chart_MultiChart\":\n                    return this._targetWidget.chart();\n            }\n        }\n        return this._targetWidget;\n    }\n\n    getPalette() {\n        const widget = this.getWidget();\n        if (widget && widget._palette) {\n            switch (widget._palette.type()) {\n                case \"ordinal\":\n                    return Palette.ordinal(widget._palette.id());\n                case \"rainbow\":\n                    return Palette.rainbow(widget._palette.id());\n            }\n        }\n        return Palette.ordinal(\"default\");\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        d3Select(domNode.parentNode).style(\"overflow-y\", \"auto\");\n\n        this.renderHtmlDataCells(true);\n        this.fixedHeader(false);\n        this.fixedSize(true);\n        element.classed(\"other_Legend\", true);\n    }\n\n    update(domNode, element) {\n        const colArr = [\"Key\", \"Label\"];\n        let dataArr = [];\n        if (this._targetWidget) {\n            const _palette = this.getPalette();\n            switch (_palette.type()) {\n                case \"ordinal\":\n                    const oPalette = _palette as Palette.OrdinalPaletteFunc;\n                    switch (this.dataFamily()) {\n                        case \"2D\":\n                            dataArr = this._targetWidget.data().map(function (n) {\n                                return [_htmlColorBlock(oPalette(n[0])), n[0]];\n                            }, this);\n                            break;\n                        case \"ND\":\n                            const widgetColumns = this._targetWidget.columns();\n                            dataArr = widgetColumns.filter(function (n, i) { return i > 0; }).map(function (n) {\n                                return [_htmlColorBlock(oPalette(n)), n];\n                            }, this);\n                            break;\n                    }\n                    break;\n                case \"rainbow\":\n                    const rPalette = _palette as Palette.RainbowPaletteFunc;\n                    const format = d3Format(this.rainbowFormat());\n                    const widget = this.getWidget();\n                    const steps = this.rainbowBins();\n                    const weightMin = widget._dataMinWeight;\n                    const weightMax = widget._dataMaxWeight;\n                    const stepWeightDiff = (weightMax - weightMin) / (steps - 1);\n                    dataArr.push([_htmlColorBlock(rPalette(weightMin, weightMin, weightMax)), format(weightMin)]);\n                    for (let x = 1; x < steps - 1; ++x) {\n                        const mid = stepWeightDiff * x;\n                        dataArr.push([_htmlColorBlock(rPalette(mid, weightMin, weightMax)), format(Math.floor(mid))]);\n                    }\n                    dataArr.push([_htmlColorBlock(rPalette(weightMax, weightMin, weightMax)), format(weightMax)]);\n                    break;\n            }\n        }\n        this.columns(colArr);\n        this.data(dataArr);\n        super.update(domNode, element);\n\n        element.classed(\"horiz-legend\", this.orientation() === \"horizontal\");\n\n        const table = element.select(\".tableDiv > table\");\n        const tableRect = table.node().getBoundingClientRect();\n        const elementRect = this._placeholderElement.node().getBoundingClientRect();\n\n        element.select(\".tableDiv\").style(\"overflow\", \"visible\");\n\n        const top = elementRect.height / 2 - tableRect.height / 2;\n        const left = elementRect.width / 2 - tableRect.width / 2;\n        table\n            .style(\"position\", \"absolute\")\n            .style(\"top\", top + \"px\")\n            .style(\"left\", left + \"px\")\n            ;\n\n        const startIndex = this.pageNumber() - 1;\n        const itemsOnPage = this.itemsPerPage();\n\n        const start = startIndex * itemsOnPage;\n        const end = startIndex * parseInt(itemsOnPage) + parseInt(itemsOnPage);\n\n        let tData;\n        if (this.pagination()) {\n            tData = this.data().slice(start, end);\n        } else {\n            tData = this.data();\n        }\n\n        const rows = this.tbody.selectAll(\"tr\").data(tData);\n        const context = this;\n        rows\n            .on(\"click\", function (d, i) {\n                context.onClick(d, i);\n            })\n            .on(\"dblclick\", function (d, i) {\n                context.onDblClick(d, i);\n            })\n            .on(\"mouseover\", function (d, i) {\n                context.onMouseOver(d, i);\n            })\n            ;\n    }\n\n    exit(domNode, element) {\n        if (this._targetWidgetMonitor) {\n            this._targetWidgetMonitor.remove();\n            delete this._targetWidgetMonitor;\n        }\n        super.exit(domNode, element);\n    }\n\n    onClick(rowData, rowIdx) {\n    }\n\n    onDblClick(rowData, rowIdx) {\n    }\n\n    onMouseOver(rowData, rowIdx) {\n    }\n\n}\nLegend.prototype._class += \" other_Legend\";\n\nexport interface Legend {\n    dataFamily(): string;\n    dataFamily(_: string): this;\n    dataFamily_exists(): boolean;\n    orientation(): string;\n    orientation(_: string): this;\n    orientation_exists(): boolean;\n    rainbowFormat(): string;\n    rainbowFormat(_: string): this;\n    rainbowFormat_exists(): boolean;\n    rainbowBins(): number;\n    rainbowBins(_: number): this;\n    rainbowBins_exists(): boolean;\n}\n\nLegend.prototype.publish(\"dataFamily\", \"ND\", \"set\", \"Type of data\", [\"1D\", \"2D\", \"ND\", \"map\", \"any\", \"other\"], { tags: [\"Private\"] });\nLegend.prototype.publish(\"orientation\", \"vertical\", \"set\", \"Orientation of Legend rows\", [\"vertical\", \"horizontal\"], { tags: [\"Private\"] });\nLegend.prototype.publish(\"rainbowFormat\", \",\", \"string\", \"Rainbow number formatting\", null, { tags: [\"Private\"], optional: true, disable: w => !w.isRainbow() });\nLegend.prototype.publish(\"rainbowBins\", 8, \"number\", \"Number of rainbow bins\", null, { tags: [\"Private\"], disable: w => !w.isRainbow() });\n\nconst origGetBBox = Table.prototype.getBBox;\nLegend.prototype.getBBox = function (refresh, round) {\n    const retVal = origGetBBox.apply(this, arguments);\n    const table = this.element().select(\".tableDiv > table\");\n    if (!table.empty()) {\n        const tableRect = table.node().getBoundingClientRect();\n        const width = tableRect.width + 8 + (this.hasVScroll(this._placeholderElement) ? Platform.getScrollbarWidth() : 0);\n        const height = tableRect.height + 8 + (this.hasHScroll(this._placeholderElement) ? Platform.getScrollbarWidth() : 0);\n        return {\n            x: retVal.x,\n            y: retVal.y,\n            width: (round ? Math.round(width) : width) * this._scale,\n            height: (round ? Math.round(height) : height) * this._scale\n        };\n    }\n    return retVal;\n};\n","import { SVGWidget } from \"@hpcc-js/common\";\n\nimport \"../src/MorphText.css\";\n\nexport class MorphText extends SVGWidget {\n    _fontWidth;\n    _textElement;\n\n    constructor() {\n        super();\n    }\n\n    enter(domNode, element) {\n        if (!this.fontSize()) {\n            const style = window.getComputedStyle(domNode, null);\n            this.fontSize(parseInt(style.fontSize));\n        }\n        this._fontWidth = this.fontSize() * 32 / 48;\n        this._textElement = element.append(\"g\")\n            ;\n    }\n\n    dateTime() {\n        const d = new Date();\n        const seconds = d.getSeconds().toString().length === 1 ? \"0\" + d.getSeconds() : d.getSeconds();\n        const minutes = d.getMinutes().toString().length === 1 ? \"0\" + d.getMinutes() : d.getMinutes();\n        const hours = d.getHours().toString().length === 1 ? \"0\" + d.getHours() : d.getHours();\n        const ampm = d.getHours() >= 12 ? \"pm\" : \"am\";\n        const months = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n        const days = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n        return days[d.getDay()] + \" \" + months[d.getMonth()] + \" \" + d.getDate() + \" \" + d.getFullYear() + \" \" + hours + \":\" + minutes + \":\" + seconds + ampm;\n    }\n\n    update(domNode, element) {\n        const context = this;\n        const text = this._textElement.selectAll(\"text\")\n            .data(this.data(), function (d) { return d.id; })\n            ;\n        text\n            .attr(\"class\", \"update\")\n            ;\n        this.transition.apply(text)\n            .attr(\"x\", function (d, i) { return (-context.data().length / 2 + i) * context._fontWidth + context._fontWidth / 2; })\n            ;\n\n        const newText = text.enter().append(\"text\")\n            .attr(\"class\", \"enter\")\n            .attr(\"font-size\", this.fontSize())\n            .attr(\"dy\", \".35em\")\n            .attr(\"y\", (this.reverse() ? +1 : -1) * this._fontWidth * 2)\n            .attr(\"x\", function (d, i) { return (-context.data().length / 2 + i) * context._fontWidth + context._fontWidth / 2; })\n            .style(\"fill-opacity\", 1e-6)\n            .style(\"text-anchor\", this.anchor())\n            .text(function (d) { return d.text; })\n            ;\n        this.transition.apply(newText)\n            .attr(\"y\", 0)\n            .style(\"fill-opacity\", 1)\n            ;\n\n        text.exit()\n            .attr(\"class\", \"exit\")\n            ;\n        this.transition.apply(text.exit())\n            .attr(\"y\", (this.reverse() ? -1 : +1) * this._fontWidth * 2)\n            .style(\"fill-opacity\", 1e-6)\n            .remove()\n            ;\n    }\n}\nMorphText.prototype._class += \" other_MorphText\";\n\nexport interface MorphText {\n    anchor(): string;\n    anchor(_: string): this;\n    anchor_exists(): boolean;\n    fontSize(): number;\n    fontSize(_: number): this;\n    fontSize_exists(): boolean;\n    reverse(): boolean;\n    reverse(_: boolean): this;\n    reverse_exists(): boolean;\n    text(): string;\n    text(_: string): this;\n    text_exists(): boolean;\n}\n\nMorphText.prototype.publish(\"anchor\", \"middle\", \"set\", \"Sets anchor point\", [\"middle\"], { tags: [\"Basic\"] });\nMorphText.prototype.publish(\"fontSize\", 14, \"number\", \"Sets fontsize\", null, { tags: [\"Basic\"] });\nMorphText.prototype.publish(\"reverse\", false, \"boolean\", \"Reverse Animation\", null, { tags: [\"Basic\"] });\nMorphText.prototype.publish(\"text\", \"\", \"string\", \"Sets text/data of widget\", null, { tags: [\"Basic\"] });\n\nconst _origText = MorphText.prototype.text;\nMorphText.prototype.text = function (_?: string) {\n    const retVal = _origText.apply(this, arguments);\n    if (arguments.length) {\n        const usedChars = {};\n        const chars = _.split(\"\");\n        this.data(chars.map(function (d) {\n            const id = \"_\" + d;\n            if (usedChars[id] === undefined) {\n                usedChars[id] = 0;\n            }\n            usedChars[id]++;\n            return { text: d, id: d.charCodeAt(0) + (1024 * usedChars[id]) };\n        }));\n    }\n    return retVal;\n};\n","﻿import { Table } from \"./Table.ts\";\n\nexport class NestedTable extends Table {\n    constructor() {\n        super();\n        this.minWidgetHeight(240);\n        this.minWidgetWidth(360);\n    }\n}\nNestedTable.prototype._class += \" other_NestedTable\";\n\nconst origColumns = NestedTable.prototype.columns;\nNestedTable.prototype.columns = function (_?) {\n    if (arguments.length) {\n        this._columns = _;\n        return origColumns.call(this, _.map(function (col) {\n            if (typeof col === \"object\") {\n                return col.label;\n            }\n            return col;\n        }));\n    }\n    return origColumns.apply(this, arguments);\n};\n\nconst origData = NestedTable.prototype.data;\nNestedTable.prototype.data = function (_?: any): NestedTable | any {\n    if (arguments.length) {\n        const context = this;\n        return origData.call(this, _.map(function (row) {\n            return row.map(function (cell, idx) {\n                if (cell instanceof Array) {\n                    let columns = [];\n                    if (typeof context._columns[idx] === \"object\" && context._columns[idx].columns) {\n                        columns = context._columns[idx].columns;\n                    } else {\n                        for (let i = 0; i < cell.length; ++i) {\n                            columns.push(context._columns[idx] + \".\" + i);\n                        }\n                    }\n                    return new Table()\n                        .columns(columns)\n                        .data(cell)\n                        ;\n                }\n                return cell;\n            });\n        }));\n    }\n    return origData.apply(this, arguments);\n};\n","import { d3Event, PropertyExt, select as d3Select, selectAll as d3SelectAll, SVGWidget } from \"@hpcc-js/common\";\n\nimport \"../src/Opportunity.css\";\n\nexport class Column extends PropertyExt {\n    _owner: Opportunity;\n\n    constructor() {\n        super();\n    }\n\n    owner(): Opportunity;\n    owner(_: Opportunity): this;\n    owner(_?: Opportunity): Opportunity | this {\n        if (!arguments.length) return this._owner;\n        this._owner = _;\n        return this;\n    }\n\n    valid(): boolean {\n        return !!this.headerLabel();\n    }\n}\nColumn.prototype._class += \" other_Opportunity.Column\";\n\nexport interface Column {\n    headerLabel(): string;\n    headerLabel(_: string): this;\n}\nColumn.prototype.publish(\"headerLabel\", null, \"string\", \"Header value of a table\", function (this: Column) { return this._owner ? this._owner.columns() : []; }, { tags: [\"Basic\"], optional: true });\n\nexport class MouseHoverColumn extends PropertyExt {\n    _owner: Opportunity;\n\n    constructor() {\n        super();\n    }\n\n    owner(): Opportunity;\n    owner(_: Opportunity): this;\n    owner(_?: Opportunity): Opportunity | this {\n        if (!arguments.length) return this._owner;\n        this._owner = _;\n        return this;\n    }\n\n    valid(): boolean {\n        return !!this.hoverValue() && !!this.hoverList();\n    }\n}\nMouseHoverColumn.prototype._class += \" other_Opportunity.MouseHoverColumn\";\n\nexport interface MouseHoverColumn {\n    hoverValue(): string;\n    hoverValue(_: string): this;\n    hoverList(): string;\n    hoverList(_: string): this;\n}\nMouseHoverColumn.prototype.publish(\"hoverValue\", null, \"string\", \"Hover value of a table\", function () { return this._owner ? this._owner.columns() : []; }, { tags: [\"Basic\"], optional: true });\nMouseHoverColumn.prototype.publish(\"hoverList\", null, \"set\", \"Hover value of a table\", function () { return this._owner ? this._owner.getIds() : []; }, { tags: [\"Basic\"], optional: true });\n\nexport class ColumnDropdown extends PropertyExt {\n    _owner: Opportunity;\n\n    constructor() {\n        super();\n    }\n\n    owner(): Opportunity;\n    owner(_: Opportunity): this;\n    owner(_?: Opportunity): Opportunity | this {\n        if (!arguments.length) return this._owner;\n        this._owner = _;\n        return this;\n    }\n\n    valid(): boolean {\n        return !!this.columnIndex() && !!this.ColumnDropdownList();\n    }\n}\nColumnDropdown.prototype._class += \" other_Opportunity.ColumnDropdown\";\n\nexport interface ColumnDropdown {\n    columnIndex(): number;\n    columnIndex(_: number): this;\n    ColumnDropdownList(): string;\n    ColumnDropdownList(_: string): this;\n}\nColumnDropdown.prototype.publish(\"columnIndex\", null, \"number\", \"Column index for display context data based on column dropdown list selction\", {}, { tags: [\"Basic\", \"Shared\"] });\nColumnDropdown.prototype.publish(\"ColumnDropdownList\", null, \"set\", \"column value of a table\", function () { return this._owner ? this._owner.getIds() : []; }, { tags: [\"Basic\"], optional: true });\n\nexport class Opportunity extends SVGWidget {\n    groupCount;\n    svg;\n    tooltipdiv;\n    Column;\n    MouseHoverColumn;\n    ColumnDropdown;\n\n    constructor() {\n        super();\n        this._drawStartPos = \"origin\";\n        this.groupCount = 7;\n    }\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        const paddingTop = 30;\n        const nodeRectHeight = 14;\n        const verticalPadding = 10;\n        const h = (this.data().length + 1) * (nodeRectHeight + verticalPadding + 1) + paddingTop;\n        this.svg = element.append(\"g\")\n            .attr(\"width\", ((this.groupCount * 100) + 1))\n            .attr(\"height\", h);\n        this.svg.append(\"defs\").append(\"marker\")\n            .classed(\"arrowhead\", true)\n            .attr(\"id\", \"end-arrow\")\n            .attr(\"viewBox\", \"0 -5 10 10\")\n            .attr(\"refX\", 6)\n            .attr(\"markerWidth\", 8)\n            .attr(\"markerHeight\", 8)\n            .attr(\"orient\", \"auto\")\n            .append(\"svg:path\")\n            .attr(\"d\", \"M0,-5L10,0L0,5\")\n            .attr(\"fill\", \"rgb(100,100,100)\");\n        this.tooltipdiv = d3Select(\"body\").append(\"div\")\n            .attr(\"class\", \"other_Opportunity-tooltip tooltip\")\n            .style(\"opacity\", 0);\n    }\n    update(domNode, element) {\n        super.update(domNode, element);\n        const context = this;\n        const data = this.data();\n        const dropDownOption = this.opportunityId();\n        data.sort(function (a, b) {\n            if (a.cur_group > b.cur_group) return 1;\n            else if (a.cur_group < b.cur_group) return -1;\n            else return 0;\n        });\n        const groups = [];\n        for (let i = 1; i <= context.groupCount; i++) {\n            groups.push(i);\n        }\n        const paddingTop = 30;\n        const nodeRectHeight = 14;\n        const verticalPadding = 10;\n        const h = (data.length + 1) * (nodeRectHeight + verticalPadding + 1) + paddingTop;\n        const w = this.width();\n        const nodeRectWidthPadding = 30;\n        const nodeRectWidth = ((w / context.groupCount) - nodeRectWidthPadding);\n        //  Groups  ---\n        const group = this.svg.selectAll(\".group\").data(groups);\n        group.enter().append(\"rect\")\n            .attr(\"class\", \"group\");\n        group\n            .attr(\"x\", function (d, i) {\n                return (i * w / context.groupCount) + 1;\n            })\n            .attr(\"y\", paddingTop)\n            .attr(\"width\", w / this.groupCount)\n            .attr(\"height\", h - paddingTop);\n        group.exit().remove();\n        //  Group Headings  ---\n        const groupHeadings = this.svg.selectAll(\".group_headings\").data(groups);\n        groupHeadings.enter().append(\"text\")\n            .attr(\"class\", \"group_headings\")\n            .attr(\"y\", 20);\n        groupHeadings\n            .attr(\"x\", function (d, i) {\n                return (i * w / context.groupCount) + ((w / context.groupCount) / context.groupCount);\n            })\n            .text(function (d, i) {\n                if (context.headerLabels().length > 0) {\n                    if (context.headerLabels()[i] && (context.headerLabels()[i]).headerLabel()) {\n                        return (context.headerLabels()[i]).headerLabel();\n                    }\n                }\n                return \"\";\n            });\n        groupHeadings.exit().remove();\n        if (this.previousGroup() === \"prev_group\" && this.currentGroup() === \"cur_group\") {\n            //  Node Date Change  ---\n            const node_date_change = this.svg.selectAll(\".node_date_change\").data(data);\n            node_date_change.enter().append(\"g\")\n                .attr(\"class\", \"node_date_change update\")\n                .on(\"mouseover\", function (d) {\n                    context.tooltipdiv.transition()\n                        .duration(200)\n                        .style(\"opacity\", 0.9);\n                    let htmlInput = \"<span style='font-weight:bolder'>\" + \"Close Date Change \" + \"</span>\" + \"<br/>\";\n                    const mouseHoverMapping = context.mouseHover();\n                    mouseHoverMapping.forEach(function (obj, index) {\n                        if (obj.hoverValue() !== undefined) {\n                            htmlInput = htmlInput + \"<span style='font-weight:bold'>\" + obj.hoverValue() + \":  \" + \"</span>\" + d[obj.hoverList()] + \"<br/>\";\n                        }\n                    });\n                    let prevDate = d.prevdate + \"\";\n                    prevDate = prevDate.replace(/(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)/g, \"$3-$2-$1\");\n                    let fromDate = d.curdate + \"\";\n                    fromDate = fromDate.replace(/(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)/g, \"$3-$2-$1\");\n                    htmlInput = htmlInput + \"<span style='font-weight:bold'>\" + \"From: \" + \"</span>\" + prevDate + \"<br/>\" + \"<span style='font-weight:bold'>\" + \"To: \" + \"</span>\" + fromDate + \"<br/>\";\n                    const event = d3Event();\n                    context.tooltipdiv.html(htmlInput)\n                        .style(\"left\", (event.pageX) + \"px\")\n                        .style(\"top\", (event.pageY - 50) + \"px\");\n                })\n                .on(\"mouseout\", function (d) {\n                    context.tooltipdiv.transition()\n                        .duration(500)\n                        .style(\"opacity\", 0);\n                })\n                .each(function (d) {\n                    const element2 = d3Select(this);\n                    element2.append(\"rect\")\n                        .attr(\"class\", \"node_date_change_rect\")\n                        .attr(\"width\", 5)\n                        .attr(\"height\", nodeRectHeight)\n                        .attr(\"rx\", 6)\n                        .attr(\"ry\", 6);\n                });\n            node_date_change\n                .attr(\"transform\", function (d, i) {\n                    return \"translate(\" + ((9 * w / context.groupCount) + (nodeRectWidthPadding) - 80) + \",\" + ((i + (i * (nodeRectHeight + verticalPadding))) + 12 + paddingTop) + \")\";\n                });\n            node_date_change.exit().remove();\n            //  Node Prev Group  ---\n            const node_prev_group = this.svg.selectAll(\".node_prev_group\").data(data);\n            node_prev_group.enter().append(\"g\")\n                .attr(\"class\", \"node_prev_group\")\n                .on(\"mouseover\", function (d, i) {\n                    context.tooltipdiv.transition()\n                        .duration(200)\n                        .style(\"opacity\", 0.9);\n                    let tooltipHtml = \"\";\n                    const mouseHoverMapping = context.mouseHover();\n                    mouseHoverMapping.forEach(function (obj, index) {\n                        if (obj.hoverValue() !== undefined) {\n                            tooltipHtml = tooltipHtml + \"<span style='font-weight:bold'>\" + obj.hoverValue() + \":  \" + \"</span>\" + d[obj.hoverList()] + \"<br/>\";\n                        }\n                    });\n                    const event = d3Event();\n                    context.tooltipdiv.html(tooltipHtml)\n                        .style(\"left\", (event.pageX) + \"px\")\n                        .style(\"top\", (event.pageY - 100) + \"px\");\n                })\n                .on(\"mouseout\", function (d) {\n                    context.tooltipdiv.transition()\n                        .duration(500)\n                        .style(\"opacity\", 0);\n                })\n                .each(function (d) {\n                    const element2 = d3Select(this);\n                    element2.append(\"rect\")\n                        .attr(\"class\", \"node_prev_rect\")\n                        .attr(\"rx\", 6)\n                        .attr(\"ry\", 6);\n                    element2.append(\"text\")\n                        .attr(\"class\", \"node_prev_text\");\n                });\n            node_prev_group\n                .classed(\"update\", true)\n                .classed(\"changed\", function (d) {\n                    return d.delta !== 0;\n                })\n                .attr(\"transform\", function (d, i) {\n                    return \"translate(\" + ((((d.prev_group - 1)) * w / context.groupCount) + (nodeRectWidthPadding / 2)) + \",\" + ((i + (i * (nodeRectHeight + verticalPadding))) + 10 + paddingTop) + \")\";\n                })\n                .each(function (d) {\n                    const element2 = d3Select(this);\n                    //  Change Lines  ---\n                    const changeLines = element2.selectAll(\".arrow\").data(d.delta !== 0 ? [d] : []);\n                    changeLines.enter().append(\"line\")\n                        .attr(\"class\", \"arrow update\");\n                    changeLines\n                        .attr(\"x1\", function (d2) {\n                            return (d2.delta > 0) ? nodeRectWidth : 0;\n                        })\n                        .attr(\"y1\", nodeRectHeight / 2)\n                        .attr(\"x2\", function (d2) {\n                            return (d2.delta > 0) ? (nodeRectWidth + nodeRectWidthPadding - 4) + ((Math.abs(d2.delta) - 1)) * (w / context.groupCount) : ((-nodeRectWidthPadding - ((Math.abs(d2.delta) - 1)) * (w / context.groupCount)) + 4);\n                        })\n                        .attr(\"y2\", nodeRectHeight / 2)\n                        .style(\"stroke-dasharray\", (\"3, 3\"))\n                        .style(\"stroke\", \"rgb(100,100,100)\")\n                        .style(\"marker-end\", \"url(#end-arrow)\")\n                        .style(\"opacity\", \"1\");\n                    changeLines.exit().remove();\n                });\n            const node_previous_rect = node_prev_group.select(\".node_prev_rect\");\n            node_previous_rect\n                .attr(\"width\", nodeRectWidth)\n                .attr(\"height\", nodeRectHeight);\n            const node_previous_text = node_prev_group.select(\".node_prev_text\");\n            node_previous_text\n                .attr(\"dy\", (nodeRectHeight / 2) + 3)\n                .attr(\"dx\", (nodeRectWidth / 4))\n                .text(function (d) {\n                    if (typeof d[dropDownOption] === \"number\")\n                        return d[dropDownOption];\n                    else\n                        return d[dropDownOption].substring(0, 14);\n                });\n            node_prev_group.exit().remove();\n            //  Node Cur Group  ---\n            const node_cur_group = this.svg.selectAll(\".node_cur_group\").data(data);\n            node_cur_group.enter().append(\"g\")\n                .attr(\"class\", \"node_cur_group\")\n                .attr(\"transform\", function (d, i) {\n                    return \"translate(\" + ((((d.prev_group - 1)) * w / context.groupCount) + (nodeRectWidthPadding / 2)) + \",\" + ((i + (i * (nodeRectHeight + verticalPadding))) + 10 + paddingTop) + \")\";\n                })\n                .on(\"mouseover\", function (d, i) {\n                    context.tooltipdiv.transition()\n                        .duration(200)\n                        .style(\"opacity\", 0.9);\n                    let tooltipHtml = \"\";\n                    const mouseHoverMapping = context.mouseHover();\n                    mouseHoverMapping.forEach(function (obj, index) {\n                        if (obj.hoverValue() !== undefined) {\n                            tooltipHtml = tooltipHtml + \"<span style='font-weight:bold'>\" + obj.hoverValue() + \":  \" + \"</span>\" + d[obj.hoverList()] + \"<br/>\";\n                        }\n                    });\n                    const event = d3Event();\n                    context.tooltipdiv.html(tooltipHtml)\n                        .style(\"left\", (event.pageX) + \"px\")\n                        .style(\"top\", (event.pageY - 100) + \"px\");\n                })\n                .on(\"mouseout\", function (d) {\n                    context.tooltipdiv.transition()\n                        .duration(500)\n                        .style(\"opacity\", 0);\n                })\n                .each(function (d) {\n                    const element2 = d3Select(this);\n                    element2.append(\"rect\")\n                        .attr(\"class\", \"node_cur_rect\")\n                        .attr(\"fill\", function (d2: any) {\n                            let color;\n                            if (d2.delta < 0 || d2.cur_group === 7) {\n                                color = \"#F78181\";\n                            } else {\n                                color = \"#A9F5A9\";\n                            }\n                            return color;\n                        })\n                        .attr(\"rx\", 6)\n                        .attr(\"ry\", 6);\n                    element2.append(\"a\")\n                        .append(\"text\")\n                        .attr(\"class\", \"node_cur_text\");\n                });\n            node_cur_group\n                .classed(\"update\", true)\n                .classed(\"changed\", function (d) {\n                    return d.delta !== 0;\n                })\n                .transition().duration(800)\n                .ease(\"linear\")\n                .attr(\"transform\", function (d, i) {\n                    return \"translate(\" + ((((d.cur_group) - 1) * w / context.groupCount) + (nodeRectWidthPadding / 2)) + \",\" + ((i + (i * (nodeRectHeight + verticalPadding))) + 10 + paddingTop) + \")\";\n                })\n                .each(\"end\", function () {\n                    d3SelectAll(\".arrow\").style(\"opacity\", \"1\");\n                });\n            const node_current_anchor = node_cur_group.select(\".node_cur_group a\");\n            node_current_anchor.classed(\"update\", true)\n                .attr(\"xlink:href\", function (d) {\n                    return context.url() + d.id;\n                })\n                .attr(\"xlink:show\", \"new\");\n            const node_current_rect = node_cur_group.select(\".node_cur_rect\");\n            node_current_rect\n                .attr(\"width\", nodeRectWidth)\n                .attr(\"height\", nodeRectHeight);\n            const node_current_text = node_cur_group.select(\".node_cur_text\");\n            node_current_text\n                .classed(\"update\", true)\n                .attr(\"dy\", (nodeRectHeight / 2) + 3)\n                .attr(\"dx\", (nodeRectWidth / 4))\n                .style(\"fill\", \"blue\")\n                .text(function (d) {\n                    if (typeof d[dropDownOption] === \"number\")\n                        return d[dropDownOption];\n                    else\n                        return d[dropDownOption].substring(0, 14);\n                });\n            node_cur_group.exit().remove();\n        }\n        for (let colIndex = 0; colIndex < context.columnData().length; colIndex++) {\n            if ((context.columnData()[colIndex]) && (context.columnData()[colIndex]).ColumnDropdownList()) {\n                const columnData = this.svg.selectAll(\".columnDataText_\" + colIndex).data(data);\n                columnData.enter().append(\"g\")\n                    .attr(\"class\", \"columnDataText_\" + colIndex + \" update\")\n                    .each(function (d) {\n                        const element2 = d3Select(this);\n                        element2.append(\"text\");\n                    });\n                columnData\n                    .attr(\"transform\", function (d, i) {\n                        return \"translate(\" + (((context.columnData()[colIndex]).columnIndex() * w / context.groupCount) + (nodeRectWidthPadding / 2)) + \",\" + ((i + (i * (nodeRectHeight + verticalPadding))) + 12 + paddingTop) + \")\";\n                    })\n                    .attr(\"width\", 5)\n                    .attr(\"height\", nodeRectHeight)\n                    .attr(\"rx\", 6)\n                    .attr(\"ry\", 6);\n                const textLable = columnData.select(\"text\");\n                textLable\n                    .attr(\"y\", -6)\n                    .attr(\"dy\", (nodeRectHeight) + 14)\n                    .attr(\"dx\", 0)\n                    .attr(\"height\", 20)\n                    .attr(\"width\", 29)\n                    .text(function (d, i) {\n                        return d[(context.columnData()[colIndex]).ColumnDropdownList()];\n                    });\n                columnData.exit().remove();\n            }\n        }\n    }\n    exit(domNode, element) {\n        super.exit(domNode, element);\n    }\n\n    getIds() {\n        const dropdownList = this.columns();\n        dropdownList.unshift(\"default\");\n        return dropdownList;\n    }\n}\nOpportunity.prototype._class += \" other_Opportunity\";\nOpportunity.prototype.Column = Column;\nOpportunity.prototype.MouseHoverColumn = MouseHoverColumn;\nOpportunity.prototype.ColumnDropdown = ColumnDropdown;\n\nexport interface Opportunity {\n    previousGroup(): string;\n    previousGroup(_: string): this;\n    previousGroup_exists(): boolean;\n    currentGroup(): string;\n    currentGroup(_: string): this;\n    currentGroup_exists(): boolean;\n    opportunityId(): string;\n    opportunityId(_: string): this;\n    opportunityId_exists(): boolean\n    url(): string;\n    url(_: string): this;\n    url_exists(): boolean;\n    // width(): number;\n    // width(_: number): this;\n    addColumn(): string;\n    addColumn(_: string): this;\n    addColumn_exists(): boolean;\n    removeColumn(): string;\n    removeColumn(_: string): this;\n    removeColumn_exists(): boolean;\n    headerLabels(): any[];\n    headerLabels(_: any[]): this;\n    headerLabels_exists(): boolean;\n    mouseHover(): any[];\n    mouseHover(_: any[]): this;\n    mouseHover_exists(): boolean;\n    columnData(): any[];\n    columnData(_: any[]): this;\n    columnData_exists(): boolean;\n}\n\nOpportunity.prototype.publish(\"previousGroup\", \"\", \"set\", \"label in Opportunity\", function () { return this.getIds(); }, { tags: [\"Basic\", \"Shared\"] });\nOpportunity.prototype.publish(\"currentGroup\", \"\", \"set\", \"label in Opportunity\", function () { return this.getIds(); }, { tags: [\"Basic\", \"Shared\"] });\nOpportunity.prototype.publish(\"opportunityId\", \"id\", \"set\", \"Id for label in Opportunity\", function () { return this.getIds(); }, { tags: [\"Basic\", \"Shared\"] });\nOpportunity.prototype.publish(\"url\", null, \"string\", \"URL in Opportunity\", {}, { tags: [\"Basic\", \"Shared\"] });\nOpportunity.prototype.publish(\"width\", 1100, \"number\", \"label in Opportunity\", {}, { tags: [\"Basic\", \"Shared\"] });\nOpportunity.prototype.publish(\"addColumn\", null, \"string\", \"number of columns in a table\", {}, {\n    tags: [\"Basic\", \"Shared\"],\n    editor_input: (context, widget, cell, param) => {\n        cell.append(\"button\")\n            .attr(\"id\", context.id() + \"_addColumn\" + param.id)\n            .classed(\"property-input custom-editor-input addColumn update\", true)\n            .text(\"AddColumn\")\n            .on(\"click\", function () {\n                widget.groupCount = widget.groupCount + 1;\n                const new_value_after_click = \"Added a new column\";\n                context.setProperty(widget, param.id, new_value_after_click);\n            });\n    }\n});\nOpportunity.prototype.publish(\"removeColumn\", null, \"string\", \"number of columns in a table\", function () { return this.columns(); }, {\n    tags: [\"Basic\", \"Shared\"],\n    editor_input: (context, widget, cell, param) => {\n        cell.append(\"button\")\n            .attr(\"id\", context.id() + \"_removeColumn\" + param.id)\n            .classed(\"property-input custom-editor-input removeColumn update\", true)\n            .text(\"RemoveColumn\")\n            .on(\"click\", function () {\n                widget.groupCount = widget.groupCount - 1;\n                const new_value_after_click = \"Removed a column\";\n                context.setProperty(widget, param.id, new_value_after_click);\n            });\n    }\n});\nOpportunity.prototype.publish(\"headerLabels\", [], \"propertyArray\", \"Source Columns\", null, { autoExpand: Column });\nOpportunity.prototype.publish(\"mouseHover\", [], \"propertyArray\", \"mouse hover options\", null, { autoExpand: MouseHoverColumn });\nOpportunity.prototype.publish(\"columnData\", [], \"propertyArray\", \"column data\", null, { autoExpand: ColumnDropdown });\n","export function discover(widget) {\n    return widget.publishedProperties(false, true);\n}\n\nexport function widgetArrayWalker(widgets, visitor) {\n    if (!widgets)\n        return;\n    widgets.forEach(function (widget) {\n        widget.widgetWalker(visitor);\n    });\n}\n\nexport function widgetPropertyWalker(widget2, visitor, filter?) {\n    widget2.widgetWalker(function (widget) {\n        widget.propertyWalker(visitor, filter);\n    });\n}\n\nexport function serializeTheme(widget, filter) {\n    return JSON.stringify(serializeThemeToObject(widget, filter));\n}\n\nexport function serializeThemeToObject(widget2, filter?) {\n    filter = filter || [\"surface\", \"Color\", \"Font\", \"palette\"];\n\n    const propObj = {};\n    widgetPropertyWalker(widget2, null, function (widget, item) {\n        if (widget[item.id + \"_modified\"]() || widget.publishedProperty(item.id).origDefaultValue !== widget.publishedProperty(item.id).defaultValue) {\n            if (_isFilterMatch(item.id, filter)) {\n                const classParts = widget._class.trim().split(\" \");\n                for (const i in classParts) {\n                    if (classParts.HasOwnProperty(i)) {\n                        if (propObj[classParts[i]] === undefined) {\n                            propObj[classParts[i]] = {};\n                        }\n                        if (propObj[classParts[i]][item.id] === undefined) {\n                            propObj[classParts[i]][item.id] = widget[item.id]();\n                            break;\n                        } else if (propObj[classParts[i]][item.id] === widget[item.id]()) {\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    });\n\n    function _isFilterMatch(str, arr) {\n        let ret = false;\n        for (const i in arr) {\n            if (str.indexOf(arr[i]) !== -1) {\n                ret = true;\n                break;\n            }\n        }\n        return ret;\n    }\n    return propObj;\n}\nexport function removeTheme(widget2, callback) {\n    widgetPropertyWalker(widget2, null, function (widget, item) {\n        widget.publishedProperty(item.id).defaultValue = widget.publishedProperty(item.id).origDefaultValue;\n    });\n\n    if (typeof (callback) === \"function\") {\n        callback.call(this);\n    }\n}\nexport function applyTheme(widget2, themeObj, callback) {\n    const context = this;\n    widgetPropertyWalker(widget2, null, function (widget3, item) {\n        switch (item.type) {\n            case \"widget\":\n                context.applyTheme(widget3[item.id](), themeObj);\n                return true;\n            case \"widgetArray\":\n                const widgetArray = widget3[item.id]();\n                widgetArray.forEach(function (widget) {\n                    context.applyTheme(widget, themeObj);\n                }, this);\n                return true;\n            default:\n                widget3.applyTheme(themeObj);\n                break;\n        }\n    });\n    if (typeof (callback) === \"function\") {\n        callback.call(this);\n    }\n}\n\nexport function serializeToObject(widget, filter?, includeData?, includeState?) {\n    const retVal: any = {\n        __class: widget.classID()\n    };\n    if (widget._id.indexOf(widget._idSeed) !== 0) {\n        retVal.__id = widget._id;\n    }\n    if (widget.version) {\n        retVal.__version = widget.version();\n    }\n    retVal.__properties = {};\n\n    widget.propertyWalker((childWwidget2, item) => {\n        if (childWwidget2[item.id + \"_modified\"]()) {\n            switch (item.type) {\n                case \"widget\":\n                    retVal.__properties[item.id] = serializeToObject(childWwidget2[item.id](), null, includeData, includeState && !widget.serializeState);  //  Only include state once\n                    return true;\n                case \"widgetArray\":\n                case \"propertyArray\":\n                    retVal.__properties[item.id] = [];\n                    const widgetArray = childWwidget2[item.id]();\n                    widgetArray.forEach((childWwidget) => {\n                        retVal.__properties[item.id].push(serializeToObject(childWwidget, null, includeData, includeState && !widget.serializeState));  //  Only include state once\n                    });\n                    return true;\n                default:\n                    retVal.__properties[item.id] = childWwidget2[item.id]();\n                    break;\n            }\n        }\n    }, filter);\n\n    if (widget.classID() === \"marshaller_Graph\") {\n        const vertices = widget.data().vertices;\n        if (vertices) {\n            this.__vertices = vertices.map(item => {\n                return serializeToObject(item, null, includeData, includeState && !widget.serializeState);\n            });\n        }\n    }\n    if (includeData && widget.data) {\n        if (!retVal.__data) retVal.__data = {};\n        retVal.__data.data = widget.data();\n    }\n    if (includeState) {\n        if (widget.serializeState) {\n            retVal.__state = widget.serializeState();\n        } else if (widget.data) {\n            retVal.__state = {\n                data: widget.data()\n            };\n        }\n    }\n    return retVal;\n}\n\nexport function serialize(widget, filter?, includeData?, includeState?) {\n    return JSON.stringify(serializeToObject(widget, filter, includeData, includeState));\n}\n","import { HTMLWidget, Platform, PropertyExt, Widget } from \"@hpcc-js/common\";\nimport { Grid } from \"@hpcc-js/layout\";\nimport { local as d3Local, select as d3Select, selectAll as d3SelectAll } from \"d3-selection\";\nimport * as Persist from \"./Persist.ts\";\n\nimport \"../src/PropertyEditor.css\";\n\nfunction hasProperties(type) {\n    switch (type) {\n        case \"widget\":\n        case \"widgetArray\":\n        case \"propertyArray\":\n            return true;\n        default:\n    }\n    return false;\n}\n\nexport class PropertyEditor extends HTMLWidget {\n    _widgetOrig;\n    _parentPropertyEditor;\n    _show_settings: boolean;\n    _selectedItems;\n    __meta_sorting;\n    _watch;\n    private _childPE = d3Local<PropertyEditor>();\n\n    constructor() {\n        super();\n        this._parentPropertyEditor = null;\n\n        this._tag = \"div\";\n        this._show_settings = false;\n    }\n\n    parentPropertyEditor(_?: PropertyEditor): PropertyEditor {\n        if (!arguments.length) return this._parentPropertyEditor;\n        this._parentPropertyEditor = _;\n        return this;\n    }\n\n    depth(): number {\n        let retVal = 0;\n        let parent = this.parentPropertyEditor();\n        while (parent) {\n            ++retVal;\n            parent = parent.parentPropertyEditor();\n        }\n        return retVal;\n    }\n\n    _show_header = true;\n    show_header(): boolean;\n    show_header(_: boolean): PropertyEditor;\n    show_header(_?: boolean): boolean | PropertyEditor {\n        if (!arguments.length) {\n            return this._show_header;\n        }\n        this._show_header = _;\n        return this;\n    }\n\n    show_settings(): boolean;\n    show_settings(_: boolean): PropertyEditor;\n    show_settings(_?: boolean): boolean | PropertyEditor {\n        if (!arguments.length) {\n            return this._show_settings;\n        }\n        this._show_settings = _;\n        return this;\n    }\n\n    rootWidgets() {\n        if (this._selectedItems && this._selectedItems.length) {\n            return this._selectedItems;\n        }\n        return this.show_settings() ? [this] : this.widget() ? [this.widget()] : [];\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        const context = this;\n\n        const rootWidgets = this.rootWidgets().filter(function (w) {\n            if (w._owningWidget && w._owningWidget.excludeObjs instanceof Array) {\n                if (w._owningWidget.excludeObjs.indexOf(w.classID()) !== -1) {\n                    return false;\n                }\n            }\n            return true;\n        });\n\n        const table = element.selectAll(`table.property-table.table-${this.depth()}`).data(rootWidgets, function (d) {\n            //  We reuse the existing DOM Nodes and this node _might_ have been a regular Input previously  ---\n            if (typeof d.id !== \"function\") {\n                return `meta-${d.id}`;\n            }\n            return d.id();\n        });\n        table.enter().append(\"table\")\n            .attr(\"class\", `property-table table-${this.depth()}`)\n            .each(function () {\n                const tableElement = d3Select(this);\n\n                //  Header  ---\n                if (context._show_header && context.parentPropertyEditor() === null) {\n                    tableElement.append(\"thead\").append(\"tr\").append(\"th\")// .datum(tableElement)\n                        .attr(\"colspan\", \"2\")\n                        .each(function () {\n                            context.enterHeader(d3Select(this));\n                        })\n                        ;\n                }\n\n                //  Body  ---\n                tableElement.append(\"tbody\");\n            })\n            .merge(table)\n            .each(function (tableData) {\n                const tableElement = d3Select(this);\n\n                //  Header  ---\n                if (context._show_header && context.parentPropertyEditor() === null) {\n                    context.updateHeader(tableElement.select(\"thead > tr > th\"));\n                }\n\n                //  Body  ---\n                context.renderInputs(tableElement.select(\"tbody\"), tableData);\n            })\n            ;\n        table.exit()\n            .each(function () {\n                context.renderInputs(element.select(\"tbody\"), null);\n            })\n            .remove()\n            ;\n    }\n\n    exit(domNode, element) {\n        super.exit(domNode, element);\n        this.watchWidget(null);\n    }\n\n    private watchDepth = 0;\n    watchWidget(widget) {\n        if (this._watch) {\n            if ((window as any).__hpcc_debug) {\n                --this.watchDepth;\n                console.info(\"watchDepth:  \" + this.watchDepth);\n            }\n            this._watch.remove();\n            delete this._watch;\n        }\n        if (widget) {\n            const context = this;\n            this._watch = widget.monitor(function (_paramId, newVal, oldVal) {\n                if (oldVal !== newVal) {\n                    const propEditor = context.parentPropertyEditor() || context;\n                    propEditor.lazyRender();\n                }\n            });\n            if ((window as any).__hpcc_debug) {\n                ++this.watchDepth;\n                console.info(\"watchDepth:  \" + this.watchDepth);\n            }\n        }\n    }\n\n    enterHeader(th) {\n        const context = this;\n\n        th.append(\"span\");\n        th.append(\"i\")\n            .attr(\"class\", \"expandIcon fa\")\n            .on(\"click\", function () {\n                switch (context.peInputIcon()) {\n                    case \"fa-caret-up\":\n                    case \"fa-caret-right\":\n                        context.element().selectAll(`.table-${context.depth()} > tbody > tr > .headerRow > .peInput > .property-table-collapsed`)\n                            .classed(\"property-table-collapsed\", false)\n                            ;\n                        context.element().selectAll(`.table-${context.depth()} > tbody > tr > .headerRow > .peInput > i`)\n                            .classed(\"fa-minus-square-o\", true)\n                            .classed(\"fa-plus-square-o\", false)\n                            ;\n                        break;\n                    case \"fa-caret-down\":\n                        context.element().selectAll(`.table-${context.depth()} > tbody > tr > .headerRow > .peInput > div`)\n                            .classed(\"property-table-collapsed\", true)\n                            ;\n                        context.element().selectAll(`.table-${context.depth()} > tbody > tr > .headerRow > .peInput > i`)\n                            .classed(\"fa-minus-square-o\", false)\n                            .classed(\"fa-plus-square-o\", true)\n                            ;\n                        break;\n                }\n                context.refreshExpandIcon();\n            })\n            ;\n\n        const sortIcon = th.append(\"i\")\n            .attr(\"class\", \"sortIcon fa\")\n            .on(\"click\", function () {\n                context.refreshSortIcon(sortIcon, true);\n            })\n            ;\n\n        th.append(\"i\")\n            .attr(\"class\", \"hideParamsIcon fa\")\n            .on(\"click\", function () {\n                context.hideNonWidgets(!context.hideNonWidgets()).render();\n            })\n            ;\n    }\n\n    updateHeader(th) {\n        const widget: any = this.widget();\n        let spanText = \"\";\n        if (widget) {\n            if (widget.label) {\n                spanText += widget.label();\n            }\n            if (widget.classID) {\n                if (spanText) {\n                    spanText += \" - \";\n                }\n                spanText += widget.classID();\n            }\n        }\n        th.select(\"span\")\n            .text(spanText)\n            ;\n        this.refreshExpandIcon();\n        this.refreshSortIcon(th.select(\".sortIcon\"));\n        this.refreshHideParamsIcon(th.select(\".hideParamsIcon\"));\n    }\n\n    peInputCount() {\n        return this.element().selectAll(`.table-${this.depth()} > tbody > tr > .headerRow > .peInput > div`).size();\n    }\n\n    peInputCollapsedCount() {\n        return this.element().selectAll(`.table-${this.depth()} > tbody > tr > .headerRow > .peInput > div.property-table-collapsed`).size();\n    }\n\n    peInputIcon(): \"fa-caret-down\" | \"fa-caret-up\" | \"fa-caret-right\" {\n        const collapsed = this.peInputCollapsedCount();\n        if (collapsed === 0) {\n            return \"fa-caret-down\";\n        } else if (collapsed === this.peInputCount()) {\n            return \"fa-caret-up\";\n        }\n        return \"fa-caret-right\";\n    }\n\n    refreshExpandIcon() {\n        const newIcon = this.peInputIcon();\n        this.element().select(`.table-${this.depth()} > thead > tr > th > .expandIcon`)\n            .classed(\"fa-caret-up\", false)\n            .classed(\"fa-caret-right\", false)\n            .classed(\"fa-caret-down\", false)\n            .classed(newIcon, true)\n            ;\n    }\n\n    refreshSortIcon(sortIcon, increment = false) {\n        const sort = this.sorting();\n        const types = this.sorting_options();\n        const icons = this.__meta_sorting.ext.icons;\n        if (increment) {\n            sortIcon.classed(icons[types.indexOf(sort)], false);\n            this.sorting(types[(types.indexOf(sort) + 1) % types.length]).render();\n        } else {\n            sortIcon\n                .classed(icons[(types.indexOf(sort)) % types.length], true)\n                .attr(\"title\", sort)\n                ;\n        }\n    }\n\n    refreshHideParamsIcon(hideParamsIcon) {\n        hideParamsIcon\n            .classed(\"fa-eye\", !this.hideNonWidgets())\n            .classed(\"fa-eye-slash\", this.hideNonWidgets())\n            ;\n    }\n\n    gatherDataTree(widget) {\n        if (!widget) return null;\n        const retVal = {\n            label: widget.id() + \" (\" + widget.classID() + \")\",\n            children: []\n        };\n        const arr2 = Persist.discover(widget);\n        arr2.forEach(function (prop) {\n            const node = {\n                label: prop.id,\n                children: []\n            };\n            switch (prop.type) {\n                case \"widget\":\n                    node.children.push(this.gatherDataTree(widget[prop.id]()));\n                    break;\n                case \"widgetArray\":\n                case \"propertyArray\":\n                    const arr = widget[prop.id]();\n                    if (arr) {\n                        arr.forEach(function (item) {\n                            node.children.push(this.gatherDataTree(item));\n                        }, this);\n                    }\n                    break;\n                default:\n            }\n            retVal.children.push(node);\n        }, this);\n        return retVal;\n    }\n\n    getDataTree() {\n        return this.gatherDataTree(this.widget());\n    }\n\n    _rowSorting(paramArr) {\n        if (this.sorting() === \"type\") {\n            const typeOrder = [\"boolean\", \"number\", \"string\", \"html-color\", \"array\", \"object\", \"widget\", \"widgetArray\", \"propertyArray\"];\n            paramArr.sort(function (a, b) {\n                if (a.type === b.type) {\n                    return a.id < b.id ? -1 : 1;\n                } else {\n                    return typeOrder.indexOf(a.type) < typeOrder.indexOf(b.type) ? -1 : 1;\n                }\n            });\n        } else if (this.sorting() === \"A-Z\") {\n            paramArr.sort(function (a, b) { return a.id < b.id ? -1 : 1; });\n        } else if (this.sorting() === \"Z-A\") {\n            paramArr.sort(function (a, b) { return a.id > b.id ? -1 : 1; });\n        }\n    }\n\n    filterInputs(d) {\n        const discArr = Persist.discover(d);\n        if ((this.filterTags() || this.excludeTags().length > 0 || this.excludeParams.length > 0) && d instanceof PropertyEditor === false) {\n            const context = this;\n            return discArr.filter(function (param, _idx) {\n                if (d[param.id + \"_hidden\"] && d[param.id + \"_hidden\"]()) return false;\n                for (const excludeParamItem of context.excludeParams()) {\n                    const arr = excludeParamItem.split(\".\");\n                    let widgetName;\n                    let excludeParam;\n                    if (arr.length > 2) {\n                        widgetName = arr[0];\n                        excludeParam = arr[2];\n                    } else {\n                        widgetName = arr[0];\n                        excludeParam = arr[1];\n                    }\n                    if (d.class().indexOf(widgetName) !== -1) {\n                        if (param.id === excludeParam) {\n                            return false;\n                        }\n                        return true;\n                    }\n                }\n                if (context.excludeTags().length > 0 && param.ext && param.ext.tags && param.ext.tags.some(function (item) { return (context.excludeTags().indexOf(item) > -1); })) {\n                    return false;\n                }\n                if ((context.filterTags() && param.ext && param.ext.tags && param.ext.tags.indexOf(context.filterTags()) !== -1) || !context.filterTags()) {\n                    return true;\n                }\n                return false;\n            });\n        }\n        return discArr;\n    }\n\n    renderInputs(element, d) {\n        const context = this;\n        let discArr = [];\n        const showFields = !this.show_settings() && this.showFields();\n        if (d) {\n            discArr = this.filterInputs(d).filter(function (prop) { return prop.id !== \"fields\" ? true : showFields; });\n            if (!this.show_settings() && this.showData() && d.data) {\n                discArr.push({ id: \"data\", type: \"array\" });\n            }\n            if (this.hideNonWidgets()) {\n                discArr = discArr.filter(function (n) {\n                    return hasProperties(n.type);\n                });\n            }\n            this._rowSorting(discArr);\n        }\n\n        const rows = element.selectAll(\"tr.prop\" + this.id()).data(discArr, function (d2) { return d2.id; });\n        rows.enter().append(\"tr\")\n            .attr(\"class\", \"property-wrapper prop\" + this.id())\n            .each(function (param) {\n                const tr = d3Select(this);\n                if (hasProperties(param.type)) {\n                    tr.classed(\"property-widget-wrapper\", true);\n                    tr.append(\"td\")\n                        .attr(\"colspan\", \"2\")\n                        ;\n                } else {\n                    tr.classed(\"property-input-wrapper\", true);\n                    tr.append(\"td\")\n                        .classed(\"property-label\", true)\n                        .text(param.id)\n                        ;\n                    const inputCell = tr.append(\"td\")\n                        .classed(\"property-input-cell\", true)\n                        ;\n                    context.enterInputs(d, inputCell, param);\n                }\n            }).merge(rows)\n            .each(function (param) {\n                const tr = d3Select(this);\n                tr.classed(\"disabled\", d[param.id + \"_disabled\"] && d[param.id + \"_disabled\"]());\n                tr.classed(\"invalid\", d[param.id + \"_valid\"] && !d[param.id + \"_valid\"]());\n                tr.attr(\"title\", param.description);\n                if (hasProperties(param.type)) {\n                    context.updateWidgetRow(d, tr.select(\"td\"), param);\n                } else {\n                    context.updateInputs(d, param);\n                }\n            });\n        rows.exit().each(function (param) {\n            const tr = d3Select(this);\n            if (hasProperties(param.type)) {\n                context.updateWidgetRow(d, tr.select(\"td\"), null);\n            }\n        }).remove();\n        rows.order();\n    }\n\n    updateWidgetRow(widget: PropertyExt, element, param) {\n        let tmpWidget = [];\n        if (widget && param) {\n            tmpWidget = widget[param.id]() || [];\n        }\n        let widgetArr = tmpWidget instanceof Array ? tmpWidget : [tmpWidget];\n        if (param && param.ext && param.ext.autoExpand) {\n            //  remove empties and ensure last row is an empty  ---\n            let lastModified = true;\n            const noEmpties = widgetArr.filter(function (row, idx) {\n                lastModified = row.valid();\n                row._owner = widget;\n                return lastModified || idx === widgetArr.length - 1;\n            }, this);\n            const widgetDisabled = widget[param.id + \"_disabled\"] && widget[param.id + \"_disabled\"]();\n            let changed = !!(widgetArr.length - noEmpties.length);\n            if (lastModified && !widgetDisabled) {\n                changed = true;\n                const autoExpandWidget = new param.ext.autoExpand()\n                    .owner(widget)\n                    ;\n                // autoExpandWidget.monitor((id, newVal, oldVal, source) => {\n                // widget.broadcast(param.id, newVal, oldVal, source);\n                // });\n                noEmpties.push(autoExpandWidget);\n            }\n            if (changed) {\n                widget[param.id](noEmpties);\n                widgetArr = noEmpties;\n            }\n        }\n\n        const context = this;\n        element.classed(\"headerRow\", true);\n        const peInput = element.selectAll(`div.peInput-${this.depth()}`).data(widgetArr, function (d) { return d.id(); });\n        peInput.enter().append(\"div\")\n            .attr(\"class\", `peInput peInput-${this.depth()}`)\n            .each(function (w) {\n                const peInputElement = d3Select(this);\n\n                //  Header  ---\n                peInputElement.append(\"span\");\n                peInputElement.append(\"i\")\n                    .attr(\"class\", \"fa\")\n                    .on(\"click\", function (d) {\n                        const clickTarget = peInputElement.select(\"div\");\n                        clickTarget\n                            .classed(\"property-table-collapsed\", !clickTarget.classed(\"property-table-collapsed\"))\n                            ;\n                        d3Select(this)\n                            .classed(\"fa-minus-square-o\", !clickTarget.classed(\"property-table-collapsed\"))\n                            .classed(\"fa-plus-square-o\", clickTarget.classed(\"property-table-collapsed\"))\n                            ;\n                        context.refreshExpandIcon();\n                    })\n                    ;\n\n                //  Body  ---\n                const peDiv = peInputElement.append(\"div\")\n                    // .attr(\"class\", `property- input - cell propEditor-${context.depth() }`)\n                    ;\n                context._childPE.set(this, new PropertyEditor().label(param.id).target(peDiv.node() as HTMLElement));\n            })\n            .merge(peInput)\n            .each(function (w) {\n                const peInputElement = d3Select(this);\n                const clickTarget = peInputElement.select(\"div\");\n\n                //  Header  ---\n                d3Select(this).select(\"span\")\n                    .text(`${param.id}`)\n                    ;\n\n                d3Select(this).select(\"i\")\n                    .classed(\"fa-minus-square-o\", !clickTarget.classed(\"property-table-collapsed\"))\n                    .classed(\"fa-plus-square-o\", clickTarget.classed(\"property-table-collapsed\"))\n                    ;\n\n                //  Body  ---\n                context._childPE.get(this)\n                    .parentPropertyEditor(context)\n                    .showFields(context.showFields())\n                    .showData(context.showData())\n                    .sorting(context.sorting())\n                    .filterTags(context.filterTags())\n                    .excludeTags(context.excludeTags())\n                    .excludeParams(context.excludeParams())\n                    .hideNonWidgets(context.hideNonWidgets() && w._class.indexOf(\"layout_\") >= 0)\n                    .widget(w)\n                    .render()\n                    ;\n            })\n            ;\n        peInput.exit()\n            .each(function (w) {\n                context._childPE.get(this)\n                    .widget(null)\n                    .render()\n                    .target(null)\n                    ;\n                context._childPE.remove(this);\n            })\n            .remove()\n            ;\n    }\n\n    setProperty(widget, id, value) {\n        //  With PropertyExt not all \"widgets\" have a render, if not use top most render...\n        let topWidget: Widget;\n        let topPropEditor: Widget;\n        let propEditor: PropertyEditor = this;\n        let oldValue;\n        while (propEditor && widget) {\n            if (propEditor === this) {\n                oldValue = widget[id]();\n                widget[id](value);\n            }\n            if (propEditor) {\n                topPropEditor = propEditor;\n                const w: PropertyExt = propEditor.widget();\n                if (w instanceof Widget) {\n                    topWidget = w;\n                }\n            }\n            propEditor = propEditor.parentPropertyEditor();\n        }\n        if (topWidget) {\n            topWidget.render();\n        }\n        if (topPropEditor) {\n            topPropEditor.broadcast(id, value, oldValue, widget);\n        }\n    }\n\n    enterInputs(widget, cell, param) {\n        cell.classed(param.type + \"-cell\", true);\n        const context = this;\n        if (typeof (param.ext.editor_input) === \"function\") {\n            param.ext.editor_input(this, widget, cell, param);\n        }\n        switch (param.type) {\n            case \"boolean\":\n                cell.append(\"input\")\n                    .attr(\"id\", this.id() + \"_\" + param.id)\n                    .classed(\"property-input\", true)\n                    .attr(\"type\", \"checkbox\")\n                    .on(\"change\", function () {\n                        context.setProperty(widget, param.id, this.checked);\n                    })\n                    ;\n                break;\n            case \"set\":\n                cell.append(\"select\")\n                    .attr(\"id\", this.id() + \"_\" + param.id)\n                    .classed(\"property-input\", true)\n                    .on(\"change\", function () {\n                        context.setProperty(widget, param.id, this.value);\n                    })\n                    ;\n                break;\n            case \"array\":\n            case \"object\":\n                cell.append(\"textarea\")\n                    .attr(\"id\", this.id() + \"_\" + param.id)\n                    .classed(\"property-input\", true)\n                    .attr(\"autocomplete\", \"off\")\n                    .attr(\"autocorrect\", \"off\")\n                    .attr(\"autocapitalize\", \"off\")\n                    .attr(\"spellcheck\", \"false\")\n                    .on(\"change\", function () {\n                        let value;\n                        try {\n                            value = JSON.parse(this.value);\n                        } catch (e) {\n                            value = this.value;\n                        }\n                        context.setProperty(widget, param.id, value);\n                    })\n                    ;\n                break;\n            default:\n                if (param.ext && param.ext.range) {\n                    cell.append(\"span\")\n                        .classed(\"property-input-span\", true)\n                        .attr(\"id\", this.id() + \"_\" + param.id + \"_currentVal\")\n                        .text(param.defaultValue)\n                        ;\n                    cell.append(\"input\")\n                        .attr(\"type\", \"range\")\n                        .attr(\"step\", param.ext.range.step)\n                        .attr(\"min\", param.ext.range.min)\n                        .attr(\"max\", param.ext.range.max)\n                        .attr(\"id\", this.id() + \"_\" + param.id)\n                        .classed(\"property-input\", true)\n                        .on(\"input\", function () {\n                            context.setProperty(widget, param.id, this.value);\n                            d3Select(\"#\" + this.id + \"_currentVal\").text(\"Current Value: \" + this.value);\n                        })\n                        .on(\"change\", function () {\n                            context.setProperty(widget, param.id, this.value);\n                            d3Select(\"#\" + this.id + \"_currentVal\").text(\"Current Value: \" + this.value);\n                        })\n                        ;\n                } else {\n                    cell.append(param.ext && param.ext.multiline ? \"textarea\" : \"input\")\n                        .attr(\"id\", this.id() + \"_\" + param.id)\n                        .classed(\"property-input\", true)\n                        .attr(\"autocomplete\", \"off\")\n                        .attr(\"autocorrect\", \"off\")\n                        .attr(\"autocapitalize\", \"off\")\n                        .attr(\"spellcheck\", \"false\")\n                        .on(\"change\", function () {\n                            context.setProperty(widget, param.id, this.value);\n                        })\n                        ;\n                    if (param.type === \"html-color\" && !Platform.isIE) {\n                        cell.append(\"input\")\n                            .attr(\"id\", this.id() + \"_\" + param.id + \"_2\")\n                            .classed(\"property-input\", true)\n                            .attr(\"type\", \"color\")\n                            .on(\"change\", function () {\n                                context.setProperty(widget, param.id, this.value);\n                            })\n                            ;\n                    }\n                }\n                break;\n        }\n    }\n\n    updateInputs(widget, param) {\n        const element = d3SelectAll(\"#\" + this.id() + \"_\" + param.id + \", #\" + this.id() + \"_\" + param.id + \"_2\");\n        const val = widget ? widget[param.id]() : \"\";\n        element.property(\"disabled\", widget[param.id + \"_disabled\"] && widget[param.id + \"_disabled\"]());\n        element.property(\"invalid\", widget[param.id + \"_valid\"] && !widget[param.id + \"_valid\"]());\n        switch (param.type) {\n            case \"boolean\":\n                element.property(\"checked\", val);\n                break;\n            case \"set\":\n                const options = element.selectAll(\"option\").data<string | { value: string, text: string }>(widget[param.id + \"_options\"]());\n                options.enter().append(\"option\")\n                    .merge(options as any)\n                    .attr(\"value\", (d: any) => (d && d.value !== undefined) ? d.value : d)\n                    .text((d: any) => (d && d.text !== undefined) ? d.text : d)\n                    ;\n                options.exit().remove();\n                element.property(\"value\", val);\n                break;\n            case \"array\":\n            case \"object\":\n                element.property(\"value\", JSON.stringify(val, function replacer(_key, value) {\n                    if (value instanceof Widget) {\n                        return Persist.serialize(value);\n                    }\n                    return value;\n                }, \"    \"));\n                break;\n            default:\n                if (param.ext && param.ext.range) {\n                    d3Select(\"#\" + this.id() + \"_\" + param.id + \"_currentVal\").text(\"Current Value: \" + val);\n                }\n                element.property(\"value\", val && val.length && val.length > 100000 ? \"...too big to display...\" : val);\n                break;\n        }\n    }\n}\nPropertyEditor.prototype._class += \" other_PropertyEditor\";\n\nexport interface PropertyEditor {\n    showFields(): boolean;\n    showFields(_: boolean): this;\n    showData(): boolean;\n    showData(_: boolean): this;\n\n    sorting(): string;\n    sorting(_: string): this;\n    sorting_options(): string[];\n    sorting_options(_: string[]): this;\n\n    hideNonWidgets(): boolean;\n    hideNonWidgets(_: boolean): this;\n\n    label(): string;\n    label(_: string): this;\n    filterTags(): string;\n    filterTags(_: string): this;\n    excludeTags(): string[];\n    excludeTags(_: string[]): this;\n    excludeParams(): string[];\n    excludeParams(_: string[]): this;\n\n    widget(): PropertyExt;\n    widget(_: PropertyExt): this;\n}\n\nPropertyEditor.prototype.publish(\"showFields\", false, \"boolean\", \"If true, widget.fields() will display as if it was a publish parameter.\", null, { tags: [\"Basic\"] });\nPropertyEditor.prototype.publish(\"showData\", false, \"boolean\", \"If true, widget.data() will display as if it was a publish parameter.\", null, { tags: [\"Basic\"] });\n\nPropertyEditor.prototype.publish(\"sorting\", \"none\", \"set\", \"Specify the sorting type\", [\"none\", \"A-Z\", \"Z-A\", \"type\"], { tags: [\"Basic\"], icons: [\"fa-sort\", \"fa-sort-alpha-asc\", \"fa-sort-alpha-desc\", \"fa-sort-amount-asc\"] });\n\nPropertyEditor.prototype.publish(\"hideNonWidgets\", false, \"boolean\", \"Hides non-widget params (at this tier only)\", null, { tags: [\"Basic\"] });\n\nPropertyEditor.prototype.publish(\"label\", \"\", \"string\", \"Label to display in header of property editor table\", null, { tags: [\"Basic\"] });\nPropertyEditor.prototype.publish(\"filterTags\", \"\", \"set\", \"Only show Publish Params of this type\", [\"Basic\", \"Intermediate\", \"Advance\", \"\"], {});\nPropertyEditor.prototype.publish(\"excludeTags\", [\"Private\"], \"array\", \"Exclude this array of tags\", null, {});\nPropertyEditor.prototype.publish(\"excludeParams\", [], \"array\", \"Exclude this array of params (widget.param)\", null, {});\n\nPropertyEditor.prototype.publish(\"widget\", null, \"widget\", \"Widget\", null, { tags: [\"Basic\"], render: false });\n\nconst _widgetOrig = PropertyEditor.prototype.widget;\n(PropertyEditor.prototype as any).widget = function (_?: Widget): Widget | PropertyEditor {\n    if (arguments.length && _widgetOrig.call(this) === _) return this;\n    const retVal = _widgetOrig.apply(this, arguments);\n    if (arguments.length) {\n        this.watchWidget(_);\n        if (_ instanceof Grid) {\n            const context = this;\n            _.postSelectionChange = function () {\n                context._selectedItems = _._selectionBag.get().map(function (item) { return item.widget; });\n                context.lazyRender();\n            };\n        }\n    }\n    return retVal;\n};\n","import { HTMLWidget } from \"@hpcc-js/common\";\nimport { select as d3Select } from \"d3-selection\";\n\nimport \"../src/RadioCheckbox.css\";\n\nexport class RadioCheckbox extends HTMLWidget {\n    _span;\n    _label;\n    _Checkbox;\n\n    constructor() {\n        super();\n    }\n\n    rcData() {\n        if (this.data().length === 0) return [];\n        const view = this._db.rollupView([this.textColumn(), this.valueColumn()]);\n        let retVal = [];\n        retVal = retVal.concat(view.entries().map(function (row) {\n            return {\n                text: row.key,\n                value: row.values.length ? row.values[0].key : \"\",\n                origRow: row.values.length && row.values[0].values.length ? row.values[0].values[0] : []\n            };\n        }, this));\n        if (this.sort_exists()) {\n            const descending = this.sort() === \"descending\";\n            retVal.sort(function (l, r) {\n                if (l.text < r.text) return descending ? 1 : -1;\n                if (l.text > r.text) return descending ? -1 : 1;\n                return 0;\n            });\n        }\n        return retVal;\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        this._span = element.append(\"span\");\n        this._label = this._span.append(\"label\")\n            .attr(\"for\", this.id() + \"_radioCheckbox\")\n            ;\n        this._Checkbox = this._span.append(\"div\")\n            .attr(\"id\", this.id() + \"_radioCheckbox\");\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n        const context = this;\n        this._label\n            .text(this.label())\n            ;\n        const radioCheckbox = this._Checkbox.selectAll(\".dataRow\").data(this.rcData());\n        radioCheckbox.enter().append(\"div\")\n            .attr(\"class\", \"dataRow\")\n            .each(function (row, idx) {\n                const checkboxDiv = d3Select(this);\n                const id = context.id() + \"_checkbox_\" + idx;\n                checkboxDiv.append(\"input\")\n                    .attr(\"id\", id)\n                    .attr(\"name\", context.id() + \"_radioCheckbox\")\n                    .on(\"change\", function (selectedData) {\n                        context.handleClick();\n                    });\n                checkboxDiv.append(\"label\")\n                    .attr(\"for\", id);\n            });\n        radioCheckbox\n            .each(function (row, idx) {\n                const rcDiv = d3Select(this);\n                rcDiv.select(\"input\")\n                    .attr(\"type\", context.multiple() ? \"checkbox\" : \"radio\")\n                    .attr(\"value\", row.value);\n                rcDiv.select(\"label\")\n                    .text(row.text);\n            });\n        radioCheckbox.exit().remove();\n        radioCheckbox.order();\n    }\n\n    exit(domNode, element) {\n        this._span.remove();\n        super.exit(domNode, element);\n    }\n\n    handleClick() {\n        const options = [];\n        this._Checkbox.selectAll(\".dataRow > input\")\n            .each(function (row, idx) {\n                const input = d3Select(this);\n                if (input.property(\"checked\") && row && row.origRow) {\n                    options.push(row.origRow);\n                }\n            });\n        if (options.length) {\n            //  TODO Handle Multiple Selections - part of 1.16.x\n            this.click(this.rowToObj(options[0]), this.valueColumn(), true);\n        } else {\n            this.click([], this.valueColumn(), false);\n        }\n    }\n\n    click(row, column, selected) {\n    }\n}\nRadioCheckbox.prototype._class += \" other_RadioCheckbox\";\n\nexport interface RadioCheckbox {\n    label(): string;\n    label(_: string): this;\n    label_exists(): boolean;\n    valueColumn(): string;\n    valueColumn(_: string): this;\n    valueColumn_exists(): boolean;\n    textColumn(): string;\n    textColumn(_: string): this;\n    textColumn_exists(): boolean;\n    sort(): string;\n    sort(_: string): this;\n    sort_exists\n    multiple(): boolean;\n    multiple(_: boolean): this;\n    multiple_exists(): boolean;\n}\n\nRadioCheckbox.prototype.publish(\"label\", null, \"string\", \"Label for RadioCheckbox\");\nRadioCheckbox.prototype.publish(\"valueColumn\", null, \"set\", \"RadioCheckbox display value\", function () { return this.columns(); }, { optional: true });\nRadioCheckbox.prototype.publish(\"textColumn\", null, \"set\", \"RadioCheckbox value(s)\", function () { return this.columns(); }, { optional: true });\nRadioCheckbox.prototype.publish(\"sort\", null, \"set\", \"Sort contents\", [\"\", \"ascending\", \"descending\"], { optional: true });\nRadioCheckbox.prototype.publish(\"multiple\", false, \"boolean\", \"Multiple selection\");\n","import { HTMLWidget } from \"@hpcc-js/common\";\nimport { select as d3Select } from \"d3-selection\";\n\nimport \"../src/Select.css\";\n\nexport class Select extends HTMLWidget {\n    _span;\n    _prompt;\n    _select;\n\n    constructor() {\n        super();\n    }\n\n    selectData() {\n        if (this.data().length === 0) return [];\n        const view = this._db.rollupView([this.textColumn(), this.valueColumn()]);\n        let retVal = [];\n        retVal = retVal.concat(view.entries().map(function (row) {\n            return {\n                text: row.key,\n                value: row.values.length ? row.values[0].key : \"\",\n                origRow: row.values.length && row.values[0].value.length ? row.values[0].value[0] : []\n            };\n        }, this));\n        if (this.sort_exists()) {\n            const descending = this.sort() === \"descending\";\n            retVal.sort(function (l, r) {\n                if (l.text < r.text) return descending ? 1 : -1;\n                if (l.text > r.text) return descending ? -1 : 1;\n                return 0;\n            });\n        }\n        if (this.optional()) {\n            retVal.unshift({ value: \"\", text: \"\" });\n        }\n        return retVal;\n    }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        this._span = element.append(\"span\");\n        this._prompt = this._span.append(\"label\")\n            .attr(\"for\", this.id() + \"_select\")\n            ;\n\n        const context = this;\n        this._select = this._span.append(\"select\")\n            .attr(\"id\", this.id() + \"_select\")\n            .on(\"change\", function (d) {\n                const options = [];\n                const options_dom_node = context._select.node().options;\n                for (let i = 0; i < options_dom_node.length; ++i) {\n                    const optionNode = options_dom_node[i];\n                    if (optionNode.selected) {\n                        options.push((d3Select(optionNode).datum() as any).origRow);\n                    }\n                }\n                if (options.length) {\n                    context.click(context.rowToObj(options[0]), context.valueColumn(), true); // TODO:  Multiselect not support in HIPIE\n                } else {\n                    context.click([], context.valueColumn(), false);\n                }\n            })\n            ;\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n\n        this._prompt\n            .text(this.label())\n            ;\n        this._select\n            .attr(\"multiple\", this.multiple() ? this.multiple() : null)\n            .attr(\"size\", this.multiple() && this.selectSize() ? this.selectSize() : null)\n            ;\n\n        const option = this._select.selectAll(\".dataRow\").data(this.selectData());\n        const optionUpdate = option.enter().append(\"option\")\n            .attr(\"class\", \"dataRow\")\n            .merge(option)\n            .attr(\"value\", function (row) { return row.value; })\n            .text(function (row) { return row.text; })\n            ;\n        option.exit().remove();\n        optionUpdate.order();\n    }\n\n    exit(domNode, element) {\n        this._span.remove();\n        super.exit(domNode, element);\n    }\n\n    click(row, column, selected) {\n    }\n}\nSelect.prototype._class += \" other_Select\";\n\nexport interface Select {\n    label(): string;\n    label(_: string): this;\n    label_exists(): boolean;\n    valueColumn(): string;\n    valueColumn(_: string): this;\n    valueColumn_exists(): boolean;\n    textColumn(): string;\n    textColumn(_: string): this;\n    textColumn_exists(): boolean;\n    optional(): boolean;\n    optional(_: boolean): this;\n    optional_exists(): boolean;\n    sort(): string;\n    sort(_: string): this;\n    sort_exists(): boolean;\n    multiple(): boolean;\n    multiple(_: boolean): this;\n    multiple_exists(): boolean;\n    selectSize(): number;\n    selectSize(_: number): this;\n    selectSize_exists(): boolean;\n}\n\nSelect.prototype.publish(\"label\", null, \"string\", \"Label for select\");\nSelect.prototype.publish(\"valueColumn\", null, \"set\", \"Select display value\", function () { return this.columns(); }, { optional: true });\nSelect.prototype.publish(\"textColumn\", null, \"set\", \"Select value(s)\", function () { return this.columns(); }, { optional: true });\nSelect.prototype.publish(\"optional\", true, \"boolean\", \"Optional Select\");\nSelect.prototype.publish(\"sort\", null, \"set\", \"Sort contents\", [\"\", \"ascending\", \"descending\"], { optional: true });\nSelect.prototype.publish(\"multiple\", false, \"boolean\", \"Multiple selection\");\nSelect.prototype.publish(\"selectSize\", 5, \"number\", \"Size of multiselect box\", null, { disable: w => !w.multiple() });\n","import { HTMLWidget } from \"@hpcc-js/common\";\nimport * as Persist from \"./Persist.ts\";\n\nimport \"../src/ThemeEditor.css\";\n\nfunction hasLocalStorage(): boolean {\n    const mod = \"@hpcc-js/other\";\n    try {\n        localStorage.setItem(mod, mod);\n        localStorage.removeItem(mod);\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n//  Polyfill for IE in file:// mode  ----\nconst _localStorage: { getItem: (id: string) => any; } = hasLocalStorage() ? localStorage : {\n    getItem(id: string): any {\n        return undefined;\n    }\n};\n\nconst getThemes = function (idx?) {\n    if (typeof ((window as any).g_defaultThemes) === \"function\") {\n        (window as any).g_defaultThemes(idx);\n    }\n    return JSON.parse(_localStorage.getItem(\"themeEditorThemes\") || \"{}\");\n};\nconst getSerials = function (idx?) {\n    if (typeof ((window as any).g_defaultSerials) === \"function\") {\n        (window as any).g_defaultSerials(idx);\n    }\n    return JSON.parse(_localStorage.getItem(\"themeEditorSerials\") || \"{}\");\n};\nconst getThemeNames = function (idx?) {\n    const loadedThemes = getThemes();\n    let themes = [];\n    for (const themeName in loadedThemes) {\n        themes.push(themeName);\n    }\n    if (typeof (idx) !== \"undefined\" && typeof (themes[idx]) !== \"undefined\") {\n        themes = themes[idx];\n    }\n    return themes;\n};\nconst getSerialNames = function (idx?) {\n    const loadedSerials = getSerials();\n    let serials = [];\n    for (const serialName in loadedSerials) {\n        serials.push(serialName);\n    }\n    if (typeof (idx) !== \"undefined\" && typeof (serials[idx]) !== \"undefined\") {\n        serials = serials[idx];\n    }\n    return serials;\n};\nconst tableNeedsRedraw = function (context) {\n    let needsRedraw = false;\n    if (typeof (context._current_grouping) === \"undefined\") {\n        context._current_grouping = context._group_params_by;\n    } else if (context._current_grouping !== context._group_params_by) {\n        needsRedraw = true;\n    }\n    if (typeof (context._showing_columns) === \"undefined\") {\n        context._showing_columns = context.showColumns();\n    } else if (context._showing_columns !== context.showColumns()) {\n        needsRedraw = true;\n    }\n    if (typeof (context._showing_data) === \"undefined\") {\n        context._showing_data = context.showData();\n    } else if (context._showing_data !== context.showData()) {\n        needsRedraw = true;\n    }\n    return needsRedraw;\n};\nconst camelizeString = function (str) {\n    const spacedText = str.split(/(?=[0-9A-Z])/).map(function (n) { return n.length > 1 ? n + \" \" : n; }).join(\"\");\n    return spacedText.replace(/(?:^|\\s)\\S/g, function (a) { return a.toUpperCase(); });\n};\n\nconst tableInputHtml = function (rowObj, value, widgetArr, idSuffix) {\n    let inputHtml = \"\";\n    let id = \"te-input-\" + rowObj.id + \"-\" + idSuffix;\n\n    let inputType;\n    if (typeof (rowObj.ext) !== \"undefined\" && typeof (rowObj.ext.inputType) !== \"undefined\") {\n        inputType = rowObj.ext.inputType;\n    }\n\n    if (typeof (rowObj.inputID) !== \"undefined\") {\n        id = rowObj.inputID;\n    }\n\n    const dataWIDs = \"data-paramid='\" + rowObj.id + \"' data-wids='\" + widgetArr.map(function (w) {\n        if (typeof (w.widget) === \"object\") {\n            return w.widget._id;\n        } else {\n            return w;\n        }\n    }).join(\",\") + \"'\";\n    switch (rowObj.type) {\n        case \"boolean\":\n            const checked = value ? \" checked\" : \"\";\n            inputHtml = \"<input id='\" + id + \"' \" + dataWIDs + \" type='checkbox' class='te-checkbox te-input'\" + checked + \">\"; break;\n        case \"number\":\n            if (typeof (inputType) !== \"undefined\") {\n                if (inputType === \"textarea\") {\n                    inputHtml = \"<textarea id='\" + id + \"' class='te-textarea te-input' \" + dataWIDs + \">\" + value + \"</textarea>\";\n                } else if (inputType === \"range\") {\n                    inputHtml = \"<input id='\" + id + \"' class='te-input' type='range' \" + dataWIDs + \" value='\" + value + \"'  min='\" + rowObj.ext.min + \"' max='\" + rowObj.ext.max + \"' step='\" + rowObj.ext.step + \"'>\";\n                }\n            } else {\n                inputHtml = \"<input id='\" + id + \"' type='text' class='te-text te-input' \" + dataWIDs + \" value='\" + value + \"'>\";\n            }\n            break;\n        case \"string\":\n            if (typeof (inputType) !== \"undefined\") {\n                if (inputType === \"textarea\") {\n                    inputHtml = \"<textarea id='\" + id + \"' class='te-textarea te-input' \" + dataWIDs + \">\" + value + \"</textarea>\";\n                }\n            } else {\n                inputHtml = \"<input id='\" + id + \"' type='text' class='te-text te-input' value='\" + value + \"' \" + dataWIDs + \">\";\n            }\n            break;\n        case \"html-color\":\n            const valueAttr = value === \"\" ? \"\" : \" value='\" + value + \"'\";\n            inputHtml = \"<input id='\" + id + \"' type='text' class='te-html-color-input te-input' \" + dataWIDs + \" \" + valueAttr + \">\";\n            inputHtml += \"<input type='color' class='te-html-color-button te-input' \" + dataWIDs + \" \" + valueAttr + \">\";\n            break;\n        case \"set\":\n            const options = _options(rowObj, value);\n            inputHtml = \"<select id='\" + id + \"' class='te-select te-input'\" + dataWIDs + \">\" + options + \"</select>\";\n            break;\n        case \"array\":\n            inputHtml = \"<textarea id='\" + id + \"' class='te-textarea te-input' data-type='array' \" + dataWIDs + \">\" + value + \"</textarea>\";\n            break;\n        default:\n            break;\n    }\n    if (typeof (rowObj.ext.saveButton) !== \"undefined\") {\n        inputHtml += \"<button id='\" + rowObj.ext.saveButtonID + \"'>\" + rowObj.ext.saveButton + \"</button>\";\n    }\n    return inputHtml;\n\n    function _options(obj, val) {\n        let options = \"\";\n        obj.set.forEach(function (s) {\n            const selected = s === val ? \" selected\" : \"\";\n            options += \"<option value='\" + s + \"'\" + selected + \">\" + s + \"</option>\";\n        });\n        return options;\n    }\n};\n\nexport class ThemeEditor extends HTMLWidget {\n    _current_grouping;\n    _showing_columns;\n    _showing_data;\n    _contentEditors;\n    _showSettings;\n    _defaultThemes;\n    _widgetObjsById;\n    _sharedProperties;\n    getThemes;\n    getSerials;\n    getDefaultThemes;\n    getDefaultSerials;\n\n    constructor() {\n        super();\n\n        this._tag = \"div\";\n        this._current_grouping = undefined;\n        this._showing_columns = undefined;\n        this._showing_data = undefined;\n        this.columns([\"Key\", \"Value\"]);\n        this._contentEditors = [];\n        this._showSettings = true;\n\n        this._defaultThemes = [];\n\n        this._widgetObjsById = {};\n    }\n\n    showSettings(_?) {\n        if (!arguments.length) {\n            return this._showSettings;\n        }\n        this._showSettings = _;\n        return this;\n    }\n\n    onChange(widget, propID) { }\n\n    enter(domNode, element) {\n        super.enter(domNode, element);\n        this._placeholderElement.style(\"overflow\", \"auto\");\n    }\n\n    widgetProperty(widget, propID, _?) {\n        if (_ === undefined) {\n            return widget[propID]();\n        }\n        return widget[propID](_);\n    }\n\n    load(elmValue) { }\n\n    save(themeName) { }\n\n    needsPropTableRedraw() {\n        const ret = document.getElementById(\"te-themeEditorOptions\") === null;\n        return ret;\n    }\n\n    update(domNode, element) {\n        super.update(domNode, element);\n        if (tableNeedsRedraw(this)) {\n            element.selectAll(\"#\" + this._id + \" > table\").remove();\n        }\n        this._current_grouping = this.paramGrouping();\n        this._widgetObjsById[this._id] = this;\n        this._sharedProperties = this.findSharedProperties(this.data());\n\n        const needsPropertiesTableRedraw = this.needsPropTableRedraw();\n        if (needsPropertiesTableRedraw && this.showSettings()) {\n            const teParams = Persist.discover(this);\n            for (const i in teParams) {\n                if (teParams[i].ext.tags.indexOf(this.editorComplexity()) !== -1) {\n                    const teParamVal = this[teParams[i].id]();\n                    if (teParams[i].id === \"loadedTheme\" || teParams[i].id === \"loadedSerial\") {\n                        teParams[i].inputID = \"te-load-theme\";\n                    }\n                    teParams[i].input = tableInputHtml(teParams[i], teParamVal, [this._id], this._id);\n                } else {\n                    delete teParams[i];\n                }\n            }\n            domNode.innerHTML = this.propertiesTableHtml(teParams);\n            const evt = document.createEvent(\"Events\");\n            evt.initEvent(\"TE Properties Ready\", true, true);\n            document.dispatchEvent(evt);\n        }\n\n        this.buildTableObjects(domNode, this._sharedProperties);\n\n        this.initFunctionality(domNode);\n    }\n\n    exit(domNode, element) {\n        super.exit(domNode, element);\n    }\n\n    click(d) {\n    }\n\n    propertiesTableHtml(editorParams) {\n        const tableObj = {\n            id: \"te-themeEditorOptions\",\n            label: \"Editor Options\",\n            rowArr: []\n        };\n        const modeTableObj = {\n            id: \"te-tableModeOptions\",\n            label: this.themeMode() ? \"Save/Load Theme\" : \"Save/Load Serial\",\n            rowArr: []\n        };\n        for (const i in editorParams) {\n            if (this.themeMode()) {\n                if (editorParams[i].ext.tags.indexOf(\"Theme\") === -1 && editorParams[i].ext.tags.indexOf(\"Serial\") === -1) {\n                    tableObj.rowArr.push({\n                        th: camelizeString(editorParams[i].id),\n                        td: editorParams[i].input,\n                        trClass: \"propertyRow\"\n                    });\n                } else if (editorParams[i].ext.tags.indexOf(\"Theme\") !== -1) {\n                    modeTableObj.rowArr.push({\n                        th: camelizeString(editorParams[i].id),\n                        td: editorParams[i].input,\n                        trClass: \"propertyRow\"\n                    });\n                }\n            } else {\n                if (editorParams[i].ext.tags.indexOf(\"Serial\") === -1 && editorParams[i].ext.tags.indexOf(\"Theme\") === -1) {\n                    tableObj.rowArr.push({\n                        th: camelizeString(editorParams[i].id),\n                        td: editorParams[i].input,\n                        trClass: \"propertyRow\"\n                    });\n                } else if (editorParams[i].ext.tags.indexOf(\"Serial\") !== -1) {\n                    modeTableObj.rowArr.push({\n                        th: camelizeString(editorParams[i].id),\n                        td: editorParams[i].input,\n                        trClass: \"propertyRow\"\n                    });\n                }\n            }\n\n        }\n        let html = \"\";\n        if (tableObj.rowArr.length > 0) {\n            html += this.tableObjHtml(tableObj);\n        }\n        if (modeTableObj.rowArr.length > 0) {\n            html += this.tableObjHtml(modeTableObj);\n        }\n        return html;\n    }\n    buildTableObjects(targetElement, propObjs) {\n        let sectionObjs;\n        if (this.themeMode()) {\n            sectionObjs = {\n                chartColorSection: {\n                    id: \"te-colorOptions\",\n                    label: \"Chart Colors\",\n                    rowObjArr: []\n                },\n                surfaceSection: {\n                    id: \"te-containerOptions\",\n                    label: \"Container Styles/Colors\",\n                    rowObjArr: []\n                },\n                fontSection: {\n                    id: \"te-fontOptions\",\n                    label: \"Font Styles/Colors\",\n                    rowObjArr: []\n                }\n            };\n        } else {\n            sectionObjs = {\n                nonSurfaceSection: {\n                    id: \"te-chartOptions\",\n                    label: \"Chart Properties\",\n                    rowObjArr: []\n                }\n            };\n        }\n        for (const p in propObjs) {\n            if (this.themeMode()) {\n                if (p.toUpperCase().indexOf(\"FONT\") !== -1 && !(propObjs[p].arr[0].widget._class.indexOf(\"layout_Surface\") !== -1 && p.toUpperCase().indexOf(\"COLOR\") !== -1)) {\n                    sectionObjs[\"fontSection\"].rowObjArr.push(propObjs[p]);\n                } else if (p === \"paletteID\") {\n                    sectionObjs[\"chartColorSection\"].rowObjArr.push(propObjs[p]);\n                } else if (propObjs[p].arr[0].widget._class.indexOf(\"layout_Surface\") !== -1) {\n                    sectionObjs[\"surfaceSection\"].rowObjArr.push(propObjs[p]);\n                }\n            } else {\n                if (propObjs[p].arr[0].widget._class.indexOf(\"layout_Surface\") === -1) {\n                    sectionObjs[\"nonSurfaceSection\"].rowObjArr.push(propObjs[p]);\n                }\n            }\n        }\n        let html = \"\";\n        for (const i in sectionObjs) {\n            html += this.sharedPropertyTableHtml(sectionObjs[i]);\n        }\n        targetElement.innerHTML += html;\n    }\n\n    initFunctionality(elm) {\n        const context = this;\n        _expandCollapse(elm);\n        _inputOnChange(elm);\n        _inputOnClick(elm);\n        function _inputOnClick(elm2) {\n            if (context.showSettings()) {\n                const saveBtn = document.getElementById(\"te-save-button\");\n                saveBtn.onclick = function (e) {\n                    const clickedElm: any = e.target;\n                    const themeName = clickedElm.previousSibling.value;\n                    if (themeName.length > 1) {\n                        const loadSelect = document.getElementById(\"te-load-theme\");\n                        const loadOptions = loadSelect.getElementsByTagName(\"option\");\n                        let saveExists = false;\n                        for (const i in loadOptions) {\n                            const val = loadOptions[i].value;\n                            if (val === themeName) {\n                                saveExists = true;\n                            }\n                        }\n                        if (!saveExists) {\n                            loadSelect.innerHTML += \"<option value='\" + themeName + \"'>\" + themeName + \"</option>\";\n                        }\n                        clickedElm.previousSibling.value = \"\";\n                        (loadSelect as any).value = themeName;\n                    } else {\n                        alert(\"Save Name cannot be empty.\");\n                    }\n                };\n            }\n        }\n        function _inputOnChange(elm2) {\n            const teInputs = elm2.getElementsByClassName(\"te-input\");\n            for (const i in teInputs) {\n                if (isNaN(parseInt(i))) break;\n                const inputElm = teInputs[i];\n                const inputID = inputElm.getAttribute(\"id\");\n                if (inputID === \"te-load-theme\") {\n                    inputElm.onchange = function (e) {\n                        const elm3 = e.srcElement;\n                        context.load(elm3.value);\n                    };\n                } else if (inputID !== null && inputID.indexOf(\"te-input-themeMode\") !== -1) {\n                    inputElm.onchange = function (e) {\n                        const elm3 = e.srcElement;\n                        context.themeMode(elm3.checked);\n\n                        const name = document.getElementById(\"te-load-theme\");\n                        const nameToLoad = name !== null ? (name as any).value : \"Default\";\n                        context.load(nameToLoad);\n                    };\n                } else if (inputElm.tagName === \"INPUT\" || inputElm.tagName === \"SELECT\" || inputElm.tagName === \"TEXTAREA\") {\n                    inputElm.onchange = function (e) {\n                        const elm3 = e.srcElement;\n\n                        let id = elm3.getAttribute(\"id\");\n\n                        if (elm3.className.split(\" \").indexOf(\"te-html-color-button\") !== -1) {\n                            id = elm3.previousSibling.getAttribute(\"id\");\n                            elm3.previousSibling.value = elm3.value;\n                        }\n                        const elmType = elm3.getAttribute(\"type\");\n                        const splitId = id.split(\"-\");\n                        const genericId = splitId.slice(0, splitId.length - 1).join(\"-\") + \"-\";\n\n                        const widsStr = elm3.getAttribute(\"data-wids\");\n                        const paramId = elm3.getAttribute(\"data-paramid\");\n                        const widArr = widsStr.split(\",\");\n                        widArr.forEach(function (wid) {\n                            const individualId = genericId + wid;\n                            const indElm = document.getElementById(individualId);\n                            if (elmType === \"checkbox\") {\n                                (indElm as any).checked = elm3.checked;\n                                context._widgetObjsById[wid][paramId](elm3.checked);\n                            } else if (elm3.getAttribute(\"data-type\") === \"array\") {\n                                (indElm as any).value = elm3.value;\n                                try {\n                                    context._widgetObjsById[wid][paramId](JSON.parse(elm3.value));\n                                } catch (e) { }\n                            } else {\n                                (indElm as any).value = elm3.value;\n                                context._widgetObjsById[wid][paramId](elm3.value);\n\n                                if (indElm.className.split(\" \").indexOf(\"te-html-color-input\") !== -1) {\n                                    (indElm.nextSibling as any).value = elm3.value;\n                                } else if (indElm.className.split(\" \").indexOf(\"te-html-color-button\") !== -1) {\n                                    (indElm.previousSibling as any).value = elm3.value;\n                                }\n                            }\n                        });\n                        context.data().forEach(function (d) {\n                            d.render();\n                        });\n                    };\n                }\n            }\n        }\n        function _expandCollapse(elm2) {\n            const tableArr = elm2.getElementsByClassName(\"te-section-table\");\n            for (const i in tableArr) {\n                if (typeof (tableArr[i].getElementsByTagName) === \"function\") {\n                    const thead = tableArr[i].getElementsByTagName(\"thead\");\n                    thead[0].onclick = function (e) {\n                        let elm3 = e.toElement;\n                        if (elm3.tagName === \"TH\") {\n                            elm3 = elm3.parentElement.parentElement;\n                        }\n                        const parent = elm3.parentElement;\n                        let tbodyClass;\n                        if (parent.className.split(\" \").indexOf(\"expanded\") === -1) {\n                            parent.className = \"te-section-table expanded\";\n                            tbodyClass = \"shown\";\n                        } else {\n                            parent.className = \"te-section-table collapsed\";\n                            tbodyClass = \"hidden\";\n                        }\n                        const tbody = parent.getElementsByTagName(\"tbody\");\n                        tbody[0].className = tbodyClass;\n                    };\n                }\n            }\n            const sharedRowArr = elm2.getElementsByClassName(\"sharedPropertyRow\");\n            for (const n in sharedRowArr) {\n                if (typeof (sharedRowArr[n].getElementsByClassName) === \"function\") {\n                    const label = sharedRowArr[n].getElementsByClassName(\"te-label\");\n                    label[0].onclick = function (e) {\n                        const elm3 = e.toElement;\n                        const parent = elm3.parentElement;\n                        let subRowClass;\n                        if (parent.className.split(\" \").indexOf(\"expanded\") === -1) {\n                            parent.className = \"sharedPropertyRow expanded\";\n                            subRowClass = \"shown\";\n                        } else {\n                            parent.className = \"sharedPropertyRow collapsed\";\n                            subRowClass = \"hidden\";\n                        }\n                        let nextSib = parent.nextSibling;\n                        while (nextSib !== null) {\n                            if (nextSib.className.split(\" \").indexOf(\"sharedPropertyRow\") === -1) {\n                                nextSib.className = \"propertyRow \" + subRowClass;\n                                nextSib = nextSib.nextSibling;\n                            } else {\n                                nextSib = null;\n                            }\n                        }\n                    };\n                }\n            }\n        }\n    }\n    sharedPropertyTableHtml(sectionObj) {\n        const tableObj = {\n            id: sectionObj.id,\n            label: sectionObj.label,\n            rowArr: []\n        };\n        sectionObj.rowObjArr.forEach(function (rowObj) {\n            rowObj.arr.forEach(function (widgetObj, widgetIdx) {\n                if (widgetIdx === 0) {\n                    tableObj.rowArr.push({\n                        th: _sharedPropertyLabel(rowObj),\n                        td: _sharedPropertyInput(rowObj),\n                        trClass: \"sharedPropertyRow collapsed\"\n                    });\n                }\n                tableObj.rowArr.push({\n                    th: _propertyLabel(widgetObj),\n                    td: _propertyInput(rowObj, widgetIdx),\n                    trClass: \"propertyRow hidden\"\n                });\n            });\n        });\n\n        return this.tableObjHtml(tableObj);\n\n        function _propertyLabel(widgetObj) {\n            const splitClass = widgetObj.widget.classID().split(\"_\");\n            const displayClass = splitClass.join(\"/\");\n            return displayClass + \" <i>[\" + widgetObj.widget._id + \"]</i>\";\n        }\n        function _sharedPropertyLabel(rowObj) {\n            return camelizeString(rowObj.id);\n        }\n\n        function _propertyInput(rowObj, idx) {\n            const value = _value(rowObj, idx);\n            const html = tableInputHtml(rowObj, value, [rowObj.arr[idx]], rowObj.arr[idx].widget._id);\n            return html;\n\n            function _value(rowObj2, idx2) {\n                const value2 = rowObj2.arr[idx2].widget[rowObj2.id]();\n                return value2 !== null ? value2 : \"\";\n            }\n        }\n        function _sharedPropertyInput(rowObj) {\n            const value = _sharedValue(rowObj);\n            const html = tableInputHtml(rowObj, value, rowObj.arr, \"shared\");\n            return html;\n\n            function _sharedValue(rowObj2) {\n                const value2 = rowObj2.arr[0].widget[rowObj2.id]();\n                rowObj2.arr.forEach(function (w, i) {\n                    if (value2 !== w.widget[w.id]()) {\n                        return \"\";\n                    }\n                });\n                if (value2 !== null) {\n                    if (rowObj2.type === \"array\") {\n                        return JSON.stringify(value2);\n                    }\n                    return value2;\n                }\n                return \"\";\n            }\n        }\n    }\n\n    tableObjHtml(tableObj) {\n        let html = \"<table id='\" + tableObj.id + \"' class='te-section-table expanded'>\";\n        html += \"<thead><tr><th colspan='2'>\" + tableObj.label + \"</th></tr></thead>\";\n        html += \"<tbody>\";\n        tableObj.rowArr.forEach(function (rowObj) {\n            html += this.tableRowObjHtml(rowObj);\n        }, this);\n        html += \"</tbody>\";\n        return html + \"</table>\";\n    }\n    tableRowObjHtml(rowObj) {\n        let html = typeof (rowObj.trClass) !== \"undefined\" ? \"<tr class='\" + rowObj.trClass + \"'>\" : \"<tr>\";\n        html += \"<th class='te-label'>\" + rowObj.th + \"</th>\";\n        html += \"<td>\" + rowObj.td + \"</td>\";\n        return html + \"</tr>\";\n    }\n\n    setWidgetObjsById(widgetProp) {\n        const context = this;\n        const val = widgetProp.widget[widgetProp.id]();\n        if (widgetProp.type === \"widgetArray\") {\n            val.forEach(function (widget) {\n                context._widgetObjsById[widget._id] = widget;\n            });\n        } else if (widgetProp.type === \"widget\" && val !== null) {\n            this._widgetObjsById[val._id] = val;\n        }\n    }\n    checkTagFilter(tagArr) {\n        const allowTags = [\"Basic\"];\n        let ret = false;\n        tagArr.forEach(function (tag) {\n            if (allowTags.indexOf(tag) !== -1) {\n                ret = true;\n            }\n        });\n        return ret;\n    }\n    findSharedProperties(data) {\n        const context = this;\n        let propsByID;\n        if (typeof (data) !== \"undefined\" && data.length > 0) {\n            let allProps = [];\n            propsByID = {};\n            const surfacePropsByID = {};\n            const nonSurfacePropsByID = {};\n            data.forEach(function (widget) {\n                const gpResponse = _getParams(widget, 0);\n                allProps = allProps.concat(gpResponse);\n            });\n            allProps.forEach(function (prop) {\n                if ([\"widget\", \"widgetArray\"].indexOf(prop.type) !== -1) {\n                    context.setWidgetObjsById(prop);\n                } else if (context.checkTagFilter(prop.ext.tags)) {\n                    const tempIdx = prop.id;\n                    if (prop.widget._class.indexOf(\"Surface\") !== -1) {\n                        if (typeof (surfacePropsByID[tempIdx]) === \"undefined\") {\n                            surfacePropsByID[tempIdx] = { arr: [] };\n                        }\n                        surfacePropsByID[tempIdx].id = prop.id;\n                        surfacePropsByID[tempIdx].description = prop.description;\n                        surfacePropsByID[tempIdx].type = prop.type;\n                        surfacePropsByID[tempIdx].set = prop.set;\n                        surfacePropsByID[tempIdx].ext = prop.ext;\n                        surfacePropsByID[tempIdx].arr.push(prop);\n                    } else {\n                        if (typeof (nonSurfacePropsByID[tempIdx]) === \"undefined\") {\n                            nonSurfacePropsByID[tempIdx] = { arr: [] };\n                        }\n                        nonSurfacePropsByID[tempIdx].id = prop.id;\n                        nonSurfacePropsByID[tempIdx].description = prop.description;\n                        nonSurfacePropsByID[tempIdx].type = prop.type;\n                        nonSurfacePropsByID[tempIdx].set = prop.set;\n                        nonSurfacePropsByID[tempIdx].ext = prop.ext;\n                        nonSurfacePropsByID[tempIdx].arr.push(prop);\n                    }\n                    if (typeof (propsByID[tempIdx]) === \"undefined\") {\n                        propsByID[tempIdx] = { arr: [] };\n                    }\n                    propsByID[tempIdx].id = prop.id;\n                    propsByID[tempIdx].description = prop.description;\n                    propsByID[tempIdx].type = prop.type;\n                    propsByID[tempIdx].set = prop.set;\n                    propsByID[tempIdx].ext = prop.ext;\n                    propsByID[tempIdx].arr.push(prop);\n                }\n            });\n        }\n        return propsByID;\n\n        function _getParams(widgetObj, depth) {\n            let retArr = [];\n            if (widgetObj !== null) {\n                const paramArr = Persist.discover(widgetObj);\n                paramArr.forEach(function (param, i1) {\n                    if (typeof (param.ext.tags) !== \"undefined\") {\n                        retArr.push({\n                            id: param.id,\n                            type: param.type,\n                            description: param.description,\n                            set: param.set,\n                            ext: param.ext,\n                            widget: widgetObj\n                        });\n                    }\n                    if (param.type === \"widgetArray\") {\n                        const childWidgetArray = context.widgetProperty(widgetObj, param.id);\n                        childWidgetArray.forEach(function (childWidget) {\n                            const cwArr = _getParams(childWidget, depth + 1);\n                            retArr = retArr.concat(cwArr);\n                        });\n                    } else if (param.type === \"widget\") {\n                        const childWidget = context.widgetProperty(widgetObj, param.id);\n                        const temp = _getParams(childWidget, depth + 1);\n                        retArr = retArr.concat(temp);\n                    }\n                });\n            }\n            return retArr;\n        }\n    }\n}\nThemeEditor.prototype._class += \" other_ThemeEditor\";\n\nexport interface ThemeEditor {\n    themeMode(): boolean;\n    themeMode(_: boolean): this;\n    themeMode_exists(): boolean;\n    saveTheme(): string;\n    saveTheme(_: string): this;\n    saveTheme_exists(): boolean;\n    loadedTheme(): string;\n    loadedTheme(_: string): this;\n    loadedTheme_exists(): boolean;\n    saveSerial(): string;\n    saveSerial(_: string): this;\n    saveSerial_exists(): boolean;\n    loadedSerial(): string;\n    loadedSerial(_: string): this;\n    loadedSerial_exists(): boolean;\n    showColumns(): boolean;\n    showColumns(_: boolean): this;\n    showColumns_exists(): boolean;\n    showData(): boolean;\n    showData(_: boolean): this;\n    showData_exists(): boolean;\n    shareCountMin(): number;\n    shareCountMin(_: number): this;\n    shareCountMin_exists(): boolean;\n    paramGrouping(): string;\n    paramGrouping(_: string): this;\n    paramGrouping_exists(): boolean\n    editorComplexity(): string;\n    editorComplexity(_: string): this;\n    editorComplexity_exists(): boolean;\n    sectionTitle(): string;\n    sectionTitle(_: string): this;\n    sectionTitle_exists(): boolean;\n    collapsibleSections(): boolean;\n    collapsibleSections(_: boolean): this;\n    collapsibleSections_exists(): boolean;\n}\n\nThemeEditor.prototype.publish(\"themeMode\", true, \"boolean\", \"Edit default values\", null, { tags: [\"Basic\"] });\nThemeEditor.prototype.publish(\"saveTheme\", \"\", \"string\", \"Save Theme\", null, { tags: [\"Basic\", \"Theme\"], saveButton: \"Save\", saveButtonID: \"te-save-button\" });\nThemeEditor.prototype.publish(\"loadedTheme\", getThemeNames(1), \"set\", \"Loaded Theme\", getThemeNames(), { tags: [\"Basic\", \"Theme\"] });\nThemeEditor.prototype.publish(\"saveSerial\", \"\", \"string\", \"Save Serial\", null, { tags: [\"Basic\", \"Serial\"], saveButton: \"Save\", saveButtonID: \"te-save-button\" });\nThemeEditor.prototype.publish(\"loadedSerial\", getSerialNames(0), \"set\", \"Loaded Serial\", getSerialNames(), { tags: [\"Basic\", \"Serial\"] });\nThemeEditor.prototype.publish(\"showColumns\", true, \"boolean\", \"Show Columns\", null, { tags: [\"Intermediate\"] });\nThemeEditor.prototype.publish(\"showData\", true, \"boolean\", \"Show Data\", null, { tags: [\"Intermediate\"] });\nThemeEditor.prototype.publish(\"shareCountMin\", 1, \"number\", \"Share Count Min\", null, { tags: [\"Private\"] });\nThemeEditor.prototype.publish(\"paramGrouping\", \"By Param\", \"set\", \"Param Grouping\", [\"By Param\", \"By Widget\"], { tags: [\"Private\"] });\nThemeEditor.prototype.publish(\"editorComplexity\", \"Basic\", \"set\", \"Choose what publish properties to display within the editor.\", [\"Basic\", \"Intermediate\", \"Advanced\", \"Private\"], { tags: [\"Private\"] });\nThemeEditor.prototype.publish(\"sectionTitle\", \"\", \"string\", \"Section Title\", null, { tags: [\"Private\"] });\nThemeEditor.prototype.publish(\"collapsibleSections\", true, \"boolean\", \"Collapsible Sections\", null, { tags: [\"Intermediate\"] });\n\nThemeEditor.prototype.getThemes = getThemes;\nThemeEditor.prototype.getSerials = getSerials;\nThemeEditor.prototype.getDefaultThemes = getThemeNames;\nThemeEditor.prototype.getDefaultSerials = getSerialNames;\n"],"x_google_ignoreList":[1,3,6,7,8,9,10,11,15],"mappings":"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"}