{"version":3,"file":"webglimpse.mjs","sources":["../../src/webglimpse/util/util.ts","../../src/webglimpse/util/cache.ts","../../src/webglimpse/util/multikey_cache.ts","../../src/webglimpse/bounds.ts","../../src/webglimpse/color.ts","../../src/webglimpse/matrix.ts","../../src/webglimpse/util/notification.ts","../../src/webglimpse/util/ordered_set.ts","../../src/webglimpse/util/sorted_arrays.ts","../../src/webglimpse/util/binary_tree.ts","../../src/webglimpse/util/sorted_multimap.ts","../../src/webglimpse/util/split.ts","../../src/webglimpse/buffer.ts","../../src/webglimpse/shader.ts","../../src/webglimpse/core.ts","../../src/webglimpse/misc.ts","../../src/webglimpse/texture.ts","../../src/webglimpse/text.ts","../../src/webglimpse/label.ts","../../src/webglimpse/scroll.ts","../../src/webglimpse/layout/inset_layout.ts","../../src/webglimpse/layout/corner_layout.ts","../../src/webglimpse/layout/row_layout.ts","../../src/webglimpse/layout/column_layout.ts","../../src/webglimpse/layout/overlay_layout.ts","../../src/webglimpse/layout/card_layout.ts","../../src/webglimpse/painter/border_painter.ts","../../src/webglimpse/plot/axis.ts","../../src/webglimpse/plot/plot_layout.ts","../../src/webglimpse/gradient.ts","../../src/webglimpse/plot/heatmap_painter.ts","../../src/webglimpse/plot/edge_axis_painter.ts","../../src/webglimpse/plot/line_painter.ts","../../src/webglimpse/time.ts","../../src/webglimpse/timeline/time_axis.ts","../../src/webglimpse/timeline/time_axis_painter.ts","../../src/webglimpse/timeline/time_grid_painter.ts","../../src/webglimpse/timeline/timeline_lanes.ts","../../src/webglimpse/timeline/timeline_events_row.ts","../../src/webglimpse/timeline/timeline_model.ts","../../src/webglimpse/timeline/timeline_layout.ts","../../src/webglimpse/timeline/timeline_cursor_painter.ts","../../src/webglimpse/timeline/timeline_annotation_painter.ts","../../src/webglimpse/timeline/timeline_annotation_style.ts","../../src/webglimpse/timeline/timeline_event_style.ts","../../src/webglimpse/timeline/timeline_ui.ts","../../src/webglimpse/timeline/timeline_timeseries_row.ts","../../src/webglimpse/timeline/timeline_styles.ts","../../src/webglimpse/timeline/timeline_pane.ts","../../src/public_api.ts","../../src/webglimpse.ts"],"sourcesContent":["/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n// Alias for more readable access to static constants\r\nexport let GL = WebGLRenderingContext;\r\n\r\n\r\nexport function hasval(value: any): boolean {\r\n    // Double-equals is weird: ( undefined == null ) is true\r\n    return (value != null);\r\n}\r\n\r\n\r\nexport function isNumber(value: any): boolean {\r\n    return typeof (value) === 'number';\r\n}\r\n\r\n\r\nexport function isString(value: any): boolean {\r\n    return typeof (value) === 'string';\r\n}\r\n\r\n\r\nexport function isEmpty(array: any[]): boolean {\r\n    return (array.length === 0);\r\n}\r\n\r\n\r\nexport function notEmpty(array: any[]): boolean {\r\n    return (array.length > 0);\r\n}\r\n\r\n\r\nexport function alwaysTrue(): boolean {\r\n    return true;\r\n}\r\n\r\n\r\nexport function alwaysFalse(): boolean {\r\n    return false;\r\n}\r\n\r\n\r\nexport function constantFn<V>(value: V): () => V {\r\n    return function (): V {\r\n        return value;\r\n    };\r\n}\r\n\r\n\r\nexport function log10(x: number): number {\r\n    return Math.log(x) * (1.0 / Math.LN10);\r\n}\r\n\r\n\r\nexport function order(x: number): number {\r\n    return Math.floor(log10(x) + 1e-12);\r\n}\r\n\r\n\r\nexport function clamp(xMin: number, xMax: number, x: number): number {\r\n    return Math.max(xMin, Math.min(xMax, x));\r\n}\r\n\r\n\r\nexport function copyArray<T>(values: T[]): T[] {\r\n    return values.slice(0);\r\n}\r\n\r\n\r\nexport function ensureCapacityFloat32(buffer: Float32Array, minNewCapacity: number): Float32Array {\r\n    // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer\r\n    if (!minNewCapacity || buffer.length >= minNewCapacity) {\r\n        return buffer;\r\n    }\r\n    else {\r\n        const newCapacity = Math.max(minNewCapacity, 2 * buffer.length);\r\n        return new Float32Array(newCapacity);\r\n    }\r\n}\r\n\r\n\r\nexport function ensureCapacityUint32(buffer: Uint32Array, minNewCapacity: number): Uint32Array {\r\n    // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer\r\n    if (!minNewCapacity || buffer.length >= minNewCapacity) {\r\n        return buffer;\r\n    }\r\n    else {\r\n        const newCapacity = Math.max(minNewCapacity, 2 * buffer.length);\r\n        return new Uint32Array(newCapacity);\r\n    }\r\n}\r\n\r\n\r\nexport function ensureCapacityUint16(buffer: Uint16Array, minNewCapacity: number): Uint16Array {\r\n    // if minNewCapacity is NaN, null, or undefined, don't try to resize the buffer\r\n    if (!minNewCapacity || buffer.length >= minNewCapacity) {\r\n        return buffer;\r\n    }\r\n    else {\r\n        const newCapacity = Math.max(minNewCapacity, 2 * buffer.length);\r\n        return new Uint16Array(newCapacity);\r\n    }\r\n}\r\n\r\n\r\nexport interface StringMap<V> {\r\n    [key: string]: V;\r\n}\r\n\r\nexport type IdFunction<V> = (value: V) => string;\r\n\r\n\r\nexport let getObjectId = (function () {\r\n    const keyName = 'webglimpse_ObjectId';\r\n    let nextValue = 0;\r\n    return function (obj: any): string {\r\n        let value = obj[keyName];\r\n        if (!hasval(value)) {\r\n            value = (nextValue++).toString();\r\n            obj[keyName] = value;\r\n        }\r\n        return value;\r\n    };\r\n})();\r\n\r\n\r\nexport function concatLines(...lines: string[]) {\r\n    return lines.join('\\n');\r\n}\r\n\r\n\r\n/**\r\n * Parses a timestamp from the format 'YYYY-MM-DDTHH:mm:ss[.SSS]ZZ' into posix-milliseconds.\r\n *\r\n * Format examples:\r\n *   - '2014-01-01T00:00:00Z'\r\n *   - '2014-01-01T00:00:00.000+00:00'\r\n *\r\n * Use of a colon in numeric timezones is optional. However, it is strongly encouraged, for\r\n * compatibility with Date in major browsers.\r\n *\r\n * Parsing is strict, and will throw an error if the input string does not match the expected\r\n * format. A notable example is that the seconds field must not have more than three decimal\r\n * places.\r\n *\r\n */\r\nimport moment from 'moment';\r\n\r\nexport function parseTime_PMILLIS(time_ISO8601: string): number {\r\n\r\n    // Moment's lenient parsing is way too lenient -- but its strict parsing is a little too\r\n    // strict, so we have to try several possible formats.\r\n    //\r\n    // We could pass in multiple formats to try all at once, but Moment's docs warn that that\r\n    // can be slow. Plus, we expect some formats to be more common than others, so we can make\r\n    // the common formats fast at the expense of the less common ones.\r\n    //\r\n\r\n    let m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ssZZ', true);\r\n    if (m.isValid()) {\r\n        return m.valueOf();\r\n    }\r\n\r\n    m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSSZZ', true);\r\n    if (m.isValid()) {\r\n        return m.valueOf();\r\n    }\r\n\r\n    m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SSZZ', true);\r\n    if (m.isValid()) {\r\n        return m.valueOf();\r\n    }\r\n\r\n    m = moment(time_ISO8601, 'YYYY-MM-DDTHH:mm:ss.SZZ', true);\r\n    if (m.isValid()) {\r\n        return m.valueOf();\r\n    }\r\n\r\n    throw new Error('Failed to parse time-string: \\'' + time_ISO8601 + '\\'');\r\n}\r\n\r\n\r\n/**\r\n * Formats a timestamp from posix-millis into the format 'YYYY-MM-DDThh:mm:ss.SSSZZ' (for\r\n * example '2014-01-01T00:00:00.000Z').\r\n *\r\n * The input value is effectively truncated (not rounded!) to milliseconds. So for example,\r\n * formatTime_ISO8601(12345.999) will return '1970-01-01T00:00:12.345Z' -- exactly the same\r\n * as for an input of 12345.\r\n *\r\n */\r\nexport function formatTime_ISO8601(time_PMILLIS: number): string {\r\n    return moment(time_PMILLIS).toISOString();\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n\r\nexport interface CacheHelper<V> {\r\n    create(key: string): V;\r\n    dispose(value: V, key: string): void;\r\n}\r\n\r\n\r\nclass CacheEntry<V> {\r\n    value: V;\r\n    touched = false;\r\n\r\n    constructor(value: V) {\r\n        this.value = value;\r\n    }\r\n}\r\n\r\n\r\nexport class Cache<V> {\r\n    private helper: CacheHelper<V>;\r\n    private map: { [k: string]: CacheEntry<V>; };\r\n\r\n    constructor(helper: CacheHelper<V>) {\r\n        this.helper = helper;\r\n        this.map = {};\r\n    }\r\n\r\n    value(key: string): V {\r\n        if (!this.map.hasOwnProperty(key)) {\r\n            this.map[key] = new CacheEntry<V>(this.helper.create(key));\r\n        }\r\n        const en = this.map[key];\r\n\r\n        en.touched = true;\r\n        return en.value;\r\n    }\r\n\r\n    clear() {\r\n        for (const k in this.map) {\r\n            if (this.map.hasOwnProperty(k)) {\r\n                this.helper.dispose(this.map[k].value, k);\r\n            }\r\n        }\r\n        this.map = {};\r\n    }\r\n\r\n    remove(key: string) {\r\n        if (this.map.hasOwnProperty(key)) {\r\n            this.helper.dispose(this.map[key].value, key);\r\n            delete this.map[key];\r\n        }\r\n    }\r\n\r\n    removeAll(keys: string[]) {\r\n        for (let i = 0; i < keys.length; i++) {\r\n            this.remove(keys[i]);\r\n        }\r\n    }\r\n\r\n    retain(key: string) {\r\n        const newMap: { [k: string]: CacheEntry<V>; } = {};\r\n        if (this.map.hasOwnProperty(key)) {\r\n            newMap[key] = this.map[key];\r\n            delete this.map[key];\r\n        }\r\n        for (const k in this.map) {\r\n            if (this.map.hasOwnProperty(k)) {\r\n                this.helper.dispose(this.map[k].value, k);\r\n            }\r\n        }\r\n        this.map = newMap;\r\n    }\r\n\r\n    retainAll(keys: string[]) {\r\n        const newMap: { [key: string]: CacheEntry<V>; } = {};\r\n        for (let i = 0; i < keys.length; i++) {\r\n            const k = keys[i];\r\n            if (this.map.hasOwnProperty(k)) {\r\n                newMap[k] = this.map[k];\r\n                delete this.map[k];\r\n            }\r\n        }\r\n        for (const k2 in this.map) {\r\n            if (this.map.hasOwnProperty(k2)) {\r\n                this.helper.dispose(this.map[k2].value, k2);\r\n            }\r\n        }\r\n        this.map = newMap;\r\n    }\r\n\r\n    resetTouches() {\r\n        for (const k in this.map) {\r\n            if (this.map.hasOwnProperty(k)) {\r\n                this.map[k].touched = false;\r\n            }\r\n        }\r\n    }\r\n\r\n    retainTouched() {\r\n        const newMap: { [k: string]: CacheEntry<V>; } = {};\r\n        for (const k in this.map) {\r\n            if (this.map.hasOwnProperty(k)) {\r\n                const en = this.map[k];\r\n                if (en.touched) {\r\n                    newMap[k] = this.map[k];\r\n                }\r\n                else {\r\n                    this.helper.dispose(en.value, k);\r\n                }\r\n            }\r\n        }\r\n        this.map = newMap;\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n\r\nexport interface MultiKeyCacheHelper<V> {\r\n    create(keyParts: string[]): V;\r\n    dispose(value: V, keyParts: string[]): void;\r\n}\r\n\r\n\r\nclass MultiKeyCacheEntry<V> {\r\n    keyParts: string[];\r\n    value: V;\r\n    touched = false;\r\n\r\n    constructor(keyParts: string[], value: V) {\r\n        this.keyParts = keyParts;\r\n        this.value = value;\r\n    }\r\n}\r\n\r\n\r\nexport class MultiKeyCache<V> {\r\n    private helper: MultiKeyCacheHelper<V>;\r\n    private map: { [key: string]: MultiKeyCacheEntry<V>; };\r\n\r\n    constructor(helper: MultiKeyCacheHelper<V>) {\r\n        this.helper = helper;\r\n        this.map = {};\r\n    }\r\n\r\n    private combineKeyParts(keyParts: string[]): string {\r\n        const esc = '\\\\';\r\n        const sep = ';';\r\n        const escapedEsc = esc + esc;\r\n        const escapedSep = esc + sep;\r\n\r\n        const escapedParts = <string[]>[];\r\n        for (let n = 0; n < keyParts.length; n++) {\r\n            escapedParts[n] = keyParts[n].replace(esc, escapedEsc).replace(sep, escapedSep);\r\n        }\r\n        return escapedParts.join(sep);\r\n    }\r\n\r\n    value(...keyParts: string[]): V {\r\n        const key = this.combineKeyParts(keyParts);\r\n        if (!this.map.hasOwnProperty(key)) {\r\n            this.map[key] = new MultiKeyCacheEntry<V>(keyParts, this.helper.create(keyParts));\r\n        }\r\n        const en = this.map[key];\r\n\r\n        en.touched = true;\r\n        return en.value;\r\n    }\r\n\r\n    remove(...keyParts: string[]) {\r\n        const key = this.combineKeyParts(keyParts);\r\n        if (this.map.hasOwnProperty(key)) {\r\n            const en = this.map[key];\r\n            this.helper.dispose(en.value, en.keyParts);\r\n            delete this.map[key];\r\n        }\r\n    }\r\n\r\n    retain(...keyParts: string[]) {\r\n        const newMap: { [k: string]: MultiKeyCacheEntry<V>; } = {};\r\n        const retainKey = this.combineKeyParts(keyParts);\r\n        if (this.map.hasOwnProperty(retainKey)) {\r\n            newMap[retainKey] = this.map[retainKey];\r\n            delete this.map[retainKey];\r\n        }\r\n        for (const key in this.map) {\r\n            if (this.map.hasOwnProperty(key)) {\r\n                const en = this.map[key];\r\n                this.helper.dispose(en.value, en.keyParts);\r\n            }\r\n        }\r\n        this.map = newMap;\r\n    }\r\n\r\n    resetTouches() {\r\n        for (const key in this.map) {\r\n            if (this.map.hasOwnProperty(key)) {\r\n                this.map[key].touched = false;\r\n            }\r\n        }\r\n    }\r\n\r\n    retainTouched() {\r\n        const newMap: { [key: string]: MultiKeyCacheEntry<V>; } = {};\r\n        for (const key in this.map) {\r\n            if (this.map.hasOwnProperty(key)) {\r\n                const en = this.map[key];\r\n                if (en.touched) {\r\n                    newMap[key] = this.map[key];\r\n                }\r\n                else {\r\n                    this.helper.dispose(en.value, en.keyParts);\r\n                }\r\n            }\r\n        }\r\n        this.map = newMap;\r\n    }\r\n\r\n    clear() {\r\n        for (const key in this.map) {\r\n            if (this.map.hasOwnProperty(key)) {\r\n                const en = this.map[key];\r\n                this.helper.dispose(en.value, en.keyParts);\r\n            }\r\n        }\r\n        this.map = {};\r\n    }\r\n}\r\n\r\n\r\nexport interface TwoKeyCacheHelper<V> {\r\n    create(keyPart1: string, keyPart2: string): V;\r\n    dispose(value: V, keyPart1: string, keyPart2: string): void;\r\n}\r\n\r\n\r\nexport class TwoKeyCache<V> {\r\n    private cache: MultiKeyCache<V>;\r\n\r\n    constructor(helper: TwoKeyCacheHelper<V>) {\r\n        this.cache = new MultiKeyCache<V>({\r\n            create: function (keyParts: string[]): V {\r\n                return helper.create(keyParts[0], keyParts[1]);\r\n            },\r\n            dispose: function (value: V, keyParts: string[]) {\r\n                helper.dispose(value, keyParts[0], keyParts[1]);\r\n            }\r\n        });\r\n    }\r\n\r\n    value(keyPart1: string, keyPart2: string): V { return this.cache.value(keyPart1, keyPart2); }\r\n    remove(keyPart1: string, keyPart2: string) { this.cache.remove(keyPart1, keyPart2); }\r\n    retain(keyPart1: string, keyPart2: string) { this.cache.retain(keyPart1, keyPart2); }\r\n    resetTouches() { this.cache.resetTouches(); }\r\n    retainTouched() { this.cache.retainTouched(); }\r\n    clear() { this.cache.clear(); }\r\n}\r\n\r\n\r\nexport interface ThreeKeyCacheHelper<V> {\r\n    create(keyPart1: string, keyPart2: string, keyPart3: string): V;\r\n    dispose(value: V, keyPart1: string, keyPart2: string, keyPart3: string): void;\r\n}\r\n\r\n\r\nexport class ThreeKeyCache<V> {\r\n    private cache: MultiKeyCache<V>;\r\n\r\n    constructor(helper: ThreeKeyCacheHelper<V>) {\r\n        this.cache = new MultiKeyCache<V>({\r\n            create: function (keyParts: string[]): V {\r\n                return helper.create(keyParts[0], keyParts[1], keyParts[2]);\r\n            },\r\n            dispose: function (value: V, keyParts: string[]) {\r\n                helper.dispose(value, keyParts[0], keyParts[1], keyParts[2]);\r\n            }\r\n        });\r\n    }\r\n\r\n    value(keyPart1: string, keyPart2: string, keyPart3: string): V { return this.cache.value(keyPart1, keyPart2, keyPart3); }\r\n    remove(keyPart1: string, keyPart2: string, keyPart3: string) { this.cache.remove(keyPart1, keyPart2, keyPart3); }\r\n    retain(keyPart1: string, keyPart2: string, keyPart3: string) { this.cache.retain(keyPart1, keyPart2, keyPart3); }\r\n    resetTouches() { this.cache.resetTouches(); }\r\n    retainTouched() { this.cache.retainTouched(); }\r\n    clear() { this.cache.clear(); }\r\n}\r\n\r\nexport interface SixKeyCacheHelper<V> {\r\n    create(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): V;\r\n    dispose(value: V, keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): void;\r\n}\r\nexport class SixKeyCache<V> {\r\n    private cache: MultiKeyCache<V>;\r\n\r\n    constructor(helper: SixKeyCacheHelper<V>) {\r\n        this.cache = new MultiKeyCache<V>({\r\n            create: function (keyParts: string[]): V {\r\n                return helper.create(keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]);\r\n            },\r\n            dispose: function (value: V, keyParts: string[]) {\r\n                helper.dispose(value, keyParts[0], keyParts[1], keyParts[2], keyParts[3], keyParts[4], keyParts[5]);\r\n            }\r\n        });\r\n    }\r\n\r\n    value(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string): V { return this.cache.value(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); }\r\n    remove(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string) { this.cache.remove(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); }\r\n    retain(keyPart1: string, keyPart2: string, keyPart3: string, keyPart4: string, keyPart5: string, keyPart6: string) { this.cache.retain(keyPart1, keyPart2, keyPart3, keyPart4, keyPart5, keyPart6); }\r\n    resetTouches() { this.cache.resetTouches(); }\r\n    retainTouched() { this.cache.retainTouched(); }\r\n    clear() { this.cache.clear(); }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { xFrac, yFrac } from './core';\r\nimport { clamp } from './util/util';\r\n\r\nexport class BoundsUnmodifiable {\r\n    private bounds: Bounds;\r\n\r\n    constructor(bounds: Bounds) { this.bounds = bounds; }\r\n\r\n    get iStart(): number { return this.bounds.iStart; }\r\n    get jStart(): number { return this.bounds.jStart; }\r\n    get iEnd(): number { return this.bounds.iEnd; }\r\n    get jEnd(): number { return this.bounds.jEnd; }\r\n\r\n    get i(): number { return this.bounds.i; }\r\n    get j(): number { return this.bounds.j; }\r\n    get w(): number { return this.bounds.w; }\r\n    get h(): number { return this.bounds.h; }\r\n\r\n    xFrac(i: number): number { return this.bounds.xFrac(i); }\r\n    yFrac(j: number): number { return this.bounds.yFrac(j); }\r\n    contains(i: number, j: number): boolean { return this.bounds.contains(i, j); }\r\n}\r\n\r\n\r\nexport class Bounds {\r\n    private _iStart: number;\r\n    private _jStart: number;\r\n    private _iEnd: number;\r\n    private _jEnd: number;\r\n    private _unmod: BoundsUnmodifiable;\r\n\r\n    constructor() {\r\n        this._iStart = 0;\r\n        this._jStart = 0;\r\n        this._iEnd = 0;\r\n        this._jEnd = 0;\r\n        this._unmod = new BoundsUnmodifiable(this);\r\n    }\r\n\r\n    get iStart(): number { return this._iStart; }\r\n    get jStart(): number { return this._jStart; }\r\n    get iEnd(): number { return this._iEnd; }\r\n    get jEnd(): number { return this._jEnd; }\r\n\r\n    get i(): number { return this._iStart; }\r\n    get j(): number { return this._jStart; }\r\n    get w(): number { return this._iEnd - this._iStart; }\r\n    get h(): number { return this._jEnd - this._jStart; }\r\n\r\n    get unmod(): BoundsUnmodifiable { return this._unmod; }\r\n\r\n    xFrac(i: number): number {\r\n        return (i - this._iStart) / (this._iEnd - this._iStart);\r\n    }\r\n\r\n    yFrac(j: number): number {\r\n        return (j - this._jStart) / (this._jEnd - this._jStart);\r\n    }\r\n\r\n    contains(i: number, j: number): boolean {\r\n        return (this._iStart <= i && i < this._iEnd && this._jStart <= j && j < this._jEnd);\r\n    }\r\n\r\n    setEdges(iStart: number, iEnd: number, jStart: number, jEnd: number) {\r\n        this._iStart = iStart;\r\n        this._jStart = jStart;\r\n        this._iEnd = iEnd;\r\n        this._jEnd = jEnd;\r\n    }\r\n\r\n    setRect(i: number, j: number, w: number, h: number) {\r\n        this.setEdges(i, i + w, j, j + h);\r\n    }\r\n\r\n    setBounds(bounds: BoundsUnmodifiable) {\r\n        this.setEdges(bounds.iStart, bounds.iEnd, bounds.jStart, bounds.jEnd);\r\n    }\r\n\r\n    cropToEdges(iCropStart: number, iCropEnd: number, jCropStart: number, jCropEnd: number) {\r\n        this._iStart = clamp(iCropStart, iCropEnd, this._iStart);\r\n        this._jStart = clamp(jCropStart, jCropEnd, this._jStart);\r\n        this._iEnd = clamp(iCropStart, iCropEnd, this._iEnd);\r\n        this._jEnd = clamp(jCropStart, jCropEnd, this._jEnd);\r\n    }\r\n\r\n    cropToRect(iCrop: number, jCrop: number, wCrop: number, hCrop: number) {\r\n        this.cropToEdges(iCrop, iCrop + wCrop, jCrop, jCrop + hCrop);\r\n    }\r\n\r\n    cropToBounds(cropBounds: BoundsUnmodifiable) {\r\n        this.cropToEdges(cropBounds.iStart, cropBounds.iEnd, cropBounds.jStart, cropBounds.jEnd);\r\n    }\r\n}\r\n\r\n\r\nexport function newBoundsFromRect(i: number, j: number, w: number, h: number): Bounds {\r\n    const b = new Bounds();\r\n    b.setRect(i, j, w, h);\r\n    return b;\r\n}\r\n\r\n\r\nexport function newBoundsFromEdges(iStart: number, iEnd: number, jStart: number, jEnd: number): Bounds {\r\n    const b = new Bounds();\r\n    b.setEdges(iStart, iEnd, jStart, jEnd);\r\n    return b;\r\n}\r\n\r\n\r\nexport interface Size {\r\n    w: number;\r\n    h: number;\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { hasval } from './util/util';\r\n\r\nexport class Color {\r\n    private _r: number;\r\n    private _g: number;\r\n    private _b: number;\r\n    private _a: number;\r\n\r\n    get r(): number { return this._r; }\r\n    get g(): number { return this._g; }\r\n    get b(): number { return this._b; }\r\n    get a(): number { return this._a; }\r\n\r\n    get cssString(): string {\r\n        return 'rgba(' + Math.round(255 * this._r) + ',' + Math.round(255 * this._g) + ',' + Math.round(255 * this._b) + ',' + this._a + ')';\r\n    }\r\n\r\n    get rgbaString(): string {\r\n        return '' + Math.round(255 * this._r) + ',' + Math.round(255 * this._g) + ',' + Math.round(255 * this._b) + ',' + Math.round(255 * this._a);\r\n    }\r\n\r\n    constructor(r: number, g: number, b: number, a: number = 1) {\r\n        this._r = r;\r\n        this._g = g;\r\n        this._b = b;\r\n        this._a = a;\r\n    }\r\n\r\n    withAlphaTimes(aFactor: number): Color {\r\n        return new Color(this._r, this._g, this._b, aFactor * this._a);\r\n    }\r\n}\r\n\r\n\r\nexport function darker(color: Color, factor: number): Color {\r\n    return new Color(color.r * factor, color.g * factor, color.b * factor, color.a);\r\n}\r\n\r\n\r\nexport function rgba(r: number, g: number, b: number, a: number): Color {\r\n    return new Color(r, g, b, a);\r\n}\r\n\r\n\r\nexport function rgb(r: number, g: number, b: number): Color {\r\n    return new Color(r, g, b, 1);\r\n}\r\n\r\n\r\nexport function sameColor(c1: Color, c2: Color): boolean {\r\n    if (c1 === c2) {\r\n        return true;\r\n    }\r\n    if (!hasval(c1) || !hasval(c2)) {\r\n        return false;\r\n    }\r\n    return (c1.r === c2.r && c1.g === c2.g && c1.b === c2.b && c1.a === c2.a);\r\n}\r\n\r\n\r\nexport function parseRgba(rgbaString: string): Color {\r\n    const tokens = rgbaString.split(',', 4);\r\n    return new Color(parseInt(tokens[0], 10) / 255, parseInt(tokens[1], 10) / 255, parseInt(tokens[2], 10) / 255, parseInt(tokens[3], 10) / 255);\r\n}\r\n\r\n\r\n/**\r\n * Creates a Color object based on a CSS color string. Supports the following notations:\r\n *  - hex\r\n *  - rgb/rgba\r\n *  - hsl/hsla\r\n *  - named colors\r\n * Behavior is undefined for strings that are not in one of the listed notations.\r\n *\r\n * Optional alphaOverride provided for forcing value of rbga alpha.\r\n *\r\n * Note that different browsers may use different color values for the named colors.\r\n *\r\n */\r\nexport let parseCssColor = (function () {\r\n    const canvas = document.createElement('canvas');\r\n    canvas.width = 1;\r\n    canvas.height = 1;\r\n    const g = canvas.getContext('2d', { willReadFrequently: true});\r\n    return function (cssColorString: string, alphaOverride?: number): Color {\r\n        g.clearRect(0, 0, 1, 1);\r\n        g.fillStyle = cssColorString;\r\n        g.fillRect(0, 0, 1, 1);\r\n\r\n        const rgbaData = g.getImageData(0, 0, 1, 1).data;\r\n        const R = rgbaData[0] / 255;\r\n        const G = rgbaData[1] / 255;\r\n        const B = rgbaData[2] / 255;\r\n        const A = hasval(alphaOverride) ? alphaOverride : rgbaData[3] / 255;\r\n        return rgba(R, G, B, A);\r\n    };\r\n})();\r\n\r\n\r\nexport function gray(brightness: number): Color {\r\n    return new Color(brightness, brightness, brightness, 1);\r\n}\r\n\r\n\r\n// XXX: Make final\r\n\r\nexport let black = rgb(0, 0, 0);\r\nexport let white = rgb(1, 1, 1);\r\n\r\nexport let red = rgb(1, 0, 0);\r\nexport let green = rgb(0, 1, 0);\r\nexport let blue = rgb(0, 0, 1);\r\n\r\nexport let cyan = rgb(0, 1, 1);\r\nexport let magenta = rgb(1, 0, 1);\r\nexport let yellow = rgb(1, 1, 0);\r\n\r\nexport let periwinkle = rgb(0.561, 0.561, 0.961);\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { BoundsUnmodifiable } from './bounds';\r\nimport { Axis2D } from './plot/axis';\r\n\r\n// see: http://www.cs.rit.edu/usr/local/pub/wrc/graphics/doc/opengl/books/blue/glOrtho.html\r\n// see: http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho\r\nexport function glOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number): Float32Array {\r\n\r\n    const tx = (right + left) / (right - left);\r\n    const ty = (top + bottom) / (top - bottom);\r\n    const tz = (far + near) / (far - near);\r\n\r\n    // GL ES (and therefore WebGL) requires matrices to be column-major\r\n    return new Float32Array([\r\n        2 / (right - left), 0, 0, 0,\r\n        0, 2 / (top - bottom), 0, 0,\r\n        0, 0, -2 / (far - near), 0,\r\n        -tx, -ty, -tz, 1\r\n    ]);\r\n}\r\n\r\nexport function glOrthoViewport(viewport: BoundsUnmodifiable): Float32Array {\r\n    return glOrtho(-0.5, viewport.w - 0.5, -0.5, viewport.h - 0.5, -1, 1);\r\n}\r\n\r\nexport function glOrthoAxis(axis: Axis2D): Float32Array {\r\n    return glOrtho(axis.xAxis.vMin, axis.xAxis.vMax, axis.yAxis.vMin, axis.yAxis.vMax, -1, 1);\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { OrderedSet } from './ordered_set';\r\nimport { getObjectId } from './util';\r\n\r\nexport type Listener = () => any;\r\n\r\n\r\nexport type Listener1<A> = (a: A) => any;\r\n\r\n\r\nexport type Listener2<A, B> = (a: A, b: B) => any;\r\n\r\n\r\nexport type Listener3<A, B, C> = (a: A, b: B, c: C) => any;\r\n\r\n\r\ntype Action = () => void;\r\n\r\n\r\nexport class Notification {\r\n    private _listeners: OrderedSet<Listener> = new OrderedSet<Listener>([], getObjectId, false);\r\n    private _deferring = false;\r\n    private _deferred: Action[] = [];\r\n\r\n    on(listener: Listener) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.add(listener); });\r\n        }\r\n        else {\r\n            this._listeners.add(listener);\r\n        }\r\n    }\r\n\r\n    off(listener: Listener) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.removeValue(listener); });\r\n        }\r\n        else {\r\n            this._listeners.removeValue(listener);\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        this._listeners.removeAll();\r\n    }\r\n\r\n    fire(): any {\r\n        this._deferring = true;\r\n        try {\r\n            for (let n = 0; n < this._listeners.length; n++) {\r\n                const consumed = this._listeners.valueAt(n)();\r\n                if (consumed) {\r\n                    return consumed;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n        finally {\r\n            if (this._deferred.length > 0) {\r\n                for (let n = 0; n < this._deferred.length; n++) {\r\n                    this._deferred[n]();\r\n                }\r\n                this._deferred = [];\r\n            }\r\n            this._deferring = false;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class Notification1<A> {\r\n    private _listeners: OrderedSet<Listener1<A>> = new OrderedSet<Listener1<A>>([], getObjectId, false);\r\n    private _deferring = false;\r\n    private _deferred: Action[] = [];\r\n\r\n    on(listener: Listener1<A>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.add(listener); });\r\n        }\r\n        else {\r\n            this._listeners.add(listener);\r\n        }\r\n    }\r\n\r\n    off(listener: Listener1<A>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.removeValue(listener); });\r\n        }\r\n        else {\r\n            this._listeners.removeValue(listener);\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        this._listeners.removeAll();\r\n    }\r\n\r\n    fire(a: A): any {\r\n        this._deferring = true;\r\n        try {\r\n            for (let n = 0; n < this._listeners.length; n++) {\r\n                const consumed = this._listeners.valueAt(n)(a);\r\n                if (consumed) {\r\n                    return consumed;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n        finally {\r\n            if (this._deferred.length > 0) {\r\n                for (let n = 0; n < this._deferred.length; n++) {\r\n                    this._deferred[n]();\r\n                }\r\n                this._deferred = [];\r\n            }\r\n            this._deferring = false;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class Notification2<A, B> {\r\n    private _listeners: OrderedSet<Listener2<A, B>> = new OrderedSet<Listener2<A, B>>([], getObjectId, false);\r\n    private _deferring = false;\r\n    private _deferred: Action[] = [];\r\n\r\n    on(listener: Listener2<A, B>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.add(listener); });\r\n        }\r\n        else {\r\n            this._listeners.add(listener);\r\n        }\r\n    }\r\n\r\n    off(listener: Listener2<A, B>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.removeValue(listener); });\r\n        }\r\n        else {\r\n            this._listeners.removeValue(listener);\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        this._listeners.removeAll();\r\n    }\r\n\r\n    fire(a: A, b: B): any {\r\n        this._deferring = true;\r\n        try {\r\n            for (let n = 0; n < this._listeners.length; n++) {\r\n                const consumed = this._listeners.valueAt(n)(a, b);\r\n                if (consumed) {\r\n                    return consumed;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n        finally {\r\n            if (this._deferred.length > 0) {\r\n                for (let n = 0; n < this._deferred.length; n++) {\r\n                    this._deferred[n]();\r\n                }\r\n                this._deferred = [];\r\n            }\r\n            this._deferring = false;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class Notification3<A, B, C> {\r\n    private _listeners: OrderedSet<Listener3<A, B, C>> = new OrderedSet<Listener3<A, B, C>>([], getObjectId, false);\r\n    private _deferring = false;\r\n    private _deferred: Action[] = [];\r\n\r\n    on(listener: Listener3<A, B, C>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.add(listener); });\r\n        }\r\n        else {\r\n            this._listeners.add(listener);\r\n        }\r\n    }\r\n\r\n    off(listener: Listener3<A, B, C>) {\r\n        if (this._deferring) {\r\n            const self = this;\r\n            this._deferred.push(function () { self._listeners.removeValue(listener); });\r\n        }\r\n        else {\r\n            this._listeners.removeValue(listener);\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        this._listeners.removeAll();\r\n    }\r\n\r\n    fire(a: A, b: B, c: C): any {\r\n        this._deferring = true;\r\n        try {\r\n            for (let n = 0; n < this._listeners.length; n++) {\r\n                const consumed = this._listeners.valueAt(n)(a, b, c);\r\n                if (consumed) {\r\n                    return consumed;\r\n                }\r\n            }\r\n            return false;\r\n        }\r\n        finally {\r\n            if (this._deferred.length > 0) {\r\n                for (let n = 0; n < this._deferred.length; n++) {\r\n                    this._deferred[n]();\r\n                }\r\n                this._deferred = [];\r\n            }\r\n            this._deferring = false;\r\n        }\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { IdFunction, StringMap, isString, getObjectId, copyArray, hasval } from './util';\r\nimport { Notification2, Notification3 } from './notification';\r\nimport { indexOf } from './sorted_arrays';\r\n\r\nfunction requireString(s: string): string {\r\n    if (isString(s)) {\r\n        return s;\r\n    }\r\n    else {\r\n        throw new Error('Expected a string, but value is ' + s);\r\n    }\r\n}\r\n\r\n\r\nexport class OrderedSet<V> {\r\n    private _idOf: IdFunction<V>;\r\n    private _ids: string[];\r\n    private _indexes: StringMap<number>;\r\n    private _valuesArray: V[];\r\n    private _valuesMap: StringMap<V>;\r\n    private _valueAdded: Notification2<V, number>;\r\n    private _valueMoved: Notification3<V, number, number>;\r\n    private _valueRemoved: Notification2<V, number>;\r\n\r\n    constructor(values: V[] = [], idFn: IdFunction<V> = getObjectId, useNotifications: boolean = true) {\r\n        this._idOf = idFn;\r\n        this._valuesArray = copyArray(values);\r\n        this._ids = [];\r\n        this._indexes = {};\r\n        this._valuesMap = {};\r\n        for (let n = 0; n < this._valuesArray.length; n++) {\r\n            const value = this._valuesArray[n];\r\n            const id = requireString(this._idOf(value));\r\n            this._ids[n] = id;\r\n            this._indexes[id] = n;\r\n            this._valuesMap[id] = value;\r\n        }\r\n        if (useNotifications) {\r\n            this._valueAdded = new Notification2<V, number>();\r\n            this._valueMoved = new Notification3<V, number, number>();\r\n            this._valueRemoved = new Notification2<V, number>();\r\n        }\r\n    }\r\n\r\n    get valueAdded(): Notification2<V, number> {\r\n        return this._valueAdded;\r\n    }\r\n\r\n    get valueMoved(): Notification3<V, number, number> {\r\n        return this._valueMoved;\r\n    }\r\n\r\n    get valueRemoved(): Notification2<V, number> {\r\n        return this._valueRemoved;\r\n    }\r\n\r\n    get length(): number {\r\n        return this._valuesArray.length;\r\n    }\r\n\r\n    get isEmpty(): boolean {\r\n        return (this._valuesArray.length === 0);\r\n    }\r\n\r\n    toArray(): V[] {\r\n        return copyArray(this._valuesArray);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    every(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): boolean {\r\n        return this._valuesArray.every(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    some(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): boolean {\r\n        return this._valuesArray.some(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    forEach(callbackFn: (value: V, index: number, array: V[]) => void, thisArg?: any): void {\r\n        this._valuesArray.forEach(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    map<U>(callbackFn: (value: V, index: number, array: V[]) => U, thisArg?: any): U[] {\r\n        return this._valuesArray.map(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    filter(callbackFn: (value: V, index: number, array: V[]) => boolean, thisArg?: any): V[] {\r\n        return this._valuesArray.filter(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    reduce<U>(callbackFn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue: U): U {\r\n        return this._valuesArray.reduce(callbackFn, initialValue);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedSet is undefined.\r\n     */\r\n    reduceRight<U>(callbackFn: (previousValue: U, currentValue: V, currentIndex: number, array: V[]) => U, initialValue: U): U {\r\n        return this._valuesArray.reduceRight(callbackFn, initialValue);\r\n    }\r\n\r\n    idAt(index: number): string {\r\n        return this._ids[index];\r\n    }\r\n\r\n    valueAt(index: number): V {\r\n        return this._valuesArray[index];\r\n    }\r\n\r\n    indexFor(id: string): number {\r\n        return (isString(id) ? this._indexes[id] : undefined);\r\n    }\r\n\r\n    valueFor(id: string): V {\r\n        return (isString(id) ? this._valuesMap[id] : undefined);\r\n    }\r\n\r\n    idOf(value: V): string {\r\n        return requireString(this._idOf(value));\r\n    }\r\n\r\n    indexOf(value: V): number {\r\n        return this._indexes[requireString(this._idOf(value))];\r\n    }\r\n\r\n    hasValue(value: V): boolean {\r\n        return this.hasId(requireString(this._idOf(value)));\r\n    }\r\n\r\n    hasValues(values: V[]): boolean {\r\n        for (let n = 0; n < values.length; n++) {\r\n            if (!this.hasValue(values[n])) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    hasId(id: string): boolean {\r\n        return (isString(id) && hasval(this._valuesMap[id]));\r\n    }\r\n\r\n    hasIds(ids: string[]): boolean {\r\n        for (let n = 0; n < ids.length; n++) {\r\n            if (!this.hasId(ids[n])) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    add(value: V, index?: number, moveIfExists?: boolean) {\r\n        index = (hasval(index) ? index : this._valuesArray.length);\r\n        if (!hasval(moveIfExists)) {\r\n            moveIfExists = false;\r\n        }\r\n        this._add(value, index, moveIfExists);\r\n    }\r\n\r\n    addAll(values: V[], index?: number, moveIfExists?: boolean) {\r\n        index = (hasval(index) ? index : this._valuesArray.length);\r\n        if (!hasval(moveIfExists)) {\r\n            moveIfExists = false;\r\n        }\r\n        for (let n = 0; n < values.length; n++) {\r\n            const actualIndex = this._add(values[n], index, moveIfExists);\r\n            index = actualIndex + 1;\r\n        }\r\n    }\r\n\r\n    private _add(value: V, newIndex: number, moveIfExists: boolean): number {\r\n        const id = requireString(this._idOf(value));\r\n\r\n        const oldIndex = this._indexes[id];\r\n        if (!hasval(oldIndex)) {\r\n            this._ids.splice(newIndex, 0, id);\r\n            this._valuesArray.splice(newIndex, 0, value);\r\n            this._valuesMap[id] = value;\r\n            for (let n = newIndex; n < this._ids.length; n++) {\r\n                this._indexes[this._ids[n]] = n;\r\n            }\r\n            if (this._valueAdded) {\r\n                this._valueAdded.fire(value, newIndex);\r\n            }\r\n        }\r\n        else if (newIndex !== oldIndex && moveIfExists) {\r\n            this._ids.splice(oldIndex, 1);\r\n            this._valuesArray.splice(oldIndex, 1);\r\n            if (newIndex > oldIndex) {\r\n                this._ids.splice(newIndex, 0, id);\r\n                this._valuesArray.splice(newIndex, 0, value);\r\n                for (let n = oldIndex; n <= newIndex; n++) {\r\n                    this._indexes[this._ids[n]] = n;\r\n                }\r\n            }\r\n            else {\r\n                this._ids.splice(newIndex, 0, id);\r\n                this._valuesArray.splice(newIndex, 0, value);\r\n                for (let n = newIndex; n <= oldIndex; n++) {\r\n                    this._indexes[this._ids[n]] = n;\r\n                }\r\n            }\r\n            if (this._valueMoved) {\r\n                this._valueMoved.fire(value, oldIndex, newIndex);\r\n            }\r\n        }\r\n        else {\r\n            newIndex = oldIndex;\r\n        }\r\n\r\n        // Return the actual insertion index -- may differ from the originally\r\n        // requested index if an existing value had to be moved\r\n        return newIndex;\r\n    }\r\n\r\n    removeValue(value: V) {\r\n        this.removeId(requireString(this._idOf(value)));\r\n    }\r\n\r\n    removeId(id: string) {\r\n        if (isString(id)) {\r\n            const index = this._indexes[id];\r\n            if (hasval(index)) {\r\n                this._remove(id, index);\r\n            }\r\n        }\r\n    }\r\n\r\n    removeIndex(index: number) {\r\n        const id = this._ids[index];\r\n        if (isString(id)) {\r\n            this._remove(id, index);\r\n        }\r\n    }\r\n\r\n    removeAll() {\r\n        // Remove from last to first, to minimize index shifting\r\n        for (let n = this._valuesArray.length - 1; n >= 0; n--) {\r\n            const id = this._ids[n];\r\n            this._remove(id, n);\r\n        }\r\n    }\r\n\r\n    retainValues(values: V[]) {\r\n        const idsToRetain: StringMap<any> = {};\r\n        for (let n = 0; n < values.length; n++) {\r\n            const id = this._idOf(values[n]);\r\n            if (isString(id)) {\r\n                idsToRetain[id] = true;\r\n            }\r\n        }\r\n        this._retain(idsToRetain);\r\n    }\r\n\r\n    retainIds(ids: string[]) {\r\n        const idsToRetain: StringMap<any> = {};\r\n        for (let n = 0; n < ids.length; n++) {\r\n            const id = ids[n];\r\n            if (isString(id)) {\r\n                idsToRetain[id] = true;\r\n            }\r\n        }\r\n        this._retain(idsToRetain);\r\n    }\r\n\r\n    retainIndices(indices: number[]) {\r\n        const idsToRetain: StringMap<any> = {};\r\n        for (let n = 0; n < indices.length; n++) {\r\n            const id = this._ids[indices[n]];\r\n            idsToRetain[id] = true;\r\n        }\r\n        this._retain(idsToRetain);\r\n    }\r\n\r\n    private _retain(ids: StringMap<any>) {\r\n        // Remove from last to first, to minimize index shifting\r\n        for (let n = this._valuesArray.length - 1; n >= 0; n--) {\r\n            const id = this._ids[n];\r\n            if (!ids.hasOwnProperty(id)) {\r\n                this._remove(id, n);\r\n            }\r\n        }\r\n    }\r\n\r\n    private _remove(id: string, index: number) {\r\n        const value = this._valuesArray[index];\r\n        this._ids.splice(index, 1);\r\n        this._valuesArray.splice(index, 1);\r\n        delete this._indexes[id];\r\n        delete this._valuesMap[id];\r\n        for (let n = index; n < this._ids.length; n++) {\r\n            this._indexes[this._ids[n]] = n;\r\n        }\r\n        if (this._valueRemoved) {\r\n            this._valueRemoved.fire(value, index);\r\n        }\r\n    }\r\n}\r\n\r\n\r\n\r\nexport class OrderedStringSet {\r\n    private _indexes: StringMap<number>;\r\n    private _valuesArray: string[];\r\n    private _valueAdded: Notification2<string, number>;\r\n    private _valueMoved: Notification3<string, number, number>;\r\n    private _valueRemoved: Notification2<string, number>;\r\n\r\n    constructor(values: string[] = [], useNotifications: boolean = true) {\r\n        this._valuesArray = [];\r\n        this._indexes = {};\r\n        for (let n = 0; n < values.length; n++) {\r\n            const value = requireString(values[n]);\r\n            this._valuesArray[n] = value;\r\n            this._indexes[value] = n;\r\n        }\r\n        if (useNotifications) {\r\n            this._valueAdded = new Notification2<string, number>();\r\n            this._valueMoved = new Notification3<string, number, number>();\r\n            this._valueRemoved = new Notification2<string, number>();\r\n        }\r\n    }\r\n\r\n    get valueAdded(): Notification2<string, number> {\r\n        return this._valueAdded;\r\n    }\r\n\r\n    get valueMoved(): Notification3<string, number, number> {\r\n        return this._valueMoved;\r\n    }\r\n\r\n    get valueRemoved(): Notification2<string, number> {\r\n        return this._valueRemoved;\r\n    }\r\n\r\n    get length(): number {\r\n        return this._valuesArray.length;\r\n    }\r\n\r\n    get isEmpty(): boolean {\r\n        return (this._valuesArray.length === 0);\r\n    }\r\n\r\n    toArray(): string[] {\r\n        return copyArray(this._valuesArray);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    every(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean {\r\n        return this._valuesArray.every(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    some(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean {\r\n        return this._valuesArray.some(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    forEach(callbackFn: (value: string, index: number, array: string[]) => void, thisArg?: any): void {\r\n        this._valuesArray.forEach(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    map<U>(callbackFn: (value: string, index: number, array: string[]) => U, thisArg?: any): U[] {\r\n        return this._valuesArray.map(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    filter(callbackFn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): string[] {\r\n        return this._valuesArray.filter(callbackFn, thisArg);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    reduce<U>(callbackFn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U {\r\n        return this._valuesArray.reduce(callbackFn, initialValue);\r\n    }\r\n\r\n    /**\r\n     * The callback should not modify its array arg; if it does, the subsequent behavior\r\n     * of this OrderedStringSet is undefined.\r\n     */\r\n    reduceRight<U>(callbackFn: (previousValue: U, currentValue: string, currentIndex: number, array: string[]) => U, initialValue: U): U {\r\n        return this._valuesArray.reduceRight(callbackFn, initialValue);\r\n    }\r\n\r\n    valueAt(index: number): string {\r\n        return this._valuesArray[index];\r\n    }\r\n\r\n    indexOf(value: string): number {\r\n        return (isString(value) ? this._indexes[value] : undefined);\r\n    }\r\n\r\n    hasValue(value: string): boolean {\r\n        return (isString(value) && hasval(this._indexes[value]));\r\n    }\r\n\r\n    hasValues(values: string[]): boolean {\r\n        for (let n = 0; n < values.length; n++) {\r\n            if (!this.hasValue(values[n])) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    add(value: string, index?: number, moveIfExists?: boolean) {\r\n        index = (hasval(index) ? index : this._valuesArray.length);\r\n        if (!hasval(moveIfExists)) {\r\n            moveIfExists = false;\r\n        }\r\n        this._add(value, index, moveIfExists);\r\n    }\r\n\r\n    addAll(values: string[], index?: number, moveIfExists?: boolean) {\r\n        index = (hasval(index) ? index : this._valuesArray.length);\r\n        if (!hasval(moveIfExists)) {\r\n            moveIfExists = false;\r\n        }\r\n        for (let n = 0; n < values.length; n++) {\r\n            const actualIndex = this._add(values[n], index, moveIfExists);\r\n            index = actualIndex + 1;\r\n        }\r\n    }\r\n\r\n    private _add(value: string, newIndex: number, moveIfExists: boolean): number {\r\n        requireString(value);\r\n\r\n        const oldIndex = this._indexes[value];\r\n        if (!hasval(oldIndex)) {\r\n            this._valuesArray.splice(newIndex, 0, value);\r\n            for (let n = newIndex; n < this._valuesArray.length; n++) {\r\n                this._indexes[this._valuesArray[n]] = n;\r\n            }\r\n            if (this._valueAdded) {\r\n                this._valueAdded.fire(value, newIndex);\r\n            }\r\n        }\r\n        else if (newIndex !== oldIndex && moveIfExists) {\r\n            this._valuesArray.splice(oldIndex, 1);\r\n            if (newIndex > oldIndex) {\r\n                this._valuesArray.splice(newIndex, 0, value);\r\n                for (let n = oldIndex; n <= newIndex; n++) {\r\n                    this._indexes[this._valuesArray[n]] = n;\r\n                }\r\n            }\r\n            else {\r\n                this._valuesArray.splice(newIndex, 0, value);\r\n                for (let n = newIndex; n <= oldIndex; n++) {\r\n                    this._indexes[this._valuesArray[n]] = n;\r\n                }\r\n            }\r\n            if (this._valueMoved) {\r\n                this._valueMoved.fire(value, oldIndex, newIndex);\r\n            }\r\n        }\r\n        else {\r\n            newIndex = oldIndex;\r\n        }\r\n\r\n        // Return the actual insertion index -- may differ from the originally\r\n        // requested index if an existing value had to be moved\r\n        return newIndex;\r\n    }\r\n\r\n    removeValue(value: string) {\r\n        if (isString(value)) {\r\n            const index = this._indexes[value];\r\n            if (hasval(index)) {\r\n                this._remove(value, index);\r\n            }\r\n        }\r\n    }\r\n\r\n    removeIndex(index: number) {\r\n        const value = this._valuesArray[index];\r\n        if (isString(value)) {\r\n            this._remove(value, index);\r\n        }\r\n    }\r\n\r\n    removeAll() {\r\n        // Remove from last to first, to minimize index shifting\r\n        for (let n = this._valuesArray.length - 1; n >= 0; n--) {\r\n            const value = this._valuesArray[n];\r\n            this._remove(value, n);\r\n        }\r\n    }\r\n\r\n    retainValues(values: string[]) {\r\n        const valuesToRetain: StringMap<any> = {};\r\n        for (let n = 0; n < values.length; n++) {\r\n            const value = values[n];\r\n            if (isString(value)) {\r\n                valuesToRetain[value] = true;\r\n            }\r\n        }\r\n        this._retain(valuesToRetain);\r\n    }\r\n\r\n    retainIndices(indices: number[]) {\r\n        const valuesToRetain: StringMap<any> = {};\r\n        for (let n = 0; n < indices.length; n++) {\r\n            const value = this._valuesArray[indices[n]];\r\n            valuesToRetain[value] = true;\r\n        }\r\n        this._retain(valuesToRetain);\r\n    }\r\n\r\n    private _retain(values: StringMap<any>) {\r\n        // Remove from last to first, to minimize index shifting\r\n        for (let n = this._valuesArray.length - 1; n >= 0; n--) {\r\n            const value = this._valuesArray[n];\r\n            if (!values.hasOwnProperty(value)) {\r\n                this._remove(value, n);\r\n            }\r\n        }\r\n    }\r\n\r\n    private _remove(value: string, index: number) {\r\n        this._valuesArray.splice(index, 1);\r\n        delete this._indexes[value];\r\n        for (let n = index; n < this._valuesArray.length; n++) {\r\n            this._indexes[this._valuesArray[n]] = n;\r\n        }\r\n        if (this._valueRemoved) {\r\n            this._valueRemoved.fire(value, index);\r\n        }\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n// XXX: These probably belong in their own namespace\r\n\r\n\r\nexport function indexOf(vs: number[], x: number): number {\r\n    let a = 0;\r\n    let b = vs.length - 1;\r\n\r\n    while (a <= b) {\r\n        // Bitwise-or-zero truncates to integer\r\n        // tslint:disable-next-line:no-bitwise\r\n        const pivot = ((a + b) / 2) | 0;\r\n        const vPivot = vs[pivot];\r\n\r\n        if (vPivot < x) {\r\n            a = pivot + 1;\r\n        }\r\n        else if (vPivot > x) {\r\n            b = pivot - 1;\r\n        }\r\n        else {\r\n            // This is a little sloppy if either value is NaN, or if one is +0.0 and the other is -0.0\r\n            return pivot;\r\n        }\r\n    }\r\n\r\n    return -(a + 1);\r\n}\r\n\r\n\r\n\r\nexport function indexNearest(vs: number[], x: number): number {\r\n    const i = indexOf(vs, x);\r\n\r\n    // Exact value found\r\n    if (i >= 0) {\r\n        return i;\r\n    }\r\n\r\n    // Find the closer of the adjacent values\r\n    const iAfter = -i - 1;\r\n    const iBefore = iAfter - 1;\r\n\r\n    if (iAfter >= vs.length) {\r\n        return iBefore;\r\n    }\r\n    if (iBefore < 0) {\r\n        return iAfter;\r\n    }\r\n\r\n    const diffAfter = vs[iAfter] - x;\r\n    const diffBefore = x - vs[iBefore];\r\n\r\n    return (diffAfter <= diffBefore ? iAfter : iBefore);\r\n}\r\n\r\n\r\n\r\nexport function indexAfter(vs: number[], x: number): number {\r\n    const i = indexOf(vs, x);\r\n\r\n    // Exact value not found\r\n    if (i < 0) {\r\n        return (-i - 1);\r\n    }\r\n\r\n    // If the exact value was found, find the value's last occurrence\r\n    const n = vs.length;\r\n    for (let j = i + 1; j < n; j++) {\r\n        if (vs[j] > x) {\r\n            return j;\r\n        }\r\n    }\r\n    return n;\r\n}\r\n\r\n\r\n\r\nexport function indexAtOrAfter(vs: number[], x: number): number {\r\n    const i = indexOf(vs, x);\r\n\r\n    // Exact value not found\r\n    if (i < 0) {\r\n        return (-i - 1);\r\n    }\r\n\r\n    // If the exact value was found, find the value's first occurrence\r\n    const n = vs.length;\r\n    for (let j = i; j > 0; j--) {\r\n        if (vs[j - 1] < x) {\r\n            return j;\r\n        }\r\n    }\r\n    return 0;\r\n}\r\n\r\n\r\n\r\nexport function indexBefore(vs: number[], x: number): number {\r\n    return indexAtOrAfter(vs, x) - 1;\r\n}\r\n\r\n\r\n\r\nexport function indexAtOrBefore(vs: number[], x: number): number {\r\n    return indexAfter(vs, x) - 1;\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n// AA Binary Tree\r\n//\r\n// see: http://user.it.uu.se/~arnea/ps/simp.pdf\r\n//      http://en.wikipedia.org/wiki/AA_tree\r\n//\r\n// Tree is self-balancing. Nodes are assigned a level number to assist balancing.\r\n//\r\n// The following invariants hold for AA tree level numbers:\r\n// 1) Leaf node level is 1\r\n// 2) node.left.level = node.level - 1\r\n// 3) node.right.level = node.level or node.right.level = node.level - 1\r\n// 4) grandchild nodes have level less than their grandparents\r\n// 5) every node of level greater than 1 has two children\r\n//\r\n// Requirements 2 and 3 allow \"right horizontal links\" but not \"left horizontal links\".\r\n// The \"skew\" rotation operation turns a left horizontal link that may arise from insertion/deletion into a right horizontal link.\r\n// The\" skew\" operation might result in two subsequent horizontal links (which is not permitted by requirement 4. This\r\n// condition is fixed by the \"splay\" rotation operation.\r\n//\r\n// Duplicate values (as determined by the Comparator) are not permitted (insertion of a duplicate value will be ignored).\r\n// Supports O(log n) insertion and deletion and O(1) size retrieval.\r\n//\r\nexport class BinaryTree<V> {\r\n\r\n    private _root: TreeNode<V>;\r\n    private _comp: Comparator<V>;\r\n    private _size: number;\r\n\r\n    constructor(comparator: Comparator<V>) {\r\n        this._root = null;\r\n        this._comp = comparator;\r\n        this._size = 0;\r\n    }\r\n\r\n    // Inserts the value into the tree. Nothing is inserted if the value already exists\r\n    insert(value: V) {\r\n        this._root = this.insert0(value, this._root);\r\n    }\r\n\r\n    // Removes the value from the tree (if it exists)\r\n    remove(value: V) {\r\n        this._root = this.remove0(value, this._root);\r\n    }\r\n\r\n    // Removes all values from the tree (size will be 0)\r\n    removeAll() {\r\n        this._root = null;\r\n        this._size = 0;\r\n    }\r\n\r\n    contains(value: V): boolean {\r\n        return this.contains0(value, this._root) !== null;\r\n    }\r\n\r\n    // Gets the actual value stored in the tree or null if it does not exist.\r\n    // Normally this is not useful. This method is provided for trees which store additional\r\n    // data in their values besides their sort order.\r\n    getValue(value: V): V {\r\n        return this.contains0(value, this._root);\r\n    }\r\n\r\n    get size(): number {\r\n        return this._size;\r\n    }\r\n\r\n    get isEmpty(): boolean {\r\n        return (this._size === 0);\r\n    }\r\n\r\n    // Returns the lowest element greater than or equal to the given value, or null if no such element exists\r\n    ceiling(value: V): V {\r\n        return this.higher0(value, this._root, true);\r\n    }\r\n\r\n    // Returns the greatest element less than or equal to the given value, or null if no such element exists\r\n    floor(value: V): V {\r\n        return this.lower0(value, this._root, true);\r\n    }\r\n\r\n    // Returns the greatest element strictly less than the given value, or null if no such element exists\r\n    lower(value: V): V {\r\n        return this.lower0(value, this._root, false);\r\n    }\r\n\r\n    // Returns the lowest element strictly greater than the given value, or null if no such element exists\r\n    higher(value: V): V {\r\n        return this.higher0(value, this._root, false);\r\n    }\r\n\r\n    // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high)\r\n    headSet(value: V, inclusive: boolean = true): V[] {\r\n        const results: V[] = new Array<V>();\r\n        this.head0(value, inclusive, this._root, results);\r\n        return results;\r\n    }\r\n\r\n    // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high)\r\n    tailSet(value: V, inclusive: boolean = false): V[] {\r\n        const results: V[] = new Array<V>();\r\n        this.tail0(value, inclusive, this._root, results);\r\n        return results;\r\n    }\r\n\r\n    // Returns all elements between the provided values (sorted from low to high)\r\n    subSet(low: V, high: V, lowInclusive: boolean = true, highInclusive: boolean = false): V[] {\r\n        const results: V[] = new Array<V>();\r\n        this.sub0(low, high, lowInclusive, highInclusive, this._root, results);\r\n        return results;\r\n    }\r\n\r\n    // Returns all elements in the tree (sorted from low to high)\r\n    toArray(): V[] {\r\n        const results: V[] = new Array<V>();\r\n        this.addAll0(this._root, results);\r\n        return results;\r\n    }\r\n\r\n    iterator(): Iterator<V> {\r\n\r\n        // find the first node by traversing left links down the tree\r\n        let node: TreeNode<V> = this._root;\r\n        let down: boolean;\r\n        const stack: TreeNode<V>[] = new Array<TreeNode<V>>();\r\n        while (node != null && node.left != null) {\r\n            stack.push(node);\r\n            node = node.left;\r\n        }\r\n        down = node.right != null;\r\n\r\n        return {\r\n            next: function (): V {\r\n                const value = node.value;\r\n\r\n                // down indicates we should follow the right link\r\n                if (down && node != null && node.right != null) {\r\n                    node = node.right;\r\n                    while (node != null && node.left != null) {\r\n                        stack.push(node);\r\n                        node = node.left;\r\n                    }\r\n                    down = node.right != null;\r\n                }\r\n                // up indicates the right link has been followed and we should move up to parent\r\n                else {\r\n                    node = stack.pop();\r\n                    down = true;\r\n                }\r\n\r\n                return value;\r\n            },\r\n            hasNext: function (): boolean {\r\n                return node != null;\r\n            }\r\n        };\r\n    }\r\n\r\n    compare(node1: V, node2: V): number {\r\n        return this._comp.compare(node1, node2);\r\n    }\r\n\r\n    private contains0(value: V, node: TreeNode<V>): V {\r\n        if (node == null) {\r\n            return null;\r\n        }\r\n\r\n        const comp: number = this.compare(value, node.value);\r\n        if (comp > 0) {\r\n            return this.contains0(value, node.right);\r\n        }\r\n        else if (comp < 0) {\r\n            return this.contains0(value, node.left);\r\n        }\r\n        else {\r\n            return node.value;\r\n        }\r\n    }\r\n\r\n    private lower0(value: V, node: TreeNode<V>, inclusive: boolean): V {\r\n        if (node == null) {\r\n            return null;\r\n        }\r\n\r\n        let comp: number = this.compare(value, node.value);\r\n        let candidate: V;\r\n        if (comp > 0) {\r\n            candidate = this.lower0(value, node.right, inclusive);\r\n            // don't need to compare again, candidate will be closer to value\r\n            return candidate != null ? candidate : node.value;\r\n        }\r\n        else if (comp < 0 || (!inclusive && comp === 0)) {\r\n            // current node's value is lower -- if we don't find a better value:\r\n            //   * return this node's value if lower\r\n            //   * otherwise return null\r\n            candidate = this.lower0(value, node.left, inclusive);\r\n            if (candidate == null) {\r\n                candidate = node.value;\r\n            }\r\n            comp = this.compare(value, candidate);\r\n            return comp > 0 || (inclusive && comp === 0) ? candidate : null;\r\n        }\r\n        else {\r\n            // the node's value equals the search value and inclusive is true\r\n            return node.value;\r\n        }\r\n    }\r\n\r\n    private higher0(value: V, node: TreeNode<V>, inclusive: boolean): V {\r\n        if (node == null) {\r\n            return null;\r\n        }\r\n\r\n        let comp: number = this.compare(value, node.value);\r\n        let candidate: V;\r\n        if (comp < 0) {\r\n            candidate = this.higher0(value, node.left, inclusive);\r\n            // don't need to compare again, candidate will be closer to value\r\n            return candidate != null ? candidate : node.value;\r\n        }\r\n        else if (comp > 0 || (!inclusive && comp === 0)) {\r\n            // current node's value is lower -- if we don't find a better value:\r\n            //   * return this node's value if higher\r\n            //   * otherwise return null\r\n            candidate = this.higher0(value, node.right, inclusive);\r\n            if (candidate == null) {\r\n                candidate = node.value;\r\n            }\r\n            comp = this.compare(value, candidate);\r\n            return comp < 0 || (inclusive && comp === 0) ? candidate : null;\r\n        }\r\n        else {\r\n            // the node's value equals the search value and inclusive is true\r\n            return node.value;\r\n        }\r\n    }\r\n\r\n    private sub0(low: V, high: V, lowInclusive: boolean, highInclusive: boolean, node: TreeNode<V>, results: V[]): any {\r\n        if (node == null) {\r\n            return;\r\n        }\r\n\r\n        // low end of range is above node value\r\n        const compLow: number = this.compare(low, node.value);\r\n        if (compLow > 0 || (compLow === 0 && !lowInclusive)) {\r\n            return this.sub0(low, high, lowInclusive, highInclusive, node.right, results);\r\n        }\r\n\r\n        // high end of range is below node value\r\n        const compHigh: number = this.compare(high, node.value);\r\n        if (compHigh < 0 || (compHigh === 0 && !highInclusive)) {\r\n            return this.sub0(low, high, lowInclusive, highInclusive, node.left, results);\r\n        }\r\n\r\n        // value is within range\r\n        this.sub0(low, high, lowInclusive, highInclusive, node.left, results);\r\n        results.push(node.value);\r\n        this.sub0(low, high, lowInclusive, highInclusive, node.right, results);\r\n    }\r\n\r\n    private head0(value: V, inclusive: boolean, node: TreeNode<V>, results: V[]) {\r\n        if (node == null) {\r\n            return;\r\n        }\r\n\r\n        const comp: number = this.compare(value, node.value);\r\n        if (comp < 0 || (comp === 0 && inclusive)) {\r\n            this.head0(value, inclusive, node.left, results);\r\n            results.push(node.value);\r\n            this.addAll0(node.right, results);\r\n        }\r\n        else if (comp > 0) {\r\n            this.head0(value, inclusive, node.right, results);\r\n        }\r\n    }\r\n\r\n    private tail0(value: V, inclusive: boolean, node: TreeNode<V>, results: V[]) {\r\n        if (node == null) {\r\n            return;\r\n        }\r\n\r\n        const comp: number = this.compare(value, node.value);\r\n        if (comp > 0 || (comp === 0 && inclusive)) {\r\n            this.addAll0(node.left, results);\r\n            results.push(node.value);\r\n            this.tail0(value, inclusive, node.right, results);\r\n        }\r\n        else if (comp < 0) {\r\n            this.tail0(value, inclusive, node.left, results);\r\n        }\r\n    }\r\n\r\n    private addAll0(node: TreeNode<V>, results: V[]) {\r\n        if (node == null) {\r\n            return;\r\n        }\r\n\r\n        this.addAll0(node.left, results);\r\n        results.push(node.value);\r\n        this.addAll0(node.right, results);\r\n    }\r\n\r\n    // 1) turn deletion of internal node into deletion of leaf node by swapping with closest successor or predecessor\r\n    //    (which will always be in level 1)\r\n    // 2) lower level of nodes whose children are two levels below them (not allowed by invariants 2 and 3)\r\n    //    also lower level of nodes who are now leaf nodes (level > 1 not allowed by invariant 1)\r\n    // 3) skew and split the entire level\r\n    private remove0(value: V, node: TreeNode<V>): TreeNode<V> {\r\n        if (node == null) {\r\n            return node;\r\n        }\r\n\r\n        // find and remove the node\r\n        const comp: number = this.compare(value, node.value);\r\n        if (comp < 0) {\r\n            node.left = this.remove0(value, node.left);\r\n        }\r\n        else if (comp > 0) {\r\n            node.right = this.remove0(value, node.right);\r\n        }\r\n        else {\r\n            if (node.isLeaf()) {\r\n                return null;\r\n            }\r\n            else if (node.left == null) {\r\n                const lower = node.getSuccessor();\r\n                node.right = this.remove0(lower.value, node.right);\r\n                node.value = lower.value;\r\n            }\r\n            else {\r\n                const lower = node.getPredecessor();\r\n                node.left = this.remove0(lower.value, node.left);\r\n                node.value = lower.value;\r\n            }\r\n            this._size -= 1;\r\n        }\r\n\r\n        // rebalance the tree\r\n        node = this.decreaseLevel0(node);\r\n\r\n        node = this.skew0(node);\r\n        node.right = this.skew0(node.right);\r\n        if (node.right != null) {\r\n            node.right.right = this.skew0(node.right.right);\r\n        }\r\n\r\n        node = this.split0(node);\r\n        node.right = this.split0(node.right);\r\n\r\n        return node;\r\n    }\r\n\r\n    // return the level of the node, or 0 if null\r\n    private level0(node: TreeNode<V>) {\r\n        if (node == null) {\r\n            return 0;\r\n        }\r\n        else {\r\n            return node.level;\r\n        }\r\n    }\r\n\r\n    // lower the level of nodes which violate invariants 1, 2, and/or 3\r\n    private decreaseLevel0(node: TreeNode<V>): TreeNode<V> {\r\n        const correctLevel = Math.min(this.level0(node.left), this.level0(node.right)) + 1;\r\n\r\n        if (correctLevel < node.level) {\r\n            node.level = correctLevel;\r\n            if (node.right != null && correctLevel < node.right.level) {\r\n                node.right.level = correctLevel;\r\n            }\r\n        }\r\n\r\n        return node;\r\n    }\r\n\r\n    // 1) insert the value as you would in a binary tree\r\n    // 2) walk back to the root performing skew() then split() operations\r\n    // returns an updated version of the provided node (after the insert)\r\n    private insert0(value: V, node: TreeNode<V>): TreeNode<V> {\r\n        if (node == null) {\r\n            this._size += 1;\r\n            return this.newTreeNode0(value);\r\n        }\r\n\r\n        // find the appropriate spot and insert the node\r\n        const comp: number = this.compare(value, node.value);\r\n        if (comp < 0) {\r\n            node.left = this.insert0(value, node.left);\r\n        }\r\n        else if (comp > 0) {\r\n            node.right = this.insert0(value, node.right);\r\n        }\r\n\r\n        // always perform a skew then split to rebalance tree\r\n        // (if no balancing is necessary, these operations will return the node unchanged)\r\n        node = this.skew0(node);\r\n        node = this.split0(node);\r\n\r\n        return node;\r\n    }\r\n\r\n    newTreeNode0(value: V) {\r\n        return new TreeNode(value);\r\n    }\r\n\r\n    private skew0(node: TreeNode<V>) {\r\n        if (node == null) {\r\n            return null;\r\n        }\r\n        else if (node.left == null) {\r\n            return node;\r\n        }\r\n        else if (node.left.level === node.level) {\r\n            // swap the pointers of the horizontal (same level value) left links\r\n            const left = node.left;\r\n            node.left = left.right;\r\n            left.right = node;\r\n            return left;\r\n        }\r\n        else {\r\n            return node;\r\n        }\r\n    }\r\n\r\n    private split0(node: TreeNode<V>) {\r\n        if (node == null) {\r\n            return null;\r\n        }\r\n        else if (node.right == null || node.right.right == null) {\r\n            return node;\r\n        }\r\n        else if (node.level === node.right.right.level) {\r\n            // two horizontal (same level value) right links\r\n            // take the middle node, elevate it, and return it\r\n            const right = node.right;\r\n            node.right = right.left;\r\n            right.left = node;\r\n            right.level = right.level + 1;\r\n            return right;\r\n        }\r\n        else {\r\n            return node;\r\n        }\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\nexport class TreeNode<V> {\r\n\r\n    private _level: number;\r\n    private _right: TreeNode<V>;\r\n    private _left: TreeNode<V>;\r\n    private _value: V;\r\n\r\n    constructor(value: V, level: number = 1, left: TreeNode<V> = null, right: TreeNode<V> = null) {\r\n        this._level = level;\r\n        this._right = right;\r\n        this._left = left;\r\n        this._value = value;\r\n    }\r\n\r\n    get level(): number {\r\n        return this._level;\r\n    }\r\n\r\n    get right(): TreeNode<V> {\r\n        return this._right;\r\n    }\r\n\r\n    get left(): TreeNode<V> {\r\n        return this._left;\r\n    }\r\n\r\n    get value(): V {\r\n        return this._value;\r\n    }\r\n\r\n    set right(node: TreeNode<V>) {\r\n        this._right = node;\r\n    }\r\n\r\n    set left(node: TreeNode<V>) {\r\n        this._left = node;\r\n    }\r\n\r\n    set level(level: number) {\r\n        this._level = level;\r\n    }\r\n\r\n    set value(value: V) {\r\n        this._value = value;\r\n    }\r\n\r\n    isLeaf(): boolean {\r\n        return this.right == null && this.left == null;\r\n    }\r\n\r\n    getSuccessor(): TreeNode<V> {\r\n        let node: TreeNode<V> = this.right;\r\n        while (node != null && node.left != null) {\r\n            node = node.left;\r\n        }\r\n        return node;\r\n    }\r\n\r\n    getPredecessor(): TreeNode<V> {\r\n        let node: TreeNode<V> = this.left;\r\n        while (node != null && node.right != null) {\r\n            node = node.right;\r\n        }\r\n        return node;\r\n    }\r\n\r\n    toString(): string {\r\n        return this.value.toString() + ':' + this.level.toString();\r\n    }\r\n}\r\n\r\nexport interface Iterator<V> {\r\n    hasNext(): boolean;\r\n    next(): V;\r\n}\r\n\r\n// follows Java Comparator interface contract:\r\n// positive  if node1 > node2\r\n// 0         if node1 = node2\r\n// negative  if node1 < node2\r\nexport interface Comparator<V> {\r\n    compare(node1: V, node2: V): number;\r\n}\r\n\r\nexport class StringComparator implements Comparator<string> {\r\n    compare(value1: string, value2: string): number {\r\n        return value1.toLocaleLowerCase().localeCompare(value2.toLocaleLowerCase());\r\n    }\r\n}\r\n\r\nexport class NumberComparator implements Comparator<number> {\r\n    compare(value1: number, value2: number): number {\r\n        return value1 - value2;\r\n    }\r\n}\r\n\r\nexport function createStringTree(): BinaryTree<string> {\r\n    return new BinaryTree(new StringComparator());\r\n}\r\n\r\nexport function createNumberTree(): BinaryTree<number> {\r\n    return new BinaryTree(new NumberComparator());\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { BinaryTree, Comparator, Iterator } from './binary_tree';\r\nimport { IdFunction, StringMap, getObjectId } from './util';\r\n\r\n// A sorted map which allows multiple string values per key (K)\r\nexport class SortedMultimap<K, V> {\r\n\r\n    private _tree: BinaryTree<Container<K, V>>;\r\n    private _idFn: IdFunction<V>;\r\n\r\n    constructor(comparator: Comparator<K>, idFn: IdFunction<V> = getObjectId) {\r\n        this._tree = new BinaryTree<Container<K, V>>(this.createContainerComparator<V>(comparator));\r\n        this._idFn = idFn;\r\n    }\r\n\r\n    private createContainerComparator<U>(comparator: Comparator<K>): Comparator<Container<K, U>> {\r\n        return {\r\n            compare: function (container1: Container<K, U>, container2: Container<K, U>): number {\r\n                return comparator.compare(container1.key, container2.key);\r\n            }\r\n        };\r\n    }\r\n\r\n    // Inserts the value into the tree. Nothing is inserted if the value already exists\r\n    insert(key: K, value: V) {\r\n        const wrappedKey = new Container<K, V>(key);\r\n        let values: Container<K, V> = this._tree.getValue(wrappedKey);\r\n\r\n        if (values === null) {\r\n            values = wrappedKey;\r\n            this._tree.insert(values);\r\n        }\r\n\r\n        values.add(value, this._idFn);\r\n    }\r\n\r\n    remove(key: K, value: V) {\r\n        const wrappedKey = new Container<K, V>(key);\r\n        const values: Container<K, V> = this._tree.getValue(wrappedKey);\r\n\r\n        if (values === null) {\r\n            return;\r\n        }\r\n\r\n        values.remove(value, this._idFn);\r\n\r\n        if (values.size === 0) {\r\n            this._tree.remove(values);\r\n        }\r\n    }\r\n\r\n    contains(key: K, value: V) {\r\n        const wrappedKey = new Container<K, V>(key);\r\n        const values: Container<K, V> = this._tree.getValue(wrappedKey);\r\n\r\n        if (values === null) {\r\n            return false;\r\n        }\r\n        else {\r\n            return values.contains(value, this._idFn);\r\n        }\r\n    }\r\n\r\n    // Returns the lowest element greater than or equal to the given value, or null if no such element exists\r\n    ceiling(key: K): V[] {\r\n        return this.unwrap(this._tree.ceiling(this.wrap(key)));\r\n    }\r\n\r\n    // Returns the greatest element less than or equal to the given value, or null if no such element exists\r\n    floor(key: K): V[] {\r\n        return this.unwrap(this._tree.floor(this.wrap(key)));\r\n    }\r\n\r\n    // Returns the greatest element strictly less than the given value, or null if no such element exists\r\n    lower(key: K): V[] {\r\n        return this.unwrap(this._tree.lower(this.wrap(key)));\r\n    }\r\n\r\n    // Returns the lowest element strictly greater than the given value, or null if no such element exists\r\n    higher(key: K): V[] {\r\n        return this.unwrap(this._tree.higher(this.wrap(key)));\r\n    }\r\n\r\n    // Returns all elements greater than (or equal to, if inclusive is true) the provided value (sorted from low to high)\r\n    headSet(key: K, inclusive: boolean = true): V[] {\r\n        return this.unwrapArray(this._tree.headSet(this.wrap(key), inclusive));\r\n    }\r\n\r\n    // Returns all elements less than ( or equal to, if inclusive is true) the provided value (sorted from low to high)\r\n    tailSet(key: K, inclusive: boolean = false): V[] {\r\n        return this.unwrapArray(this._tree.tailSet(this.wrap(key), inclusive));\r\n    }\r\n\r\n    // Returns all elements between the provided values (sorted from low to high)\r\n    subSet(low: K, high: K, lowInclusive: boolean = true, highInclusive: boolean = false): V[] {\r\n        const wrappedLow = new Container<K, V>(low);\r\n        const wrappedHigh = new Container<K, V>(high);\r\n        const values: Container<K, V>[] = this._tree.subSet(wrappedLow, wrappedHigh, lowInclusive, highInclusive);\r\n        return this.unwrapArray(values);\r\n    }\r\n\r\n    // Returns all keys in the tree (sorted from low to high)\r\n    toArray(): V[] {\r\n        return this.unwrapArray(this._tree.toArray());\r\n    }\r\n\r\n    iterator(): Iterator<V> {\r\n\r\n        const iter: Iterator<Container<K, V>> = this._tree.iterator();\r\n        let currentArray: V[] = null;\r\n        let currentIndex = 0;\r\n\r\n        return {\r\n            next: function (): V {\r\n\r\n                let value: V;\r\n\r\n                if (currentArray == null || currentIndex >= currentArray.length) {\r\n                    currentArray = iter.next().toArray();\r\n                    currentIndex = 0;\r\n                    value = currentArray[currentIndex];\r\n                }\r\n                else {\r\n                    value = currentArray[currentIndex];\r\n                }\r\n\r\n                currentIndex += 1;\r\n\r\n                return value;\r\n            },\r\n            hasNext: function (): boolean {\r\n                return iter.hasNext() || (currentArray != null && currentIndex < currentArray.length);\r\n            }\r\n        };\r\n    }\r\n\r\n    private wrap(key: K): Container<K, V> {\r\n        return new Container<K, V>(key);\r\n    }\r\n\r\n    private unwrap(values: Container<K, V>): V[] {\r\n        if (values === null) {\r\n            return [];\r\n        }\r\n        else {\r\n            return values.toArray();\r\n        }\r\n    }\r\n\r\n    private unwrapArray(values: Container<K, V>[]): V[] {\r\n        const unwrappedValues: V[] = new Array<V>();\r\n        values.forEach(function (value: Container<K, V>) {\r\n            value.toArray().forEach(function (val: V) {\r\n                unwrappedValues.push(val);\r\n            });\r\n        });\r\n\r\n        return unwrappedValues;\r\n    }\r\n}\r\n\r\nexport class SortedStringMultimap<K> extends SortedMultimap<K, string> {\r\n    constructor(comparator: Comparator<K>) {\r\n        super(comparator, (value) => value);\r\n    }\r\n}\r\n\r\n// a container which stores a set of values (V) associated with a sorted key (K)\r\n// OrderedSet or even BinaryTree could be used here instead\r\n// more sophisticated set implementation: http://stackoverflow.com/questions/7958292/mimicking-sets-in-javascript\r\nclass Container<K, V> {\r\n\r\n    private _key: K;\r\n    private _values: StringMap<V>;\r\n\r\n    constructor(key: K) {\r\n        this._key = key;\r\n        this._values = {};\r\n    }\r\n\r\n    get size(): number {\r\n        return this.toArray().length;\r\n    }\r\n\r\n    get key(): K {\r\n        return this._key;\r\n    }\r\n\r\n    get values(): StringMap<V> {\r\n        return this._values;\r\n    }\r\n\r\n    toArray(): V[] {\r\n        return Object.keys(this._values).map(key => this._values[key]);\r\n    }\r\n\r\n    contains(value: V, idFn: IdFunction<V>): boolean {\r\n        // safer than 'value in this._values' because of potential conflict with built in properties/methods\r\n        return Object.prototype.hasOwnProperty.call(this._values, idFn(value));\r\n    }\r\n\r\n    add(value: V, idFn: IdFunction<V>) {\r\n        this._values[idFn(value)] = value;\r\n    }\r\n\r\n    remove(value: V, idFn: IdFunction<V>) {\r\n        delete this._values[idFn(value)];\r\n    }\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Notification } from './notification';\r\n\r\nexport function initSplitContainer(container: HTMLElement): Notification {\r\n    const tilesResized = new Notification();\r\n\r\n    _initSplitContainer(container, tilesResized);\r\n\r\n    window.addEventListener('resize', function () {\r\n        tilesResized.fire();\r\n    });\r\n    tilesResized.fire();\r\n\r\n    return tilesResized;\r\n}\r\n\r\n\r\n\r\n\r\nfunction _initSplitContainer(container: HTMLElement, tilesResized: Notification) {\r\n    let tileA: HTMLElement = null;\r\n    let tileB: HTMLElement = null;\r\n    let sep: HTMLElement = null;\r\n    const children = container.childNodes;\r\n    for (let n = 0; n < children.length; n++) {\r\n        const child = children[n];\r\n        if (child.nodeType === 1 && (<any>child).classList) {\r\n            const element = <HTMLElement>child;\r\n            if (tileA == null) {\r\n                if (element.classList.contains('splitContainerNS') || element.classList.contains('splitContainerEW') || element.classList.contains('splitTile')) {\r\n                    tileA = element;\r\n                }\r\n            }\r\n            else if (sep == null) {\r\n                if (element.classList.contains('splitSep')) {\r\n                    sep = element;\r\n                }\r\n            }\r\n            else if (tileB == null) {\r\n                if (element.classList.contains('splitContainerNS') || element.classList.contains('splitContainerEW') || element.classList.contains('splitTile')) {\r\n                    tileB = element;\r\n                }\r\n            }\r\n            else {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    if (tileA == null) {\r\n        throw new Error('Failed to init split-container: could not find first tile');\r\n    }\r\n    if (sep == null) {\r\n        throw new Error('Failed to init split-container: could not find separator');\r\n    }\r\n    if (tileB == null) {\r\n        throw new Error('Failed to init split-container: could not find second tile');\r\n    }\r\n\r\n    if (container.classList.contains('splitContainerNS')) {\r\n        _initSplitNS(container, tileA, sep, tileB, tilesResized);\r\n    }\r\n    else if (container.classList.contains('splitContainerEW')) {\r\n        _initSplitEW(container, tileA, sep, tileB, tilesResized);\r\n    }\r\n\r\n    if (tileA.classList.contains('splitContainerNS') || tileA.classList.contains('splitContainerEW')) {\r\n        _initSplitContainer(tileA, tilesResized);\r\n    }\r\n\r\n    if (tileB.classList.contains('splitContainerNS') || tileB.classList.contains('splitContainerEW')) {\r\n        _initSplitContainer(tileB, tilesResized);\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\nfunction _initSplitNS(container: HTMLElement, tileA: HTMLElement, sep: HTMLElement, tileB: HTMLElement, tilesResized: Notification): void {\r\n    sep.classList.add('splitSepNS');\r\n    sep.style.left = '0px';\r\n    sep.style.right = '0px';\r\n    tileA.style.left = '0px';\r\n    tileA.style.right = '0px';\r\n    tileB.style.left = '0px';\r\n    tileB.style.right = '0px';\r\n\r\n    const minHeightA = 1;\r\n    const minHeightB = 1;\r\n    let recentFracA: number = null;\r\n\r\n    function layoutTiles(prelimHeightA?: number) {\r\n        const heightSep = sep.getBoundingClientRect().height;\r\n        const heightContainer = container.getBoundingClientRect().height;\r\n        const heightContent = heightContainer - heightSep;\r\n        if (recentFracA == null) {\r\n            recentFracA = tileA.getBoundingClientRect().height / heightContent;\r\n        }\r\n\r\n        const keepFracA = (prelimHeightA == null);\r\n        if (keepFracA) {\r\n            prelimHeightA = Math.round(recentFracA * heightContent);\r\n        }\r\n\r\n        const maxHeightA = heightContainer - heightSep - minHeightB;\r\n\r\n        const topA = 0;\r\n        const heightA = Math.max(minHeightA, Math.min(maxHeightA, prelimHeightA));\r\n        tileA.style.top = topA + 'px';\r\n        tileA.style.height = heightA + 'px';\r\n\r\n        const topSep = topA + heightA;\r\n        sep.style.top = topSep + 'px';\r\n        sep.style.height = heightSep + 'px';\r\n\r\n        const topB = topSep + heightSep;\r\n        const heightB = Math.max(minHeightB, heightContainer - topB);\r\n        tileB.style.top = topB + 'px';\r\n        tileB.style.height = heightB + 'px';\r\n\r\n        if (!keepFracA && heightContent >= heightA && heightContent >= (minHeightA + minHeightB)) {\r\n            recentFracA = heightA / heightContent;\r\n        }\r\n    }\r\n\r\n    let sepGrab: number = null;\r\n\r\n    sep.addEventListener('mousedown', function (ev: MouseEvent) {\r\n        if (ev.button === 0) {\r\n            sepGrab = ev.clientY - tileA.getBoundingClientRect().top - tileA.getBoundingClientRect().height;\r\n            ev.preventDefault();\r\n        }\r\n    });\r\n\r\n    // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove\r\n    window.addEventListener('mousemove', function (ev: MouseEvent) {\r\n        if (sepGrab != null) {\r\n            layoutTiles(ev.clientY - tileA.getBoundingClientRect().top - sepGrab);\r\n            tilesResized.fire();\r\n        }\r\n    });\r\n\r\n    // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window\r\n    window.addEventListener('mouseup', function (ev: MouseEvent) {\r\n        if (sepGrab != null && ev.button === 0) {\r\n            layoutTiles(ev.clientY - tileA.getBoundingClientRect().top - sepGrab);\r\n            tilesResized.fire();\r\n            sepGrab = null;\r\n        }\r\n    });\r\n\r\n    tilesResized.on(layoutTiles);\r\n}\r\n\r\n\r\n\r\n\r\nfunction _initSplitEW(container: HTMLElement, tileA: HTMLElement, sep: HTMLElement, tileB: HTMLElement, tilesResized: Notification): void {\r\n    sep.classList.add('splitSepEW');\r\n    sep.style.top = '0px';\r\n    sep.style.bottom = '0px';\r\n    tileA.style.top = '0px';\r\n    tileA.style.bottom = '0px';\r\n    tileB.style.top = '0px';\r\n    tileB.style.bottom = '0px';\r\n\r\n    const minWidthA = 1;\r\n    const minWidthB = 1;\r\n    let recentFracA: number = null;\r\n\r\n    function layoutTiles(prelimWidthA?: number) {\r\n        const widthSep = sep.getBoundingClientRect().width;\r\n        const widthContainer = container.getBoundingClientRect().width;\r\n        const widthContent = widthContainer - widthSep;\r\n        if (recentFracA == null) {\r\n            recentFracA = tileA.getBoundingClientRect().width / widthContent;\r\n        }\r\n\r\n        const keepFracA = (prelimWidthA == null);\r\n        if (keepFracA) {\r\n            prelimWidthA = Math.round(recentFracA * widthContent);\r\n        }\r\n\r\n        const maxWidthA = widthContainer - widthSep - minWidthB;\r\n\r\n        const leftA = 0;\r\n        const widthA = Math.max(minWidthA, Math.min(maxWidthA, prelimWidthA));\r\n        tileA.style.left = leftA + 'px';\r\n        tileA.style.width = widthA + 'px';\r\n\r\n        const leftSep = leftA + widthA;\r\n        sep.style.left = leftSep + 'px';\r\n        sep.style.width = widthSep + 'px';\r\n\r\n        const leftB = leftSep + widthSep;\r\n        const widthB = Math.max(minWidthB, widthContainer - leftB);\r\n        tileB.style.left = leftB + 'px';\r\n        tileB.style.width = widthB + 'px';\r\n\r\n        if (!keepFracA && widthContent >= widthA && widthContent >= (minWidthA + minWidthB)) {\r\n            recentFracA = widthA / widthContent;\r\n        }\r\n    }\r\n\r\n    let sepGrab: number = null;\r\n\r\n    sep.addEventListener('mousedown', function (ev: MouseEvent) {\r\n        if (ev.button === 0) {\r\n            sepGrab = ev.clientX - tileA.getBoundingClientRect().left - tileA.getBoundingClientRect().width;\r\n            ev.preventDefault();\r\n        }\r\n    });\r\n\r\n    // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove\r\n    window.addEventListener('mousemove', function (ev: MouseEvent) {\r\n        if (sepGrab != null) {\r\n            layoutTiles(ev.clientX - tileA.getBoundingClientRect().left - sepGrab);\r\n            tilesResized.fire();\r\n        }\r\n    });\r\n\r\n    // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window\r\n    window.addEventListener('mouseup', function (ev: MouseEvent) {\r\n        if (sepGrab != null && ev.button === 0) {\r\n            layoutTiles(ev.clientX - tileA.getBoundingClientRect().left - sepGrab);\r\n            tilesResized.fire();\r\n            sepGrab = null;\r\n        }\r\n    });\r\n\r\n    tilesResized.on(layoutTiles);\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { StringMap, GL, getObjectId, hasval } from './util/util';\r\n\r\nexport interface Buffer {\r\n    bind(gl: WebGLRenderingContext, target: number): void;\r\n    unbind(gl: WebGLRenderingContext, target: number): void;\r\n    dispose(): void;\r\n}\r\n\r\nexport interface DynamicBuffer extends Buffer {\r\n    setData(newData: Float32Array): void;\r\n}\r\n\r\nexport function newStaticBuffer(data: Float32Array): Buffer {\r\n    return new StaticBufferImpl(data);\r\n}\r\n\r\nexport function newDynamicBuffer(data: Float32Array = new Float32Array(0)): DynamicBuffer {\r\n    return new DynamicBufferImpl(data);\r\n}\r\n\r\n\r\nclass BufferEntry {\r\n    gl: WebGLRenderingContext;\r\n    buffer: WebGLBuffer;\r\n    capacity = 0;\r\n    marker: number = null;\r\n\r\n    constructor(gl: WebGLRenderingContext, buffer: WebGLBuffer) {\r\n        this.gl = gl;\r\n        this.buffer = buffer;\r\n    }\r\n}\r\n\r\nclass AbstractBuffer implements Buffer {\r\n    private buffers: StringMap<BufferEntry> = {};\r\n    private currentMarker = 0;\r\n\r\n    init(gl: WebGLRenderingContext, target: number): number {\r\n        throw new Error('Method is abstract');\r\n    }\r\n\r\n    update(gl: WebGLRenderingContext, target: number, capacity: number): number {\r\n        throw new Error('Method is abstract');\r\n    }\r\n\r\n    setDirty() {\r\n        this.currentMarker++;\r\n    }\r\n\r\n    bind(gl: WebGLRenderingContext, target: number) {\r\n        const glId = getObjectId(gl);\r\n        if (this.buffers[glId] === undefined) {\r\n            const buffer = gl.createBuffer();\r\n            if (!hasval(buffer)) {\r\n                throw new Error('Failed to create buffer');\r\n            }\r\n            this.buffers[glId] = new BufferEntry(gl, buffer);\r\n\r\n            gl.bindBuffer(target, this.buffers[glId].buffer);\r\n            this.buffers[glId].capacity = this.init(gl, target);\r\n            this.buffers[glId].marker = this.currentMarker;\r\n        }\r\n        else if (this.buffers[glId].marker !== this.currentMarker) {\r\n            gl.bindBuffer(target, this.buffers[glId].buffer);\r\n            this.buffers[glId].capacity = this.update(gl, target, this.buffers[glId].capacity);\r\n            this.buffers[glId].marker = this.currentMarker;\r\n        }\r\n        else {\r\n            gl.bindBuffer(target, this.buffers[glId].buffer);\r\n        }\r\n    }\r\n\r\n    unbind(gl: WebGLRenderingContext, target: number) {\r\n        gl.bindBuffer(target, null);\r\n    }\r\n\r\n    dispose() {\r\n        // XXX: Not sure this actually works ... may have to make each gl current or something\r\n        for (const glid in this.buffers) {\r\n            if (this.buffers.hasOwnProperty(glid)) {\r\n                const en = this.buffers[glid];\r\n                en.gl.deleteBuffer(en.buffer);\r\n            }\r\n        }\r\n        this.buffers = {};\r\n    }\r\n}\r\n\r\n\r\nclass StaticBufferImpl extends AbstractBuffer {\r\n    private _data: Float32Array;\r\n\r\n    constructor(data: Float32Array) {\r\n        super();\r\n        this._data = data;\r\n    }\r\n\r\n    init(gl: WebGLRenderingContext, target: number): number {\r\n        gl.bufferData(target, this._data, GL.STATIC_DRAW);\r\n        return this._data.byteLength;\r\n    }\r\n\r\n    update(gl: WebGLRenderingContext, target: number, capacity: number): number {\r\n        throw new Error('This buffer is static and should never need to be updated');\r\n    }\r\n}\r\n\r\n\r\nclass DynamicBufferImpl extends AbstractBuffer implements DynamicBuffer {\r\n    private _data: Float32Array;\r\n\r\n    constructor(data: Float32Array) {\r\n        super();\r\n        this._data = data;\r\n    }\r\n\r\n    setData(data: Float32Array) {\r\n        this._data = data;\r\n        this.setDirty();\r\n    }\r\n\r\n    init(gl: WebGLRenderingContext, target: number): number {\r\n        gl.bufferData(target, this._data, GL.DYNAMIC_DRAW);\r\n        return this._data.byteLength;\r\n    }\r\n\r\n    update(gl: WebGLRenderingContext, target: number, capacity: number): number {\r\n        if (this._data.byteLength <= capacity) {\r\n            gl.bufferSubData(target, 0, this._data);\r\n            return capacity;\r\n        }\r\n        else {\r\n            gl.bufferData(target, this._data, GL.DYNAMIC_DRAW);\r\n            return this._data.byteLength;\r\n        }\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { GL, StringMap, getObjectId, hasval } from './util/util';\r\nimport { Color } from './color';\r\nimport { Texture } from './texture';\r\nimport { Buffer } from './buffer';\r\n\r\nfunction compileShader(gl: WebGLRenderingContext, shaderType: number, glsl: string): WebGLShader {\r\n    const shader = gl.createShader(shaderType);\r\n    gl.shaderSource(shader, glsl);\r\n\r\n    gl.compileShader(shader);\r\n    if (!gl.getShaderParameter(shader, GL.COMPILE_STATUS)) {\r\n        throw new Error(gl.getShaderInfoLog(shader));\r\n    }\r\n\r\n    return shader;\r\n}\r\n\r\nfunction linkProgram(gl: WebGLRenderingContext, shaders: WebGLShader[]): WebGLProgram {\r\n    const program = gl.createProgram();\r\n    for (let i = 0; i < shaders.length; i++) {\r\n        gl.attachShader(program, shaders[i]);\r\n    }\r\n    try {\r\n        gl.linkProgram(program);\r\n        if (!gl.getProgramParameter(program, GL.LINK_STATUS)) {\r\n            throw new Error(gl.getProgramInfoLog(program));\r\n        }\r\n        return program;\r\n    }\r\n    finally {\r\n        // It's good GL practice to detach and delete shaders after they have been linked\r\n        // into a program, and are no longer needed. However, on some versions of Firefox,\r\n        // doing so causes getAttribLocation and getUniformLocation to fail.\r\n        //\r\n        // for ( var i = 0; i < shaders.length; i++ ) {\r\n        //    gl.detachShader( program, shaders[ i ] );\r\n        // }\r\n    }\r\n}\r\n\r\nfunction createProgram(gl: WebGLRenderingContext, vertShaderSource: string, fragShaderSource: string): WebGLProgram {\r\n    const shaders = [];\r\n    try {\r\n        shaders.push(compileShader(gl, GL.VERTEX_SHADER, vertShaderSource));\r\n        shaders.push(compileShader(gl, GL.FRAGMENT_SHADER, fragShaderSource));\r\n        return linkProgram(gl, shaders);\r\n    }\r\n    finally {\r\n        // It's good GL practice to detach and delete shaders after they have been linked\r\n        // into a program, and are no longer needed. However, on some versions of Firefox,\r\n        // doing so causes getAttribLocation and getUniformLocation to fail.\r\n        //\r\n        // for ( var i = 0; i < shaders.length; i++ ) {\r\n        //    gl.deleteShader( shaders[ i ] );\r\n        // }\r\n    }\r\n}\r\n\r\n\r\nclass ProgramEntry {\r\n    gl: WebGLRenderingContext;\r\n    program: WebGLProgram;\r\n\r\n    constructor(gl: WebGLRenderingContext, program: WebGLProgram) {\r\n        this.gl = gl;\r\n        this.program = program;\r\n    }\r\n}\r\n\r\nexport class Program {\r\n    private vertShaderSource: string;\r\n    private fragShaderSource: string;\r\n    private programs: StringMap<ProgramEntry> = {};\r\n\r\n    constructor(vertShaderSource: string, fragShaderSource: string) {\r\n        this.vertShaderSource = vertShaderSource;\r\n        this.fragShaderSource = fragShaderSource;\r\n    }\r\n\r\n    // XXX: Would be nice if this weren't public\r\n    _program(gl: WebGLRenderingContext): WebGLProgram {\r\n        const glId = getObjectId(gl);\r\n        if (this.programs[glId] === undefined) {\r\n            const program = createProgram(gl, this.vertShaderSource, this.fragShaderSource);\r\n            this.programs[glId] = new ProgramEntry(gl, program);\r\n        }\r\n        return this.programs[glId].program;\r\n    }\r\n\r\n    use(gl: WebGLRenderingContext) {\r\n        gl.useProgram(this._program(gl));\r\n    }\r\n\r\n    endUse(gl: WebGLRenderingContext) {\r\n        gl.useProgram(null);\r\n    }\r\n\r\n    dispose() {\r\n        // XXX: Not sure this actually works ... may have to make each gl current or something\r\n        for (const glid in this.programs) {\r\n            if (this.programs.hasOwnProperty(glid)) {\r\n                const en = this.programs[glid];\r\n                en.gl.deleteProgram(en.program);\r\n            }\r\n        }\r\n        this.programs = {};\r\n    }\r\n}\r\n\r\n\r\nexport class Uniform {\r\n    private program: Program;\r\n    private name: string;\r\n    private optional: boolean;\r\n    private locations: StringMap<WebGLUniformLocation> = {};\r\n\r\n    constructor(program: Program, name: string, optional: boolean) {\r\n        this.program = program;\r\n        this.name = name;\r\n        this.optional = optional;\r\n    }\r\n\r\n    // XXX: Would be nice if this weren't public\r\n    _location(gl: WebGLRenderingContext): WebGLUniformLocation {\r\n        const glId = getObjectId(gl);\r\n        if (this.locations[glId] === undefined) {\r\n            const location = gl.getUniformLocation(this.program._program(gl), this.name);\r\n            if (!this.optional && !hasval(location)) {\r\n                throw new Error('Uniform \\'' + this.name + '\\' not found');\r\n            }\r\n            this.locations[glId] = location;\r\n        }\r\n        return this.locations[glId];\r\n    }\r\n}\r\n\r\n\r\nexport class Uniform1f extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform1f(location, x);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform2f extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform2f(location, x, y);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform3f extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number, z: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform3f(location, x, y, z);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform4f extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform4f(location, x, y, z, w);\r\n        }\r\n    }\r\n}\r\n\r\nexport class UniformMatrix4f extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, value: Float32Array, transpose: boolean = false) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniformMatrix4fv(location, transpose, value);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform1i extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform1i(location, x);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform2i extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform2i(location, x, y);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform3i extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number, z: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform3i(location, x, y, z);\r\n        }\r\n    }\r\n}\r\n\r\nexport class Uniform4i extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, x: number, y: number, z: number, w: number) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform4i(location, x, y, z, w);\r\n        }\r\n    }\r\n}\r\n\r\nexport class UniformColor extends Uniform {\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setData(gl: WebGLRenderingContext, color: Color) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            gl.uniform4f(location, color.r, color.g, color.b, color.a);\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class UniformSampler2D extends Uniform {\r\n    private currentTexture: Texture;\r\n\r\n    constructor(program: Program, name: string, optional: boolean = false) {\r\n        super(program, name, optional);\r\n    }\r\n\r\n    setDataAndBind(gl: WebGLRenderingContext, textureUnit: number, texture: Texture) {\r\n        const location = this._location(gl);\r\n        if (hasval(location)) {\r\n            texture.bind(gl, textureUnit);\r\n            gl.uniform1i(location, textureUnit);\r\n            this.currentTexture = texture;\r\n        }\r\n    }\r\n\r\n    unbind(gl: WebGLRenderingContext) {\r\n        if (hasval(this.currentTexture)) {\r\n            this.currentTexture.unbind(gl);\r\n            this.currentTexture = null;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class Attribute {\r\n    private program: Program;\r\n    private name: string;\r\n    private locations: StringMap<number> = {};\r\n\r\n    constructor(program: Program, name: string) {\r\n        this.program = program;\r\n        this.name = name;\r\n    }\r\n\r\n    // XXX: Would be nice if this weren't public\r\n    _location(gl: WebGLRenderingContext): number {\r\n        const glId = getObjectId(gl);\r\n        if (this.locations[glId] === undefined) {\r\n            const location = gl.getAttribLocation(this.program._program(gl), this.name);\r\n            if (location === -1) {\r\n                throw new Error('Attribute \"' + this.name + '\" not found');\r\n            }\r\n            this.locations[glId] = location;\r\n        }\r\n        return this.locations[glId];\r\n    }\r\n\r\n    setDataAndEnable(gl: WebGLRenderingContext, buffer: Buffer, size: number, type: number, normalized: boolean = false, stride: number = 0, offset: number = 0) {\r\n        const location = this._location(gl);\r\n        gl.enableVertexAttribArray(location);\r\n        buffer.bind(gl, GL.ARRAY_BUFFER);\r\n        gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\r\n        buffer.unbind(gl, GL.ARRAY_BUFFER);\r\n    }\r\n\r\n    disable(gl: WebGLRenderingContext) {\r\n        gl.disableVertexAttribArray(this._location(gl));\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { BoundsUnmodifiable, Bounds, Size, newBoundsFromRect } from './bounds';\r\nimport { Notification, Listener, Notification1 } from './util/notification';\r\nimport { OrderedSet } from './util/ordered_set';\r\nimport { alwaysTrue, GL, getObjectId, hasval } from './util/util';\r\n\r\nexport type Painter = (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => void;\r\n\r\n\r\nexport interface PointerEvent {\r\n    paneViewport: BoundsUnmodifiable;\r\n    i: number;\r\n    j: number;\r\n    wheelSteps?: number;\r\n    clickCount?: number;\r\n    mouseEvent?: MouseEvent;\r\n}\r\n\r\n\r\nexport function xFrac(ev: PointerEvent) {\r\n    return ev.paneViewport.xFrac(ev.i);\r\n}\r\n\r\n\r\nexport function yFrac(ev: PointerEvent) {\r\n    return ev.paneViewport.yFrac(ev.j);\r\n}\r\n\r\n\r\nexport interface LayoutEntry {\r\n    layoutArg: any;\r\n    layoutOptions: any;\r\n    viewport: Bounds;\r\n    prefSize: Size;\r\n}\r\n\r\n\r\nexport type LayoutPhase1 = (parentPrefSize: Size, children?: LayoutEntry[]) => LayoutPhase1;\r\n\r\n\r\nexport type LayoutPhase2 = (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) => LayoutPhase2;\r\n\r\n\r\nexport interface Layout {\r\n    updatePrefSize?: LayoutPhase1;\r\n    updateChildViewports?: LayoutPhase2;\r\n}\r\n\r\n\r\nexport type Mask2D = (viewport: BoundsUnmodifiable, i: number, j: number) => boolean;\r\n\r\n\r\nclass PaneChild implements LayoutEntry {\r\n    pane: Pane;\r\n    layoutArg: any;\r\n    layoutOptions: any;\r\n    viewport: Bounds;\r\n    scissor: Bounds;\r\n    prefSize: Size;\r\n\r\n    constructor(pane: Pane, layoutArg: any, layoutOptions: any) {\r\n        this.pane = pane;\r\n        this.layoutArg = layoutArg;\r\n        this.layoutOptions = layoutOptions;\r\n        this.viewport = newBoundsFromRect(0, 0, 0, 0);\r\n        this.scissor = newBoundsFromRect(0, 0, 0, 0);\r\n        this.prefSize = { w: 0, h: 0 };\r\n    }\r\n}\r\n\r\n\r\nexport class Pane {\r\n    private painters: Painter[];\r\n    private consumesInputEvents: boolean;\r\n    private isInside: Mask2D;\r\n\r\n    private _mouseCursor: string;\r\n    private _mouseCursorChanged: Notification;\r\n    private _childMouseCursorListener: Listener;\r\n\r\n    private children: OrderedSet<PaneChild>;\r\n    private _layout: Layout;\r\n    private _viewport: Bounds;\r\n    private _scissor: Bounds;\r\n    private _viewportChanged: Notification;\r\n\r\n    private _dispose: Notification;\r\n\r\n    // Input Handling\r\n    //\r\n\r\n    private _mouseUp: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _mouseDown: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _mouseMove: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _mouseWheel: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _mouseEnter: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _mouseExit: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n    private _contextMenu: Notification1<PointerEvent> = new Notification1<PointerEvent>();\r\n\r\n    constructor(layout: Layout, consumesInputEvents: boolean = true, isInside: Mask2D = alwaysTrue) {\r\n        this.painters = [];\r\n        this.consumesInputEvents = consumesInputEvents;\r\n        this.isInside = isInside;\r\n\r\n        this._mouseCursor = (consumesInputEvents ? 'default' : null);\r\n        this._mouseCursorChanged = new Notification();\r\n        this._childMouseCursorListener = (() => this._mouseCursorChanged.fire());\r\n\r\n        this.children = new OrderedSet<PaneChild>([], (paneChild) => getObjectId(paneChild.pane), false);\r\n        this._layout = layout;\r\n        this._viewport = newBoundsFromRect(0, 0, 0, 0);\r\n        this._scissor = newBoundsFromRect(0, 0, 0, 0);\r\n        this._viewportChanged = new Notification();\r\n\r\n        this._dispose = new Notification();\r\n\r\n        this._dispose.on(() => {\r\n            this._mouseUp.dispose();\r\n            this._mouseDown.dispose();\r\n            this._mouseMove.dispose();\r\n            this._mouseWheel.dispose();\r\n            this._mouseEnter.dispose();\r\n            this._mouseExit.dispose();\r\n            this._contextMenu.dispose();\r\n\r\n            // recursively dispose all child panes\r\n            for (let i = 0; i < this.children.length; i++) {\r\n                this.children.valueAt(i).pane.dispose.fire();\r\n            }\r\n        });\r\n    }\r\n\r\n    get layout(): Layout {\r\n        return this._layout;\r\n    }\r\n\r\n    set layout(layout: Layout) {\r\n        this._layout = layout;\r\n    }\r\n\r\n    get mouseCursor(): string {\r\n        return this._mouseCursor;\r\n    }\r\n\r\n    set mouseCursor(mouseCursor: string) {\r\n        if (mouseCursor !== this._mouseCursor) {\r\n            this._mouseCursor = mouseCursor;\r\n            this._mouseCursorChanged.fire();\r\n        }\r\n    }\r\n\r\n    get mouseCursorChanged(): Notification {\r\n        return this._mouseCursorChanged;\r\n    }\r\n\r\n    addPainter(painter: Painter) {\r\n        this.painters.push(painter);\r\n    }\r\n\r\n    addPane(pane: Pane, layoutArg: any = null, layoutOptions: any = {}) {\r\n        this.children.add(new PaneChild(pane, layoutArg, layoutOptions));\r\n        pane.mouseCursorChanged.on(this._childMouseCursorListener);\r\n    }\r\n\r\n    removePane(pane: Pane) {\r\n        this.children.removeValue(this._childFor(pane));\r\n        pane.mouseCursorChanged.off(this._childMouseCursorListener);\r\n    }\r\n\r\n    layoutArg(pane: Pane): any {\r\n        return this._childFor(pane).layoutArg;\r\n    }\r\n\r\n    setLayoutArg(pane: Pane, layoutArg: any) {\r\n        this._childFor(pane).layoutArg = layoutArg;\r\n    }\r\n\r\n    updateLayoutArgs(updateFn: (layoutArg: any, layoutOptions: any) => any) {\r\n        for (let c = 0; c < this.children.length; c++) {\r\n            const child = this.children.valueAt(c);\r\n            child.layoutArg = updateFn(child.layoutArg, child.layoutOptions);\r\n        }\r\n    }\r\n\r\n    layoutOptions(pane: Pane): any {\r\n        return this._childFor(pane).layoutOptions;\r\n    }\r\n\r\n    private _childFor(pane: Pane): PaneChild {\r\n        return this.children.valueFor(getObjectId(pane));\r\n    }\r\n\r\n\r\n    // Layout & Paint\r\n    //\r\n\r\n    updatePrefSizes(result: Size) {\r\n        // Child panes\r\n        for (let c = 0; c < this.children.length; c++) {\r\n            const child = this.children.valueAt(c);\r\n            child.pane.updatePrefSizes(child.prefSize);\r\n        }\r\n        // This pane\r\n        if (hasval(this._layout) && hasval(this._layout.updatePrefSize)) {\r\n            this._layout.updatePrefSize(result, this.children.toArray());\r\n        }\r\n        else {\r\n            result.w = null;\r\n            result.h = null;\r\n        }\r\n    }\r\n\r\n    updateBounds(viewport: BoundsUnmodifiable, scissor: BoundsUnmodifiable) {\r\n        // This pane\r\n        const viewportChanged = (viewport.iStart !== this._viewport.iStart || viewport.iEnd !== this._viewport.iEnd || viewport.jStart !== this._viewport.jStart || viewport.jEnd !== this._viewport.jEnd);\r\n        this._viewport.setBounds(viewport);\r\n        this._scissor.setBounds(scissor);\r\n        // Child panes\r\n        if (hasval(this._layout) && hasval(this._layout.updateChildViewports)) {\r\n            this._layout.updateChildViewports(this.children.toArray(), viewport);\r\n            for (let c = 0; c < this.children.length; c++) {\r\n                const child = this.children.valueAt(c);\r\n                child.scissor.setBounds(child.viewport.unmod);\r\n                child.scissor.cropToBounds(scissor);\r\n                child.pane.updateBounds(child.viewport.unmod, child.scissor.unmod);\r\n            }\r\n        }\r\n        else if (this.children.length > 0) {\r\n            throw new Error('Pane has ' + this.children.length + ' ' + (this.children.length === 1 ? 'child' : 'children') + ', but its layout is ' + this.layout);\r\n        }\r\n        // Notify\r\n        if (viewportChanged) {\r\n            this._viewportChanged.fire();\r\n        }\r\n    }\r\n\r\n    paint(gl: WebGLRenderingContext) {\r\n        const viewport = this._viewport.unmod;\r\n        const scissor = this._scissor.unmod;\r\n        if (scissor.w > 0 && scissor.h > 0) {\r\n            // This pane\r\n            gl.viewport(viewport.i, viewport.j, viewport.w, viewport.h);\r\n            gl.enable(GL.SCISSOR_TEST);\r\n            gl.scissor(scissor.i, scissor.j, scissor.w, scissor.h);\r\n            for (let p = 0; p < this.painters.length; p++) {\r\n                this.painters[p](gl, viewport);\r\n            }\r\n            // Child panes\r\n            for (let c = 0; c < this.children.length; c++) {\r\n                this.children.valueAt(c).pane.paint(gl);\r\n            }\r\n        }\r\n    }\r\n\r\n    get viewport(): BoundsUnmodifiable {\r\n        return this._viewport.unmod;\r\n    }\r\n\r\n    get scissor(): BoundsUnmodifiable {\r\n        return this._scissor.unmod;\r\n    }\r\n\r\n    get viewportChanged(): Notification {\r\n        return this._viewportChanged;\r\n    }\r\n\r\n    panesAt(i: number, j: number): Pane[] {\r\n        const result: Pane[] = [];\r\n        this._panesAt(i, j, result);\r\n        return result;\r\n    }\r\n\r\n    private _panesAt(i: number, j: number, result: Pane[]): boolean {\r\n        if (this._scissor.contains(i, j)) {\r\n            for (let c = this.children.length - 1; c >= 0; c--) {\r\n                const consumed = this.children.valueAt(c).pane._panesAt(i, j, result);\r\n                if (consumed) {\r\n                    return true;\r\n                }\r\n            }\r\n            if (this.isInside(this._viewport.unmod, i, j)) {\r\n                result.push(this);\r\n                return this.consumesInputEvents;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    get mouseUp(): Notification1<PointerEvent> { return this._mouseUp; }\r\n    get mouseDown(): Notification1<PointerEvent> { return this._mouseDown; }\r\n    get mouseMove(): Notification1<PointerEvent> { return this._mouseMove; }\r\n    get mouseWheel(): Notification1<PointerEvent> { return this._mouseWheel; }\r\n    get mouseEnter(): Notification1<PointerEvent> { return this._mouseEnter; }\r\n    get mouseExit(): Notification1<PointerEvent> { return this._mouseExit; }\r\n    get contextMenu(): Notification1<PointerEvent> { return this._contextMenu; }\r\n\r\n    fireMouseUp(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseUp.fire({ paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireMouseDown(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseDown.fire({ paneViewport: this._viewport.unmod, i: i, j: j, clickCount: clickCount, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireMouseMove(i: number, j: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseMove.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireMouseWheel(i: number, j: number, wheelSteps: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseWheel.fire({ paneViewport: this._viewport.unmod, i: i, j: j, wheelSteps: wheelSteps, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireMouseEnter(i: number, j: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseEnter.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireMouseExit(i: number, j: number, mouseEvent: MouseEvent): any {\r\n        return this._mouseExit.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    fireContextMenu(i: number, j: number, mouseEvent: MouseEvent): any {\r\n        return this._contextMenu.fire({ paneViewport: this._viewport.unmod, i: i, j: j, mouseEvent: mouseEvent });\r\n    }\r\n\r\n    // Disposal\r\n    //\r\n\r\n    get dispose(): Notification {\r\n        return this._dispose;\r\n    }\r\n}\r\n\r\n\r\nexport function requireGL(canvasElement: HTMLCanvasElement): WebGLRenderingContext {\r\n    // Wrapping the getContext calls in try-catch blocks may lose information. However,\r\n    // there are two reasons to do so:\r\n    //\r\n    //   1. We want to try 'experimental-webgl' even if 'webgl' throws an error\r\n    //   2. Throwing a custom error should make it easy to show a helpful message\r\n    //\r\n    // Reason 2 is particularly important on Firefox, where the error thrown by getContext\r\n    // has a completely uninformative message.\r\n    //\r\n\r\n    try {\r\n        const glA = canvasElement.getContext('webgl');\r\n        if (glA) {\r\n            return glA;\r\n        }\r\n    }\r\n    catch (e) { }\r\n\r\n    try {\r\n        const glB = canvasElement.getContext('experimental-webgl') as WebGLRenderingContext;\r\n        if (glB) {\r\n            return glB;\r\n        }\r\n    }\r\n    catch (e) { }\r\n\r\n    throw new Error('WebGLContextCreationError');\r\n}\r\n\r\n\r\nfunction iMouse(element: HTMLElement, ev: MouseEvent): number {\r\n    return (ev.clientX - element.getBoundingClientRect().left);\r\n}\r\n\r\n\r\nfunction jMouse(element: HTMLElement, ev: MouseEvent): number {\r\n    return (element.clientHeight - (ev.clientY - element.getBoundingClientRect().top));\r\n}\r\n\r\n\r\nfunction mouseWheelSteps(ev: WheelEvent): number {\r\n    // MouseWheelEvent.wheelDelta is deprecated, use WheelEvent.deltaY instead.\r\n    // Firefox uses positive values for a downward scroll; everybody else uses positive for upward\r\n    const raw = (ev.deltaY !== undefined ? ev.deltaY : -ev.detail);\r\n    if (raw > 0) { return -1; }\r\n    if (raw < 0) { return +1; }\r\n    return 0;\r\n}\r\n\r\n// Button presses for mouse events are reported differently in different browsers:\r\n// The results below are for the following browser versions:\r\n// Chrome Version 40.0.2214.94 (64-bit)\r\n// Firefox 35.0.1\r\n// IE 11.0.9600.17501\r\n//\r\n// ‘mousemove’ event with left mouse button down:\r\n//\r\n//                        Chrome                Firefox                  IE\r\n// MouseEvent.button      0                     0                        0\r\n// MouseEvent.buttons     1                     1                        1\r\n// MouseEvent.which       1                     1                        1\r\n//\r\n// ‘mousemove’ event with no mouse button down:\r\n//\r\n//                        Chrome                Firefox                  IE\r\n// MouseEvent.button      0                     0                        0\r\n// MouseEvent.buttons     undefined             0                        0\r\n// MouseEvent.which       0                     1                        1\r\n//\r\n//\r\n// For more info see: http://stackoverflow.com/questions/3944122/detect-left-mouse-button-press\r\n//\r\nexport function isLeftMouseDown(ev: MouseEvent) {\r\n    // it appears that ev.buttons works across the board now, so ev.buttons === 1 is probably all that is necessary\r\n    if (ev.buttons !== undefined) {\r\n        return ev.buttons === 1;\r\n    }\r\n    else {\r\n        return ev.which === 1;\r\n    }\r\n}\r\n\r\n// detects whether any mouse button is down\r\nexport function isMouseDown(ev: MouseEvent) {\r\n    return ev.buttons !== 0;\r\n}\r\n\r\nfunction attachEventListeners(element: HTMLElement, contentPane: Pane) {\r\n\r\n    function detectEntersAndExits(oldPanes: Pane[], newPanes: Pane[], i: number, j: number, mouseEvent: MouseEvent) {\r\n        for (let n = 0; n < oldPanes.length; n++) {\r\n            oldPanes[n]['isHovered'] = false;\r\n        }\r\n        for (let n = 0; n < newPanes.length; n++) {\r\n            newPanes[n]['isHovered'] = true;\r\n        }\r\n        for (let n = 0; n < oldPanes.length; n++) {\r\n            const oldPane = oldPanes[n];\r\n            if (!oldPane['isHovered']) {\r\n                oldPane.fireMouseExit(i, j, mouseEvent);\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < newPanes.length; n++) {\r\n            newPanes[n]['wasHovered'] = false;\r\n        }\r\n        for (let n = 0; n < oldPanes.length; n++) {\r\n            oldPanes[n]['wasHovered'] = true;\r\n        }\r\n        for (let n = 0; n < newPanes.length; n++) {\r\n            const newPane = newPanes[n];\r\n            if (!newPane['wasHovered']) {\r\n                newPane.fireMouseEnter(i, j, mouseEvent);\r\n            }\r\n        }\r\n    }\r\n\r\n    // Support for reporting click count. Browsers handle reporting single/double\r\n    // clicks differently, so it's generally not a good idea to use both listeners\r\n    // at one. That's why it's done this way instead of using the 'dblclick' event.\r\n    const multiPressTimeout_MILLIS = 250;\r\n    let prevPress_PMILLIS = 0;\r\n    let clickCount = 1;\r\n\r\n    let currentPanes: Pane[] = [];\r\n    let currentMouseCursor: string = null;\r\n    let dragging = false;\r\n    let pendingExit = false;\r\n\r\n    function refreshMouseCursor() {\r\n        let newMouseCursor = null;\r\n        for (let n = 0; n < currentPanes.length; n++) {\r\n            newMouseCursor = currentPanes[n].mouseCursor;\r\n            if (hasval(newMouseCursor)) {\r\n                break;\r\n            }\r\n        }\r\n        if (!hasval(newMouseCursor)) {\r\n            newMouseCursor = 'default';\r\n        }\r\n        if (newMouseCursor !== currentMouseCursor) {\r\n            element.style.cursor = newMouseCursor;\r\n            currentMouseCursor = newMouseCursor;\r\n        }\r\n    }\r\n    refreshMouseCursor();\r\n    contentPane.mouseCursorChanged.on(refreshMouseCursor);\r\n\r\n\r\n    element.addEventListener('mousedown', function (ev: MouseEvent) {\r\n        const press_PMILLIS = (new Date()).getTime();\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        if (press_PMILLIS - prevPress_PMILLIS < multiPressTimeout_MILLIS) {\r\n            clickCount++;\r\n        }\r\n        else {\r\n            clickCount = 1;\r\n        }\r\n        prevPress_PMILLIS = press_PMILLIS;\r\n\r\n        const newPanes = contentPane.panesAt(i, j);\r\n        detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n        currentPanes = newPanes;\r\n        for (let n = 0; n < currentPanes.length; n++) {\r\n            currentPanes[n].fireMouseDown(i, j, clickCount, ev);\r\n        }\r\n        refreshMouseCursor();\r\n\r\n        dragging = true;\r\n\r\n        // Disable browser-default double-click action, which selects text and messes up subsequent drags\r\n        ev.preventDefault();\r\n    });\r\n\r\n    // Only want NON-DRAG moves from the canvas (e.g. we don't want moves that occur in an overlay div) -- so subscribe to CANVAS's mousemove\r\n    element.addEventListener('mousemove', function (ev: MouseEvent) {\r\n        if (!dragging) {\r\n            const i = iMouse(element, ev);\r\n            const j = jMouse(element, ev);\r\n\r\n            const newPanes = contentPane.panesAt(i, j);\r\n            detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n            currentPanes = newPanes;\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n            refreshMouseCursor();\r\n        }\r\n    });\r\n\r\n    // During a DRAG we want all move events, even ones that occur outside the canvas -- so subscribe to WINDOW's mousemove\r\n    window.addEventListener('mousemove', function (ev: MouseEvent) {\r\n        if (dragging) {\r\n            const i = iMouse(element, ev);\r\n            const j = jMouse(element, ev);\r\n\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n        }\r\n    });\r\n\r\n    element.addEventListener('mouseout', function (ev: MouseEvent) {\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        if (dragging) {\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n            pendingExit = true;\r\n        }\r\n        else {\r\n            detectEntersAndExits(currentPanes, [], i, j, ev);\r\n            currentPanes = [];\r\n            refreshMouseCursor();\r\n        }\r\n    });\r\n\r\n    element.addEventListener('mouseover', function (ev: MouseEvent) {\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        if (dragging) {\r\n            pendingExit = false;\r\n        }\r\n        else {\r\n            const newPanes = contentPane.panesAt(i, j);\r\n            detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n            currentPanes = newPanes;\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n            refreshMouseCursor();\r\n        }\r\n    });\r\n\r\n    const endDrag = function (ev: MouseEvent) {\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        for (let n = 0; n < currentPanes.length; n++) {\r\n            currentPanes[n].fireMouseUp(i, j, clickCount, ev);\r\n        }\r\n\r\n        dragging = false;\r\n\r\n        if (pendingExit) {\r\n            detectEntersAndExits(currentPanes, [], i, j, ev);\r\n            currentPanes = [];\r\n            pendingExit = false;\r\n            refreshMouseCursor();\r\n        }\r\n        else {\r\n            const newPanes = contentPane.panesAt(i, j);\r\n            detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n            currentPanes = newPanes;\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n            refreshMouseCursor();\r\n        }\r\n    };\r\n\r\n    // The window always gets the mouse-up event at the end of a drag -- even if it occurs outside the browser window\r\n    window.addEventListener('mouseup', function (ev: MouseEvent) {\r\n        if (dragging) {\r\n            endDrag(ev);\r\n        }\r\n    });\r\n\r\n    // We don't receive mouse events that happen over another iframe -- even during a drag. If we miss a mouseup that\r\n    // should terminate a drag, we end up stuck in dragging mode, which makes for a really lousy user experience. To\r\n    // avoid that, whenever the mouse moves, check whether the button is down. If we're still in dragging mode, but\r\n    // the button is now up, end the drag.\r\n\r\n    // If we're dragging, and we see a mousemove with no buttons down, end the drag\r\n    let recentDrag: MouseEvent = null;\r\n    const handleMissedMouseUp = function (ev: MouseEvent) {\r\n        if (dragging) {\r\n            if (!isMouseDown(ev) && recentDrag) {\r\n                const mouseUp = <MouseEvent>document.createEvent('MouseEvents');\r\n                mouseUp.initMouseEvent('mouseup', true, true, window, 0, recentDrag.screenX, recentDrag.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, recentDrag.ctrlKey, recentDrag.altKey, recentDrag.shiftKey, recentDrag.metaKey, 0, null);\r\n                endDrag(mouseUp);\r\n            }\r\n            recentDrag = ev;\r\n        }\r\n    };\r\n    window.addEventListener('mousemove', handleMissedMouseUp);\r\n    let w = window;\r\n    while (w.parent !== w) {\r\n        try {\r\n            w.parent.addEventListener('mousemove', handleMissedMouseUp);\r\n            w = w.parent as Window & typeof globalThis;\r\n        }\r\n        catch (e) {\r\n            // Cross-origin security may prevent us from adding a listener to a window other than our own -- in that case,\r\n            // the least bad option is to terminate drags on exit from the highest accessible window\r\n            w.addEventListener('mouseout', function (ev: MouseEvent) {\r\n                if (dragging) {\r\n                    const mouseUp = <MouseEvent>document.createEvent('MouseEvents');\r\n                    mouseUp.initMouseEvent('mouseup', true, true, window, 0, ev.screenX, ev.screenY, ev.screenX - window.screenX, ev.screenY - window.screenY, ev.ctrlKey, ev.altKey, ev.shiftKey, ev.metaKey, 0, null);\r\n                    endDrag(mouseUp);\r\n                }\r\n            });\r\n            break;\r\n        }\r\n    }\r\n\r\n\r\n    const handleMouseWheel = function (ev: WheelEvent) {\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        if (dragging) {\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n        }\r\n        else {\r\n            const newPanes = contentPane.panesAt(i, j);\r\n            detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n            currentPanes = newPanes;\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n        }\r\n\r\n        const wheelSteps = mouseWheelSteps(ev);\r\n        for (let n = 0; n < currentPanes.length; n++) {\r\n            currentPanes[n].fireMouseWheel(i, j, wheelSteps, ev);\r\n        }\r\n    };\r\n    element.addEventListener('wheel', handleMouseWheel);\r\n\r\n    element.addEventListener('contextmenu', function (ev: MouseEvent) {\r\n        const i = iMouse(element, ev);\r\n        const j = jMouse(element, ev);\r\n\r\n        if (dragging) {\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n        }\r\n        else {\r\n            const newPanes = contentPane.panesAt(i, j);\r\n            detectEntersAndExits(currentPanes, newPanes, i, j, ev);\r\n            currentPanes = newPanes;\r\n            for (let n = 0; n < currentPanes.length; n++) {\r\n                currentPanes[n].fireMouseMove(i, j, ev);\r\n            }\r\n            refreshMouseCursor();\r\n        }\r\n\r\n        for (let n = 0; n < currentPanes.length; n++) {\r\n            currentPanes[n].fireContextMenu(i, j, ev);\r\n        }\r\n\r\n        // Disable browser-default context menu\r\n        ev.preventDefault();\r\n    });\r\n}\r\n\r\n\r\nexport interface Drawable {\r\n    setContentPane(pane: Pane): void;\r\n    redraw(): void;\r\n\r\n    getPrefSize(): Size;\r\n    prefSizeChanged(): Notification1<Size>;\r\n}\r\n\r\n\r\nexport function newDrawable(canvas: HTMLCanvasElement): Drawable {\r\n    let contentPane: Pane = null;\r\n    const contentPrefSizeNotification = new Notification1<Size>();\r\n    const contentPrefSize = { w: <number>null, h: <number>null };\r\n    const contentViewport = newBoundsFromRect(0, 0, 0, 0);\r\n    const gl = requireGL(canvas);\r\n    let pendingRequestId = <number>null;\r\n    return {\r\n        setContentPane: function (pane: Pane) {\r\n            if (hasval(contentPane)) {\r\n                // XXX: Detach listeners from old contentPane\r\n            }\r\n            contentPane = pane;\r\n            attachEventListeners(canvas, contentPane);\r\n        },\r\n        redraw: function () {\r\n            if (!hasval(pendingRequestId)) {\r\n                pendingRequestId = window.requestAnimationFrame(function () {\r\n                    let oldPrefSize = { w: <number>null, h: <number>null };\r\n                    if (hasval(contentPane)) {\r\n\r\n                        oldPrefSize = { w: contentPrefSize.w, h: contentPrefSize.h };\r\n\r\n                        contentPane.updatePrefSizes(contentPrefSize);\r\n                        contentViewport.setRect(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\r\n                        contentPane.updateBounds(contentViewport.unmod, contentViewport.unmod);\r\n                        contentPane.paint(gl);\r\n\r\n                        // XXX: Trigger an enter/exit check somehow (fake a mouse-event?)\r\n                    }\r\n                    pendingRequestId = null;\r\n\r\n                    if (oldPrefSize.w !== contentPrefSize.w || oldPrefSize.h !== contentPrefSize.h) {\r\n                        contentPrefSizeNotification.fire({ w: contentPrefSize.w, h: contentPrefSize.h });\r\n                    }\r\n                });\r\n            }\r\n        },\r\n        getPrefSize: function () {\r\n            return { w: contentPrefSize.w, h: contentPrefSize.h };\r\n        },\r\n        prefSizeChanged: function (): Notification1<Size> {\r\n            return contentPrefSizeNotification;\r\n        }\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Painter, Pane } from './core';\r\nimport { BoundsUnmodifiable, Size } from './bounds';\r\nimport { Color, sameColor } from './color';\r\nimport { Program, UniformColor, Attribute, Uniform1f } from './shader';\r\nimport { newDynamicBuffer, DynamicBuffer } from './buffer';\r\nimport { GL, concatLines, hasval } from './util/util';\r\nimport { Texture2D, TextureDrawOptions, TextureRenderer } from './texture';\r\nimport { Notification } from './util/notification';\r\n\r\nexport function newGroupPainter(...painters: Painter[]): Painter {\r\n    return <Painter>function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable): void {\r\n        for (let n = 0; n < painters.length; n++) {\r\n            painters[n](gl, viewport);\r\n        }\r\n    };\r\n}\r\n\r\n\r\nexport function newBlendingBackgroundPainter(color: Color): Painter {\r\n\r\n    const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const a_XyNdc = new Attribute(program, 'a_XyNdc');\r\n\r\n    const numVertices = 4;\r\n    const xy_NDC = new Float32Array(2 * numVertices);\r\n    const xyBuffer_NDC = newDynamicBuffer();\r\n\r\n    return <Painter>function (gl: WebGLRenderingContext): void {\r\n        if (color.a >= 1) {\r\n            gl.disable(GL.BLEND);\r\n        }\r\n        else {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n        }\r\n\r\n        program.use(gl);\r\n        u_Color.setData(gl, color);\r\n\r\n        xy_NDC[0] = -1;\r\n        xy_NDC[1] = 1;\r\n        xy_NDC[2] = -1;\r\n        xy_NDC[3] = -1;\r\n        xy_NDC[4] = 1;\r\n        xy_NDC[5] = 1;\r\n        xy_NDC[6] = 1;\r\n        xy_NDC[7] = -1;\r\n\r\n        xyBuffer_NDC.setData(xy_NDC);\r\n        a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT);\r\n\r\n        gl.drawArrays(GL.TRIANGLE_STRIP, 0, numVertices);\r\n\r\n        a_XyNdc.disable(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\nexport class Highlight {\r\n\r\n    private _color: Color;\r\n    private _dashPattern = 0xFFFF;\r\n    private _dashLength = 16;\r\n\r\n    program = new Program(xyNdc_VERTSHADER, dash2_FRAGSHADER);\r\n    u_Color = new UniformColor(this.program, 'u_Color');\r\n    a_XyNdc = new Attribute(this.program, 'a_XyNdc');\r\n    u_yOffset = new Uniform1f(this.program, 'u_yOffset');\r\n    u_DashPattern = new Uniform1f(this.program, 'u_DashPattern');\r\n    u_DashLength = new Uniform1f(this.program, 'u_DashLength');\r\n\r\n    numVertices = 4;\r\n    xy_NDC = new Float32Array(2 * this.numVertices);\r\n    xyBuffer_NDC: DynamicBuffer = newDynamicBuffer();\r\n\r\n    constructor(color?: Color) {\r\n        this._color = color;\r\n    }\r\n\r\n    get color(): Color {\r\n        return this._color;\r\n    }\r\n\r\n    set color(color: Color) {\r\n        if (!sameColor(this._color, color)) {\r\n            this._color = color;\r\n        }\r\n    }\r\n\r\n    get dashPattern(): number {\r\n        return this._dashPattern;\r\n    }\r\n\r\n    set dashPattern(pattern: number) {\r\n        this._dashPattern = pattern;\r\n    }\r\n\r\n    get dashLength(): number {\r\n        return this._dashLength;\r\n    }\r\n\r\n    set dashLength(length: number) {\r\n        this._dashLength = length;\r\n    }\r\n\r\n    newPainter() {\r\n        return (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => {\r\n            if (this.color.a >= 1) {\r\n                gl.disable(GL.BLEND);\r\n            }\r\n            else {\r\n                gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n                gl.enable(GL.BLEND);\r\n            }\r\n\r\n            this.program.use(gl);\r\n            this.u_Color.setData(gl, this.color);\r\n            this.u_DashPattern.setData(gl, this._dashPattern);\r\n            this.u_DashLength.setData(gl, this._dashLength);\r\n            this.u_yOffset.setData(gl, viewport.j + viewport.h);\r\n\r\n            this.xy_NDC[0] = -1;\r\n            this.xy_NDC[1] = 1;\r\n            this.xy_NDC[2] = -1;\r\n            this.xy_NDC[3] = -1;\r\n            this.xy_NDC[4] = 1;\r\n            this.xy_NDC[5] = 1;\r\n            this.xy_NDC[6] = 1;\r\n            this.xy_NDC[7] = -1;\r\n\r\n            this.xyBuffer_NDC.setData(this.xy_NDC);\r\n            this.a_XyNdc.setDataAndEnable(gl, this.xyBuffer_NDC, 2, GL.FLOAT);\r\n\r\n            gl.drawArrays(GL.TRIANGLE_STRIP, 0, this.numVertices);\r\n\r\n            this.a_XyNdc.disable(gl);\r\n            this.program.endUse(gl);\r\n        };\r\n    }\r\n}\r\n\r\nexport class Background {\r\n\r\n    private _color: Color;\r\n\r\n    constructor(color?: Color) {\r\n        this._color = color;\r\n    }\r\n\r\n    get color(): Color {\r\n        return this._color;\r\n    }\r\n\r\n    set color(color: Color) {\r\n        if (!sameColor(this._color, color)) {\r\n            this._color = color;\r\n        }\r\n    }\r\n\r\n    newPainter() {\r\n        const background: Background = this;\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            if (hasval(background.color)) {\r\n                gl.clearColor(background.color.r, background.color.g, background.color.b, background.color.a);\r\n                gl.clear(GL.COLOR_BUFFER_BIT);\r\n            }\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport function newBackgroundPainter(color: Color): Painter {\r\n    return function (gl: WebGLRenderingContext) {\r\n        gl.clearColor(color.r, color.g, color.b, color.a);\r\n        gl.clear(GL.COLOR_BUFFER_BIT);\r\n    };\r\n}\r\n\r\n\r\nexport function newTexturePainter(texture: Texture2D, xFrac: number, yFrac: number, options: TextureDrawOptions) {\r\n    const textureRenderer = new TextureRenderer();\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        textureRenderer.begin(gl, viewport);\r\n        textureRenderer.draw(gl, texture, xFrac, yFrac, options);\r\n        textureRenderer.end(gl);\r\n    };\r\n}\r\n\r\n\r\nexport function newSolidPane(color: Color): Pane {\r\n    const pane = new Pane(null);\r\n    pane.addPainter(newBackgroundPainter(color));\r\n    return pane;\r\n}\r\n\r\n\r\nexport function fitToTexture(texture: Texture2D) {\r\n    return function (parentPrefSize: Size) {\r\n        parentPrefSize.w = texture.w;\r\n        parentPrefSize.h = texture.h;\r\n    };\r\n}\r\n\r\n\r\nexport function fixedSize(w: number, h: number) {\r\n    return function (parentPrefSize: Size) {\r\n        parentPrefSize.w = w;\r\n        parentPrefSize.h = h;\r\n    };\r\n}\r\n\r\n\r\n/**\r\n * Takes (x,y) in NDC (Normalized Device Coords), in attribute a_XyNdc\r\n */\r\nexport let xyNdc_VERTSHADER = concatLines(\r\n    '                                                ',\r\n    '  attribute vec2 a_XyNdc;                       ',\r\n    '                                                ',\r\n    '  void main( ) {                                ',\r\n    '      gl_Position = vec4( a_XyNdc, 0.0, 1.0 );  ',\r\n    '  }                                             ',\r\n    '                                                '\r\n);\r\n\r\n\r\n/**\r\n * Takes (x,y) as fractions of the viewport, in attribute a_XyFrac\r\n */\r\nexport let xyFrac_VERTSHADER = concatLines(\r\n    '                                                                ',\r\n    '  attribute vec2 a_XyFrac;                                      ',\r\n    '                                                                ',\r\n    '  void main( ) {                                                ',\r\n    '      gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 );  ',\r\n    '  }                                                             ',\r\n    '                                                                '\r\n);\r\n\r\n\r\nexport let solid_FRAGSHADER = concatLines(\r\n    '                               ',\r\n    '  precision lowp float;        ',\r\n    '  uniform vec4 u_Color;        ',\r\n    '                               ',\r\n    '  void main( ) {               ',\r\n    '      gl_FragColor = u_Color;  ',\r\n    '  }                            ',\r\n    '                               '\r\n);\r\n\r\n\r\nexport let dash_FRAGSHADER = concatLines(\r\n    '  precision highp float;                                   ',\r\n    '  uniform mat4 u_modelViewMatrix;                          ',\r\n    '  varying float v_Distance;                                ',\r\n    '  uniform float u_Dash;                                    ',\r\n    '  uniform vec4 u_Color;                                    ',\r\n    '                                                           ',\r\n    '  void main( ) {                                           ',\r\n    '      float v = floor(2.0 * fract(v_Distance * (u_Dash * (10.0 * u_modelViewMatrix[0][0]))));   ',\r\n    '      if(v > 0.5)                                          ',\r\n    '          discard;                                         ',\r\n    '      else                                                 ',\r\n    '          gl_FragColor = u_Color;                          ',\r\n    '  }                                                        ',\r\n    '                                                           '\r\n);\r\n\r\nexport let dash2_FRAGSHADER = concatLines(\r\n    '  precision highp float;                                                        ',\r\n    '  uniform float u_DashLength;                                                   ',\r\n    '  uniform float u_DashPattern;                                                  ',\r\n    '  uniform float u_yOffset;                                                      ',\r\n    '  uniform vec4 u_Color;                                                         ',\r\n    '  const float maskLength = 16.0;                                                ',\r\n    '                                                                                ',\r\n    '  void main( ) {                                                                ',\r\n    '      float dashPosition = fract((gl_FragCoord.y - u_yOffset) / u_DashLength);  ',\r\n    '      float maskIndex = floor(dashPosition * maskLength);                       ',\r\n    '      float maskTest = floor(u_DashPattern / pow(2.0, maskIndex));              ',\r\n    '                                                                                ',\r\n    '      if(mod(maskTest, 2.0) < 1.0)                                              ',\r\n    '          discard;                                                              ',\r\n    '      else                                                                      ',\r\n    '      gl_FragColor = u_Color;                                                   ',\r\n    '  }                                                                             ',\r\n    '                                                                                '\r\n);\r\n\r\nexport let varyingColor_FRAGSHADER = concatLines(\r\n    '                               ',\r\n    '  precision lowp float;        ',\r\n    '  varying vec4 v_Color;        ',\r\n    '                               ',\r\n    '  void main( ) {               ',\r\n    '      gl_FragColor = v_Color;  ',\r\n    '  }                            ',\r\n    '                               '\r\n);\r\n\r\n\r\nexport let modelview_VERTSHADER = concatLines(\r\n    '    uniform mat4 u_modelViewMatrix;                       ',\r\n    '    attribute vec4 a_Position;                            ',\r\n    '                                                          ',\r\n    '    void main( ) {                                        ',\r\n    '        gl_Position = u_modelViewMatrix * a_Position ;    ',\r\n    '    }                                                     ',\r\n    '                                                          '\r\n);\r\n\r\n\r\nexport let nearestPixelCenter_GLSLFUNC = concatLines(\r\n    '                                                                    ',\r\n    '  float nearestPixelCenter( float frac, float pixelSize ) {         ',\r\n    '      return ( floor( frac*pixelSize + 1e-4 ) + 0.5 ) / pixelSize;  ',\r\n    '  }                                                                 ',\r\n    '                                                                    '\r\n);\r\n\r\n\r\nexport enum Side {\r\n    TOP, BOTTOM, RIGHT, LEFT\r\n}\r\n\r\n\r\n/**\r\n * Converts viewport-fraction to NDC (Normalized Device Coords)\r\n */\r\nexport function fracToNdc(frac: number): number {\r\n    return -1 + 2 * frac;\r\n}\r\n\r\n\r\nexport function nearestPixel(viewportFrac: number, viewportSize: number, imageAnchor: number, imageSize: number): number {\r\n    const anchor = (imageAnchor * imageSize) % 1.0;\r\n    return (Math.floor(viewportFrac * viewportSize - anchor + 0.5 + 1e-4) + anchor) / viewportSize;\r\n}\r\n\r\n\r\nexport function putQuadXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number {\r\n    let n = index;\r\n    n = putUpperLeftTriangleXys(xys, n, xLeft, xRight, yTop, yBottom);\r\n    n = putLowerRightTriangleXys(xys, n, xLeft, xRight, yTop, yBottom);\r\n    return n;\r\n}\r\n\r\n\r\nexport function putUpperLeftTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number {\r\n    let n = index;\r\n    xys[n++] = xLeft; xys[n++] = yTop;\r\n    xys[n++] = xRight; xys[n++] = yTop;\r\n    xys[n++] = xLeft; xys[n++] = yBottom;\r\n    return n;\r\n}\r\n\r\n\r\nexport function putLowerRightTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number {\r\n    let n = index;\r\n    xys[n++] = xLeft; xys[n++] = yBottom;\r\n    xys[n++] = xRight; xys[n++] = yTop;\r\n    xys[n++] = xRight; xys[n++] = yBottom;\r\n    return n;\r\n}\r\n\r\n\r\nexport function putUpperRightTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number {\r\n    let n = index;\r\n    xys[n++] = xLeft; xys[n++] = yTop;\r\n    xys[n++] = xRight; xys[n++] = yTop;\r\n    xys[n++] = xRight; xys[n++] = yBottom;\r\n    return n;\r\n}\r\n\r\n\r\nexport function putLowerLeftTriangleXys(xys: Float32Array, index: number, xLeft: number, xRight: number, yTop: number, yBottom: number): number {\r\n    let n = index;\r\n    xys[n++] = xLeft; xys[n++] = yBottom;\r\n    xys[n++] = xLeft; xys[n++] = yTop;\r\n    xys[n++] = xRight; xys[n++] = yBottom;\r\n    return n;\r\n}\r\n\r\n\r\nexport function putQuadRgbas(rgbas: Float32Array, index: number, color: Color): number {\r\n    return putRgbas(rgbas, index, color, 6);\r\n}\r\n\r\n\r\nexport function putRgbas(rgbas: Float32Array, index: number, color: Color, count: number): number {\r\n    let n = index;\r\n    for (let v = 0; v < count; v++) {\r\n        rgbas[n++] = color.r; rgbas[n++] = color.g; rgbas[n++] = color.b; rgbas[n++] = color.a;\r\n    }\r\n    return n;\r\n}\r\n\r\n\r\nexport function clearSelection() {\r\n    const selection = window.getSelection();\r\n    if (selection) {\r\n        if (selection['removeAllRanges']) {\r\n            selection['removeAllRanges']();\r\n        }\r\n        else if (selection['empty']) {\r\n            selection['empty']();\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class SimpleModel<V> {\r\n    private _value: V;\r\n    private _changed: Notification;\r\n\r\n    constructor(value: V = null) {\r\n        this._value = value;\r\n        this._changed = new Notification();\r\n    }\r\n\r\n    get value(): V { return this._value; }\r\n    get changed(): Notification { return this._changed; }\r\n\r\n    set value(value: V) {\r\n        if (value !== this._value) {\r\n            this._value = value;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class XyModel {\r\n    private _x: number;\r\n    private _y: number;\r\n    private _changed: Notification;\r\n\r\n    constructor(x?: number, y?: number) {\r\n        this._x = x;\r\n        this._y = y;\r\n        this._changed = new Notification();\r\n    }\r\n\r\n    get x(): number { return this._x; }\r\n    get y(): number { return this._y; }\r\n    get changed(): Notification { return this._changed; }\r\n\r\n    set x(x: number) {\r\n        if (x !== this._x) {\r\n            this._x = x;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    set y(y: number) {\r\n        if (y !== this._y) {\r\n            this._y = y;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    setXy(x: number, y: number) {\r\n        if (x !== this._x || y !== this._y) {\r\n            this._x = x;\r\n            this._y = y;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { StringMap, GL, concatLines, getObjectId, hasval } from './util/util';\r\nimport { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './shader';\r\nimport { Buffer, newStaticBuffer } from './buffer';\r\nimport { BoundsUnmodifiable } from './bounds';\r\nimport { nearestPixel } from './misc';\r\n\r\nclass TextureEntry {\r\n    gl: WebGLRenderingContext;\r\n    target: number;\r\n    texture: WebGLTexture;\r\n    textureUnit: number;\r\n\r\n    constructor(gl: WebGLRenderingContext, target: number, texture: WebGLTexture) {\r\n        this.gl = gl;\r\n        this.target = target;\r\n        this.texture = texture;\r\n        this.textureUnit = -1;\r\n    }\r\n}\r\n\r\n\r\nexport interface TextureHelper {\r\n    target(gl: WebGLRenderingContext): number;\r\n    init(gl: WebGLRenderingContext, target: number): void;\r\n}\r\n\r\n\r\nexport class Texture {\r\n    private helper: TextureHelper;\r\n    private textures: StringMap<TextureEntry>;\r\n\r\n    constructor(helper: TextureHelper) {\r\n        this.helper = helper;\r\n        this.textures = {};\r\n    }\r\n\r\n    bind(gl: WebGLRenderingContext, textureUnit: number) {\r\n        const glId = getObjectId(gl);\r\n        if (hasval(this.textures[glId])) {\r\n            const en = this.textures[glId];\r\n            gl.activeTexture(GL.TEXTURE0 + textureUnit);\r\n            gl.bindTexture(en.target, en.texture);\r\n            en.textureUnit = textureUnit;\r\n        }\r\n        else {\r\n            const target = this.helper.target(gl);\r\n            const texture = gl.createTexture();\r\n            if (!hasval(texture)) {\r\n                throw new Error('Failed to create texture');\r\n            }\r\n            this.textures[glId] = new TextureEntry(gl, target, texture);\r\n\r\n            const en = this.textures[glId];\r\n            gl.activeTexture(GL.TEXTURE0 + textureUnit);\r\n            gl.bindTexture(en.target, en.texture);\r\n            en.textureUnit = textureUnit;\r\n\r\n            this.helper.init(gl, target);\r\n        }\r\n    }\r\n\r\n    unbind(gl: WebGLRenderingContext) {\r\n        const glId = getObjectId(gl);\r\n        if (hasval(this.textures[glId])) {\r\n            const en = this.textures[glId];\r\n            gl.activeTexture(GL.TEXTURE0 + en.textureUnit);\r\n            gl.bindTexture(en.target, null);\r\n            en.textureUnit = -1;\r\n        }\r\n    }\r\n\r\n    dispose() {\r\n        // XXX: Not sure this actually works ... may have to make each gl current or something\r\n        for (const glid in this.textures) {\r\n            if (this.textures.hasOwnProperty(glid)) {\r\n                const en = this.textures[glid];\r\n                en.gl.deleteTexture(en.texture);\r\n            }\r\n        }\r\n        this.textures = {};\r\n    }\r\n}\r\n\r\n\r\nexport type ImageDrawer = (context: CanvasRenderingContext2D) => void;\r\n\r\nexport class FloatDataTexture2D extends Texture {\r\n    private _w: number;\r\n    private _h: number;\r\n\r\n    get w(): number { return this._w; }\r\n    get h(): number { return this._h; }\r\n\r\n    constructor(w: number, h: number, array: Float32Array) {\r\n        super({\r\n            target: function (gl: WebGLRenderingContext): number {\r\n                return GL.TEXTURE_2D;\r\n            },\r\n            init: function (gl: WebGLRenderingContext, target: number) {\r\n\r\n                if (!gl.getExtension('OES_texture_float')) {\r\n                    throw new Error('OES_texture_float extension is required');\r\n                }\r\n\r\n                gl.texParameteri(target, GL.TEXTURE_MAG_FILTER, GL.NEAREST);\r\n                gl.texParameteri(target, GL.TEXTURE_MIN_FILTER, GL.NEAREST);\r\n                gl.texParameteri(target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE);\r\n                gl.texParameteri(target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE);\r\n\r\n                // GL.LUMINANCE isn't supported with GL.FLOAT\r\n                gl.texImage2D(target, 0, GL.RGBA, w, h, 0, GL.RGBA, GL.FLOAT, array);\r\n            }\r\n        });\r\n\r\n        this._w = w;\r\n        this._h = h;\r\n    }\r\n}\r\n\r\nexport class Texture2D extends Texture {\r\n    private _w: number;\r\n    private _h: number;\r\n\r\n    get w(): number { return this._w; }\r\n    get h(): number { return this._h; }\r\n\r\n    constructor(w: number, h: number, minFilter: number, magFilter: number, draw: ImageDrawer) {\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = w;\r\n        canvas.height = h;\r\n        draw(canvas.getContext('2d'));\r\n\r\n        super({\r\n            target: function (gl: WebGLRenderingContext): number {\r\n                return GL.TEXTURE_2D;\r\n            },\r\n            init: function (gl: WebGLRenderingContext, target: number) {\r\n                gl.texParameteri(target, GL.TEXTURE_MAG_FILTER, magFilter);\r\n                gl.texParameteri(target, GL.TEXTURE_MIN_FILTER, minFilter);\r\n                gl.texParameteri(target, GL.TEXTURE_WRAP_S, GL.CLAMP_TO_EDGE);\r\n                gl.texParameteri(target, GL.TEXTURE_WRAP_T, GL.CLAMP_TO_EDGE);\r\n                gl.texImage2D(target, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, canvas);\r\n            }\r\n        });\r\n\r\n        this._w = w;\r\n        this._h = h;\r\n    }\r\n}\r\n\r\n\r\nexport interface TextureDrawOptions {\r\n    xAnchor?: number;\r\n    yAnchor?: number;\r\n    rotation_CCWRAD?: number;\r\n    width?: number;\r\n    height?: number;\r\n}\r\n\r\n\r\nexport class TextureRenderer {\r\n\r\n    private textureRenderer_VERTSHADER = concatLines(\r\n        '                                                                                                                 ',\r\n        '  uniform vec2 u_XyFrac;                                                                                         ',\r\n        '  uniform vec2 u_Anchor;                                                                                         ',\r\n        '  uniform float u_Rotation_CCWRAD;                                                                               ',\r\n        '  uniform vec2 u_ImageSize;                                                                                      ',\r\n        '  uniform vec2 u_ViewportSize;                                                                                   ',\r\n        '                                                                                                                 ',\r\n        '  attribute vec2 a_ImageFrac;                                                                                    ',\r\n        '                                                                                                                 ',\r\n        '  varying vec2 v_StCoord;                                                                                        ',\r\n        '                                                                                                                 ',\r\n        '  void main( ) {                                                                                                 ',\r\n        '      float cosRot = cos( u_Rotation_CCWRAD );                                                                   ',\r\n        '      float sinRot = sin( u_Rotation_CCWRAD );                                                                   ',\r\n        '                                                                                                                 ',\r\n        '      // Column major                                                                                            ',\r\n        '      mat2 rotation = mat2( cosRot, sinRot,                                                                      ',\r\n        '                           -sinRot, cosRot );                                                                    ',\r\n        '                                                                                                                 ',\r\n        '      vec2 xy = -1.0 + 2.0*( u_XyFrac + rotation*( u_ImageSize*( a_ImageFrac - u_Anchor ) ) / u_ViewportSize );  ',\r\n        '      gl_Position = vec4( xy, 0.0, 1.0 );                                                                        ',\r\n        '                                                                                                                 ',\r\n        '      v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y );                                                    ',\r\n        '  }                                                                                                              ',\r\n        '                                                                                                                 '\r\n    );\r\n\r\n    private textureRenderer_FRAGSHADER = concatLines(\r\n        '                                                         ',\r\n        '  precision mediump float;                               ',\r\n        '                                                         ',\r\n        '  uniform sampler2D u_Sampler;                           ',\r\n        '                                                         ',\r\n        '  varying vec2 v_StCoord;                                ',\r\n        '                                                         ',\r\n        '  void main( ) {                                         ',\r\n        '      gl_FragColor = texture2D( u_Sampler, v_StCoord );  ',\r\n        '  }                                                      ',\r\n        '                                                         '\r\n    );\r\n\r\n\r\n    private program: Program;\r\n    private u_XyFrac: Uniform2f;\r\n    private u_Anchor: Uniform2f;\r\n    private u_Rotation_CCWRAD: Uniform1f;\r\n    private u_ImageSize: Uniform2f;\r\n    private u_ViewportSize: Uniform2f;\r\n    private u_Sampler: UniformSampler2D;\r\n\r\n    private a_ImageFrac: Attribute;\r\n\r\n    private imageFracData: Buffer;\r\n\r\n    private wViewport: number;\r\n    private hViewport: number;\r\n\r\n\r\n    constructor() {\r\n        this.program = new Program(this.textureRenderer_VERTSHADER, this.textureRenderer_FRAGSHADER);\r\n        this.u_XyFrac = new Uniform2f(this.program, 'u_XyFrac');\r\n        this.u_Anchor = new Uniform2f(this.program, 'u_Anchor');\r\n        this.u_Rotation_CCWRAD = new Uniform1f(this.program, 'u_Rotation_CCWRAD');\r\n        this.u_ImageSize = new Uniform2f(this.program, 'u_ImageSize');\r\n        this.u_ViewportSize = new Uniform2f(this.program, 'u_ViewportSize');\r\n        this.u_Sampler = new UniformSampler2D(this.program, 'u_Sampler');\r\n\r\n        this.a_ImageFrac = new Attribute(this.program, 'a_ImageFrac');\r\n        this.imageFracData = newStaticBuffer(new Float32Array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]));\r\n\r\n        this.wViewport = 0;\r\n        this.hViewport = 0;\r\n    }\r\n\r\n    begin(gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n        gl.enable(GL.BLEND);\r\n\r\n        this.program.use(gl);\r\n        this.u_ViewportSize.setData(gl, viewport.w, viewport.h);\r\n        this.a_ImageFrac.setDataAndEnable(gl, this.imageFracData, 2, GL.FLOAT);\r\n\r\n        this.wViewport = viewport.w;\r\n        this.hViewport = viewport.h;\r\n    }\r\n\r\n    draw(gl: WebGLRenderingContext, texture: Texture2D, xFrac: number, yFrac: number, options?: TextureDrawOptions) {\r\n        const xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5);\r\n        const yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5);\r\n        const rotation_CCWRAD = (hasval(options) && hasval(options.rotation_CCWRAD) ? options.rotation_CCWRAD : 0);\r\n        const width = (hasval(options) && hasval(options.width) ? options.width : texture.w);\r\n        const height = (hasval(options) && hasval(options.height) ? options.height : texture.h);\r\n\r\n        this.u_XyFrac.setData(gl, nearestPixel(xFrac, this.wViewport, xAnchor, texture.w), nearestPixel(yFrac, this.hViewport, yAnchor, texture.h));\r\n        this.u_Anchor.setData(gl, xAnchor, yAnchor);\r\n        this.u_Rotation_CCWRAD.setData(gl, rotation_CCWRAD);\r\n        this.u_ImageSize.setData(gl, width, height);\r\n        this.u_Sampler.setDataAndBind(gl, 0, texture);\r\n        gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);\r\n    }\r\n\r\n    end(gl: WebGLRenderingContext) {\r\n        this.a_ImageFrac.disable(gl);\r\n        this.u_Sampler.unbind(gl);\r\n        this.program.endUse(gl);\r\n    }\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Cache } from './util/cache';\r\nimport { Texture2D, ImageDrawer } from './texture';\r\nimport { Color, black, parseRgba } from './color';\r\nimport { TwoKeyCache, ThreeKeyCache, SixKeyCache } from './util/multikey_cache';\r\nimport { GL, concatLines, hasval } from './util/util';\r\nimport { Program, Uniform2f, Uniform1f, UniformSampler2D, Attribute } from './shader';\r\nimport { Buffer, newStaticBuffer } from './buffer';\r\nimport { BoundsUnmodifiable } from './bounds';\r\nimport { nearestPixel } from './misc';\r\n\r\ninterface Dim2D {\r\n    w: number;\r\n    h: number;\r\n}\r\n\r\n\r\nconst textDim = (function () {\r\n    // Use div to figure out how big our texture needs to be\r\n    const div = document.createElement('div');\r\n    div.style.setProperty('position', 'absolute');\r\n    div.style.setProperty('padding', '0');\r\n    div.style.setProperty('margin', '0');\r\n    div.style.setProperty('width', 'auto');\r\n    div.style.setProperty('height', 'auto');\r\n    div.style.setProperty('visibility', 'hidden');\r\n\r\n    return function (s: string, font: string): Dim2D {\r\n        div.style.setProperty('font', font);\r\n        div.textContent = s;\r\n\r\n        document.body.appendChild(div);\r\n        const width = div.clientWidth;\r\n        const height = div.clientHeight;\r\n        document.body.removeChild(div);\r\n\r\n        return { w: width, h: height };\r\n    };\r\n})();\r\n\r\n\r\n\r\ninterface FontMetrics {\r\n    jTop: number;\r\n    jBaseline: number;\r\n    jBottom: number;\r\n}\r\n\r\n\r\nfunction newFontMetricsCache(): Cache<FontMetrics> {\r\n    return new Cache<FontMetrics>({\r\n        create: function (font: string): FontMetrics {\r\n\r\n            const dim = textDim('fMgyj', font);\r\n            const w = dim.w;\r\n            const h = dim.h;\r\n            const canvas = document.createElement('canvas');\r\n            canvas.width = w;\r\n            canvas.height = h;\r\n            const g = canvas.getContext('2d', { willReadFrequently: true});\r\n\r\n            g.font = font;\r\n            g.textAlign = 'left';\r\n            g.textBaseline = 'top';\r\n            g.fillStyle = 'black';\r\n\r\n            g.clearRect(0, 0, w, h);\r\n            g.fillText('fM', 0, 0);\r\n            let rgbaData = g.getImageData(0, 0, w, h).data;\r\n\r\n            let jTop = -1;\r\n            for (let j = 0; j < h && jTop < 0; j++) {\r\n                for (let i = 0; i < w && jTop < 0; i++) {\r\n                    const alpha = rgbaData[(j * w + i) * 4 + 3];\r\n                    if (alpha !== 0) {\r\n                        jTop = j;\r\n                    }\r\n                }\r\n            }\r\n\r\n            let jBaseline = -1;\r\n            for (let j = h - 1; j >= 0 && jBaseline < 0; j--) {\r\n                for (let i = 0; i < w && jBaseline < 0; i++) {\r\n                    const alpha = rgbaData[(j * w + i) * 4 + 3];\r\n                    if (alpha !== 0) {\r\n                        jBaseline = j;\r\n                    }\r\n                }\r\n            }\r\n\r\n            g.clearRect(0, 0, w, h);\r\n            g.fillText('gyj', 0, 0);\r\n            rgbaData = g.getImageData(0, 0, w, h).data;\r\n\r\n            let jBottom = -1;\r\n            for (let j = h - 1; j >= 0 && jBottom < 0; j--) {\r\n                for (let i = 0; i < w && jBottom < 0; i++) {\r\n                    const alpha = rgbaData[(j * w + i) * 4 + 3];\r\n                    if (alpha !== 0) {\r\n                        jBottom = j;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { jTop: jTop, jBaseline: jBaseline, jBottom: jBottom };\r\n        },\r\n        dispose: function () { }\r\n    });\r\n}\r\n\r\n\r\nconst getRawFontMetrics = (function () {\r\n    const cache = newFontMetricsCache();\r\n    return function (font: string): FontMetrics {\r\n        return cache.value(font);\r\n    };\r\n})();\r\n\r\n\r\nexport const getTextWidth = (function () {\r\n    const canvas = document.createElement('canvas');\r\n    canvas.width = 1;\r\n    canvas.height = 1;\r\n    const g = canvas.getContext('2d');\r\n    g.textAlign = 'left';\r\n    g.textBaseline = 'top';\r\n    return function (font: string, text: string): number {\r\n        g.font = font;\r\n        return g.measureText(text).width;\r\n    };\r\n})();\r\n\r\n\r\nexport class TextTexture2D extends Texture2D {\r\n    private _jBaseline: number;\r\n\r\n    get jBaseline(): number { return this._jBaseline; }\r\n\r\n    constructor(w: number, h: number, jBaseline: number, minFilter: number, magFilter: number, draw: ImageDrawer) {\r\n        super(w, h, minFilter, magFilter, draw);\r\n        this._jBaseline = jBaseline;\r\n    }\r\n\r\n    yAnchor(textFrac: number) {\r\n        // Things tend to look the way you expect if textFrac is interpreted as\r\n        // a fraction of the way from the bottom of the baseline pixel up to the\r\n        // top of the top pixel\r\n        //\r\n        const bottom = this.jBaseline + 1;\r\n        const h = this.h;\r\n        return 1 - ((1 - textFrac) * bottom / h);\r\n    }\r\n}\r\n\r\n\r\nexport function newTextTextureCache(font: string, color: Color): Cache<TextTexture2D> {\r\n    const createTextTexture = createTextTextureFactory(font);\r\n    return new Cache<TextTexture2D>({\r\n        create: function (text: string): TextTexture2D {\r\n            return createTextTexture(color, text);\r\n        },\r\n        dispose: function (texture: Texture2D) {\r\n            texture.dispose();\r\n        }\r\n    });\r\n}\r\n\r\n\r\nexport function newTextTextureCache2(font: string): TwoKeyCache<TextTexture2D> {\r\n    const createTextTexture = createTextTextureFactory(font);\r\n    return new TwoKeyCache<TextTexture2D>({\r\n        create: function (rgbaString: string, text: string): TextTexture2D {\r\n            const color = parseRgba(rgbaString);\r\n            return createTextTexture(color, text);\r\n        },\r\n        dispose: function (texture: Texture2D) {\r\n            texture.dispose();\r\n        }\r\n    });\r\n}\r\n\r\n\r\nexport function newTextTextureCache3(): ThreeKeyCache<TextTexture2D> {\r\n    return new ThreeKeyCache<TextTexture2D>({\r\n        create: function (font: string, rgbaString: string, text: string): TextTexture2D {\r\n            const createTextTexture = createTextTextureFactory(font);\r\n            const color = parseRgba(rgbaString);\r\n            return createTextTexture(color, text);\r\n        },\r\n        dispose: function (texture: Texture2D) {\r\n            texture.dispose();\r\n        }\r\n    });\r\n}\r\n\r\nexport function newTextTextureCache6(): SixKeyCache<TextTexture2D> {\r\n    return new SixKeyCache<TextTexture2D>({\r\n        create: function (font: string, rgbaString: string, text: string, rgbaBgString: string, bgPadding: string, bgBorderRadius: string): TextTexture2D {\r\n            const createTextTexture = createTextTextureFactory(font);\r\n            const color = parseRgba(rgbaString);\r\n            const bgColor = parseRgba(rgbaBgString);\r\n            const bgBorderRadiusNumber = parseInt(bgBorderRadius, 10);\r\n            const paddingNumber = parseInt(bgPadding, 10);\r\n            return createTextTexture(color, text, bgColor, paddingNumber, bgBorderRadiusNumber);\r\n        },\r\n        dispose: function (texture: Texture2D) {\r\n            texture.dispose();\r\n        }\r\n    });\r\n}\r\n\r\n\r\nexport type TextTextureFactory = (\r\n    color: Color,\r\n    text: string,\r\n    bgColor?: Color,\r\n    bgPadding?: number,\r\n    bgBorderRadius?: number\r\n) => TextTexture2D;\r\n\r\n\r\nexport function createTextTextureFactory(font: string): TextTextureFactory {\r\n    const rawFontMetrics = getRawFontMetrics(font);\r\n    let jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop;\r\n    let h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1;\r\n\r\n    return function (color: Color, text: string, bgColor: Color, bgPadding = 0, bgBorderRadius = 0): TextTexture2D {\r\n        let w = Math.ceil(getTextWidth(font, text));\r\n        if (bgColor && bgColor.a !== 0) {\r\n            const addedPadding = bgPadding * 2;\r\n            w = w + addedPadding + 4;\r\n            h = h + addedPadding;\r\n            jBaseline = jBaseline + addedPadding;\r\n        }\r\n\r\n        return new TextTexture2D(w, h, jBaseline, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) {\r\n            // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent\r\n            // background -- so we draw white text onto a black background, then infer alpha from\r\n            // the pixel color (black = transparent, white = opaque).\r\n            //\r\n            // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively\r\n            // de-hinting it.\r\n            //\r\n\r\n            // If background color not transparent show background color, else follow comment above.\r\n            if (bgColor && bgColor.a !== 0) {\r\n                g.fillStyle = bgColor.cssString;\r\n                // Round corners of text background\r\n                if (bgBorderRadius) {\r\n                    bgBorderRadius = Math.min(bgBorderRadius, h / 2, w / 2);\r\n                    g.beginPath();\r\n                    g.moveTo(bgBorderRadius, 0);\r\n                    g.lineTo(w - bgBorderRadius, 0);\r\n                    g.quadraticCurveTo(w, 0, w, bgBorderRadius);\r\n                    g.lineTo(w, h - bgBorderRadius);\r\n                    g.quadraticCurveTo(w, h, w - bgBorderRadius, h);\r\n                    g.lineTo(bgBorderRadius, h);\r\n                    g.quadraticCurveTo(0, h, 0, h - bgBorderRadius);\r\n                    g.lineTo(0, bgBorderRadius);\r\n                    g.quadraticCurveTo(0, 0, bgBorderRadius, 0);\r\n                    g.closePath();\r\n                    g.fill();\r\n                } else {\r\n                    g.fillRect(0, 0, w, h);\r\n                }\r\n\r\n                g.font = font;\r\n                g.textAlign = 'center';\r\n                g.textBaseline = 'middle';\r\n                g.fillStyle = color.cssString;\r\n                g.fillText(text, w / 2, h / 2);\r\n            } else {\r\n                g.fillStyle = 'black';\r\n                g.fillRect(0, 0, w, h);\r\n\r\n                g.font = font;\r\n                g.textAlign = 'left';\r\n                g.textBaseline = 'top';\r\n                g.fillStyle = 'white';\r\n\r\n                g.save();\r\n                g.translate(0, -rawFontMetrics.jTop);\r\n                g.fillText(text, 0, 0);\r\n                g.restore();\r\n\r\n                const r255 = 255 * color.r;\r\n                const g255 = 255 * color.g;\r\n                const b255 = 255 * color.b;\r\n                const aFactor = color.a / 3;\r\n\r\n                const pixels = g.getImageData(0, 0, w, h);\r\n                for (let j = 0; j < pixels.height; j++) {\r\n                    for (let i = 0; i < pixels.width; i++) {\r\n                        const pixelOffset = (j * pixels.width + i) * 4;\r\n                        const a255 = aFactor * (pixels.data[pixelOffset + 0] + pixels.data[pixelOffset + 1] + pixels.data[pixelOffset + 2]);\r\n\r\n                        pixels.data[pixelOffset + 0] = r255;\r\n                        pixels.data[pixelOffset + 1] = g255;\r\n                        pixels.data[pixelOffset + 2] = b255;\r\n                        pixels.data[pixelOffset + 3] = a255;\r\n                    }\r\n                }\r\n\r\n                g.putImageData(pixels, 0, 0);\r\n            }\r\n        });\r\n    };\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport function newTextHintsCache(font: string): Cache<Texture2D> {\r\n    const rawFontMetrics = getRawFontMetrics(font);\r\n    const jBaseline = rawFontMetrics.jBaseline - rawFontMetrics.jTop;\r\n    const h = rawFontMetrics.jBottom - rawFontMetrics.jTop + 1;\r\n\r\n    return new Cache<Texture2D>({\r\n\r\n        create: function (text: string): Texture2D {\r\n            const w = getTextWidth(font, text);\r\n\r\n            // XXX: For now, assuming subpixels are horizontal-RGB\r\n\r\n            // Draw text triple-sized, to get an alpha for each r,g,b subpixel\r\n            const canvas3 = document.createElement('canvas');\r\n            canvas3.width = 3 * w;\r\n            canvas3.height = h;\r\n            const g3 = canvas3.getContext('2d');\r\n            g3.fillStyle = 'black';\r\n            g3.fillRect(0, 0, canvas3.width, canvas3.height);\r\n\r\n            g3.save();\r\n            g3.translate(0, -rawFontMetrics.jTop);\r\n            g3.scale(3, 1);\r\n            g3.font = font;\r\n            g3.textAlign = 'left';\r\n            g3.textBaseline = 'top';\r\n            g3.fillStyle = 'white';\r\n            g3.fillText(text, 0, 0);\r\n            g3.restore();\r\n            const srcRgba = g3.getImageData(0, 0, canvas3.width, canvas3.height).data;\r\n\r\n            return new Texture2D(w, h, GL.NEAREST, GL.NEAREST, function (g: CanvasRenderingContext2D) {\r\n                const destImage = g.createImageData(w, h);\r\n                const destRgba = destImage.data;\r\n\r\n                const weightLeft = 1;\r\n                const weightCenter = 2;\r\n                const weightRight = 1;\r\n                const weightNorm = 1 / (weightLeft + weightCenter + weightRight);\r\n\r\n                for (let j = 0; j < h; j++) {\r\n                    for (let i = 0; i < w; i++) {\r\n                        // Get alpha values for relevant src-pixels: one from just left of the dest-pixel, all\r\n                        // three from inside the dest-pixel, and one from just right of the dest-pixel.\r\n                        //\r\n                        // Some browsers use hinting for canvas fillText! This behaves poorly on a transparent\r\n                        // background -- so we draw white text onto a black background, then infer alpha from\r\n                        // the pixel color (black = transparent, white = opaque).\r\n                        //\r\n                        // We compute alpha as (R+G+B)/3. This grayscales the image the browser drew, effectively\r\n                        // de-hinting it so that we can re-hint it ourselves later (during blending, when the\r\n                        // background color is known).\r\n                        //\r\n                        const srcPixelIndex = (j * 3 * w + 3 * i) * 4;\r\n                        const srcAlphaL = (i > 0 ? (srcRgba[srcPixelIndex - 4] + srcRgba[srcPixelIndex - 3] + srcRgba[srcPixelIndex - 2]) / (3 * 255) : 0);\r\n                        const srcAlpha0 = (srcRgba[srcPixelIndex + 0] + srcRgba[srcPixelIndex + 1] + srcRgba[srcPixelIndex + 2]) / (3 * 255);\r\n                        const srcAlpha1 = (srcRgba[srcPixelIndex + 4] + srcRgba[srcPixelIndex + 5] + srcRgba[srcPixelIndex + 6]) / (3 * 255);\r\n                        const srcAlpha2 = (srcRgba[srcPixelIndex + 8] + srcRgba[srcPixelIndex + 9] + srcRgba[srcPixelIndex + 10]) / (3 * 255);\r\n                        const srcAlphaR = (i < w - 1 ? (srcRgba[srcPixelIndex + 12] + srcRgba[srcPixelIndex + 13] + srcRgba[srcPixelIndex + 14]) / (3 * 255) : 0);\r\n\r\n                        // Weighted averages to find subpixel alphas\r\n                        const alphaLeft = weightNorm * (weightLeft * srcAlphaL + weightCenter * srcAlpha0 + weightRight * srcAlpha1);\r\n                        const alphaCenter = weightNorm * (weightLeft * srcAlpha0 + weightCenter * srcAlpha1 + weightRight * srcAlpha2);\r\n                        const alphaRight = weightNorm * (weightLeft * srcAlpha1 + weightCenter * srcAlpha2 + weightRight * srcAlphaR);\r\n\r\n                        // Store subpixel alphas in dest-pixel\r\n                        const destPixelIndex = (j * w + i) * 4;\r\n                        destRgba[destPixelIndex + 0] = Math.round(255 * alphaLeft);\r\n                        destRgba[destPixelIndex + 1] = Math.round(255 * alphaCenter);\r\n                        destRgba[destPixelIndex + 2] = Math.round(255 * alphaRight);\r\n\r\n                        // Alpha will be used in computing final alpha of blended result -- use the average of\r\n                        // the subpixel alphas\r\n                        //\r\n                        // If alpha is 1, Firefox will interpret it as 100%. Causes some pixels that should be\r\n                        // very dim to come out very bright. As a workaround, nudge them down to zero.\r\n                        //\r\n                        const alphaAvg = Math.round(255 * (alphaLeft + alphaCenter + alphaRight) / 3);\r\n                        destRgba[destPixelIndex + 3] = (alphaAvg === 1 ? 0 : alphaAvg);\r\n                    }\r\n                }\r\n\r\n                g.putImageData(destImage, 0, 0);\r\n            });\r\n        },\r\n\r\n        dispose: function (texture: Texture2D) {\r\n            texture.dispose();\r\n        }\r\n\r\n    });\r\n}\r\n\r\n\r\nexport class HintedTextRenderer {\r\n\r\n    private textRenderer_VERTSHADER = concatLines(\r\n        '                                                                                                  ',\r\n        '  uniform vec2 u_XyFrac;                                                                          ',\r\n        '  uniform vec2 u_Anchor;                                                                          ',\r\n        '  uniform vec2 u_ImageSize;                                                                       ',\r\n        '  uniform vec2 u_ViewportSize;                                                                    ',\r\n        '                                                                                                  ',\r\n        '  attribute vec2 a_ImageFrac;                                                                     ',\r\n        '                                                                                                  ',\r\n        '  varying vec2 v_StCoord;                                                                         ',\r\n        '                                                                                                  ',\r\n        '  void main( ) {                                                                                  ',\r\n        '      vec2 xy = -1.0 + 2.0*( u_XyFrac + u_ImageSize*( a_ImageFrac - u_Anchor )/u_ViewportSize );  ',\r\n        '      gl_Position = vec4( xy, 0.0, 1.0 );                                                         ',\r\n        '                                                                                                  ',\r\n        '      v_StCoord = vec2( a_ImageFrac.x, 1.0 - a_ImageFrac.y );                                     ',\r\n        '  }                                                                                               ',\r\n        '                                                                                                  '\r\n    );\r\n\r\n    private textRenderer_FRAGSHADER = concatLines(\r\n        '                                                                 ',\r\n        '  precision mediump float;                                       ',\r\n        '                                                                 ',\r\n        '  uniform sampler2D u_Hints;                                     ',\r\n        '  uniform float u_Alpha;                                         ',\r\n        '                                                                 ',\r\n        '  varying vec2 v_StCoord;                                        ',\r\n        '                                                                 ',\r\n        '  void main( ) {                                                 ',\r\n        '      gl_FragColor = u_Alpha * texture2D( u_Hints, v_StCoord );  ',\r\n        '  }                                                              ',\r\n        '                                                                 '\r\n    );\r\n\r\n\r\n    private program: Program;\r\n    private u_XyFrac: Uniform2f;\r\n    private u_Anchor: Uniform2f;\r\n    private u_ImageSize: Uniform2f;\r\n    private u_ViewportSize: Uniform2f;\r\n    private u_Alpha: Uniform1f;\r\n    private u_Hints: UniformSampler2D;\r\n\r\n    private a_ImageFrac: Attribute;\r\n    private imageFracData: Buffer;\r\n\r\n    private wViewport: number;\r\n    private hViewport: number;\r\n\r\n\r\n    constructor() {\r\n        this.program = new Program(this.textRenderer_VERTSHADER, this.textRenderer_FRAGSHADER);\r\n        this.u_XyFrac = new Uniform2f(this.program, 'u_XyFrac');\r\n        this.u_Anchor = new Uniform2f(this.program, 'u_Anchor');\r\n        this.u_ImageSize = new Uniform2f(this.program, 'u_ImageSize');\r\n        this.u_ViewportSize = new Uniform2f(this.program, 'u_ViewportSize');\r\n        this.u_Alpha = new Uniform1f(this.program, 'u_Alpha');\r\n        this.u_Hints = new UniformSampler2D(this.program, 'u_Hints');\r\n\r\n        this.a_ImageFrac = new Attribute(this.program, 'a_ImageFrac');\r\n        this.imageFracData = newStaticBuffer(new Float32Array([0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]));\r\n\r\n        this.wViewport = 0;\r\n        this.hViewport = 0;\r\n    }\r\n\r\n    begin(gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        this.program.use(gl);\r\n        this.u_ViewportSize.setData(gl, viewport.w, viewport.h);\r\n        this.a_ImageFrac.setDataAndEnable(gl, this.imageFracData, 2, GL.FLOAT);\r\n\r\n        this.wViewport = viewport.w;\r\n        this.hViewport = viewport.h;\r\n    }\r\n\r\n    draw(gl: WebGLRenderingContext, hints: Texture2D, xFrac: number, yFrac: number, options?: {\r\n        xAnchor?: number;\r\n        yAnchor?: number;\r\n        color?: Color\r\n    }) {\r\n        const xAnchor = (hasval(options) && hasval(options.xAnchor) ? options.xAnchor : 0.5);\r\n        const yAnchor = (hasval(options) && hasval(options.yAnchor) ? options.yAnchor : 0.5);\r\n        const color = (hasval(options) && hasval(options.color) ? options.color : black);\r\n\r\n        // The hints texture stores subpixel alphas in its R,G,B components. For example, a red hint-pixel indicates\r\n        // that, at that pixel, the final R component should be color.r (R_hint=1, so red is opaque), but the\r\n        // final G and B components should be the G and B from the background pixel (G_hint=0, B_hint=0, so green\r\n        // and blue are transparent).\r\n        //\r\n        // GL does not allow arbitrary blending, but we can use the blending options it does provide to get the effect\r\n        // we want.\r\n        //\r\n        // There are 4 things to keep an eye on:\r\n        //\r\n        // 1. The RGB part of color, which is put into glBlendColor\r\n        // 2. The A part of color, which is sent to the frag-shader (NOT passed to glBlendColor)\r\n        // 3. The subpixel alphas, which are sent to the frag-shader in the hints-texture\r\n        // 4. The glBlendFunc, which is set up in an unusual way\r\n        //\r\n        //\r\n        // With this setup, we get:\r\n        //\r\n        //    R_final = ( R_frag )*R_foreground + ( 1 - R_frag )*R_background\r\n        //    G_final = ( G_frag )*G_foreground + ( 1 - G_frag )*G_background\r\n        //    B_final = ( B_frag )*B_foreground + ( 1 - B_frag )*B_background\r\n        //    A_final = ( A_frag )*1            + ( 1 - A_frag )*A_background\r\n        //\r\n        // So R_frag, the output from the frag shader, is a weight that is used to take a weighted average between\r\n        // foreground and background colors.\r\n        //\r\n        // The frag-shader is doing A_foreground*RGBA_hint. Conceptually, R_hint is really a subpixel alpha for the\r\n        // red subpixel, so it is helpful to call it A_redhint (and analogously for G and B):\r\n        //\r\n        //    R_frag = A_foreground * A_redhint\r\n        //    G_frag = A_foreground * A_greenhint\r\n        //    B_frag = A_foreground * A_bluehint\r\n        //\r\n        // So the blended RGB is a weighted average of RGB_foreground and RGB_background, with a weighting factor of\r\n        // ( A_foreground * A_subpixel ), where A_subpixel is either A_redhint, A_greenhint, or A_bluehint. Basically,\r\n        // we have a separate alpha for each subpixel!\r\n        //\r\n        //\r\n        // For the final alpha component, we want:\r\n        //\r\n        //    A_final = ( 1 - (1-A_background)*(1-A_frag) )\r\n        //\r\n        // A little algebra shows that to be equivalent to:\r\n        //\r\n        //    A_final = ( A_frag )*1 + ( 1 - A_frag )*A_background\r\n        //\r\n        // Which is exactly what we get, as long as we pass an alpha of 1 into glBlendColor.\r\n        //\r\n        //\r\n\r\n        this.u_XyFrac.setData(gl, nearestPixel(xFrac, this.wViewport, xAnchor, hints.w), nearestPixel(yFrac, this.hViewport, yAnchor, hints.h));\r\n        this.u_Anchor.setData(gl, xAnchor, yAnchor);\r\n        this.u_ImageSize.setData(gl, hints.w, hints.h);\r\n        this.u_Alpha.setData(gl, color.a);\r\n        this.u_Hints.setDataAndBind(gl, 0, hints);\r\n\r\n        gl.enable(GL.BLEND);\r\n        gl.blendColor(color.r, color.g, color.b, 1);\r\n        gl.blendFunc(GL.CONSTANT_COLOR, GL.ONE_MINUS_SRC_COLOR);\r\n\r\n        gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);\r\n    }\r\n\r\n    end(gl: WebGLRenderingContext) {\r\n        this.a_ImageFrac.disable(gl);\r\n        this.u_Hints.unbind(gl);\r\n        this.program.endUse(gl);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport {Color, sameColor} from './color';\r\nimport {TextTextureFactory, TextTexture2D, createTextTextureFactory, getTextWidth} from './text';\r\nimport {Size, BoundsUnmodifiable} from './bounds';\r\nimport {TextureRenderer} from './texture';\r\nimport {GL, hasval} from './util/util';\r\nimport {LayoutPhase1} from './core';\r\n\r\nexport class Label {\r\n    private _font: string;\r\n    private _fgColor: Color;\r\n    private _bgColor: Color;\r\n    private _text: string;\r\n    private _textureFactory: TextTextureFactory;\r\n    private _texture: TextTexture2D;\r\n\r\n    constructor(text?: string, font?: string, fgColor?: Color, bgColor?: Color) {\r\n        this._font = font;\r\n        this._text = text;\r\n        this._fgColor = fgColor;\r\n        this._bgColor = bgColor;\r\n    }\r\n\r\n    get font(): string {\r\n        return this._font;\r\n    }\r\n\r\n    set font(font: string) {\r\n        if (this._font !== font) {\r\n            this._font = font;\r\n            this._textureFactory = null;\r\n            if (this._texture) {\r\n                this._texture.dispose();\r\n                this._texture = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    // retained for backwards compatibility, should use fgColor\r\n    get color(): Color {\r\n        return this._fgColor;\r\n    }\r\n\r\n    // retained for backwards compatibility, should use fgColor\r\n    set color(fgColor: Color) {\r\n        if (!sameColor(this._fgColor, fgColor)) {\r\n            this._fgColor = fgColor;\r\n            if (this._texture) {\r\n                this._texture.dispose();\r\n                this._texture = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    get fgColor(): Color {\r\n        return this._fgColor;\r\n    }\r\n\r\n    set fgColor(fgColor: Color) {\r\n        if (!sameColor(this._fgColor, fgColor)) {\r\n            this._fgColor = fgColor;\r\n            if (this._texture) {\r\n                this._texture.dispose();\r\n                this._texture = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    get bgColor(): Color {\r\n        return this._bgColor;\r\n    }\r\n\r\n    set bgColor(bgColor: Color) {\r\n        if (!sameColor(this._bgColor, bgColor)) {\r\n            this._bgColor = bgColor;\r\n        }\r\n    }\r\n\r\n    get text(): string {\r\n        return this._text;\r\n    }\r\n\r\n    set text(text: string) {\r\n        if (this._text !== text) {\r\n            this._text = text;\r\n            if (this._texture) {\r\n                this._texture.dispose();\r\n                this._texture = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    get texture(): TextTexture2D {\r\n        if (!this._textureFactory) {\r\n            this._textureFactory = (this._font ? createTextTextureFactory(this._font) : null);\r\n        }\r\n        if (!this._texture) {\r\n            this._texture = (this._fgColor && this._text ? this._textureFactory(this._fgColor, this._text) : null);\r\n        }\r\n        return this._texture;\r\n    }\r\n\r\n}\r\n\r\n\r\nexport function fitToLabel(label: Label): LayoutPhase1 {\r\n    return <LayoutPhase1>function (parentPrefSize: Size): void {\r\n        const texture = label.texture;\r\n        parentPrefSize.w = (texture ? texture.w : 0);\r\n        parentPrefSize.h = (texture ? texture.h : 0);\r\n    };\r\n}\r\n\r\n\r\nexport function newLabelPainter(label: Label, xFrac: number, yFrac: number, xAnchor?: number, yAnchor?: number, rotation_CCWRAD?: number, truncateLabel?: boolean) {\r\n    const textureRenderer = new TextureRenderer();\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        if (hasval(label.bgColor)) {\r\n            gl.clearColor(label.bgColor.r, label.bgColor.g, label.bgColor.b, label.bgColor.a);\r\n            gl.clear(GL.COLOR_BUFFER_BIT);\r\n        }\r\n\r\n        let labelText = label.text;\r\n        if (truncateLabel) {\r\n            const xRight = viewport.w - 2 / viewport.w;\r\n            while (labelText && labelText !== '...') {\r\n                if (getTextWidth(label.font, labelText) > xRight) {\r\n                    labelText = labelText.substring(0, labelText.length - 4).concat('...');\r\n                } else {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        label.text = labelText;\r\n        if (label.texture) {\r\n            textureRenderer.begin(gl, viewport);\r\n            textureRenderer.draw(gl, label.texture, xFrac, yFrac, { xAnchor: xAnchor, yAnchor: label.texture.yAnchor(yAnchor), rotation_CCWRAD: rotation_CCWRAD });\r\n            textureRenderer.end(gl);\r\n        }\r\n    };\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport {Layout, LayoutEntry, Drawable, Pane, Painter, PointerEvent, yFrac, isLeftMouseDown} from './core';\r\nimport {Size, BoundsUnmodifiable} from './bounds';\r\nimport {Color, gray} from './color';\r\nimport {newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys} from './misc';\r\nimport {Program, UniformColor, Attribute} from './shader';\r\nimport {newDynamicBuffer} from './buffer';\r\nimport {GL, hasval} from './util/util';\r\n\r\nexport interface VerticalScrollLayout extends Layout {\r\n    jOffset: number;\r\n    hContent: number;\r\n    hVisible: number;\r\n}\r\n\r\n\r\nexport function newVerticalScrollLayout(): VerticalScrollLayout {\r\n    const layout = <VerticalScrollLayout>{\r\n\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            if (children.length === 1) {\r\n                const childPrefSize = children[0].prefSize;\r\n\r\n                // XXX: Need some way to override the child's pref-height\r\n                if (!hasval(childPrefSize.h)) {\r\n                    throw new Error('Vertical-scroll layout requires child to have a defined pref-height, but its pref-height is ' + childPrefSize.h);\r\n                }\r\n\r\n                parentPrefSize.w = childPrefSize.w;\r\n                parentPrefSize.h = childPrefSize.h;\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        },\r\n\r\n        jOffset: 0,\r\n        hContent: 0,\r\n        hVisible: 0,\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            if (children.length === 1) {\r\n                const child = children[0];\r\n\r\n                let j;\r\n                const h = child.prefSize.h;\r\n                if (h <= parentViewport.h) {\r\n                    j = parentViewport.jEnd - h;\r\n                }\r\n                else {\r\n                    j = Math.min(parentViewport.j, parentViewport.jEnd - h + Math.max(0, Math.round(layout.jOffset)));\r\n                }\r\n\r\n                child.viewport.setRect(parentViewport.i, j, parentViewport.w, h);\r\n\r\n                layout.jOffset = (j + h) - parentViewport.jEnd;\r\n                layout.hContent = h;\r\n                layout.hVisible = parentViewport.h;\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Vertical-scroll layout only works with 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        }\r\n\r\n    };\r\n    return layout;\r\n}\r\n\r\n\r\nexport interface ScrollbarOptions {\r\n    fgColor?: Color;\r\n    bgColor?: Color;\r\n    borderColor?: Color;\r\n    borderThickness?: number;\r\n    borderTop?: boolean;\r\n    borderLeft?: boolean;\r\n    borderRight?: boolean;\r\n    borderBottom?: boolean;\r\n}\r\n\r\n\r\nexport function newVerticalScrollbar(scrollLayout: VerticalScrollLayout, drawable: Drawable, options?: ScrollbarOptions): Pane {\r\n    const bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : gray(0.9));\r\n\r\n    const scrollbar = new Pane(null);\r\n    scrollbar.addPainter(newBackgroundPainter(bgColor));\r\n    scrollbar.addPainter(newVerticalScrollbarPainter(scrollLayout, options));\r\n\r\n    attachVerticalScrollMouseListeners(scrollbar, scrollLayout, drawable);\r\n\r\n    return scrollbar;\r\n}\r\n\r\n\r\nexport function newVerticalScrollbarPainter(scrollLayout: VerticalScrollLayout, options?: ScrollbarOptions): Painter {\r\n    const fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : gray(0.56));\r\n    const borderColor = (hasval(options) && hasval(options.borderColor) ? options.borderColor : gray(0.42));\r\n    const borderThickness = (hasval(options) && hasval(options.borderThickness) ? options.borderThickness : 1);\r\n    const borderTop = (hasval(options) && hasval(options.borderTop) ? options.borderTop : true);\r\n    const borderLeft = (hasval(options) && hasval(options.borderLeft) ? options.borderLeft : false);\r\n    const borderRight = (hasval(options) && hasval(options.borderRight) ? options.borderRight : false);\r\n    const borderBottom = (hasval(options) && hasval(options.borderBottom) ? options.borderBottom : true);\r\n\r\n    const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n\r\n    const numFillVertices = 6;\r\n    const numBorderVertices = (borderTop ? 6 : 0) + (borderLeft ? 6 : 0) + (borderRight ? 6 : 0) + (borderBottom ? 6 : 0);\r\n    const xyFrac = new Float32Array(2 * Math.max(numFillVertices, numBorderVertices));\r\n    const xyFracBuffer = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        const hFrac = scrollLayout.hVisible / scrollLayout.hContent;\r\n        if (hFrac < 1) {\r\n            const yTop = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset)) / scrollLayout.hContent) * viewport.h + 1e-4);\r\n            const yBottom = Math.round(((scrollLayout.hContent - (scrollLayout.jOffset + scrollLayout.hVisible)) / scrollLayout.hContent) * viewport.h + 1e-4);\r\n\r\n            const yFracTop = yTop / viewport.h;\r\n            const yFracBottom = yBottom / viewport.h;\r\n\r\n            const wBorderFrac = borderThickness / viewport.w;\r\n            const hBorderFrac = borderThickness / viewport.h;\r\n\r\n            gl.disable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n\r\n\r\n            // Fill\r\n            //\r\n\r\n            putQuadXys(xyFrac, 0, 0 + (borderLeft ? wBorderFrac : 0), 1 - (borderRight ? wBorderFrac : 0), yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom + (borderBottom ? hBorderFrac : 0));\r\n            xyFracBuffer.setData(xyFrac.subarray(0, 2 * numFillVertices));\r\n            a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT);\r\n            u_Color.setData(gl, fgColor);\r\n            gl.drawArrays(GL.TRIANGLES, 0, numFillVertices);\r\n\r\n\r\n            // Border\r\n            //\r\n\r\n            let index = 0;\r\n            if (borderTop) {\r\n                index = putQuadXys(xyFrac, index, 0, 1 - (borderRight ? wBorderFrac : 0), yFracTop, yFracTop - hBorderFrac);\r\n            }\r\n            if (borderBottom) {\r\n                index = putQuadXys(xyFrac, index, 0 + (borderLeft ? wBorderFrac : 0), 1, yFracBottom + hBorderFrac, yFracBottom);\r\n            }\r\n            if (borderRight) {\r\n                index = putQuadXys(xyFrac, index, 1 - wBorderFrac, 1, yFracTop, yFracBottom + (borderBottom ? hBorderFrac : 0));\r\n            }\r\n            if (borderLeft) {\r\n                index = putQuadXys(xyFrac, index, 0, 0 + wBorderFrac, yFracTop - (borderTop ? hBorderFrac : 0), yFracBottom);\r\n            }\r\n\r\n            xyFracBuffer.setData(xyFrac.subarray(0, 2 * numBorderVertices));\r\n            a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT);\r\n            u_Color.setData(gl, borderColor);\r\n            gl.drawArrays(GL.TRIANGLES, 0, numBorderVertices);\r\n\r\n\r\n            a_XyFrac.disable(gl);\r\n            program.endUse(gl);\r\n        }\r\n    };\r\n}\r\n\r\n// mouse listener for scrolling while panning on the timeline itself\r\nexport function attachTimelineVerticalScrollMouseListeners(pane: Pane, scrollLayout: VerticalScrollLayout, drawable: Drawable) {\r\n\r\n    // Used when dragging inside pane\r\n    let grab: number = null;\r\n    let jOffset: number = null;\r\n\r\n    pane.mouseDown.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent)) {\r\n            grab = ev.j;\r\n            jOffset = scrollLayout.jOffset;\r\n        }\r\n    });\r\n\r\n    pane.mouseMove.on(function (ev: PointerEvent) {\r\n        if (hasval(grab)) {\r\n            scrollLayout.jOffset = jOffset - (grab - ev.j);\r\n            drawable.redraw();\r\n        }\r\n    });\r\n\r\n    pane.mouseUp.on(function (ev: PointerEvent) {\r\n        grab = null;\r\n    });\r\n}\r\n\r\n// mouse listener for scrolling while interacting with the scrollbar\r\nexport function attachVerticalScrollMouseListeners(scrollbar: Pane, scrollLayout: VerticalScrollLayout, drawable: Drawable) {\r\n\r\n    // Used when dragging the handle\r\n    let grab: number = null;\r\n\r\n    // Used when scrollbar is pressed-and-held outside the handle\r\n    let pageScrollTimer: any = null;\r\n    let recentPointerFrac: number = null;\r\n\r\n    scrollbar.mouseDown.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && !hasval(grab)) {\r\n            const topFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent;\r\n            const fracExtent = scrollLayout.hVisible / scrollLayout.hContent;\r\n            const pointerFrac = yFrac(ev);\r\n            if (topFrac - fracExtent <= pointerFrac && pointerFrac <= topFrac) {\r\n                grab = (topFrac - pointerFrac) / fracExtent;\r\n            }\r\n            else {\r\n                // If the mouse is pressed on the scrollbar but outside the handle:\r\n                //\r\n                //  1. Immediately scroll one page toward the mouse\r\n                //  2. Wait 500ms\r\n                //  3. If the mouse-button is still down, scroll one page toward the mouse\r\n                //  4. Wait 50ms\r\n                //  5. Go to Step 3\r\n                //\r\n                // (A \"page\" is 7/8 of the viewport extent.)\r\n                //\r\n\r\n                let direction = 0;\r\n                if (pointerFrac < topFrac - fracExtent) {\r\n                    direction = +1;\r\n                }\r\n                else if (pointerFrac > topFrac) {\r\n                    direction = -1;\r\n                }\r\n                scrollLayout.jOffset += direction * Math.max(1, 0.875 * scrollLayout.hVisible);\r\n                drawable.redraw();\r\n\r\n                recentPointerFrac = pointerFrac;\r\n                const pageScroll = function () {\r\n                    const pageTopFrac = (scrollLayout.hContent - scrollLayout.jOffset) / scrollLayout.hContent;\r\n                    const pageFracExtent = scrollLayout.hVisible / scrollLayout.hContent;\r\n                    const pagePointerFrac = recentPointerFrac;\r\n\r\n                    let pageDirection = 0;\r\n                    if (pagePointerFrac < pageTopFrac - pageFracExtent) {\r\n                        pageDirection = +1;\r\n                    }\r\n                    else if (pagePointerFrac > pageTopFrac) {\r\n                        pageDirection = -1;\r\n                    }\r\n                    scrollLayout.jOffset += pageDirection * Math.max(1, 0.875 * scrollLayout.hVisible);\r\n                    drawable.redraw();\r\n\r\n                    pageScrollTimer = setTimeout(pageScroll, 50);\r\n                };\r\n                pageScrollTimer = setTimeout(pageScroll, 500);\r\n            }\r\n        }\r\n    });\r\n\r\n    scrollbar.mouseMove.on(function (ev: PointerEvent) {\r\n        const pointerFrac = yFrac(ev);\r\n        if (hasval(grab)) {\r\n            const fracExtent = scrollLayout.hVisible / scrollLayout.hContent;\r\n            const topFrac = pointerFrac + grab * fracExtent;\r\n            scrollLayout.jOffset = scrollLayout.hContent - topFrac * scrollLayout.hContent;\r\n            drawable.redraw();\r\n        }\r\n        if (hasval(pageScrollTimer)) {\r\n            recentPointerFrac = pointerFrac;\r\n        }\r\n    });\r\n\r\n    scrollbar.mouseUp.on(function (ev: PointerEvent) {\r\n        grab = null;\r\n        if (hasval(pageScrollTimer)) {\r\n            clearTimeout(pageScrollTimer);\r\n            pageScrollTimer = null;\r\n            recentPointerFrac = null;\r\n        }\r\n    });\r\n\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Layout, LayoutEntry, Pane } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { Color } from '../color';\r\nimport { newBackgroundPainter } from '../misc';\r\nimport { hasval } from '../util/util';\r\n\r\n\r\nexport interface Insets {\r\n    top: number;\r\n    right: number;\r\n    bottom: number;\r\n    left: number;\r\n}\r\n\r\n\r\nexport function newInsets(...insets: number[]): Insets {\r\n    switch (insets.length) {\r\n\r\n        case 1:\r\n            return {\r\n                top: insets[0],\r\n                right: insets[0],\r\n                bottom: insets[0],\r\n                left: insets[0]\r\n            };\r\n\r\n        case 2:\r\n            return {\r\n                top: insets[0],\r\n                right: insets[1],\r\n                bottom: insets[0],\r\n                left: insets[1]\r\n            };\r\n\r\n        case 3:\r\n            return {\r\n                top: insets[0],\r\n                right: insets[1],\r\n                bottom: insets[2],\r\n                left: insets[1]\r\n            };\r\n\r\n        case 4:\r\n            return {\r\n                top: insets[0],\r\n                right: insets[1],\r\n                bottom: insets[2],\r\n                left: insets[3]\r\n            };\r\n\r\n        default:\r\n            throw new Error('Expected 1, 2, 3, or 4 args, but found ' + insets.length);\r\n    }\r\n}\r\n\r\n\r\nexport function newInsetLayout(insets: Insets): Layout {\r\n    return <Layout>{\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            if (children.length === 0) {\r\n                parentPrefSize.w = insets.left + insets.right;\r\n                parentPrefSize.h = insets.top + insets.bottom;\r\n            }\r\n            else if (children.length === 1) {\r\n                const childPrefSize = children[0].prefSize;\r\n                parentPrefSize.w = (hasval(childPrefSize.w) ? childPrefSize.w + insets.left + insets.right : null);\r\n                parentPrefSize.h = (hasval(childPrefSize.h) ? childPrefSize.h + insets.top + insets.bottom : null);\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        },\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            if (children.length === 1) {\r\n                const childViewport = children[0].viewport;\r\n                childViewport.setEdges(parentViewport.iStart + insets.left,\r\n                    parentViewport.iEnd - insets.right,\r\n                    parentViewport.jStart + insets.bottom,\r\n                    parentViewport.jEnd - insets.top);\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        }\r\n    };\r\n}\r\n\r\n\r\nexport function newInsetPane(pane: Pane, insets: Insets, bgColor: Color = null, consumeInputEvents: boolean = true): Pane {\r\n    const insetPane = new Pane(newInsetLayout(insets), consumeInputEvents);\r\n    if (hasval(bgColor)) {\r\n        insetPane.addPainter(newBackgroundPainter(bgColor));\r\n    }\r\n    insetPane.addPane(pane);\r\n    return insetPane;\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Side } from '../misc';\r\nimport { Layout, LayoutEntry } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { hasval } from '../util/util';\r\n\r\n\r\nexport function newCornerLayout(hSide: Side, vSide: Side): Layout {\r\n    return <Layout>{\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            if (children.length === 1) {\r\n                const childPrefSize = children[0].prefSize;\r\n                parentPrefSize.w = childPrefSize.w;\r\n                parentPrefSize.h = childPrefSize.h;\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Corner layout only works with 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        },\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            if (children.length === 1) {\r\n                const child = children[0];\r\n\r\n                let iStart;\r\n                let iEnd;\r\n                const w = child.prefSize.w;\r\n                if (hSide === Side.RIGHT) {\r\n                    iEnd = parentViewport.iEnd;\r\n                    iStart = (hasval(w) ? Math.max(iEnd - w, parentViewport.iStart) : parentViewport.iStart);\r\n                }\r\n                else {\r\n                    iStart = parentViewport.iStart;\r\n                    iEnd = (hasval(w) ? Math.min(iStart + w, parentViewport.iEnd) : parentViewport.iEnd);\r\n                }\r\n\r\n                let jStart;\r\n                let jEnd;\r\n                const h = child.prefSize.h;\r\n                if (vSide === Side.BOTTOM) {\r\n                    jStart = parentViewport.jStart;\r\n                    jEnd = (hasval(h) ? Math.min(jStart + h, parentViewport.jEnd) : parentViewport.jEnd);\r\n                }\r\n                else {\r\n                    jEnd = parentViewport.jEnd;\r\n                    jStart = (hasval(h) ? Math.max(jEnd - h, parentViewport.jStart) : parentViewport.jStart);\r\n                }\r\n\r\n                child.viewport.setEdges(iStart, iEnd, jStart, jEnd);\r\n            }\r\n            else if (children.length > 1) {\r\n                throw new Error('Corner layout only works with 1 child, but pane has ' + this.children.length + ' children');\r\n            }\r\n        }\r\n    };\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { LayoutEntry, Layout } from '../core';\r\nimport { BoundsUnmodifiable, Size } from '../bounds';\r\nimport { hasval, isNumber } from '../util/util';\r\n\r\n\r\n// 'pref'     indicates the child's height should be its preferred height\r\n// 'pref-max' indicates the child's height should be at most its preferred height, but should be made smaller\r\n//            (treated as a flex with child.layoutOptions.height === null) if their is insufficient room in the\r\n//            parentViewport to accommodate all children at their set size\r\n//\r\n// This layout is essentially a generalization of timeline_layout.ts. If you use a row_layout with the center element set to pref-max\r\n// you get the same effect as timeline_layout).\r\nfunction childHeight(child: LayoutEntry): number {\r\n    const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max');\r\n    return (usePrefHeight ? child.prefSize.h : child.layoutOptions.height);\r\n}\r\n\r\n// see above, like childHeight( ) but don't count 'pref-max'\r\nfunction childHeightOverfull(child: LayoutEntry): number {\r\n    const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref');\r\n\r\n    if (usePrefHeight) {\r\n        return child.prefSize.h;\r\n    }\r\n    else if (child.layoutOptions.height === 'pref-max') {\r\n        return null;\r\n    }\r\n    else {\r\n        return child.layoutOptions.height;\r\n    }\r\n}\r\n\r\ninterface FlexData {\r\n    numFlexible: number;\r\n    totalHeight: number;\r\n    totalFlexHeight: number;\r\n    flexHeight: number;\r\n    childHeight: (child: LayoutEntry) => number;\r\n}\r\n\r\nfunction calculateFlexData(childrenToPlace: LayoutEntry[], parentViewport: BoundsUnmodifiable, getChildHeight: (child: LayoutEntry) => number): FlexData {\r\n    let numFlexible = 0;\r\n    let totalHeight = 0;\r\n    for (let c = 0; c < childrenToPlace.length; c++) {\r\n        const h = getChildHeight(childrenToPlace[c]);\r\n        if (hasval(h)) {\r\n            totalHeight += h;\r\n        }\r\n        else {\r\n            numFlexible++;\r\n        }\r\n    }\r\n    const totalFlexHeight = parentViewport.h - totalHeight;\r\n    const flexHeight = totalFlexHeight / numFlexible;\r\n    return { numFlexible: numFlexible, totalHeight: totalHeight, flexHeight: flexHeight, totalFlexHeight: totalFlexHeight, childHeight: getChildHeight };\r\n}\r\n\r\nexport function newRowLayout(topToBottom: boolean = true): Layout {\r\n\r\n    return <Layout>{\r\n\r\n\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            const childrenToPlace = <LayoutEntry[]>[];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {\r\n                    childrenToPlace.push(child);\r\n                }\r\n            }\r\n\r\n            let wMax = 0;\r\n            let hSum = 0;\r\n            for (let c = 0; c < childrenToPlace.length; c++) {\r\n                const child = childrenToPlace[c];\r\n\r\n                const honorChildWidth = !(child.layoutOptions && child.layoutOptions.ignoreWidth);\r\n                if (honorChildWidth) {\r\n                    const w = child.prefSize.w;\r\n                    if (hasval(wMax) && hasval(w)) {\r\n                        wMax = Math.max(wMax, w);\r\n                    }\r\n                    else {\r\n                        wMax = null;\r\n                    }\r\n                }\r\n\r\n                const h = childHeight(child);\r\n                if (hasval(hSum) && hasval(h)) {\r\n                    hSum += h;\r\n                }\r\n                else {\r\n                    hSum = null;\r\n                }\r\n            }\r\n            parentPrefSize.w = wMax;\r\n            parentPrefSize.h = hSum;\r\n        },\r\n\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            const childrenToPlace = <LayoutEntry[]>[];\r\n            const childrenToHide = <LayoutEntry[]>[];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {\r\n                    childrenToPlace.push(child);\r\n                }\r\n                else {\r\n                    childrenToHide.push(child);\r\n                }\r\n            }\r\n\r\n            // Use the original index to make the sort stable\r\n            const indexProp = 'webglimpse_rowLayout_index';\r\n            for (let c = 0; c < childrenToPlace.length; c++) {\r\n                const child = childrenToPlace[c];\r\n                child[indexProp] = c;\r\n            }\r\n\r\n            childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) {\r\n                const orderDiff = a.layoutArg - b.layoutArg;\r\n                return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp]));\r\n            });\r\n\r\n            // calculate assuming sufficient space\r\n            let flexData = calculateFlexData(children, parentViewport, childHeight);\r\n\r\n            // recalculate allowing 'pref-max' children to shrink if insufficient space\r\n            if (flexData.totalHeight > parentViewport.h) {\r\n                flexData = calculateFlexData(children, parentViewport, childHeightOverfull);\r\n            }\r\n\r\n            if (topToBottom) {\r\n                const iStart = parentViewport.iStart;\r\n                const iEnd = parentViewport.iEnd;\r\n                let jEnd = parentViewport.jEnd;\r\n                let jRemainder = 0;\r\n                for (let c = 0; c < childrenToPlace.length; c++) {\r\n                    const child = childrenToPlace[c];\r\n\r\n                    let jStart: number;\r\n                    const h = flexData.childHeight(child);\r\n                    if (hasval(h)) {\r\n                        jStart = jEnd - h;\r\n                    }\r\n                    else {\r\n                        const jStart0 = jEnd - flexData.flexHeight - jRemainder;\r\n                        jStart = Math.round(jStart0);\r\n                        jRemainder = jStart - jStart0;\r\n                    }\r\n\r\n                    child.viewport.setEdges(iStart, iEnd, jStart, jEnd);\r\n                    jEnd = jStart;\r\n                }\r\n            }\r\n            else {\r\n                const iStart = parentViewport.iStart;\r\n                const iEnd = parentViewport.iEnd;\r\n                let jStart = parentViewport.jStart;\r\n                let jRemainder = 0;\r\n                for (let c = 0; c < childrenToPlace.length; c++) {\r\n                    const child = childrenToPlace[c];\r\n\r\n                    let jEnd: number;\r\n                    const h = flexData.childHeight(child);\r\n                    if (hasval(h)) {\r\n                        jEnd = jStart + h;\r\n                    }\r\n                    else {\r\n                        const jEnd0 = jStart + flexData.flexHeight + jRemainder;\r\n                        jEnd = Math.round(jEnd0);\r\n                        jRemainder = jEnd0 - jEnd;\r\n                    }\r\n\r\n                    child.viewport.setEdges(iStart, iEnd, jStart, jEnd);\r\n                    jStart = jEnd;\r\n                }\r\n            }\r\n\r\n            for (let c = 0; c < childrenToHide.length; c++) {\r\n                childrenToHide[c].viewport.setEdges(0, 0, 0, 0);\r\n            }\r\n        }\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { LayoutEntry, Layout } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { hasval, isNumber } from '../util/util';\r\n\r\n\r\nfunction childWidth(child: LayoutEntry): number {\r\n    const usePrefWidth = (!hasval(child.layoutOptions) || child.layoutOptions.width === undefined || child.layoutOptions.width === 'pref');\r\n    return (usePrefWidth ? child.prefSize.w : child.layoutOptions.width);\r\n}\r\n\r\n\r\nexport function newColumnLayout(leftToRight: boolean = true): Layout {\r\n\r\n    return <Layout>{\r\n\r\n\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            const childrenToPlace = <LayoutEntry[]>[];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {\r\n                    childrenToPlace.push(child);\r\n                }\r\n            }\r\n\r\n            let hMax = 0;\r\n            let wSum = 0;\r\n            for (let c = 0; c < childrenToPlace.length; c++) {\r\n                const child = childrenToPlace[c];\r\n\r\n                const honorChildHeight = !(child.layoutOptions && child.layoutOptions.ignoreHeight);\r\n                if (honorChildHeight) {\r\n                    const h = child.prefSize.h;\r\n                    if (hasval(hMax) && hasval(h)) {\r\n                        hMax = Math.max(hMax, h);\r\n                    }\r\n                    else {\r\n                        hMax = null;\r\n                    }\r\n                }\r\n\r\n                const w = childWidth(child);\r\n                if (hasval(wSum) && hasval(w)) {\r\n                    wSum += w;\r\n                }\r\n                else {\r\n                    wSum = null;\r\n                }\r\n            }\r\n            parentPrefSize.w = wSum;\r\n            parentPrefSize.h = hMax;\r\n        },\r\n\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            const childrenToPlace = <LayoutEntry[]>[];\r\n            const childrenToHide = <LayoutEntry[]>[];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) {\r\n                    childrenToPlace.push(child);\r\n                }\r\n                else {\r\n                    childrenToHide.push(child);\r\n                }\r\n            }\r\n\r\n            // Use the original index to make the sort stable\r\n            const indexProp = 'webglimpse_columnLayout_index';\r\n            for (let c = 0; c < childrenToPlace.length; c++) {\r\n                const child = childrenToPlace[c];\r\n                child[indexProp] = c;\r\n            }\r\n\r\n            childrenToPlace.sort(function (a: LayoutEntry, b: LayoutEntry) {\r\n                const orderDiff = a.layoutArg - b.layoutArg;\r\n                return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp]));\r\n            });\r\n\r\n            let numFlexible = 0;\r\n            let totalFlexWidth = parentViewport.w;\r\n            for (let c = 0; c < childrenToPlace.length; c++) {\r\n                const w = childWidth(childrenToPlace[c]);\r\n                if (hasval(w)) {\r\n                    totalFlexWidth -= w;\r\n                }\r\n                else {\r\n                    numFlexible++;\r\n                }\r\n            }\r\n            const flexWidth = totalFlexWidth / numFlexible;\r\n\r\n            if (leftToRight) {\r\n                const jStart = parentViewport.jStart;\r\n                const jEnd = parentViewport.jEnd;\r\n                let iStart = parentViewport.iStart;\r\n                let iRemainder = 0;\r\n                for (let c = 0; c < childrenToPlace.length; c++) {\r\n                    const child = childrenToPlace[c];\r\n\r\n                    let iEnd: number;\r\n                    const w = childWidth(child);\r\n                    if (hasval(w)) {\r\n                        iEnd = iStart + w;\r\n                    }\r\n                    else {\r\n                        const iEnd0 = iStart + flexWidth + iRemainder;\r\n                        iEnd = Math.round(iEnd0);\r\n                        iRemainder = iEnd0 - iEnd;\r\n                    }\r\n\r\n                    child.viewport.setEdges(iStart, iEnd, jStart, jEnd);\r\n                    iStart = iEnd;\r\n                }\r\n            }\r\n            else {\r\n                const jStart = parentViewport.jStart;\r\n                const jEnd = parentViewport.jEnd;\r\n                let iEnd = parentViewport.iEnd;\r\n                let iRemainder = 0;\r\n                for (let c = 0; c < childrenToPlace.length; c++) {\r\n                    const child = childrenToPlace[c];\r\n\r\n                    let iStart: number;\r\n                    const w = childWidth(child);\r\n                    if (hasval(w)) {\r\n                        iStart = iEnd - w;\r\n                    }\r\n                    else {\r\n                        const iStart0 = iEnd - flexWidth - iRemainder;\r\n                        iStart = Math.round(iStart0);\r\n                        iRemainder = iStart - iStart0;\r\n                    }\r\n\r\n                    child.viewport.setEdges(iStart, iEnd, jStart, jEnd);\r\n                    iEnd = iStart;\r\n                }\r\n            }\r\n\r\n            for (let c = 0; c < childrenToHide.length; c++) {\r\n                childrenToHide[c].viewport.setEdges(0, 0, 0, 0);\r\n            }\r\n        }\r\n\r\n\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Layout, LayoutEntry } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { isEmpty, hasval } from '../util/util';\r\n\r\n\r\n/**\r\n * Simple layout which sets the sizes of all child panes to the size of the parent pane\r\n * (causing all the children to 'overlay' each other and the parent).\r\n */\r\nexport function newOverlayLayout(): Layout {\r\n\r\n    return <Layout>{\r\n\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            const underlays: LayoutEntry[] = [];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                const isUnderlay = child.layoutArg;\r\n                if (isUnderlay) {\r\n                    underlays.push(child);\r\n                }\r\n            }\r\n\r\n            if (!isEmpty(underlays)) {\r\n                let maxChildPrefWidth = 0;\r\n                let maxChildPrefHeight = 0;\r\n                for (let c = 0; c < underlays.length; c++) {\r\n                    const childPrefSize = underlays[c].prefSize;\r\n\r\n                    const childPrefWidth = childPrefSize.w;\r\n                    if (hasval(maxChildPrefWidth) && hasval(childPrefWidth)) {\r\n                        maxChildPrefWidth = Math.max(maxChildPrefWidth, childPrefWidth);\r\n                    }\r\n                    else {\r\n                        maxChildPrefWidth = null;\r\n                    }\r\n\r\n                    const childPrefHeight = childPrefSize.h;\r\n                    if (hasval(maxChildPrefHeight) && hasval(childPrefHeight)) {\r\n                        maxChildPrefHeight = Math.max(maxChildPrefHeight, childPrefHeight);\r\n                    }\r\n                    else {\r\n                        maxChildPrefHeight = null;\r\n                    }\r\n                }\r\n                parentPrefSize.w = maxChildPrefWidth;\r\n                parentPrefSize.h = maxChildPrefHeight;\r\n            }\r\n            else {\r\n                parentPrefSize.w = 0;\r\n                parentPrefSize.h = 0;\r\n            }\r\n        },\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            for (let c = 0; c < children.length; c++) {\r\n                children[c].viewport.setBounds(parentViewport);\r\n            }\r\n        }\r\n\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Layout, LayoutEntry } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { hasval } from '../util/util';\r\n\r\n\r\n/**\r\n * A layout similar to overlay_layout except only one child pane is visible at a time.\r\n * That child pane has its size set to the size of the parent pane. The other children panes\r\n * are made invisible until they are the active pane.\r\n *\r\n * The layoutArg for each child is a boolean, true if it should be the active pane. One is chosen\r\n * arbitrarily if multiple panes have true layoutArg.\r\n */\r\nexport function newCardLayout(): Layout {\r\n\r\n    return <Layout>{\r\n\r\n        updatePrefSize: function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            let activeChild: LayoutEntry;\r\n\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                const isActive = child.layoutArg;\r\n                if (isActive) {\r\n                    activeChild = child;\r\n                }\r\n            }\r\n\r\n            if (hasval(activeChild)) {\r\n\r\n                const childPrefSize = activeChild.prefSize;\r\n\r\n                const childPrefWidth = childPrefSize.w;\r\n                if (hasval(childPrefWidth)) {\r\n                    parentPrefSize.w = childPrefWidth;\r\n                }\r\n                else {\r\n                    parentPrefSize.w = null;\r\n                }\r\n\r\n                const childPrefHeight = childPrefSize.h;\r\n                if (hasval(childPrefHeight)) {\r\n                    parentPrefSize.h = childPrefHeight;\r\n                }\r\n                else {\r\n                    parentPrefSize.h = null;\r\n                }\r\n            }\r\n            else {\r\n                parentPrefSize.w = 0;\r\n                parentPrefSize.h = 0;\r\n            }\r\n        },\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            let activeChildIndex: number;\r\n\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                const isActive = child.layoutArg;\r\n                if (isActive) {\r\n                    activeChildIndex = c;\r\n                }\r\n            }\r\n\r\n            for (let c = 0; c < children.length; c++) {\r\n                if (c === activeChildIndex) {\r\n                    children[c].viewport.setBounds(parentViewport);\r\n                }\r\n                else {\r\n                    children[c].viewport.setEdges(0, 0, 0, 0);\r\n                }\r\n            }\r\n        }\r\n\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color } from '../color';\r\nimport { Painter } from '../core';\r\nimport { Program, UniformColor, Attribute } from '../shader';\r\nimport { xyNdc_VERTSHADER, solid_FRAGSHADER, putQuadXys, fracToNdc } from '../misc';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { GL, hasval } from '../util/util';\r\n\r\n\r\nexport interface BorderOptions {\r\n    drawTop?: boolean;\r\n    drawLeft?: boolean;\r\n    drawRight?: boolean;\r\n    drawBottom?: boolean;\r\n    thickness?: number;\r\n}\r\n\r\n\r\nexport function newBorderPainter(color: Color, options?: BorderOptions): Painter {\r\n    if (!hasval(options)) {\r\n        options = {};\r\n    }\r\n    if (!hasval(options.drawTop)) {\r\n        options.drawTop = true;\r\n    }\r\n    if (!hasval(options.drawLeft)) {\r\n        options.drawLeft = true;\r\n    }\r\n    if (!hasval(options.drawRight)) {\r\n        options.drawRight = true;\r\n    }\r\n    if (!hasval(options.drawBottom)) {\r\n        options.drawBottom = true;\r\n    }\r\n    if (!hasval(options.thickness)) {\r\n        options.thickness = 1;\r\n    }\r\n\r\n    const simple = (options.thickness === 1 && color.a >= 1);\r\n    return (simple ? newSimpleBorderPainter(color, options) : newFullBorderPainter(color, options));\r\n}\r\n\r\n\r\nfunction newFullBorderPainter(color: Color, options: BorderOptions): Painter {\r\n    const drawTop = options.drawTop;\r\n    const drawLeft = options.drawLeft;\r\n    const drawRight = options.drawRight;\r\n    const drawBottom = options.drawBottom;\r\n    const thickness = options.thickness;\r\n\r\n    const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const a_XyNdc = new Attribute(program, 'a_XyNdc');\r\n\r\n    const numVertices = (drawTop ? 6 : 0) + (drawLeft ? 6 : 0) + (drawRight ? 6 : 0) + (drawBottom ? 6 : 0);\r\n    const xy_NDC = new Float32Array(2 * numVertices);\r\n    const xyBuffer_NDC = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        if (color.a >= 1) {\r\n            gl.disable(GL.BLEND);\r\n        }\r\n        else {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n        }\r\n\r\n        program.use(gl);\r\n        u_Color.setData(gl, color);\r\n\r\n        const w_NDC = 2 * thickness / viewport.w;\r\n        const h_NDC = 2 * thickness / viewport.h;\r\n        let index = 0;\r\n        if (drawTop) {\r\n            index = putQuadXys(xy_NDC, index, -1, (drawRight ? +1 - w_NDC : +1), +1, +1 - h_NDC);\r\n        }\r\n        if (drawRight) {\r\n            index = putQuadXys(xy_NDC, index, +1 - w_NDC, +1, +1, (drawBottom ? -1 + h_NDC : -1));\r\n        }\r\n        if (drawBottom) {\r\n            index = putQuadXys(xy_NDC, index, (drawLeft ? -1 + w_NDC : -1), +1, -1 + h_NDC, -1);\r\n        }\r\n        if (drawLeft) {\r\n            index = putQuadXys(xy_NDC, index, -1, -1 + w_NDC, (drawTop ? +1 - h_NDC : +1), -1);\r\n        }\r\n\r\n        xyBuffer_NDC.setData(xy_NDC);\r\n        a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT);\r\n\r\n        gl.drawArrays(GL.TRIANGLES, 0, numVertices);\r\n\r\n        a_XyNdc.disable(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\n\r\nfunction newSimpleBorderPainter(color: Color, options: BorderOptions): Painter {\r\n    const drawTop = options.drawTop;\r\n    const drawLeft = options.drawLeft;\r\n    const drawRight = options.drawRight;\r\n    const drawBottom = options.drawBottom;\r\n\r\n    const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const a_XyNdc = new Attribute(program, 'a_XyNdc');\r\n\r\n    const numVertices = (drawTop ? 2 : 0) + (drawLeft ? 2 : 0) + (drawRight ? 2 : 0) + (drawBottom ? 2 : 0);\r\n    const xy_NDC = new Float32Array(2 * numVertices);\r\n    const xyBuffer_NDC = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        gl.disable(GL.BLEND);\r\n\r\n        program.use(gl);\r\n        u_Color.setData(gl, color);\r\n\r\n        const left_NDC = fracToNdc(0.5 / viewport.w);\r\n        const bottom_NDC = fracToNdc(0.5 / viewport.h);\r\n        const right_NDC = fracToNdc((viewport.w - 0.5) / viewport.w);\r\n        const top_NDC = fracToNdc((viewport.h - 0.5) / viewport.h);\r\n\r\n        let n = 0;\r\n        if (drawTop) {\r\n            xy_NDC[n++] = -1; xy_NDC[n++] = top_NDC;\r\n            xy_NDC[n++] = +1; xy_NDC[n++] = top_NDC;\r\n        }\r\n        if (drawRight) {\r\n            xy_NDC[n++] = right_NDC; xy_NDC[n++] = +1;\r\n            xy_NDC[n++] = right_NDC; xy_NDC[n++] = -1;\r\n        }\r\n        if (drawBottom) {\r\n            xy_NDC[n++] = +1; xy_NDC[n++] = bottom_NDC;\r\n            xy_NDC[n++] = -1; xy_NDC[n++] = bottom_NDC;\r\n        }\r\n        if (drawLeft) {\r\n            xy_NDC[n++] = left_NDC; xy_NDC[n++] = -1;\r\n            xy_NDC[n++] = left_NDC; xy_NDC[n++] = +1;\r\n        }\r\n\r\n        xyBuffer_NDC.setData(xy_NDC);\r\n        a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT);\r\n\r\n        // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1\r\n        gl.lineWidth(1);\r\n        gl.drawArrays(GL.LINES, 0, numVertices);\r\n\r\n        a_XyNdc.disable(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Notification, Listener } from '../util/notification';\r\nimport { log10, hasval } from '../util/util';\r\nimport { xFrac, yFrac, Pane, PointerEvent, isLeftMouseDown } from '../core';\r\n\r\n\r\nexport class Axis1D {\r\n    private _vMin: number;\r\n    private _vMax: number;\r\n    private _vMinLimit: number;\r\n    private _vMaxLimit: number;\r\n    private _limitsChanged = new Notification();\r\n\r\n    constructor(vMin: number, vMax: number, vMinLimit = -Infinity, vMaxLimit = Infinity) {\r\n        this._vMin = Math.max(vMin, vMinLimit);\r\n        this._vMax = Math.min(vMax, vMaxLimit);\r\n        this._vMinLimit = vMinLimit;\r\n        this._vMaxLimit = vMaxLimit;\r\n    }\r\n\r\n    get vMin(): number {\r\n        return this._vMin;\r\n    }\r\n\r\n    get vMax(): number {\r\n        return this._vMax;\r\n    }\r\n\r\n    get vMinLimit(): number {\r\n        return this._vMinLimit;\r\n    }\r\n\r\n    get vMaxLimit(): number {\r\n        return this._vMaxLimit;\r\n    }\r\n\r\n    get limitsChanged(): Notification {\r\n        return this._limitsChanged;\r\n    }\r\n\r\n    set vMin(vMin: number) {\r\n        this._vMin = Math.max(vMin, this._vMinLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    set vMax(vMax: number) {\r\n        this._vMax = Math.min(vMax, this._vMaxLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    set vMinLimit(vMinLimit: number) {\r\n        this._vMinLimit = vMinLimit;\r\n        this._vMin = Math.max(this._vMin, vMinLimit);\r\n        this._vMax = Math.max(this._vMax, vMinLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    set vMaxLimit(vMaxLimit: number) {\r\n        this._vMaxLimit = vMaxLimit;\r\n        this._vMin = Math.min(this._vMin, vMaxLimit);\r\n        this._vMax = Math.min(this._vMax, vMaxLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    setVRange(vMin: number, vMax: number) {\r\n        this._vMin = Math.max(vMin, this._vMinLimit);\r\n        this._vMax = Math.min(vMax, this._vMaxLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    get vSize(): number {\r\n        return (this._vMax - this._vMin);\r\n    }\r\n\r\n    vAtFrac(vFrac: number): number {\r\n        return (this._vMin + vFrac * (this._vMax - this._vMin));\r\n    }\r\n\r\n    vFrac(v: number): number {\r\n        return (v - this._vMin) / (this._vMax - this._vMin);\r\n    }\r\n\r\n    pan(vAmount: number) {\r\n        if (vAmount + this._vMin < this._vMinLimit) {\r\n            this._vMax = this._vMinLimit + this.vSize;\r\n            this._vMin = this._vMinLimit;\r\n        } else if (vAmount + this._vMax > this._vMaxLimit) {\r\n            this._vMin = this._vMaxLimit - this.vSize;\r\n            this._vMax = this._vMaxLimit;\r\n        } else {\r\n            this._vMin += vAmount;\r\n            this._vMax += vAmount;\r\n        }\r\n        this._limitsChanged.fire();\r\n    }\r\n\r\n    zoom(factor: number, vAnchor: number) {\r\n        const newVMin = vAnchor - factor * (vAnchor - this._vMin);\r\n        const newVMax = vAnchor + factor * (this._vMax - vAnchor);\r\n        this._vMin = Math.max(newVMin, this._vMinLimit);\r\n        this._vMax = Math.min(newVMax, this._vMaxLimit);\r\n        this._limitsChanged.fire();\r\n    }\r\n}\r\n\r\n\r\nexport function getTickInterval(axis: Axis1D, approxNumTicks: number): number {\r\n    const vMin = Math.min(axis.vMin, axis.vMax);\r\n    const vMax = Math.max(axis.vMin, axis.vMax);\r\n    const approxTickInterval = (vMax - vMin) / approxNumTicks;\r\n    const prelimTickInterval = Math.pow(10, Math.round(log10(approxTickInterval)));\r\n    const prelimNumTicks = (vMax - vMin) / prelimTickInterval;\r\n\r\n    if (prelimNumTicks >= 5 * approxNumTicks) {\r\n        return (prelimTickInterval * 5);\r\n    }\r\n    if (prelimNumTicks >= 2 * approxNumTicks) {\r\n        return (prelimTickInterval * 2);\r\n    }\r\n\r\n    if (5 * prelimNumTicks <= approxNumTicks) {\r\n        return (prelimTickInterval / 5);\r\n    }\r\n    if (2 * prelimNumTicks <= approxNumTicks) {\r\n        return (prelimTickInterval / 2);\r\n    }\r\n\r\n    return prelimTickInterval;\r\n}\r\n\r\n\r\nexport function getTickCount(axis: Axis1D, tickInterval: number): number {\r\n    return Math.ceil(Math.abs(axis.vSize) / tickInterval) + 1;\r\n}\r\n\r\n\r\nexport function getTickPositions(axis: Axis1D, tickInterval: number, tickCount: number, result: Float32Array) {\r\n    const vMin = Math.min(axis.vMin, axis.vMax);\r\n    const vMax = Math.max(axis.vMin, axis.vMax);\r\n\r\n    const minTickNumber = Math.floor(vMin / tickInterval);\r\n\r\n    for (let i = 0; i < tickCount; i++) {\r\n        result[i] = (minTickNumber + i) * tickInterval;\r\n    }\r\n\r\n    if (axis.vMin > axis.vMax) {\r\n        // XXX: Need floor() on tickCount/2?\r\n        for (let i = 0; i < tickCount / 2; i++) {\r\n            const temp = result[i];\r\n            result[i] = result[tickCount - 1 - i];\r\n            result[tickCount - 1 - i] = temp;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nexport class Axis2D {\r\n    private _xAxis: Axis1D;\r\n    private _yAxis: Axis1D;\r\n\r\n    get xAxis(): Axis1D { return this._xAxis; }\r\n    get xMin(): number { return this._xAxis.vMin; }\r\n    get xMax(): number { return this._xAxis.vMax; }\r\n    xAtFrac(xFrac: number): number { return this._xAxis.vAtFrac(xFrac); }\r\n\r\n    get yAxis(): Axis1D { return this._yAxis; }\r\n    get yMin(): number { return this._yAxis.vMin; }\r\n    get yMax(): number { return this._yAxis.vMax; }\r\n    yAtFrac(yFrac: number): number { return this._yAxis.vAtFrac(yFrac); }\r\n\r\n    constructor(xAxis: Axis1D, yAxis: Axis1D) {\r\n        this._xAxis = xAxis;\r\n        this._yAxis = yAxis;\r\n    }\r\n\r\n    onLimitsChanged(listener: Listener) {\r\n        this._xAxis.limitsChanged.on(listener);\r\n        this._yAxis.limitsChanged.on(listener);\r\n    }\r\n\r\n    pan(xAmount: number, yAmount: number) {\r\n        this._xAxis.pan(xAmount);\r\n        this._yAxis.pan(yAmount);\r\n    }\r\n\r\n    zoom(factor: number, xAnchor: number, yAnchor: number) {\r\n        this._xAxis.zoom(factor, xAnchor);\r\n        this._yAxis.zoom(factor, yAnchor);\r\n    }\r\n}\r\n\r\n\r\nexport function newAxis2D(xMin: number, xMax: number, yMin: number, yMax: number): Axis2D {\r\n    return new Axis2D(new Axis1D(xMin, xMax), new Axis1D(yMin, yMax));\r\n}\r\n\r\n\r\n// XXX: Would be nice if this could be a const\r\nexport let axisZoomStep = 1.12;\r\n\r\n\r\nexport function attachAxisMouseListeners1D(pane: Pane, axis: Axis1D, isVertical: boolean) {\r\n    let vGrab: number = null;\r\n\r\n    pane.mouseDown.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && !hasval(vGrab)) {\r\n            vGrab = axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev));\r\n        }\r\n    });\r\n\r\n    pane.mouseMove.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && hasval(vGrab)) {\r\n            axis.pan(vGrab - axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev)));\r\n        }\r\n    });\r\n\r\n    pane.mouseUp.on(function (ev: PointerEvent) {\r\n        vGrab = null;\r\n    });\r\n\r\n    pane.mouseWheel.on(function (ev: PointerEvent) {\r\n        const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps);\r\n        axis.zoom(zoomFactor, axis.vAtFrac(isVertical ? yFrac(ev) : xFrac(ev)));\r\n    });\r\n}\r\n\r\n\r\nexport function attachAxisMouseListeners2D(pane: Pane, axis: Axis2D) {\r\n    let xGrab: number = null;\r\n    let yGrab: number = null;\r\n\r\n    pane.mouseDown.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && !hasval(xGrab)) {\r\n            xGrab = axis.xAtFrac(xFrac(ev));\r\n            yGrab = axis.yAtFrac(yFrac(ev));\r\n        }\r\n    });\r\n\r\n    pane.mouseMove.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && hasval(xGrab)) {\r\n            axis.pan(xGrab - axis.xAtFrac(xFrac(ev)), yGrab - axis.yAtFrac(yFrac(ev)));\r\n        }\r\n    });\r\n\r\n    pane.mouseUp.on(function (ev: PointerEvent) {\r\n        xGrab = null;\r\n        yGrab = null;\r\n    });\r\n\r\n    pane.mouseWheel.on(function (ev: PointerEvent) {\r\n        const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps);\r\n        axis.zoom(zoomFactor, axis.xAtFrac(xFrac(ev)), axis.yAtFrac(yFrac(ev)));\r\n    });\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Layout, LayoutEntry } from '../core';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { Side } from '../misc';\r\nimport { hasval } from '../util/util';\r\n\r\nexport function newPlotLayout(options?: { horizAxisHeight?: number; vertAxisWidth?: number }): Layout {\r\n    const horizAxisHeight = (hasval(options) && hasval(options.horizAxisHeight) ? options.horizAxisHeight : 60);\r\n    const vertAxisWidth = (hasval(options) && hasval(options.vertAxisWidth) ? options.vertAxisWidth : 70);\r\n\r\n    return <Layout>{\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            const topAxes = <LayoutEntry[]>[];\r\n            const leftAxes = <LayoutEntry[]>[];\r\n            const rightAxes = <LayoutEntry[]>[];\r\n            const bottomAxes = <LayoutEntry[]>[];\r\n            const centers = <LayoutEntry[]>[];\r\n            const others = <LayoutEntry[]>[];\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                switch (child.layoutArg) {\r\n                    case Side.TOP: topAxes.push(child); break;\r\n                    case Side.LEFT: leftAxes.push(child); break;\r\n                    case Side.RIGHT: rightAxes.push(child); break;\r\n                    case Side.BOTTOM: bottomAxes.push(child); break;\r\n                    case null: centers.push(child); break;\r\n                    default: others.push(child); break;\r\n                }\r\n            }\r\n\r\n            const numVertAxes = leftAxes.length + rightAxes.length;\r\n            const numHorizAxes = topAxes.length + bottomAxes.length;\r\n            const centerWidth = Math.max(vertAxisWidth, parentViewport.w - numVertAxes * vertAxisWidth);\r\n            const centerHeight = Math.max(horizAxisHeight, parentViewport.h - numHorizAxes * horizAxisHeight);\r\n            const vertAxisWidth2 = (numVertAxes === 0 ? 0 : (parentViewport.w - centerWidth) / numVertAxes);\r\n            const horizAxisHeight2 = (numHorizAxes === 0 ? 0 : (parentViewport.h - centerHeight) / numHorizAxes);\r\n\r\n            const iCenterStart = parentViewport.iStart + leftAxes.length * vertAxisWidth2;\r\n            const iCenterEnd = parentViewport.iEnd - rightAxes.length * vertAxisWidth2;\r\n            const jCenterStart = parentViewport.jStart + bottomAxes.length * horizAxisHeight2;\r\n            const jCenterEnd = parentViewport.jEnd - topAxes.length * horizAxisHeight2;\r\n\r\n            for (let c = 0; c < topAxes.length; c++) {\r\n                const jStart = Math.round(jCenterEnd + c * horizAxisHeight2);\r\n                const jEnd = (c === topAxes.length - 1 ? parentViewport.jEnd : Math.round(jCenterEnd + (c + 1) * horizAxisHeight2));\r\n                topAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd);\r\n            }\r\n\r\n            for (let c = 0; c < bottomAxes.length; c++) {\r\n                const jStart = (c === bottomAxes.length - 1 ? parentViewport.jStart : Math.round(jCenterStart - (c + 1) * horizAxisHeight2));\r\n                const jEnd = Math.round(jCenterStart - c * horizAxisHeight2);\r\n                bottomAxes[c].viewport.setEdges(iCenterStart, iCenterEnd, jStart, jEnd);\r\n            }\r\n\r\n            for (let c = 0; c < leftAxes.length; c++) {\r\n                const iStart = (c === leftAxes.length - 1 ? parentViewport.iStart : Math.round(iCenterStart - (c + 1) * vertAxisWidth2));\r\n                const iEnd = Math.round(iCenterStart - c * vertAxisWidth2);\r\n                leftAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd);\r\n            }\r\n\r\n            for (let c = 0; c < rightAxes.length; c++) {\r\n                const iStart = Math.round(iCenterEnd + c * vertAxisWidth2);\r\n                const iEnd = (c === rightAxes.length - 1 ? parentViewport.iEnd : Math.round(iCenterEnd + (c + 1) * vertAxisWidth2));\r\n                rightAxes[c].viewport.setEdges(iStart, iEnd, jCenterStart, jCenterEnd);\r\n            }\r\n\r\n            for (let c = 0; c < centers.length; c++) {\r\n                centers[c].viewport.setEdges(iCenterStart, iCenterEnd, jCenterStart, jCenterEnd);\r\n            }\r\n\r\n            for (let c = 0; c < others.length; c++) {\r\n                others[c].viewport.setEdges(0, 0, 0, 0);\r\n            }\r\n        }\r\n\r\n    };\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Texture, FloatDataTexture2D } from './texture';\r\n\r\n// value: a number from 0-1\r\n// out: four component RGBA array indicating the gradient color for the input fraction\r\nexport type Gradient = (value: number) => number[];\r\n\r\n// fills an array with jet colorscale values\r\n// webgl does not support 1D textures, so a 2D texture must be used\r\nexport function jet(value: number): number[] {\r\n\r\n    const x = 4.0 * value;\r\n\r\n    const r = clamp(1.5 - Math.abs(x - 3.0), 0, 1);\r\n    const g = clamp(1.5 - Math.abs(x - 2.0), 0, 1);\r\n    const b = clamp(1.5 - Math.abs(x - 1.0), 0, 1);\r\n\r\n    return [r, g, b, 1.0];\r\n}\r\n\r\nexport function reverseBone(value: number): number[] {\r\n\r\n    const x = 1 - 0.875 * value;\r\n    if (value < 0.375) {\r\n        return [x, x, x - value / 3, 1];\r\n    }\r\n    else if (value < 0.75) {\r\n        return [x, x + 0.125 - value / 3, x - 0.125, 1];\r\n    }\r\n    else {\r\n        return [x + 0.375 - value * 0.5, x - 0.125, x - 0.125, 1];\r\n    }\r\n\r\n}\r\n\r\nexport function getGradientTexture(gradient: Gradient, size: number = 1024): Texture {\r\n    const array = new Float32Array(size * 4);\r\n\r\n    for (let v = 0; v < size; v++) {\r\n        const color = gradient(v / size);\r\n\r\n        array[4 * v + 0] = color[0];\r\n        array[4 * v + 1] = color[1];\r\n        array[4 * v + 2] = color[2];\r\n        array[4 * v + 3] = color[3];\r\n    }\r\n\r\n    return new FloatDataTexture2D(size, 1, array);\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number): number {\r\n    if (n < min) {\r\n        return min;\r\n    }\r\n    else if (n > max) {\r\n        return max;\r\n    }\r\n    else {\r\n        return n;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { concatLines, GL, hasval } from '../util/util';\r\nimport { Axis2D, Axis1D } from './axis';\r\nimport { Texture, FloatDataTexture2D } from '../texture';\r\nimport { Painter } from '../core';\r\nimport { Program, UniformMatrix4f, UniformSampler2D, Uniform1f, Attribute } from '../shader';\r\nimport { newStaticBuffer } from '../buffer';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { glOrthoAxis } from '../matrix';\r\n\r\n\r\nexport interface HeatmapPainterOptions {\r\n    blend?: boolean;\r\n}\r\n\r\nexport interface HeatMapData {\r\n    // matrix data stored x-major\r\n    array: Float32Array;\r\n\r\n    // size of the matrix\r\n    xSize: number;\r\n    ySize: number;\r\n\r\n    // bounds of the matrix in axis coordinates\r\n    xMin: number;\r\n    xMax: number;\r\n    yMin: number;\r\n    yMax: number;\r\n}\r\n\r\n\r\nexport let heatmap_VERTSHADER = concatLines(\r\n    '                                                          ',\r\n    '    uniform mat4 u_modelViewMatrix;                       ',\r\n    '    attribute vec4 a_vertCoord;                           ',\r\n    '    attribute vec2 a_texCoord;                            ',\r\n    '    varying vec2 v_texCoord;                              ',\r\n    '                                                          ',\r\n    '    void main( ) {                                        ',\r\n    '        gl_Position = u_modelViewMatrix * a_vertCoord;    ',\r\n    '        v_texCoord = a_texCoord;                          ',\r\n    '    }                                                     ',\r\n    '                                                          '\r\n);\r\n\r\n\r\nexport let heatmap_FRAGSHADER = concatLines(\r\n    '                                 ',\r\n    '  precision highp float;         ',\r\n    '  uniform sampler2D u_dataTex;   ',\r\n    '  uniform sampler2D u_colorTex;  ',\r\n    '  uniform float u_dataMin;       ',\r\n    '  uniform float u_dataMax;       ',\r\n    '                                 ',\r\n    '  varying vec2 v_texCoord;       ',\r\n    '                                                                                   ',\r\n    '  void main()                                                                      ',\r\n    '  {                                                                                ',\r\n    '     float dataVal = texture2D( u_dataTex, v_texCoord ).r;                         ',\r\n    '     float normalizedVal = ( dataVal - u_dataMin ) / ( u_dataMax - u_dataMin );    ',\r\n    '     clamp( normalizedVal, 0.0, 1.0 );                                             ',\r\n    '                                                                                   ',\r\n    '     vec4 color = texture2D( u_colorTex, vec2( normalizedVal, 0 ) );               ',\r\n    '     gl_FragColor = color;                                                         ',\r\n    '     gl_FragColor.a = 1.0;                                                         ',\r\n    '  }                                                                                '\r\n);\r\n\r\n/**\r\n * Simple heatmap painter which displays a 2d matrix of static data\r\n */\r\nexport function newHeatmapPainter(axis: Axis2D, colorAxis: Axis1D, data: HeatMapData, colorTexture: Texture, options?: HeatmapPainterOptions): Painter {\r\n\r\n    const blend = (hasval(options) && hasval(options.blend) ? options.blend : false);\r\n\r\n    // only GL_RGBA is supported with GL_FLOAT texture type in webgl (see texture.ts)\r\n    // we we currently need an array 4 times bigger than necessary in order to use FLOATS\r\n    // to store the matrix data in a texture\r\n    const array = new Float32Array(data.xSize * data.ySize * 4);\r\n    for (let x = 0; x < data.xSize; x++) {\r\n        for (let y = 0; y < data.ySize; y++) {\r\n            const index = x * data.ySize + y;\r\n            const value = data.array[index];\r\n\r\n            array[4 * index] = value;\r\n            array[4 * index + 1] = value;\r\n            array[4 * index + 2] = value;\r\n            array[4 * index + 3] = value;\r\n        }\r\n    }\r\n    data.array = array;\r\n\r\n    const program = new Program(heatmap_VERTSHADER, heatmap_FRAGSHADER);\r\n    const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix');\r\n    const u_dataTexture = new UniformSampler2D(program, 'u_dataTex');\r\n    const u_colorTexture = new UniformSampler2D(program, 'u_colorTex');\r\n    const u_dataMin = new Uniform1f(program, 'u_dataMin');\r\n    const u_dataMax = new Uniform1f(program, 'u_dataMax');\r\n    const a_vertCoord = new Attribute(program, 'a_vertCoord');\r\n    const a_texCoord = new Attribute(program, 'a_texCoord');\r\n\r\n    const texture = new FloatDataTexture2D(data.xSize, data.ySize, data.array);\r\n\r\n    // points in triangle strip\r\n    const vertCoordArray = [data.xMin, data.yMax, data.xMax, data.yMax, data.xMin, data.yMin, data.xMax, data.yMin];\r\n    const vertCoordFloatArray = new Float32Array(vertCoordArray);\r\n    const vertCoordBuffer = newStaticBuffer(vertCoordFloatArray);\r\n\r\n    // texture coordinates\r\n    const texCoordArray = [0, 1, 1, 1, 0, 0, 1, 0];\r\n    const texCoordFloatArray = new Float32Array(texCoordArray);\r\n    const texCoordBuffer = newStaticBuffer(texCoordFloatArray);\r\n\r\n    const dim = 2;\r\n    const vertexCount = 4;\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        if (blend) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n        }\r\n\r\n        program.use(gl);\r\n        u_dataTexture.setDataAndBind(gl, 0, texture);\r\n        u_colorTexture.setDataAndBind(gl, 1, colorTexture);\r\n        u_modelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n\r\n        u_dataMin.setData(gl, colorAxis.vMin);\r\n        u_dataMax.setData(gl, colorAxis.vMax);\r\n\r\n        a_vertCoord.setDataAndEnable(gl, vertCoordBuffer, dim, GL.FLOAT);\r\n        a_texCoord.setDataAndEnable(gl, texCoordBuffer, dim, GL.FLOAT);\r\n\r\n        gl.drawArrays(GL.TRIANGLE_STRIP, 0, vertexCount);\r\n\r\n        a_vertCoord.disable(gl);\r\n        a_texCoord.disable(gl);\r\n        u_dataTexture.unbind(gl);\r\n        u_colorTexture.unbind(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Side, nearestPixelCenter_GLSLFUNC, modelview_VERTSHADER, solid_FRAGSHADER } from '../misc';\r\nimport { concatLines, ensureCapacityFloat32, GL, order, hasval, clamp } from '../util/util';\r\nimport { Axis1D, getTickInterval, getTickCount, getTickPositions } from './axis';\r\nimport { Color, black } from '../color';\r\nimport { Gradient, getGradientTexture } from '../gradient';\r\nimport { Painter } from '../core';\r\nimport { Program, UniformMatrix4f, UniformSampler2D, Attribute, UniformColor, Uniform1f, Uniform2f } from '../shader';\r\nimport { heatmap_VERTSHADER } from './heatmap_painter';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { Cache } from '../util/cache';\r\nimport { TextTexture2D, newTextTextureCache } from '../text';\r\nimport { TextureRenderer, TextureDrawOptions, Texture } from '../texture';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { glOrthoViewport } from '../matrix';\r\n\r\n\r\nexport function edgeMarks_VERTSHADER(labelSide: Side) {\r\n    // The shader uses 'a' for the along-axis coord, and 'b' for the across-axis coord\r\n    const horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM);\r\n    const bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM);\r\n    return concatLines(\r\n        nearestPixelCenter_GLSLFUNC,\r\n        '                                                                                               ',\r\n        '  uniform float u_VMin;                                                                        ',\r\n        '  uniform float u_VSize;                                                                       ',\r\n        '  uniform vec2 u_ViewportSize;                                                                 ',\r\n        '  uniform float u_MarkSize;                                                                    ',\r\n        '                                                                                               ',\r\n        '  attribute vec2 a_VCoord;                                                                     ',\r\n        '                                                                                               ',\r\n        '  void main( ) {                                                                               ',\r\n        '      float aViewportSize = ' + (horizontal ? 'u_ViewportSize.x' : 'u_ViewportSize.y') + ';  ',\r\n        '      float aFrac = nearestPixelCenter( ( a_VCoord.x - u_VMin ) / u_VSize, aViewportSize );    ',\r\n        '      float a = -1.0 + 2.0*( aFrac );                                                          ',\r\n        '                                                                                               ',\r\n        '      float bViewportSize = ' + (horizontal ? 'u_ViewportSize.y' : 'u_ViewportSize.x') + ';  ',\r\n        '      float bFrac = ( a_VCoord.y * u_MarkSize ) / bViewportSize;                               ',\r\n        '      float b = ' + (bFlip ? '-' : '') + '( -1.0 + 2.0*( bFrac ) );                         ',\r\n        '                                                                                               ',\r\n        '      gl_Position = vec4( ' + (horizontal ? 'a,b' : 'b,a') + ', 0.0, 1.0 );                  ',\r\n        '  }                                                                                            ',\r\n        '                                                                                               '\r\n    );\r\n}\r\n\r\nexport let gradient_FRAGSHADER = concatLines(\r\n    '                                 ',\r\n    '  precision highp float;         ',\r\n    '  uniform sampler2D u_colorTex;  ',\r\n    '                                 ',\r\n    '  varying vec2 v_texCoord;       ',\r\n    '                                                                                   ',\r\n    '  void main( ) {                                                                   ',\r\n    '     vec4 color = texture2D( u_colorTex, v_texCoord );                             ',\r\n    '     gl_FragColor = color;                                                         ',\r\n    '     gl_FragColor.a = 1.0;                                                         ',\r\n    '  }                                                                                '\r\n);\r\n\r\n// provides a custom labeler for axis tick marks\r\n//\r\n// value        : the tick value to create a label string for\r\n// axis         : the axis associated with the tick value\r\n// tickInterval : the requested spacing in pixels between ticks\r\n// precision    : number of decimal points which should be used for tick labels\r\n// orderAxis    : order( Math.abs( axis.vSize ) ) then rounded to nearest multiple of three (-3, 0, 3, 6...)\r\n// orderFactor  : Math.pow( 10, -orderAxis )\r\nexport type TickLabeler = (value: number, axis: Axis1D, tickInterval: number) => string;\r\n\r\n\r\nexport interface EdgeAxisPainterOptions {\r\n    tickSpacing?: number;\r\n    label?: string;\r\n    units?: string;\r\n    shortenLabels?: boolean;\r\n    font?: string;\r\n    textColor?: Color;\r\n    tickColor?: Color;\r\n    tickSize?: number;\r\n    showLabel?: boolean;\r\n    showBorder?: boolean;\r\n    gradientFill?: Gradient;\r\n    tickLabeler?: TickLabeler;\r\n}\r\n\r\n\r\nexport function newEdgeAxisPainter(axis: Axis1D, labelSide: Side, options?: EdgeAxisPainterOptions): Painter {\r\n    const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 100);\r\n    const label = (hasval(options) && hasval(options.label) ? options.label : '');\r\n    const units = (hasval(options) && hasval(options.units) ? options.units : '');\r\n    const shortenLabels = (hasval(options) && hasval(options.shortenLabels) ? options.shortenLabels : true);\r\n    const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif');\r\n    const textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black);\r\n    const tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black);\r\n    const tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6);\r\n    const showLabel = (hasval(options) && hasval(options.showLabel) ? options.showLabel : true);\r\n    const showBorder = (hasval(options) && hasval(options.showBorder) ? options.showBorder : false);\r\n    const gradientFill = (hasval(options) && hasval(options.gradientFill) ? options.gradientFill : undefined);\r\n    const tickLabeler = (hasval(options) && hasval(options.tickLabeler) ? options.tickLabeler : undefined);\r\n\r\n    let tickPositions = new Float32Array(0);\r\n\r\n    const gradientProgram = new Program(heatmap_VERTSHADER, gradient_FRAGSHADER);\r\n    const gradientProgram_u_modelViewMatrix = new UniformMatrix4f(gradientProgram, 'u_modelViewMatrix');\r\n    const gradientProgram_u_colorTexture = new UniformSampler2D(gradientProgram, 'u_colorTex');\r\n    const gradientProgram_a_vertCoord = new Attribute(gradientProgram, 'a_vertCoord');\r\n    const gradientProgram_a_texCoord = new Attribute(gradientProgram, 'a_texCoord');\r\n\r\n    let gradientColorTexture: Texture = null;\r\n    if (gradientFill) {\r\n        gradientColorTexture = getGradientTexture(gradientFill);\r\n    }\r\n\r\n    let gradientVertCoords = new Float32Array(0);\r\n    const gradientVertCoordsBuffer = newDynamicBuffer();\r\n\r\n    let gradientTexCoords = new Float32Array(0);\r\n    const gradientTexCoordsBuffer = newDynamicBuffer();\r\n\r\n    const borderProgram = new Program(modelview_VERTSHADER, solid_FRAGSHADER);\r\n    const borderProgram_a_Position = new Attribute(borderProgram, 'a_Position');\r\n    const borderProgram_u_modelViewMatrix = new UniformMatrix4f(borderProgram, 'u_modelViewMatrix');\r\n    const borderProgram_u_Color = new UniformColor(borderProgram, 'u_Color');\r\n\r\n    let borderCoords = new Float32Array(0);\r\n    const borderCoordsBuffer = newDynamicBuffer();\r\n\r\n    const marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER);\r\n    const marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin');\r\n    const marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize');\r\n    const marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize');\r\n    const marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize');\r\n    const marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color');\r\n    const marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord');\r\n\r\n    let markCoords = new Float32Array(0);\r\n    const markCoordsBuffer = newDynamicBuffer();\r\n\r\n    const textTextures = <Cache<TextTexture2D>>newTextTextureCache(font, textColor);\r\n    const textureRenderer = new TextureRenderer();\r\n    const hTickLabels = textTextures.value('-0.123456789').h;\r\n    const isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT);\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        const sizePixels = isVerticalAxis ? viewport.h : viewport.w;\r\n        if (sizePixels === 0) {\r\n            return;\r\n        }\r\n        const approxNumTicks = sizePixels / tickSpacing;\r\n        const tickInterval = getTickInterval(axis, approxNumTicks);\r\n        const tickCount = getTickCount(axis, tickInterval);\r\n        tickPositions = ensureCapacityFloat32(tickPositions, tickCount);\r\n        getTickPositions(axis, tickInterval, tickCount, tickPositions);\r\n\r\n\r\n        // Border Box and Gradient Fill\r\n        //\r\n\r\n        // XXX border vertices are fixed in normalized 0-1 viewport coordinates\r\n        // XXX they could be calculated ahead of time -- however I had trouble with 'fuzzy' lines when using 0-1 coordinates\r\n        if (showBorder || gradientFill) {\r\n            borderCoords = ensureCapacityFloat32(borderCoords, 10);\r\n\r\n            const horizontal = (labelSide === Side.TOP || labelSide === Side.BOTTOM);\r\n            const bFlip = (labelSide === Side.LEFT || labelSide === Side.BOTTOM);\r\n            const width = viewport.w - 1;\r\n            const height = viewport.h - 1;\r\n\r\n            borderCoords[0] = horizontal ? 0 : (bFlip ? width - tickSize : 0);\r\n            borderCoords[1] = !horizontal ? 0 : (bFlip ? height - tickSize : 0);\r\n\r\n            borderCoords[2] = horizontal ? 0 : (bFlip ? width : tickSize);\r\n            borderCoords[3] = !horizontal ? 0 : (bFlip ? height : tickSize);\r\n\r\n            borderCoords[4] = horizontal ? width : (bFlip ? width : tickSize);\r\n            borderCoords[5] = !horizontal ? height : (bFlip ? height : tickSize);\r\n\r\n            borderCoords[6] = horizontal ? width : (bFlip ? width - tickSize : 0);\r\n            borderCoords[7] = !horizontal ? height : (bFlip ? height - tickSize : 0);\r\n\r\n            // finish off the box (same as 0, 1 coordinates)\r\n            borderCoords[8] = horizontal ? 0 : (bFlip ? width - tickSize : 0);\r\n            borderCoords[9] = !horizontal ? 0 : (bFlip ? height - tickSize : 0);\r\n        }\r\n\r\n        if (gradientFill) {\r\n            gradientProgram.use(gl);\r\n            gradientProgram_u_modelViewMatrix.setData(gl, glOrthoViewport(viewport));\r\n            gradientProgram_u_colorTexture.setDataAndBind(gl, 0, gradientColorTexture);\r\n\r\n            gradientVertCoords = ensureCapacityFloat32(gradientVertCoords, 8);\r\n            gradientVertCoords[0] = borderCoords[2];\r\n            gradientVertCoords[1] = borderCoords[3];\r\n            gradientVertCoords[2] = borderCoords[0];\r\n            gradientVertCoords[3] = borderCoords[1];\r\n            gradientVertCoords[4] = borderCoords[4];\r\n            gradientVertCoords[5] = borderCoords[5];\r\n            gradientVertCoords[6] = borderCoords[6];\r\n            gradientVertCoords[7] = borderCoords[7];\r\n            gradientVertCoordsBuffer.setData(gradientVertCoords);\r\n            gradientProgram_a_vertCoord.setDataAndEnable(gl, gradientVertCoordsBuffer, 2, GL.FLOAT);\r\n\r\n            // y texture coordinates don't really matter ( we're simulating a 1d texture )\r\n            // using a 1-by-n 2d texture because 1d textures aren't available\r\n            gradientTexCoords = ensureCapacityFloat32(gradientTexCoords, 8);\r\n            gradientTexCoords[0] = 0;\r\n            gradientTexCoords[1] = 0;\r\n            gradientTexCoords[2] = 0;\r\n            gradientTexCoords[3] = 0;\r\n            gradientTexCoords[4] = 1;\r\n            gradientTexCoords[5] = 1;\r\n            gradientTexCoords[6] = 1;\r\n            gradientTexCoords[7] = 1;\r\n            gradientTexCoordsBuffer.setData(gradientTexCoords);\r\n            gradientProgram_a_texCoord.setDataAndEnable(gl, gradientTexCoordsBuffer, 2, GL.FLOAT);\r\n\r\n            gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);\r\n\r\n            gradientProgram_u_colorTexture.unbind(gl);\r\n            gradientProgram_a_vertCoord.disable(gl);\r\n            gradientProgram_a_texCoord.disable(gl);\r\n            gradientProgram.endUse(gl);\r\n        }\r\n\r\n        if (showBorder) {\r\n            borderProgram.use(gl);\r\n            borderProgram_u_Color.setData(gl, tickColor);\r\n            borderProgram_u_modelViewMatrix.setData(gl, glOrthoViewport(viewport));\r\n\r\n            borderCoordsBuffer.setData(borderCoords.subarray(0, 10));\r\n            borderProgram_a_Position.setDataAndEnable(gl, borderCoordsBuffer, 2, GL.FLOAT);\r\n\r\n            // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1\r\n            gl.lineWidth(1);\r\n            gl.drawArrays(GL.LINE_STRIP, 0, 5);\r\n\r\n            borderProgram_a_Position.disable(gl);\r\n            borderProgram.endUse(gl);\r\n        }\r\n\r\n        // Tick marks\r\n        //\r\n\r\n        marksProgram.use(gl);\r\n        marksProgram_u_VMin.setData(gl, axis.vMin);\r\n        marksProgram_u_VSize.setData(gl, axis.vSize);\r\n        marksProgram_u_ViewportSize.setData(gl, viewport.w, viewport.h);\r\n        marksProgram_u_MarkSize.setData(gl, tickSize);\r\n        marksProgram_u_Color.setData(gl, tickColor);\r\n\r\n        markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount);\r\n        for (let n = 0; n < tickCount; n++) {\r\n            const v = tickPositions[n];\r\n            markCoords[(4 * n + 0)] = v;\r\n            markCoords[(4 * n + 1)] = 0;\r\n            markCoords[(4 * n + 2)] = v;\r\n            markCoords[(4 * n + 3)] = 1;\r\n        }\r\n        markCoordsBuffer.setData(markCoords.subarray(0, 4 * tickCount));\r\n        marksProgram_a_VCoord.setDataAndEnable(gl, markCoordsBuffer, 2, GL.FLOAT);\r\n\r\n        // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1\r\n        gl.lineWidth(1);\r\n        gl.drawArrays(GL.LINES, 0, 2 * tickCount);\r\n\r\n        marksProgram_a_VCoord.disable(gl);\r\n        marksProgram.endUse(gl);\r\n\r\n\r\n        // Tick labels\r\n        //\r\n\r\n        gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n        gl.enable(GL.BLEND);\r\n\r\n        const orderAxisRaw = order(Math.abs(axis.vSize));\r\n        let orderAxis = 0;\r\n        if (orderAxisRaw > 0) {\r\n            orderAxis = Math.floor((orderAxisRaw - 1) / 3) * 3;\r\n        }\r\n        else if (orderAxisRaw < 0) {\r\n            orderAxis = (Math.ceil(orderAxisRaw / 3) - 1) * 3;\r\n        }\r\n        const orderFactor = Math.pow(10, -orderAxis);\r\n        const orderTick = order(tickInterval);\r\n        const precision = Math.max(0, orderAxis - orderTick);\r\n\r\n        textTextures.resetTouches();\r\n        textureRenderer.begin(gl, viewport);\r\n\r\n        for (let n = 0; n < tickCount; n++) {\r\n            const v = tickPositions[n];\r\n            const vFrac = axis.vFrac(v);\r\n            if (vFrac < 0 || vFrac >= 1) {\r\n                continue;\r\n            }\r\n\r\n            let tickLabel;\r\n            if (tickLabeler) {\r\n                // show custom tick value\r\n                tickLabel = tickLabeler(v, axis, tickInterval);\r\n            }\r\n            else if (shortenLabels && showLabel) {\r\n                // show shortened tick value\r\n                tickLabel = Number(v * orderFactor).toFixed(precision);\r\n            }\r\n            else if (!shortenLabels) {\r\n                // show actual tick value\r\n                if (orderAxisRaw >= 0) {\r\n                    tickLabel = Number(v).toFixed(0);\r\n                }\r\n                else {\r\n                    tickLabel = Number(v).toFixed(-orderAxisRaw);\r\n                }\r\n            }\r\n            else {\r\n                // show magnitude inline for each tick\r\n                tickLabel = Number(v * orderFactor).toFixed(precision) + (orderAxis === 0 ? '' : 'e' + orderAxis);\r\n            }\r\n            const textTexture = textTextures.value(tickLabel);\r\n\r\n            let xFrac: number;\r\n            let yFrac: number;\r\n            if (labelSide === Side.LEFT || labelSide === Side.RIGHT) {\r\n                const yAnchor = textTexture.yAnchor(0.43);\r\n                const j0 = (vFrac * viewport.h) - yAnchor * textTexture.h;\r\n                const j = clamp(0, viewport.h - textTexture.h, j0);\r\n                yFrac = j / viewport.h;\r\n\r\n                if (labelSide === Side.LEFT) {\r\n                    xFrac = (viewport.w - tickSize - 2 - textTexture.w) / viewport.w;\r\n                }\r\n                else {\r\n                    xFrac = (tickSize + 2) / viewport.w;\r\n                }\r\n            }\r\n            else {\r\n                let wMinus = 0;\r\n                if (v < 0) {\r\n                    const absTickLabel = Number(Math.abs(v) * orderFactor).toFixed(precision);\r\n                    wMinus = textTexture.w - textTextures.value(absTickLabel).w;\r\n                }\r\n\r\n                const xAnchor = 0.45;\r\n                const i0 = (vFrac * viewport.w) - xAnchor * (textTexture.w - wMinus) - wMinus;\r\n                const i = clamp(0, viewport.w - textTexture.w, i0);\r\n                xFrac = i / viewport.w;\r\n\r\n                if (labelSide === Side.BOTTOM) {\r\n                    yFrac = (viewport.h - tickSize - 2 - hTickLabels) / viewport.h;\r\n                }\r\n                else {\r\n                    yFrac = (tickSize + 2) / viewport.h;\r\n                }\r\n            }\r\n            textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 });\r\n        }\r\n\r\n\r\n        // Axis label\r\n        //\r\n\r\n        if (showLabel) {\r\n            const unitsString = units + (!shortenLabels || orderAxis === 0 ? '' : ' x 10^' + orderAxis.toFixed(0));\r\n            const axisLabel = label + (unitsString ? ' (' + unitsString + ')' : '');\r\n\r\n            if (axisLabel !== '') {\r\n                const textTexture = textTextures.value(axisLabel);\r\n\r\n                let xFrac: number;\r\n                let yFrac: number;\r\n                let textOpts: TextureDrawOptions;\r\n                if (labelSide === Side.LEFT || labelSide === Side.RIGHT) {\r\n                    // Using hTickLabels here works out about right, even though the tick-label text is horizontal\r\n                    const xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w;\r\n                    xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0);\r\n                    yFrac = 0.5;\r\n                    textOpts = {\r\n                        xAnchor: textTexture.yAnchor(0.5),\r\n                        yAnchor: 0.5,\r\n                        rotation_CCWRAD: 0.5 * Math.PI\r\n                    };\r\n                }\r\n                else {\r\n                    const yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h;\r\n                    yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0);\r\n                    xFrac = 0.5;\r\n                    textOpts = {\r\n                        xAnchor: 0.5,\r\n                        yAnchor: textTexture.yAnchor(0.5),\r\n                        rotation_CCWRAD: 0\r\n                    };\r\n                }\r\n                textureRenderer.draw(gl, textTexture, xFrac, yFrac, textOpts);\r\n            }\r\n        }\r\n\r\n\r\n        // Finish up\r\n        //\r\n\r\n        textureRenderer.end(gl);\r\n        textTextures.retainTouched();\r\n    };\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, black } from '../color';\r\nimport { Axis2D } from './axis';\r\nimport { Painter } from '../core';\r\nimport { Program, UniformColor, UniformMatrix4f } from '../shader';\r\nimport { modelview_VERTSHADER, solid_FRAGSHADER } from '../misc';\r\nimport { newStaticBuffer } from '../buffer';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { GL, hasval } from '../util/util';\r\nimport { glOrthoAxis } from '../matrix';\r\n\r\nexport interface XyLinePainterOptions {\r\n    color?: Color;\r\n    blend?: boolean;\r\n    thickness?: number;\r\n}\r\n\r\n\r\n/**\r\n * Simple xy line painter which displays static data\r\n */\r\nexport function newXyLinePainter(axis: Axis2D, xCoords: number[], yCoords: number[], options?: XyLinePainterOptions): Painter {\r\n    const thickness = (hasval(options) && hasval(options.thickness) ? options.thickness : 4);\r\n    const color = (hasval(options) && hasval(options.color) ? options.color : black);\r\n    const blend = (hasval(options) && hasval(options.blend) ? options.blend : false);\r\n\r\n    const program = new Program(modelview_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix');\r\n\r\n    const coordArray = [];\r\n    for (let i = 0; i < xCoords.length; i++) {\r\n        coordArray[2 * i] = xCoords[i];\r\n        coordArray[2 * i + 1] = yCoords[i];\r\n    }\r\n    const coordFloatArray = new Float32Array(coordArray);\r\n    const coordBuffer = newStaticBuffer(coordFloatArray);\r\n    const dim = 2;\r\n    const count = coordFloatArray.length / dim;\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        if (blend) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n        }\r\n\r\n        // enable the shader\r\n        program.use(gl);\r\n\r\n        // set color and projection matrix variables\r\n        u_Color.setData(gl, color);\r\n\r\n        // set the projection matrix based on the axis bounds\r\n        u_modelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n\r\n        // XXX: IE doesn't support lineWidth\r\n        gl.lineWidth(thickness);\r\n\r\n        // enable vertex attribute array corresponding to vPosition variable in shader\r\n        gl.enableVertexAttribArray(0);\r\n\r\n        // bind buffer data to vertex attribute array\r\n        coordBuffer.bind(gl, GL.ARRAY_BUFFER);\r\n\r\n        // first argument corresponds to the 0 attrib array set above\r\n        // second argument indicates two coordinates per vertex\r\n        gl.vertexAttribPointer(0, dim, GL.FLOAT, false, 0, 0);\r\n\r\n        // draw the lines\r\n        gl.drawArrays(GL.LINE_STRIP, 0, count);\r\n\r\n        coordBuffer.unbind(gl, GL.ARRAY_BUFFER);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n\r\n\r\nexport function secondsToMillis(value_SECONDS: number): number {\r\n    return value_SECONDS * 1000;\r\n}\r\n\r\nexport function millisToSeconds(value_MILLIS: number): number {\r\n    return value_MILLIS / 1000;\r\n}\r\n\r\nexport function minutesToMillis(value_MINUTES: number): number {\r\n    return value_MINUTES * 60000;\r\n}\r\n\r\nexport function millisToMinutes(value_MILLIS: number): number {\r\n    return value_MILLIS / 60000;\r\n}\r\n\r\nexport function hoursToMillis(value_HOURS: number): number {\r\n    return value_HOURS * 3600000;\r\n}\r\n\r\nexport function millisToHours(value_MILLIS: number): number {\r\n    return value_MILLIS / 3600000;\r\n}\r\n\r\nexport function daysToMillis(value_DAYS: number): number {\r\n    return value_DAYS * 86400000;\r\n}\r\n\r\nexport function millisToDays(value_MILLIS: number): number {\r\n    return value_MILLIS / 86400000;\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Axis1D } from '../plot/axis';\r\n\r\n\r\nexport class TimeAxis1D extends Axis1D {\r\n\r\n    private _epoch_PMILLIS: number;\r\n\r\n    constructor(tMin_PMILLIS: number, tMax_PMILLIS: number, tMinLimit_PMILLIS = 0, tMaxLimit_PMILLIS = 253402329599000) {\r\n        const epoch_PMILLIS = 0.5 * (tMin_PMILLIS + tMax_PMILLIS);\r\n        super(tMin_PMILLIS - epoch_PMILLIS, tMax_PMILLIS - epoch_PMILLIS, tMinLimit_PMILLIS - epoch_PMILLIS, tMaxLimit_PMILLIS - epoch_PMILLIS);\r\n        this._epoch_PMILLIS = epoch_PMILLIS;\r\n    }\r\n\r\n    get tMin_PMILLIS(): number {\r\n        return (this._epoch_PMILLIS + this.vMin);\r\n    }\r\n\r\n    get tMax_PMILLIS(): number {\r\n        return (this._epoch_PMILLIS + this.vMax);\r\n    }\r\n\r\n    get tMinLimit_PMILLIS(): number {\r\n        return (this._epoch_PMILLIS + this.vMinLimit);\r\n    }\r\n\r\n    get tMaxLimit_PMILLIS(): number {\r\n        return (this._epoch_PMILLIS + this.vMaxLimit);\r\n    }\r\n\r\n    set tMin_PMILLIS(tMin_PMILLIS: number) {\r\n        this.vMin = (tMin_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n    set tMax_PMILLIS(tMax_PMILLIS: number) {\r\n        this.vMax = (tMax_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n    setTRange_PMILLIS(tMin_PMILLIS: number, tMax_PMILLIS: number) {\r\n        this.setVRange(tMin_PMILLIS - this._epoch_PMILLIS, tMax_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n    get tSize_MILLIS(): number {\r\n        return this.vSize;\r\n    }\r\n\r\n    vAtTime(t_PMILLIS: number): number {\r\n        return (t_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n    tAtFrac_PMILLIS(tFrac: number): number {\r\n        return (this._epoch_PMILLIS + this.vAtFrac(tFrac));\r\n    }\r\n\r\n    tFrac(t_PMILLIS: number): number {\r\n        return this.vFrac(t_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n    tPan(tAmount_MILLIS: number) {\r\n        this.pan(tAmount_MILLIS);\r\n    }\r\n\r\n    tZoom(factor: number, tAnchor_PMILLIS: number) {\r\n        this.zoom(factor, tAnchor_PMILLIS - this._epoch_PMILLIS);\r\n    }\r\n\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, black } from '../color';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { Side, solid_FRAGSHADER } from '../misc';\r\nimport { Painter } from '../core';\r\nimport { Program, Uniform1f, Uniform2f, UniformColor, Attribute } from '../shader';\r\nimport { edgeMarks_VERTSHADER } from '../plot/edge_axis_painter';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { Cache } from '../util/cache';\r\nimport { TextTexture2D, newTextTextureCache } from '../text';\r\nimport { TextureRenderer, TextureDrawOptions } from '../texture';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { ensureCapacityFloat32, GL, hasval, parseTime_PMILLIS, clamp } from '../util/util';\r\nimport { minutesToMillis, millisToDays, hoursToMillis, daysToMillis, millisToHours, secondsToMillis } from '../time';\r\nimport { Axis1D, getTickInterval, getTickCount, getTickPositions } from '../plot/axis';\r\nimport moment, { Moment } from 'moment';\r\n\r\n// XXX: Much of this is duplicated from edge_axis_painter\r\n\r\nexport class FormatOptions {\r\n    tickFormat: string;\r\n    prefixFormat: string;\r\n    constructor(tick: string, prefix: string) {\r\n        this.tickFormat = tick;\r\n        this.prefixFormat = prefix;\r\n    }\r\n}\r\n\r\nexport interface TimeAxisFormatOptions {\r\n    hour?: FormatOptions;\r\n    day?: FormatOptions;\r\n    month?: FormatOptions;\r\n    year?: FormatOptions;\r\n}\r\n\r\nexport interface TimeAxisPainterOptions {\r\n    tickSpacing?: number;\r\n    font?: string;\r\n    textColor?: Color;\r\n    tickColor?: Color;\r\n    tickSize?: number;\r\n    labelAlign?: number;\r\n    referenceDate?: string;\r\n    timeAxisFormat?: TimeAxisFormatOptions;\r\n    // if true, relative date labels in the future are positive (Day 1)\r\n    // if false, relative date labels in the future are negative (Day -1)\r\n    isFuturePositive?: boolean;\r\n}\r\n\r\n\r\nexport function newTimeAxisPainter(timeAxis: TimeAxis1D, labelSide: Side, displayTimeZone: string, tickTimeZone: string, options?: TimeAxisPainterOptions): Painter {\r\n    const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60);\r\n    const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif');\r\n    const textColor = (hasval(options) && hasval(options.textColor) ? options.textColor : black);\r\n    const tickColor = (hasval(options) && hasval(options.tickColor) ? options.tickColor : black);\r\n    const tickSize = (hasval(options) && hasval(options.tickSize) ? options.tickSize : 6);\r\n    const labelAlign = (hasval(options) && hasval(options.labelAlign) ? options.labelAlign : 0.5);\r\n    const referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined);\r\n    const isFuturePositive = (hasval(options) && hasval(options.isFuturePositive) ? options.isFuturePositive : true);\r\n    const timeAxisFormat = (hasval(options) && hasval(options.timeAxisFormat) ? options.timeAxisFormat : undefined);\r\n\r\n    const marksProgram = new Program(edgeMarks_VERTSHADER(labelSide), solid_FRAGSHADER);\r\n    const marksProgram_u_VMin = new Uniform1f(marksProgram, 'u_VMin');\r\n    const marksProgram_u_VSize = new Uniform1f(marksProgram, 'u_VSize');\r\n    const marksProgram_u_ViewportSize = new Uniform2f(marksProgram, 'u_ViewportSize');\r\n    const marksProgram_u_MarkSize = new Uniform1f(marksProgram, 'u_MarkSize');\r\n    const marksProgram_u_Color = new UniformColor(marksProgram, 'u_Color');\r\n    const marksProgram_a_VCoord = new Attribute(marksProgram, 'a_VCoord');\r\n\r\n    let markCoords = new Float32Array(0);\r\n    const markCoordsBuffer = newDynamicBuffer();\r\n\r\n    const textTextures = <Cache<TextTexture2D>>newTextTextureCache(font, textColor);\r\n    const textureRenderer = new TextureRenderer();\r\n    const hTickLabels = textTextures.value('-0123456789:.').h;\r\n    const isVerticalAxis = (labelSide === Side.LEFT || labelSide === Side.RIGHT);\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        const sizePixels = isVerticalAxis ? viewport.h : viewport.w;\r\n        if (sizePixels === 0) {\r\n            return;\r\n        }\r\n\r\n        const tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, sizePixels, tickSpacing, tickTimeZone, referenceDate_PMILLIS);\r\n        const tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS);\r\n        const tickCount = tickTimes_PMILLIS.length;\r\n\r\n\r\n        // Tick marks\r\n        //\r\n\r\n        marksProgram.use(gl);\r\n        marksProgram_u_VMin.setData(gl, timeAxis.vMin);\r\n        marksProgram_u_VSize.setData(gl, timeAxis.vSize);\r\n        marksProgram_u_ViewportSize.setData(gl, viewport.w, viewport.h);\r\n        marksProgram_u_MarkSize.setData(gl, tickSize);\r\n        marksProgram_u_Color.setData(gl, tickColor);\r\n\r\n        markCoords = ensureCapacityFloat32(markCoords, 4 * tickCount);\r\n        for (let n = 0; n < tickCount; n++) {\r\n            const v = timeAxis.vAtTime(tickTimes_PMILLIS[n]);\r\n            markCoords[(4 * n + 0)] = v;\r\n            markCoords[(4 * n + 1)] = 0;\r\n            markCoords[(4 * n + 2)] = v;\r\n            markCoords[(4 * n + 3)] = 1;\r\n        }\r\n        markCoordsBuffer.setData(markCoords.subarray(0, 4 * tickCount));\r\n        marksProgram_a_VCoord.setDataAndEnable(gl, markCoordsBuffer, 2, GL.FLOAT);\r\n\r\n        // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1\r\n        gl.lineWidth(1);\r\n        gl.drawArrays(GL.LINES, 0, 2 * tickCount);\r\n\r\n        marksProgram_a_VCoord.disable(gl);\r\n        marksProgram.endUse(gl);\r\n\r\n        gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n        gl.enable(GL.BLEND);\r\n\r\n\r\n        // Tick labels\r\n        //\r\n\r\n        const ticks: TickDisplayData = getTickDisplayData(tickInterval_MILLIS, referenceDate_PMILLIS, displayTimeZone, isFuturePositive, timeAxisFormat);\r\n\r\n        textTextures.resetTouches();\r\n        textureRenderer.begin(gl, viewport);\r\n\r\n        for (let n = 0; n < tickCount; n++) {\r\n            const tickTime_PMILLIS = tickTimes_PMILLIS[n];\r\n            const tFrac = timeAxis.tFrac(tickTime_PMILLIS);\r\n            if (tFrac < 0 || tFrac >= 1) {\r\n                continue;\r\n            }\r\n\r\n            const tickLabel: string = ticks.tickFormat(tickTime_PMILLIS);\r\n            const textTexture = textTextures.value(tickLabel);\r\n\r\n            let xFrac: number;\r\n            let yFrac: number;\r\n            if (labelSide === Side.LEFT || labelSide === Side.RIGHT) {\r\n                const yAnchor = textTexture.yAnchor(0.43);\r\n                const j0 = (tFrac * viewport.h) - yAnchor * textTexture.h;\r\n                const j = clamp(0, viewport.h - textTexture.h, j0);\r\n                yFrac = j / viewport.h;\r\n\r\n                if (labelSide === Side.LEFT) {\r\n                    xFrac = (viewport.w - tickSize - 2 - textTexture.w) / viewport.w;\r\n                }\r\n                else {\r\n                    xFrac = (tickSize + 2) / viewport.w;\r\n                }\r\n            }\r\n            else {\r\n                const xAnchor = 0.45;\r\n                const i0 = (tFrac * viewport.w) - xAnchor * (textTexture.w);\r\n                const i = clamp(0, viewport.w - textTexture.w, i0);\r\n                xFrac = i / viewport.w;\r\n\r\n                if (labelSide === Side.BOTTOM) {\r\n                    yFrac = (viewport.h - tickSize - 2 - hTickLabels) / viewport.h;\r\n                }\r\n                else {\r\n                    yFrac = (tickSize + 2) / viewport.h;\r\n                }\r\n            }\r\n            textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: 0, yAnchor: 0 });\r\n        }\r\n\r\n\r\n        // Axis label\r\n        //\r\n\r\n        if (ticks.timeStructFactory) {\r\n            const timeStructs = createTimeStructs(timeAxis, ticks.timeStructFactory, tickTimeZone, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign);\r\n            for (let n = 0; n < timeStructs.length; n++) {\r\n                const timeStruct = timeStructs[n];\r\n                const text = ticks.prefixFormat(timeStruct);\r\n                const textTexture = textTextures.value(text);\r\n\r\n                const halfTextFrac = 0.5 * textTexture.w / viewport.w;\r\n                const minFrac = timeAxis.tFrac(timeStruct.start_PMILLIS) - halfTextFrac;\r\n                const maxFrac = timeAxis.tFrac(timeStruct.end_PMILLIS) + halfTextFrac;\r\n                const tFrac = clamp(minFrac, maxFrac, timeAxis.tFrac(timeStruct.textCenter_PMILLIS));\r\n                if (tFrac - halfTextFrac < 0 || tFrac + halfTextFrac > 1) {\r\n                    continue;\r\n                }\r\n\r\n                let xFrac: number;\r\n                let yFrac: number;\r\n                let textOpts: TextureDrawOptions;\r\n                if (labelSide === Side.LEFT || labelSide === Side.RIGHT) {\r\n                    // Using hTickLabels here works out about right, even though the tick-label text is horizontal\r\n                    const xFrac0 = 0.5 * (viewport.w - tickSize - 2 - hTickLabels) / viewport.w;\r\n                    xFrac = (labelSide === Side.LEFT ? xFrac0 : 1 - xFrac0);\r\n                    yFrac = tFrac;\r\n                    textOpts = {\r\n                        xAnchor: textTexture.yAnchor(0.5),\r\n                        yAnchor: 0.5,\r\n                        rotation_CCWRAD: 0.5 * Math.PI\r\n                    };\r\n                }\r\n                else {\r\n                    const yFrac0 = 0.5 * (viewport.h - tickSize - 2 - hTickLabels) / viewport.h;\r\n                    yFrac = (labelSide === Side.BOTTOM ? yFrac0 : 1 - yFrac0);\r\n                    xFrac = tFrac;\r\n                    textOpts = {\r\n                        xAnchor: 0.5,\r\n                        yAnchor: textTexture.yAnchor(0.5),\r\n                        rotation_CCWRAD: 0\r\n                    };\r\n                }\r\n                textureRenderer.draw(gl, textTexture, xFrac, yFrac, textOpts);\r\n            }\r\n        }\r\n\r\n\r\n        // Finish up\r\n        //\r\n\r\n        textureRenderer.end(gl);\r\n        textTextures.retainTouched();\r\n    };\r\n}\r\n\r\nfunction getTickDisplayData(tickInterval_MILLIS: number, referenceDate_PMILLIS: number, displayTimeZone: string, isFuturePositive: boolean, timeAxisFormat: TimeAxisFormatOptions): TickDisplayData {\r\n    if (hasval(referenceDate_PMILLIS)) {\r\n        return getTickDisplayDataRelative(tickInterval_MILLIS, referenceDate_PMILLIS, isFuturePositive);\r\n    }\r\n    else {\r\n        return getTickDisplayDataAbsolute(tickInterval_MILLIS, displayTimeZone, timeAxisFormat);\r\n    }\r\n}\r\n\r\nfunction getTickDisplayDataRelative(tickInterval_MILLIS: number, referenceDate_PMILLIS: number, isFuturePositive: boolean): TickDisplayData {\r\n    let tickFormat: TickFormat = null;\r\n    let prefixFormat: PrefixFormat = null;\r\n    let timeStructFactory: TimeStructFactory = null;\r\n    if (tickInterval_MILLIS <= minutesToMillis(1)) {\r\n        tickFormat = function (tickTime_PMILLIS: number): string {\r\n            const elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS);\r\n            const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS);\r\n            const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS);\r\n            const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24;\r\n            const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS);\r\n            const elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60;\r\n            let elapsedTime_MIN_WHOLE = Math.floor(elapsedTime_MIN);\r\n            const elapsedTime_SEC = (elapsedTime_MIN - elapsedTime_MIN_WHOLE) * 60;\r\n            // use round() here instead of floor() because we always expect ticks to be on even second\r\n            // boundaries but rounding error will cause us to be somewhat unpredictably above or below\r\n            // the nearest even second boundary\r\n            let elapsedTime_SEC_WHOLE = Math.round(elapsedTime_SEC);\r\n            // however the above fails when we round up to a whole minute, so special case that\r\n            if (elapsedTime_SEC_WHOLE >= 60) {\r\n                elapsedTime_SEC_WHOLE -= 60;\r\n                elapsedTime_MIN_WHOLE += 1;\r\n            }\r\n            if (elapsedTime_MIN_WHOLE >= 60) {\r\n                elapsedTime_MIN_WHOLE = 0;\r\n            }\r\n\r\n            const min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE;\r\n            const sec: string = elapsedTime_SEC_WHOLE < 10 ? '0' + elapsedTime_SEC_WHOLE : '' + elapsedTime_SEC_WHOLE;\r\n\r\n            return min + ':' + sec;\r\n        };\r\n\r\n        prefixFormat = function (timeStruct: TimeStruct): string {\r\n            const center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS;\r\n            let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS;\r\n            const negative = (elapsedTime_MILLIS < 0);\r\n            const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : '';\r\n            elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS);\r\n\r\n            const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS);\r\n            const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS);\r\n            const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24;\r\n            const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS);\r\n\r\n            return 'Day ' + signString + elapsedTime_DAYS_WHOLE + ' Hour ' + signString + elapsedTime_HOURS_WHOLE;\r\n        };\r\n\r\n        timeStructFactory = function (): TimeStruct { return new TimeStruct(); };\r\n    }\r\n    else if (tickInterval_MILLIS <= hoursToMillis(12)) {\r\n        tickFormat = function (tickTime_PMILLIS: number): string {\r\n            const elapsedTime_MILLIS = Math.abs(tickTime_PMILLIS - referenceDate_PMILLIS);\r\n            const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS);\r\n            const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS);\r\n            const elapsedTime_HOURS = (elapsedTime_DAYS - elapsedTime_DAYS_WHOLE) * 24;\r\n            let elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS);\r\n            const elapsedTime_MIN = (elapsedTime_HOURS - elapsedTime_HOURS_WHOLE) * 60;\r\n            // use round() here instead of floor() because we always expect ticks to be on even minute\r\n            // boundaries but rounding error will cause us to be somewhat unpredictably above or below\r\n            // the nearest even minute boundary\r\n            let elapsedTime_MIN_WHOLE = Math.round(elapsedTime_MIN);\r\n            // however the above fails when we round up to a whole hour, so special case that\r\n            if (elapsedTime_MIN_WHOLE >= 60) {\r\n                elapsedTime_MIN_WHOLE -= 60;\r\n                elapsedTime_HOURS_WHOLE += 1;\r\n            }\r\n            if (elapsedTime_HOURS_WHOLE >= 24) {\r\n                elapsedTime_HOURS_WHOLE = 0;\r\n            }\r\n\r\n            const hour: string = elapsedTime_HOURS_WHOLE < 10 ? '0' + elapsedTime_HOURS_WHOLE : '' + elapsedTime_HOURS_WHOLE;\r\n            const min: string = elapsedTime_MIN_WHOLE < 10 ? '0' + elapsedTime_MIN_WHOLE : '' + elapsedTime_MIN_WHOLE;\r\n\r\n            return hour + ':' + min;\r\n        };\r\n\r\n        prefixFormat = function (timeStruct: TimeStruct): string {\r\n            const center_PMILLIS = (timeStruct.end_PMILLIS - timeStruct.start_PMILLIS) / 2 + timeStruct.start_PMILLIS;\r\n            let elapsedTime_MILLIS = center_PMILLIS - referenceDate_PMILLIS;\r\n            const negative = (elapsedTime_MILLIS < 0);\r\n            const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : '';\r\n            elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS);\r\n            const elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS));\r\n            return 'Day ' + signString + elapsedTime_DAYS;\r\n        };\r\n\r\n        timeStructFactory = function (): TimeStruct { return new TimeStruct(); };\r\n    }\r\n    else {\r\n        tickFormat = function (tickTime_PMILLIS: number): string {\r\n            let elapsedTime_MILLIS = tickTime_PMILLIS - referenceDate_PMILLIS;\r\n            const negative = (elapsedTime_MILLIS < 0);\r\n            const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : '';\r\n            elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS);\r\n            const elapsedTime_DAYS = Math.floor(millisToDays(elapsedTime_MILLIS));\r\n            return elapsedTime_DAYS === 0 ? '' + elapsedTime_DAYS : signString + elapsedTime_DAYS;\r\n        };\r\n    }\r\n\r\n    return <TickDisplayData>{ prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory: timeStructFactory };\r\n}\r\n\r\nfunction getTickDisplayDataAbsolute(tickInterval_MILLIS: number, displayTimeZone: string, timeAxisFormat: TimeAxisFormatOptions): TickDisplayData {\r\n\r\n    let tickFormat: TickFormat = null;\r\n    let prefixFormat: PrefixFormat = null;\r\n    let timeStructFactory: TimeStructFactory = null;\r\n    const defaultTickFormat = function (format: string): TickFormat { return function (tickTime_PMILLIS: number): string { return moment(tickTime_PMILLIS).zone(displayTimeZone).format(format); }; };\r\n    const defaultPrefixFormat = function (format: string): PrefixFormat { return function (timeStruct: TimeStruct): string { return moment(timeStruct.textCenter_PMILLIS).zone(displayTimeZone).format(format); }; };\r\n\r\n    if (tickInterval_MILLIS <= minutesToMillis(1)) {\r\n        const formatOptions = new FormatOptions('mm:ss', 'D MMM HH:00');\r\n        const hour = (hasval(timeAxisFormat) && hasval(timeAxisFormat.hour) ? timeAxisFormat.hour : formatOptions);\r\n        tickFormat = defaultTickFormat((hasval(hour.tickFormat) && hour.tickFormat !== '' ? hour.tickFormat : formatOptions.tickFormat));\r\n        prefixFormat = defaultPrefixFormat((hasval(hour.prefixFormat) && hour.prefixFormat !== '' ? hour.prefixFormat : formatOptions.prefixFormat));\r\n        timeStructFactory = function (): TimeStruct { return new HourStruct(); };\r\n    }\r\n    else if (tickInterval_MILLIS <= hoursToMillis(12)) {\r\n        const formatOptions = new FormatOptions('HH:mm', 'D MMM YYYY');\r\n        const day = (hasval(timeAxisFormat) && hasval(timeAxisFormat.day) ? timeAxisFormat.day : formatOptions);\r\n        tickFormat = defaultTickFormat((hasval(day.tickFormat) && day.tickFormat !== '' ? day.tickFormat : formatOptions.tickFormat));\r\n        prefixFormat = defaultPrefixFormat((hasval(day.prefixFormat) && day.prefixFormat !== '' ? day.prefixFormat : formatOptions.prefixFormat));\r\n        timeStructFactory = function (): TimeStruct { return new DayStruct(); };\r\n    }\r\n    else if (tickInterval_MILLIS <= daysToMillis(10)) {\r\n        const formatOptions = new FormatOptions('D', 'MMM YYYY');\r\n        const month = (hasval(timeAxisFormat) && hasval(timeAxisFormat.month) ? timeAxisFormat.month : formatOptions);\r\n        tickFormat = defaultTickFormat((hasval(month.tickFormat) && month.tickFormat !== '' ? month.tickFormat : formatOptions.tickFormat));\r\n        prefixFormat = defaultPrefixFormat((hasval(month.prefixFormat) && month.prefixFormat !== '' ? month.prefixFormat : formatOptions.prefixFormat));\r\n        timeStructFactory = function (): TimeStruct { return new MonthStruct(); };\r\n    }\r\n    else if (tickInterval_MILLIS <= daysToMillis(60)) {\r\n        const formatOptions = new FormatOptions('MMM', 'YYYY');\r\n        const year = (hasval(timeAxisFormat) && hasval(timeAxisFormat.year) ? timeAxisFormat.year : formatOptions);\r\n        tickFormat = defaultTickFormat((hasval(year.tickFormat) && year.tickFormat !== '' ? year.tickFormat : formatOptions.tickFormat));\r\n        prefixFormat = defaultPrefixFormat((hasval(year.prefixFormat) && year.prefixFormat !== '' ? year.prefixFormat : formatOptions.prefixFormat));\r\n        timeStructFactory = function (): TimeStruct { return new YearStruct(); };\r\n    }\r\n    else {\r\n        tickFormat = defaultTickFormat('YYYY');\r\n    }\r\n\r\n    return <TickDisplayData>{ prefixFormat: prefixFormat, tickFormat: tickFormat, timeStructFactory: timeStructFactory };\r\n}\r\n\r\ninterface TickDisplayData {\r\n    prefixFormat: PrefixFormat;\r\n    tickFormat: TickFormat;\r\n    timeStructFactory: TimeStructFactory;\r\n}\r\n\r\ntype PrefixFormat = (timeStruct: TimeStruct) => string;\r\n\r\ntype TickFormat = (tickTime_PMILLIS: number) => string;\r\n\r\ntype TimeStructFactory = () => TimeStruct;\r\n\r\nclass TimeStruct {\r\n    public start_PMILLIS: number;\r\n    public end_PMILLIS: number;\r\n    public viewStart_PMILLIS: number;\r\n    public viewEnd_PMILLIS: number;\r\n    public textCenter_PMILLIS: number;\r\n\r\n    setTime(time_PMILLIS: number, timeZone: string): Moment {\r\n        return moment(time_PMILLIS).zone(timeZone);\r\n    }\r\n\r\n    incrementTime(m: Moment) {\r\n    }\r\n}\r\n\r\nclass YearStruct extends TimeStruct {\r\n    setTime(time_PMILLIS: number, timeZone: string): Moment {\r\n        const m = moment(time_PMILLIS).zone(timeZone);\r\n        m.month(0);\r\n        m.date(0);\r\n        m.hours(0);\r\n        m.minutes(0);\r\n        m.seconds(0);\r\n        return m;\r\n    }\r\n\r\n    incrementTime(m: Moment) {\r\n        m.add('years', 1);\r\n    }\r\n}\r\n\r\n\r\nclass MonthStruct extends TimeStruct {\r\n    setTime(time_PMILLIS: number, timeZone: string): Moment {\r\n        const m = moment(time_PMILLIS).zone(timeZone);\r\n        m.date(0);\r\n        m.hours(0);\r\n        m.minutes(0);\r\n        m.seconds(0);\r\n        return m;\r\n    }\r\n\r\n    incrementTime(m: Moment) {\r\n        m.add('months', 1);\r\n    }\r\n}\r\n\r\n\r\nclass DayStruct extends TimeStruct {\r\n    setTime(time_PMILLIS: number, timeZone: string): Moment {\r\n        const m = moment(time_PMILLIS).zone(timeZone);\r\n        m.hours(0);\r\n        m.minutes(0);\r\n        m.seconds(0);\r\n        return m;\r\n    }\r\n\r\n    incrementTime(m: Moment) {\r\n        m.add('days', 1);\r\n    }\r\n}\r\n\r\n\r\nclass HourStruct extends TimeStruct {\r\n    setTime(time_PMILLIS: number, timeZone: string): Moment {\r\n        const m = moment(time_PMILLIS).zone(timeZone);\r\n        m.minutes(0);\r\n        m.seconds(0);\r\n        return m;\r\n    }\r\n\r\n    incrementTime(m: Moment) {\r\n        m.add('hours', 1);\r\n    }\r\n}\r\n\r\nfunction createTimeStructs(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] {\r\n    if (hasval(referenceDate_PMILLIS)) {\r\n        const tickInterval_MILLIS = getTickInterval_MILLIS(tickTimes_PMILLIS);\r\n\r\n        if (tickInterval_MILLIS <= minutesToMillis(1)) {\r\n            return createTimeStructsRelativeHours(timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign);\r\n        }\r\n        else {\r\n            return createTimeStructsRelativeDays(timeAxis, referenceDate_PMILLIS, isFuturePositive, tickTimes_PMILLIS, labelAlign);\r\n        }\r\n    }\r\n    else {\r\n        return createTimeStructsAbsolute(timeAxis, factory, timeZone, tickTimes_PMILLIS, labelAlign);\r\n    }\r\n}\r\n\r\n\r\nfunction createTimeStructsRelativeHours(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] {\r\n\r\n    const dMin_PMILLIS = timeAxis.tMin_PMILLIS;\r\n    const dMax_PMILLIS = timeAxis.tMax_PMILLIS;\r\n\r\n    const timeStructs: TimeStruct[] = [];\r\n    let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY;\r\n\r\n    let previous_HOURS = null;\r\n    let previous_SIGN = null;\r\n\r\n    for (let n = 0; n < tickTimes_PMILLIS.length; n++) {\r\n\r\n        let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS;\r\n        const negative = (elapsedTime_MILLIS < 0);\r\n        const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : '';\r\n        elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS);\r\n        const elapsedTime_HOURS = millisToHours(elapsedTime_MILLIS);\r\n        const elapsedTime_HOURS_WHOLE = Math.floor(elapsedTime_HOURS);\r\n\r\n        if (hasval(previous_HOURS) && elapsedTime_HOURS_WHOLE === previous_HOURS && negative === previous_SIGN) {\r\n            continue;\r\n        }\r\n        previous_HOURS = elapsedTime_HOURS_WHOLE;\r\n        previous_SIGN = negative;\r\n\r\n        const timeStruct = new TimeStruct();\r\n\r\n        if (negative) {\r\n            timeStruct.end_PMILLIS = hoursToMillis(-elapsedTime_HOURS_WHOLE) + referenceDate_PMILLIS;\r\n            timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - hoursToMillis(1);\r\n        }\r\n        else {\r\n            timeStruct.start_PMILLIS = hoursToMillis(elapsedTime_HOURS_WHOLE) + referenceDate_PMILLIS;\r\n            timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + hoursToMillis(1);\r\n        }\r\n\r\n        timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS);\r\n        timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS);\r\n\r\n        maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS);\r\n\r\n        timeStructs.push(timeStruct);\r\n    }\r\n\r\n    setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS);\r\n\r\n    return timeStructs;\r\n}\r\n\r\nfunction createTimeStructsRelativeDays(timeAxis: TimeAxis1D, referenceDate_PMILLIS: number, isFuturePositive: boolean, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] {\r\n\r\n    const dMin_PMILLIS = timeAxis.tMin_PMILLIS;\r\n    const dMax_PMILLIS = timeAxis.tMax_PMILLIS;\r\n\r\n    const timeStructs: TimeStruct[] = [];\r\n    let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY;\r\n\r\n    let previous_DAYS = null;\r\n    let previous_SIGN = null;\r\n\r\n    for (let n = 0; n < tickTimes_PMILLIS.length; n++) {\r\n\r\n        let elapsedTime_MILLIS = tickTimes_PMILLIS[n] - referenceDate_PMILLIS;\r\n        const negative = (elapsedTime_MILLIS < 0);\r\n        const signString = (negative && isFuturePositive) || (!negative && !isFuturePositive) ? '-' : '';\r\n        elapsedTime_MILLIS = Math.abs(elapsedTime_MILLIS);\r\n        const elapsedTime_DAYS = millisToDays(elapsedTime_MILLIS);\r\n        const elapsedTime_DAYS_WHOLE = Math.floor(elapsedTime_DAYS);\r\n\r\n        if (hasval(previous_DAYS) && elapsedTime_DAYS_WHOLE === previous_DAYS && negative === previous_SIGN) {\r\n            continue;\r\n        }\r\n        previous_DAYS = elapsedTime_DAYS_WHOLE;\r\n        previous_SIGN = negative;\r\n\r\n        const timeStruct = new TimeStruct();\r\n\r\n        if (negative) {\r\n            timeStruct.end_PMILLIS = daysToMillis(-elapsedTime_DAYS_WHOLE) + referenceDate_PMILLIS;\r\n            timeStruct.start_PMILLIS = timeStruct.end_PMILLIS - daysToMillis(1);\r\n        }\r\n        else {\r\n            timeStruct.start_PMILLIS = daysToMillis(elapsedTime_DAYS_WHOLE) + referenceDate_PMILLIS;\r\n            timeStruct.end_PMILLIS = timeStruct.start_PMILLIS + daysToMillis(1);\r\n        }\r\n\r\n        timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS);\r\n        timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS);\r\n\r\n        maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS);\r\n\r\n        timeStructs.push(timeStruct);\r\n    }\r\n\r\n    setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS);\r\n\r\n    return timeStructs;\r\n}\r\n\r\nfunction createTimeStructsAbsolute(timeAxis: TimeAxis1D, factory: TimeStructFactory, timeZone: string, tickTimes_PMILLIS: number[], labelAlign: number): TimeStruct[] {\r\n    const dMin_PMILLIS = timeAxis.tMin_PMILLIS;\r\n    const dMax_PMILLIS = timeAxis.tMax_PMILLIS;\r\n\r\n    const timeStructs: TimeStruct[] = [];\r\n    let maxViewDuration_MILLIS = Number.NEGATIVE_INFINITY;\r\n\r\n    let previous_PMILLIS: number = null;\r\n\r\n    for (let n = 0; n < tickTimes_PMILLIS.length; n++) {\r\n        const tickTime_PMILLIS = tickTimes_PMILLIS[n];\r\n        const timeStruct = factory();\r\n        const m = timeStruct.setTime(tickTime_PMILLIS, timeZone);\r\n        const start_PMILLIS = m.valueOf();\r\n\r\n        // XXX: Floating-point comparison can be unintuitive\r\n        if (hasval(previous_PMILLIS) && start_PMILLIS === previous_PMILLIS) {\r\n            continue;\r\n        }\r\n        previous_PMILLIS = start_PMILLIS;\r\n\r\n        timeStruct.start_PMILLIS = start_PMILLIS;\r\n        timeStruct.incrementTime(m);\r\n        timeStruct.end_PMILLIS = m.valueOf();\r\n        timeStruct.viewStart_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMin_PMILLIS);\r\n        timeStruct.viewEnd_PMILLIS = clamp(timeStruct.start_PMILLIS, timeStruct.end_PMILLIS, dMax_PMILLIS);\r\n\r\n        maxViewDuration_MILLIS = Math.max(maxViewDuration_MILLIS, timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS);\r\n\r\n        timeStructs.push(timeStruct);\r\n    }\r\n\r\n    setTimeStructTextCenter(timeStructs, labelAlign, maxViewDuration_MILLIS);\r\n\r\n    return timeStructs;\r\n}\r\n\r\nfunction setTimeStructTextCenter(timeStructs: TimeStruct[], labelAlign: number, maxViewDuration_MILLIS: number) {\r\n    for (let n = 0; n < timeStructs.length; n++) {\r\n        const timeStruct = timeStructs[n];\r\n        const duration_MILLIS = timeStruct.viewEnd_PMILLIS - timeStruct.viewStart_PMILLIS;\r\n        const midpoint_PMILLIS = timeStruct.viewStart_PMILLIS + labelAlign * duration_MILLIS;\r\n        const edge_PMILLIS = (timeStruct.viewStart_PMILLIS === timeStruct.start_PMILLIS ? timeStruct.viewEnd_PMILLIS : timeStruct.viewStart_PMILLIS);\r\n        const edginess = 1 - clamp(0, 1, duration_MILLIS / maxViewDuration_MILLIS);\r\n        timeStruct.textCenter_PMILLIS = midpoint_PMILLIS + edginess * (edge_PMILLIS - midpoint_PMILLIS);\r\n    }\r\n}\r\n\r\nexport function getTickTimes_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, timeZone: string, referenceDate_PMILLIS: number): number[] {\r\n    if (hasval(referenceDate_PMILLIS)) {\r\n        return getTickTimesRelative_PMILLIS(timeAxis, sizePixels, tickSpacing, referenceDate_PMILLIS);\r\n    }\r\n    else {\r\n        return getTickTimesAbsolute_PMILLIS(timeAxis, sizePixels, tickSpacing, timeZone);\r\n    }\r\n}\r\n\r\nfunction getTickTimesRelative_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] {\r\n\r\n    const dMin_PMILLIS = timeAxis.tMin_PMILLIS;\r\n    const dMax_PMILLIS = timeAxis.tMax_PMILLIS;\r\n    const approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels;\r\n\r\n    if (approxTickInterval_MILLIS < daysToMillis(1)) {\r\n        return getHourTickTimesRelative_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, referenceDate_PMILLIS);\r\n    }\r\n    else {\r\n        return getDayTickTimesRelative_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, sizePixels, tickSpacing, referenceDate_PMILLIS);\r\n    }\r\n}\r\n\r\nfunction getHourTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, referenceDate_PMILLIS: number): number[] {\r\n    const tickTimes = getHourTickTimes_PMILLIS(dMin_PMILLIS - referenceDate_PMILLIS, dMax_PMILLIS - referenceDate_PMILLIS, approxTickInterval_MILLIS, 0);\r\n\r\n    for (let n = 0; n < tickTimes.length; n++) {\r\n        tickTimes[n] = tickTimes[n] + referenceDate_PMILLIS;\r\n    }\r\n\r\n    return tickTimes;\r\n}\r\n\r\nfunction getDayTickTimesRelative_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, sizePixels: number, tickSpacing: number, referenceDate_PMILLIS: number): number[] {\r\n    const axis = new Axis1D(millisToDays(dMin_PMILLIS - referenceDate_PMILLIS), millisToDays(dMax_PMILLIS - referenceDate_PMILLIS));\r\n    const approxNumTicks = sizePixels / tickSpacing;\r\n    const tickInterval = getTickInterval(axis, approxNumTicks);\r\n    const tickCount = getTickCount(axis, tickInterval);\r\n    const tickPositions = new Float32Array(tickCount);\r\n    getTickPositions(axis, tickInterval, tickCount, tickPositions);\r\n    const tickTimes_PMILLIS = <number[]>[];\r\n    for (let n = 0; n < tickCount; n++) {\r\n        tickTimes_PMILLIS.push(daysToMillis(tickPositions[n]) + referenceDate_PMILLIS);\r\n    }\r\n    return tickTimes_PMILLIS;\r\n}\r\n\r\nfunction getTickTimesAbsolute_PMILLIS(timeAxis: TimeAxis1D, sizePixels: number, tickSpacing: number, timeZone: string): number[] {\r\n    const dMin_PMILLIS = timeAxis.tMin_PMILLIS;\r\n    const dMax_PMILLIS = timeAxis.tMax_PMILLIS;\r\n\r\n    // NOTE: moment.js reports time zone offset reversed from Java Calendar, thus the negative sign\r\n    const mMin = moment(dMin_PMILLIS).zone(timeZone);\r\n    const zoneOffset_MILLIS = -minutesToMillis(mMin.zone());\r\n\r\n    const approxTickInterval_MILLIS = tickSpacing * (dMax_PMILLIS - dMin_PMILLIS) / sizePixels;\r\n\r\n    if (approxTickInterval_MILLIS > daysToMillis(60)) {\r\n        return getYearTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone);\r\n    }\r\n    else if (approxTickInterval_MILLIS > daysToMillis(10)) {\r\n        return getMonthTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone);\r\n    }\r\n    else if (approxTickInterval_MILLIS > daysToMillis(1)) {\r\n        return getDayTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, timeZone);\r\n    }\r\n    else {\r\n        return getHourTickTimes_PMILLIS(dMin_PMILLIS, dMax_PMILLIS, approxTickInterval_MILLIS, zoneOffset_MILLIS);\r\n    }\r\n}\r\n\r\n\r\nfunction getYearTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] {\r\n    const m = moment(dMin_PMILLIS).zone(timeZone);\r\n\r\n    const currentYear = m.year();\r\n    const daysPerYear = 365.25; // assume 365.25 days in every year as a heuristic\r\n    const approxTickInterval_YEARS = millisToDays(approxTickInterval_MILLIS) / daysPerYear;\r\n\r\n    const yearOrderFactor = 6.0;\r\n    const stepYears = getYearStep(approxTickInterval_YEARS * yearOrderFactor);\r\n    const startYear = getRoundedYear(currentYear, stepYears);\r\n\r\n    m.year(startYear).month(0).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);\r\n\r\n    const tickTimes_PMILLIS = <number[]>[];\r\n    while (m.valueOf() <= dMax_PMILLIS) {\r\n        tickTimes_PMILLIS.push(m.valueOf());\r\n        m.add('years', stepYears);\r\n    }\r\n    return tickTimes_PMILLIS;\r\n}\r\n\r\n\r\nfunction getYearStep(spanYears: number): number {\r\n    const log10Span = Math.log(spanYears) / Math.LN10;\r\n    let orderSpan = Math.floor(log10Span);\r\n    if ((log10Span - orderSpan) > (1.0 - 1e-12)) {\r\n        orderSpan++;\r\n    }\r\n\r\n    return Math.max(1, Math.pow(10, orderSpan));\r\n}\r\n\r\n\r\nfunction getRoundedYear(currentYear: number, yearStep: number): number {\r\n    const numSteps = Math.floor(currentYear / yearStep);\r\n    return numSteps * yearStep;\r\n}\r\n\r\n\r\nfunction getMonthTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] {\r\n    const m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);\r\n    const tickTimes_PMILLIS = <number[]>[];\r\n    while (m.valueOf() <= dMax_PMILLIS) {\r\n        tickTimes_PMILLIS.push(m.valueOf());\r\n        m.add('months', 1);\r\n    }\r\n    return tickTimes_PMILLIS;\r\n}\r\n\r\n\r\nfunction getDayTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, timeZone: string): number[] {\r\n    const tickInterval_DAYS = calculateTickInterval_DAYS(approxTickInterval_MILLIS);\r\n\r\n    // initialize calendar off start time and reset fields less than month\r\n    const m = moment(dMin_PMILLIS).zone(timeZone).date(1).hours(0).minutes(0).seconds(0).milliseconds(0);\r\n\r\n    const endTime_PMILLIS = dMax_PMILLIS + daysToMillis(tickInterval_DAYS);\r\n    let currentMonth = m.month();\r\n\r\n    const tickTimes_PMILLIS = <number[]>[];\r\n\r\n    while (m.valueOf() <= endTime_PMILLIS) {\r\n        // ensure ticks always fall on the first day of the month\r\n        const newMonth = m.month();\r\n        if (newMonth !== currentMonth) {\r\n            m.date(1);\r\n            currentMonth = newMonth;\r\n        }\r\n\r\n        // prevent display of ticks too close to the end of the month\r\n        const maxDom = m.clone().endOf('month').date();\r\n        const dom = m.date();\r\n        if (maxDom - dom + 1 >= tickInterval_DAYS / 2) {\r\n            tickTimes_PMILLIS.push(m.valueOf());\r\n        }\r\n\r\n        m.add('days', tickInterval_DAYS);\r\n    }\r\n\r\n    return tickTimes_PMILLIS;\r\n}\r\n\r\n\r\nfunction getHourTickTimes_PMILLIS(dMin_PMILLIS: number, dMax_PMILLIS: number, approxTickInterval_MILLIS: number, zoneOffset_MILLIS: number): number[] {\r\n    const tickInterval_MILLIS = calculateTickInterval_MILLIS(approxTickInterval_MILLIS);\r\n\r\n    const ticksSince1970 = Math.floor((dMin_PMILLIS + zoneOffset_MILLIS) / tickInterval_MILLIS);\r\n    const firstTick_PMILLIS = (ticksSince1970 * tickInterval_MILLIS) - zoneOffset_MILLIS;\r\n    const numTicks = Math.ceil(1 + (dMax_PMILLIS - firstTick_PMILLIS) / tickInterval_MILLIS);\r\n\r\n    const tickTimes_PMILLIS = <number[]>[];\r\n    for (let n = 0; n < numTicks; n++) {\r\n        tickTimes_PMILLIS.push(firstTick_PMILLIS + n * tickInterval_MILLIS);\r\n    }\r\n    return tickTimes_PMILLIS;\r\n}\r\n\r\n\r\nconst tickIntervalRungs_DAYS = [2, 3, 4, 5, 8, 10];\r\n\r\n\r\nfunction calculateTickInterval_DAYS(approxTickInterval_MILLIS: number) {\r\n    const approxTickInterval_DAYS = millisToDays(approxTickInterval_MILLIS);\r\n    for (let n = 0; n < tickIntervalRungs_DAYS.length; n++) {\r\n        if (approxTickInterval_DAYS <= tickIntervalRungs_DAYS[n]) {\r\n            return tickIntervalRungs_DAYS[n];\r\n        }\r\n    }\r\n    return 10;\r\n}\r\n\r\n\r\nconst tickIntervalRungs_MILLIS = [secondsToMillis(1),\r\nsecondsToMillis(2),\r\nsecondsToMillis(5),\r\nsecondsToMillis(10),\r\nsecondsToMillis(15),\r\nsecondsToMillis(20),\r\nsecondsToMillis(30),\r\nminutesToMillis(1),\r\nminutesToMillis(2),\r\nminutesToMillis(5),\r\nminutesToMillis(10),\r\nminutesToMillis(15),\r\nminutesToMillis(20),\r\nminutesToMillis(30),\r\nhoursToMillis(1),\r\nhoursToMillis(2),\r\nhoursToMillis(3),\r\nhoursToMillis(6),\r\nhoursToMillis(12),\r\ndaysToMillis(1)];\r\n\r\n\r\nfunction calculateTickInterval_MILLIS(approxTickInterval_MILLIS: number): number {\r\n    for (let n = 0; n < tickIntervalRungs_MILLIS.length; n++) {\r\n        if (approxTickInterval_MILLIS <= tickIntervalRungs_MILLIS[n]) {\r\n            return tickIntervalRungs_MILLIS[n];\r\n        }\r\n    }\r\n    return daysToMillis(1);\r\n}\r\n\r\n\r\nfunction getTickInterval_MILLIS(tickTimes_PMILLIS: number[]): number {\r\n    if (hasval(tickTimes_PMILLIS) && tickTimes_PMILLIS.length > 1) {\r\n        return (tickTimes_PMILLIS[1] - tickTimes_PMILLIS[0]);\r\n    }\r\n    else {\r\n        return secondsToMillis(1);\r\n    }\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, black } from '../color';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { Painter } from '../core';\r\nimport { Program, UniformColor, Attribute } from '../shader';\r\nimport { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { ensureCapacityFloat32, GL, hasval, parseTime_PMILLIS } from '../util/util';\r\nimport { getTickTimes_PMILLIS } from './time_axis_painter';\r\n\r\n\r\nexport interface TimeGridPainterOptions {\r\n    tickSpacing?: number;\r\n    gridColor?: Color;\r\n    referenceDate?: string;\r\n}\r\n\r\n\r\nexport function newTimeGridPainter(timeAxis: TimeAxis1D, isVerticalAxis: boolean, timeZone: string, options?: TimeGridPainterOptions): Painter {\r\n    const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60);\r\n    const gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : black);\r\n    const referenceDate_PMILLIS = (hasval(options) && hasval(options.referenceDate) ? parseTime_PMILLIS(options.referenceDate) : undefined);\r\n\r\n    const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n\r\n    let xyFrac = new Float32Array(0);\r\n    const xyFracBuffer = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        const tickTimes_PMILLIS = getTickTimes_PMILLIS(timeAxis, (isVerticalAxis ? viewport.h : viewport.w), tickSpacing, timeZone, referenceDate_PMILLIS);\r\n        const tickCount = tickTimes_PMILLIS.length;\r\n\r\n        program.use(gl);\r\n        u_Color.setData(gl, gridColor);\r\n\r\n        xyFrac = ensureCapacityFloat32(xyFrac, 4 * tickCount);\r\n        for (let n = 0; n < tickCount; n++) {\r\n            let tFrac = timeAxis.tFrac(tickTimes_PMILLIS[n]);\r\n            if (isVerticalAxis) {\r\n                tFrac = (Math.floor(tFrac * viewport.h) + 0.5) / viewport.h;\r\n                xyFrac[(4 * n + 0)] = 0;\r\n                xyFrac[(4 * n + 1)] = tFrac;\r\n                xyFrac[(4 * n + 2)] = 1;\r\n                xyFrac[(4 * n + 3)] = tFrac;\r\n            }\r\n            else {\r\n                // Adding epsilon is a crude way to compensate for floating-point error (which is probably introduced up where we compute tFrac)\r\n                tFrac = (Math.floor(tFrac * viewport.w + 1e-4) + 0.5) / viewport.w;\r\n                xyFrac[(4 * n + 0)] = tFrac;\r\n                xyFrac[(4 * n + 1)] = 0;\r\n                xyFrac[(4 * n + 2)] = tFrac;\r\n                xyFrac[(4 * n + 3)] = 1;\r\n            }\r\n        }\r\n        xyFracBuffer.setData(xyFrac.subarray(0, 4 * tickCount));\r\n        a_XyFrac.setDataAndEnable(gl, xyFracBuffer, 2, GL.FLOAT);\r\n\r\n        // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1\r\n        gl.lineWidth(1);\r\n        gl.drawArrays(GL.LINES, 0, 2 * tickCount);\r\n\r\n        a_XyFrac.disable(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { TimelineUi } from './timeline_ui';\r\nimport { TimelineRowModel, TimelineModel, TimelineEventModel } from './timeline_model';\r\nimport { StringMap, order, formatTime_ISO8601, hasval } from '../util/util';\r\nimport { Listener } from '../util/notification';\r\nimport { indexAfter, indexBefore, indexAtOrAfter } from '../util/sorted_arrays';\r\n\r\nexport class TimelineLaneArray {\r\n    private _ui: TimelineUi;\r\n    private _row: TimelineRowModel;\r\n    private _lanes: TimelineLane[];\r\n    private _laneNums: StringMap<number>;\r\n\r\n    private _rebuildLanesMouseWheel: () => void;\r\n    private _rebuildLanes: () => void;\r\n    private _newEvent: (eventGuid: string) => void;\r\n    private _addEvent: (eventGuid: string) => void;\r\n    private _removeEvent: (eventGuid: string) => void;\r\n\r\n    private _model: TimelineModel;\r\n\r\n    // Keep references to listeners, so that we can remove them later\r\n    private _eventAttrsListeners: StringMap<Listener>;\r\n\r\n    constructor(model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, allowMultipleLanes: boolean) {\r\n        this._model = model;\r\n        this._row = row;\r\n        this._ui = ui;\r\n\r\n        this._lanes = [];\r\n        this._laneNums = {};\r\n        this._eventAttrsListeners = {};\r\n\r\n        const self = this;\r\n\r\n        function findAvailableLaneNum(event: TimelineEventModel, startLaneNum: number, endLaneNum: number): number {\r\n            for (let n = startLaneNum; n < endLaneNum; n++) {\r\n                if (self._lanes[n].couldFitEvent(event)) {\r\n                    return n;\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        function firstAvailableLaneNum(event: TimelineEventModel): number {\r\n            const laneNum = findAvailableLaneNum(event, 0, self._lanes.length);\r\n            return (hasval(laneNum) ? laneNum : self._lanes.length);\r\n        }\r\n\r\n        function addEventToLane(event: TimelineEventModel, laneNum: number) {\r\n            if (!self._lanes[laneNum]) {\r\n                self._lanes[laneNum] = allowMultipleLanes ? new TimelineLaneStack(ui) : new TimelineLaneSimple(ui);\r\n            }\r\n            self._lanes[laneNum].add(event);\r\n            self._laneNums[event.eventGuid] = laneNum;\r\n        }\r\n\r\n        function fillVacancy(vacancyLaneNum: number, vacancyEdges_PMILLIS: number[]) {\r\n            const vacancyLane = self._lanes[vacancyLaneNum];\r\n            for (let n = vacancyLaneNum + 1; n < self._lanes.length; n++) {\r\n                const lane = self._lanes[n];\r\n                const possibleTenants = lane.collisionsWithInterval(vacancyEdges_PMILLIS[0], vacancyEdges_PMILLIS[1]);\r\n                for (let p = 0; p < possibleTenants.length; p++) {\r\n                    const event = possibleTenants[p];\r\n                    if (vacancyLane.couldFitEvent(event)) {\r\n                        lane.remove(event);\r\n                        addEventToLane(event, vacancyLaneNum);\r\n                        fillVacancy(n, effectiveEdges_PMILLIS(ui, event));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        function trimEmptyLanes() {\r\n            for (let n = self._lanes.length - 1; n >= 0; n--) {\r\n                if (self._lanes[n].isEmpty()) {\r\n                    self._lanes.splice(n, 1);\r\n                }\r\n                else {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        // adds event to lane, may be called multiple times\r\n        this._addEvent = function (eventGuid: string) {\r\n            if (hasval(self._laneNums[eventGuid])) {\r\n                throw new Error('Lanes-array already contains this event: row-guid = ' + row.rowGuid + ', lane = ' + self._laneNums[eventGuid] + ', event-guid = ' + eventGuid);\r\n            }\r\n            const event = model.event(eventGuid);\r\n            const laneNum = firstAvailableLaneNum(event);\r\n            addEventToLane(event, laneNum);\r\n        };\r\n\r\n        row.eventGuids.forEach(this._addEvent);\r\n        row.eventGuids.valueAdded.on(this._addEvent);\r\n\r\n        // attaches listeners to event, should be called only once\r\n        // when an event is first added to the row model\r\n        this._newEvent = function (eventGuid: string) {\r\n            const event = model.event(eventGuid);\r\n            let oldEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event);\r\n            const updateLaneAssignment = function () {\r\n                const newEdges_PMILLIS = effectiveEdges_PMILLIS(ui, event);\r\n                if (newEdges_PMILLIS[0] !== oldEdges_PMILLIS[0] || newEdges_PMILLIS[1] !== oldEdges_PMILLIS[1]) {\r\n                    const oldLaneNum = self._laneNums[event.eventGuid];\r\n                    const oldLane = self._lanes[oldLaneNum];\r\n\r\n                    const betterLaneNum = findAvailableLaneNum(event, 0, oldLaneNum);\r\n                    if (hasval(betterLaneNum)) {\r\n                        // Move to a better lane\r\n                        oldLane.remove(event);\r\n                        addEventToLane(event, betterLaneNum);\r\n                    }\r\n                    else if (oldLane.eventStillFits(event)) {\r\n                        // Stay in the current lane\r\n                        oldLane.update(event);\r\n                    }\r\n                    else {\r\n                        // Take whatever lane we can get\r\n                        let newLaneNum = findAvailableLaneNum(event, oldLaneNum + 1, self._lanes.length);\r\n                        if (!hasval(newLaneNum)){\r\n                            newLaneNum = self._lanes.length;\r\n                        }\r\n                        oldLane.remove(event);\r\n                        addEventToLane(event, newLaneNum);\r\n                    }\r\n\r\n                    fillVacancy(oldLaneNum, oldEdges_PMILLIS);\r\n                    trimEmptyLanes();\r\n\r\n                    oldEdges_PMILLIS = newEdges_PMILLIS;\r\n                }\r\n            };\r\n\r\n            event.attrsChanged.on(updateLaneAssignment);\r\n            self._eventAttrsListeners[eventGuid] = updateLaneAssignment;\r\n        };\r\n        row.eventGuids.forEach(this._newEvent);\r\n        row.eventGuids.valueAdded.on(this._newEvent);\r\n\r\n        this._removeEvent = function (eventGuid: string) {\r\n            const event = model.event(eventGuid);\r\n\r\n            const oldLaneNum = self._laneNums[eventGuid];\r\n            delete self._laneNums[eventGuid];\r\n\r\n            self._lanes[oldLaneNum].remove(event);\r\n            fillVacancy(oldLaneNum, effectiveEdges_PMILLIS(ui, event));\r\n            trimEmptyLanes();\r\n\r\n            event.attrsChanged.off(self._eventAttrsListeners[eventGuid]);\r\n            delete self._eventAttrsListeners[eventGuid];\r\n        };\r\n        row.eventGuids.valueRemoved.on(this._removeEvent);\r\n\r\n        self._rebuildLanes = function () {\r\n            const oldLanes = self._lanes;\r\n            self._lanes = [];\r\n            self._laneNums = {};\r\n\r\n            for (let l = 0; l < oldLanes.length; l++) {\r\n                const lane = oldLanes[l];\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n                    self._addEvent(event.eventGuid);\r\n                }\r\n            }\r\n        };\r\n\r\n        const hasIcons = function () {\r\n            const oldLanes = self._lanes;\r\n            for (let l = 0; l < oldLanes.length; l++) {\r\n                const lane = oldLanes[l];\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n                    const style = ui.eventStyle(event.styleGuid);\r\n                    if (event.labelIcon || style.numIcons > 0) {\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            return false;\r\n        };\r\n\r\n        self._rebuildLanesMouseWheel = function () {\r\n            if (hasIcons()) {\r\n                self._rebuildLanes();\r\n            }\r\n        };\r\n\r\n        ui.millisPerPx.changed.on(self._rebuildLanesMouseWheel);\r\n        ui.eventStyles.valueAdded.on(self._rebuildLanes);\r\n        ui.eventStyles.valueRemoved.on(self._rebuildLanes);\r\n    }\r\n\r\n    get length(): number {\r\n        return this._lanes.length;\r\n    }\r\n\r\n    lane(index: number): TimelineLane {\r\n        return this._lanes[index];\r\n    }\r\n\r\n    get numEvents(): number {\r\n        return this._row.eventGuids.length;\r\n    }\r\n\r\n    eventAt(laneNum: number, time_PMILLIS: number): TimelineEventModel {\r\n        const lane = this._lanes[laneNum];\r\n        return (lane && lane.eventAtTime(time_PMILLIS));\r\n    }\r\n\r\n    dispose(): void {\r\n        this._row.eventGuids.valueAdded.off(this._addEvent);\r\n        this._row.eventGuids.valueRemoved.off(this._removeEvent);\r\n        this._row.eventGuids.valueAdded.off(this._newEvent);\r\n\r\n        this._ui.millisPerPx.changed.off(this._rebuildLanesMouseWheel);\r\n        this._ui.eventStyles.valueAdded.off(this._rebuildLanes);\r\n        this._ui.eventStyles.valueRemoved.off(this._rebuildLanes);\r\n\r\n        for (const eventGuid in this._eventAttrsListeners) {\r\n            if (this._eventAttrsListeners.hasOwnProperty(eventGuid)) {\r\n                const listener = this._eventAttrsListeners[eventGuid];\r\n                const event = this._model.event(eventGuid);\r\n                if (listener && event) {\r\n                    event.attrsChanged.off(listener);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\n\r\nexport function effectiveEdges_PMILLIS(ui: TimelineUi, event: TimelineEventModel): number[] {\r\n    let start_PMILLIS = event.start_PMILLIS;\r\n    let end_PMILLIS = event.end_PMILLIS;\r\n\r\n    const millisPerPx = ui.millisPerPx.value;\r\n    const eventStyle = ui.eventStyle(event.styleGuid);\r\n    for (let n = 0; n < eventStyle.numIcons; n++) {\r\n        const icon = eventStyle.icon(n);\r\n        const iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS);\r\n        const iconStart_PMILLIS = iconTime_PMILLIS - (millisPerPx * icon.hAlign * icon.displayWidth);\r\n        const iconEnd_PMILLIS = iconTime_PMILLIS + (millisPerPx * (1 - icon.hAlign) * icon.displayWidth);\r\n\r\n        start_PMILLIS = Math.trunc(Math.min(start_PMILLIS, iconStart_PMILLIS));\r\n        end_PMILLIS = Math.trunc(Math.max(end_PMILLIS, iconEnd_PMILLIS));\r\n    }\r\n\r\n    return [start_PMILLIS, end_PMILLIS];\r\n}\r\n\r\n\r\nexport interface TimelineLane {\r\n    length: number;\r\n    event(index: number): TimelineEventModel;\r\n    isEmpty(): boolean;\r\n    eventAtTime(time_PMILLIS: number): TimelineEventModel;\r\n    add(event: TimelineEventModel): void;\r\n    remove(event: TimelineEventModel): void;\r\n    eventStillFits(event: TimelineEventModel): boolean;\r\n    update(event: TimelineEventModel): void;\r\n    collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[];\r\n    couldFitEvent(event: TimelineEventModel): boolean;\r\n}\r\n\r\n// a TimelineLane where no events start/end time overlap\r\nexport class TimelineLaneStack implements TimelineLane {\r\n    private _events: TimelineEventModel[];\r\n    private _starts_PMILLIS: number[];\r\n    private _ends_PMILLIS: number[];\r\n    private _indices: StringMap<number>;\r\n    private _ui: TimelineUi;\r\n\r\n    constructor(ui: TimelineUi) {\r\n        this._events = [];\r\n        this._starts_PMILLIS = [];\r\n        this._ends_PMILLIS = [];\r\n        this._indices = {};\r\n        this._ui = ui;\r\n    }\r\n\r\n    get length(): number {\r\n        return this._events.length;\r\n    }\r\n\r\n    event(index: number): TimelineEventModel {\r\n        return this._events[index];\r\n    }\r\n\r\n    isEmpty(): boolean {\r\n        return (this._events.length === 0);\r\n    }\r\n\r\n    eventAtTime(time_PMILLIS: number): TimelineEventModel {\r\n        if (hasval(time_PMILLIS)) {\r\n            // Check the first event ending after time\r\n            const iFirst = indexAfter(this._ends_PMILLIS, time_PMILLIS);\r\n            if (iFirst < this._events.length) {\r\n                const eventFirst = this._events[iFirst];\r\n                const startFirst_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventFirst)[0];\r\n                if (time_PMILLIS >= startFirst_PMILLIS) {\r\n                    return eventFirst;\r\n                }\r\n            }\r\n            // Check the previous event, in case we're in its icon-slop\r\n            const iPrev = iFirst - 1;\r\n            if (iPrev >= 0) {\r\n                const eventPrev = this._events[iPrev];\r\n                const endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, eventPrev)[1];\r\n                if (time_PMILLIS < endPrev_PMILLIS) {\r\n                    return eventPrev;\r\n                }\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    add(event: TimelineEventModel) {\r\n        const eventGuid = event.eventGuid;\r\n        if (hasval(this._indices[eventGuid])) {\r\n            throw new Error('Lane already contains this event: event = ' + formatEvent(event));\r\n        }\r\n\r\n        const i = indexAfter(this._starts_PMILLIS, event.start_PMILLIS);\r\n        if (!this._eventFitsBetween(event, i - 1, i)) {\r\n            throw new Error('New event does not fit between existing events: new = ' + formatEvent(event) + ', before = ' + formatEvent(this._events[i - 1]) + ', after = ' + formatEvent(this._events[i]));\r\n        }\r\n\r\n        this._events.splice(i, 0, event);\r\n        this._starts_PMILLIS.splice(i, 0, event.start_PMILLIS);\r\n        this._ends_PMILLIS.splice(i, 0, event.end_PMILLIS);\r\n        this._indices[eventGuid] = i;\r\n\r\n        for (let n = i; n < this._events.length; n++) {\r\n            this._indices[this._events[n].eventGuid] = n;\r\n        }\r\n    }\r\n\r\n    remove(event: TimelineEventModel) {\r\n        const eventGuid = event.eventGuid;\r\n        const i = this._indices[eventGuid];\r\n        if (!hasval(i)) {\r\n            throw new Error('Event not found in this lane: event = ' + formatEvent(event));\r\n        }\r\n\r\n        this._events.splice(i, 1);\r\n        this._starts_PMILLIS.splice(i, 1);\r\n        this._ends_PMILLIS.splice(i, 1);\r\n        delete this._indices[eventGuid];\r\n\r\n        for (let n = i; n < this._events.length; n++) {\r\n            this._indices[this._events[n].eventGuid] = n;\r\n        }\r\n    }\r\n\r\n    eventStillFits(event: TimelineEventModel): boolean {\r\n        const i = this._indices[event.eventGuid];\r\n        if (!hasval(i)) {\r\n            throw new Error('Event not found in this lane: event = ' + formatEvent(event));\r\n        }\r\n\r\n        return this._eventFitsBetween(event, i - 1, i + 1);\r\n    }\r\n\r\n    update(event: TimelineEventModel) {\r\n        const i = this._indices[event.eventGuid];\r\n        if (!hasval(i)) {\r\n            throw new Error('Event not found in this lane: event = ' + formatEvent(event));\r\n        }\r\n\r\n        this._starts_PMILLIS[i] = event.start_PMILLIS;\r\n        this._ends_PMILLIS[i] = event.end_PMILLIS;\r\n    }\r\n\r\n    collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] {\r\n        // Find the first event ending after start\r\n        let iFirst = indexAfter(this._ends_PMILLIS, start_PMILLIS);\r\n        const iPrev = iFirst - 1;\r\n        if (iPrev >= 0) {\r\n            const endPrev_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPrev])[1];\r\n            if (start_PMILLIS < endPrev_PMILLIS) {\r\n                iFirst = iPrev;\r\n            }\r\n        }\r\n        // Find the last event starting before end\r\n        let iLast = indexBefore(this._starts_PMILLIS, end_PMILLIS);\r\n        const iPost = iLast + 1;\r\n        if (iPost < this._events.length) {\r\n            const startPost_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iPost])[0];\r\n            if (end_PMILLIS > startPost_PMILLIS) {\r\n                iLast = iPost;\r\n            }\r\n        }\r\n        // Return that section\r\n        return this._events.slice(iFirst, iLast + 1);\r\n    }\r\n\r\n    couldFitEvent(event: TimelineEventModel): boolean {\r\n        const iAfter = indexAfter(this._starts_PMILLIS, event.start_PMILLIS);\r\n        const iBefore = iAfter - 1;\r\n        return this._eventFitsBetween(event, iBefore, iAfter);\r\n    }\r\n\r\n    _eventFitsBetween(event: TimelineEventModel, iBefore: number, iAfter: number): boolean {\r\n        const edges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event);\r\n\r\n        if (iBefore >= 0) {\r\n            // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision\r\n            const edgesBefore_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iBefore]);\r\n            if (edges_PMILLIS[0] < edgesBefore_PMILLIS[1]) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        if (iAfter < this._events.length) {\r\n            // Comparing one start-time (inclusive) and one end-time (exclusive), so equality means no collision\r\n            const edgesAfter_PMILLIS = effectiveEdges_PMILLIS(this._ui, this._events[iAfter]);\r\n            if (edges_PMILLIS[1] > edgesAfter_PMILLIS[0]) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n\r\n// a TimelineLane where events are allowed to overlap arbitrarily\r\n// because of this assumptions like the index for an event in the _starts_PMILLIS\r\n// and _ends_PMILLIS arrays being the same no longer hold\r\n//\r\n// does not make any assumptions about event overlapping and uses\r\n// an inefficient O(n) brute force search to find events (an interval tree\r\n// would be needed for efficient search in the general case)\r\nexport class TimelineLaneSimple implements TimelineLane {\r\n\r\n    private _events: TimelineEventModel[];\r\n    private _orders: number[];\r\n    private _ids: StringMap<any>;\r\n    private _ui: TimelineUi;\r\n\r\n    constructor(ui: TimelineUi) {\r\n        this._events = [];\r\n        this._orders = [];\r\n        this._ids = {};\r\n        this._ui = ui;\r\n    }\r\n\r\n    get length(): number {\r\n        return this._events.length;\r\n    }\r\n\r\n    event(index: number): TimelineEventModel {\r\n        return this._events[index];\r\n    }\r\n\r\n    isEmpty(): boolean {\r\n        return (this._events.length === 0);\r\n    }\r\n\r\n    eventAtTime(time_PMILLIS: number): TimelineEventModel {\r\n\r\n        let bestEvent: TimelineEventModel;\r\n\r\n        // start at end of events list so that eventAtTime result\r\n        // favors events drawn on top (in cases where events are unordered\r\n        // those that happen to be at end end of the list are drawn last\r\n        for (let n = this._events.length - 1; n >= 0; n--) {\r\n            const event: TimelineEventModel = this._events[n];\r\n\r\n            const eventEdges_PMILLIS = effectiveEdges_PMILLIS(this._ui, event);\r\n\r\n            if (time_PMILLIS > eventEdges_PMILLIS[0] &&\r\n                time_PMILLIS < eventEdges_PMILLIS[1] &&\r\n                (bestEvent === undefined || bestEvent.order < event.order)) {\r\n                bestEvent = event;\r\n            }\r\n        }\r\n\r\n        return bestEvent;\r\n    }\r\n\r\n    add(event: TimelineEventModel) {\r\n        const eventGuid = event.eventGuid;\r\n        if (hasval(this._ids[eventGuid])) {\r\n            throw new Error('Lane already contains this event: event = ' + formatEvent(event));\r\n        }\r\n\r\n        // for events with undefined order, replace with largest possible negative order so sort is correct\r\n        const orderVal = hasval(event.order) ? event.order : Number.NEGATIVE_INFINITY;\r\n\r\n        const i: number = indexAtOrAfter(this._orders, orderVal);\r\n\r\n        this._ids[eventGuid] = eventGuid;\r\n        this._orders.splice(i, 0, orderVal);\r\n        this._events.splice(i, 0, event);\r\n    }\r\n\r\n    remove(event: TimelineEventModel) {\r\n        const eventGuid = event.eventGuid;\r\n        if (!hasval(this._ids[eventGuid])) {\r\n            throw new Error('Event not found in this lane: event = ' + formatEvent(event));\r\n        }\r\n\r\n        delete this._ids[eventGuid];\r\n        const i: number = this._getIndex(event);\r\n        this._orders.splice(i, 1);\r\n        this._events.splice(i, 1);\r\n    }\r\n\r\n    update(event: TimelineEventModel) {\r\n        this.remove(event);\r\n        this.add(event);\r\n    }\r\n\r\n    collisionsWithInterval(start_PMILLIS: number, end_PMILLIS: number): TimelineEventModel[] {\r\n\r\n        const results = [];\r\n\r\n        for (let n = 0; n < this._events.length; n++) {\r\n            const event: TimelineEventModel = this._events[n];\r\n\r\n            if (!(start_PMILLIS > event.end_PMILLIS || end_PMILLIS < event.start_PMILLIS)) {\r\n                results.push(event);\r\n            }\r\n        }\r\n\r\n        return results;\r\n    }\r\n\r\n    // we can always fit more events because overlaps are allowed\r\n    eventStillFits(event: TimelineEventModel): boolean {\r\n        return true;\r\n    }\r\n\r\n    // we can always fit more events because overlaps are allowed\r\n    couldFitEvent(event: TimelineEventModel): boolean {\r\n        return true;\r\n    }\r\n\r\n    _getIndex(queryEvent: TimelineEventModel): number {\r\n        for (let n = 0; n < this._events.length; n++) {\r\n            const event: TimelineEventModel = this._events[n];\r\n            if (queryEvent.eventGuid === event.eventGuid) {\r\n                return n;\r\n            }\r\n        }\r\n        throw new Error('Event not found in this lane: event = ' + formatEvent(queryEvent));\r\n    }\r\n}\r\n\r\nfunction formatEvent(event: TimelineEventModel): string {\r\n    if (!hasval(event)) {\r\n        return '' + event;\r\n    }\r\n    else {\r\n        return (event.label + ' [ ' + formatTime_ISO8601(event.start_PMILLIS) + ' ... ' + formatTime_ISO8601(event.end_PMILLIS) + ' ]');\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, darker } from '../color';\r\nimport { Drawable, Painter, Pane, PointerEvent, Mask2D, isLeftMouseDown, Layout } from '../core';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { TimelineLaneArray, TimelineLane, effectiveEdges_PMILLIS } from './timeline_lanes';\r\nimport { TimelineUi } from './timeline_ui';\r\nimport { TimelineRowPaneFactory, TimelineRowPaneOptions } from './timeline_row';\r\nimport { Axis1D } from '../plot/axis';\r\nimport { TimelineModel, TimelineRowModel, TimelineEventModel } from './timeline_model';\r\nimport { BoundsUnmodifiable, Size } from '../bounds';\r\nimport { StringMap, concatLines, GL, ensureCapacityFloat32, hasval, isNumber } from '../util/util';\r\nimport { indexNearest } from '../util/sorted_arrays';\r\nimport { Program, Attribute, Uniform1f } from '../shader';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { putQuadXys, putRgbas, putQuadRgbas, putUpperRightTriangleXys, putLowerRightTriangleXys, putLowerLeftTriangleXys, putUpperLeftTriangleXys, varyingColor_FRAGSHADER } from '../misc';\r\nimport { OrderedSet } from '../util/ordered_set';\r\nimport { TextureRenderer, Texture2D } from '../texture';\r\nimport { TwoKeyCache } from '../util/multikey_cache';\r\nimport { TextTexture2D, newTextTextureCache2 } from '../text';\r\n\r\n\r\nexport interface TimelineEventsPainterOptions {\r\n    timelineFont: string;\r\n    timelineFgColor: Color;\r\n    rowTopPadding: number;\r\n    rowBottomPadding: number;\r\n    laneHeight: number;\r\n}\r\n\r\n\r\n\r\nexport type TimelineEventsPainterFactory = (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) => Painter;\r\n\r\n\r\n\r\nexport interface TimelineEventsRowPaneOptions {\r\n    rowTopPadding?: number;\r\n    rowBottomPadding?: number;\r\n    laneHeight?: number;\r\n    allowMultipleLanes?: boolean;\r\n    painterFactories?: TimelineEventsPainterFactory[];\r\n}\r\n\r\n\r\n\r\nexport function newEventsRowPaneFactory(eventsRowOpts?: TimelineEventsRowPaneOptions): TimelineRowPaneFactory {\r\n\r\n    // Pane Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane {\r\n        const rowTopPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowTopPadding) ? eventsRowOpts.rowTopPadding : 6);\r\n        const rowBottomPadding = (hasval(eventsRowOpts) && hasval(eventsRowOpts.rowBottomPadding) ? eventsRowOpts.rowBottomPadding : 6);\r\n        const laneHeight = (hasval(eventsRowOpts) && hasval(eventsRowOpts.laneHeight) ? eventsRowOpts.laneHeight : 33);\r\n        const painterFactories = (hasval(eventsRowOpts) && hasval(eventsRowOpts.painterFactories) ? eventsRowOpts.painterFactories : []);\r\n        const allowMultipleLanes = (hasval(eventsRowOpts) && hasval(eventsRowOpts.allowMultipleLanes) ? eventsRowOpts.allowMultipleLanes : true);\r\n\r\n        const timelineFont = options.timelineFont;\r\n        const timelineFgColor = options.timelineFgColor;\r\n        const draggableEdgeWidth = options.draggableEdgeWidth;\r\n        const snapToDistance = options.snapToDistance;\r\n\r\n        const rowUi = ui.rowUi(row.rowGuid);\r\n        const input = ui.input;\r\n        const selection = ui.selection;\r\n\r\n        const lanes = new TimelineLaneArray(model, row, ui, allowMultipleLanes);\r\n\r\n        const timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number {\r\n            return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i));\r\n        };\r\n\r\n        const timeAtPointer_PMILLIS = function (ev: PointerEvent): number {\r\n            return timeAtCoords_PMILLIS(ev.paneViewport, ev.i);\r\n        };\r\n\r\n        const eventAtCoords = function (viewport: BoundsUnmodifiable, i: number, j: number): TimelineEventModel {\r\n            const laneNum = Math.floor((viewport.jEnd - j - rowTopPadding) / laneHeight);\r\n            const time_PMILLIS = timeAtCoords_PMILLIS(viewport, i);\r\n            return lanes.eventAt(laneNum, time_PMILLIS);\r\n        };\r\n\r\n        const eventAtPointer = function (ev: PointerEvent): TimelineEventModel {\r\n            return eventAtCoords(ev.paneViewport, ev.i, ev.j);\r\n        };\r\n\r\n        const isInsideAnEvent: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean {\r\n            return hasval(eventAtCoords(viewport, i, j));\r\n        };\r\n\r\n\r\n        // Create pane\r\n        //\r\n\r\n        const layout = <Layout>{\r\n            updatePrefSize: <Layout>function (parentPrefSize: Size): void {\r\n                parentPrefSize.h = rowTopPadding + rowBottomPadding + Math.max(1, lanes.length) * laneHeight;\r\n                parentPrefSize.w = null;\r\n            }\r\n        };\r\n        const rowContentPane = new Pane(layout, true, isInsideAnEvent);\r\n\r\n        rowUi.addPane('content', rowContentPane);\r\n\r\n        const painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding, laneHeight: laneHeight };\r\n        for (let n = 0; n < painterFactories.length; n++) {\r\n            const createPainter = painterFactories[n];\r\n            rowContentPane.addPainter(createPainter(drawable, timeAxis, lanes, ui, painterOptions));\r\n        }\r\n\r\n\r\n        const redraw = function () {\r\n            drawable.redraw();\r\n        };\r\n\r\n        row.eventGuids.valueAdded.on(redraw);\r\n        row.eventGuids.valueMoved.on(redraw);\r\n        row.eventGuids.valueRemoved.on(redraw);\r\n\r\n        const watchEventAttrs = function (eventGuid: string) {\r\n            model.event(eventGuid).attrsChanged.on(redraw);\r\n        };\r\n        row.eventGuids.forEach(watchEventAttrs);\r\n        row.eventGuids.valueAdded.on(watchEventAttrs);\r\n\r\n        const removeRedraw = function (eventGuid: string) {\r\n            model.event(eventGuid).attrsChanged.off(redraw);\r\n        };\r\n        row.eventGuids.valueRemoved.on(removeRedraw);\r\n\r\n\r\n\r\n        // Used by both sets of listeners to know whether an event-drag is in progress\r\n        let eventDragMode: string = null;\r\n\r\n\r\n\r\n        // Hook up input notifications\r\n        //\r\n\r\n        let recentMouseMove: PointerEvent = null;\r\n\r\n        rowContentPane.mouseMove.on(function (ev: PointerEvent) {\r\n            input.mouseMove.fire(ev);\r\n            if (!eventDragMode) {\r\n                input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev);\r\n                input.rowHover.fire(row, ev);\r\n                input.eventHover.fire(eventAtPointer(ev), ev);\r\n            }\r\n            recentMouseMove = ev;\r\n        });\r\n\r\n        rowContentPane.mouseExit.on(function (ev: PointerEvent) {\r\n            input.mouseExit.fire(ev);\r\n            if (!eventDragMode) {\r\n                input.timeHover.fire(null, ev);\r\n                input.rowHover.fire(null, ev);\r\n                input.eventHover.fire(null, ev);\r\n            }\r\n            recentMouseMove = null;\r\n        });\r\n\r\n        const uiMillisPerPxChanged = function () {\r\n            if (!eventDragMode && recentMouseMove != null) {\r\n                const ev = recentMouseMove;\r\n                input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev);\r\n                input.eventHover.fire(eventAtPointer(ev), ev);\r\n            }\r\n        };\r\n        ui.millisPerPx.changed.on(uiMillisPerPxChanged);\r\n\r\n        rowContentPane.mouseUp.on(function (ev: PointerEvent) {\r\n            input.mouseUp.fire(ev);\r\n        });\r\n\r\n        rowContentPane.mouseDown.on(function (ev: PointerEvent) {\r\n            input.mouseDown.fire(ev);\r\n        });\r\n\r\n        rowContentPane.mouseWheel.on(options.mouseWheelListener);\r\n\r\n        rowContentPane.contextMenu.on(function (ev: PointerEvent) {\r\n            input.contextMenu.fire(ev);\r\n        });\r\n\r\n\r\n\r\n        // Begin event-drag\r\n        //\r\n\r\n        let eventDragEvents: TimelineEventModel[] = [];\r\n        let eventDragOffsets_MILLIS: StringMap<number> = {};\r\n        let eventDragSnapTimes_PMILLIS: number[] = [];\r\n\r\n\r\n        // Event-edges are draggable for events at least this wide\r\n        const minEventWidthForEdgeDraggability = 3 * draggableEdgeWidth;\r\n\r\n        // When dragging an event-edge, the event cannot be made narrower than this\r\n        //\r\n        // Needs to be greater than minEventWidthForEdgeDraggability -- by enough to\r\n        // cover floating-point precision loss -- so a user can't accidentally make\r\n        // an event so narrow that it can't easily be widened again.\r\n        //\r\n        const minEventWidthWhenDraggingEdge = minEventWidthForEdgeDraggability + 1;\r\n\r\n\r\n        function allUserEditable(events: TimelineEventModel[]): boolean {\r\n            for (let n = 0; n < events.length; n++) {\r\n                if (!events[n].userEditable) {\r\n                    return false;\r\n                }\r\n            }\r\n            return true;\r\n        }\r\n\r\n        function chooseEventDragMode(timelineUi: TimelineUi, mouseTime_PMILLIS: number, timelineEventDragEvents: TimelineEventModel[]): string {\r\n            if (timelineEventDragEvents.length === 0) {\r\n                // If no events are selected, then we don't have any to drag\r\n                return null;\r\n            }\r\n            else if (!allUserEditable(timelineEventDragEvents)) {\r\n                // If any selected event is not user-editable, don't allow editing\r\n                return 'undraggable';\r\n            }\r\n            else if (timelineEventDragEvents.length > 1) {\r\n                // If more than one event is selected, don't allow edge dragging\r\n                return 'center';\r\n            }\r\n            else if (timelineEventDragEvents.length === 1) {\r\n                const event = timelineEventDragEvents[0];\r\n                const pxPerMilli = 1 / timelineUi.millisPerPx.value;\r\n                const eventWidth = (event.end_PMILLIS - event.start_PMILLIS) * pxPerMilli;\r\n                if (eventWidth < minEventWidthForEdgeDraggability) {\r\n                    // If event isn't very wide, don't try to allow edge dragging\r\n                    return 'center';\r\n                }\r\n                else {\r\n                    const mouseOffset = (mouseTime_PMILLIS - event.start_PMILLIS) * pxPerMilli;\r\n                    if (mouseOffset < draggableEdgeWidth) {\r\n                        // If mouse is near the left edge, drag the event's start-time\r\n                        return 'start';\r\n                    }\r\n                    else if (mouseOffset < eventWidth - draggableEdgeWidth) {\r\n                        // If mouse is in the center, drag the whole event\r\n                        return 'center';\r\n                    }\r\n                    else {\r\n                        // If mouse is near the right edge, drag the event's end-time\r\n                        return 'end';\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                // Should never get here, because we have clauses above for length === 0, length === 1, and length > 1\r\n                return null;\r\n            }\r\n        }\r\n\r\n        const updateCursor = function () {\r\n            if (!eventDragMode) {\r\n\r\n                const mouseCursors = { 'center': 'default', 'start': 'w-resize', 'end': 'e-resize', 'undraggable': 'default' };\r\n                const hoveredTime_PMILLIS = selection.hoveredTime_PMILLIS.value;\r\n\r\n                // if a multi-selection has been made, update the cursor based on all the events in the multi-selection\r\n                if (selection.selectedEvents.length > 1) {\r\n                    rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, selection.selectedEvents.toArray())];\r\n                }\r\n                else {\r\n                    const hoveredEvent = selection.hoveredEvent.value;\r\n                    const hoveredEvents = (hasval(hoveredEvent) ? [hoveredEvent] : []);\r\n                    rowContentPane.mouseCursor = mouseCursors[chooseEventDragMode(ui, hoveredTime_PMILLIS, hoveredEvents)];\r\n                }\r\n            }\r\n        };\r\n        ui.millisPerPx.changed.on(updateCursor);\r\n        selection.hoveredTime_PMILLIS.changed.on(updateCursor);\r\n        selection.hoveredEvent.changed.on(updateCursor);\r\n\r\n        rowContentPane.mouseDown.on(function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent)) {\r\n                const eventDragEventsSet = selection.selectedEvents;\r\n                eventDragEvents = eventDragEventsSet.toArray();\r\n                eventDragMode = chooseEventDragMode(ui, timeAtPointer_PMILLIS(ev), eventDragEvents);\r\n\r\n                eventDragSnapTimes_PMILLIS = new Array();\r\n                const numSnapTimes = 0;\r\n                const allEventGuids = row.eventGuids;\r\n                for (let n = 0; n < allEventGuids.length; n++) {\r\n                    const eventGuid = allEventGuids.valueAt(n);\r\n                    if (!eventDragEventsSet.hasId(eventGuid)) {\r\n                        const event = model.event(eventGuid);\r\n                        eventDragSnapTimes_PMILLIS.push(event.start_PMILLIS);\r\n                        eventDragSnapTimes_PMILLIS.push(event.end_PMILLIS);\r\n                    }\r\n                }\r\n                eventDragSnapTimes_PMILLIS.sort();\r\n            }\r\n        });\r\n\r\n        function findSnapShift_MILLIS(t_PMILLIS: number, maxShift_MILLIS: number): number {\r\n            const i = indexNearest(eventDragSnapTimes_PMILLIS, t_PMILLIS);\r\n            if (i >= 0) {\r\n                const shift_MILLIS = eventDragSnapTimes_PMILLIS[i] - t_PMILLIS;\r\n                if (Math.abs(shift_MILLIS) <= maxShift_MILLIS) {\r\n                    return shift_MILLIS;\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n\r\n        // Compute (and remember) the pointer time, for use by the event-drag listeners below\r\n        //\r\n\r\n        let eventDragPointer_PMILLIS: number = null;\r\n\r\n        const updateEventDragPointer = function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent) && eventDragMode) {\r\n                eventDragPointer_PMILLIS = timeAtPointer_PMILLIS(ev);\r\n            }\r\n        };\r\n        rowContentPane.mouseDown.on(updateEventDragPointer);\r\n        rowContentPane.mouseMove.on(updateEventDragPointer);\r\n\r\n\r\n        // Dragging event-center\r\n        //\r\n\r\n        const grabEventCenter = function () {\r\n            if (eventDragMode === 'center') {\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS;\r\n                }\r\n\r\n                // If this is a simple click-and-release, leave the mouse-cursor alone --\r\n                // but once we can tell that it's actually a drag, change to a drag cursor\r\n                //\r\n\r\n                const beginDrag = function () {\r\n                    rowContentPane.mouseCursor = 'move';\r\n                };\r\n                rowContentPane.mouseMove.on(beginDrag);\r\n                const pendingBeginDrag = setTimeout(beginDrag, 300);\r\n\r\n                const endDrag = function () {\r\n                    clearTimeout(pendingBeginDrag);\r\n                    rowContentPane.mouseMove.off(beginDrag);\r\n                    rowContentPane.mouseUp.off(endDrag);\r\n                };\r\n                rowContentPane.mouseUp.on(endDrag);\r\n            }\r\n        };\r\n        rowContentPane.mouseDown.on(grabEventCenter);\r\n\r\n        const dragEventCenter = function () {\r\n            if (eventDragMode === 'center') {\r\n                const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w);\r\n\r\n                let snapShift_MILLIS: number = null;\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newStart_PMILLIS = (eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid]);\r\n                    const newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS);\r\n\r\n                    const eventStartSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS);\r\n                    if (hasval(eventStartSnapShift_MILLIS)) {\r\n                        if (!hasval(snapShift_MILLIS) || Math.abs(eventStartSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) {\r\n                            snapShift_MILLIS = eventStartSnapShift_MILLIS;\r\n                        }\r\n                    }\r\n\r\n                    const eventEndSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS);\r\n                    if (hasval(eventEndSnapShift_MILLIS)) {\r\n                        if (!hasval(snapShift_MILLIS) || Math.abs(eventEndSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) {\r\n                            snapShift_MILLIS = eventEndSnapShift_MILLIS;\r\n                        }\r\n                    }\r\n                }\r\n                if (!hasval(snapShift_MILLIS)) {\r\n                    snapShift_MILLIS = 0;\r\n                }\r\n\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS;\r\n                    const newEnd_PMILLIS = event.end_PMILLIS + (newStart_PMILLIS - event.start_PMILLIS);\r\n                    event.setInterval(newStart_PMILLIS, newEnd_PMILLIS);\r\n                }\r\n            }\r\n        };\r\n        rowContentPane.mouseMove.on(dragEventCenter);\r\n\r\n\r\n        // Dragging event-start\r\n        //\r\n\r\n        const grabEventStart = function () {\r\n            if (eventDragMode === 'start') {\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.start_PMILLIS;\r\n                }\r\n            }\r\n        };\r\n        rowContentPane.mouseDown.on(grabEventStart);\r\n\r\n        const dragEventStart = function () {\r\n            if (eventDragMode === 'start') {\r\n                const wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w;\r\n                const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w);\r\n\r\n                let snapShift_MILLIS: number = null;\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid];\r\n\r\n                    const eventSnapShift_MILLIS = findSnapShift_MILLIS(newStart_PMILLIS, maxSnapShift_MILLIS);\r\n                    if (hasval(eventSnapShift_MILLIS)) {\r\n                        if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) {\r\n                            snapShift_MILLIS = eventSnapShift_MILLIS;\r\n                        }\r\n                    }\r\n                }\r\n                if (!hasval(snapShift_MILLIS)) {\r\n                    snapShift_MILLIS = 0;\r\n                }\r\n\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newStart_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS;\r\n                    event.start_PMILLIS = Math.trunc(Math.min(event.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS));\r\n                }\r\n            }\r\n        };\r\n        rowContentPane.mouseMove.on(dragEventStart);\r\n        timeAxis.limitsChanged.on(dragEventStart);\r\n\r\n\r\n        // Dragging event-end\r\n        //\r\n\r\n        const grabEventEnd = function () {\r\n            if (eventDragMode === 'end') {\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    eventDragOffsets_MILLIS[event.eventGuid] = eventDragPointer_PMILLIS - event.end_PMILLIS;\r\n                }\r\n            }\r\n        };\r\n        rowContentPane.mouseDown.on(grabEventEnd);\r\n\r\n        const dragEventEnd = function () {\r\n            if (eventDragMode === 'end') {\r\n                const wMin_MILLIS = minEventWidthWhenDraggingEdge * timeAxis.vSize / rowContentPane.viewport.w;\r\n                const maxSnapShift_MILLIS = snapToDistance * (timeAxis.tSize_MILLIS / rowContentPane.viewport.w);\r\n\r\n                let snapShift_MILLIS: number = null;\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid];\r\n\r\n                    const eventSnapShift_MILLIS = findSnapShift_MILLIS(newEnd_PMILLIS, maxSnapShift_MILLIS);\r\n                    if (hasval(eventSnapShift_MILLIS)) {\r\n                        if (!hasval(snapShift_MILLIS) || Math.abs(eventSnapShift_MILLIS) < Math.abs(snapShift_MILLIS)) {\r\n                            snapShift_MILLIS = eventSnapShift_MILLIS;\r\n                        }\r\n                    }\r\n                }\r\n                if (!hasval(snapShift_MILLIS)) {\r\n                    snapShift_MILLIS = 0;\r\n                }\r\n\r\n                for (let n = 0; n < eventDragEvents.length; n++) {\r\n                    const event = eventDragEvents[n];\r\n                    const newEnd_PMILLIS = eventDragPointer_PMILLIS - eventDragOffsets_MILLIS[event.eventGuid] + snapShift_MILLIS;\r\n                    event.end_PMILLIS = Math.trunc(Math.max(event.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS));\r\n                }\r\n            }\r\n        };\r\n        rowContentPane.mouseMove.on(dragEventEnd);\r\n        timeAxis.limitsChanged.on(dragEventEnd);\r\n\r\n\r\n        // Finish event-drag\r\n        //\r\n\r\n        rowContentPane.mouseUp.on(function (ev: PointerEvent) {\r\n            eventDragEvents = [];\r\n            eventDragOffsets_MILLIS = {};\r\n            eventDragSnapTimes_PMILLIS = [];\r\n            eventDragPointer_PMILLIS = null;\r\n            eventDragMode = null;\r\n        });\r\n\r\n\r\n        rowContentPane.dispose.on(function () {\r\n            lanes.dispose();\r\n\r\n            timeAxis.limitsChanged.off(dragEventEnd);\r\n            timeAxis.limitsChanged.off(dragEventStart);\r\n\r\n            ui.millisPerPx.changed.off(uiMillisPerPxChanged);\r\n\r\n            ui.millisPerPx.changed.off(updateCursor);\r\n            selection.hoveredTime_PMILLIS.changed.off(updateCursor);\r\n            selection.hoveredEvent.changed.off(updateCursor);\r\n\r\n            row.eventGuids.valueAdded.off(redraw);\r\n            row.eventGuids.valueMoved.off(redraw);\r\n            row.eventGuids.valueRemoved.off(redraw);\r\n            row.eventGuids.valueRemoved.off(removeRedraw);\r\n\r\n            row.eventGuids.valueAdded.off(watchEventAttrs);\r\n\r\n            row.eventGuids.forEach(function (eventGuid: string) {\r\n                model.event(eventGuid).attrsChanged.off(redraw);\r\n            });\r\n        });\r\n\r\n        return rowContentPane;\r\n    };\r\n}\r\n\r\nexport interface TimelineEventLimitsPainterOptions {\r\n    lineColor?: Color;\r\n    lineThickness?: number;\r\n}\r\n\r\nfunction eventLimitsPainterHelper(limitsOpts: TimelineEventLimitsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const lineColor = (hasval(limitsOpts) && hasval(limitsOpts.lineColor) ? limitsOpts.lineColor : new Color(1, 0, 0, 1));\r\n    const lineThickness = (hasval(limitsOpts) && hasval(limitsOpts.lineThickness) ? limitsOpts.lineThickness : 2.5);\r\n\r\n    const xyFrac_vColor_VERTSHADER = concatLines(\r\n        '                                                                ',\r\n        '  attribute vec2 a_XyFrac;                                      ',\r\n        '  attribute vec4 a_Color;                                       ',\r\n        '                                                                ',\r\n        '  varying vec4 v_Color;                                         ',\r\n        '                                                                ',\r\n        '  void main( ) {                                                ',\r\n        '      gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 );  ',\r\n        '      v_Color = a_Color;                                        ',\r\n        '  }                                                             ',\r\n        '                                                                '\r\n    );\r\n\r\n    const program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const a_Color = new Attribute(program, 'a_Color');\r\n\r\n    let xys = new Float32Array(0);\r\n    const xysBuffer = newDynamicBuffer();\r\n\r\n    let rgbas = new Float32Array(0);\r\n    const rgbasBuffer = newDynamicBuffer();\r\n\r\n    return {\r\n        paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            if (indexXys > 0) {\r\n                gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n                gl.enable(GL.BLEND);\r\n\r\n                program.use(gl);\r\n                xysBuffer.setData(xys.subarray(0, indexXys));\r\n                a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n                rgbasBuffer.setData(rgbas.subarray(0, indexRgbas));\r\n                a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT);\r\n\r\n                gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2));\r\n\r\n                a_Color.disable(gl);\r\n                a_XyFrac.disable(gl);\r\n                program.endUse(gl);\r\n            }\r\n        },\r\n        ensureCapacity: function (eventCount: number) {\r\n            const numVertices = (6 * 3 /* triangles */ * eventCount);\r\n            xys = ensureCapacityFloat32(xys, 2 * numVertices);\r\n            rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices);\r\n        },\r\n        fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } {\r\n\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n\r\n            const wLine = lineThickness / viewport.w;\r\n            const hLine = lineThickness / viewport.h;\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight;\r\n            const yTop = (viewport.h - jTop) / viewport.h;\r\n            const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight;\r\n            const yBottom = (viewport.h - jBottom) / viewport.h;\r\n            const yMid = (yTop + yBottom) / 2;\r\n\r\n            const xLeft = hasval(event.startLimit_PMILLIS) ? timeAxis.tFrac(event.startLimit_PMILLIS) : 0;\r\n            const xRight = hasval(event.endLimit_PMILLIS) ? timeAxis.tFrac(event.endLimit_PMILLIS) : 1;\r\n\r\n            indexXys = putQuadXys(xys, indexXys, xLeft, xRight, yMid - hLine / 2, yMid + hLine / 2);\r\n            indexXys = putQuadXys(xys, indexXys, xLeft, xLeft - wLine, yTop, yBottom);\r\n            indexXys = putQuadXys(xys, indexXys, xRight, xRight + wLine, yTop, yBottom);\r\n            indexRgbas = putRgbas(rgbas, indexRgbas, lineColor, 18);\r\n\r\n            return { indexXys: indexXys, indexRgbas: indexRgbas };\r\n        }\r\n    };\r\n}\r\n\r\nexport function newEventLimitsPainterFactory(limitOpts?: TimelineEventLimitsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventLimitsPainterHelper(limitOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n            const selectedEvents: OrderedSet<TimelineEventModel> = ui.selection.selectedEvents;\r\n\r\n            // XXX Instead of estimating the number of events we will need to draw ahead of time\r\n            // XXX (difficult because selected events may be present in multiple lanes, so\r\n            // XXX selectedEvents.length might not be sufficient) just make enough space for all events.\r\n            // XXX Potentially quite inefficient with lots of events (and few selected events).\r\n            helper.ensureCapacity(lanes.numEvents);\r\n\r\n            let indexXys = 0;\r\n            let indexRgbas = 0;\r\n\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n\r\n                    // check whether the event is selected and has limits defined\r\n                    if (selectedEvents.hasId(event.eventGuid) && (hasval(event.startLimit_PMILLIS) || hasval(event.endLimit_PMILLIS))) {\r\n                        const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport);\r\n                        indexXys = indexes.indexXys;\r\n                        indexRgbas = indexes.indexRgbas;\r\n                    }\r\n                }\r\n            }\r\n\r\n            helper.paint(indexXys, indexRgbas, gl, viewport);\r\n        };\r\n    };\r\n}\r\n\r\n\r\nexport enum JointType {\r\n    BEVEL, MITER\r\n}\r\n\r\nexport interface TimelineEventBarsPainterOptions {\r\n    topMargin?: number;\r\n    bottomMargin?: number;\r\n    borderThickness?: number;\r\n    cornerType?: JointType;\r\n    defaultColor?: Color;\r\n    defaultBorderColor?: Color;\r\n    selectedBorderColor?: Color;\r\n\r\n    // the size of the dashes when painting stippled event borders\r\n    dashLength?: number;\r\n    // the width of stripes in the painter fill\r\n    stripeWidth?: number;\r\n    // the width of secondary color stripes in the painter fill\r\n    stripeSecondaryWidth?: number;\r\n    // the slant of the stipes: 0 = horizontal, 1 = 45 degrees, -1 = 45 degrees backward\r\n    stripeSlant?: number;\r\n    // width in pixels of the antialiasing of the slant\r\n    featherWidth?: number;\r\n\r\n    // minimum pixel width of the event bar\r\n    // when the timeline is zoomed out so that the event bar\r\n    // is smaller than this visible width, the event bar is hidden\r\n    minimumVisibleWidth?: number;\r\n}\r\n\r\nexport enum FillPattern {\r\n    solid = 0,\r\n    stripe = 1,\r\n    gradient = 2\r\n}\r\n\r\nfunction eventStripedBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2);\r\n    const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2);\r\n    const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2);\r\n    const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL);\r\n    const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4));\r\n    const defaultColorSecondary = new Color(1, 1, 1, 1);\r\n    const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0);\r\n\r\n    const stripeWidth = (hasval(barOpts) && hasval(barOpts.stripeWidth) ? barOpts.stripeWidth : 5);\r\n    const stripeSecondaryWidth = (hasval(barOpts) && hasval(barOpts.stripeSecondaryWidth) ? barOpts.stripeSecondaryWidth : 5);\r\n    const stripeSlant = (hasval(barOpts) && hasval(barOpts.stripeSlant) ? barOpts.stripeSlant : 1);\r\n    const featherWidth = (hasval(barOpts) && hasval(barOpts.featherWidth) ? barOpts.featherWidth : 2);\r\n\r\n    const selection = ui.selection;\r\n\r\n    const xyFrac_vColor_VERTSHADER = concatLines(\r\n        '                                                                ',\r\n        '  attribute vec2 a_XyFrac;                                      ',\r\n        '  attribute vec4 a_Color;                                       ',\r\n        '  attribute vec4 a_ColorSecondary;                              ',\r\n        '  attribute vec2 a_relativeXy;                                  ',\r\n        '  attribute float a_fillPattern;                                ',\r\n        '                                                                ',\r\n        '  varying vec4 v_Color;                                         ',\r\n        '  varying vec4 v_ColorSecondary;                                ',\r\n        '  varying vec2 v_relativeXy;                                    ',\r\n        '  varying float v_fillPattern;                                  ',\r\n        '                                                                ',\r\n        '  void main( ) {                                                ',\r\n        '      gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 );  ',\r\n        '      v_Color = a_Color;                                        ',\r\n        '      v_ColorSecondary = a_ColorSecondary;                      ',\r\n        '      v_relativeXy = a_relativeXy;                              ',\r\n        '      v_fillPattern = a_fillPattern;                            ',\r\n        '  }                                                             ',\r\n        '                                                                '\r\n    );\r\n\r\n    const fillPattern_FRAGSHADER = concatLines(\r\n        ' #define PI 3.1415926535897932384626433832795                                                  ',\r\n        '                                                                                               ',\r\n        ' precision lowp float;                                                                         ',\r\n        ' // the width in pixels of the first color stripe                                              ',\r\n        ' uniform float u_stripeWidth;                                                                  ',\r\n        ' // the width in pixels of the second color stripe                                             ',\r\n        ' uniform float u_stripeSecondaryWidth;                                                         ',\r\n        ' // the slant of the stipes: 0 = horizontal, 1 = 45 degrees                                    ',\r\n        ' uniform float u_slant;                                                                        ',\r\n        ' // width in pixels of the antialiasing of the slant                                           ',\r\n        ' uniform float u_featherWidth;                                                                 ',\r\n        '                                                                                               ',\r\n        ' varying vec4 v_Color;                                                                         ',\r\n        ' varying vec4 v_ColorSecondary;                                                                ',\r\n        ' varying vec2 v_relativeXy;                                                                    ',\r\n        ' varying float v_fillPattern;                                                                  ',\r\n        '                                                                                               ',\r\n        ' void pattern_stripe( ) {                                                                      ',\r\n        '     float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth;                          ',\r\n        '                                                                                               ',\r\n        '     // calculate the value indicating where we are in the stripe pattern                      ',\r\n        '     float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal );  ',\r\n        '                                                                                               ',\r\n        '     // we are in the feather region beween the two stripes                                    ',\r\n        '     if ( stripeCoord < u_featherWidth ) {                                                     ',\r\n        '         float diff = stripeCoord / u_featherWidth;                                            ',\r\n        '         gl_FragColor = vec4 ( v_Color.xyz * diff + (1.0-diff) * v_ColorSecondary.xyz, 1.0 );  ',\r\n        '     }                                                                                         ',\r\n        '     // we are in the color 1 stripe                                                           ',\r\n        '     else if ( stripeCoord < u_stripeWidth ) {                                                 ',\r\n        '         gl_FragColor = v_Color;                                                               ',\r\n        '     }                                                                                         ',\r\n        '     // we are the feather region between the two stripes                                      ',\r\n        '     else if ( stripeCoord  < u_stripeWidth + u_featherWidth ) {                               ',\r\n        '         float diff = ( stripeCoord - u_stripeWidth ) / u_featherWidth;                        ',\r\n        '         gl_FragColor = vec4 ( v_Color.xyz * (1.0-diff) + diff * v_ColorSecondary.xyz, 1.0 );  ',\r\n        '     }                                                                                         ',\r\n        '     // we are in the color 2 stripe                                                           ',\r\n        '     else {                                                                                    ',\r\n        '         gl_FragColor = v_ColorSecondary;                                                      ',\r\n        '     }                                                                                         ',\r\n        ' }                                                                                             ',\r\n        '                                                                                               ',\r\n        ' void pattern_gradient( ) {                                                                    ',\r\n        '     float stripeWidthTotal = u_stripeWidth + u_stripeSecondaryWidth;                          ',\r\n        '                                                                                               ',\r\n        '     // calculate the value indicating where we are in the stripe pattern                      ',\r\n        '     float stripeCoord = mod( v_relativeXy.x + u_slant * v_relativeXy.y , stripeWidthTotal );  ',\r\n        '                                                                                               ',\r\n        '     float weightedCoord;                                                                      ',\r\n        '     if ( stripeCoord < u_stripeWidth ) {                                                      ',\r\n        '         float slope =  PI / u_stripeWidth;                                                    ',\r\n        '         weightedCoord = slope * stripeCoord;                                                  ',\r\n        '     }                                                                                         ',\r\n        '     else {                                                                                    ',\r\n        '         float slope = PI / u_stripeSecondaryWidth;                                            ',\r\n        '         weightedCoord = PI + slope * ( stripeCoord - u_stripeWidth );                         ',\r\n        '     }                                                                                         ',\r\n        '                                                                                               ',\r\n        '     // sin wave domain: [0, stripeWidthTotal ] range: [0, 1]                                  ',\r\n        '     float frac = sin( weightedCoord ) * 2.0 - 1.0;                                            ',\r\n        '                                                                                               ',\r\n        '     // mix primary and secondary colors based on gradient fraction                            ',\r\n        '     gl_FragColor = mix( v_Color, v_ColorSecondary, frac );                                    ',\r\n        ' }                                                                                             ',\r\n        '                                                                                               ',\r\n        ' void pattern_solid( ) {                                                                       ',\r\n        '     gl_FragColor = v_Color;                                                                   ',\r\n        ' }                                                                                             ',\r\n        '                                                                                               ',\r\n        ' void main( ) {                                                                                ',\r\n        '     if ( v_fillPattern == 1.0 ) {                                                             ',\r\n        '         pattern_stripe( );                                                                    ',\r\n        '     }                                                                                         ',\r\n        '     else if ( v_fillPattern == 2.0 ) {                                                        ',\r\n        '         pattern_gradient( );                                                                  ',\r\n        '     }                                                                                         ',\r\n        '     else {                                                                                    ',\r\n        '         pattern_solid( );                                                                     ',\r\n        '     }                                                                                         ',\r\n        ' }                                                                                             ',\r\n        '                                                                                               ',\r\n        '                                                                                               ',\r\n        '                                                                                               '\r\n    );\r\n\r\n    const program = new Program(xyFrac_vColor_VERTSHADER, fillPattern_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const a_Color = new Attribute(program, 'a_Color');\r\n    const a_ColorSecondary = new Attribute(program, 'a_ColorSecondary');\r\n    const a_relativeXy = new Attribute(program, 'a_relativeXy');\r\n    const a_fillPattern = new Attribute(program, 'a_fillPattern');\r\n\r\n    const u_stripeWidth = new Uniform1f(program, 'u_stripeWidth');\r\n    const u_stripeSecondaryWidth = new Uniform1f(program, 'u_stripeSecondaryWidth');\r\n    const u_slant = new Uniform1f(program, 'u_slant');\r\n    const u_featherWidth = new Uniform1f(program, 'u_featherWidth');\r\n\r\n    let xys = new Float32Array(0);\r\n    const xysBuffer = newDynamicBuffer();\r\n\r\n    let rgbas = new Float32Array(0);\r\n    const rgbasBuffer = newDynamicBuffer();\r\n\r\n    let rgbasSecondary = new Float32Array(0);\r\n    const rgbasSecondaryBuffer = newDynamicBuffer();\r\n\r\n    let relativeXys = new Float32Array(0);\r\n    const relativeXysBuffer = newDynamicBuffer();\r\n\r\n    let fillPattern = new Float32Array(0);\r\n    const fillPatternBuffer = newDynamicBuffer();\r\n\r\n    return {\r\n        paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number) {\r\n            if (indexXys === 0 || indexRgbas === 0) {\r\n                return;\r\n            }\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n\r\n            u_slant.setData(gl, stripeSlant);\r\n            u_stripeWidth.setData(gl, stripeWidth);\r\n            u_stripeSecondaryWidth.setData(gl, stripeSecondaryWidth);\r\n            u_featherWidth.setData(gl, featherWidth);\r\n\r\n            xysBuffer.setData(xys.subarray(0, indexXys));\r\n            a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n            rgbasBuffer.setData(rgbas.subarray(0, indexRgbas));\r\n            a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT);\r\n\r\n            rgbasSecondaryBuffer.setData(rgbasSecondary.subarray(0, indexRgbas));\r\n            a_ColorSecondary.setDataAndEnable(gl, rgbasSecondaryBuffer, 4, GL.FLOAT);\r\n\r\n            relativeXysBuffer.setData(relativeXys.subarray(0, indexRelativeXys));\r\n            a_relativeXy.setDataAndEnable(gl, relativeXysBuffer, 2, GL.FLOAT);\r\n\r\n            fillPatternBuffer.setData(fillPattern.subarray(0, indexFillPattern));\r\n            a_fillPattern.setDataAndEnable(gl, fillPatternBuffer, 1, GL.FLOAT);\r\n\r\n            gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2));\r\n\r\n            a_Color.disable(gl);\r\n            a_XyFrac.disable(gl);\r\n            a_ColorSecondary.disable(gl);\r\n            a_fillPattern.disable(gl);\r\n            a_relativeXy.disable(gl);\r\n\r\n            program.endUse(gl);\r\n        },\r\n        ensureCapacity: function (eventCount: number) {\r\n            const numVertices = (6 * (1 /*quads*/)) * eventCount;\r\n            xys = ensureCapacityFloat32(xys, 2 * numVertices);\r\n            rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices);\r\n            rgbasSecondary = ensureCapacityFloat32(rgbasSecondary, 4 * numVertices);\r\n            relativeXys = ensureCapacityFloat32(relativeXys, 2 * numVertices);\r\n            fillPattern = ensureCapacityFloat32(fillPattern, numVertices);\r\n        },\r\n        fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexRelativeXys: number, indexFillPattern: number): { indexXys: number; indexRgbas: number; indexRelativeXys: number; indexFillPattern: number; } {\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n\r\n            const wBorder = borderThickness / viewport.w;\r\n            const hBorder = borderThickness / viewport.h;\r\n\r\n            const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin;\r\n            const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin;\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin;\r\n            const yTop = (viewport.h - jTop) / viewport.h;\r\n            const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin;\r\n            const yBottom = (viewport.h - jBottom) / viewport.h;\r\n\r\n            const xLeft = timeAxis.tFrac(event.start_PMILLIS);\r\n            const xRight = timeAxis.tFrac(event.end_PMILLIS);\r\n\r\n            const xWidthPixels = viewport.w * (xRight - xLeft);\r\n            const yHeightPixels = jTop - jBottom;\r\n\r\n            if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) {\r\n\r\n                // Fill\r\n                let fillColor = (event.bgColor || defaultColor);\r\n                let fillColorSecondary = (event.bgSecondaryColor || defaultColorSecondary);\r\n                if (event === selection.hoveredEvent.value) {\r\n                    fillColor = darker(fillColor, 0.8);\r\n                    fillColorSecondary = darker(fillColorSecondary, 0.8);\r\n                }\r\n                indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop - hBorder, yBottom + hBorder);\r\n\r\n                const startIndex = indexRgbas;\r\n                putQuadRgbas(rgbas, startIndex, fillColor);\r\n                indexRgbas = putQuadRgbas(rgbasSecondary, startIndex, fillColorSecondary);\r\n\r\n                // create a quad with relative coordinates\r\n                indexRelativeXys = putQuadXys(relativeXys, indexRelativeXys, 0.0, xWidthPixels, 0.0, yHeightPixels);\r\n\r\n                // Set the fillPatternValue per vertex of the quad\r\n                const fillPatternValue: number = event.fillPattern;\r\n\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n                fillPattern[indexFillPattern++] = fillPatternValue;\r\n            }\r\n\r\n            return { indexXys: indexXys, indexRgbas: indexRgbas, indexRelativeXys: indexRelativeXys, indexFillPattern: indexFillPattern };\r\n        }\r\n    };\r\n}\r\n\r\nfunction eventDashedBorderPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2);\r\n    const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2);\r\n    const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2);\r\n    const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL);\r\n    const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4));\r\n    const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null);\r\n    const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : null);\r\n    const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0);\r\n    const dashLength = (hasval(barOpts) && hasval(barOpts.dashLength) ? barOpts.dashLength : 5);\r\n    const defaultSecondaryColor = new Color(0, 0, 0, 0);\r\n\r\n    const selection = ui.selection;\r\n\r\n    const dashedBorder_VERTSHADER = concatLines(\r\n        '                                                                ',\r\n        '  attribute vec2 a_XyFrac;                                      ',\r\n        '  attribute vec4 a_Color;                                       ',\r\n        '  attribute vec4 a_SecondaryColor;                              ',\r\n        '  attribute float a_LengthSoFar;                                ',\r\n        '                                                                ',\r\n        '  varying vec4 v_Color;                                         ',\r\n        '  varying vec4 v_SecondaryColor;                                ',\r\n        '  varying float f_LengthSoFar;                                  ',\r\n        '                                                                ',\r\n        '  void main( ) {                                                ',\r\n        '      gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 );  ',\r\n        '      v_Color = a_Color;                                        ',\r\n        '      v_SecondaryColor = a_SecondaryColor;                      ',\r\n        '      f_LengthSoFar = a_LengthSoFar;                            ',\r\n        '  }                                                             ',\r\n        '                                                                '\r\n    );\r\n\r\n    const varyingBorder_FRAGSHADER = concatLines(\r\n        '                                                                            ',\r\n        '  precision lowp float;                                                     ',\r\n        '  varying vec4 v_Color;                                                     ',\r\n        '  varying vec4 v_SecondaryColor;                                            ',\r\n        '  varying float f_LengthSoFar;                                              ',\r\n        '  //dashes are u_DashLength_PX pixels long                                  ',\r\n        '  uniform float u_DashLength_PX;                                            ',\r\n        '                                                                            ',\r\n        '  void main( ) {                                                            ',\r\n        '      gl_FragColor = v_Color;                                               ',\r\n        '                                                                            ',\r\n        '      if (f_LengthSoFar > 0.0) {                                            ',\r\n        '         float mod = mod(f_LengthSoFar, u_DashLength_PX * 2.0);             ',\r\n        '         float alpha = 1.0;                                                 ',\r\n        '         if ( mod < u_DashLength_PX ) {                                     ',\r\n        '            gl_FragColor = v_SecondaryColor;                                ',\r\n        '         }                                                                  ',\r\n        '         else {                                                             ',\r\n        '            gl_FragColor = v_Color;                                         ',\r\n        '         }                                                                  ',\r\n        '      }                                                                     ',\r\n        '      else {                                                                ',\r\n        '         gl_FragColor = v_Color;                                            ',\r\n        '      }                                                                     ',\r\n        '  }                                                                         ',\r\n        '                                                                            '\r\n    );\r\n\r\n    const program = new Program(dashedBorder_VERTSHADER, varyingBorder_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const a_Color = new Attribute(program, 'a_Color');\r\n    const a_SecondaryColor = new Attribute(program, 'a_SecondaryColor');\r\n    const a_LengthSoFar = new Attribute(program, 'a_LengthSoFar');\r\n    const u_DashLength_PX = new Uniform1f(program, 'u_DashLength_PX');\r\n\r\n    let xys = new Float32Array(0);\r\n    const xysBuffer = newDynamicBuffer();\r\n\r\n    let rgbas = new Float32Array(0);\r\n    const rgbasBuffer = newDynamicBuffer();\r\n\r\n    let rgbasSecondary = new Float32Array(0);\r\n    const rgbasSecondaryBuffer = newDynamicBuffer();\r\n\r\n    let lengths = new Float32Array(0);\r\n    const lengthsBuffer = newDynamicBuffer();\r\n\r\n    return {\r\n        paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable, indexLengthSoFar: number) {\r\n            if (indexXys === 0 || indexRgbas === 0) {\r\n                return;\r\n            }\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n            u_DashLength_PX.setData(gl, dashLength);\r\n            xysBuffer.setData(xys.subarray(0, indexXys));\r\n            a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n            rgbasBuffer.setData(rgbas.subarray(0, indexRgbas));\r\n            a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT);\r\n            rgbasSecondaryBuffer.setData(rgbasSecondary.subarray(0, indexRgbas));\r\n            a_SecondaryColor.setDataAndEnable(gl, rgbasSecondaryBuffer, 4, GL.FLOAT);\r\n            lengthsBuffer.setData(lengths.subarray(0, indexLengthSoFar));\r\n            a_LengthSoFar.setDataAndEnable(gl, lengthsBuffer, 1, GL.FLOAT);\r\n\r\n            gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2));\r\n\r\n            a_Color.disable(gl);\r\n            a_SecondaryColor.disable(gl);\r\n            a_XyFrac.disable(gl);\r\n            a_LengthSoFar.disable(gl);\r\n            program.endUse(gl);\r\n        },\r\n        ensureCapacity: function (eventCount: number) {\r\n            let numVertices;\r\n            switch (cornerType) {\r\n                case JointType.BEVEL:\r\n                    numVertices = (6 * (4 /*quads*/) + 3 * (4 /*triangles*/)) * eventCount;\r\n                    break;\r\n\r\n                default:\r\n                    numVertices = (6 * (4 /*quads*/)) * eventCount;\r\n                    break;\r\n            }\r\n\r\n            xys = ensureCapacityFloat32(xys, 2 * numVertices);\r\n            rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices);\r\n            rgbasSecondary = ensureCapacityFloat32(rgbasSecondary, 4 * numVertices);\r\n            lengths = ensureCapacityFloat32(lengths, numVertices);\r\n        },\r\n        fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable, indexLengthSoFar: number): { indexXys: number; indexRgbas: number; indexLengthSoFar: number } {\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n\r\n            const wBorder = borderThickness / viewport.w;\r\n            const hBorder = borderThickness / viewport.h;\r\n\r\n            const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin;\r\n            const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin;\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin;\r\n            const yTop = (viewport.h - jTop) / viewport.h;\r\n            const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin;\r\n            const yBottom = (viewport.h - jBottom) / viewport.h;\r\n\r\n            const xLeft = timeAxis.tFrac(event.start_PMILLIS);\r\n            const xRight = timeAxis.tFrac(event.end_PMILLIS);\r\n\r\n            const widthPixels = viewport.w * (xRight - xLeft);\r\n            const heightPixels = jBottom - jTop;  // confirmed jBottom > jTop\r\n\r\n            const setLengthsVertical = function (bottomEdge: number, topEdge: number) {\r\n                lengths[indexLengthSoFar++] = topEdge;\r\n                lengths[indexLengthSoFar++] = topEdge;\r\n                lengths[indexLengthSoFar++] = bottomEdge;\r\n                lengths[indexLengthSoFar++] = bottomEdge;\r\n                lengths[indexLengthSoFar++] = topEdge;\r\n                lengths[indexLengthSoFar++] = bottomEdge;\r\n\r\n                // for convenience, return the length of the edge\r\n                return Math.abs(bottomEdge - topEdge);\r\n            };\r\n\r\n            const setLengthsHorizontal = function (leftEdge: number, rightEdge: number) {\r\n                lengths[indexLengthSoFar++] = leftEdge;\r\n                lengths[indexLengthSoFar++] = rightEdge;\r\n                lengths[indexLengthSoFar++] = leftEdge;\r\n                lengths[indexLengthSoFar++] = leftEdge;\r\n                lengths[indexLengthSoFar++] = rightEdge;\r\n                lengths[indexLengthSoFar++] = rightEdge;\r\n\r\n                // for convenience, return the length of the edge\r\n                return Math.abs(leftEdge - rightEdge);\r\n            };\r\n\r\n            const setLengthsTriangle = function (length: number) {\r\n                lengths[indexLengthSoFar++] = length;\r\n                lengths[indexLengthSoFar++] = length;\r\n                lengths[indexLengthSoFar++] = length;\r\n            };\r\n\r\n            if (!(xRight < 0 || xLeft > 1) && widthPixels > minimumVisibleWidth) {\r\n\r\n                // Border\r\n                let borderColor = (event.borderColor || event.bgColor || defaultBorderColor);\r\n                const borderSecondaryColor = (event.borderSecondaryColor || defaultSecondaryColor);\r\n                if (selection.selectedEvents.hasValue(event)) {\r\n                    borderColor = (selectedBorderColor || borderColor);\r\n                }\r\n                if (borderColor) {\r\n                    let startIndex = 0;\r\n                    switch (cornerType) {\r\n                        case JointType.BEVEL:\r\n                            // Quads\r\n\r\n                            // top edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop, yTop - hBorder);\r\n                            indexXys = putUpperRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yBottom + hBorder, yBottom);\r\n                            // right edge\r\n                            indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop - hBorder, yBottom + hBorder);\r\n                            indexXys = putLowerRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yTop, yTop - hBorder);\r\n                            // bottom edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yBottom + hBorder, yBottom);\r\n                            indexXys = putLowerLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yTop, yTop - hBorder);\r\n                            // left edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom + hBorder);\r\n                            indexXys = putUpperLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yBottom + hBorder, yBottom);\r\n\r\n                            // Colors\r\n                            startIndex = indexRgbas;\r\n                            putRgbas(rgbas, startIndex, borderColor, 24);\r\n                            indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 24);\r\n\r\n                            // Colors\r\n                            startIndex = indexRgbas;\r\n                            putRgbas(rgbas, startIndex, borderColor, 12);\r\n                            indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 12);\r\n\r\n                            // Stipple\r\n                            if (!event.isBorderDashed) {\r\n                                setLengthsHorizontal(-1, -1);\r\n                                setLengthsTriangle(-1);\r\n                                setLengthsVertical(-1, -1);\r\n                                setLengthsTriangle(-1);\r\n                                setLengthsHorizontal(-1, -1);\r\n                                setLengthsTriangle(-1);\r\n                                setLengthsVertical(-1, -1);\r\n                                setLengthsTriangle(-1);\r\n                            }\r\n                            else {\r\n                                let cumulativeLength = 0;\r\n                                // top edge\r\n                                cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels);\r\n                                setLengthsTriangle(cumulativeLength);\r\n                                // right edge\r\n                                cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength);\r\n                                setLengthsTriangle(cumulativeLength);\r\n                                // bottom edge\r\n                                cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels);\r\n                                setLengthsTriangle(cumulativeLength);\r\n                                // left edge\r\n                                cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength);\r\n                                setLengthsTriangle(cumulativeLength);\r\n                            }\r\n\r\n                            break;\r\n\r\n                        default:\r\n\r\n                            // top edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xRight - wBorder, yTop, yTop - hBorder);\r\n                            // right edge\r\n                            indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop, yBottom + hBorder);\r\n                            // bottom edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight, yBottom + hBorder, yBottom);\r\n                            // left edge\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom);\r\n                            // color\r\n                            startIndex = indexRgbas;\r\n                            putRgbas(rgbas, startIndex, borderColor, 24);\r\n                            indexRgbas = putRgbas(rgbasSecondary, startIndex, borderSecondaryColor, 24);\r\n\r\n                            // Stipple\r\n                            if (!event.isBorderDashed) {\r\n                                setLengthsHorizontal(-1, -1);\r\n                                setLengthsVertical(-1, -1);\r\n                                setLengthsHorizontal(-1, -1);\r\n                                setLengthsVertical(-1, -1);\r\n                            }\r\n                            else {\r\n                                let cumulativeLength = 0;\r\n                                // top edge\r\n                                cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels);\r\n                                // right edge\r\n                                cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength);\r\n                                // bottom edge\r\n                                cumulativeLength += setLengthsHorizontal(cumulativeLength, cumulativeLength + widthPixels);\r\n                                // left edge\r\n                                cumulativeLength += setLengthsVertical(cumulativeLength + heightPixels, cumulativeLength);\r\n                            }\r\n\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { indexXys: indexXys, indexRgbas: indexRgbas, indexLengthSoFar: indexLengthSoFar };\r\n        }\r\n    };\r\n}\r\n\r\nexport function newEventStripedBarsPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            helper.ensureCapacity(lanes.numEvents);\r\n\r\n            let indexXys = 0;\r\n            let indexRgbas = 0;\r\n            let indexRelativeXys = 0;\r\n            let indexFillPattern = 0;\r\n\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n                    const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexRelativeXys, indexFillPattern);\r\n                    indexXys = indexes.indexXys;\r\n                    indexRgbas = indexes.indexRgbas;\r\n                    indexRelativeXys = indexes.indexRelativeXys;\r\n                    indexFillPattern = indexes.indexFillPattern;\r\n                }\r\n            }\r\n\r\n            helper.paint(indexXys, indexRgbas, gl, viewport, indexRelativeXys, indexFillPattern);\r\n        };\r\n    };\r\n}\r\n\r\nexport function newEventDashedBordersPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            helper.ensureCapacity(lanes.numEvents);\r\n\r\n            let indexXys = 0;\r\n            let indexRgbas = 0;\r\n            let indexLengthSoFar = 0;\r\n\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n                    const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport, indexLengthSoFar);\r\n                    indexXys = indexes.indexXys;\r\n                    indexRgbas = indexes.indexRgbas;\r\n                    indexLengthSoFar = indexes.indexLengthSoFar;\r\n                }\r\n            }\r\n\r\n            helper.paint(indexXys, indexRgbas, gl, viewport, indexLengthSoFar);\r\n        };\r\n    };\r\n}\r\n\r\n\r\nexport interface TimelineEventIconsPainterOptions {\r\n    topMargin?: number;\r\n    bottomMargin?: number;\r\n    vAlign?: number;\r\n}\r\n\r\n\r\nfunction eventIconsPainterHelper(iconOpts: TimelineEventIconsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const topMargin = (hasval(iconOpts) && hasval(iconOpts.topMargin) ? iconOpts.topMargin : 1.2);\r\n    const bottomMargin = (hasval(iconOpts) && hasval(iconOpts.bottomMargin) ? iconOpts.bottomMargin : 1.2);\r\n    const vAlign = (hasval(iconOpts) && hasval(iconOpts.vAlign) ? iconOpts.vAlign : 0.5);\r\n\r\n    const textureRenderer = new TextureRenderer();\r\n\r\n    return {\r\n        textureRenderer: textureRenderer,\r\n        paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n            const eventStyle = ui.eventStyle(event.styleGuid);\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight + topMargin;\r\n            const yFrac = (viewport.h - jTop - (1.0 - vAlign) * (laneHeight - topMargin - bottomMargin)) / viewport.h;\r\n\r\n            for (let n = 0; n < eventStyle.numIcons; n++) {\r\n                const icon = eventStyle.icon(n);\r\n                const iconTime_PMILLIS = event.start_PMILLIS + icon.hPos * (event.end_PMILLIS - event.start_PMILLIS);\r\n                const xFrac = timeAxis.tFrac(iconTime_PMILLIS);\r\n                const w = icon.displayWidth / viewport.w;\r\n                if (-w <= xFrac && xFrac <= 1 + w) {\r\n                    const iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); });\r\n                    if (iconTexture) {\r\n                        textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: icon.hAlign, yAnchor: vAlign, width: icon.displayWidth, height: icon.displayHeight });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    };\r\n}\r\n\r\nexport function newEventIconsPainterFactory(iconOpts?: TimelineEventIconsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            helper.textureRenderer.begin(gl, viewport);\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    helper.paintEvent(l, e, gl, viewport);\r\n                }\r\n            }\r\n            helper.textureRenderer.end(gl);\r\n        };\r\n    };\r\n}\r\n\r\n\r\n\r\nexport interface TimelineEventLabelOptions {\r\n    topMargin?: number;\r\n    bottomMargin?: number;\r\n    leftMargin?: number;\r\n    rightMargin?: number;\r\n    vAlign?: number;\r\n    spacing?: number;\r\n    extendBeyondBar?: boolean;\r\n\r\n    // Options:\r\n    // 'force'        always show text regardless of available space\r\n    // 'truncate'     truncate text with '...' when space is insufficient\r\n    // 'show'         show text if space exits, hide all the text if it cannot be displayed in its entirity\r\n    textMode?: string;\r\n\r\n    iconsEnabled?: boolean;\r\n    // Can be a number, or 'imageSize', or 'auto'\r\n    iconsForceWidth?: any;\r\n    // Can be a number, or 'imageSize', or 'auto'\r\n    iconsForceHeight?: any;\r\n    iconsSizeFactor?: number;\r\n\r\n    textEnabled?: boolean;\r\n    textDefaultColor?: Color;\r\n    textFont?: string;\r\n}\r\n\r\nfunction calculateTextWidth(textEnabled: boolean, labelText: string, fgColor: Color, textDefaultColor: Color,\r\n    textTextures: TwoKeyCache<TextTexture2D>, viewport: BoundsUnmodifiable) {\r\n    let wText = 0;\r\n    let textTexture;\r\n    if (textEnabled && labelText) {\r\n        const textColor = hasval(fgColor) ? fgColor : textDefaultColor;\r\n        textTexture = textTextures.value(textColor.rgbaString, labelText);\r\n        wText = textTexture.w / viewport.w;\r\n    }\r\n    return {\r\n        wText: wText,\r\n        textTexture: textTexture\r\n    };\r\n}\r\n\r\nfunction eventLabelsPainterHelper(labelOpts: TimelineEventLabelOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const topMargin = (hasval(labelOpts) && hasval(labelOpts.topMargin) ? labelOpts.topMargin : 1.2);\r\n    const bottomMargin = (hasval(labelOpts) && hasval(labelOpts.bottomMargin) ? labelOpts.bottomMargin : 1.2);\r\n    const leftMargin = (hasval(labelOpts) && hasval(labelOpts.leftMargin) ? labelOpts.leftMargin : 4);\r\n    const rightMargin = (hasval(labelOpts) && hasval(labelOpts.rightMargin) ? labelOpts.rightMargin : 4);\r\n    const vAlign = (hasval(labelOpts) && hasval(labelOpts.vAlign) ? labelOpts.vAlign : 0.5);\r\n    const spacing = (hasval(labelOpts) && hasval(labelOpts.spacing) ? labelOpts.spacing : 3);\r\n    const extendBeyondBar = (hasval(labelOpts) && hasval(labelOpts.extendBeyondBar) ? labelOpts.extendBeyondBar : false);\r\n    const textMode = (hasval(labelOpts) && hasval(labelOpts.textMode) ? labelOpts.textMode : 'force');\r\n\r\n    // Icon options\r\n    const iconsEnabled = (hasval(labelOpts) && hasval(labelOpts.iconsEnabled) ? labelOpts.iconsEnabled : true);\r\n    const iconsForceWidth = (hasval(labelOpts) && hasval(labelOpts.iconsForceWidth) ? labelOpts.iconsForceWidth : 'auto');\r\n    const iconsForceHeight = (hasval(labelOpts) && hasval(labelOpts.iconsForceHeight) ? labelOpts.iconsForceHeight : 'auto');\r\n    const iconsSizeFactor = (hasval(labelOpts) && hasval(labelOpts.iconsSizeFactor) ? labelOpts.iconsSizeFactor : 1);\r\n\r\n    // Text options\r\n    const textEnabled = (hasval(labelOpts) && hasval(labelOpts.textEnabled) ? labelOpts.textEnabled : true);\r\n    const textDefaultColor = (hasval(labelOpts) && hasval(labelOpts.textDefaultColor) ? labelOpts.textDefaultColor : options.timelineFgColor);\r\n    const textFont = (hasval(labelOpts) && hasval(labelOpts.textFont) ? labelOpts.textFont : options.timelineFont);\r\n\r\n    // XXX: Old icon textures never get cleaned out\r\n    const iconTextures: StringMap<Texture2D> = {};\r\n    const textTextures = newTextTextureCache2(textFont);\r\n    const textureRenderer = new TextureRenderer();\r\n\r\n    return {\r\n        textTextures: textTextures,\r\n        textureRenderer: textureRenderer,\r\n        paintEvent: function (laneIndex: number, eventIndex: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n\r\n            const labelTopMargin = hasval(event.labelTopMargin) ? event.labelTopMargin : topMargin;\r\n            const labelBottomMargin = hasval(event.labelBottomMargin) ? event.labelBottomMargin : bottomMargin;\r\n\r\n            const labelVAlign = hasval(event.labelVAlign) ? event.labelVAlign : vAlign;\r\n            const labelVPos = hasval(event.labelVPos) ? event.labelVPos : labelVAlign;\r\n\r\n            const labelHAlign = hasval(event.labelHAlign) ? event.labelHAlign : 0;\r\n            const labelHPos = hasval(event.labelHPos) ? event.labelHPos : labelHAlign;\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight + labelTopMargin;\r\n            const yFrac = (viewport.h - jTop - (1.0 - labelVAlign) * (laneHeight - labelTopMargin - labelBottomMargin)) / viewport.h;\r\n\r\n            const xLeftMin = 2 / viewport.w;\r\n            const xRightMax = (viewport.w - 2) / viewport.w;\r\n            const wLeftIndent = leftMargin / viewport.w;\r\n            const wRightIndent = rightMargin / viewport.w;\r\n\r\n            const xStart = timeAxis.tFrac(event.start_PMILLIS);\r\n            const xEnd = timeAxis.tFrac(event.end_PMILLIS);\r\n\r\n            const wTotal = (xEnd - wRightIndent) - (xStart + wLeftIndent);\r\n            const wSpacing = (spacing / viewport.w);\r\n\r\n            if (!(xEnd <= 0 || xStart > 1)) {\r\n\r\n                let xLeft;\r\n                let xRight;\r\n                if (extendBeyondBar) {\r\n                    if (eventIndex + 1 < lane.length) {\r\n                        const nextEvent = lane.event(eventIndex + 1);\r\n                        const nextStart_PMILLIS = effectiveEdges_PMILLIS(ui, nextEvent)[0];\r\n                        xRight = timeAxis.tFrac(nextStart_PMILLIS);\r\n                    }\r\n                    else {\r\n                        xRight = xRightMax;\r\n                    }\r\n\r\n                    if (eventIndex - 1 >= 0) {\r\n                        const previousEvent = lane.event(eventIndex - 1);\r\n                        const previousEnd_PMILLIS = effectiveEdges_PMILLIS(ui, previousEvent)[1];\r\n                        xLeft = timeAxis.tFrac(previousEnd_PMILLIS);\r\n                    }\r\n                    else {\r\n                        xLeft = xLeftMin;\r\n                    }\r\n                }\r\n                else {\r\n                    xRight = xEnd;\r\n                    xLeft = xStart;\r\n                }\r\n\r\n                // calculate Text width\r\n                let calculatedTextWidth = calculateTextWidth(textEnabled, event.label, event.fgColor, textDefaultColor, textTextures, viewport);\r\n                let wText = calculatedTextWidth.wText;\r\n                let textTexture = calculatedTextWidth.textTexture;\r\n\r\n                // calculate Icon width (and start load if necessary)\r\n                let wIcon = 0;\r\n                let wIconPlusSpacing = 0;\r\n                let iconWidth;\r\n                let iconHeight;\r\n                let iconTexture;\r\n                if (iconsEnabled && event.labelIcon) {\r\n                    iconTexture = iconTextures[event.labelIcon];\r\n                    if (hasval(iconTexture)) {\r\n                        iconWidth = (isNumber(iconsForceWidth) ? iconsForceWidth : (iconsForceWidth === 'imageSize' ? iconTexture.w : null));\r\n                        iconHeight = (isNumber(iconsForceHeight) ? iconsForceHeight : (iconsForceHeight === 'imageSize' ? iconTexture.h : null));\r\n\r\n                        const wIconKnown = hasval(iconWidth);\r\n                        const hIconKnown = hasval(iconHeight);\r\n                        if (!wIconKnown && !hIconKnown) {\r\n                            iconHeight = Math.round(iconsSizeFactor * (laneHeight - labelTopMargin - labelBottomMargin));\r\n                            iconWidth = iconTexture.w * iconHeight / iconTexture.h;\r\n                        }\r\n                        else if (!wIconKnown) {\r\n                            iconHeight = Math.round(iconsSizeFactor * iconHeight);\r\n                            iconWidth = iconTexture.w * iconHeight / iconTexture.h;\r\n                        }\r\n                        else if (!hIconKnown) {\r\n                            iconWidth = Math.round(iconsSizeFactor * iconWidth);\r\n                            iconHeight = iconTexture.h * iconWidth / iconTexture.w;\r\n                        }\r\n                        else {\r\n                            iconWidth = Math.round(iconsSizeFactor * iconWidth);\r\n                            iconHeight = Math.round(iconsSizeFactor * iconHeight);\r\n                        }\r\n\r\n                        wIcon = (iconWidth / viewport.w);\r\n\r\n                        wIconPlusSpacing = wIcon + wSpacing;\r\n                    }\r\n                    // A null in the map means a fetch has already been initiated\r\n                    // ... either it is still in progress, or it has already failed\r\n                    else if (iconTexture !== null) {\r\n                        iconTextures[event.labelIcon] = null;\r\n\r\n                        const image = new Image();\r\n                        image.onload = (function (url, img) {\r\n                            return function () {\r\n                                const wImage = img.naturalWidth;\r\n                                const hImage = img.naturalHeight;\r\n                                iconTextures[url] = new Texture2D(wImage, hImage, GL.LINEAR, GL.LINEAR, function (g) {\r\n                                    g.drawImage(img, 0, 0);\r\n                                });\r\n                                drawable.redraw();\r\n                            };\r\n                        })(event.labelIcon, image);\r\n                        image.src = event.labelIcon;\r\n                    }\r\n                }\r\n\r\n                // NOTE: With extendBeyondBar=true, we detect when there is insufficient space between the current event\r\n                //       and those to either side to display the text + icon. However, if one event has right aligned text\r\n                //       and the other has left aligned text, so both text labels overlap into the same space between the\r\n                //       events, we don't currently try to detect that.\r\n\r\n                // Determine whether there is enough space to display both text and icon, or only icon, or neither\r\n\r\n                // coordinates of the start edge of the icon + label\r\n                let xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign;\r\n                // coordinates of the end edge of the icon + label\r\n                let xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n\r\n                // adjust xStartLabel and xEndLabel if they fall off the screen\r\n                if (xStartLabel < xLeftMin) {\r\n                    xStartLabel = xLeftMin;\r\n                    xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n                }\r\n                else if (xEndLabel > xRightMax) {\r\n                    xEndLabel = xRightMax;\r\n                    xStartLabel = xEndLabel - (wSpacing + wIcon + wText);\r\n                }\r\n\r\n                if (textMode === 'truncate') {\r\n                    let labelText = event.label;\r\n                    while (!!labelText && labelText !== '...') {\r\n                        if (xEndLabel > xRight || xStartLabel < xLeft) {\r\n                            // there is not enough room for the text, begin truncating the text\r\n                            labelText = labelText.substring(0, labelText.length - 4).concat('...');\r\n                            calculatedTextWidth = calculateTextWidth(textEnabled, labelText, event.fgColor, textDefaultColor, textTextures, viewport);\r\n                            wText = calculatedTextWidth.wText;\r\n                            textTexture = calculatedTextWidth.textTexture;\r\n\r\n                            xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + wTotal * labelHAlign;\r\n                            // coordinates of the end edge of the icon + label\r\n                            xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n                            // adjust xStartLabel and xEndLabel if they fall off the screen\r\n                            if (xStartLabel < xLeftMin) {\r\n                                xStartLabel = xLeftMin;\r\n                                xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n                            } else if (xEndLabel > xRightMax) {\r\n                                xEndLabel = xRightMax;\r\n                                xStartLabel = xEndLabel - (wSpacing + wIcon + wText);\r\n                            }\r\n                        } else {\r\n                            break;\r\n                        }\r\n                    }\r\n                    if (!labelText || labelText === '...') {\r\n                        wText = 0;\r\n                        textTexture = null;\r\n                    }\r\n                } else if (textMode === 'show') {\r\n                    if (xEndLabel > xRight || xStartLabel < xLeft) {\r\n                        // there is not enough room for the text, try with just the icon\r\n                        wText = 0;\r\n                        textTexture = null;\r\n\r\n                        // coordinates of the start edge of the icon + label\r\n                        xStartLabel = xStart + wLeftIndent - (wIcon) * labelHPos + (wTotal) * labelHAlign;\r\n                        // coordinates of the end edge of the icon + label\r\n                        xEndLabel = xStartLabel + (wIcon);\r\n\r\n                        // adjust xStartLabel and xEndLabel if they fall off the screen\r\n                        if (xStartLabel < xLeftMin) {\r\n                            xStartLabel = xLeftMin;\r\n                            xEndLabel = xStartLabel + (wIcon);\r\n                        }\r\n                        else if (xEndLabel > xRightMax) {\r\n                            xEndLabel = xRightMax;\r\n                            xStartLabel = xEndLabel - (wIcon);\r\n                        }\r\n\r\n                        // if there is still not enough room, don't show anything\r\n                        if (xEndLabel > xRight || xStartLabel < xLeft) {\r\n                            wIcon = 0;\r\n                            iconTexture = null;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Icons\r\n                if (hasval(iconTexture)) {\r\n                    // coordinates of the start edge of the icon + label\r\n                    xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign;\r\n\r\n                    // coordinates of the end edge of the icon + label\r\n                    xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n\r\n                    if (xStartLabel < xLeftMin) {\r\n                        textureRenderer.draw(gl, iconTexture, xLeftMin, yFrac, { xAnchor: 0, yAnchor: labelVPos, width: iconWidth, height: iconHeight });\r\n                    }\r\n                    else if (xEndLabel > xRightMax) {\r\n                        textureRenderer.draw(gl, iconTexture, xRightMax - wSpacing - wText, yFrac, { xAnchor: 1, yAnchor: labelVPos, width: iconWidth, height: iconHeight });\r\n                    }\r\n                    else {\r\n                        const xFrac = xStart + wLeftIndent - (wSpacing + wText) * labelHPos + (wTotal) * labelHAlign;\r\n                        textureRenderer.draw(gl, iconTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: labelVPos, width: iconWidth, height: iconHeight });\r\n                    }\r\n                }\r\n\r\n                // Text\r\n                if (hasval(textTexture)) {\r\n                    // coordinates of the start edge of the icon + label\r\n                    xStartLabel = xStart + wLeftIndent - (wSpacing + wIcon + wText) * labelHPos + (wTotal) * labelHAlign;\r\n\r\n                    // coordinates of the end edge of the icon + label\r\n                    xEndLabel = xStartLabel + (wSpacing + wIcon + wText);\r\n\r\n                    if (xStartLabel < xLeftMin) {\r\n                        textureRenderer.draw(gl, textTexture, xLeftMin + wSpacing + wIcon, yFrac, { xAnchor: 0, yAnchor: textTexture.yAnchor(labelVPos) });\r\n                    }\r\n                    else if (xEndLabel > xRightMax) {\r\n                        textureRenderer.draw(gl, textTexture, xRightMax, yFrac, { xAnchor: 1, yAnchor: textTexture.yAnchor(labelVPos) });\r\n                    }\r\n                    else {\r\n                        const xFrac = xStart + wLeftIndent + (wIconPlusSpacing) * (1 - labelHPos) + (wTotal) * labelHAlign;\r\n                        textureRenderer.draw(gl, textTexture, xFrac, yFrac, { xAnchor: labelHPos, yAnchor: textTexture.yAnchor(labelVPos) });\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    };\r\n}\r\n\r\nexport function newEventLabelsPainterFactory(labelOpts?: TimelineEventLabelOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            helper.textTextures.resetTouches();\r\n            helper.textureRenderer.begin(gl, viewport);\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane: TimelineLane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    helper.paintEvent(l, e, gl, viewport);\r\n                }\r\n            }\r\n            helper.textureRenderer.end(gl);\r\n            helper.textTextures.retainTouched();\r\n        };\r\n    };\r\n}\r\n\r\n\r\nfunction eventBarPainterHelper(barOpts: TimelineEventBarsPainterOptions, drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions) {\r\n    const rowTopPadding = options.rowTopPadding;\r\n    const rowBottomPadding = options.rowBottomPadding;\r\n    const laneHeight = options.laneHeight;\r\n\r\n    const topMargin = (hasval(barOpts) && hasval(barOpts.topMargin) ? barOpts.topMargin : 1.2);\r\n    const bottomMargin = (hasval(barOpts) && hasval(barOpts.bottomMargin) ? barOpts.bottomMargin : 1.2);\r\n    const borderThickness = (hasval(barOpts) && hasval(barOpts.borderThickness) ? barOpts.borderThickness : 2);\r\n    const cornerType = (hasval(barOpts) && hasval(barOpts.cornerType) ? barOpts.cornerType : JointType.BEVEL);\r\n    const defaultColor = (hasval(barOpts) && hasval(barOpts.defaultColor) ? barOpts.defaultColor : options.timelineFgColor.withAlphaTimes(0.4));\r\n    const defaultBorderColor = (hasval(barOpts) && hasval(barOpts.defaultBorderColor) ? barOpts.defaultBorderColor : null);\r\n    const selectedBorderColor = (hasval(barOpts) && hasval(barOpts.selectedBorderColor) ? barOpts.selectedBorderColor : null);\r\n    const minimumVisibleWidth = (hasval(barOpts) && hasval(barOpts.minimumVisibleWidth) ? barOpts.minimumVisibleWidth : 0);\r\n\r\n    const selection = ui.selection;\r\n\r\n    const xyFrac_vColor_VERTSHADER = concatLines(\r\n        '                                                                ',\r\n        '  attribute vec2 a_XyFrac;                                      ',\r\n        '  attribute vec4 a_Color;                                       ',\r\n        '                                                                ',\r\n        '  varying vec4 v_Color;                                         ',\r\n        '                                                                ',\r\n        '  void main( ) {                                                ',\r\n        '      gl_Position = vec4( ( -1.0 + 2.0*a_XyFrac ), 0.0, 1.0 );  ',\r\n        '      v_Color = a_Color;                                        ',\r\n        '  }                                                             ',\r\n        '                                                                '\r\n    );\r\n\r\n    const program = new Program(xyFrac_vColor_VERTSHADER, varyingColor_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const a_Color = new Attribute(program, 'a_Color');\r\n\r\n    let xys = new Float32Array(0);\r\n    const xysBuffer = newDynamicBuffer();\r\n\r\n    let rgbas = new Float32Array(0);\r\n    const rgbasBuffer = newDynamicBuffer();\r\n\r\n    return {\r\n        paint(indexXys: number, indexRgbas: number, gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            if (indexXys === 0 || indexRgbas === 0) {\r\n                return;\r\n            }\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n            xysBuffer.setData(xys.subarray(0, indexXys));\r\n            a_XyFrac.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n            rgbasBuffer.setData(rgbas.subarray(0, indexRgbas));\r\n            a_Color.setDataAndEnable(gl, rgbasBuffer, 4, GL.FLOAT);\r\n\r\n            gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2));\r\n\r\n            a_Color.disable(gl);\r\n            a_XyFrac.disable(gl);\r\n            program.endUse(gl);\r\n        },\r\n        ensureCapacity: function (eventCount: number) {\r\n            let numVertices;\r\n            switch (cornerType) {\r\n                case JointType.BEVEL:\r\n                    numVertices = (6 * (5 /*quads*/) + 3 * (4 /*triangles*/)) * eventCount;\r\n                    break;\r\n\r\n                default:\r\n                    numVertices = (6 * (5 /*quads*/)) * eventCount;\r\n                    break;\r\n            }\r\n\r\n            xys = ensureCapacityFloat32(xys, 2 * numVertices);\r\n            rgbas = ensureCapacityFloat32(rgbas, 4 * numVertices);\r\n        },\r\n        fillEvent: function (laneIndex: number, eventIndex: number, indexXys: number, indexRgbas: number, viewport: BoundsUnmodifiable): { indexXys: number; indexRgbas: number } {\r\n            const lane: TimelineLane = lanes.lane(laneIndex);\r\n            const event: TimelineEventModel = lane.event(eventIndex);\r\n\r\n            const wBorder = borderThickness / viewport.w;\r\n            const hBorder = borderThickness / viewport.h;\r\n\r\n            const _topMargin = hasval(event.topMargin) ? event.topMargin : topMargin;\r\n            const _bottomMargin = hasval(event.bottomMargin) ? event.bottomMargin : bottomMargin;\r\n\r\n            const jTop = rowTopPadding + (laneIndex) * laneHeight + _topMargin;\r\n            const yTop = (viewport.h - jTop) / viewport.h;\r\n            const jBottom = rowTopPadding + (laneIndex + 1) * laneHeight - _bottomMargin;\r\n            const yBottom = (viewport.h - jBottom) / viewport.h;\r\n\r\n            const xLeft = timeAxis.tFrac(event.start_PMILLIS);\r\n            const xRight = timeAxis.tFrac(event.end_PMILLIS);\r\n\r\n            const xWidthPixels = viewport.w * (xRight - xLeft);\r\n\r\n            if (!(xRight < 0 || xLeft > 1) && xWidthPixels > minimumVisibleWidth) {\r\n\r\n                // Fill\r\n                let fillColor = (event.bgColor || defaultColor);\r\n                if (event === selection.hoveredEvent.value) {\r\n                    fillColor = darker(fillColor, 0.8);\r\n                }\r\n                indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop - hBorder, yBottom + hBorder);\r\n                indexRgbas = putQuadRgbas(rgbas, indexRgbas, fillColor);\r\n\r\n                // Border\r\n                let borderColor = (event.borderColor || (event.bgColor ? fillColor : null) || defaultBorderColor || fillColor);\r\n                if (selection.selectedEvents.hasValue(event)) {\r\n                    borderColor = (selectedBorderColor || borderColor);\r\n                }\r\n                if (borderColor) {\r\n                    switch (cornerType) {\r\n                        case JointType.BEVEL:\r\n                            // Quads\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom + hBorder);\r\n                            indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop - hBorder, yBottom + hBorder);\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yTop, yTop - hBorder);\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight - wBorder, yBottom + hBorder, yBottom);\r\n                            indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 24);\r\n                            // Triangles\r\n                            indexXys = putLowerLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yTop, yTop - hBorder);\r\n                            indexXys = putUpperLeftTriangleXys(xys, indexXys, xRight - wBorder, xRight, yBottom + hBorder, yBottom);\r\n                            indexXys = putUpperRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yBottom + hBorder, yBottom);\r\n                            indexXys = putLowerRightTriangleXys(xys, indexXys, xLeft, xLeft + wBorder, yTop, yTop - hBorder);\r\n                            indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 12);\r\n                            break;\r\n\r\n                        default:\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xRight - wBorder, yTop, yTop - hBorder);\r\n                            indexXys = putQuadXys(xys, indexXys, xRight - wBorder, xRight, yTop, yBottom + hBorder);\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft + wBorder, xRight, yBottom + hBorder, yBottom);\r\n                            indexXys = putQuadXys(xys, indexXys, xLeft, xLeft + wBorder, yTop - hBorder, yBottom);\r\n                            indexRgbas = putRgbas(rgbas, indexRgbas, borderColor, 24);\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { indexXys: indexXys, indexRgbas: indexRgbas };\r\n        }\r\n    };\r\n}\r\n\r\n\r\nexport function newEventBarsPainterFactory(barOpts?: TimelineEventBarsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const helper = eventBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            helper.ensureCapacity(lanes.numEvents);\r\n\r\n            let indexXys = 0;\r\n            let indexRgbas = 0;\r\n\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n                    const event = lane.event(e);\r\n                    const indexes = helper.fillEvent(l, e, indexXys, indexRgbas, viewport);\r\n                    indexXys = indexes.indexXys;\r\n                    indexRgbas = indexes.indexRgbas;\r\n                }\r\n            }\r\n\r\n            helper.paint(indexXys, indexRgbas, gl, viewport);\r\n        };\r\n    };\r\n}\r\n\r\n\r\nexport function newCombinedEventPainterFactory(barOpts?: TimelineEventBarsPainterOptions, labelOpts?: TimelineEventLabelOptions, iconOpts?: TimelineEventIconsPainterOptions): TimelineEventsPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, lanes: TimelineLaneArray, ui: TimelineUi, options: TimelineEventsPainterOptions): Painter {\r\n\r\n        const labelHelper = eventLabelsPainterHelper(labelOpts, drawable, timeAxis, lanes, ui, options);\r\n        const iconHelper = eventIconsPainterHelper(iconOpts, drawable, timeAxis, lanes, ui, options);\r\n        const barHelper = eventStripedBarPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options);\r\n        const dashedHelper = eventDashedBorderPainterHelper(barOpts, drawable, timeAxis, lanes, ui, options);\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            for (let l = 0; l < lanes.length; l++) {\r\n                const lane: TimelineLane = lanes.lane(l);\r\n                for (let e = 0; e < lane.length; e++) {\r\n\r\n                    // draw bar\r\n                    barHelper.ensureCapacity(1);\r\n                    const indexes = barHelper.fillEvent(l, e, 0, 0, viewport, 0, 0);\r\n                    const dashedIndexes = dashedHelper.fillEvent(l, e, 0, 0, viewport, 0);\r\n                    barHelper.paint(indexes.indexXys, indexes.indexRgbas, gl, viewport, indexes.indexRelativeXys, indexes.indexFillPattern);\r\n                    dashedHelper.paint(dashedIndexes.indexXys, dashedIndexes.indexRgbas, gl, viewport, dashedIndexes.indexLengthSoFar);\r\n\r\n                    // draw label\r\n                    labelHelper.textTextures.resetTouches();\r\n                    labelHelper.textureRenderer.begin(gl, viewport);\r\n                    labelHelper.paintEvent(l, e, gl, viewport);\r\n                    labelHelper.textureRenderer.end(gl);\r\n                    labelHelper.textTextures.retainTouched();\r\n\r\n                    // draw icon\r\n                    iconHelper.textureRenderer.begin(gl, viewport);\r\n                    iconHelper.paintEvent(l, e, gl, viewport);\r\n                    iconHelper.textureRenderer.end(gl);\r\n                }\r\n            }\r\n\r\n        };\r\n    };\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { OrderedStringSet, OrderedSet } from '../util/ordered_set';\r\nimport { Color, parseCssColor } from '../color';\r\nimport { Notification, Notification2 } from '../util/notification';\r\nimport { formatTime_ISO8601, order, hasval, parseTime_PMILLIS } from '../util/util';\r\nimport { indexOf } from '../util/sorted_arrays';\r\nimport { FillPattern } from './timeline_events_row';\r\nimport { Axis1D } from '../plot/axis';\r\nimport { Insets } from '../layout/inset_layout';\r\n\r\n\r\nexport interface TimelineCursor {\r\n    cursorGuid: string;\r\n    labeledTimeseriesGuids: string[];\r\n    lineColor: string;\r\n    textColor: string;\r\n    showVerticalLine: boolean;\r\n    showHorizontalLine: boolean;\r\n    showCursorText: boolean;\r\n}\r\n\r\n\r\n\r\nexport interface TimelineAnnotation {\r\n    annotationGuid: string;\r\n    // time (x axis position) of annotation\r\n    time_ISO8601?: string;\r\n    // y axis position of annotion\r\n    y?: number;\r\n    label: string;\r\n    styleGuid: string;\r\n    pickable?: boolean;\r\n}\r\n\r\n\r\nexport interface TimelineTimeseries {\r\n    timeseriesGuid: string;\r\n    // supported hints:\r\n    // lines, points, lines-and-points, bars, area\r\n    uiHint?: string;\r\n    // used for bars and area plots\r\n    // determines the y axis value that the bars/area originate from\r\n    baseline?: number;\r\n    lineColor?: string;\r\n    pointColor?: string;\r\n    lineThickness?: number;\r\n    pointSize?: number;\r\n    dash?: number;\r\n    fragmentGuids?: string[];\r\n}\r\n\r\n\r\nexport interface TimelineTimeseriesFragment {\r\n    fragmentGuid: string;\r\n    data?: number[];\r\n    times_ISO8601?: string[];\r\n\r\n    // undefined : user cannot adjust data points\r\n    // 'y'       : user can adjust y value of points, but not time value\r\n    // 'xy       : user can adjust both x (time) and y value of points\r\n    userEditMode?: string;\r\n}\r\n\r\nexport interface TimelineEvent {\r\n    eventGuid: string;\r\n    // the left side (earliest) time bound of the event box\r\n    start_ISO8601: string;\r\n    // the right side (latest) time bound of the event box\r\n    end_ISO8601: string;\r\n    // text to be displayed with the event\r\n    label: string;\r\n    // the minimum allowed value of start_ISO8601\r\n    startLimit_ISO8601?: string;\r\n    // the maximum allowed value of end_ISO8601\r\n    endLimit_ISO8601?: string;\r\n    // guid for icon shown to the left of the label text\r\n    labelIcon?: string;\r\n    // whether or not the event can be dragged / resized by user clicks\r\n    userEditable?: boolean;\r\n    // see timeline_event_style.ts (determines what icons the event displays)\r\n    styleGuid?: string;\r\n    // determines which events are drawn over others (higher numbers on top)\r\n    order?: number;\r\n    // distance between event box and top of timeline row\r\n    topMargin?: number;\r\n    // distance between event box and bottom of timeline row\r\n    bottomMargin?: number;\r\n    // text label color\r\n    fgColor?: string;\r\n    // event box color\r\n    bgColor?: string;\r\n    // event box secondary color used when displaying stiped background\r\n    bgSecondaryColor?: string;\r\n    // event box border color\r\n    borderColor?: string;\r\n    // secondary event box border color used when displaying stippled event borders\r\n    borderSecondaryColor?: string;\r\n    // portion at the top of the timeline row not considered by labelVAlign when placing text\r\n    labelTopMargin?: number;\r\n    // portion at the bottom of the timeline row not considered by labelVAlign when placing text\r\n    labelBottomMargin?: number;\r\n    // vertical alignment of label text (0 = bottom of row, 0.5 = middle of row, 1 = top of row)\r\n    labelVAlign?: number;\r\n    // relative position within the text label of the point considered the start of the label text (0 = bottom, 1 = top) this is the point positioned by labelVAlign\r\n    // if labelVPos is not set, it defaults to labelVAlign's value, which is usually what is intended anyway\r\n    labelVPos?: number;\r\n    // vertical alignment of label text (0=left side, 0.5 = middle of event, 1=right side)\r\n    labelHAlign?: number;\r\n    // relative position within the text label of the point considered the start of the label text (0 = left side, 1 = right side) this is the point positioned by labelHAlign\r\n    // if labelHPos is not set, it defaults to labelHAlign's value, which is usually what is intended anyway\r\n    labelHPos?: number;\r\n    // determines if the borders are dashed or not\r\n    isBorderDashed?: boolean;\r\n    // determines the fill pattern of the event ('solid', 'stripes')\r\n    fillPattern?: string;\r\n}\r\n\r\n\r\nexport interface TimelineRow {\r\n    rowGuid: string;\r\n    label: string;\r\n    truncate?: boolean;\r\n    hidden?: boolean;\r\n    rowHeight?: number;\r\n    yMin?: number;\r\n    yMax?: number;\r\n    uiHint?: string;\r\n    eventGuids?: string[];\r\n    timeseriesGuids?: string[];\r\n    annotationGuids?: string[];\r\n    cursorGuid?: string;\r\n    bgColor?: string;\r\n    fgLabelColor?: string;\r\n    bgLabelColor?: string;\r\n    labelFont?: string;\r\n    cursor?: string;\r\n    highlighted?: boolean;\r\n    highlightColor?: Color;\r\n    highlightWidth?: number;\r\n    highlightInsets?: Insets;\r\n}\r\n\r\n\r\nexport interface TimelineGroup {\r\n    groupGuid: string;\r\n    rollupGuid?: string;\r\n    label: string;\r\n    hidden?: boolean;\r\n    collapsed?: boolean;\r\n    highlighted?: boolean;\r\n    highlightColor?: Color;\r\n    highlightWidth?: number;\r\n    highlightInsets?: Insets;\r\n    dashPattern?: number;\r\n    dashLength?: number;\r\n    rowGuids: string[];\r\n    labelFont?: string;\r\n    cursor?: string;\r\n}\r\n\r\n\r\nexport interface TimelineRoot {\r\n    groupGuids: string[];\r\n    topPinnedRowGuids: string[];\r\n    bottomPinnedRowGuids: string[];\r\n    maximizedRowGuids: string[];\r\n}\r\n\r\n\r\nexport interface Timeline {\r\n    cursors: TimelineCursor[];\r\n    annotations: TimelineAnnotation[];\r\n    timeseriesFragments: TimelineTimeseriesFragment[];\r\n    timeseries: TimelineTimeseries[];\r\n    events: TimelineEvent[];\r\n    rows: TimelineRow[];\r\n    groups: TimelineGroup[];\r\n    root: TimelineRoot;\r\n}\r\n\r\n\r\n\r\nexport class TimelineCursorModel {\r\n    private _cursorGuid: string;\r\n    // guids of timeseries to display values for at the selected time\r\n    private _labeledTimeseriesGuids: OrderedStringSet;\r\n    private _lineColor: Color;\r\n    private _textColor: Color;\r\n    private _showCursorText: boolean;\r\n    private _showVerticalLine: boolean;\r\n    private _showHorizontalLine: boolean;\r\n    private _attrsChanged: Notification;\r\n\r\n    constructor(cursor: TimelineCursor) {\r\n        this._cursorGuid = cursor.cursorGuid;\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(cursor);\r\n    }\r\n\r\n    get labeledTimeseriesGuids(): OrderedStringSet {\r\n        return this._labeledTimeseriesGuids;\r\n    }\r\n\r\n    get cursorGuid(): string {\r\n        return this._cursorGuid;\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    get lineColor(): Color {\r\n        return this._lineColor;\r\n    }\r\n\r\n    get textColor(): Color {\r\n        return this._textColor;\r\n    }\r\n\r\n    get showVerticalLine(): boolean {\r\n        return this._showVerticalLine;\r\n    }\r\n\r\n    get showHorizontalLine(): boolean {\r\n        return this._showHorizontalLine;\r\n    }\r\n\r\n    get showCursorText(): boolean {\r\n        return this._showCursorText;\r\n    }\r\n\r\n    setAttrs(cursor: TimelineCursor) {\r\n        this._labeledTimeseriesGuids = new OrderedStringSet(cursor.labeledTimeseriesGuids || []);\r\n        this._lineColor = (hasval(cursor.lineColor) ? parseCssColor(cursor.lineColor) : null);\r\n        this._textColor = (hasval(cursor.textColor) ? parseCssColor(cursor.textColor) : null);\r\n        this._showVerticalLine = cursor.showVerticalLine;\r\n        this._showHorizontalLine = cursor.showHorizontalLine;\r\n        this._showCursorText = cursor.showCursorText;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    snapshot(): TimelineCursor {\r\n        return {\r\n            cursorGuid: this._cursorGuid,\r\n            labeledTimeseriesGuids: this._labeledTimeseriesGuids.toArray(),\r\n            lineColor: (hasval(this._lineColor) ? this._lineColor.cssString : null),\r\n            textColor: (hasval(this._textColor) ? this._textColor.cssString : null),\r\n            showVerticalLine: this._showVerticalLine,\r\n            showHorizontalLine: this._showHorizontalLine,\r\n            showCursorText: this._showCursorText\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineAnnotationModel {\r\n    private _annotationGuid: string;\r\n    private _attrsChanged: Notification;\r\n    private _time_PMILLIS: number;\r\n    private _y: number;\r\n    private _label: string;\r\n    private _styleGuid: string;\r\n    private _pickable: boolean;\r\n\r\n    constructor(annotation: TimelineAnnotation) {\r\n        this._annotationGuid = annotation.annotationGuid;\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(annotation);\r\n    }\r\n\r\n    get annotationGuid(): string {\r\n        return this._annotationGuid;\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setLocation(time_PMILLIS: number, y: number) {\r\n        if (time_PMILLIS !== this._time_PMILLIS || y !== this.y) {\r\n            this._y = y;\r\n            this._time_PMILLIS = time_PMILLIS;\r\n            this._attrsChanged.fire();\r\n\r\n        }\r\n    }\r\n\r\n    get time_PMILLIS(): number {\r\n        return this._time_PMILLIS;\r\n    }\r\n\r\n    set time_PMILLIS(time_PMILLIS: number) {\r\n        if (time_PMILLIS !== this._time_PMILLIS) {\r\n            this._time_PMILLIS = time_PMILLIS;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get y(): number {\r\n        return this._y;\r\n    }\r\n\r\n    set y(y: number) {\r\n        if (y !== this.y) {\r\n            this._y = y;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get label(): string {\r\n        return this._label;\r\n    }\r\n\r\n    set label(label: string) {\r\n        if (label !== this.label) {\r\n            this._label = label;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get styleGuid(): string {\r\n        return this._styleGuid;\r\n    }\r\n\r\n    set styleGuid(styleGuid: string) {\r\n        if (styleGuid !== this.styleGuid) {\r\n            this._styleGuid = styleGuid;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get pickable(): boolean {\r\n        return this._pickable;\r\n    }\r\n\r\n    set pickable(pickable: boolean) {\r\n        if (pickable !== this.pickable) {\r\n            this._pickable = pickable;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    setAttrs(annotation: TimelineAnnotation) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        this._time_PMILLIS = hasval(annotation.time_ISO8601) ? parseTime_PMILLIS(annotation.time_ISO8601) : undefined;\r\n        this._y = annotation.y;\r\n        this._label = annotation.label;\r\n        this._styleGuid = annotation.styleGuid;\r\n        this._pickable = hasval(annotation.pickable) ? annotation.pickable : true;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    snapshot(): TimelineAnnotation {\r\n        return {\r\n            annotationGuid: this._annotationGuid,\r\n            label: this._label,\r\n            styleGuid: this._styleGuid,\r\n            time_ISO8601: formatTime_ISO8601(this._time_PMILLIS),\r\n            y: this._y,\r\n            pickable: this._pickable,\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineTimeseriesModel {\r\n    private _timeseriesGuid: string;\r\n    private _attrsChanged: Notification;\r\n    private _uiHint: string;\r\n    private _baseline: number;\r\n    private _lineColor: Color;\r\n    private _pointColor: Color;\r\n    private _lineThickness: number;\r\n    private _pointSize: number;\r\n    private _dash: number;\r\n    private _fragmentGuids: OrderedStringSet;\r\n\r\n    constructor(timeseries: TimelineTimeseries) {\r\n        this._timeseriesGuid = timeseries.timeseriesGuid;\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(timeseries);\r\n        this._fragmentGuids = new OrderedStringSet(timeseries.fragmentGuids || []);\r\n    }\r\n\r\n    get timeseriesGuid(): string {\r\n        return this._timeseriesGuid;\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setAttrs(timeseries: TimelineTimeseries) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        this._uiHint = timeseries.uiHint;\r\n        this._baseline = timeseries.baseline;\r\n        this._lineColor = (hasval(timeseries.lineColor) ? parseCssColor(timeseries.lineColor) : null);\r\n        this._pointColor = (hasval(timeseries.pointColor) ? parseCssColor(timeseries.pointColor) : null);\r\n        this._lineThickness = timeseries.lineThickness;\r\n        this._pointSize = timeseries.pointSize;\r\n        this._dash = timeseries.dash;\r\n        this._fragmentGuids = new OrderedStringSet(timeseries.fragmentGuids || []);\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get baseline(): number {\r\n        return this._baseline;\r\n    }\r\n\r\n    set baseline(baseline: number) {\r\n        if (baseline !== this._baseline) {\r\n            this._baseline = baseline;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get lineColor(): Color {\r\n        return this._lineColor;\r\n    }\r\n\r\n    set lineColor(lineColor: Color) {\r\n        if (lineColor !== this._lineColor) {\r\n            this._lineColor = lineColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get pointColor(): Color {\r\n        return this._pointColor;\r\n    }\r\n\r\n    set pointColor(pointColor: Color) {\r\n        if (pointColor !== this._pointColor) {\r\n            this._pointColor = pointColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get lineThickness(): number {\r\n        return this._lineThickness;\r\n    }\r\n\r\n    set lineThickness(lineThickness: number) {\r\n        if (lineThickness !== this._lineThickness) {\r\n            this._lineThickness = lineThickness;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get pointSize(): number {\r\n        return this._pointSize;\r\n    }\r\n\r\n    set pointSize(pointSize: number) {\r\n        if (pointSize !== this._pointSize) {\r\n            this._pointSize = pointSize;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get dash(): number {\r\n        return this._dash;\r\n    }\r\n\r\n    set dash(dash: number) {\r\n        if (dash !== this._dash) {\r\n            this._dash = dash;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get uiHint(): string {\r\n        return this._uiHint;\r\n    }\r\n\r\n    set uiHint(uiHint: string) {\r\n        if (uiHint !== this._uiHint) {\r\n            this._uiHint = uiHint;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get fragmentGuids(): OrderedStringSet {\r\n        return this._fragmentGuids;\r\n    }\r\n\r\n    set fragmentGuids(fragmentGuids: OrderedStringSet) {\r\n        if (fragmentGuids !== this._fragmentGuids) {\r\n            this._fragmentGuids = fragmentGuids;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    snapshot(): TimelineTimeseries {\r\n        return {\r\n            timeseriesGuid: this._timeseriesGuid,\r\n            uiHint: this._uiHint,\r\n            baseline: this._baseline,\r\n            lineColor: (hasval(this._lineColor) ? this._lineColor.cssString : null),\r\n            pointColor: (hasval(this._pointColor) ? this._pointColor.cssString : null),\r\n            lineThickness: this._lineThickness,\r\n            pointSize: this._pointSize,\r\n            dash: this._dash,\r\n            fragmentGuids: this._fragmentGuids.toArray(),\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineTimeseriesFragmentModel {\r\n    private _fragmentGuid: string;\r\n    // notification provides the start and end indexes of the modified range\r\n    // start index is inclusive, end index is exclusive\r\n    private _dataChanged: Notification2<number, number>;\r\n    private _attrsChanged: Notification;\r\n    private _userEditMode: string;\r\n    private _data: number[];\r\n    private _times_PMILLIS: number[];\r\n\r\n    constructor(fragment: TimelineTimeseriesFragment) {\r\n        this._fragmentGuid = fragment.fragmentGuid;\r\n        this._attrsChanged = new Notification();\r\n        this._dataChanged = new Notification2<number, number>();\r\n        this.setAttrs(fragment);\r\n    }\r\n\r\n    get fragmentGuid(): string {\r\n        return this._fragmentGuid;\r\n    }\r\n\r\n    get dataChanged(): Notification2<number, number> {\r\n        return this._dataChanged;\r\n    }\r\n\r\n    setAttrs(fragment: TimelineTimeseriesFragment) {\r\n        this._userEditMode = fragment.userEditMode;\r\n        this._times_PMILLIS = hasval(fragment.times_ISO8601) ? fragment.times_ISO8601.map(parseTime_PMILLIS) : [];\r\n        this._data = hasval(fragment.data) ? fragment.data.slice() : [];\r\n        this._dataChanged.fire(0, this._data.length);\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get data(): number[] {\r\n        return this._data;\r\n    }\r\n\r\n    set data(data: number[]) {\r\n        if (data !== this._data) {\r\n            this._data = data;\r\n            this._dataChanged.fire(0, this._data.length);\r\n        }\r\n    }\r\n\r\n    get times_PMILLIS(): number[] {\r\n        return this._times_PMILLIS;\r\n    }\r\n\r\n    // Time should only be modified in a way which keeps the _times_PMILLIS\r\n    // array sorted. This is currently not enforced by the model.\r\n    set times_PMILLIS(times_PMILLIS: number[]) {\r\n        if (times_PMILLIS !== this._times_PMILLIS) {\r\n            this._times_PMILLIS = times_PMILLIS;\r\n            this._dataChanged.fire(0, this._data.length);\r\n        }\r\n    }\r\n\r\n    // Time should only be modified in a way which keeps the _times_PMILLIS\r\n    // array sorted. This is currently not enforced by the model.\r\n    setAllData(data: number[], times_PMILLIS: number[]) {\r\n        if (data !== this._data || times_PMILLIS !== this._times_PMILLIS) {\r\n            this._data = data;\r\n            this._times_PMILLIS = times_PMILLIS;\r\n            this._dataChanged.fire(0, this._data.length);\r\n        }\r\n    }\r\n\r\n    // Handles adjusting the _times_PMILLIS and _data arrays if the new time\r\n    // requires them to be rearranged to stay in time order. Returns the new\r\n    // index assigned to the data point.\r\n    setData(index: number, value: number, time?: number): number {\r\n        if (this._data[index] !== value || (hasval(time) && this._times_PMILLIS[index] !== time)) {\r\n            if (hasval(time)) {\r\n                // the new time value would maintain the sorted order of the array\r\n                if ((index === 0 || time > this._times_PMILLIS[index - 1]) &&\r\n                    (index === this._times_PMILLIS.length - 1 || time < this._times_PMILLIS[index + 1])) {\r\n                    this._times_PMILLIS[index] = time;\r\n                    this._data[index] = value;\r\n                    this._dataChanged.fire(index, index + 1);\r\n                }\r\n                else {\r\n                    // remove the current point at index\r\n                    this._times_PMILLIS.splice(index, 1);\r\n                    this._data.splice(index, 1);\r\n\r\n                    // find the index to reinsert new data at\r\n                    index = indexOf(this._times_PMILLIS, time);\r\n                    if (index < 0) {\r\n                        index = -index - 1;\r\n                    }\r\n\r\n                    this._times_PMILLIS.splice(index, 0, time);\r\n                    this._data.splice(index, 0, value);\r\n                    this._dataChanged.fire(index, index + 1);\r\n                }\r\n            }\r\n            else {\r\n                this._data[index] = value;\r\n                this._dataChanged.fire(index, index + 1);\r\n            }\r\n        }\r\n\r\n        return index;\r\n    }\r\n\r\n    get start_PMILLIS(): number {\r\n        return this._times_PMILLIS[0];\r\n    }\r\n\r\n    get end_PMILLIS(): number {\r\n        return this._times_PMILLIS.slice(-1)[0];\r\n    }\r\n\r\n    get userEditMode(): string {\r\n        return this._userEditMode;\r\n    }\r\n\r\n    set userEditMode(userEditMode: string) {\r\n        if (userEditMode !== this._userEditMode) {\r\n            this._userEditMode = userEditMode;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    snapshot(): TimelineTimeseriesFragment {\r\n        return {\r\n            userEditMode: this._userEditMode,\r\n            fragmentGuid: this._fragmentGuid,\r\n            data: this._data.slice(),\r\n            times_ISO8601: this._times_PMILLIS.map(formatTime_ISO8601)\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineEventModel {\r\n    private _eventGuid: string;\r\n    private _attrsChanged: Notification;\r\n    private _startLimit_PMILLIS: number;\r\n    private _endLimit_PMILLIS: number;\r\n    private _start_PMILLIS: number;\r\n    private _end_PMILLIS: number;\r\n    private _label: string;\r\n    private _labelIcon: string;\r\n    private _userEditable: boolean;\r\n    private _styleGuid: string;\r\n    private _order: number;\r\n    private _topMargin: number;\r\n    private _bottomMargin: number;\r\n    private _fgColor: Color;\r\n    private _bgColor: Color;\r\n    private _bgSecondaryColor: Color;\r\n    private _borderColor: Color;\r\n    private _borderSecondaryColor: Color;\r\n    private _labelTopMargin: number;\r\n    private _labelBottomMargin: number;\r\n    private _labelVAlign: number;\r\n    private _labelVPos: number;\r\n    private _labelHAlign: number;\r\n    private _labelHPos: number;\r\n    private _isBorderDashed: boolean;\r\n    private _fillPattern: FillPattern;\r\n\r\n    constructor(event: TimelineEvent) {\r\n        this._eventGuid = event.eventGuid;\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(event);\r\n    }\r\n\r\n    get eventGuid(): string {\r\n        return this._eventGuid;\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setAttrs(event: TimelineEvent) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        this._startLimit_PMILLIS = (hasval(event.startLimit_ISO8601) ? Math.trunc(parseTime_PMILLIS(event.startLimit_ISO8601)) : null);\r\n        this._endLimit_PMILLIS = (hasval(event.endLimit_ISO8601) ? Math.trunc(parseTime_PMILLIS(event.endLimit_ISO8601)) : null);\r\n        this._start_PMILLIS = Math.trunc(parseTime_PMILLIS(event.start_ISO8601));\r\n        this._end_PMILLIS = Math.trunc(parseTime_PMILLIS(event.end_ISO8601));\r\n        this._label = event.label;\r\n        this._labelIcon = event.labelIcon;\r\n        this._userEditable = (hasval(event.userEditable) ? event.userEditable : false);\r\n        this._styleGuid = event.styleGuid;\r\n        this._order = event.order;\r\n        this._topMargin = event.topMargin;\r\n        this._bottomMargin = event.bottomMargin;\r\n        this._fgColor = (hasval(event.fgColor) ? parseCssColor(event.fgColor) : null);\r\n        this._bgColor = (hasval(event.bgColor) ? parseCssColor(event.bgColor) : null);\r\n        this._bgSecondaryColor = (hasval(event.bgSecondaryColor) ? parseCssColor(event.bgSecondaryColor) : null);\r\n        this._borderColor = (hasval(event.borderColor) ? parseCssColor(event.borderColor) : null);\r\n        this._borderSecondaryColor = (hasval(event.borderSecondaryColor) ? parseCssColor(event.borderSecondaryColor) : null);\r\n        this._labelTopMargin = event.labelTopMargin;\r\n        this._labelBottomMargin = event.labelBottomMargin;\r\n        this._labelVAlign = event.labelVAlign;\r\n        this._labelVPos = event.labelVPos;\r\n        this._labelHAlign = event.labelHAlign;\r\n        this._labelHPos = event.labelHPos;\r\n        this._isBorderDashed = (hasval(event.isBorderDashed) ? event.isBorderDashed : false);\r\n        this._fillPattern = (hasval(event.fillPattern) ? FillPattern[event.fillPattern] : FillPattern.solid);\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    setInterval(start_PMILLIS: number, end_PMILLIS: number) {\r\n        if (start_PMILLIS !== this._start_PMILLIS || end_PMILLIS !== this._end_PMILLIS) {\r\n\r\n            const initial_start_PMILLIS = this._start_PMILLIS;\r\n            const initial_end_PMILLIS = this._end_PMILLIS;\r\n\r\n            const underStartLimit = hasval(this._startLimit_PMILLIS) && start_PMILLIS < this._startLimit_PMILLIS;\r\n            const overEndLimit = hasval(this._endLimit_PMILLIS) && end_PMILLIS > this._endLimit_PMILLIS;\r\n            const duration_PMILLIS = end_PMILLIS - start_PMILLIS;\r\n            const durationLimit_PMILLIS = this._endLimit_PMILLIS - this._startLimit_PMILLIS;\r\n\r\n            // If both limits are present and the event is larger than the total distance between them\r\n            // then shrink the event to fit between the limits.\r\n            if (hasval(this._startLimit_PMILLIS) && hasval(this._endLimit_PMILLIS) && durationLimit_PMILLIS < duration_PMILLIS) {\r\n                this._start_PMILLIS = Math.trunc(this._startLimit_PMILLIS);\r\n                this._end_PMILLIS = Math.trunc(this._endLimit_PMILLIS);\r\n            }\r\n            // Otherwise shift the event to comply with the limits without adjusting its total duration\r\n            else if (underStartLimit) {\r\n                this._start_PMILLIS = Math.trunc(this._startLimit_PMILLIS);\r\n                this._end_PMILLIS = Math.trunc(this._start_PMILLIS + duration_PMILLIS);\r\n            }\r\n            else if (overEndLimit) {\r\n                this._end_PMILLIS = Math.trunc(this._endLimit_PMILLIS);\r\n                this._start_PMILLIS = Math.trunc(this._end_PMILLIS - duration_PMILLIS);\r\n            }\r\n            else {\r\n                this._end_PMILLIS = Math.trunc(end_PMILLIS);\r\n                this._start_PMILLIS = Math.trunc(start_PMILLIS);\r\n            }\r\n\r\n            // its possible due to the limits that the values didn't actually change\r\n            // only fire attrsChanged if one of the values did actually change\r\n            if (initial_start_PMILLIS !== this._start_PMILLIS || initial_end_PMILLIS !== this._end_PMILLIS) {\r\n                this._attrsChanged.fire();\r\n            }\r\n        }\r\n    }\r\n\r\n    private limit_start_PMILLIS(start_PMILLIS: number) {\r\n        return hasval(this._startLimit_PMILLIS) ? Math.max(start_PMILLIS, this._startLimit_PMILLIS) : start_PMILLIS;\r\n    }\r\n\r\n    private limit_end_PMILLIS(end_PMILLIS: number) {\r\n        return hasval(this._endLimit_PMILLIS) ? Math.min(end_PMILLIS, this._endLimit_PMILLIS) : end_PMILLIS;\r\n    }\r\n\r\n    get start_PMILLIS(): number {\r\n        return this._start_PMILLIS;\r\n    }\r\n\r\n    set start_PMILLIS(start_PMILLIS: number) {\r\n        if (start_PMILLIS !== this._start_PMILLIS) {\r\n            this._start_PMILLIS = Math.trunc(this.limit_start_PMILLIS(start_PMILLIS));\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get end_PMILLIS(): number {\r\n        return this._end_PMILLIS;\r\n    }\r\n\r\n    set end_PMILLIS(end_PMILLIS: number) {\r\n        if (end_PMILLIS !== this._end_PMILLIS) {\r\n            this._end_PMILLIS = Math.trunc(this.limit_end_PMILLIS(end_PMILLIS));\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get startLimit_PMILLIS(): number {\r\n        return this._startLimit_PMILLIS;\r\n    }\r\n\r\n    set startLimit_PMILLIS(startLimit_PMILLIS: number) {\r\n        if (startLimit_PMILLIS !== this._startLimit_PMILLIS) {\r\n            this._startLimit_PMILLIS = Math.trunc(startLimit_PMILLIS);\r\n            this._start_PMILLIS = Math.trunc(this.limit_start_PMILLIS(this._start_PMILLIS));\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get endLimit_PMILLIS(): number {\r\n        return this._endLimit_PMILLIS;\r\n    }\r\n\r\n    set endLimit_PMILLIS(endLimit_PMILLIS: number) {\r\n        if (endLimit_PMILLIS !== this._endLimit_PMILLIS) {\r\n            this._endLimit_PMILLIS = Math.trunc(endLimit_PMILLIS);\r\n            this._end_PMILLIS = Math.trunc(this.limit_end_PMILLIS(this._end_PMILLIS));\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n\r\n    get label(): string {\r\n        return this._label;\r\n    }\r\n\r\n    set label(label: string) {\r\n        if (label !== this._label) {\r\n            this._label = label;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelIcon(): string {\r\n        return this._labelIcon;\r\n    }\r\n\r\n    set labelIcon(labelIcon: string) {\r\n        if (labelIcon !== this._labelIcon) {\r\n            this._labelIcon = labelIcon;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get userEditable(): boolean {\r\n        return this._userEditable;\r\n    }\r\n\r\n    set userEditable(userEditable: boolean) {\r\n        if (userEditable !== this._userEditable) {\r\n            this._userEditable = userEditable;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get styleGuid(): string {\r\n        return this._styleGuid;\r\n    }\r\n\r\n    set styleGuid(styleGuid: string) {\r\n        if (styleGuid !== this._styleGuid) {\r\n            this._styleGuid = styleGuid;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get order(): number {\r\n        return this._order;\r\n    }\r\n\r\n    set order(orderVal: number) {\r\n        if (orderVal !== this._order) {\r\n            this._order = orderVal;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get topMargin(): number {\r\n        return this._topMargin;\r\n    }\r\n\r\n    set topMargin(topMargin: number) {\r\n        if (topMargin !== this._topMargin) {\r\n            this._topMargin = topMargin;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get bottomMargin(): number {\r\n        return this._bottomMargin;\r\n    }\r\n\r\n    set bottomMargin(bottomMargin: number) {\r\n        if (bottomMargin !== this._bottomMargin) {\r\n            this._bottomMargin = bottomMargin;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get fgColor(): Color {\r\n        return this._fgColor;\r\n    }\r\n\r\n    set fgColor(fgColor: Color) {\r\n        if (fgColor !== this._fgColor) {\r\n            this._fgColor = fgColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get bgColor(): Color {\r\n        return this._bgColor;\r\n    }\r\n\r\n    set bgColor(bgColor: Color) {\r\n        if (bgColor !== this._bgColor) {\r\n            this._bgColor = bgColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get bgSecondaryColor(): Color {\r\n        return this._bgSecondaryColor;\r\n    }\r\n\r\n    set bgSecondaryColor(bgSecondaryColor: Color) {\r\n        if (bgSecondaryColor !== this._bgSecondaryColor) {\r\n            this._bgSecondaryColor = bgSecondaryColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get borderColor(): Color {\r\n        return this._borderColor;\r\n    }\r\n\r\n    set borderColor(borderColor: Color) {\r\n        if (borderColor !== this._borderColor) {\r\n            this._borderColor = borderColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get borderSecondaryColor(): Color {\r\n        return this._borderSecondaryColor;\r\n    }\r\n\r\n    set borderSecondaryColor(borderSecondaryColor: Color) {\r\n        if (borderSecondaryColor !== this._borderSecondaryColor) {\r\n            this._borderSecondaryColor = borderSecondaryColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelTopMargin(): number {\r\n        return this._labelTopMargin;\r\n    }\r\n\r\n    set labelTopMargin(labelTopMargin: number) {\r\n        if (labelTopMargin !== this._labelTopMargin) {\r\n            this._labelTopMargin = labelTopMargin;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelBottomMargin(): number {\r\n        return this._labelBottomMargin;\r\n    }\r\n\r\n    set labelBottomMargin(labelBottomMargin: number) {\r\n        if (labelBottomMargin !== this._labelBottomMargin) {\r\n            this._labelBottomMargin = labelBottomMargin;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelVAlign(): number {\r\n        return this._labelVAlign;\r\n    }\r\n\r\n    set labelVAlign(labelVAlign: number) {\r\n        if (labelVAlign !== this._labelVAlign) {\r\n            this._labelVAlign = labelVAlign;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelVPos(): number {\r\n        return this._labelVPos;\r\n    }\r\n\r\n    set labelVPos(labelVPos: number) {\r\n        if (labelVPos !== this._labelVPos) {\r\n            this._labelVPos = labelVPos;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelHAlign(): number {\r\n        return this._labelHAlign;\r\n    }\r\n\r\n    set labelHAlign(labelHAlign: number) {\r\n        if (labelHAlign !== this._labelHAlign) {\r\n            this._labelHAlign = labelHAlign;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelHPos(): number {\r\n        return this._labelHPos;\r\n    }\r\n\r\n    set labelHPos(labelHPos: number) {\r\n        if (labelHPos !== this._labelHPos) {\r\n            this._labelHPos = labelHPos;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get isBorderDashed(): boolean {\r\n        return this._isBorderDashed;\r\n    }\r\n\r\n    set isBorderDashed(isBorderDashed: boolean) {\r\n        if (isBorderDashed !== this._isBorderDashed) {\r\n            this._isBorderDashed = isBorderDashed;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get fillPattern(): FillPattern {\r\n        return this._fillPattern;\r\n    }\r\n\r\n    set fillPattern(fillPattern: FillPattern) {\r\n        if (fillPattern !== this._fillPattern) {\r\n            this._fillPattern = fillPattern;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    snapshot(): TimelineEvent {\r\n        return {\r\n            eventGuid: this._eventGuid,\r\n            startLimit_ISO8601: (hasval(this._startLimit_PMILLIS) ? formatTime_ISO8601(this._startLimit_PMILLIS) : null),\r\n            endLimit_ISO8601: (hasval(this._endLimit_PMILLIS) ? formatTime_ISO8601(this._endLimit_PMILLIS) : null),\r\n            start_ISO8601: formatTime_ISO8601(this._start_PMILLIS),\r\n            end_ISO8601: formatTime_ISO8601(this._end_PMILLIS),\r\n            label: this._label,\r\n            labelIcon: this._labelIcon,\r\n            userEditable: this._userEditable,\r\n            styleGuid: this._styleGuid,\r\n            order: this._order,\r\n            topMargin: this._topMargin,\r\n            bottomMargin: this._bottomMargin,\r\n            bgColor: (hasval(this._bgColor) ? this._bgColor.cssString : null),\r\n            bgSecondaryColor: (hasval(this._bgSecondaryColor) ? this._bgSecondaryColor.cssString : null),\r\n            fgColor: (hasval(this._fgColor) ? this._fgColor.cssString : null),\r\n            borderColor: (hasval(this._borderColor) ? this._borderColor.cssString : null),\r\n            borderSecondaryColor: (hasval(this._borderSecondaryColor) ? this.borderSecondaryColor.cssString : null),\r\n            labelTopMargin: this._labelTopMargin,\r\n            labelBottomMargin: this._labelBottomMargin,\r\n            labelVAlign: this._labelVAlign,\r\n            labelVPos: this._labelVPos,\r\n            labelHAlign: this._labelHAlign,\r\n            labelHPos: this._labelHPos,\r\n            isBorderDashed: this._isBorderDashed,\r\n            fillPattern: FillPattern[this._fillPattern]\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineRowModel {\r\n    private _rowGuid: string;\r\n    private _attrsChanged: Notification;\r\n    private _rowHeight: number;\r\n    private _hidden: boolean;\r\n    private _label: string;\r\n    private _truncate: boolean;\r\n    private _uiHint: string;\r\n    private _eventGuids: OrderedStringSet;\r\n    private _timeseriesGuids: OrderedStringSet;\r\n    private _annotationGuids: OrderedStringSet;\r\n    private _cursorGuid: string;\r\n    private _fgLabelColor: Color;\r\n    private _bgLabelColor: Color;\r\n    private _labelFont: string;\r\n    private _dataAxis: Axis1D;\r\n    private _bgColor: Color;\r\n    private _cursor: string;\r\n    private _highlighted: boolean;\r\n    private _highlightColor: Color;\r\n    private _highlightWidth: number;\r\n    private _highlightInsets: Insets;\r\n\r\n    constructor(row: TimelineRow) {\r\n        this._rowGuid = row.rowGuid;\r\n        this._attrsChanged = new Notification();\r\n\r\n        const min: number = hasval(row.yMin) ? row.yMin : 0;\r\n        const max: number = hasval(row.yMax) ? row.yMax : 1;\r\n        this._dataAxis = new Axis1D(min, max);\r\n\r\n        this.setAttrs(row);\r\n        this._eventGuids = new OrderedStringSet(row.eventGuids || []);\r\n        this._timeseriesGuids = new OrderedStringSet(row.timeseriesGuids || []);\r\n        this._annotationGuids = new OrderedStringSet(row.annotationGuids || []);\r\n    }\r\n\r\n    get rowGuid(): string {\r\n        return this._rowGuid;\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setAttrs(row: TimelineRow) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        this._label = row.label;\r\n        this._truncate = row.truncate;\r\n        this._uiHint = row.uiHint;\r\n        this._hidden = row.hidden;\r\n        this._rowHeight = row.rowHeight;\r\n        this._cursorGuid = row.cursorGuid;\r\n        this._bgColor = (hasval(row.bgColor) ? parseCssColor(row.bgColor) : null);\r\n        this._fgLabelColor = (hasval(row.fgLabelColor) ? parseCssColor(row.fgLabelColor) : null);\r\n        this._bgLabelColor = (hasval(row.bgLabelColor) ? parseCssColor(row.bgLabelColor) : null);\r\n        this._labelFont = row.labelFont;\r\n        this._cursor = row.cursor;\r\n        this._highlighted = hasval(row.highlighted) ? row.highlighted : false;\r\n        this._highlightColor = hasval(row.highlightColor) ? row.highlightColor : parseCssColor('white');\r\n        this._highlightWidth = row.highlightWidth;\r\n        this._highlightInsets = row.highlightInsets;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get cursorGuid(): string {\r\n        return this._cursorGuid;\r\n    }\r\n\r\n    set cursorGuid(cursorGuid: string) {\r\n        this._cursorGuid = cursorGuid;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get rowHeight(): number {\r\n        return this._rowHeight;\r\n    }\r\n\r\n    set rowHeight(rowHeight: number) {\r\n        this._rowHeight = rowHeight;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get hidden(): boolean {\r\n        return this._hidden;\r\n    }\r\n\r\n    set hidden(hidden: boolean) {\r\n        this._hidden = hidden;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get dataAxis(): Axis1D {\r\n        return this._dataAxis;\r\n    }\r\n\r\n    set dataAxis(dataAxis: Axis1D) {\r\n        this._dataAxis = dataAxis;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get label(): string {\r\n        return this._label;\r\n    }\r\n\r\n    set label(label: string) {\r\n        if (label !== this._label) {\r\n            this._label = label;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get truncate(): boolean {\r\n        return this._truncate;\r\n    }\r\n\r\n    set truncate(truncate: boolean) {\r\n        if (truncate !== this._truncate) {\r\n            this._truncate = truncate;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get uiHint(): string {\r\n        return this._uiHint;\r\n    }\r\n\r\n    set uiHint(uiHint: string) {\r\n        if (uiHint !== this._uiHint) {\r\n            this._uiHint = uiHint;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get bgColor(): Color {\r\n        return this._bgColor;\r\n    }\r\n\r\n    set bgColor(bgColor: Color) {\r\n        if (bgColor !== this._bgColor) {\r\n            this._bgColor = bgColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get bgLabelColor(): Color {\r\n        return this._bgLabelColor;\r\n    }\r\n\r\n    set bgLabelColor(bgLabelColor: Color) {\r\n        if (bgLabelColor !== this._bgLabelColor) {\r\n            this._bgLabelColor = bgLabelColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get fgLabelColor(): Color {\r\n        return this._fgLabelColor;\r\n    }\r\n\r\n    set fgLabelColor(fgLabelColor: Color) {\r\n        if (fgLabelColor !== this._fgLabelColor) {\r\n            this._fgLabelColor = fgLabelColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelFont(): string {\r\n        return this._labelFont;\r\n    }\r\n\r\n    set labelFont(labelFont: string) {\r\n        if (labelFont !== this._labelFont) {\r\n            this._labelFont = labelFont;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get cursor(): string {\r\n        return this._cursor;\r\n    }\r\n\r\n    set cursor(cursor: string) {\r\n        if (cursor !== this._cursor) {\r\n            this._cursor = cursor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlighted(): boolean {\r\n        return this._highlighted;\r\n    }\r\n\r\n    set highlighted(highlighted: boolean) {\r\n        if (highlighted !== this._highlighted) {\r\n            this._highlighted = highlighted;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightColor(): Color {\r\n        return this._highlightColor;\r\n    }\r\n\r\n    set highlightColor(highlightColor: Color) {\r\n        if (highlightColor !== this._highlightColor) {\r\n            this._highlightColor = highlightColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightWidth(): number {\r\n        return this._highlightWidth;\r\n    }\r\n\r\n    set highlightWidth(highlightWidth: number) {\r\n        if (highlightWidth !== this._highlightWidth) {\r\n            this._highlightWidth = highlightWidth;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightInsets(): Insets {\r\n        return this._highlightInsets;\r\n    }\r\n\r\n    set highlightInsets(highlightInsets: Insets) {\r\n        if (highlightInsets !== this._highlightInsets) {\r\n            this._highlightInsets = highlightInsets;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get eventGuids(): OrderedStringSet {\r\n        return this._eventGuids;\r\n    }\r\n\r\n    get timeseriesGuids(): OrderedStringSet {\r\n        return this._timeseriesGuids;\r\n    }\r\n\r\n    get annotationGuids(): OrderedStringSet {\r\n        return this._annotationGuids;\r\n    }\r\n\r\n    snapshot(): TimelineRow {\r\n        return {\r\n            rowGuid: this._rowGuid,\r\n            label: this._label,\r\n            truncate: this._truncate,\r\n            rowHeight: this._rowHeight,\r\n            hidden: this._hidden,\r\n            uiHint: this._uiHint,\r\n            eventGuids: this._eventGuids.toArray(),\r\n            timeseriesGuids: this._timeseriesGuids.toArray(),\r\n            annotationGuids: this._annotationGuids.toArray(),\r\n            cursorGuid: this._cursorGuid,\r\n            bgColor: (hasval(this._bgColor) ? this._bgColor.cssString : null),\r\n            bgLabelColor: (hasval(this._bgLabelColor) ? this._bgLabelColor.cssString : null),\r\n            fgLabelColor: (hasval(this._fgLabelColor) ? this._fgLabelColor.cssString : null),\r\n            labelFont: this._labelFont,\r\n            cursor: this._cursor,\r\n            highlighted: (hasval(this._highlighted) ? this._highlighted : false),\r\n            highlightColor: hasval(this.highlightColor) ? this.highlightColor : parseCssColor('white'),\r\n            highlightWidth: this._highlightWidth,\r\n            highlightInsets: this._highlightInsets\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineGroupModel {\r\n    private _groupGuid: string;\r\n    private _rollupGuid: string;\r\n    private _attrsChanged: Notification;\r\n    private _hidden: boolean;\r\n    private _label: string;\r\n    private _collapsed: boolean;\r\n    private _highlighted: boolean;\r\n    private _highlightColor: Color;\r\n    private _highlightWidth: number;\r\n    private _highlightInsets: Insets;\r\n    private _dashPattern: number;\r\n    private _dashLength: number;\r\n    private _labelFont: string;\r\n    private _rowGuids: OrderedStringSet;\r\n    private _cursor: string;\r\n\r\n    constructor(group: TimelineGroup) {\r\n        this._groupGuid = group.groupGuid;\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(group);\r\n        this._rowGuids = new OrderedStringSet(group.rowGuids);\r\n    }\r\n\r\n    get groupGuid(): string {\r\n        return this._groupGuid;\r\n    }\r\n\r\n    get rollupGuid(): string {\r\n        return this._rollupGuid;\r\n    }\r\n\r\n    set rollupGuid(rollupGuid: string) {\r\n        this._rollupGuid = rollupGuid;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setAttrs(group: TimelineGroup) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        this._rollupGuid = group.rollupGuid;\r\n        this._hidden = group.hidden;\r\n        this._label = group.label;\r\n        this._collapsed = group.collapsed;\r\n        this._highlighted = hasval(group.highlighted) ? group.highlighted : false;\r\n        this._highlightColor = hasval(group.highlightColor) ? group.highlightColor : parseCssColor('white');\r\n        this._dashPattern = hasval(group.dashPattern) ? group.dashPattern : 0xFFFF;\r\n        this._dashLength = hasval(group.dashLength) ? group.dashLength : 16;\r\n        this._highlightWidth = group.highlightWidth;\r\n        this._highlightInsets = group.highlightInsets;\r\n        this._labelFont = group.labelFont;\r\n        this._cursor = group.cursor;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get hidden(): boolean {\r\n        return this._hidden;\r\n    }\r\n\r\n    set hidden(hidden: boolean) {\r\n        this._hidden = hidden;\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get label(): string {\r\n        return this._label;\r\n    }\r\n\r\n    set label(label: string) {\r\n        if (label !== this._label) {\r\n            this._label = label;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get collapsed(): boolean {\r\n        return this._collapsed;\r\n    }\r\n\r\n    set collapsed(collapsed: boolean) {\r\n        if (collapsed !== this._collapsed) {\r\n            this._collapsed = collapsed;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlighted(): boolean {\r\n        return this._highlighted;\r\n    }\r\n\r\n    set highlighted(highlighted: boolean) {\r\n        if (highlighted !== this._highlighted) {\r\n            this._highlighted = highlighted;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightColor(): Color {\r\n        return this._highlightColor;\r\n    }\r\n\r\n    set highlightColor(highlightColor: Color) {\r\n        if (highlightColor !== this._highlightColor) {\r\n            this._highlightColor = highlightColor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightWidth(): number {\r\n        return this._highlightWidth;\r\n    }\r\n\r\n    set highlightWidth(highlightWidth: number) {\r\n        if (highlightWidth !== this._highlightWidth) {\r\n            this._highlightWidth = highlightWidth;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get highlightInsets(): Insets {\r\n        return this._highlightInsets;\r\n    }\r\n\r\n    set highlightInsets(highlightInsets: Insets) {\r\n        if (highlightInsets !== this._highlightInsets) {\r\n            this._highlightInsets = highlightInsets;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get dashPattern(): number {\r\n        return this._dashPattern;\r\n    }\r\n\r\n    set dashPattern(dashPattern: number) {\r\n        if (dashPattern !== this._dashPattern) {\r\n            this._dashPattern = dashPattern;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get dashLength(): number {\r\n        return this._dashLength;\r\n    }\r\n\r\n    set dashLength(dashLength: number) {\r\n        if (dashLength !== this._dashLength) {\r\n            this._dashLength = dashLength;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get labelFont(): string {\r\n        return this._labelFont;\r\n    }\r\n\r\n    set labelFont(labelFont: string) {\r\n        if (labelFont !== this._labelFont) {\r\n            this._labelFont = labelFont;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get cursor(): string {\r\n        return this._cursor;\r\n    }\r\n\r\n    set cursor(cursor: string) {\r\n        if (cursor !== this._cursor) {\r\n            this._cursor = cursor;\r\n            this._attrsChanged.fire();\r\n        }\r\n    }\r\n\r\n    get rowGuids(): OrderedStringSet {\r\n        return this._rowGuids;\r\n    }\r\n\r\n    snapshot(): TimelineGroup {\r\n        return {\r\n            groupGuid: this._groupGuid,\r\n            rollupGuid: this._rollupGuid,\r\n            label: this._label,\r\n            hidden: this._hidden,\r\n            collapsed: (hasval(this._collapsed) ? this._collapsed : false),\r\n            highlighted: (hasval(this._highlighted) ? this._highlighted : false),\r\n            highlightColor: hasval(this.highlightColor) ? this.highlightColor : parseCssColor('white'),\r\n            highlightWidth: this._highlightWidth,\r\n            highlightInsets: this._highlightInsets,\r\n            dashPattern: hasval(this.dashPattern) ? this.dashPattern : 0xFFFF,\r\n            dashLength: hasval(this.dashLength) ? this.dashLength : 16,\r\n            labelFont: this._labelFont,\r\n            cursor: this._cursor,\r\n            rowGuids: this._rowGuids.toArray()\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport class TimelineRootModel {\r\n    private _attrsChanged: Notification;\r\n    private _groupGuids: OrderedStringSet;\r\n    private _topPinnedRowGuids: OrderedStringSet;\r\n    private _bottomPinnedRowGuids: OrderedStringSet;\r\n    private _maximizedRowGuids: OrderedStringSet;\r\n\r\n    constructor(root: TimelineRoot) {\r\n        this._attrsChanged = new Notification();\r\n        this.setAttrs(root);\r\n        this._groupGuids = new OrderedStringSet(root.groupGuids);\r\n        this._topPinnedRowGuids = new OrderedStringSet(root.topPinnedRowGuids || []);\r\n        this._bottomPinnedRowGuids = new OrderedStringSet(root.bottomPinnedRowGuids || []);\r\n        this._maximizedRowGuids = new OrderedStringSet(root.maximizedRowGuids || []);\r\n    }\r\n\r\n    get attrsChanged(): Notification {\r\n        return this._attrsChanged;\r\n    }\r\n\r\n    setAttrs(root: TimelineRoot) {\r\n        // Don't both checking whether values are going to change -- it's not that important, and it would be obnoxious here\r\n        // No attrs yet\r\n        this._attrsChanged.fire();\r\n    }\r\n\r\n    get groupGuids(): OrderedStringSet {\r\n        return this._groupGuids;\r\n    }\r\n\r\n    get topPinnedRowGuids(): OrderedStringSet {\r\n        return this._topPinnedRowGuids;\r\n    }\r\n\r\n    get bottomPinnedRowGuids(): OrderedStringSet {\r\n        return this._bottomPinnedRowGuids;\r\n    }\r\n\r\n    get maximizedRowGuids(): OrderedStringSet {\r\n        return this._maximizedRowGuids;\r\n    }\r\n\r\n    snapshot(): TimelineRoot {\r\n        return {\r\n            groupGuids: this._groupGuids.toArray(),\r\n            topPinnedRowGuids: this._topPinnedRowGuids.toArray(),\r\n            bottomPinnedRowGuids: this._bottomPinnedRowGuids.toArray(),\r\n            maximizedRowGuids: this._maximizedRowGuids.toArray()\r\n        };\r\n    }\r\n}\r\n\r\n\r\nexport interface TimelineMergeStrategy {\r\n    updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor): void;\r\n    updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation): void;\r\n    updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment): void;\r\n    updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries): void;\r\n    updateEventModel(eventModel: TimelineEventModel, newEvent: TimelineEvent): void;\r\n    updateRowModel(rowModel: TimelineRowModel, newRow: TimelineRow): void;\r\n    updateGroupModel(groupModel: TimelineGroupModel, newGroup: TimelineGroup): void;\r\n    updateRootModel(rootModel: TimelineRootModel, newRoot: TimelineRoot): void;\r\n}\r\n\r\n\r\nexport class TimelineModel {\r\n    private _cursors: OrderedSet<TimelineCursorModel>;\r\n    private _annotations: OrderedSet<TimelineAnnotationModel>;\r\n    private _timeseriesFragments: OrderedSet<TimelineTimeseriesFragmentModel>;\r\n    private _timeseries: OrderedSet<TimelineTimeseriesModel>;\r\n    private _events: OrderedSet<TimelineEventModel>;\r\n    private _rows: OrderedSet<TimelineRowModel>;\r\n    private _groups: OrderedSet<TimelineGroupModel>;\r\n    private _root: TimelineRootModel;\r\n\r\n    constructor(timeline?: Timeline) {\r\n\r\n        const cursors = (hasval(timeline) && hasval(timeline.cursors) ? timeline.cursors : []);\r\n        this._cursors = new OrderedSet<TimelineCursorModel>([], (g) => g.cursorGuid);\r\n        for (let n = 0; n < cursors.length; n++) {\r\n            this._cursors.add(new TimelineCursorModel(cursors[n]));\r\n        }\r\n\r\n        const annotations = (hasval(timeline) && hasval(timeline.annotations) ? timeline.annotations : []);\r\n        this._annotations = new OrderedSet<TimelineAnnotationModel>([], (g) => g.annotationGuid);\r\n        for (let n = 0; n < annotations.length; n++) {\r\n            this._annotations.add(new TimelineAnnotationModel(annotations[n]));\r\n        }\r\n\r\n        const timeseriesFragments = (hasval(timeline) && hasval(timeline.timeseriesFragments) ? timeline.timeseriesFragments : []);\r\n        this._timeseriesFragments = new OrderedSet<TimelineTimeseriesFragmentModel>([], (e) => e.fragmentGuid);\r\n        for (let n = 0; n < timeseriesFragments.length; n++) {\r\n            this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(timeseriesFragments[n]));\r\n        }\r\n\r\n        const timeseries = (hasval(timeline) && hasval(timeline.timeseries) ? timeline.timeseries : []);\r\n        this._timeseries = new OrderedSet<TimelineTimeseriesModel>([], (e) => e.timeseriesGuid);\r\n        for (let n = 0; n < timeseries.length; n++) {\r\n            this._timeseries.add(new TimelineTimeseriesModel(timeseries[n]));\r\n        }\r\n\r\n        const events = (hasval(timeline) && hasval(timeline.events) ? timeline.events : []);\r\n        this._events = new OrderedSet<TimelineEventModel>([], (e) => e.eventGuid);\r\n        for (let n = 0; n < events.length; n++) {\r\n            this._events.add(new TimelineEventModel(events[n]));\r\n        }\r\n\r\n        const rows = (hasval(timeline) && hasval(timeline.rows) ? timeline.rows : []);\r\n        this._rows = new OrderedSet<TimelineRowModel>([], (r) => r.rowGuid);\r\n        for (let n = 0; n < rows.length; n++) {\r\n            this._rows.add(new TimelineRowModel(rows[n]));\r\n        }\r\n\r\n        const groups = (hasval(timeline) && hasval(timeline.groups) ? timeline.groups : []);\r\n        this._groups = new OrderedSet<TimelineGroupModel>([], (g) => g.groupGuid);\r\n        for (let n = 0; n < groups.length; n++) {\r\n            this._groups.add(new TimelineGroupModel(groups[n]));\r\n        }\r\n\r\n        const root = (hasval(timeline) && hasval(timeline.root) ? timeline.root : newEmptyTimelineRoot());\r\n        this._root = new TimelineRootModel(root);\r\n    }\r\n\r\n    get cursors(): OrderedSet<TimelineCursorModel> { return this._cursors; }\r\n    get annotations(): OrderedSet<TimelineAnnotationModel> { return this._annotations; }\r\n    get timeseriesFragments(): OrderedSet<TimelineTimeseriesFragmentModel> { return this._timeseriesFragments; }\r\n    get timeseriesSets(): OrderedSet<TimelineTimeseriesModel> { return this._timeseries; }\r\n    get events(): OrderedSet<TimelineEventModel> { return this._events; }\r\n    get rows(): OrderedSet<TimelineRowModel> { return this._rows; }\r\n    get groups(): OrderedSet<TimelineGroupModel> { return this._groups; }\r\n    get root(): TimelineRootModel { return this._root; }\r\n\r\n    cursor(cursorGuid: string): TimelineCursorModel { return this._cursors.valueFor(cursorGuid); }\r\n    annotation(annotationGuid: string): TimelineAnnotationModel { return this._annotations.valueFor(annotationGuid); }\r\n    timeseriesFragment(fragmentGuid: string): TimelineTimeseriesFragmentModel { return this._timeseriesFragments.valueFor(fragmentGuid); }\r\n    timeseries(timeseriesGuid: string): TimelineTimeseriesModel { return this._timeseries.valueFor(timeseriesGuid); }\r\n    event(eventGuid: string): TimelineEventModel { return this._events.valueFor(eventGuid); }\r\n    row(rowGuid: string): TimelineRowModel { return this._rows.valueFor(rowGuid); }\r\n    group(groupGuid: string): TimelineGroupModel { return this._groups.valueFor(groupGuid); }\r\n\r\n\r\n    replace(newTimeline: Timeline) {\r\n\r\n        // Purge removed items\r\n        //\r\n\r\n        const freshRoot = newTimeline.root;\r\n        this._root.groupGuids.retainValues(freshRoot.groupGuids);\r\n        this._root.topPinnedRowGuids.retainValues(freshRoot.topPinnedRowGuids);\r\n        this._root.bottomPinnedRowGuids.retainValues(freshRoot.bottomPinnedRowGuids);\r\n        this._root.maximizedRowGuids.retainValues(freshRoot.maximizedRowGuids);\r\n\r\n        const freshGroups = newTimeline.groups;\r\n        const retainedGroupGuids: string[] = [];\r\n        for (let n = 0; n < freshGroups.length; n++) {\r\n            const freshGroup = freshGroups[n];\r\n            const groupGuid = freshGroup.groupGuid;\r\n            const oldGroup = this._groups.valueFor(groupGuid);\r\n            if (hasval(oldGroup)) {\r\n                oldGroup.rowGuids.retainValues(freshGroup.rowGuids);\r\n                retainedGroupGuids.push(groupGuid);\r\n            }\r\n        }\r\n        this._groups.retainIds(retainedGroupGuids);\r\n\r\n        const freshRows = newTimeline.rows;\r\n        const retainedRowGuids: string[] = [];\r\n        for (let n = 0; n < freshRows.length; n++) {\r\n            const freshRow = freshRows[n];\r\n            const rowGuid = freshRow.rowGuid;\r\n            const oldRow = this._rows.valueFor(rowGuid);\r\n            if (hasval(oldRow)) {\r\n                oldRow.eventGuids.retainValues(freshRow.eventGuids || []);\r\n                retainedRowGuids.push(rowGuid);\r\n            }\r\n        }\r\n        this._rows.retainIds(retainedRowGuids);\r\n\r\n        const freshEvents = newTimeline.events;\r\n        const retainedEventGuids: string[] = [];\r\n        for (let n = 0; n < freshEvents.length; n++) {\r\n            const freshEvent = freshEvents[n];\r\n            const eventGuid = freshEvent.eventGuid;\r\n            const oldEvent = this._events.valueFor(eventGuid);\r\n            if (hasval(oldEvent)) {\r\n                retainedEventGuids.push(eventGuid);\r\n            }\r\n        }\r\n        this._events.retainIds(retainedEventGuids);\r\n\r\n        const freshTimeseriesSet = newTimeline.timeseries;\r\n        const retainedTimeseriesGuids: string[] = [];\r\n        for (let n = 0; n < freshTimeseriesSet.length; n++) {\r\n            const freshTimeseries = freshTimeseriesSet[n];\r\n            const timeseriesGuid = freshTimeseries.timeseriesGuid;\r\n            const oldTimeseries = this._timeseries.valueFor(timeseriesGuid);\r\n            if (hasval(oldTimeseries)) {\r\n                retainedTimeseriesGuids.push(timeseriesGuid);\r\n            }\r\n        }\r\n        this._timeseries.retainIds(retainedTimeseriesGuids);\r\n\r\n        const freshTimeseriesFragments = newTimeline.timeseriesFragments;\r\n        const retainedTimeseriesFragmentGuids: string[] = [];\r\n        for (let n = 0; n < freshTimeseriesFragments.length; n++) {\r\n            const freshTimeseriesFragment = freshTimeseriesFragments[n];\r\n            const fragmentGuid = freshTimeseriesFragment.fragmentGuid;\r\n            const oldTimeseriesFragment = this._timeseriesFragments.valueFor(fragmentGuid);\r\n            if (hasval(oldTimeseriesFragment)) {\r\n                retainedTimeseriesFragmentGuids.push(fragmentGuid);\r\n            }\r\n        }\r\n        this._timeseriesFragments.retainIds(retainedTimeseriesFragmentGuids);\r\n\r\n        const freshAnnotations = newTimeline.annotations;\r\n        const retainedAnnotationGuids: string[] = [];\r\n        for (let n = 0; n < freshAnnotations.length; n++) {\r\n            const freshAnnotation = freshAnnotations[n];\r\n            const annotationGuid = freshAnnotation.annotationGuid;\r\n            const oldAnnotation = this._annotations.valueFor(annotationGuid);\r\n            if (hasval(oldAnnotation)) {\r\n                retainedAnnotationGuids.push(annotationGuid);\r\n            }\r\n        }\r\n        this._annotations.retainIds(retainedAnnotationGuids);\r\n\r\n        const freshCursors = newTimeline.cursors;\r\n        const retainedCursorGuids: string[] = [];\r\n        for (let n = 0; n < freshCursors.length; n++) {\r\n            const freshCursor = freshCursors[n];\r\n            const cursorGuid = freshCursor.cursorGuid;\r\n            const oldCursor = this._cursors.valueFor(cursorGuid);\r\n            if (hasval(oldCursor)) {\r\n                retainedCursorGuids.push(cursorGuid);\r\n            }\r\n        }\r\n        this._cursors.retainIds(retainedCursorGuids);\r\n\r\n        // Add new items\r\n        //\r\n\r\n        for (let n = 0; n < freshCursors.length; n++) {\r\n            const freshCursor = freshCursors[n];\r\n            const oldCursor = this._cursors.valueFor(freshCursor.cursorGuid);\r\n            if (hasval(oldCursor)) {\r\n                oldCursor.setAttrs(freshCursor);\r\n            }\r\n            else {\r\n                this._cursors.add(new TimelineCursorModel(freshCursor));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshAnnotations.length; n++) {\r\n            const freshAnnotation = freshAnnotations[n];\r\n            const oldAnnotation = this._annotations.valueFor(freshAnnotation.annotationGuid);\r\n            if (hasval(oldAnnotation)) {\r\n                oldAnnotation.setAttrs(freshAnnotation);\r\n            }\r\n            else {\r\n                this._annotations.add(new TimelineAnnotationModel(freshAnnotation));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshTimeseriesFragments.length; n++) {\r\n            const freshTimeseriesFragment = freshTimeseriesFragments[n];\r\n            const oldTimeseriesFragment = this._timeseriesFragments.valueFor(freshTimeseriesFragment.fragmentGuid);\r\n            if (hasval(oldTimeseriesFragment)) {\r\n                oldTimeseriesFragment.setAttrs(freshTimeseriesFragment);\r\n            }\r\n            else {\r\n                this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(freshTimeseriesFragment));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshTimeseriesSet.length; n++) {\r\n            const freshTimeseries = freshTimeseriesSet[n];\r\n            const oldTimeseries = this._timeseries.valueFor(freshTimeseries.timeseriesGuid);\r\n            if (hasval(oldTimeseries)) {\r\n                oldTimeseries.setAttrs(freshTimeseries);\r\n            }\r\n            else {\r\n                this._timeseries.add(new TimelineTimeseriesModel(freshTimeseries));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshEvents.length; n++) {\r\n            const freshEvent = freshEvents[n];\r\n            const oldEvent = this._events.valueFor(freshEvent.eventGuid);\r\n            if (hasval(oldEvent)) {\r\n                oldEvent.setAttrs(freshEvent);\r\n            }\r\n            else {\r\n                this._events.add(new TimelineEventModel(freshEvent));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshRows.length; n++) {\r\n            const freshRow = freshRows[n];\r\n            const oldRow = this._rows.valueFor(freshRow.rowGuid);\r\n            if (hasval(oldRow)) {\r\n                oldRow.setAttrs(freshRow);\r\n                oldRow.eventGuids.addAll((freshRow.eventGuids || []), 0, true);\r\n            }\r\n            else {\r\n                this._rows.add(new TimelineRowModel(freshRow));\r\n            }\r\n        }\r\n\r\n        for (let n = 0; n < freshGroups.length; n++) {\r\n            const freshGroup = freshGroups[n];\r\n            const oldGroup = this._groups.valueFor(freshGroup.groupGuid);\r\n            if (hasval(oldGroup)) {\r\n                oldGroup.setAttrs(freshGroup);\r\n                oldGroup.rowGuids.addAll(freshGroup.rowGuids, 0, true);\r\n            }\r\n            else {\r\n                this._groups.add(new TimelineGroupModel(freshGroup));\r\n            }\r\n        }\r\n\r\n        this._root.groupGuids.addAll(freshRoot.groupGuids, 0, true);\r\n        this._root.topPinnedRowGuids.addAll(freshRoot.topPinnedRowGuids, 0, true);\r\n        this._root.bottomPinnedRowGuids.addAll(freshRoot.bottomPinnedRowGuids, 0, true);\r\n        this._root.maximizedRowGuids.addAll(freshRoot.maximizedRowGuids, 0, true);\r\n    }\r\n\r\n\r\n    merge(newData: Timeline, strategy: TimelineMergeStrategy) {\r\n\r\n        const newCursors = hasval(newData.cursors) ? newData.cursors : [];\r\n        for (let n = 0; n < newCursors.length; n++) {\r\n            const newCursor = newCursors[n];\r\n            const cursorModel = this._cursors.valueFor(newCursor.cursorGuid);\r\n            if (hasval(cursorModel)) {\r\n                strategy.updateCursorModel(cursorModel, newCursor);\r\n            }\r\n            else {\r\n                this._cursors.add(new TimelineCursorModel(newCursor));\r\n            }\r\n        }\r\n\r\n        const newAnnotations = hasval(newData.annotations) ? newData.annotations : [];\r\n        for (let n = 0; n < newAnnotations.length; n++) {\r\n            const newAnnotation = newAnnotations[n];\r\n            const annotationModel = this._annotations.valueFor(newAnnotation.annotationGuid);\r\n            if (hasval(annotationModel)) {\r\n                strategy.updateAnnotationModel(annotationModel, newAnnotation);\r\n            }\r\n            else {\r\n                this._annotations.add(new TimelineAnnotationModel(newAnnotation));\r\n            }\r\n        }\r\n\r\n        const newTimeseriesFragments = hasval(newData.timeseriesFragments) ? newData.timeseriesFragments : [];\r\n        for (let n = 0; n < newTimeseriesFragments.length; n++) {\r\n            const newTimeseriesFragment = newTimeseriesFragments[n];\r\n            const timeseriesFragmentModel = this._timeseriesFragments.valueFor(newTimeseriesFragment.fragmentGuid);\r\n            if (hasval(timeseriesFragmentModel)) {\r\n                strategy.updateTimeseriesFragmentModel(timeseriesFragmentModel, newTimeseriesFragment);\r\n            }\r\n            else {\r\n                this._timeseriesFragments.add(new TimelineTimeseriesFragmentModel(newTimeseriesFragment));\r\n            }\r\n        }\r\n\r\n        const newTimeseriesSet = hasval(newData.timeseries) ? newData.timeseries : [];\r\n        for (let n = 0; n < newTimeseriesSet.length; n++) {\r\n            const newTimeseries = newTimeseriesSet[n];\r\n            const timeseriesModel = this._timeseries.valueFor(newTimeseries.timeseriesGuid);\r\n            if (hasval(timeseriesModel)) {\r\n                strategy.updateTimeseriesModel(timeseriesModel, newTimeseries);\r\n            }\r\n            else {\r\n                this._timeseries.add(new TimelineTimeseriesModel(newTimeseries));\r\n            }\r\n        }\r\n\r\n        const newEvents = hasval(newData.events) ? newData.events : [];\r\n        for (let n = 0; n < newEvents.length; n++) {\r\n            const newEvent = newEvents[n];\r\n            const eventModel = this._events.valueFor(newEvent.eventGuid);\r\n            if (hasval(eventModel)) {\r\n                strategy.updateEventModel(eventModel, newEvent);\r\n            }\r\n            else {\r\n                this._events.add(new TimelineEventModel(newEvent));\r\n            }\r\n        }\r\n\r\n        const newRows = hasval(newData.rows) ? newData.rows : [];\r\n        for (let n = 0; n < newRows.length; n++) {\r\n            const newRow = newRows[n];\r\n            const rowModel = this._rows.valueFor(newRow.rowGuid);\r\n            if (hasval(rowModel)) {\r\n                strategy.updateRowModel(rowModel, newRow);\r\n            }\r\n            else {\r\n                this._rows.add(new TimelineRowModel(newRow));\r\n            }\r\n        }\r\n\r\n        const newGroups = hasval(newData.groups) ? newData.groups : [];\r\n        for (let n = 0; n < newGroups.length; n++) {\r\n            const newGroup = newGroups[n];\r\n            const groupModel = this._groups.valueFor(newGroup.groupGuid);\r\n            if (hasval(groupModel)) {\r\n                strategy.updateGroupModel(groupModel, newGroup);\r\n            }\r\n            else {\r\n                this._groups.add(new TimelineGroupModel(newGroup));\r\n            }\r\n        }\r\n\r\n        const newRoot = newData.root;\r\n        strategy.updateRootModel(this._root, newRoot);\r\n    }\r\n\r\n    snapshot(): Timeline {\r\n        return {\r\n            cursors: this._cursors.map((e) => e.snapshot()),\r\n            annotations: this._annotations.map((e) => e.snapshot()),\r\n            timeseriesFragments: this._timeseriesFragments.map((e) => e.snapshot()),\r\n            timeseries: this._timeseries.map((e) => e.snapshot()),\r\n            events: this._events.map((e) => e.snapshot()),\r\n            rows: this._rows.map((r) => r.snapshot()),\r\n            groups: this._groups.map((g) => g.snapshot()),\r\n            root: this._root.snapshot()\r\n        };\r\n    }\r\n\r\n\r\n}\r\n\r\n\r\nexport function newEmptyTimelineRoot(): TimelineRoot {\r\n    return {\r\n        groupGuids: [],\r\n        bottomPinnedRowGuids: [],\r\n        topPinnedRowGuids: [],\r\n        maximizedRowGuids: []\r\n    };\r\n}\r\n\r\n\r\nexport let timelineMergeNewBeforeOld: TimelineMergeStrategy = {\r\n\r\n    updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor) {\r\n        cursorModel.setAttrs(newCursor);\r\n    },\r\n\r\n    updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation) {\r\n        annotationModel.setAttrs(newAnnotation);\r\n    },\r\n\r\n    updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment) {\r\n        timeseriesFragmentModel.setAttrs(newTimeseriesFragment);\r\n    },\r\n\r\n    updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries) {\r\n        timeseriesModel.setAttrs(newTimeseries);\r\n        timeseriesModel.fragmentGuids.addAll((newTimeseries.fragmentGuids || []), 0, true);\r\n    },\r\n\r\n    updateEventModel: function (eventModel: TimelineEventModel, newEvent: TimelineEvent) {\r\n        eventModel.setAttrs(newEvent);\r\n    },\r\n\r\n    updateRowModel: function (rowModel: TimelineRowModel, newRow: TimelineRow) {\r\n        rowModel.setAttrs(newRow);\r\n        rowModel.eventGuids.addAll((newRow.eventGuids || []), 0, true);\r\n    },\r\n\r\n    updateGroupModel: function (groupModel: TimelineGroupModel, newGroup: TimelineGroup) {\r\n        groupModel.setAttrs(newGroup);\r\n        groupModel.rowGuids.addAll(newGroup.rowGuids, 0, true);\r\n    },\r\n\r\n    updateRootModel: function (rootModel: TimelineRootModel, newRoot: TimelineRoot) {\r\n        rootModel.setAttrs(newRoot);\r\n        rootModel.groupGuids.addAll(newRoot.groupGuids, 0, true);\r\n        rootModel.topPinnedRowGuids.addAll(newRoot.topPinnedRowGuids || [], 0, true);\r\n        rootModel.bottomPinnedRowGuids.addAll(newRoot.bottomPinnedRowGuids || [], 0, true);\r\n        rootModel.maximizedRowGuids.addAll(newRoot.maximizedRowGuids || [], 0, true);\r\n    }\r\n};\r\n\r\n\r\nexport let timelineMergeNewAfterOld: TimelineMergeStrategy = {\r\n\r\n    updateCursorModel(cursorModel: TimelineCursorModel, newCursor: TimelineCursor) {\r\n        cursorModel.setAttrs(newCursor);\r\n    },\r\n\r\n    updateAnnotationModel(annotationModel: TimelineAnnotationModel, newAnnotation: TimelineAnnotation) {\r\n        annotationModel.setAttrs(newAnnotation);\r\n    },\r\n\r\n    updateTimeseriesFragmentModel(timeseriesFragmentModel: TimelineTimeseriesFragmentModel, newTimeseriesFragment: TimelineTimeseriesFragment) {\r\n        timeseriesFragmentModel.setAttrs(newTimeseriesFragment);\r\n    },\r\n\r\n    updateTimeseriesModel(timeseriesModel: TimelineTimeseriesModel, newTimeseries: TimelineTimeseries) {\r\n        timeseriesModel.setAttrs(newTimeseries);\r\n        timeseriesModel.fragmentGuids.addAll(newTimeseries.fragmentGuids || []);\r\n    },\r\n\r\n    updateEventModel: function (eventModel: TimelineEventModel, newEvent: TimelineEvent) {\r\n        eventModel.setAttrs(newEvent);\r\n    },\r\n\r\n    updateRowModel: function (rowModel: TimelineRowModel, newRow: TimelineRow) {\r\n        rowModel.setAttrs(newRow);\r\n        rowModel.eventGuids.addAll(newRow.eventGuids || []);\r\n        rowModel.timeseriesGuids.addAll(newRow.timeseriesGuids || []);\r\n        rowModel.annotationGuids.addAll(newRow.annotationGuids || []);\r\n    },\r\n\r\n    updateGroupModel: function (groupModel: TimelineGroupModel, newGroup: TimelineGroup) {\r\n        groupModel.setAttrs(newGroup);\r\n        groupModel.rowGuids.addAll(newGroup.rowGuids);\r\n    },\r\n\r\n    updateRootModel: function (rootModel: TimelineRootModel, newRoot: TimelineRoot) {\r\n        rootModel.setAttrs(newRoot);\r\n        rootModel.groupGuids.addAll(newRoot.groupGuids);\r\n        rootModel.topPinnedRowGuids.addAll(newRoot.topPinnedRowGuids || []);\r\n        rootModel.bottomPinnedRowGuids.addAll(newRoot.bottomPinnedRowGuids || []);\r\n        rootModel.maximizedRowGuids.addAll(newRoot.maximizedRowGuids || []);\r\n    }\r\n};\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Layout, LayoutEntry } from '../core';\r\nimport { Size, BoundsUnmodifiable } from '../bounds';\r\nimport { Side } from '../misc';\r\nimport { hasval } from '../util/util';\r\n\r\nexport function newTimelineLayout(axisHeight: number): Layout {\r\n\r\n    return <Layout>{\r\n\r\n        updatePrefSize: <Layout>function (parentPrefSize: Size, children: LayoutEntry[]) {\r\n            let topAxis: LayoutEntry = null;\r\n            let bottomAxis: LayoutEntry = null;\r\n            let center: LayoutEntry = null;\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                switch (child.layoutArg) {\r\n                    case Side.TOP:\r\n                        if (hasval(topAxis)) {\r\n                            throw new Error('Timeline-layout can have at most one top-axis pane');\r\n                        }\r\n                        topAxis = child;\r\n                        break;\r\n\r\n                    case Side.BOTTOM:\r\n                        if (hasval(bottomAxis)) {\r\n                            throw new Error('Timeline-layout can have at most one bottom-axis pane');\r\n                        }\r\n                        bottomAxis = child;\r\n                        break;\r\n\r\n                    default:\r\n                        if (hasval(center)) {\r\n                            throw new Error('Timeline-layout can have at most one center pane');\r\n                        }\r\n                        center = child;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            let hSum = 0;\r\n\r\n            if (hasval(topAxis)) {\r\n                hSum += axisHeight;\r\n            }\r\n\r\n            if (hasval(bottomAxis)) {\r\n                hSum += axisHeight;\r\n            }\r\n\r\n            if (hasval(center)) {\r\n                if (hasval(center.prefSize.h)) {\r\n                    hSum += center.prefSize.h;\r\n                }\r\n                else {\r\n                    hSum = null;\r\n                }\r\n            }\r\n\r\n            parentPrefSize.w = null;\r\n            parentPrefSize.h = hSum;\r\n        },\r\n\r\n        updateChildViewports: function (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) {\r\n            let topAxis: LayoutEntry = null;\r\n            let bottomAxis: LayoutEntry = null;\r\n            let center: LayoutEntry = null;\r\n            for (let c = 0; c < children.length; c++) {\r\n                const child = children[c];\r\n                switch (child.layoutArg) {\r\n                    case Side.TOP:\r\n                        if (hasval(topAxis)) {\r\n                            throw new Error('Timeline-layout can have at most one top-axis pane');\r\n                        }\r\n                        topAxis = child;\r\n                        break;\r\n\r\n                    case Side.BOTTOM:\r\n                        if (hasval(bottomAxis)) {\r\n                            throw new Error('Timeline-layout can have at most one bottom-axis pane');\r\n                        }\r\n                        bottomAxis = child;\r\n                        break;\r\n\r\n                    default:\r\n                        if (hasval(center)) {\r\n                            throw new Error('Timeline-layout can have at most one center pane');\r\n                        }\r\n                        center = child;\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if (hasval(topAxis)) {\r\n                topAxis.viewport.setRect(parentViewport.i, parentViewport.jEnd - axisHeight, parentViewport.w, axisHeight);\r\n            }\r\n\r\n            if (hasval(bottomAxis)) {\r\n                const jBottomMax = (hasval(topAxis) ? topAxis.viewport.j : parentViewport.jEnd) - axisHeight;\r\n                bottomAxis.viewport.setRect(parentViewport.i, Math.min(jBottomMax, parentViewport.j), parentViewport.w, axisHeight);\r\n            }\r\n\r\n            if (hasval(center)) {\r\n                const jCenterEnd = (hasval(topAxis) ? topAxis.viewport.jStart : parentViewport.jEnd);\r\n                const jCenterStart = (hasval(bottomAxis) ? bottomAxis.viewport.jEnd : parentViewport.jStart);\r\n                center.viewport.setEdges(parentViewport.iStart, parentViewport.iEnd, jCenterStart, jCenterEnd);\r\n            }\r\n        }\r\n\r\n    };\r\n}\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, white } from '../color';\r\nimport { TimelineTimeseriesPainterFactory, TimelineTimeseriesPainterOptions } from './timeline_timeseries_row';\r\nimport { Drawable, Painter } from '../core';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { Axis1D } from '../plot/axis';\r\nimport { TimelineModel, TimelineRowModel, TimelineTimeseriesFragmentModel } from './timeline_model';\r\nimport { TimelineUi } from './timeline_ui';\r\nimport { Program, UniformColor, Attribute } from '../shader';\r\nimport { xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys } from '../misc';\r\nimport { ensureCapacityFloat32, GL, hasval } from '../util/util';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { newTextTextureCache2 } from '../text';\r\nimport { TextureRenderer } from '../texture';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { indexAtOrBefore, indexAtOrAfter } from '../util/sorted_arrays';\r\n\r\nexport interface TimeseriesCursorPainterOptions {\r\n    font?: string;\r\n    textColor?: Color;\r\n    // number of pixels between box and label text\r\n    buffer_px?: number;\r\n    // number of significant digits in text labels\r\n    textDecimals?: number;\r\n\r\n    // color of selection box and crosshair lines\r\n    lineColor?: Color;\r\n\r\n    // thickness of cursor crosshair lines in pixels\r\n    crosshairThickness_px?: number;\r\n\r\n    // width/height of selection box (shown at intersection beween crosshairs and timeseries) in pixels\r\n    boxSize_px?: number;\r\n    // thickness of selection box lines in pixels\r\n    boxThickness_px?: number;\r\n}\r\n\r\nexport function newTimeseriesCursorPainterFactory(cursorOptions?: TimeseriesCursorPainterOptions): TimelineTimeseriesPainterFactory {\r\n\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions): Painter {\r\n\r\n        let textColor = (hasval(cursorOptions) && hasval(cursorOptions.textColor) ? cursorOptions.textColor : white);\r\n        let lineColor = (hasval(cursorOptions) && hasval(cursorOptions.lineColor) ? cursorOptions.lineColor : white);\r\n        const font = (hasval(cursorOptions) && hasval(cursorOptions.font) ? cursorOptions.font : options.timelineFont);\r\n        const buffer_px = (hasval(cursorOptions) && hasval(cursorOptions.buffer_px) ? cursorOptions.buffer_px : 4);\r\n        const textDecimals = (hasval(cursorOptions) && hasval(cursorOptions.textDecimals) ? cursorOptions.textDecimals : 2);\r\n        const boxSize_px = (hasval(cursorOptions) && hasval(cursorOptions.boxSize_px) ? cursorOptions.boxSize_px : 8);\r\n        const crosshairThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.crosshairThickness_px) ? cursorOptions.boxSize_px : 2);\r\n        const boxThickness_px = (hasval(cursorOptions) && hasval(cursorOptions.boxThickness_px) ? cursorOptions.boxSize_px : 2);\r\n\r\n        const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n        const u_Color = new UniformColor(program, 'u_Color');\r\n        const a_Position = new Attribute(program, 'a_XyFrac');\r\n\r\n        let xys = new Float32Array(0);\r\n        xys = ensureCapacityFloat32(xys, 4);\r\n        const xysBuffer = newDynamicBuffer();\r\n\r\n        const textTextures = newTextTextureCache2(font);\r\n        const textureRenderer = new TextureRenderer();\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n            // only draw a cursor if we are the current hovered row\r\n            const hoveredRow: TimelineRowModel = ui.selection.hoveredRow.value;\r\n            if (!hasval(hoveredRow) || hoveredRow.rowGuid !== rowModel.rowGuid) {\r\n                return;\r\n            }\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            let indexXys = 0;\r\n            textTextures.resetTouches();\r\n\r\n            const time = ui.selection.hoveredTime_PMILLIS.value;\r\n            const y = ui.selection.hoveredY.value;\r\n\r\n            if (!hasval(time) || !hasval(y)) {\r\n                return;\r\n            }\r\n\r\n            const wLine = crosshairThickness_px / viewport.w;\r\n            const hLine = crosshairThickness_px / viewport.h;\r\n\r\n            const wBoxLine = boxThickness_px / viewport.w;\r\n            const hBoxLine = boxThickness_px / viewport.h;\r\n\r\n            const wBox = boxSize_px / viewport.w;\r\n            const hBox = boxSize_px / viewport.h;\r\n\r\n            if (hasval(time)) {\r\n\r\n                const cursorModel = model.cursor(rowModel.cursorGuid);\r\n\r\n                if (hasval(cursorModel)) {\r\n                    if (hasval(cursorModel.lineColor)) {\r\n                        lineColor = cursorModel.lineColor;\r\n                    }\r\n\r\n                    if (hasval(cursorModel.textColor)) {\r\n                        textColor = cursorModel.textColor;\r\n                    }\r\n\r\n                    textureRenderer.begin(gl, viewport);\r\n\r\n                    const timeseriesCount = cursorModel.labeledTimeseriesGuids.length;\r\n\r\n                    // 36 vertices for crosshairs, 48 vertices per timeseries intersection marker\r\n                    xys = ensureCapacityFloat32(xys, 2 * (36 + timeseriesCount * 48));\r\n\r\n                    for (let i = 0; i < cursorModel.labeledTimeseriesGuids.length; i++) {\r\n\r\n                        const timeseriesGuid = cursorModel.labeledTimeseriesGuids.valueAt(i);\r\n                        const timeseries = model.timeseries(timeseriesGuid);\r\n\r\n                        // if the row doesn't contain the timeseries, don't show cursor intersections\r\n                        if (!rowModel.timeseriesGuids.hasValue(timeseriesGuid)) {\r\n                            continue;\r\n                        }\r\n\r\n                        for (let j = 0; j < timeseries.fragmentGuids.length; j++) {\r\n                            const fragmentGuid: string = timeseries.fragmentGuids.valueAt(j);\r\n                            const fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid);\r\n\r\n                            // fragments should not overlap\r\n                            if (fragment.start_PMILLIS < time && fragment.end_PMILLIS > time) {\r\n\r\n                                let value: number;\r\n\r\n                                // bars are drawn starting at the point and continuing to the next point, so we don't interpolate them\r\n                                if (timeseries.uiHint === 'bars') {\r\n                                    const index: number = indexAtOrBefore(fragment.times_PMILLIS, time);\r\n                                    value = fragment.data[index];\r\n                                }\r\n                                else {\r\n                                    const index0: number = indexAtOrBefore(fragment.times_PMILLIS, time);\r\n                                    const index1: number = indexAtOrAfter(fragment.times_PMILLIS, time);\r\n\r\n                                    const value0 = fragment.data[index0];\r\n                                    const time0 = fragment.times_PMILLIS[index0];\r\n\r\n                                    const value1 = fragment.data[index1];\r\n                                    const time1 = fragment.times_PMILLIS[index1];\r\n\r\n                                    const diff = time1 - time0;\r\n                                    const diff0 = (time - time0) / diff;\r\n                                    const diff1 = 1 - diff0;\r\n\r\n                                    value = value0 * diff1 + value1 * diff0;\r\n                                }\r\n\r\n                                const textTexture = textTextures.value(textColor.rgbaString, value.toFixed(textDecimals));\r\n\r\n                                const valueFracY = dataAxis.vFrac(value);\r\n                                const valueFracX = timeAxis.tFrac(time);\r\n\r\n                                const boxLeft = valueFracX - wBox / 2;\r\n                                const boxRight = valueFracX + wBox / 2;\r\n                                const boxTop = valueFracY + hBox / 2;\r\n                                const boxBottom = valueFracY - hBox / 2;\r\n\r\n                                // draw box at value location\r\n\r\n                                // left edge\r\n                                indexXys = putQuadXys(xys, indexXys, boxLeft - wBoxLine / 2, boxLeft + wBoxLine / 2, boxTop + hBoxLine / 2, boxBottom - hBoxLine / 2);\r\n                                // right edge\r\n                                indexXys = putQuadXys(xys, indexXys, boxRight - wBoxLine / 2, boxRight + wBoxLine / 2, boxTop + hBoxLine / 2, boxBottom - hBoxLine / 2);\r\n                                // top edge\r\n                                indexXys = putQuadXys(xys, indexXys, boxLeft + wBoxLine / 2, boxRight - wBoxLine / 2, boxTop - hBoxLine / 2, boxTop + hBoxLine / 2);\r\n                                // bottom edge\r\n                                indexXys = putQuadXys(xys, indexXys, boxLeft + wBoxLine / 2, boxRight - wBoxLine / 2, boxBottom - hBoxLine / 2, boxBottom + hBoxLine / 2);\r\n\r\n                                // draw text\r\n                                // XXX 0.6 looks more centered to the eye than 0.5 for numeric text\r\n                                textureRenderer.draw(gl, textTexture, boxRight + wBoxLine / 2 + buffer_px / viewport.w, valueFracY, { xAnchor: 0, yAnchor: .6 });\r\n\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (hasval(cursorModel.showCursorText) ? cursorModel.showCursorText : true) {\r\n                        const textTexture = textTextures.value(textColor.rgbaString, y.toFixed(textDecimals));\r\n                        textureRenderer.draw(gl, textTexture, 1, dataAxis.vFrac(y) + buffer_px / viewport.h, { xAnchor: 1, yAnchor: 0 });\r\n                    }\r\n\r\n                    textureRenderer.end(gl);\r\n                    textTextures.retainTouched();\r\n\r\n                    const xLeft = 0;\r\n                    const xRight = 1;\r\n                    const yMid = dataAxis.vFrac(y);\r\n                    const xMid = timeAxis.tFrac(time);\r\n\r\n                    // draw horizontal line\r\n                    if (hasval(cursorModel.showHorizontalLine) ? cursorModel.showHorizontalLine : true) {\r\n                        indexXys = putQuadXys(xys, indexXys, xLeft, xRight, yMid - hLine / 2, yMid + hLine / 2);\r\n                    }\r\n\r\n                    // draw vertical lines (split in two to avoid overlap with horizontal)\r\n                    if (hasval(cursorModel.showVerticalLine) ? cursorModel.showVerticalLine : true) {\r\n                        indexXys = putQuadXys(xys, indexXys, xMid - wLine / 2, xMid + wLine / 2, 0, yMid - hLine / 2);\r\n                        indexXys = putQuadXys(xys, indexXys, xMid - wLine / 2, xMid + wLine / 2, yMid + hLine / 2, 1);\r\n                    }\r\n\r\n                    // draw lines\r\n                    program.use(gl);\r\n\r\n                    xysBuffer.setData(xys.subarray(0, indexXys));\r\n                    a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n                    u_Color.setData(gl, lineColor);\r\n                    gl.drawArrays(GL.TRIANGLES, 0, Math.floor(indexXys / 2));\r\n\r\n                    a_Position.disable(gl);\r\n                    program.endUse(gl);\r\n                }\r\n            }\r\n        };\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { TimelineTimeseriesPainterFactory } from './timeline_timeseries_row';\r\nimport { Drawable, Painter } from '../core';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { Axis1D } from '../plot/axis';\r\nimport { TimelineModel, TimelineRowModel, TimelineAnnotationModel } from './timeline_model';\r\nimport { TimelineUi } from './timeline_ui';\r\nimport { newTextTextureCache6 } from '../text';\r\nimport { TextureRenderer } from '../texture';\r\nimport { Program, UniformColor, Attribute } from '../shader';\r\nimport { xyFrac_VERTSHADER, solid_FRAGSHADER } from '../misc';\r\nimport { ensureCapacityFloat32, GL, hasval } from '../util/util';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { TimelineAnnotationStyleUi, TimelineAnnotationIcon } from './timeline_annotation_style';\r\nimport { white } from '../color';\r\n\r\nexport function newTimeseriesAnnotationPainterFactory(): TimelineTimeseriesPainterFactory {\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter {\r\n\r\n        const textTextures = newTextTextureCache6();\r\n        const textureRenderer = new TextureRenderer();\r\n\r\n        const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n        const u_Color = new UniformColor(program, 'u_Color');\r\n        const a_Position = new Attribute(program, 'a_XyFrac');\r\n\r\n        let xys = new Float32Array(0);\r\n        xys = ensureCapacityFloat32(xys, 4);\r\n        const xysBuffer = newDynamicBuffer();\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            textTextures.resetTouches();\r\n\r\n            let xFrac = 0;\r\n            let yFrac = 0;\r\n\r\n            for (let i = 0; i < rowModel.annotationGuids.length; i++) {\r\n                const annotationGuid: string = rowModel.annotationGuids.valueAt(i);\r\n                const annotation: TimelineAnnotationModel = model.annotation(annotationGuid);\r\n                const annotationStyle: TimelineAnnotationStyleUi = ui.annotationStyle(annotation.styleGuid);\r\n\r\n                const font = hasval(annotationStyle.font) ? annotationStyle.font : '11px verdana,sans-serif';\r\n                const color = hasval(annotationStyle.color) ? annotationStyle.color : white;\r\n                const bgColorString = hasval(annotationStyle.bgColor) ? annotationStyle.bgColor.rgbaString : '#ffffff00';\r\n                const bgPadding = hasval(annotationStyle.bgPadding) ? annotationStyle.bgPadding : 0;\r\n                const bgBorderRadius = hasval(annotationStyle.bgBorderRadius) ? annotationStyle.bgBorderRadius : 0;\r\n\r\n                const hTextOffset = hasval(annotationStyle.hTextOffset) ? annotationStyle.hTextOffset : 0;\r\n                const vTextOffset = hasval(annotationStyle.vTextOffset) ? annotationStyle.vTextOffset : 0;\r\n\r\n                // draw line\r\n                if (annotationStyle.uiHint === 'horizontal-line' || annotationStyle.uiHint === 'vertical-line') {\r\n\r\n                    if (annotationStyle.uiHint === 'horizontal-line') {\r\n                        xFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1;\r\n                        yFrac = dataAxis.vFrac(annotation.y);\r\n\r\n                        xys[0] = 0;\r\n                        xys[1] = yFrac;\r\n                        xys[2] = 1;\r\n                        xys[3] = yFrac;\r\n                    }\r\n                    else if (annotationStyle.uiHint === 'vertical-line') {\r\n                        xFrac = timeAxis.tFrac(annotation.time_PMILLIS);\r\n                        yFrac = hasval(annotationStyle.align) ? annotationStyle.align : 1;\r\n\r\n                        xys[0] = xFrac;\r\n                        xys[1] = 0;\r\n                        xys[2] = xFrac;\r\n                        xys[3] = 1;\r\n                    }\r\n\r\n                    program.use(gl);\r\n\r\n                    u_Color.setData(gl, color);\r\n\r\n                    xysBuffer.setData(xys.subarray(0, 4));\r\n                    a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                    gl.drawArrays(GL.LINES, 0, 2);\r\n\r\n                    program.endUse(gl);\r\n                }\r\n                else {\r\n                    xFrac = timeAxis.tFrac(annotation.time_PMILLIS);\r\n                    yFrac = dataAxis.vFrac(annotation.y);\r\n                }\r\n\r\n                textureRenderer.begin(gl, viewport);\r\n\r\n                // draw icons\r\n                for (let n = 0; n < annotationStyle.numIcons; n++) {\r\n                    const icon: TimelineAnnotationIcon = annotationStyle.icon(n);\r\n\r\n                    const xFracOffset = xFrac + (hasval(icon.hOffset) ? icon.hOffset : 0) / viewport.w;\r\n                    const yFracOffset = yFrac + (hasval(icon.vOffset) ? icon.vOffset : 0) / viewport.h;\r\n\r\n                    const iconTexture = ui.loadImage(icon.url, function () { drawable.redraw(); });\r\n                    if (iconTexture) {\r\n                        const options = {\r\n                            xAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5),\r\n                            yAnchor: (hasval(icon.hAlign) ? icon.hAlign : 0.5),\r\n                            width: icon.displayWidth,\r\n                            height: icon.displayHeight,\r\n                            rotation_CCWRAD: 0\r\n                        };\r\n\r\n                        textureRenderer.draw(gl, iconTexture, xFracOffset, yFracOffset, options);\r\n                    }\r\n                }\r\n\r\n                // draw text label\r\n                if (hasval(annotation.label)) {\r\n                    const textTexture = textTextures.value(\r\n                        font,\r\n                        color.rgbaString,\r\n                        annotation.label,\r\n                        bgColorString,\r\n                        bgPadding.toString(),\r\n                        bgBorderRadius.toString()\r\n                    );\r\n\r\n                    const xFracOffset = xFrac + hTextOffset / viewport.w;\r\n                    const yFracOffset = yFrac + vTextOffset / viewport.h;\r\n\r\n                    const xAnchor = hasval(annotationStyle.hTextAlign) ? annotationStyle.hTextAlign : 0;\r\n                    const yAnchor = textTexture.yAnchor(hasval(annotationStyle.vTextAlign) ? annotationStyle.vTextAlign : 0.5);\r\n\r\n                    textureRenderer.draw(gl, textTexture, xFracOffset, yFracOffset, { xAnchor: xAnchor, yAnchor: yAnchor });\r\n                }\r\n\r\n                textureRenderer.end(gl);\r\n            }\r\n\r\n            textTextures.retainTouched();\r\n        };\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, parseCssColor } from '../color';\r\nimport { hasval } from '../util/util';\r\n\r\nexport interface TimelineAnnotationIcon {\r\n    url: string;\r\n    displayWidth: number; // horizontal size of icon in pixels\r\n    displayHeight: number; // vertical size of icon in pixels\r\n    hAlign: number; // relative location of center pixel of icon (0=left side, 1=right side)\r\n    vAlign: number; // relative location of center pixel of icon (0=left side, 1=right side)\r\n    hOffset: number; // center pixel horizontal offset in pixels\r\n    vOffset: number; // center pixel vertical offset in pixels\r\n}\r\n\r\nexport interface TimelineAnnotationStyle {\r\n    styleGuid: string;\r\n    color?: string;\r\n    font?: string; // label font\r\n    hTextAlign?: number; // relative location of center pixel of text (0=left side, 1=right side)\r\n    vTextAlign?: number; // relative location of center pixel of text (0=left side, 1=right side)\r\n    hTextOffset?: number; // horizontal offset of the label text in pixels\r\n    vTextOffset?: number; // vertical offset of the label text in pixels\r\n    align?: number; // for horizontal-line, vertical-line only, relative location of text/icons along\r\n    // annotation line (0 = bottom/left, 1=top/right)\r\n    uiHint?: string; // one of: point, horizontal-line, vertical-line\r\n    icons?: TimelineAnnotationIcon[];\r\n    bgColor?: string;\r\n    bgPadding?: number;\r\n    bgBorderRadius?: number;\r\n}\r\n\r\nexport class TimelineAnnotationIconUi {\r\n    private _url: string;\r\n    private _displayWidth: number;\r\n    private _displayHeight: number;\r\n    private _hAlign: number;\r\n    private _vAlign: number;\r\n    private _hOffset: number;\r\n    private _vOffset: number;\r\n\r\n    constructor(icon: TimelineAnnotationIcon) {\r\n        this._setAttrs(icon);\r\n    }\r\n\r\n    private _setAttrs(icon: TimelineAnnotationIcon) {\r\n        this._url = icon.url;\r\n        this._displayWidth = icon.displayWidth;\r\n        this._displayHeight = icon.displayHeight;\r\n        this._hAlign = icon.hAlign;\r\n        this._vAlign = icon.vAlign;\r\n        this._hOffset = icon.hOffset;\r\n        this._vOffset = icon.vOffset;\r\n    }\r\n\r\n    get url(): string { return this._url; }\r\n    get displayWidth(): number { return this._displayWidth; }\r\n    get displayHeight(): number { return this._displayHeight; }\r\n    get hAlign(): number { return this._hAlign; }\r\n    get vAlign(): number { return this._vAlign; }\r\n    get hOffset(): number { return this._hOffset; }\r\n    get vOffset(): number { return this._vOffset; }\r\n\r\n    snapshot(): TimelineAnnotationIcon {\r\n        return {\r\n            url: this._url,\r\n            displayWidth: this._displayWidth,\r\n            displayHeight: this._displayHeight,\r\n            hAlign: this._hAlign,\r\n            vAlign: this._vAlign,\r\n            hOffset: this._hOffset,\r\n            vOffset: this._vOffset\r\n        };\r\n    }\r\n}\r\n\r\n\r\n\r\nexport class TimelineAnnotationStyleUi {\r\n    private _styleGuid: string;\r\n    private _color: Color;\r\n    private _font: string;\r\n    private _vTextOffset: number;\r\n    private _hTextOffset: number;\r\n    private _vTextAlign: number;\r\n    private _hTextAlign: number;\r\n    private _align: number;\r\n    private _uiHint: string;\r\n    private _icons: TimelineAnnotationIconUi[];\r\n    private _bgColor?: Color;\r\n    private _bgPadding?: number;\r\n    private _bgBorderRadius?: number;\r\n\r\n    constructor(style: TimelineAnnotationStyle) {\r\n        this._styleGuid = style.styleGuid;\r\n        this._setAttrs(style);\r\n    }\r\n\r\n    get styleGuid(): string {\r\n        return this._styleGuid;\r\n    }\r\n\r\n    private _setAttrs(style: TimelineAnnotationStyle) {\r\n        this._color = hasval(style.color) ? parseCssColor(style.color) : undefined;\r\n        this._font = style.font;\r\n        this._hTextOffset = style.hTextOffset;\r\n        this._vTextOffset = style.vTextOffset;\r\n        this._hTextAlign = style.hTextAlign;\r\n        this._vTextAlign = style.vTextAlign;\r\n        this._align = style.align;\r\n        this._uiHint = style.uiHint;\r\n        this._icons = hasval(style.color) ? style.icons.map((icon) => new TimelineAnnotationIconUi(icon)) : [];\r\n        this._bgColor = hasval(style.bgColor) ? parseCssColor(style.bgColor) : undefined;\r\n        this._bgPadding = style.bgPadding;\r\n        this._bgBorderRadius = style.bgBorderRadius;\r\n    }\r\n\r\n    get numIcons(): number {\r\n        return this._icons.length;\r\n    }\r\n\r\n    icon(index: number): TimelineAnnotationIconUi {\r\n        return this._icons[index];\r\n    }\r\n\r\n    get color(): Color {\r\n        return this._color;\r\n    }\r\n\r\n    get font(): string {\r\n        return this._font;\r\n    }\r\n\r\n    get hTextOffset(): number {\r\n        return this._hTextOffset;\r\n    }\r\n\r\n    get vTextOffset(): number {\r\n        return this._vTextOffset;\r\n    }\r\n\r\n    get hTextAlign(): number {\r\n        return this._hTextAlign;\r\n    }\r\n\r\n    get vTextAlign(): number {\r\n        return this._vTextAlign;\r\n    }\r\n\r\n    get align(): number {\r\n        return this._align;\r\n    }\r\n\r\n    get uiHint(): string {\r\n        return this._uiHint;\r\n    }\r\n\r\n    get bgColor(): Color {\r\n        return this._bgColor;\r\n    }\r\n\r\n    get bgPadding(): number {\r\n        return this._bgPadding;\r\n    }\r\n    get bgBorderRadius(): number {\r\n        return this._bgBorderRadius;\r\n    }\r\n\r\n    snapshot(): TimelineAnnotationStyle {\r\n        return {\r\n            styleGuid: this._styleGuid,\r\n            color: this._color.cssString,\r\n            font: this._font,\r\n            vTextOffset: this._hTextOffset,\r\n            hTextOffset: this._vTextOffset,\r\n            vTextAlign: this._hTextAlign,\r\n            hTextAlign: this._vTextAlign,\r\n            align: this._align,\r\n            uiHint: this._uiHint,\r\n            icons: this._icons.map((ui) => ui.snapshot()),\r\n            bgColor: this._bgColor.cssString,\r\n            bgPadding: this._bgPadding,\r\n            bgBorderRadius: this._bgBorderRadius\r\n        };\r\n    }\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nexport interface TimelineEventIcon {\r\n    url: string;\r\n    displayWidth: number;  // horizontal size of icon in pixels\r\n    displayHeight: number; // vertical size of icon in pixels\r\n    hAlign: number; // relative location of center pixel of icon (0=left side, 1=right side)\r\n    hPos: number; // relative icon position along event bar (0=left side, 1=right side)\r\n}\r\n\r\n\r\n\r\nexport interface TimelineEventStyle {\r\n    styleGuid: string;\r\n    icons: TimelineEventIcon[];\r\n}\r\n\r\n\r\n\r\nexport class TimelineEventIconUi {\r\n    private _url: string;\r\n    private _displayWidth: number;\r\n    private _displayHeight: number;\r\n    private _hAlign: number;\r\n    private _hPos: number;\r\n\r\n    constructor(icon: TimelineEventIcon) {\r\n        this._setAttrs(icon);\r\n    }\r\n\r\n    private _setAttrs(icon: TimelineEventIcon) {\r\n        this._url = icon.url;\r\n        this._displayWidth = icon.displayWidth;\r\n        this._displayHeight = icon.displayHeight;\r\n        this._hAlign = icon.hAlign;\r\n        this._hPos = icon.hPos;\r\n    }\r\n\r\n    get url(): string { return this._url; }\r\n    get displayWidth(): number { return this._displayWidth; }\r\n    get displayHeight(): number { return this._displayHeight; }\r\n    get hAlign(): number { return this._hAlign; }\r\n    get hPos(): number { return this._hPos; }\r\n\r\n    snapshot(): TimelineEventIcon {\r\n        return {\r\n            url: this._url,\r\n            displayWidth: this._displayWidth,\r\n            displayHeight: this._displayHeight,\r\n            hAlign: this._hAlign,\r\n            hPos: this._hPos\r\n        };\r\n    }\r\n}\r\n\r\n\r\n\r\nexport class TimelineEventStyleUi {\r\n    private _styleGuid: string;\r\n    private _icons: TimelineEventIconUi[];\r\n\r\n    constructor(style: TimelineEventStyle) {\r\n        this._styleGuid = style.styleGuid;\r\n        this._setAttrs(style);\r\n    }\r\n\r\n    get styleGuid(): string {\r\n        return this._styleGuid;\r\n    }\r\n\r\n    private _setAttrs(style: TimelineEventStyle) {\r\n        this._icons = style.icons.map((icon) => new TimelineEventIconUi(icon));\r\n    }\r\n\r\n    get numIcons(): number {\r\n        return this._icons.length;\r\n    }\r\n\r\n    icon(index: number): TimelineEventIconUi {\r\n        return this._icons[index];\r\n    }\r\n\r\n    snapshot(): TimelineEventStyle {\r\n        return {\r\n            styleGuid: this._styleGuid,\r\n            icons: this._icons.map((ui) => ui.snapshot())\r\n        };\r\n    }\r\n}\r\n\r\n\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { OrderedSet } from '../util/ordered_set';\r\nimport { TimelineEventStyleUi } from './timeline_event_style';\r\nimport { TimelineAnnotationStyleUi } from './timeline_annotation_style';\r\nimport { SimpleModel, XyModel } from '../misc';\r\nimport { StringMap, GL, hasval, getObjectId } from '../util/util';\r\nimport { Texture2D } from '../texture';\r\nimport { Notification, Notification1, Notification2 } from '../util/notification';\r\nimport { Pane, PointerEvent, isLeftMouseDown } from '../core';\r\nimport { TimelineModel, TimelineGroupModel, TimelineRowModel, TimelineEventModel, TimelineAnnotationModel, TimelineTimeseriesFragmentModel } from './timeline_model';\r\nimport { TimelineRowPaneFactory } from './timeline_row';\r\n\r\nexport interface TimelineUiOptions {\r\n    allowEventMultiSelection?: boolean;\r\n}\r\n\r\nexport class TimelineUi {\r\n    private _input: TimelineInput;\r\n    private _selection: TimelineSelectionModel;\r\n\r\n    private _groupUis: OrderedSet<TimelineGroupUi>;\r\n    private _rowUis: OrderedSet<TimelineRowUi>;\r\n    private _eventStyles: OrderedSet<TimelineEventStyleUi>;\r\n    private _annotationStyles: OrderedSet<TimelineAnnotationStyleUi>;\r\n\r\n    private _millisPerPx: SimpleModel<number>;\r\n\r\n    private _imageStatus: StringMap<boolean>;\r\n    private _imageCache: StringMap<Texture2D>;\r\n\r\n    private _dispose: Notification;\r\n\r\n    private _panes: OrderedSet<Pane>;\r\n\r\n    constructor(model: TimelineModel, options: TimelineUiOptions = {}) {\r\n        this._dispose = new Notification();\r\n        this._input = new TimelineInput();\r\n\r\n        const getPaneId = function (pane: Pane): string {\r\n            const paneId = pane['webglimpse_PaneId'];\r\n            return hasval(paneId) ? paneId : getObjectId(pane);\r\n        };\r\n\r\n        this._panes = new OrderedSet<Pane>([], getPaneId);\r\n\r\n        this._selection = new TimelineSelectionModel();\r\n        attachTimelineInputToSelection(this._input, this._selection, options);\r\n\r\n        this._groupUis = new OrderedSet<TimelineGroupUi>([], (g) => g.groupGuid);\r\n        const groupUis = this._groupUis;\r\n        const addGroupUi = function (group: TimelineGroupModel) { groupUis.add(new TimelineGroupUi(group.groupGuid)); };\r\n        const removeGroupUi = function (group: TimelineGroupModel) { groupUis.removeId(group.groupGuid); };\r\n        model.groups.forEach(addGroupUi);\r\n        model.groups.valueAdded.on(addGroupUi);\r\n        model.groups.valueRemoved.on(removeGroupUi);\r\n\r\n        this._rowUis = new OrderedSet<TimelineRowUi>([], (r) => r.rowGuid);\r\n        const rowUis = this._rowUis;\r\n        const addRowUi = function (row: TimelineRowModel) { rowUis.add(new TimelineRowUi(row.rowGuid)); };\r\n        const removeRowUi = function (row: TimelineRowModel) { rowUis.removeId(row.rowGuid); };\r\n        model.rows.forEach(addRowUi);\r\n        model.rows.valueAdded.on(addRowUi);\r\n        model.rows.valueRemoved.on(removeRowUi);\r\n\r\n        this._eventStyles = new OrderedSet<TimelineEventStyleUi>([], (s) => s.styleGuid);\r\n        this._annotationStyles = new OrderedSet<TimelineAnnotationStyleUi>([], (s) => s.styleGuid);\r\n\r\n        this._millisPerPx = new SimpleModel<number>(1000);\r\n\r\n        this._imageStatus = {};\r\n        this._imageCache = {};\r\n\r\n        this._dispose.on(function () {\r\n            model.groups.valueAdded.off(addGroupUi);\r\n            model.groups.valueRemoved.off(removeGroupUi);\r\n            model.rows.valueAdded.off(addRowUi);\r\n            model.rows.valueRemoved.off(removeRowUi);\r\n        });\r\n    }\r\n\r\n    get input(): TimelineInput {\r\n        return this._input;\r\n    }\r\n\r\n    get selection(): TimelineSelectionModel {\r\n        return this._selection;\r\n    }\r\n\r\n    get groupUis(): OrderedSet<TimelineGroupUi> {\r\n        return this._groupUis;\r\n    }\r\n\r\n    groupUi(groupGuid: string): TimelineGroupUi {\r\n        return this._groupUis.valueFor(groupGuid);\r\n    }\r\n\r\n    get rowUis(): OrderedSet<TimelineRowUi> {\r\n        return this._rowUis;\r\n    }\r\n\r\n    rowUi(rowGuid: string): TimelineRowUi {\r\n        return this._rowUis.valueFor(rowGuid);\r\n    }\r\n\r\n    get eventStyles(): OrderedSet<TimelineEventStyleUi> {\r\n        return this._eventStyles;\r\n    }\r\n\r\n    eventStyle(styleGuid: string): TimelineEventStyleUi {\r\n        return ((hasval(styleGuid) && this._eventStyles.valueFor(styleGuid)) || timelineEventStyle_DEFAULT);\r\n    }\r\n\r\n    get annotationStyles(): OrderedSet<TimelineAnnotationStyleUi> {\r\n        return this._annotationStyles;\r\n    }\r\n\r\n    annotationStyle(styleGuid: string): TimelineAnnotationStyleUi {\r\n        return ((hasval(styleGuid) && this._annotationStyles.valueFor(styleGuid)) || timelineAnnotationStyle_DEFAULT);\r\n    }\r\n\r\n    get millisPerPx(): SimpleModel<number> {\r\n        return this._millisPerPx;\r\n    }\r\n\r\n    loadImage(url: string, onLoaded: () => void): Texture2D {\r\n        if (!hasval(this._imageStatus[url])) {\r\n            this._imageStatus[url] = true;\r\n\r\n            const imageCache = this._imageCache;\r\n            const image = new Image();\r\n            image.onload = function () {\r\n                const w = image.naturalWidth;\r\n                const h = image.naturalHeight;\r\n                imageCache[url] = new Texture2D(w, h, GL.LINEAR, GL.LINEAR, function (g) { g.drawImage(image, 0, 0); });\r\n                if (onLoaded) {\r\n                    onLoaded();\r\n                }\r\n            };\r\n            image.src = url;\r\n        }\r\n        return this._imageCache[url];\r\n    }\r\n\r\n    get panes(): OrderedSet<Pane> {\r\n        return this._panes;\r\n    }\r\n\r\n    addPane(paneId: string, pane: Pane) {\r\n        pane['webglimpse_PaneId'] = paneId;\r\n        this._panes.removeId(paneId);\r\n        this._panes.add(pane);\r\n    }\r\n\r\n    removePane(paneId: string) {\r\n        this._panes.removeId(paneId);\r\n    }\r\n\r\n    getPane(paneId: string): Pane {\r\n        return this._panes.valueFor(paneId);\r\n    }\r\n\r\n    get dispose() { return this._dispose; }\r\n}\r\n\r\n\r\n\r\nexport class TimelineGroupUi {\r\n    private _groupGuid: string;\r\n\r\n    constructor(groupGuid: string) {\r\n        this._groupGuid = groupGuid;\r\n    }\r\n\r\n    get groupGuid(): string {\r\n        return this._groupGuid;\r\n    }\r\n}\r\n\r\n\r\n\r\nexport class TimelineRowUi {\r\n    private _rowGuid: string;\r\n    private _paneFactoryChanged: Notification;\r\n    private _paneFactory: TimelineRowPaneFactory;\r\n    private _panes: OrderedSet<Pane>;\r\n\r\n    constructor(rowGuid: string) {\r\n        this._rowGuid = rowGuid;\r\n        this._paneFactoryChanged = new Notification();\r\n        this._paneFactory = null;\r\n\r\n        const getPaneId = function (pane: Pane): string {\r\n            const paneId = pane['webglimpse_PaneId'];\r\n            return hasval(paneId) ? paneId : getObjectId(pane);\r\n        };\r\n\r\n        this._panes = new OrderedSet<Pane>([], getPaneId);\r\n    }\r\n\r\n    get rowGuid(): string {\r\n        return this._rowGuid;\r\n    }\r\n\r\n    get paneFactoryChanged(): Notification {\r\n        return this._paneFactoryChanged;\r\n    }\r\n\r\n    get paneFactory(): TimelineRowPaneFactory {\r\n        return this._paneFactory;\r\n    }\r\n\r\n    set paneFactory(paneFactory: TimelineRowPaneFactory) {\r\n        if (paneFactory !== this._paneFactory) {\r\n            this._paneFactory = paneFactory;\r\n            this._paneFactoryChanged.fire();\r\n        }\r\n    }\r\n\r\n    get panes(): OrderedSet<Pane> {\r\n        return this._panes;\r\n    }\r\n\r\n    addPane(paneId: string, pane: Pane) {\r\n        pane['webglimpse_PaneId'] = paneId;\r\n        this._panes.removeId(paneId);\r\n        this._panes.add(pane);\r\n    }\r\n\r\n    removePane(paneId: string) {\r\n        this._panes.removeId(paneId);\r\n    }\r\n\r\n    getPane(paneId: string): Pane {\r\n        return this._panes.valueFor(paneId);\r\n    }\r\n}\r\n\r\n\r\nconst timelineAnnotationStyle_DEFAULT = new TimelineAnnotationStyleUi({\r\n    styleGuid: 'DEFAULT',\r\n    color: 'white',\r\n    icons: []\r\n});\r\n\r\n\r\nconst timelineEventStyle_DEFAULT = new TimelineEventStyleUi({\r\n    styleGuid: 'DEFAULT',\r\n    icons: []\r\n});\r\n\r\n\r\n\r\nexport class TimelineInput {\r\n    private _mouseMove = new Notification1<PointerEvent>();\r\n    private _mouseExit = new Notification1<PointerEvent>();\r\n    private _timeHover = new Notification2<number, PointerEvent>();\r\n    private _rowHover = new Notification2<TimelineRowModel, PointerEvent>();\r\n    private _eventHover = new Notification2<TimelineEventModel, PointerEvent>();\r\n    private _mouseDown = new Notification1<PointerEvent>();\r\n    private _mouseUp = new Notification1<PointerEvent>();\r\n    private _contextMenu = new Notification1<PointerEvent>();\r\n\r\n    get mouseMove(): Notification1<PointerEvent> { return this._mouseMove; }\r\n    get mouseExit(): Notification1<PointerEvent> { return this._mouseExit; }\r\n    get timeHover(): Notification2<number, PointerEvent> { return this._timeHover; }\r\n    get rowHover(): Notification2<TimelineRowModel, PointerEvent> { return this._rowHover; }\r\n    get eventHover(): Notification2<TimelineEventModel, PointerEvent> { return this._eventHover; }\r\n    get mouseDown(): Notification1<PointerEvent> { return this._mouseDown; }\r\n    get mouseUp(): Notification1<PointerEvent> { return this._mouseUp; }\r\n    get contextMenu(): Notification1<PointerEvent> { return this._contextMenu; }\r\n}\r\n\r\n\r\n\r\nexport class TimelineSelectionModel {\r\n    private _mousePos = new XyModel();\r\n\r\n    private _hoveredY = new SimpleModel<number>();\r\n    private _hoveredTime_PMILLIS = new SimpleModel<number>();\r\n    private _selectedInterval = new TimeIntervalModel(0, 0);\r\n\r\n    private _hoveredRow = new SimpleModel<TimelineRowModel>();\r\n\r\n    private _hoveredEvent = new SimpleModel<TimelineEventModel>();\r\n    private _selectedEvents = new OrderedSet<TimelineEventModel>([], (e) => e.eventGuid);\r\n\r\n    private _hoveredTimeseries = new TimelineTimeseriesFragmentSelectionModel();\r\n\r\n    private _hoveredAnnotation = new SimpleModel<TimelineAnnotationModel>();\r\n\r\n    get mousePos(): XyModel { return this._mousePos; }\r\n\r\n    get hoveredY(): SimpleModel<number> { return this._hoveredY; }\r\n    get hoveredTime_PMILLIS(): SimpleModel<number> { return this._hoveredTime_PMILLIS; }\r\n    get selectedInterval(): TimeIntervalModel { return this._selectedInterval; }\r\n\r\n    get hoveredRow(): SimpleModel<TimelineRowModel> { return this._hoveredRow; }\r\n\r\n    get hoveredEvent(): SimpleModel<TimelineEventModel> { return this._hoveredEvent; }\r\n    get selectedEvents(): OrderedSet<TimelineEventModel> { return this._selectedEvents; }\r\n\r\n    get hoveredTimeseries(): TimelineTimeseriesFragmentSelectionModel { return this._hoveredTimeseries; }\r\n\r\n    get hoveredAnnotation(): SimpleModel<TimelineAnnotationModel> { return this._hoveredAnnotation; }\r\n}\r\n\r\n\r\nexport class TimelineTimeseriesFragmentSelectionModel {\r\n    private _fragment: TimelineTimeseriesFragmentModel;\r\n    private _index: number;\r\n    private _changed: Notification;\r\n\r\n    constructor(fragment: TimelineTimeseriesFragmentModel = null, index: number = -1) {\r\n        this._fragment = fragment;\r\n        this._index = index;\r\n        this._changed = new Notification();\r\n    }\r\n\r\n    setValue(fragment: TimelineTimeseriesFragmentModel, index: number) {\r\n        if (fragment !== this._fragment || index !== this._index) {\r\n            this._fragment = fragment;\r\n            this._index = index;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    clearValue() {\r\n        this.setValue(null, -1);\r\n    }\r\n\r\n    get fragment(): TimelineTimeseriesFragmentModel { return this._fragment; }\r\n    get index(): number { return this._index; }\r\n    get changed(): Notification { return this._changed; }\r\n\r\n    get times_PMILLIS(): number {\r\n        if (this._fragment) {\r\n            return this._fragment.times_PMILLIS[this._index];\r\n        }\r\n        else {\r\n            return undefined;\r\n        }\r\n    }\r\n    get data(): number {\r\n        if (this._fragment) {\r\n            return this._fragment.data[this._index];\r\n        }\r\n        else {\r\n            return undefined;\r\n        }\r\n    }\r\n}\r\n\r\nexport class TimeIntervalModel {\r\n    private _start_PMILLIS: number;\r\n    private _end_PMILLIS: number;\r\n    private _cursor_PMILLIS: number;\r\n    private _changed: Notification;\r\n\r\n    constructor(start_PMILLIS: number, end_PMILLIS: number, cursor_PMILLIS?: number) {\r\n        this._start_PMILLIS = start_PMILLIS;\r\n        this._end_PMILLIS = end_PMILLIS;\r\n        this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS;\r\n        this._changed = new Notification();\r\n    }\r\n\r\n    get start_PMILLIS(): number { return this._start_PMILLIS; }\r\n    get end_PMILLIS(): number { return this._end_PMILLIS; }\r\n    get cursor_PMILLIS(): number { return this._cursor_PMILLIS; }\r\n    get duration_MILLIS(): number { return this._end_PMILLIS - this._start_PMILLIS; }\r\n    get changed(): Notification { return this._changed; }\r\n\r\n    set start_PMILLIS(start_PMILLIS: number) {\r\n        if (start_PMILLIS !== this._start_PMILLIS) {\r\n            this._start_PMILLIS = start_PMILLIS;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    set end_PMILLIS(end_PMILLIS: number) {\r\n        if (end_PMILLIS !== this._end_PMILLIS) {\r\n            this._end_PMILLIS = end_PMILLIS;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    set cursor_PMILLIS(cursor_PMILLIS: number) {\r\n        if (cursor_PMILLIS !== this._cursor_PMILLIS) {\r\n            this._cursor_PMILLIS = cursor_PMILLIS;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    setInterval(start_PMILLIS: number, end_PMILLIS: number, cursor_PMILLIS?: number) {\r\n        if (start_PMILLIS !== this._start_PMILLIS ||\r\n            end_PMILLIS !== this._end_PMILLIS ||\r\n            (cursor_PMILLIS && cursor_PMILLIS !== this._cursor_PMILLIS)) {\r\n\r\n            this._start_PMILLIS = start_PMILLIS;\r\n            this._end_PMILLIS = end_PMILLIS;\r\n            this._cursor_PMILLIS = cursor_PMILLIS ? cursor_PMILLIS : end_PMILLIS;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    overlaps(start_PMILLIS: number, end_PMILLIS: number): boolean {\r\n        return (this._start_PMILLIS <= end_PMILLIS && start_PMILLIS <= this._end_PMILLIS);\r\n    }\r\n\r\n    contains(time_PMILLIS: number): boolean {\r\n        return (this._start_PMILLIS <= time_PMILLIS && time_PMILLIS <= this._end_PMILLIS);\r\n    }\r\n\r\n    pan(amount_MILLIS: number) {\r\n        if (amount_MILLIS !== 0) {\r\n            this._start_PMILLIS += amount_MILLIS;\r\n            this._end_PMILLIS += amount_MILLIS;\r\n            this._cursor_PMILLIS += amount_MILLIS;\r\n            this._changed.fire();\r\n        }\r\n    }\r\n\r\n    scale(factor: number, anchor_PMILLIS: number) {\r\n        if (anchor_PMILLIS !== 1) {\r\n            this._start_PMILLIS = anchor_PMILLIS + factor * (this._start_PMILLIS - anchor_PMILLIS);\r\n            this._end_PMILLIS = anchor_PMILLIS + factor * (this._end_PMILLIS - anchor_PMILLIS);\r\n            this._cursor_PMILLIS = anchor_PMILLIS + factor * (this._cursor_PMILLIS - anchor_PMILLIS);\r\n            this._changed.fire();\r\n        }\r\n    }\r\n}\r\n\r\n\r\n\r\nfunction attachTimelineInputToSelection(input: TimelineInput, selection: TimelineSelectionModel, options: TimelineUiOptions) {\r\n\r\n    const allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true);\r\n\r\n    // Mouse-pos & Time\r\n    //\r\n    input.mouseMove.on(function (ev: PointerEvent) {\r\n        selection.mousePos.setXy(ev.i, ev.j);\r\n    });\r\n    input.mouseExit.on(function (ev: PointerEvent) {\r\n        selection.mousePos.setXy(null, null);\r\n    });\r\n    input.rowHover.on(function (row: TimelineRowModel, ev: PointerEvent) {\r\n        selection.hoveredRow.value = row;\r\n    });\r\n    input.timeHover.on(function (time_PMILLIS: number, ev: PointerEvent) {\r\n        selection.hoveredTime_PMILLIS.value = time_PMILLIS;\r\n    });\r\n\r\n    // Events\r\n    //\r\n    input.eventHover.on(function (event: TimelineEventModel) {\r\n        selection.hoveredEvent.value = event;\r\n    });\r\n\r\n    if (options.allowEventMultiSelection) {\r\n        input.mouseDown.on(function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent)) {\r\n                const event = selection.hoveredEvent.value;\r\n                if (hasval(event)) {\r\n                    const multiSelectMode = (ev.mouseEvent && (ev.mouseEvent.ctrlKey || ev.mouseEvent.shiftKey));\r\n                    const unselectedEventClicked = !selection.selectedEvents.hasValue(event);\r\n                    if (multiSelectMode) {\r\n                        if (selection.selectedEvents.hasValue(event)) {\r\n                            selection.selectedEvents.removeValue(event);\r\n                        }\r\n                        else {\r\n                            selection.selectedEvents.add(event);\r\n                        }\r\n                    }\r\n                    else if (unselectedEventClicked) {\r\n                        selection.selectedEvents.retainValues([event]);\r\n                        selection.selectedEvents.add(event);\r\n                    }\r\n                    else {\r\n                        // if a selected event is clicked, do nothing (the user is probably initiating a drag)\r\n                        // if they wish to deselect the event, they need to ctrl+click the event or click on\r\n                        // a deselected event\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n    else {\r\n        input.mouseDown.on(function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent)) {\r\n                const event = selection.hoveredEvent.value;\r\n                if (hasval(event)) {\r\n                    selection.selectedEvents.retainValues([event]);\r\n                    selection.selectedEvents.add(event);\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Color, white, darker } from '../color';\r\nimport { Drawable, Painter, Pane, Mask2D, PointerEvent, yFrac, isLeftMouseDown, Layout } from '../core';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { Axis1D, attachAxisMouseListeners1D, Axis2D } from '../plot/axis';\r\nimport { TimelineModel, TimelineRowModel, TimelineAnnotationModel, TimelineTimeseriesFragmentModel, TimelineTimeseriesModel } from './timeline_model';\r\nimport { TimelineUi, TimelineSelectionModel } from './timeline_ui';\r\nimport { EdgeAxisPainterOptions, newEdgeAxisPainter } from '../plot/edge_axis_painter';\r\nimport { TimelineRowPaneFactory, TimelineRowPaneOptions } from './timeline_row';\r\nimport { fixedSize, Side, solid_FRAGSHADER, dash_FRAGSHADER, putQuadXys } from '../misc';\r\nimport { BoundsUnmodifiable } from '../bounds';\r\nimport { newColumnLayout } from '../layout/column_layout';\r\nimport { newOverlayLayout } from '../layout/overlay_layout';\r\nimport { TimelineAnnotationStyleUi } from './timeline_annotation_style';\r\nimport { indexAtOrBefore, indexNearest } from '../util/sorted_arrays';\r\nimport { concatLines, GL, ensureCapacityFloat32, hasval } from '../util/util';\r\nimport { Program, UniformColor, UniformMatrix4f, Attribute, Uniform1f } from '../shader';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { glOrthoAxis } from '../matrix';\r\n\r\nexport interface TimelineTimeseriesPainterOptions {\r\n    timelineFont: string;\r\n    timelineFgColor: Color;\r\n    timelineThickness: number;\r\n    rowTopPadding: number;\r\n    rowBottomPadding: number;\r\n}\r\n\r\nexport type TimelineTimeseriesPainterFactory = (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi, options: TimelineTimeseriesPainterOptions) => Painter;\r\n\r\nexport interface TimelineTimeseriesRowPaneOptions {\r\n    rowHeight?: number;\r\n    rowTopPadding?: number;\r\n    rowBottomPadding?: number;\r\n    axisOptions?: EdgeAxisPainterOptions;\r\n    axisWidth?: number;\r\n    painterFactories?: TimelineTimeseriesPainterFactory[];\r\n}\r\n\r\nexport function newTimeseriesRowPaneFactory(rowOptions?: TimelineTimeseriesRowPaneOptions): TimelineRowPaneFactory {\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, row: TimelineRowModel, ui: TimelineUi, options: TimelineRowPaneOptions): Pane {\r\n\r\n        const rowTopPadding = (hasval(rowOptions) && hasval(rowOptions.rowTopPadding) ? rowOptions.rowTopPadding : 6);\r\n        const rowBottomPadding = (hasval(rowOptions) && hasval(rowOptions.rowBottomPadding) ? rowOptions.rowBottomPadding : 6);\r\n        const axisWidth = (hasval(rowOptions) && hasval(rowOptions.axisWidth) ? rowOptions.axisWidth : 60);\r\n        const painterFactories = (hasval(rowOptions) && hasval(rowOptions.painterFactories) ? rowOptions.painterFactories : []);\r\n        const axisOptions = (hasval(rowOptions) && hasval(rowOptions.axisOptions) ? rowOptions.axisOptions : {});\r\n\r\n        const keyPrefix = options.isMaximized ? 'maximized-' : '';\r\n\r\n        const getRowHeight = function () {\r\n            // maximized rows do not specifiy a height (they should fill available space)\r\n            if (options.isMaximized) {\r\n                return null;\r\n            }\r\n            // if the row has a custom row specified, use it\r\n            else if (hasval(row.rowHeight)) {\r\n                return row.rowHeight;\r\n            }\r\n            // otherwise use the default for this RowPaneFactory\r\n            else if (hasval(rowOptions) && hasval(rowOptions.rowHeight)) {\r\n                return rowOptions.rowHeight;\r\n            }\r\n            // as a last resort use a hard coded default\r\n            else {\r\n                return 135;\r\n            }\r\n        };\r\n\r\n        const rowHeight: number = getRowHeight();\r\n\r\n        const timelineFont = options.timelineFont;\r\n        const timelineFgColor = options.timelineFgColor;\r\n        const draggableEdgeWidth = options.draggableEdgeWidth;\r\n        const snapToDistance = options.snapToDistance;\r\n\r\n        const rowUi = ui.rowUi(row.rowGuid);\r\n        const input = ui.input;\r\n        const selection = ui.selection;\r\n\r\n        if (!hasval(axisOptions.font)) {\r\n            axisOptions.font = timelineFont;\r\n        }\r\n        if (!hasval(axisOptions.tickColor)) {\r\n            axisOptions.tickColor = timelineFgColor;\r\n        }\r\n        if (!hasval(axisOptions.textColor)) {\r\n            axisOptions.textColor = timelineFgColor;\r\n        }\r\n        if (!hasval(axisOptions.showLabel)) {\r\n            axisOptions.showLabel = true;\r\n        }\r\n        if (!hasval(axisOptions.shortenLabels)) {\r\n            axisOptions.shortenLabels = false;\r\n        }\r\n\r\n        const redraw = function () {\r\n            drawable.redraw();\r\n        };\r\n\r\n        // setup pane for data (y) axis painter and mouse listener\r\n        const yAxisPane = new Pane(<Layout>{ updatePrefSize: fixedSize(axisWidth, rowHeight) });\r\n        dataAxis.limitsChanged.on(redraw);\r\n        attachAxisMouseListeners1D(yAxisPane, dataAxis, true);\r\n\r\n        // add listener to update the height of the row if the rowHeight attribute changes\r\n        const updateRowHeight = function () {\r\n            yAxisPane.layout = <Layout>{ updatePrefSize: fixedSize(axisWidth, getRowHeight()) };\r\n        };\r\n        row.attrsChanged.on(updateRowHeight);\r\n\r\n        const isDragMode: Mask2D = function (viewport: BoundsUnmodifiable, i: number, j: number): boolean {\r\n            const fragment = getNearestFragment(viewport, i, j).fragment;\r\n            return hasval(fragment);\r\n        };\r\n\r\n        const rowContentPane = new Pane(newColumnLayout(), true, isDragMode);\r\n        const underlayPane = new Pane(newOverlayLayout(), false);\r\n        const overlayPane = new Pane(null, false);\r\n\r\n        const painterOptions = { timelineFont: timelineFont, timelineFgColor: timelineFgColor, timelineThickness: 1, rowTopPadding: rowTopPadding, rowBottomPadding: rowBottomPadding };\r\n        for (let n = 0; n < painterFactories.length; n++) {\r\n            const createPainter = painterFactories[n];\r\n            rowContentPane.addPainter(createPainter(drawable, timeAxis, dataAxis, model, row, ui, painterOptions));\r\n        }\r\n\r\n        yAxisPane.addPainter(newEdgeAxisPainter(dataAxis, Side.RIGHT, axisOptions));\r\n        rowContentPane.addPane(yAxisPane, 0);\r\n        underlayPane.addPane(rowContentPane, true);\r\n        underlayPane.addPane(overlayPane, false);\r\n\r\n        rowUi.addPane(keyPrefix + 'content', rowContentPane);\r\n        rowUi.addPane(keyPrefix + 'overlay', overlayPane);\r\n        rowUi.addPane(keyPrefix + 'underlay', underlayPane);\r\n        rowUi.addPane(keyPrefix + 'y-axis', yAxisPane);\r\n\r\n        row.timeseriesGuids.valueAdded.on(redraw);\r\n        row.timeseriesGuids.valueMoved.on(redraw);\r\n        row.timeseriesGuids.valueRemoved.on(redraw);\r\n\r\n        const addFragmentRedraw = function (fragmentGuid: string) {\r\n            const fragment = model.timeseriesFragment(fragmentGuid);\r\n            fragment.dataChanged.on(redraw);\r\n        };\r\n\r\n        const removeFragmentRedraw = function (fragmentGuid: string) {\r\n            const fragment = model.timeseriesFragment(fragmentGuid);\r\n            fragment.dataChanged.off(redraw);\r\n        };\r\n\r\n        const addRedraw = function (timeseriesGuid: string) {\r\n            const timeseries = model.timeseries(timeseriesGuid);\r\n            timeseries.attrsChanged.on(redraw);\r\n            timeseries.fragmentGuids.valueAdded.on(redraw);\r\n            timeseries.fragmentGuids.valueRemoved.on(redraw);\r\n\r\n            timeseries.fragmentGuids.forEach(addFragmentRedraw);\r\n            timeseries.fragmentGuids.valueAdded.on(addFragmentRedraw);\r\n            timeseries.fragmentGuids.valueRemoved.on(removeFragmentRedraw);\r\n        };\r\n        row.timeseriesGuids.forEach(addRedraw);\r\n        row.timeseriesGuids.valueAdded.on(addRedraw);\r\n\r\n        const removeRedraw = function (timeseriesGuid: string) {\r\n            const timeseries = model.timeseries(timeseriesGuid);\r\n            timeseries.attrsChanged.off(redraw);\r\n            timeseries.fragmentGuids.valueAdded.off(redraw);\r\n            timeseries.fragmentGuids.valueRemoved.off(redraw);\r\n            timeseries.fragmentGuids.forEach(removeFragmentRedraw);\r\n        };\r\n        row.timeseriesGuids.valueRemoved.on(removeRedraw);\r\n\r\n        const timeAtCoords_PMILLIS = function (viewport: BoundsUnmodifiable, i: number): number {\r\n            return timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i));\r\n        };\r\n\r\n        const timeAtPointer_PMILLIS = function (ev: PointerEvent): number {\r\n            return timeAtCoords_PMILLIS(ev.paneViewport, ev.i);\r\n        };\r\n\r\n        // Used by both sets of listeners to know whether a timeseries-drag is in progress\r\n        let timeseriesDragMode: string = null;\r\n\r\n        // Hook up input notifications\r\n        //\r\n\r\n        let recentMouseMove: PointerEvent = null;\r\n\r\n        rowContentPane.mouseMove.on(function (ev: PointerEvent) {\r\n            input.mouseMove.fire(ev);\r\n            if (!hasval(timeseriesDragMode)) {\r\n                input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev);\r\n                input.rowHover.fire(row, ev);\r\n            }\r\n            recentMouseMove = ev;\r\n        });\r\n\r\n        rowContentPane.mouseExit.on(function (ev: PointerEvent) {\r\n            input.mouseExit.fire(ev);\r\n            if (!hasval(timeseriesDragMode)) {\r\n                input.timeHover.fire(null, ev);\r\n                input.rowHover.fire(null, ev);\r\n                input.eventHover.fire(null, ev);\r\n            }\r\n            recentMouseMove = null;\r\n        });\r\n\r\n        const uiMillisPerPxChanged = function () {\r\n            if (!hasval(timeseriesDragMode) && recentMouseMove != null) {\r\n                const ev = recentMouseMove;\r\n                input.timeHover.fire(timeAtPointer_PMILLIS(ev), ev);\r\n            }\r\n        };\r\n        ui.millisPerPx.changed.on(uiMillisPerPxChanged);\r\n\r\n        rowContentPane.mouseUp.on(function (ev: PointerEvent) {\r\n            input.mouseUp.fire(ev);\r\n        });\r\n\r\n        rowContentPane.mouseDown.on(function (ev: PointerEvent) {\r\n            input.mouseDown.fire(ev);\r\n        });\r\n\r\n        rowContentPane.mouseWheel.on(options.mouseWheelListener);\r\n\r\n        rowContentPane.contextMenu.on(function (ev: PointerEvent) {\r\n            input.contextMenu.fire(ev);\r\n        });\r\n\r\n\r\n        // Begin annotation selection\r\n        //\r\n\r\n        const getNearestAnnotation = function (viewport: BoundsUnmodifiable, i: number, j: number) {\r\n            // maximum number of pixels away from a point the mouse can be to select it\r\n            const pickBuffer_PIXEL = 10;\r\n            // value per pixel in x and y directions\r\n            const vppx: number = ui.millisPerPx.value;\r\n            const vppy: number = dataAxis.vSize / rowContentPane.viewport.h;\r\n            const pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx;\r\n\r\n            const ev_time: number = timeAtCoords_PMILLIS(viewport, i);\r\n            const ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j));\r\n\r\n            let bestAnnotation: TimelineAnnotationModel = null;\r\n            let best_PIXEL: number = null;\r\n\r\n            if (ev_time) {\r\n                for (let annotationIdx = 0; annotationIdx < row.annotationGuids.length; annotationIdx++) {\r\n                    const annotationGuid: string = row.annotationGuids.valueAt(annotationIdx);\r\n                    const annotation: TimelineAnnotationModel = model.annotation(annotationGuid);\r\n                    if (!annotation.pickable) {\r\n                        continue;\r\n                    }\r\n                    const styleGuid: string = annotation.styleGuid;\r\n                    const style: TimelineAnnotationStyleUi = ui.annotationStyle(styleGuid);\r\n\r\n                    const dy_PIXEL = Math.abs(annotation.y - ev_value) / vppy;\r\n                    const dx_PIXEL = Math.abs(annotation.time_PMILLIS - ev_time) / vppx;\r\n\r\n                    let d_PIXEL = 0;\r\n                    if (style.uiHint === 'point') {\r\n                        d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL);\r\n                    }\r\n                    else if (style.uiHint === 'horizontal-line') {\r\n                        d_PIXEL = dy_PIXEL;\r\n                    }\r\n                    else if (style.uiHint === 'vertical-line') {\r\n                        d_PIXEL = dx_PIXEL;\r\n                    }\r\n\r\n                    if (d_PIXEL < pickBuffer_PIXEL) {\r\n                        if (!hasval(best_PIXEL) || d_PIXEL < best_PIXEL) {\r\n                            bestAnnotation = annotation;\r\n                            best_PIXEL = d_PIXEL;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return bestAnnotation;\r\n        };\r\n\r\n        const getNearestAnnotationEvent = function (ev: PointerEvent) {\r\n            return getNearestAnnotation(ev.paneViewport, ev.i, ev.j);\r\n        };\r\n\r\n        overlayPane.mouseMove.on(function (ev: PointerEvent) {\r\n            // update selection.hoveredYValue\r\n            const y: number = dataAxis.vAtFrac(yFrac(ev));\r\n            selection.hoveredY.value = y;\r\n\r\n            // update selection.hoveredAnnotation\r\n            const result = getNearestAnnotationEvent(ev);\r\n            selection.hoveredAnnotation.value = result;\r\n        });\r\n        selection.hoveredAnnotation.changed.on(redraw);\r\n\r\n        overlayPane.mouseExit.on(function () {\r\n            selection.hoveredY.value = undefined;\r\n            selection.hoveredAnnotation.value = null;\r\n        });\r\n\r\n        // Begin timeseries-drag\r\n        //\r\n\r\n        function chooseTimeseriesDragMode(timelineUi: TimelineUi, hoveredTimeseriesFragment: TimelineTimeseriesFragmentModel): string {\r\n            if (!hasval(hoveredTimeseriesFragment)) {\r\n                return null;\r\n            }\r\n            // return the edit mode of the selected fragment\r\n            else {\r\n                return hoveredTimeseriesFragment.userEditMode;\r\n            }\r\n        }\r\n\r\n        const updateCursor = function () {\r\n            if (!timeseriesDragMode) {\r\n                const mouseCursors = { 'xy': 'move', 'y': 'ns-resize' };\r\n                rowContentPane.mouseCursor = mouseCursors[chooseTimeseriesDragMode(ui, selection.hoveredTimeseries.fragment)];\r\n            }\r\n        };\r\n        ui.millisPerPx.changed.on(updateCursor);\r\n        selection.hoveredTimeseries.changed.on(updateCursor);\r\n\r\n        const getNearestFragment = function (viewport: BoundsUnmodifiable, i: number, j: number) {\r\n            // maximum number of pixels away from a point the mouse can be to select it\r\n            const pickBuffer_PIXEL = 10;\r\n            // value per pixel in x and y directions\r\n            const vppx: number = ui.millisPerPx.value;\r\n            const vppy: number = dataAxis.vSize / rowContentPane.viewport.h;\r\n            const pickBuffer_PMILLIS: number = pickBuffer_PIXEL * vppx;\r\n\r\n            let bestFragment: TimelineTimeseriesFragmentModel;\r\n            let bestIndex: number;\r\n            let best_PIXEL: number;\r\n\r\n            const ev_time: number = timeAtCoords_PMILLIS(viewport, i);\r\n            const ev_value: number = dataAxis.vAtFrac(viewport.yFrac(j));\r\n\r\n            if (ev_time) {\r\n                for (let timeseriesIdx = 0; timeseriesIdx < row.timeseriesGuids.length; timeseriesIdx++) {\r\n                    const timeseriesGuid: string = row.timeseriesGuids.valueAt(timeseriesIdx);\r\n                    const timeseries: TimelineTimeseriesModel = model.timeseries(timeseriesGuid);\r\n\r\n                    for (let fragmentIdx = 0; fragmentIdx < timeseries.fragmentGuids.length; fragmentIdx++) {\r\n                        const fragmentGuid: string = timeseries.fragmentGuids.valueAt(fragmentIdx);\r\n                        const fragment: TimelineTimeseriesFragmentModel = model.timeseriesFragment(fragmentGuid);\r\n\r\n                        // fragments should not overlap\r\n                        if (fragment.start_PMILLIS - pickBuffer_PMILLIS < ev_time && fragment.end_PMILLIS + pickBuffer_PMILLIS > ev_time) {\r\n                            // bars are drawn starting at the point and continuing to the next point, so we need to choose the closest index differently\r\n                            const index: number = timeseries.uiHint === 'bars' ? indexAtOrBefore(fragment.times_PMILLIS, ev_time) : indexNearest(fragment.times_PMILLIS, ev_time);\r\n                            const value = fragment.data[index];\r\n                            const time = fragment.times_PMILLIS[index];\r\n\r\n                            const dy_PIXEL = (value - ev_value) / vppy;\r\n                            const dx_PIXEL = (time - ev_time) / vppx;\r\n                            const d_PIXEL = Math.sqrt(dx_PIXEL * dx_PIXEL + dy_PIXEL * dy_PIXEL);\r\n\r\n                            const filter = function (): boolean {\r\n                                if (timeseries.uiHint === 'bars') {\r\n                                    return (timeseries.baseline < ev_value && ev_value < value) ||\r\n                                        (timeseries.baseline > ev_value && ev_value > value);\r\n                                }\r\n                                else {\r\n                                    return d_PIXEL < pickBuffer_PIXEL;\r\n                                }\r\n                            };\r\n\r\n                            if ((!best_PIXEL || d_PIXEL < best_PIXEL) && filter()) {\r\n                                best_PIXEL = d_PIXEL;\r\n                                bestFragment = fragment;\r\n                                bestIndex = index;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { fragment: bestFragment, index: bestIndex };\r\n        };\r\n\r\n        const getNearestFragmentEvent = function (ev: PointerEvent) {\r\n            return getNearestFragment(ev.paneViewport, ev.i, ev.j);\r\n        };\r\n\r\n        // choose the closest data point to the mouse cursor position and fire an event when it changes\r\n        rowContentPane.mouseMove.on(function (ev: PointerEvent) {\r\n            if (!hasval(timeseriesDragMode)) {\r\n                const result = getNearestFragmentEvent(ev);\r\n                selection.hoveredTimeseries.setValue(result.fragment, result.index);\r\n            }\r\n        });\r\n        selection.hoveredTimeseries.changed.on(redraw);\r\n\r\n        rowContentPane.mouseExit.on(function () {\r\n            selection.hoveredTimeseries.clearValue();\r\n        });\r\n\r\n        rowContentPane.mouseDown.on(function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent)) {\r\n                timeseriesDragMode = chooseTimeseriesDragMode(ui, selection.hoveredTimeseries.fragment);\r\n            }\r\n        });\r\n\r\n        rowContentPane.mouseMove.on(function (ev: PointerEvent) {\r\n\r\n            if (hasval(timeseriesDragMode)) {\r\n                const x: number = timeAtPointer_PMILLIS(ev);\r\n                const y: number = dataAxis.vAtFrac(yFrac(ev));\r\n\r\n                const fragment = selection.hoveredTimeseries.fragment;\r\n                const fragment_time = fragment.times_PMILLIS;\r\n\r\n                if (timeseriesDragMode === 'y') {\r\n                    fragment.setData(selection.hoveredTimeseries.index, y);\r\n                }\r\n                else if (timeseriesDragMode === 'xy') {\r\n                    const index = fragment.setData(selection.hoveredTimeseries.index, y, x);\r\n                    if (index !== selection.hoveredTimeseries.index) {\r\n                        selection.hoveredTimeseries.setValue(fragment, index);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n        // Finish event-drag\r\n        //\r\n\r\n        rowContentPane.mouseUp.on(function (ev: PointerEvent) {\r\n            timeseriesDragMode = null;\r\n        });\r\n\r\n        rowContentPane.dispose.on(function () {\r\n\r\n            rowUi.removePane(keyPrefix + 'content');\r\n            rowUi.removePane(keyPrefix + 'overlay');\r\n            rowUi.removePane(keyPrefix + 'underlay');\r\n            rowUi.removePane(keyPrefix + 'y-axis');\r\n\r\n            dataAxis.limitsChanged.off(redraw);\r\n\r\n            row.timeseriesGuids.valueAdded.off(redraw);\r\n            row.timeseriesGuids.valueMoved.off(redraw);\r\n            row.timeseriesGuids.valueRemoved.off(redraw);\r\n\r\n            row.timeseriesGuids.valueAdded.off(addRedraw);\r\n            row.timeseriesGuids.valueRemoved.off(removeRedraw);\r\n\r\n            selection.hoveredTimeseries.changed.off(redraw);\r\n\r\n            row.attrsChanged.off(updateRowHeight);\r\n\r\n            row.timeseriesGuids.forEach(function (timeseriesGuid: string) {\r\n                const timeseries = model.timeseries(timeseriesGuid);\r\n                timeseries.attrsChanged.off(redraw);\r\n                timeseries.fragmentGuids.valueAdded.off(redraw);\r\n                timeseries.fragmentGuids.valueRemoved.off(redraw);\r\n            });\r\n        });\r\n\r\n        return underlayPane;\r\n    };\r\n}\r\n\r\nexport function newTimeseriesPainterFactory(options?: TimelineTimeseriesPainterOptions): TimelineTimeseriesPainterFactory {\r\n    // Painter Factory\r\n    return function (drawable: Drawable, timeAxis: TimeAxis1D, dataAxis: Axis1D, model: TimelineModel, rowModel: TimelineRowModel, ui: TimelineUi): Painter {\r\n\r\n        const selection: TimelineSelectionModel = ui.selection;\r\n        const defaultColor = hasval(options) && hasval(options.timelineFgColor) ? options.timelineFgColor : white;\r\n        const defaultThickness = hasval(options) && hasval(options.timelineThickness) ? options.timelineThickness : 1;\r\n\r\n        const modelview_line_VERTSHADER = concatLines(\r\n            '    uniform mat4 u_modelViewMatrix;                       ',\r\n            '    attribute vec4 a_Position;                            ',\r\n            '    attribute float a_Distance;                           ',\r\n            '    varying float v_Distance;                             ',\r\n            '    uniform float u_PointSize;                            ',\r\n            '                                                          ',\r\n            '    void main( ) {                                        ',\r\n            '        gl_PointSize = u_PointSize ;                      ',\r\n            '        gl_Position = u_modelViewMatrix * a_Position ;    ',\r\n            '        v_Distance = a_Distance;                          ',\r\n            '    }                                                     ',\r\n            '                                                          '\r\n        );\r\n\r\n        const modelview_pointsize_VERTSHADER = concatLines(\r\n            '    uniform mat4 u_modelViewMatrix;                       ',\r\n            '    attribute vec4 a_Position;                            ',\r\n            '    uniform float u_PointSize;                            ',\r\n            '                                                          ',\r\n            '    void main( ) {                                        ',\r\n            '        gl_PointSize = u_PointSize ;                      ',\r\n            '        gl_Position = u_modelViewMatrix * a_Position ;    ',\r\n            '    }                                                     ',\r\n            '                                                          '\r\n        );\r\n\r\n        const program = new Program(modelview_pointsize_VERTSHADER, solid_FRAGSHADER);\r\n\r\n        const u_Color = new UniformColor(program, 'u_Color');\r\n        const u_modelViewMatrix = new UniformMatrix4f(program, 'u_modelViewMatrix');\r\n        const a_Position = new Attribute(program, 'a_Position');\r\n        const u_PointSize = new Uniform1f(program, 'u_PointSize');\r\n\r\n        const lineProgram = new Program(modelview_line_VERTSHADER, dash_FRAGSHADER);\r\n        const u_lpColor = new UniformColor(lineProgram, 'u_Color');\r\n        const u_lpmodelViewMatrix = new UniformMatrix4f(lineProgram, 'u_modelViewMatrix');\r\n        const a_lpPosition = new Attribute(lineProgram, 'a_Position');\r\n        const u_lpPointSize = new Uniform1f(lineProgram, 'u_PointSize');\r\n        const a_lpDistance = new Attribute(lineProgram, 'a_Distance');\r\n        const u_lpDash = new Uniform1f(lineProgram, 'u_Dash');\r\n\r\n        const axis = new Axis2D(timeAxis, dataAxis);\r\n\r\n        let xys = new Float32Array(0);\r\n        let dists = new Float32Array(0);\r\n        const xysBuffer = newDynamicBuffer();\r\n        const distBuffer = newDynamicBuffer();\r\n\r\n        // Painter\r\n        return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            let baseline = 0;\r\n\r\n            for (let i = 0; i < rowModel.timeseriesGuids.length; i++) {\r\n                // collect fragments and sort them by time\r\n                let totalSize = 0;\r\n                const sortedFragments = new Array<TimelineTimeseriesFragmentModel>();\r\n                const timeseriesGuid = rowModel.timeseriesGuids.valueAt(i);\r\n                const timeseries = model.timeseries(timeseriesGuid);\r\n                for (let j = 0; j < timeseries.fragmentGuids.length; j++) {\r\n                    const timeseriesFragmentGuid = timeseries.fragmentGuids.valueAt(j);\r\n                    const fragment = model.timeseriesFragment(timeseriesFragmentGuid);\r\n\r\n                    sortedFragments.push(fragment);\r\n                    totalSize += fragment.times_PMILLIS.length;\r\n                }\r\n                sortedFragments.sort((a, b) => a.start_PMILLIS - b.start_PMILLIS);\r\n\r\n                if (timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) {\r\n\r\n                    // enable the shader\r\n                    lineProgram.use(gl);\r\n\r\n                    u_lpmodelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n                    const size = totalSize * 2;\r\n\r\n                    xys = ensureCapacityFloat32(xys, size);\r\n                    dists = ensureCapacityFloat32(dists, totalSize);\r\n\r\n                    let index = 0;\r\n                    for (let j = 0; j < sortedFragments.length; j++) {\r\n                        const fragment = sortedFragments[j];\r\n                        const data: number[] = fragment.data;\r\n                        const times_PMILLIS: number[] = fragment.times_PMILLIS;\r\n\r\n                        for (let k = 0; k < data.length; k++ , index += 2) {\r\n                            xys[index] = timeAxis.vAtTime(times_PMILLIS[k]);\r\n                            xys[index + 1] = data[k];\r\n                            if (k !== 0) {\r\n                                const x = (timeAxis.vAtTime(times_PMILLIS[k]) - timeAxis.vAtTime(times_PMILLIS[k - 1]));\r\n                                const y = data[k] - data[k - 1];\r\n                                dists[k] = dists[k - 1] + Math.sqrt(x * x + y * y);\r\n                            }\r\n                            else {\r\n                                dists[k] = 0;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor;\r\n                    u_lpColor.setData(gl, lineColor);\r\n\r\n                    const dash = hasval(timeseries.dash) ? timeseries.dash : 0;\r\n                    u_lpDash.setData(gl, dash);\r\n\r\n                    const lineThickness = hasval(timeseries.lineThickness) ? timeseries.lineThickness : defaultThickness;\r\n                    gl.lineWidth(lineThickness);\r\n\r\n                    xysBuffer.setData(xys.subarray(0, index));\r\n                    a_lpPosition.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                    distBuffer.setData(dists.subarray(0, totalSize));\r\n                    a_lpDistance.setDataAndEnable(gl, distBuffer, 1, GL.FLOAT);\r\n\r\n                    if (timeseries.uiHint === 'lines' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) {\r\n                        // draw the lines\r\n                        gl.drawArrays(GL.LINE_STRIP, 0, size / 2);\r\n                    }\r\n\r\n                    // point size works in WebKit and actually works in Minefield as well even though\r\n                    // VERTEX_PROGRAM_POINT_SIZE and POINT_SMOOTH aren't defined\r\n                    if (timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points') {\r\n\r\n                        const pointColor = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor;\r\n                        u_Color.setData(gl, pointColor);\r\n\r\n                        u_PointSize.setData(gl, timeseries.pointSize);\r\n\r\n                        gl.drawArrays(GL.POINTS, 0, size / 2);\r\n                    }\r\n                    lineProgram.endUse(gl);\r\n                }\r\n                else if (timeseries.uiHint === 'bars') {\r\n                    // enable the shader\r\n                    program.use(gl);\r\n                    u_modelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n                    // The last data point defines the right edge of the bar\r\n                    // but it does not have its own bar drawn, so we need at\r\n                    // least 2 data points to draw any bars\r\n                    if (totalSize >= 2) {\r\n                        baseline = timeseries.baseline;\r\n\r\n                        const size = (totalSize - 1) * 12;\r\n                        xys = ensureCapacityFloat32(xys, size);\r\n\r\n                        let index = 0;\r\n                        for (let j = 0; j < sortedFragments.length; j++) {\r\n                            const fragment = sortedFragments[j];\r\n                            const data: number[] = fragment.data;\r\n                            const times_PMILLIS: number[] = fragment.times_PMILLIS;\r\n\r\n                            for (let k = 0; k < data.length - 1; k++) {\r\n                                const x1 = timeAxis.vAtTime(times_PMILLIS[k]);\r\n                                const y1 = data[k];\r\n\r\n                                const x2 = timeAxis.vAtTime(times_PMILLIS[k + 1]);\r\n                                const y2 = data[k + 1];\r\n\r\n                                index = putQuadXys(xys, index, x1, x2, y1, baseline);\r\n                            }\r\n                        }\r\n\r\n                        const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor;\r\n                        u_Color.setData(gl, lineColor);\r\n\r\n                        xysBuffer.setData(xys.subarray(0, index));\r\n                        a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                        gl.drawArrays(GL.TRIANGLES, 0, size / 2);\r\n                    }\r\n                    program.endUse(gl);\r\n                }\r\n                else if (timeseries.uiHint === 'area') {\r\n                    // enable the shader\r\n                    program.use(gl);\r\n                    u_modelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n\r\n                    baseline = timeseries.baseline;\r\n\r\n                    const size = totalSize * 4;\r\n\r\n                    // the last data point defines the right edge of the bar\r\n                    // but it does not have its own bar drawn\r\n                    xys = ensureCapacityFloat32(xys, size);\r\n\r\n                    let index = 0;\r\n                    for (let j = 0; j < sortedFragments.length; j++) {\r\n                        const fragment = sortedFragments[j];\r\n                        const data: number[] = fragment.data;\r\n                        const times_PMILLIS: number[] = fragment.times_PMILLIS;\r\n\r\n                        for (let k = 0; k < data.length; k++ , index += 4) {\r\n                            const x1 = timeAxis.vAtTime(times_PMILLIS[k]);\r\n                            const y1 = data[k];\r\n\r\n                            xys[index] = x1;\r\n                            xys[index + 1] = baseline;\r\n\r\n                            xys[index + 2] = x1;\r\n                            xys[index + 3] = y1;\r\n                        }\r\n                    }\r\n\r\n                    const lineColor = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor;\r\n                    u_Color.setData(gl, lineColor);\r\n\r\n                    xysBuffer.setData(xys.subarray(0, index));\r\n                    a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                    gl.drawArrays(GL.TRIANGLE_STRIP, 0, size / 2);\r\n\r\n                    program.endUse(gl);\r\n                }\r\n\r\n                // highlight hovered point\r\n                if (selection.hoveredTimeseries.fragment && timeseries.fragmentGuids.hasValue(selection.hoveredTimeseries.fragment.fragmentGuid)) {\r\n                    // enable the shader\r\n                    program.use(gl);\r\n                    u_modelViewMatrix.setData(gl, glOrthoAxis(axis));\r\n\r\n                    if (timeseries.uiHint === 'area' || timeseries.uiHint === 'lines' || timeseries.uiHint === 'points' || timeseries.uiHint === 'lines-and-points' || timeseries.uiHint === undefined) {\r\n                        const size = 8;\r\n                        xys = ensureCapacityFloat32(xys, size);\r\n\r\n                        const vppx: number = timeAxis.vSize / viewport.w;\r\n                        const vppy: number = dataAxis.vSize / viewport.h;\r\n\r\n                        const highlightSize = hasval(timeseries.pointSize) ? timeseries.pointSize : 5;\r\n\r\n                        const bufferx = (highlightSize / 2) * vppx;\r\n                        const buffery = (highlightSize / 2) * vppy;\r\n\r\n                        const fragment = selection.hoveredTimeseries.fragment;\r\n                        const y = selection.hoveredTimeseries.data;\r\n                        const x = timeAxis.vAtTime(selection.hoveredTimeseries.times_PMILLIS);\r\n\r\n                        xys[0] = x - bufferx; xys[1] = y - buffery;\r\n                        xys[2] = x + bufferx; xys[3] = y - buffery;\r\n                        xys[4] = x + bufferx; xys[5] = y + buffery;\r\n                        xys[6] = x - bufferx; xys[7] = y + buffery;\r\n\r\n                        const color = hasval(timeseries.pointColor) ? timeseries.pointColor : defaultColor;\r\n                        u_Color.setData(gl, darker(color, 0.8));\r\n\r\n                        xysBuffer.setData(xys.subarray(0, size));\r\n                        a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                        gl.drawArrays(GL.LINE_LOOP, 0, size / 2);\r\n                    }\r\n                    else if (timeseries.uiHint === 'bars') {\r\n                        const size = 8;\r\n                        xys = ensureCapacityFloat32(xys, size);\r\n\r\n                        const fragment = selection.hoveredTimeseries.fragment;\r\n                        const index = selection.hoveredTimeseries.index;\r\n\r\n                        if (index < fragment.data.length) {\r\n                            const x1 = timeAxis.vAtTime(fragment.times_PMILLIS[index]);\r\n                            const y1 = fragment.data[index];\r\n\r\n                            const x2 = timeAxis.vAtTime(fragment.times_PMILLIS[index + 1]);\r\n                            const y2 = fragment.data[index + 1];\r\n\r\n                            xys[0] = x1; xys[1] = y1;\r\n                            xys[2] = x2; xys[3] = y1;\r\n                            xys[4] = x2; xys[5] = baseline;\r\n                            xys[6] = x1; xys[7] = baseline;\r\n\r\n                            const color = hasval(timeseries.lineColor) ? timeseries.lineColor : defaultColor;\r\n                            u_Color.setData(gl, darker(color, 0.8));\r\n\r\n                            xysBuffer.setData(xys.subarray(0, size));\r\n                            a_Position.setDataAndEnable(gl, xysBuffer, 2, GL.FLOAT);\r\n\r\n                            gl.drawArrays(GL.LINE_LOOP, 0, size / 2);\r\n                        }\r\n                    }\r\n                    program.endUse(gl);\r\n                }\r\n            }\r\n\r\n            // disable shader and attribute buffers\r\n            a_Position.disable(gl);\r\n            a_lpDistance.disable(gl);\r\n        };\r\n    };\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { newTimeseriesPainterFactory, newTimeseriesRowPaneFactory, TimelineTimeseriesPainterFactory } from './timeline_timeseries_row';\r\nimport { newTimeseriesAnnotationPainterFactory } from './timeline_annotation_painter';\r\nimport { newTimeseriesCursorPainterFactory } from './timeline_cursor_painter';\r\nimport { TimelineRowPaneFactory } from './timeline_row';\r\nimport { newEventsRowPaneFactory, newEventLimitsPainterFactory, newEventBarsPainterFactory, newEventIconsPainterFactory, newEventLabelsPainterFactory, newEventStripedBarsPainterFactory, newEventDashedBordersPainterFactory, JointType, newCombinedEventPainterFactory } from './timeline_events_row';\r\nimport { TimelineRowModel } from './timeline_model';\r\nimport { Color } from '../color';\r\n\r\n// Default\r\n//\r\n\r\nexport let timeseriesRowPainterFactories_DEFAULT: TimelineTimeseriesPainterFactory[] = [\r\n    newTimeseriesPainterFactory(),\r\n    newTimeseriesAnnotationPainterFactory(),\r\n    newTimeseriesCursorPainterFactory({\r\n        font: '16px verdana,sans-serif',\r\n        buffer_px: 6\r\n    })\r\n];\r\n\r\nexport let eventsRowPaneFactory_DEFAULT: TimelineRowPaneFactory = newEventsRowPaneFactory({\r\n    laneHeight: 40,\r\n    painterFactories: [\r\n        newEventLimitsPainterFactory(),\r\n        newEventBarsPainterFactory(),\r\n        newEventIconsPainterFactory(),\r\n        newEventLabelsPainterFactory({\r\n            iconsSizeFactor: 0.7\r\n        })\r\n    ]\r\n});\r\n\r\nexport let timeseriesRowPaneFactory_DEFAULT: TimelineRowPaneFactory = newTimeseriesRowPaneFactory({\r\n    painterFactories: timeseriesRowPainterFactories_DEFAULT,\r\n    axisOptions: { tickSpacing: 34 }\r\n});\r\n\r\nexport function rowPaneFactoryChooser_DEFAULT(row: TimelineRowModel): TimelineRowPaneFactory {\r\n    if (!row.eventGuids.isEmpty) {\r\n        return eventsRowPaneFactory_DEFAULT;\r\n    }\r\n    else if (!row.timeseriesGuids.isEmpty) {\r\n        return timeseriesRowPaneFactory_DEFAULT;\r\n    }\r\n    else {\r\n        return null;\r\n    }\r\n}\r\n\r\n\r\n\r\n// Thin\r\n//\r\n\r\nexport let eventsRowPaneFactory_THIN: TimelineRowPaneFactory = newEventsRowPaneFactory({\r\n    rowTopPadding: 0,\r\n    rowBottomPadding: 0,\r\n    laneHeight: 23,\r\n    allowMultipleLanes: true,\r\n    painterFactories: [\r\n        newEventLimitsPainterFactory({\r\n            lineColor: new Color(1, 0, 0, 1),\r\n            lineThickness: 2\r\n        }),\r\n        newEventStripedBarsPainterFactory({\r\n            bottomMargin: 0,\r\n            topMargin: 13,\r\n            minimumVisibleWidth: 0,\r\n            stripeSlant: -1,\r\n            stripeSecondaryWidth: 10,\r\n            stripeWidth: 10\r\n        }),\r\n        newEventDashedBordersPainterFactory({\r\n            bottomMargin: 0,\r\n            topMargin: 13,\r\n            minimumVisibleWidth: 0,\r\n            cornerType: JointType.MITER,\r\n            dashLength: 5\r\n        }),\r\n        newEventIconsPainterFactory({\r\n            bottomMargin: 0,\r\n            topMargin: 13,\r\n            vAlign: 0.0\r\n        }),\r\n        newEventLabelsPainterFactory({\r\n            bottomMargin: 12,\r\n            topMargin: 0,\r\n            leftMargin: 2,\r\n            rightMargin: 2,\r\n            vAlign: 0.0,\r\n            spacing: 2,\r\n            extendBeyondBar: false,\r\n            textMode: 'truncate'\r\n        })\r\n    ]\r\n});\r\n\r\nexport function rowPaneFactoryChooser_THIN(row: TimelineRowModel): TimelineRowPaneFactory {\r\n    if (!row.eventGuids.isEmpty) {\r\n        return eventsRowPaneFactory_THIN;\r\n    }\r\n    else if (!row.timeseriesGuids.isEmpty) {\r\n        return timeseriesRowPaneFactory_DEFAULT;\r\n    }\r\n    else {\r\n        return null;\r\n    }\r\n}\r\n\r\nexport let eventsRowPaneFactory_SINGLE: TimelineRowPaneFactory = newEventsRowPaneFactory({\r\n    rowTopPadding: 0,\r\n    rowBottomPadding: 0,\r\n    laneHeight: 23,\r\n    allowMultipleLanes: false,\r\n    painterFactories: [\r\n        newEventLimitsPainterFactory({\r\n            lineColor: new Color(1, 0, 0, 1),\r\n            lineThickness: 2\r\n        }),\r\n        newCombinedEventPainterFactory(\r\n            {\r\n                bottomMargin: 0,\r\n                topMargin: 13,\r\n                minimumVisibleWidth: 0,\r\n                cornerType: JointType.MITER\r\n            },\r\n            {\r\n                bottomMargin: 12,\r\n                topMargin: 0,\r\n                leftMargin: 2,\r\n                rightMargin: 2,\r\n                vAlign: 0.0,\r\n                spacing: 2,\r\n                extendBeyondBar: false,\r\n                textMode: 'show'\r\n            },\r\n            {\r\n                bottomMargin: 0,\r\n                topMargin: 13,\r\n                vAlign: 0.0\r\n            }\r\n        )\r\n    ]\r\n});\r\n\r\nexport function rowPaneFactoryChooser_SINGLE(row: TimelineRowModel): TimelineRowPaneFactory {\r\n    if (!row.eventGuids.isEmpty) {\r\n        return eventsRowPaneFactory_SINGLE;\r\n    }\r\n    else if (!row.timeseriesGuids.isEmpty) {\r\n        return timeseriesRowPaneFactory_DEFAULT;\r\n    }\r\n    else {\r\n        return null;\r\n    }\r\n}\r\n\r\n","/*\r\n * Copyright (c) 2014, Metron, Inc.\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without modification,\r\n * are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice, this\r\n *    list of conditions and the following disclaimer.\r\n *\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n *\r\n * 3. Neither the name of the copyright holder nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software without\r\n *    specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\nimport { Pane, Layout, Drawable, PointerEvent, xFrac, Mask2D, Painter, isLeftMouseDown, LayoutPhase1 } from '../core';\r\nimport { TimelineModel, TimelineRowModel, TimelineGroupModel, TimelineGroup } from './timeline_model';\r\nimport { TimelineUi, TimeIntervalModel, TimelineInput } from './timeline_ui';\r\nimport { TimelineRowPaneFactoryChooser, TimelineRowPaneFactory } from './timeline_row';\r\nimport { ScrollbarOptions, newVerticalScrollLayout, newVerticalScrollbar, attachTimelineVerticalScrollMouseListeners, VerticalScrollLayout } from '../scroll';\r\nimport { Color, white, rgb, gray, rgba } from '../color';\r\nimport { TimeAxisFormatOptions, newTimeAxisPainter } from './time_axis_painter';\r\nimport { Insets, newInsets, newInsetPane, newInsetLayout } from '../layout/inset_layout';\r\nimport { TimeAxis1D } from './time_axis';\r\nimport { rowPaneFactoryChooser_DEFAULT } from './timeline_styles';\r\nimport { axisZoomStep, Axis1D } from '../plot/axis';\r\nimport { newColumnLayout } from '../layout/column_layout';\r\nimport { newCardLayout } from '../layout/card_layout';\r\nimport { newRowLayout } from '../layout/row_layout';\r\nimport { Side, newBackgroundPainter, xyFrac_VERTSHADER, solid_FRAGSHADER, putQuadXys, newSolidPane, Background, Highlight } from '../misc';\r\nimport { newOverlayLayout } from '../layout/overlay_layout';\r\nimport { alwaysTrue, GL, StringMap, hasval, isNumber } from '../util/util';\r\nimport { BoundsUnmodifiable, Size } from '../bounds';\r\nimport { Program, Attribute, UniformColor } from '../shader';\r\nimport { newDynamicBuffer } from '../buffer';\r\nimport { TextureRenderer } from '../texture';\r\nimport { Label, fitToLabel, newLabelPainter } from '../label';\r\nimport { OrderedStringSet } from '../util/ordered_set';\r\nimport { newTimeGridPainter } from './time_grid_painter';\r\nimport { newBorderPainter } from '../painter/border_painter';\r\nimport { createTextTextureFactory } from '../text';\r\n\r\nexport class TimelinePane extends Pane {\r\n    private _model: TimelineModel;\r\n    private _ui: TimelineUi;\r\n\r\n    constructor(layout: Layout, model: TimelineModel, ui: TimelineUi) {\r\n        super(layout, true);\r\n        this._model = model;\r\n        this._ui = ui;\r\n    }\r\n\r\n    get model(): TimelineModel { return this._model; }\r\n    get ui(): TimelineUi { return this._ui; }\r\n}\r\n\r\n\r\n\r\nexport interface TimelinePaneOptions {\r\n\r\n    // Misc\r\n    font?: string;\r\n    rowPaneFactoryChooser?: TimelineRowPaneFactoryChooser;\r\n    cursor?: string;\r\n\r\n    // Scroll\r\n    showScrollbar?: boolean;\r\n    scrollbarOptions?: ScrollbarOptions;\r\n\r\n    // Colors\r\n    fgColor?: Color;\r\n    rowLabelColor?: Color;\r\n    rowLabelBgColor?: Color;\r\n    rowHighlightColor?: Color;\r\n    groupLabelColor?: Color;\r\n    groupHighlightColor?: Color;\r\n    axisLabelColor?: Color;\r\n    bgColor?: Color;\r\n    rowBgColor?: Color;\r\n    rowAltBgColor?: Color;\r\n    gridColor?: Color;\r\n    selectedIntervalFillColor?: Color;\r\n    selectedIntervalBorderColor?: Color;\r\n\r\n    // Axes\r\n    showTopAxis?: boolean;\r\n    showBottomAxis?: boolean;\r\n    topTimeZone?: string;\r\n    bottomTimeZone?: string;\r\n    tickSpacing?: number;\r\n    axisLabelAlign?: number;\r\n    isFuturePositive?: boolean;\r\n    timeAxisFormat?: TimeAxisFormatOptions;\r\n\r\n    // date in time_ISO8601 format (see util.ts:parseTime_PMILLIS)\r\n    // that time labels on the timeline should be referenced from\r\n    // (i.e. Day 1, Day 2...)\r\n    // (if not provided, timeline labels will be in absolute time)\r\n    referenceDate?: string;\r\n\r\n    // Sizing\r\n    groupLabelInsets?: Insets;\r\n    groupHighlightWidth?: number;\r\n    groupHighlightInsets?: Insets;\r\n    rowLabelInsets?: Insets;\r\n    rowLabelPaneWidth?: number;\r\n    rowSeparatorHeight?: number;\r\n    rowHighlightWidth?: number;\r\n    rowHighlightInsets?: Insets;\r\n    scrollbarWidth?: number;\r\n    axisPaneHeight?: number;\r\n    draggableEdgeWidth?: number;\r\n    snapToDistance?: number;\r\n\r\n    // Event / Selection\r\n    allowEventMultiSelection?: boolean;\r\n    // Options:\r\n    // 'none' or any falsy value : no time selection\r\n    // 'single'                  : single selected time\r\n    // 'range'                   : range of selected times\r\n    // 'single-unmodifiable'     : single selected time (cannot be adjusted by user mouse clicks)\r\n    // 'range-unmodifiable'      : range of selected times (cannot be adjusted by user mouse clicks)\r\n    selectedIntervalMode?: string;\r\n    // enable / disable centering of time selection interval on double click\r\n    // (this has no effect for selectedIntervalMode 'none', 'single-unmodifiable', or 'range-unmodifiable'\r\n    //  because mouse controls are off by default in those modes)\r\n    centerSelectedIntervalOnDoubleClick?: boolean;\r\n    // provide a custom listener callback function to modify the default behavior when the mouse\r\n    // scroll wheel is rotate over the timeline (default behavior is to zoom in/out in time)\r\n    mouseWheelListener?: (PointerEvent: PointerEvent) => void;\r\n}\r\n\r\nexport function newTimelinePane(drawable: Drawable, timeAxis: TimeAxis1D, model: TimelineModel, options?: TimelinePaneOptions, ui?: TimelineUi): TimelinePane {\r\n\r\n    // Misc\r\n    const font = (hasval(options) && hasval(options.font) ? options.font : '11px verdana,sans-serif');\r\n    const rowPaneFactoryChooser = (hasval(options) && hasval(options.rowPaneFactoryChooser) ? options.rowPaneFactoryChooser : rowPaneFactoryChooser_DEFAULT);\r\n    const cursor = (hasval(options) && hasval(options.cursor) ? options.cursor : 'auto');\r\n\r\n    // Scroll\r\n    const showScrollbar = (hasval(options) && hasval(options.showScrollbar) ? options.showScrollbar : true);\r\n    const scrollbarOptions = (hasval(options) ? options.scrollbarOptions : null);\r\n\r\n    // Colors\r\n    const fgColor = (hasval(options) && hasval(options.fgColor) ? options.fgColor : white);\r\n    const bgColor = (hasval(options) && hasval(options.bgColor) ? options.bgColor : rgb(0.098, 0.165, 0.243));\r\n    const rowLabelColor = (hasval(options) && hasval(options.rowLabelColor) ? options.rowLabelColor : fgColor);\r\n    const rowLabelBgColor = (hasval(options) && hasval(options.rowLabelBgColor) ? options.rowLabelBgColor : bgColor);\r\n    const rowHighlightColor = (hasval(options) && hasval(options.rowHighlightColor) ? options.rowHighlightColor : rgb(1, 0.623, 0));\r\n    const groupLabelColor = (hasval(options) && hasval(options.groupLabelColor) ? options.groupLabelColor : fgColor);\r\n    const groupHighlightColor = (hasval(options) && hasval(options.groupHighlightColor) ? options.groupHighlightColor : rgb(0, 1, 1));\r\n    const axisLabelColor = (hasval(options) && hasval(options.axisLabelColor) ? options.axisLabelColor : fgColor);\r\n    const rowBgColor = (hasval(options) && hasval(options.rowBgColor) ? options.rowBgColor : rgb(0.020, 0.086, 0.165));\r\n    const rowAltBgColor = (hasval(options) && hasval(options.rowAltBgColor) ? options.rowAltBgColor : rgb(0.020, 0.086, 0.165));\r\n    const gridColor = (hasval(options) && hasval(options.gridColor) ? options.gridColor : gray(0.5));\r\n    const selectedIntervalFillColor = (hasval(options) && hasval(options.selectedIntervalFillColor) ? options.selectedIntervalFillColor : rgba(0, 0.6, 0.8, 0.157));\r\n    const selectedIntervalBorderColor = (hasval(options) && hasval(options.selectedIntervalBorderColor) ? options.selectedIntervalBorderColor : rgb(0, 0.2, 1.0));\r\n\r\n    // Axes\r\n    const showTopAxis = (hasval(options) && hasval(options.showTopAxis) ? options.showTopAxis : true);\r\n    const showBottomAxis = (hasval(options) && hasval(options.showBottomAxis) ? options.showBottomAxis : true);\r\n    const topTimeZone = (hasval(options) && hasval(options.topTimeZone) ? options.topTimeZone : '+0000');\r\n    const bottomTimeZone = (hasval(options) && hasval(options.bottomTimeZone) ? options.bottomTimeZone : '+0000');\r\n    const tickSpacing = (hasval(options) && hasval(options.tickSpacing) ? options.tickSpacing : 60);\r\n    const axisLabelAlign = (hasval(options) && hasval(options.axisLabelAlign) ? options.axisLabelAlign : 0.5);\r\n\r\n    // Sizing\r\n    const groupLabelInsets = (hasval(options) && hasval(options.groupLabelInsets) ? options.groupLabelInsets : newInsets(6, 10));\r\n    const groupHighlightWidth = (hasval(options) && hasval(options.groupHighlightWidth) ? options.groupHighlightWidth : 2);\r\n    const groupHighlightInsets = (hasval(options) && hasval(options.groupHighlightInsets) ? options.groupHighlightInsets : newInsets(6, 0, 2, 4));\r\n    const rowLabelInsets = (hasval(options) && hasval(options.rowLabelInsets) ? options.rowLabelInsets : newInsets(0, 35));\r\n    const rowLabelPaneWidth = (hasval(options) && hasval(options.rowLabelPaneWidth) ? options.rowLabelPaneWidth : 140);\r\n    const rowHighlightWidth = (hasval(options) && hasval(options.rowHighlightWidth) ? options.rowHighlightWidth : 2);\r\n    const rowHighlightInsets = (hasval(options) && hasval(options.rowHighlightInsets) ? options.rowHighlightInsets : newInsets(1, 0, 2, 10));\r\n    const rowSeparatorHeight = (hasval(options) && hasval(options.rowSeparatorHeight) ? options.rowSeparatorHeight : 2);\r\n    let scrollbarWidth = (hasval(options) && hasval(options.scrollbarWidth) ? options.scrollbarWidth : 16);\r\n    scrollbarWidth = showScrollbar ? scrollbarWidth : 0; // if the scrollbar is not showing, set its width to 0\r\n    const axisPaneHeight = (hasval(options) && hasval(options.axisPaneHeight) ? options.axisPaneHeight : 40);\r\n    const draggableEdgeWidth = (hasval(options) && hasval(options.draggableEdgeWidth) ? options.draggableEdgeWidth : 6);\r\n    const snapToDistance = (hasval(options) && hasval(options.snapToDistance) ? options.snapToDistance : 10);\r\n\r\n    // Event / Selection\r\n    const allowEventMultiSelection = (hasval(options) && hasval(options.allowEventMultiSelection) ? options.allowEventMultiSelection : true);\r\n    const selectedIntervalMode = (hasval(options) && hasval(options.selectedIntervalMode) ? options.selectedIntervalMode : 'range');\r\n    const centerSelectedIntervalOnDoubleClick = (hasval(options) && hasval(options.centerSelectedIntervalOnDoubleClick) ? options.centerSelectedIntervalOnDoubleClick : true);\r\n    const defaultMouseWheelListener = function (ev: PointerEvent) {\r\n        const zoomFactor = Math.pow(axisZoomStep, ev.wheelSteps);\r\n        timeAxis.zoom(zoomFactor, timeAxis.vAtFrac(xFrac(ev)));\r\n    };\r\n    const mouseWheelListener = (hasval(options) && hasval(options.mouseWheelListener) ? options.mouseWheelListener : defaultMouseWheelListener);\r\n\r\n    let outsideManagedUi = false;\r\n    if (!ui) {\r\n        outsideManagedUi = false;\r\n        ui = new TimelineUi(model, { allowEventMultiSelection: allowEventMultiSelection });\r\n    }\r\n    else {\r\n        // remove old panes (if the ui is being reused)\r\n        outsideManagedUi = true;\r\n        ui.panes.removeAll();\r\n    }\r\n\r\n    const selection = ui.selection;\r\n\r\n    const redraw = function () {\r\n        drawable.redraw();\r\n    };\r\n    selection.selectedInterval.changed.on(redraw);\r\n    selection.hoveredEvent.changed.on(redraw);\r\n    selection.selectedEvents.valueAdded.on(redraw);\r\n    selection.selectedEvents.valueRemoved.on(redraw);\r\n\r\n    // even if the model defines cursors, we may need to redraw when the mouse position changes\r\n    // (we might not actually need to if: none of the rows actually use the cursor, or if the\r\n    //  cursor doesn't show a vertical or horizontal line)\r\n    // this check just avoids redrawing unncessarily in the easy-to-verify common case where\r\n    // no cursors are defined\r\n    const redrawCursor = function () {\r\n        if (!model.cursors.isEmpty) {\r\n            drawable.redraw();\r\n        }\r\n    };\r\n\r\n    selection.hoveredY.changed.on(redrawCursor);\r\n    selection.hoveredTime_PMILLIS.changed.on(redrawCursor);\r\n\r\n    // Scroll Pane and Maximized Row Pane\r\n    //\r\n\r\n    // setup Pane which either shows timeline content, or only maximized rows\r\n    // able to switch between the two depending on model.root.maximizedRowGuids.isEmpty\r\n\r\n    // Scroll Pane\r\n\r\n    const tickTimeZone = (showTopAxis ? topTimeZone : bottomTimeZone);\r\n    const contentPaneOpts = { selectedIntervalMode: selectedIntervalMode, rowPaneFactoryChooser: rowPaneFactoryChooser, font: font, fgColor: fgColor, rowLabelColor: rowLabelColor, rowLabelBgColor: rowLabelBgColor, rowHighlightColor: rowHighlightColor, groupLabelColor: groupLabelColor, groupHighlightColor: groupHighlightColor, axisLabelColor: axisLabelColor, bgColor: bgColor, rowBgColor: rowBgColor, rowAltBgColor: rowAltBgColor, gridColor: gridColor, gridTickSpacing: tickSpacing, gridTimeZone: tickTimeZone, referenceDate: options.referenceDate, groupLabelInsets: groupLabelInsets, groupHighlightWidth: groupHighlightWidth, groupHighlightInsets: groupHighlightInsets, rowLabelInsets: rowLabelInsets, rowLabelPaneWidth: rowLabelPaneWidth, rowHighlightWidth: rowHighlightWidth, rowHighlightInsets: rowHighlightInsets, rowSeparatorHeight: rowSeparatorHeight, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, mouseWheelListener: mouseWheelListener };\r\n    let contentPaneArgs;\r\n    let contentPane: Pane = null;\r\n\r\n    if (showScrollbar) {\r\n\r\n        const scrollLayout = newVerticalScrollLayout();\r\n        const scrollable = new Pane(scrollLayout, false);\r\n        ui.addPane('scroll-content-pane', scrollable);\r\n\r\n        contentPaneArgs = { drawable: drawable, scrollLayout: scrollLayout, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts };\r\n\r\n        const scrollContentPane = newTimelineContentPane(contentPaneArgs);\r\n        ui.addPane('content-pane', scrollContentPane);\r\n\r\n        scrollable.addPane(scrollContentPane, 0);\r\n\r\n        const scrollbar = newVerticalScrollbar(scrollLayout, drawable, scrollbarOptions);\r\n        ui.addPane('scrollbar', scrollbar);\r\n\r\n        contentPane = new Pane(newColumnLayout(false), false);\r\n        ui.addPane('scroll-outer-pane', contentPane);\r\n\r\n        contentPane.addPane(scrollbar, 0, { width: scrollbarWidth, ignoreHeight: true });\r\n        contentPane.addPane(scrollable, 1);\r\n\r\n    }\r\n    else {\r\n\r\n        contentPaneArgs = { drawable: drawable, scrollLayout: null, timeAxis: timeAxis, model: model, ui: ui, options: contentPaneOpts };\r\n        contentPane = newTimelineContentPane(contentPaneArgs);\r\n        ui.addPane('content-pane', contentPane);\r\n\r\n    }\r\n\r\n    // Card Pane Switching Logic\r\n\r\n    const timelineCardPane = new Pane(newCardLayout());\r\n    ui.addPane('switch-content-pane', timelineCardPane);\r\n\r\n    const maximizedContentPane = new Pane(newRowLayout());\r\n    ui.addPane('maximize-content-pane', maximizedContentPane);\r\n\r\n    const insetMaximizedContentPane = newInsetPane(maximizedContentPane, newInsets(0, scrollbarWidth, 0, 0));\r\n    ui.addPane('inset-maximize-content-pane', insetMaximizedContentPane);\r\n\r\n    const contentActive = model.root.maximizedRowGuids.isEmpty;\r\n    timelineCardPane.addPane(insetMaximizedContentPane, !contentActive);\r\n    timelineCardPane.addPane(contentPane, contentActive);\r\n\r\n    setupRowContainerPane(contentPaneArgs, maximizedContentPane, model.root.maximizedRowGuids, true, 'maximized');\r\n\r\n    const updateMaximizedRows = function (rowGuid: string, rowIndex: number) {\r\n        const contentActiveInner = model.root.maximizedRowGuids.isEmpty;\r\n        timelineCardPane.setLayoutArg(insetMaximizedContentPane, !contentActiveInner);\r\n        timelineCardPane.setLayoutArg(contentPane, contentActiveInner);\r\n        drawable.redraw();\r\n    };\r\n\r\n    model.root.maximizedRowGuids.valueAdded.on(updateMaximizedRows);\r\n    model.root.maximizedRowGuids.valueRemoved.on(updateMaximizedRows);\r\n\r\n    // Overlay and Underlay Panes\r\n    //\r\n\r\n    const underlayPane = new Pane(newRowLayout());\r\n    ui.addPane('underlay-pane', underlayPane);\r\n\r\n    const axisInsets = newInsets(0, scrollbarWidth, 0, rowLabelPaneWidth);\r\n\r\n    // top time axis pane\r\n    const axisOpts = { tickSpacing: tickSpacing, font: font, textColor: axisLabelColor, tickColor: axisLabelColor, labelAlign: axisLabelAlign, referenceDate: options.referenceDate, isFuturePositive: options.isFuturePositive, timeAxisFormat: options.timeAxisFormat };\r\n    if (showTopAxis) {\r\n        const topAxisPane = newTimeAxisPane(contentPaneArgs, null, cursor);\r\n        ui.addPane('top-axis-pane', topAxisPane);\r\n        topAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.TOP, topTimeZone, tickTimeZone, axisOpts));\r\n        underlayPane.addPane(newInsetPane(topAxisPane, axisInsets), 0, { height: axisPaneHeight, width: null });\r\n    }\r\n\r\n    // pane containing pinned rows specified in TimelineRoot.topPinnedRowGuids\r\n    const topPinnedPane = new Pane(newRowLayout());\r\n    ui.addPane('top-pinned-pane', topPinnedPane);\r\n\r\n    const insetTopPinnedPane = newInsetPane(topPinnedPane, newInsets(0, scrollbarWidth, 0, 0));\r\n    ui.addPane('inset-top-pinned-pane', insetTopPinnedPane);\r\n\r\n    setupRowContainerPane(contentPaneArgs, topPinnedPane, model.root.topPinnedRowGuids, false, 'toppinned');\r\n    underlayPane.addPane(insetTopPinnedPane, 1);\r\n\r\n    // main pane containing timeline groups and rows\r\n    underlayPane.addPane(timelineCardPane, 2, { height: 'pref-max', width: null });\r\n\r\n    // pane containing pinned rows specified in TimelineRoot.bottomPinnedRowGuids\r\n    const bottomPinnedPane = new Pane(newRowLayout());\r\n    ui.addPane('bottom-pinned-pane', bottomPinnedPane);\r\n\r\n    const insetBottomPinnedPane = newInsetPane(bottomPinnedPane, newInsets(0, scrollbarWidth, 0, 0));\r\n    ui.addPane('inset-bottom-pinned-pane', insetBottomPinnedPane);\r\n\r\n    setupRowContainerPane(contentPaneArgs, bottomPinnedPane, model.root.bottomPinnedRowGuids, false, 'bottompinned');\r\n    underlayPane.addPane(insetBottomPinnedPane, 3);\r\n\r\n    // bottom time axis pane\r\n    if (showBottomAxis) {\r\n        const bottomAxisPane = newTimeAxisPane(contentPaneArgs, null, cursor);\r\n        ui.addPane('bottom-axis-pane', bottomAxisPane);\r\n        bottomAxisPane.addPainter(newTimeAxisPainter(timeAxis, Side.BOTTOM, bottomTimeZone, tickTimeZone, axisOpts));\r\n        underlayPane.addPane(newInsetPane(bottomAxisPane, axisInsets), 4, { height: axisPaneHeight, width: null });\r\n    }\r\n\r\n    const updateMillisPerPx = function () {\r\n        const w = underlayPane.viewport.w - axisInsets.left - axisInsets.right;\r\n        ui.millisPerPx.value = timeAxis.tSize_MILLIS / w;\r\n    };\r\n    underlayPane.viewportChanged.on(updateMillisPerPx);\r\n    timeAxis.limitsChanged.on(updateMillisPerPx);\r\n\r\n    const timelinePane = new TimelinePane(newOverlayLayout(), model, ui);\r\n    ui.addPane('timeline-pane', timelinePane);\r\n    timelinePane.addPainter(newBackgroundPainter(bgColor));\r\n    timelinePane.addPane(underlayPane, true);\r\n\r\n    if (selectedIntervalMode === 'single' || selectedIntervalMode === 'single-unmodifiable') {\r\n        const overlayPane = new Pane(null, false, alwaysTrue);\r\n        ui.addPane('overlay-pane', overlayPane);\r\n        overlayPane.addPainter(newTimelineSingleSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor));\r\n        timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false));\r\n    }\r\n    else if (selectedIntervalMode === 'range' || selectedIntervalMode === 'range-unmodifiable') {\r\n        const overlayPane = new Pane(null, false, alwaysTrue);\r\n        ui.addPane('overlay-pane', overlayPane);\r\n        overlayPane.addPainter(newTimelineRangeSelectionPainter(timeAxis, selection.selectedInterval, selectedIntervalBorderColor, selectedIntervalFillColor));\r\n        timelinePane.addPane(newInsetPane(overlayPane, axisInsets, null, false));\r\n    }\r\n\r\n    // Enable double click to center selection on mouse\r\n\r\n    if (centerSelectedIntervalOnDoubleClick) {\r\n        const doubleClick = function (ev: PointerEvent) {\r\n            if (selectedIntervalMode === 'single') {\r\n                if (ev.clickCount > 1) {\r\n                    const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev);\r\n                    selection.selectedInterval.setInterval(time_PMILLIS, time_PMILLIS);\r\n                }\r\n            }\r\n            else if (selectedIntervalMode === 'range') {\r\n                if (ev.clickCount > 1) {\r\n                    const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev);\r\n                    const offset_PMILLIS = selection.selectedInterval.start_PMILLIS + 0.5 * selection.selectedInterval.duration_MILLIS;\r\n                    selection.selectedInterval.pan(time_PMILLIS - offset_PMILLIS);\r\n                }\r\n            }\r\n        };\r\n        ui.input.mouseDown.on(doubleClick);\r\n    }\r\n\r\n    timelinePane.dispose.on(function () {\r\n        // only dispose the ui if we created it (and this manage its lifecycle)\r\n        if (!outsideManagedUi) {\r\n            ui.dispose.fire();\r\n        }\r\n        selection.selectedInterval.changed.off(redraw);\r\n        selection.hoveredEvent.changed.off(redraw);\r\n        selection.hoveredY.changed.off(redrawCursor);\r\n        selection.hoveredTime_PMILLIS.changed.off(redrawCursor);\r\n        selection.selectedEvents.valueAdded.off(redraw);\r\n        selection.selectedEvents.valueRemoved.off(redraw);\r\n        underlayPane.viewportChanged.off(updateMillisPerPx);\r\n        timeAxis.limitsChanged.off(updateMillisPerPx);\r\n        model.root.maximizedRowGuids.valueAdded.off(updateMaximizedRows);\r\n        model.root.maximizedRowGuids.valueRemoved.off(updateMaximizedRows);\r\n    });\r\n\r\n    return timelinePane;\r\n}\r\n\r\n\r\n\r\nfunction newTimeIntervalMask(timeAxis: TimeAxis1D, interval: TimeIntervalModel, selectedIntervalMode: string): Mask2D {\r\n\r\n    if (selectedIntervalMode === 'range') {\r\n        return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean {\r\n            const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i));\r\n\r\n            // allow a 10 pixel selection buffer to make it easier to grab ends of the selection\r\n            const buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10;\r\n\r\n            return interval.overlaps(time_PMILLIS - buffer_MILLIS, time_PMILLIS + buffer_MILLIS);\r\n        };\r\n    }\r\n    else if (selectedIntervalMode === 'single') {\r\n        return function (viewport: BoundsUnmodifiable, i: number, j: number): boolean {\r\n            const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(viewport.xFrac(i));\r\n\r\n            // allow a 10 pixel selection buffer to make it easier to grab the selection\r\n            const buffer_MILLIS = timeAxis.tSize_MILLIS / viewport.w * 10;\r\n\r\n            return time_PMILLIS < interval.cursor_PMILLIS + buffer_MILLIS && time_PMILLIS > interval.cursor_PMILLIS - buffer_MILLIS;\r\n        };\r\n    }\r\n}\r\n\r\nfunction attachTimeAxisMouseListeners(pane: Pane, axis: Axis1D, args: TimelineContentPaneArguments) {\r\n    let vGrab: number = null;\r\n\r\n    pane.mouseDown.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && !hasval(vGrab)) {\r\n            vGrab = axis.vAtFrac(xFrac(ev));\r\n        }\r\n    });\r\n\r\n    pane.mouseMove.on(function (ev: PointerEvent) {\r\n        if (isLeftMouseDown(ev.mouseEvent) && hasval(vGrab)) {\r\n            axis.pan(vGrab - axis.vAtFrac(xFrac(ev)));\r\n        }\r\n    });\r\n\r\n    pane.mouseUp.on(function (ev: PointerEvent) {\r\n        vGrab = null;\r\n    });\r\n\r\n    pane.mouseWheel.on(args.options.mouseWheelListener);\r\n}\r\n\r\nfunction newTimeAxisPane(args: TimelineContentPaneArguments, row: TimelineRowModel, cursor: string): Pane {\r\n    const timeAxis = args.timeAxis;\r\n    const ui = args.ui;\r\n    const draggableEdgeWidth = args.options.draggableEdgeWidth;\r\n    const scrollLayout = args.scrollLayout;\r\n    const drawable = args.drawable;\r\n    const selectedIntervalMode = args.options.selectedIntervalMode;\r\n\r\n    const input = ui.input;\r\n\r\n    const axisPane = new Pane(newOverlayLayout());\r\n    if (scrollLayout) {\r\n        attachTimelineVerticalScrollMouseListeners(axisPane, scrollLayout, drawable);\r\n    }\r\n    attachTimeAxisMouseListeners(axisPane, timeAxis, args);\r\n\r\n    const onMouseMove = function (ev: PointerEvent) {\r\n        const time_PMILLIS = timeAxis.tAtFrac_PMILLIS(xFrac(ev));\r\n        input.mouseMove.fire(ev);\r\n        input.timeHover.fire(time_PMILLIS, ev);\r\n        if (row) {\r\n            input.rowHover.fire(row, ev);\r\n        }\r\n    };\r\n    axisPane.mouseMove.on(onMouseMove);\r\n\r\n    const onMouseExit = function (ev: PointerEvent) {\r\n        input.mouseExit.fire(ev);\r\n        input.timeHover.fire(null, ev);\r\n        if (row) {\r\n            input.rowHover.fire(null, ev);\r\n        }\r\n    };\r\n    axisPane.mouseExit.on(onMouseExit);\r\n\r\n    const onMouseDown = function (ev: PointerEvent) {\r\n        input.mouseDown.fire(ev);\r\n    };\r\n    axisPane.mouseDown.on(onMouseDown);\r\n\r\n    const onMouseUp = function (ev: PointerEvent) {\r\n        input.mouseUp.fire(ev);\r\n    };\r\n    axisPane.mouseUp.on(onMouseUp);\r\n\r\n    const onContextMenu = function (ev: PointerEvent) {\r\n        input.contextMenu.fire(ev);\r\n    };\r\n    axisPane.contextMenu.on(onContextMenu);\r\n\r\n    if (cursor) {\r\n        axisPane.mouseCursor = cursor;\r\n    }\r\n\r\n    if (selectedIntervalMode === 'single' || selectedIntervalMode === 'range') {\r\n        const selection = ui.selection;\r\n        const selectedIntervalPane = new Pane(null, true, newTimeIntervalMask(timeAxis, selection.selectedInterval, selectedIntervalMode));\r\n        attachTimeSelectionMouseListeners(selectedIntervalPane, timeAxis, selection.selectedInterval, input, draggableEdgeWidth, selectedIntervalMode, args.options.mouseWheelListener);\r\n        axisPane.addPane(selectedIntervalPane, false);\r\n\r\n        selectedIntervalPane.mouseMove.on(onMouseMove);\r\n        selectedIntervalPane.mouseExit.on(onMouseExit);\r\n        selectedIntervalPane.mouseDown.on(onMouseDown);\r\n        selectedIntervalPane.mouseUp.on(onMouseUp);\r\n        selectedIntervalPane.contextMenu.on(onContextMenu);\r\n    }\r\n\r\n    // Dispose\r\n    //\r\n\r\n    // mouse listeners are disposed of automatically by Pane\r\n\r\n    return axisPane;\r\n}\r\n\r\nfunction timeAtPointer_PMILLIS(timeAxis: TimeAxis1D, ev: PointerEvent): number {\r\n    return timeAxis.tAtFrac_PMILLIS(ev.paneViewport.xFrac(ev.i));\r\n}\r\n\r\n\r\nfunction attachTimeSelectionMouseListeners(pane: Pane,\r\n    timeAxis: TimeAxis1D,\r\n    interval: TimeIntervalModel,\r\n    input: TimelineInput,\r\n    draggableEdgeWidth: number,\r\n    selectedIntervalMode: string,\r\n    mouseWheelListener: (PointerEvent: PointerEvent) => void) {\r\n\r\n    if (selectedIntervalMode === 'single') {\r\n\r\n        const chooseDragMode = function (ev: PointerEvent): string {\r\n            return 'center';\r\n        };\r\n\r\n        attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode, mouseWheelListener);\r\n\r\n    }\r\n    else if (selectedIntervalMode === 'range') {\r\n\r\n        // Edges are draggable when interval is at least this wide\r\n        const minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth;\r\n\r\n        // When dragging an edge, the interval cannot be made narrower than this\r\n        //\r\n        // Needs to be greater than minIntervalWidthForEdgeDraggability -- by enough to\r\n        // cover floating-point precision loss -- so a user can't accidentally make\r\n        // the interval so narrow that it can't easily be widened again.\r\n        //\r\n        const minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1;\r\n\r\n        const chooseDragMode = function (ev: PointerEvent): string {\r\n            const intervalWidth = (interval.duration_MILLIS) * ev.paneViewport.w / timeAxis.vSize;\r\n            if (intervalWidth < minIntervalWidthForEdgeDraggability) {\r\n                // If interval isn't very wide, don't try to allow edge dragging\r\n                return 'center';\r\n            }\r\n            else {\r\n                const time_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev);\r\n                const mouseOffset = (time_PMILLIS - interval.start_PMILLIS) * ev.paneViewport.w / timeAxis.vSize;\r\n                if (mouseOffset < draggableEdgeWidth) {\r\n                    // If mouse is near the left edge, drag the interval's start-time\r\n                    return 'start';\r\n                }\r\n                else if (mouseOffset < intervalWidth - draggableEdgeWidth) {\r\n                    // If mouse is in the center, drag the whole interval\r\n                    return 'center';\r\n                }\r\n                else {\r\n                    // If mouse is near the right edge, drag the interval's end-time\r\n                    return 'end';\r\n                }\r\n            }\r\n        };\r\n\r\n        attachTimeIntervalSelectionMouseListeners(pane, timeAxis, interval, input, draggableEdgeWidth, selectedIntervalMode, chooseDragMode, mouseWheelListener);\r\n    }\r\n}\r\n\r\nfunction attachTimeIntervalSelectionMouseListeners(pane: Pane,\r\n    timeAxis: TimeAxis1D,\r\n    interval: TimeIntervalModel,\r\n    input: TimelineInput,\r\n    draggableEdgeWidth: number,\r\n    selectedIntervalMode: string,\r\n    chooseDragMode: (ev: PointerEvent) => string,\r\n    mouseWheelListener: (PointerEvent: PointerEvent) => void) {\r\n\r\n    // see comments in attachTimeSelectionMouseListeners( ... )\r\n    const minIntervalWidthForEdgeDraggability = 3 * draggableEdgeWidth;\r\n    const minIntervalWidthWhenDraggingEdge = minIntervalWidthForEdgeDraggability + 1;\r\n\r\n    // Hook up input notifications\r\n    //\r\n    pane.mouseWheel.on(mouseWheelListener);\r\n    pane.contextMenu.on(function (ev: PointerEvent) {\r\n        input.contextMenu.fire(ev);\r\n    });\r\n\r\n\r\n    // Begin interval-drag\r\n    //\r\n\r\n    let dragMode: string = null;\r\n    let dragOffset_MILLIS: number = null;\r\n\r\n    pane.mouseMove.on(function (ev: PointerEvent) {\r\n        if (!dragMode) {\r\n            const mouseCursors = { 'center': 'move', 'start': 'w-resize', 'end': 'e-resize' };\r\n            pane.mouseCursor = mouseCursors[chooseDragMode(ev)];\r\n        }\r\n    });\r\n\r\n    pane.mouseDown.on(function (ev: PointerEvent) {\r\n        dragMode = isLeftMouseDown(ev.mouseEvent) ? chooseDragMode(ev) : null;\r\n        if (!hasval(dragMode)) {\r\n            dragOffset_MILLIS = null;\r\n        }\r\n    });\r\n\r\n\r\n    // Compute (and remember) the pointer time, for use by the drag listeners below\r\n    //\r\n\r\n    let dragPointer_PMILLIS: number = null;\r\n\r\n    const updateDragPointer = function (ev: PointerEvent) {\r\n        if (hasval(dragMode)) {\r\n            dragPointer_PMILLIS = timeAtPointer_PMILLIS(timeAxis, ev);\r\n        }\r\n    };\r\n    pane.mouseDown.on(updateDragPointer);\r\n    pane.mouseMove.on(updateDragPointer);\r\n\r\n\r\n    // Dragging interval-center\r\n    //\r\n\r\n    const grabCenter = function () {\r\n        if (dragMode === 'center') {\r\n            dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS;\r\n        }\r\n    };\r\n    pane.mouseDown.on(grabCenter);\r\n\r\n    const dragCenter = function () {\r\n        if (dragMode === 'center') {\r\n            const newStart_PMILLIS = (dragPointer_PMILLIS - dragOffset_MILLIS);\r\n            const newEnd_PMILLIS = interval.end_PMILLIS + (newStart_PMILLIS - interval.start_PMILLIS);\r\n            interval.setInterval(newStart_PMILLIS, newEnd_PMILLIS);\r\n        }\r\n    };\r\n    pane.mouseMove.on(dragCenter);\r\n\r\n\r\n    // Dragging interval-start\r\n    //\r\n\r\n    const grabStart = function () {\r\n        if (dragMode === 'start') {\r\n            dragOffset_MILLIS = dragPointer_PMILLIS - interval.start_PMILLIS;\r\n        }\r\n    };\r\n    pane.mouseDown.on(grabStart);\r\n\r\n    const dragStart = function () {\r\n        if (dragMode === 'start') {\r\n            const wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w;\r\n            const newStart_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS;\r\n            interval.start_PMILLIS = Math.min(interval.end_PMILLIS - wMin_MILLIS, newStart_PMILLIS);\r\n        }\r\n    };\r\n    pane.mouseMove.on(dragStart);\r\n\r\n\r\n    // Dragging interval-end\r\n    //\r\n\r\n    const grabEnd = function () {\r\n        if (dragMode === 'end') {\r\n            dragOffset_MILLIS = dragPointer_PMILLIS - interval.end_PMILLIS;\r\n        }\r\n    };\r\n    pane.mouseDown.on(grabEnd);\r\n\r\n    const dragEnd = function () {\r\n        if (dragMode === 'end') {\r\n            const wMin_MILLIS = minIntervalWidthWhenDraggingEdge * timeAxis.vSize / pane.viewport.w;\r\n            const newEnd_PMILLIS = dragPointer_PMILLIS - dragOffset_MILLIS;\r\n            interval.end_PMILLIS = Math.max(interval.start_PMILLIS + wMin_MILLIS, newEnd_PMILLIS);\r\n            interval.cursor_PMILLIS = interval.end_PMILLIS;\r\n        }\r\n    };\r\n    pane.mouseMove.on(dragEnd);\r\n\r\n\r\n    // Finish interval-drag\r\n    //\r\n\r\n    pane.mouseUp.on(function (ev: PointerEvent) {\r\n        dragOffset_MILLIS = null;\r\n        dragPointer_PMILLIS = null;\r\n        dragMode = null;\r\n    });\r\n}\r\n\r\nexport function newTimelineSingleSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter {\r\n\r\n    const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n\r\n    // holds vertices for fill and border\r\n    const coords = new Float32Array(12 + 8);\r\n    const coordsBuffer = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        if (hasval(interval.cursor_PMILLIS)) {\r\n\r\n            const fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS);\r\n            const fracWidth = 1 / viewport.w;\r\n            const fracHeight = 1 / viewport.h;\r\n            const thickWidth = 3 / viewport.w;\r\n            const highlightWidth = 7 / viewport.w;\r\n            let index = 0;\r\n\r\n            // fill vertices\r\n            coords[index++] = fracSelection - highlightWidth;\r\n            coords[index++] = 1;\r\n            coords[index++] = fracSelection + highlightWidth;\r\n            coords[index++] = 1;\r\n            coords[index++] = fracSelection - highlightWidth;\r\n            coords[index++] = 0;\r\n            coords[index++] = fracSelection + highlightWidth;\r\n            coords[index++] = 0;\r\n\r\n            // selection vertices\r\n            index = putQuadXys(coords, index, fracSelection - thickWidth / 2, fracSelection + thickWidth / 2, 1, 0 + fracHeight); // selection\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n            coordsBuffer.setData(coords);\r\n            a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT);\r\n\r\n            u_Color.setData(gl, fillColor);\r\n            gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);\r\n\r\n            u_Color.setData(gl, borderColor);\r\n            gl.drawArrays(GL.TRIANGLES, 4, 6);\r\n\r\n            a_XyFrac.disable(gl);\r\n            program.endUse(gl);\r\n\r\n\r\n        }\r\n    };\r\n}\r\n\r\nfunction newTimelineRangeSelectionPainter(timeAxis: TimeAxis1D, interval: TimeIntervalModel, borderColor: Color, fillColor: Color): Painter {\r\n\r\n    const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n\r\n    // holds vertices for fill and border\r\n    const coords = new Float32Array(12 + 8 + 48);\r\n    const coordsBuffer = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n        if (hasval(interval.start_PMILLIS) && hasval(interval.end_PMILLIS)) {\r\n\r\n            const fracStart = timeAxis.tFrac(interval.start_PMILLIS);\r\n            const fracEnd = timeAxis.tFrac(interval.end_PMILLIS);\r\n            const fracSelection = timeAxis.tFrac(interval.cursor_PMILLIS);\r\n            const fracWidth = 1 / viewport.w;\r\n            const fracHeight = 1 / viewport.h;\r\n            const thickWidth = 3 / viewport.w;\r\n            let index = 0;\r\n\r\n            // fill vertices\r\n            coords[index++] = fracStart;\r\n            coords[index++] = 1;\r\n            coords[index++] = fracEnd;\r\n            coords[index++] = 1;\r\n            coords[index++] = fracStart;\r\n            coords[index++] = 0;\r\n            coords[index++] = fracEnd;\r\n            coords[index++] = 0;\r\n\r\n            // border vertices\r\n            index = putQuadXys(coords, index, fracStart, fracEnd - fracWidth, +1, +1 - fracHeight); // top\r\n            index = putQuadXys(coords, index, fracStart + fracWidth, fracEnd, 0 + fracHeight, 0); // bottom\r\n            index = putQuadXys(coords, index, fracStart, fracStart + fracWidth, 1 - fracHeight, 0); // left\r\n            index = putQuadXys(coords, index, fracEnd - fracWidth, fracEnd, 1, 0 + fracHeight); // right\r\n\r\n            // selection vertices\r\n            index = putQuadXys(coords, index, fracSelection - thickWidth, fracSelection, 1, 0 + fracHeight); // selection\r\n\r\n            gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA);\r\n            gl.enable(GL.BLEND);\r\n\r\n            program.use(gl);\r\n            coordsBuffer.setData(coords);\r\n            a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT);\r\n\r\n            u_Color.setData(gl, fillColor);\r\n            gl.drawArrays(GL.TRIANGLE_STRIP, 0, 4);\r\n\r\n            u_Color.setData(gl, borderColor);\r\n            gl.drawArrays(GL.TRIANGLES, 4, 30);\r\n\r\n            a_XyFrac.disable(gl);\r\n            program.endUse(gl);\r\n\r\n\r\n        }\r\n    };\r\n}\r\n\r\nfunction newGroupCollapseExpandArrowPainter(group: TimelineGroupModel) {\r\n\r\n    const program = new Program(xyFrac_VERTSHADER, solid_FRAGSHADER);\r\n    const a_XyFrac = new Attribute(program, 'a_XyFrac');\r\n    const u_Color = new UniformColor(program, 'u_Color');\r\n\r\n    // holds vertices for triangle\r\n    const coords = new Float32Array(6);\r\n    const coordsBuffer = newDynamicBuffer();\r\n\r\n    return function (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) {\r\n\r\n        let sizeFracX = 0.5;\r\n        const sizeX = sizeFracX * viewport.w;\r\n        const sizeY = sizeX * Math.sqrt(3) / 2;\r\n        let sizeFracY = sizeY / viewport.h;\r\n\r\n        const bufferFracX = 0.05;\r\n        const bufferSize = bufferFracX * viewport.w;\r\n        const bufferFracY = bufferSize / viewport.h;\r\n\r\n        const centerFracX = 0.5;\r\n        const centerFracY = bufferFracY + sizeFracY / 2;\r\n\r\n        if (group.collapsed) {\r\n\r\n            sizeFracX = sizeY / viewport.w;\r\n            sizeFracY = sizeX / viewport.h;\r\n\r\n            const fracStartX = centerFracX - sizeFracX / 2;\r\n            const fracEndX = centerFracX + sizeFracX / 2;\r\n\r\n            const fracStartY = 1 - (centerFracY - sizeFracY / 2);\r\n            const fracEndY = 1 - (centerFracY + sizeFracY / 2);\r\n\r\n            let index = 0;\r\n            coords[index++] = fracStartX;\r\n            coords[index++] = fracStartY;\r\n            coords[index++] = fracEndX;\r\n            coords[index++] = (fracStartY + fracEndY) / 2;\r\n            coords[index++] = fracStartX;\r\n            coords[index++] = fracEndY;\r\n        } else {\r\n            const fracStartX = centerFracX - sizeFracX / 2;\r\n            const fracEndX = centerFracX + sizeFracX / 2;\r\n\r\n            const fracStartY = 1 - (centerFracY - sizeFracY / 2);\r\n            const fracEndY = 1 - (centerFracY + sizeFracY / 2);\r\n\r\n            let index = 0;\r\n            coords[index++] = fracStartX;\r\n            coords[index++] = fracStartY;\r\n            coords[index++] = fracEndX;\r\n            coords[index++] = fracStartY;\r\n            coords[index++] = (fracStartX + fracEndX) / 2;\r\n            coords[index++] = fracEndY;\r\n        }\r\n\r\n        program.use(gl);\r\n        coordsBuffer.setData(coords);\r\n        a_XyFrac.setDataAndEnable(gl, coordsBuffer, 2, GL.FLOAT);\r\n\r\n        u_Color.setData(gl, white);\r\n        gl.drawArrays(GL.TRIANGLES, 0, 3);\r\n\r\n        a_XyFrac.disable(gl);\r\n        program.endUse(gl);\r\n    };\r\n}\r\n\r\ninterface TimelineContentPaneOptions {\r\n    selectedIntervalMode: string;\r\n    rowPaneFactoryChooser: TimelineRowPaneFactoryChooser;\r\n\r\n    font: string;\r\n    fgColor: Color;\r\n    rowLabelColor: Color;\r\n    rowLabelBgColor: Color;\r\n    rowHighlightColor: Color;\r\n    rowHighlightWidth: number;\r\n    rowHighlightInsets: Insets;\r\n    groupLabelColor: Color;\r\n    groupHighlightColor: Color;\r\n    groupHighlightWidth: number;\r\n    groupHighlightInsets: Insets;\r\n    axisLabelColor: Color;\r\n    bgColor: Color;\r\n    rowBgColor: Color;\r\n    rowAltBgColor: Color;\r\n    gridColor: Color;\r\n\r\n    gridTimeZone: string;\r\n    gridTickSpacing: number;\r\n    referenceDate: string;\r\n\r\n    groupLabelInsets: Insets;\r\n    rowLabelInsets: Insets;\r\n    rowLabelPaneWidth: number;\r\n    rowSeparatorHeight: number;\r\n\r\n    draggableEdgeWidth: number;\r\n    snapToDistance: number;\r\n\r\n    mouseWheelListener: (PointerEvent: PointerEvent) => void;\r\n}\r\n\r\ninterface TimelineContentPaneArguments {\r\n    drawable: Drawable;\r\n    scrollLayout: VerticalScrollLayout;\r\n    timeAxis: TimeAxis1D;\r\n    model: TimelineModel;\r\n    ui: TimelineUi;\r\n    options: TimelineContentPaneOptions;\r\n}\r\n\r\nfunction newTimelineContentPane(args: TimelineContentPaneArguments): Pane {\r\n    const drawable = args.drawable;\r\n    const scrollLayout = args.scrollLayout;\r\n    const timeAxis = args.timeAxis;\r\n    const model = args.model;\r\n    const ui = args.ui;\r\n    const options = args.options;\r\n\r\n    const root = model.root;\r\n\r\n    const selectedIntervalMode = options.selectedIntervalMode;\r\n    const rowPaneFactoryChooser = options.rowPaneFactoryChooser;\r\n\r\n    const font = options.font;\r\n    const fgColor = options.fgColor;\r\n    const rowLabelColor = options.rowLabelColor;\r\n    const groupLabelColor = options.groupLabelColor;\r\n    const groupHighlightColor = options.groupHighlightColor;\r\n    const groupHighlightWidth = options.groupHighlightWidth;\r\n    const groupHighlightInsets = options.groupHighlightInsets;\r\n    const axisLabelColor = options.axisLabelColor;\r\n    const bgColor = options.bgColor;\r\n    const rowBgColor = options.rowBgColor;\r\n    const rowAltBgColor = options.rowAltBgColor;\r\n    const gridColor = options.gridColor;\r\n\r\n    const gridTimeZone = options.gridTimeZone;\r\n    const gridTickSpacing = options.gridTickSpacing;\r\n\r\n    const groupLabelInsets = options.groupLabelInsets;\r\n    const rowLabelInsets = options.rowLabelInsets;\r\n    const rowLabelPaneWidth = options.rowLabelPaneWidth;\r\n    const rowSeparatorHeight = options.rowSeparatorHeight;\r\n\r\n    const draggableEdgeWidth = options.draggableEdgeWidth;\r\n    const snapToDistance = options.snapToDistance;\r\n\r\n    const textureRenderer = new TextureRenderer();\r\n    const createGroupLabelTexture = createTextTextureFactory(font);\r\n    const createRowLabelTexture = createTextTextureFactory(font);\r\n\r\n    // Group panes\r\n    //\r\n\r\n    const timelineContentPane = new Pane(newRowLayout());\r\n\r\n    const groupHeaderPanes: StringMap<Pane> = {};\r\n    const groupContentPanes: StringMap<Pane> = {};\r\n    const groupContainerPanes: StringMap<Pane> = {};\r\n\r\n    const addGroup = function (groupGuid: string, groupIndex: number) {\r\n        const group = model.group(groupGuid);\r\n\r\n        const groupLabelFont = hasval(group.labelFont) ? group.labelFont : font;\r\n        const groupLabel = new Label(group.label, groupLabelFont, groupLabelColor);\r\n        const groupLabelPane = new Pane(<Layout>{ updatePrefSize: fitToLabel(groupLabel) }, false);\r\n        groupLabelPane.addPainter(newLabelPainter(groupLabel, 0, 1, 0, 1));\r\n\r\n        const groupArrowPane = new Pane({\r\n            updatePrefSize: <LayoutPhase1>function (parentPrefSize: Size) {\r\n                parentPrefSize.w = 16;\r\n                parentPrefSize.h = 0;\r\n            }\r\n        }, false);\r\n        groupArrowPane.addPainter(newGroupCollapseExpandArrowPainter(group));\r\n\r\n        const groupPane = new Pane(newColumnLayout(), false);\r\n        groupPane.addPane(groupArrowPane, 0);\r\n        groupPane.addPane(groupLabelPane, 1);\r\n\r\n        const groupButton = newInsetPane(groupPane, groupLabelInsets, bgColor);\r\n\r\n\r\n        const redrawLabel = function () {\r\n            groupLabel.text = group.label;\r\n            drawable.redraw();\r\n        };\r\n        group.attrsChanged.on(redrawLabel);\r\n        /// handle rollup group row ///\r\n\r\n        const groupHeaderStripe = new Pane(newRowLayout());\r\n        groupHeaderStripe.addPane(new Pane(null), 0, { height: null });\r\n        groupHeaderStripe.addPane(newSolidPane(groupLabelColor), 1, { height: 1 });\r\n        groupHeaderStripe.addPane(new Pane(null), 2, { height: null });\r\n\r\n        const rollupRow = model.row(group.rollupGuid);\r\n        let groupHeaderPane: Pane = null;\r\n        let groupHeaderUnderlay: Pane = null;\r\n        if (rollupRow) {\r\n\r\n            const rowBackgroundPanes = newRowBackgroundPanes(args, group.rowGuids, rollupRow);\r\n            const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane;\r\n            const rowInsetPane = rowBackgroundPanes.rowInsetPane;\r\n\r\n            const rollupUi = ui.rowUi(rollupRow.rowGuid);\r\n\r\n            // expose panes in api via TimelineRowUi\r\n            rollupUi.addPane('background', rowBackgroundPane);\r\n            rollupUi.addPane('inset', rowInsetPane);\r\n\r\n            const rollupDataAxis = rollupRow.dataAxis;\r\n\r\n            let rollupContentPane: Pane = null;\r\n            let rollupPaneFactory: TimelineRowPaneFactory = null;\r\n            const rollupContentOptions = { timelineFont: font, timelineFgColor: fgColor, draggableEdgeWidth: draggableEdgeWidth, snapToDistance: snapToDistance, isMaximized: false, mouseWheelListener: args.options.mouseWheelListener };\r\n            const refreshRollupContentPane = function () {\r\n                const newRollupPaneFactory = (rollupUi.paneFactory || rowPaneFactoryChooser(rollupRow));\r\n                if (newRollupPaneFactory !== rollupPaneFactory) {\r\n                    if (rollupContentPane) {\r\n                        rollupContentPane.dispose.fire();\r\n                        rowInsetPane.removePane(rollupContentPane);\r\n                    }\r\n                    rollupPaneFactory = newRollupPaneFactory;\r\n                    rollupContentPane = (rollupPaneFactory && rollupPaneFactory(drawable, timeAxis, rollupDataAxis, model, rollupRow, ui, rollupContentOptions));\r\n                    if (rollupContentPane) {\r\n                        rowInsetPane.addPane(rollupContentPane);\r\n                    }\r\n                    drawable.redraw();\r\n                }\r\n            };\r\n\r\n            rollupUi.paneFactoryChanged.on(refreshRollupContentPane);\r\n            rollupRow.attrsChanged.on(refreshRollupContentPane);\r\n            rollupRow.eventGuids.valueAdded.on(refreshRollupContentPane);\r\n            rollupRow.eventGuids.valueRemoved.on(refreshRollupContentPane);\r\n            rollupRow.timeseriesGuids.valueAdded.on(refreshRollupContentPane);\r\n            rollupRow.timeseriesGuids.valueRemoved.on(refreshRollupContentPane);\r\n            refreshRollupContentPane();\r\n\r\n            const groupButtonHeaderUnderlay = new Pane(newColumnLayout());\r\n            groupButtonHeaderUnderlay.addPane(groupButton, 0);\r\n            groupButtonHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true });\r\n\r\n            groupHeaderUnderlay = new Pane(newColumnLayout());\r\n            groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor));\r\n            groupHeaderUnderlay.addPane(groupButtonHeaderUnderlay, 0, { width: rowLabelPaneWidth });\r\n            groupHeaderUnderlay.addPane(rowBackgroundPane, 1, { width: null });\r\n\r\n            groupHeaderPane = groupHeaderUnderlay;\r\n        }\r\n        else {\r\n\r\n            groupHeaderUnderlay = new Pane(newColumnLayout());\r\n            groupHeaderUnderlay.addPainter(newBackgroundPainter(bgColor));\r\n            groupHeaderUnderlay.addPane(groupButton, 0);\r\n            groupHeaderUnderlay.addPane(groupHeaderStripe, 1, { ignoreHeight: true });\r\n            const groupHeaderOverlay = newTimeAxisPane(args, null, group.cursor);\r\n            const groupHeaderOverlayInsets = newInsets(0, 0, 0, rowLabelPaneWidth);\r\n\r\n            groupHeaderPane = new Pane(newOverlayLayout());\r\n            groupHeaderPane.addPane(groupHeaderUnderlay, true);\r\n            groupHeaderPane.addPane(newInsetPane(groupHeaderOverlay, groupHeaderOverlayInsets, null, false), false);\r\n\r\n        }\r\n\r\n        const groupHeaderHighlight = new Pane(newColumnLayout(), false);\r\n        const groupHighlight = new Highlight(group.highlightColor || groupHighlightColor);\r\n        const highlightInnerPane = new Pane(null);\r\n        highlightInnerPane.addPainter(groupHighlight.newPainter());\r\n        const insets = group.highlightInsets || groupHighlightInsets;\r\n        const width = group.highlightWidth || groupHighlightWidth;\r\n        const containerWidth = insets ? insets.left + insets.right + width : width;\r\n        const highlightPane = newInsetPane(highlightInnerPane, insets);\r\n        groupHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null });\r\n\r\n        const groupContainerOverlayPane = new Pane(newOverlayLayout());\r\n        const groupContainerRowPane = new Pane(newRowLayout());\r\n        const groupContentPane = new Pane(newRowLayout());\r\n        groupContainerOverlayPane.addPane(groupContainerRowPane, true, { width: null, height: null });\r\n        groupContainerOverlayPane.addPane(groupHeaderHighlight, false, { width: null, height: null });\r\n\r\n        groupContainerRowPane.updateLayoutArgs(function (layoutArg: any): any {\r\n            const shift = (isNumber(layoutArg) && layoutArg >= 2 * groupIndex);\r\n            return (shift ? layoutArg + 2 : layoutArg);\r\n        });\r\n\r\n        groupContainerRowPane.addPane(groupHeaderPane, 2 * groupIndex);\r\n        groupContainerRowPane.addPane(groupContentPane, 2 * groupIndex + 1, { hide: group.collapsed });\r\n\r\n        timelineContentPane.addPane(groupContainerOverlayPane, groupIndex);\r\n\r\n        groupHeaderPanes[groupGuid] = groupHeaderPane;\r\n        groupContentPanes[groupGuid] = groupContentPane;\r\n        groupContainerPanes[groupGuid] = groupContainerOverlayPane;\r\n\r\n        const groupAttrsChanged = function (timelineGroup: TimelineGroup) {\r\n            const groupContentLayoutOpts = groupContainerRowPane.layoutOptions(groupContentPane);\r\n            const groupHighlightLayoutOpts = groupHeaderHighlight.layoutOptions(highlightPane);\r\n            let redraw = false;\r\n            if (timelineGroup.highlighted !== (!groupHighlightLayoutOpts.hide)) {\r\n                groupHighlightLayoutOpts.hide = !timelineGroup.highlighted;\r\n                redraw = true;\r\n            }\r\n            if (timelineGroup.highlightColor !== groupHighlight.color) {\r\n                groupHighlight.color = timelineGroup.highlightColor;\r\n                redraw = true;\r\n            }\r\n            if (timelineGroup.dashPattern !== groupHighlight.dashPattern) {\r\n                groupHighlight.dashPattern = timelineGroup.dashPattern;\r\n                redraw = true;\r\n            }\r\n            if (timelineGroup.dashLength !== groupHighlight.dashLength) {\r\n                groupHighlight.dashLength = timelineGroup.dashLength;\r\n                redraw = true;\r\n            }\r\n            if (timelineGroup.collapsed !== groupContentLayoutOpts.hide) {\r\n                groupContentLayoutOpts.hide = timelineGroup.collapsed;\r\n                redraw = true;\r\n            }\r\n            if (timelineGroup.labelFont !== groupContentLayoutOpts.labelFont) {\r\n                groupLabel.font = timelineGroup.labelFont;\r\n                redraw = true;\r\n            }\r\n            if (redraw) {\r\n                drawable.redraw();\r\n            }\r\n        }.bind(this, group);\r\n        group.attrsChanged.on(groupAttrsChanged);\r\n        groupAttrsChanged();\r\n\r\n        groupButton.mouseDown.on(function (ev: PointerEvent) {\r\n            if (isLeftMouseDown(ev.mouseEvent)) {\r\n                group.collapsed = !group.collapsed;\r\n            }\r\n        });\r\n\r\n        // Handle hidden property\r\n        //\r\n\r\n        groupContainerRowPane.layoutOptions(groupContentPane).hide = group.hidden;\r\n        groupContainerRowPane.layoutOptions(groupHeaderPane).hide = group.hidden;\r\n\r\n        setupRowContainerPane(args, groupContentPane, group.rowGuids, false, group.groupGuid);\r\n\r\n        groupContentPane.dispose.on(function () {\r\n            group.attrsChanged.off(redrawLabel);\r\n            group.attrsChanged.off(groupAttrsChanged);\r\n        });\r\n\r\n    };\r\n    root.groupGuids.forEach(addGroup);\r\n    root.groupGuids.valueAdded.on(addGroup);\r\n\r\n    const moveGroup = function (groupGuid: string, groupOldIndex: number, groupNewIndex: number) {\r\n        const nMin = Math.min(groupOldIndex, groupNewIndex);\r\n        const nMax = Math.max(groupOldIndex, groupNewIndex);\r\n        for (let n = nMin; n <= nMax; n++) {\r\n            const groupGuidTemp = root.groupGuids.valueAt(n);\r\n            timelineContentPane.setLayoutArg(groupContainerPanes[groupGuidTemp], n);\r\n            // timelineContentPane.setLayoutArg(groupHeaderPanes[groupGuidTemp], 2 * n);\r\n            // timelineContentPane.setLayoutArg(groupContentPanes[groupGuidTemp], 2 * n + 1);\r\n        }\r\n\r\n        drawable.redraw();\r\n    };\r\n    root.groupGuids.valueMoved.on(moveGroup);\r\n\r\n    const removeGroup = function (groupGuid: string, groupIndex: number) {\r\n        // const contentPane: Pane = groupContentPanes[groupGuid];\r\n        // const headerPane: Pane = groupHeaderPanes[groupGuid];\r\n        const groupPane: Pane = groupContainerPanes[groupGuid];\r\n        // contentPane.dispose.fire();\r\n        // headerPane.dispose.fire();\r\n        groupPane.dispose.fire();\r\n        // timelineContentPane.removePane(contentPane);\r\n        // timelineContentPane.removePane(headerPane);\r\n        timelineContentPane.removePane(groupPane);\r\n        timelineContentPane.updateLayoutArgs(function (layoutArg: any): any {\r\n            // const shift = (isNumber(layoutArg) && layoutArg > 2 * groupIndex + 1);\r\n            // return (shift ? layoutArg - 2 : layoutArg);\r\n            const shift = (isNumber(layoutArg) && layoutArg > groupIndex);\r\n            return (shift ? layoutArg - 1 : layoutArg);\r\n        });\r\n        // delete groupHeaderPanes[groupGuid];\r\n        // delete groupContentPanes[groupGuid];\r\n        delete groupContainerPanes[groupGuid];\r\n\r\n        drawable.redraw();\r\n    };\r\n    root.groupGuids.valueRemoved.on(removeGroup);\r\n\r\n    // Handle listing for hidden property\r\n    //\r\n\r\n    const groupAttrsChangedListeners = {};\r\n\r\n    const attachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) {\r\n        const group = model.group(groupGuid);\r\n        const groupAttrsChangedListener = function () {\r\n            if (hasval(group.hidden) && hasval(groupContentPanes[groupGuid])) {\r\n\r\n                timelineContentPane.layoutOptions(groupContentPanes[groupGuid]).hide = group.hidden;\r\n                timelineContentPane.layoutOptions(groupHeaderPanes[groupGuid]).hide = group.hidden;\r\n                drawable.redraw();\r\n            }\r\n        };\r\n        groupAttrsChangedListeners[groupGuid] = groupAttrsChangedListener;\r\n        group.attrsChanged.on(groupAttrsChangedListener);\r\n    };\r\n\r\n    const unattachGroupAttrsChangedListener = function (groupGuid: string, groupIndex: number) {\r\n        const group = model.group(groupGuid);\r\n        group.attrsChanged.off(groupAttrsChangedListeners[groupGuid]);\r\n    };\r\n\r\n    root.groupGuids.forEach(attachGroupAttrsChangedListener);\r\n    root.groupGuids.valueAdded.on(attachGroupAttrsChangedListener);\r\n    root.groupGuids.valueRemoved.on(unattachGroupAttrsChangedListener);\r\n\r\n    // Dispose\r\n    //\r\n\r\n    timelineContentPane.dispose.on(function () {\r\n        root.groupGuids.valueAdded.off(addGroup);\r\n        root.groupGuids.valueMoved.off(moveGroup);\r\n        root.groupGuids.valueRemoved.off(removeGroup);\r\n    });\r\n\r\n    return timelineContentPane;\r\n}\r\n\r\n// Row panes and painters\r\n//\r\n\r\nfunction newRowBackgroundPainter(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) {\r\n    return function (gl: WebGLRenderingContext) {\r\n        const color = hasval(row.bgColor) ? row.bgColor : (guidList.indexOf(row.rowGuid) % 2 ? args.options.rowBgColor : args.options.rowAltBgColor);\r\n        gl.clearColor(color.r, color.g, color.b, color.a);\r\n        gl.clear(GL.COLOR_BUFFER_BIT);\r\n    };\r\n}\r\n\r\nfunction newRowBackgroundPanes(args: TimelineContentPaneArguments, guidList: OrderedStringSet, row: TimelineRowModel) {\r\n    const rowBackgroundPane = newTimeAxisPane(args, row, row.cursor);\r\n    rowBackgroundPane.addPainter(newRowBackgroundPainter(args, guidList, row));\r\n\r\n    const timeGridOpts = { tickSpacing: args.options.gridTickSpacing, gridColor: args.options.gridColor, referenceDate: args.options.referenceDate };\r\n    rowBackgroundPane.addPainter(newTimeGridPainter(args.timeAxis, false, args.options.gridTimeZone, timeGridOpts));\r\n\r\n    const rowInsetTop = args.options.rowSeparatorHeight / 2;\r\n    const rowInsetBottom = args.options.rowSeparatorHeight - rowInsetTop;\r\n    const rowInsetPane = new Pane(newInsetLayout(newInsets(rowInsetTop, 0, rowInsetBottom, 0)), false);\r\n    rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetTop, drawRight: false, drawLeft: false, drawBottom: false }));\r\n    rowInsetPane.addPainter(newBorderPainter(args.options.bgColor, { thickness: rowInsetBottom, drawRight: false, drawLeft: false, drawTop: false }));\r\n    rowBackgroundPane.addPane(rowInsetPane, true);\r\n\r\n    const rowOverlayPane = new Pane(null, false);\r\n    rowOverlayPane.addPainter(newBorderPainter(args.options.rowLabelColor, { drawRight: false, drawTop: false, drawBottom: false }));\r\n    rowBackgroundPane.addPane(rowOverlayPane, false);\r\n\r\n    return { rowInsetPane: rowInsetPane, rowBackgroundPane: rowBackgroundPane };\r\n}\r\n\r\nfunction setupRowContainerPane(args: TimelineContentPaneArguments, parentPane: Pane, guidList: OrderedStringSet, isMaximized: boolean, keyPrefix: string) {\r\n\r\n    const drawable = args.drawable;\r\n    const scrollLayout = args.scrollLayout;\r\n    const timeAxis = args.timeAxis;\r\n    const model = args.model;\r\n    const ui = args.ui;\r\n    const options = args.options;\r\n\r\n    const rowContainerPanes: StringMap<Pane> = {};\r\n\r\n    const addRow = function (rowGuid: string, rowIndex: number) {\r\n        const row = model.row(rowGuid);\r\n        const rowUi = ui.rowUi(rowGuid);\r\n\r\n        const rowLabelColorBg: Color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.rowLabelBgColor;\r\n        const rowLabelColorFg: Color = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor;\r\n        const rowLabelFont: string = hasval(row.labelFont) ? row.labelFont : options.font;\r\n\r\n        const rowLabel = new Label(row.label, rowLabelFont, rowLabelColorFg);\r\n        const rowLabelPane = new Pane({ updatePrefSize: fitToLabel(rowLabel) }, false);\r\n        rowLabelPane.addPainter(newLabelPainter(rowLabel, 0, 0.5, 0, 0.5, undefined, row.truncate));\r\n\r\n        const rowHeaderHighlight = new Pane(newColumnLayout(), false);\r\n        const rowHighlight = new Highlight(row.highlightColor || options.rowHighlightColor);\r\n        const highlightInnerPane = new Pane(newRowLayout());\r\n        highlightInnerPane.addPainter(rowHighlight.newPainter());\r\n        const insets = row.highlightInsets || options.rowHighlightInsets;\r\n        const width = row.highlightWidth || options.rowHighlightWidth;\r\n        const containerWidth = insets ? insets.left + insets.right + width : width;\r\n        const highlightPane = newInsetPane(highlightInnerPane, insets);\r\n        rowHeaderHighlight.addPane(highlightPane, 0, { width: containerWidth, height: null,  hide: !row.highlighted });\r\n\r\n        const rowLabelBackground = new Background(rowLabelColorBg);\r\n        const rowHeaderPane = new Pane(newInsetLayout(options.rowLabelInsets), true);\r\n\r\n        rowHeaderPane.addPainter(rowLabelBackground.newPainter());\r\n        rowHeaderPane.addPane(rowLabelPane);\r\n\r\n        const rowBackgroundPanes = newRowBackgroundPanes(args, guidList, row);\r\n        const rowBackgroundPane = rowBackgroundPanes.rowBackgroundPane;\r\n        const rowInsetPane = rowBackgroundPanes.rowInsetPane;\r\n\r\n        const rowPane = new Pane(newColumnLayout());\r\n        rowPane.addPane(rowHeaderPane, 0, { width: options.rowLabelPaneWidth });\r\n        rowPane.addPane(rowBackgroundPane, 1, { width: null });\r\n\r\n        const rowContainerOverlayPane = new Pane(newOverlayLayout());\r\n        rowContainerOverlayPane.addPane(rowPane, true, { width: null, height: null });\r\n        rowContainerOverlayPane.addPane(rowHeaderHighlight, false, { width: null, height: null });\r\n\r\n        const rowAttrsChanged = function () {\r\n            rowLabel.text = row.label;\r\n            rowLabel.fgColor = hasval(row.fgLabelColor) ? row.fgLabelColor : options.rowLabelColor;\r\n            rowLabel.font = hasval(row.labelFont) ? row.labelFont : options.font;\r\n            rowLabelBackground.color = hasval(row.bgLabelColor) ? row.bgLabelColor : options.bgColor;\r\n\r\n            const rowHighlightLayoutOpts = rowHeaderHighlight.layoutOptions(highlightPane);\r\n            rowHighlightLayoutOpts.hide = !row.highlighted;\r\n            rowHighlight.color = row.highlightColor;\r\n\r\n            drawable.redraw();\r\n        };\r\n        row.attrsChanged.on(rowAttrsChanged);\r\n\r\n        // expose panes in api via TimelineRowUi\r\n        rowUi.addPane(keyPrefix + '-background', rowBackgroundPane);\r\n        rowUi.addPane(keyPrefix + '-inset', rowInsetPane);\r\n        rowUi.addPane(keyPrefix + '-label', rowLabelPane);\r\n        rowUi.addPane(keyPrefix + '-header', rowHeaderPane);\r\n\r\n        const rowDataAxis = row.dataAxis;\r\n\r\n        let rowContentPane: Pane = null;\r\n        let rowPaneFactory: TimelineRowPaneFactory = null;\r\n        const rowContentOptions = { timelineFont: options.font, timelineFgColor: options.fgColor, draggableEdgeWidth: options.draggableEdgeWidth, snapToDistance: options.snapToDistance, isMaximized: isMaximized, mouseWheelListener: options.mouseWheelListener };\r\n        const refreshRowContentPane = function () {\r\n            const newRowPaneFactory = (rowUi.paneFactory || options.rowPaneFactoryChooser(row));\r\n            if (newRowPaneFactory !== rowPaneFactory) {\r\n                if (rowContentPane) {\r\n                    rowContentPane.dispose.fire();\r\n                    rowInsetPane.removePane(rowContentPane);\r\n                }\r\n                rowPaneFactory = newRowPaneFactory;\r\n                rowContentPane = (rowPaneFactory && rowPaneFactory(drawable, timeAxis, rowDataAxis, model, row, ui, rowContentOptions));\r\n                if (rowContentPane) {\r\n                    rowInsetPane.addPane(rowContentPane);\r\n                }\r\n                drawable.redraw();\r\n            }\r\n        };\r\n\r\n        rowUi.paneFactoryChanged.on(refreshRowContentPane);\r\n        row.attrsChanged.on(refreshRowContentPane);\r\n        row.eventGuids.valueAdded.on(refreshRowContentPane);\r\n        row.eventGuids.valueRemoved.on(refreshRowContentPane);\r\n        row.timeseriesGuids.valueAdded.on(refreshRowContentPane);\r\n        row.timeseriesGuids.valueRemoved.on(refreshRowContentPane);\r\n        refreshRowContentPane();\r\n\r\n        parentPane.updateLayoutArgs(function (layoutArg: any): any {\r\n            const shift = (isNumber(layoutArg) && layoutArg >= rowIndex);\r\n            return (shift ? layoutArg + 1 : layoutArg);\r\n        });\r\n        parentPane.addPane(rowContainerOverlayPane, rowIndex);\r\n        rowContainerPanes[rowGuid] = rowContainerOverlayPane;\r\n\r\n\r\n        // Handle hidden property\r\n        //\r\n        parentPane.layoutOptions(rowContainerOverlayPane).hide = row.hidden;\r\n\r\n        drawable.redraw();\r\n\r\n        rowContainerOverlayPane.dispose.on(function () {\r\n            row.attrsChanged.off(rowAttrsChanged);\r\n            rowUi.paneFactoryChanged.off(refreshRowContentPane);\r\n            row.attrsChanged.off(refreshRowContentPane);\r\n            row.eventGuids.valueAdded.off(refreshRowContentPane);\r\n            row.eventGuids.valueRemoved.off(refreshRowContentPane);\r\n            row.timeseriesGuids.valueAdded.off(refreshRowContentPane);\r\n            row.timeseriesGuids.valueRemoved.off(refreshRowContentPane);\r\n\r\n            rowUi.removePane(keyPrefix + '-background');\r\n            rowUi.removePane(keyPrefix + '-inset');\r\n            rowUi.removePane(keyPrefix + '-label');\r\n            rowUi.removePane(keyPrefix + '-header');\r\n        });\r\n    };\r\n    guidList.forEach(addRow);\r\n    guidList.valueAdded.on(addRow);\r\n\r\n    const valueMoved = function (rowGuid: string, rowOldIndex: number, rowNewIndex: number) {\r\n        const nMin = Math.min(rowOldIndex, rowNewIndex);\r\n        const nMax = Math.max(rowOldIndex, rowNewIndex);\r\n        for (let n = nMin; n <= nMax; n++) {\r\n            const rowGuidTemp = guidList.valueAt(n);\r\n            parentPane.setLayoutArg(rowContainerPanes[rowGuidTemp], n);\r\n        }\r\n\r\n        drawable.redraw();\r\n    };\r\n    guidList.valueMoved.on(valueMoved);\r\n\r\n    const removeRow = function (rowGuid: string, rowIndex: number) {\r\n        const pane: Pane = rowContainerPanes[rowGuid];\r\n        pane.dispose.fire();\r\n        parentPane.removePane(pane);\r\n        parentPane.updateLayoutArgs(function (layoutArg: any): any {\r\n            const shift = (isNumber(layoutArg) && layoutArg > rowIndex);\r\n            return (shift ? layoutArg - 1 : layoutArg);\r\n        });\r\n        delete rowContainerPanes[rowGuid];\r\n\r\n        drawable.redraw();\r\n    };\r\n    guidList.valueRemoved.on(removeRow);\r\n\r\n    // Handle listing for hidden property\r\n    //\r\n\r\n    const attrsChangedListeners = {};\r\n\r\n    const attachAttrsChangedListener = function (rowGuid: string, rowIndex: number) {\r\n        const row = model.row(rowGuid);\r\n        const attrsChangedListener = function () {\r\n            if (hasval(row.hidden && hasval(rowContainerPanes[rowGuid]))) {\r\n                parentPane.layoutOptions(rowContainerPanes[rowGuid]).hide = row.hidden;\r\n                drawable.redraw();\r\n            }\r\n        };\r\n        attrsChangedListeners[rowGuid] = attrsChangedListener;\r\n        row.attrsChanged.on(attrsChangedListener);\r\n    };\r\n\r\n    const unattachAttrsChangedListener = function (rowGuid: string, rowIndex: number) {\r\n        const row = model.row(rowGuid);\r\n        row.attrsChanged.off(attrsChangedListeners[rowGuid]);\r\n    };\r\n\r\n    guidList.forEach(attachAttrsChangedListener);\r\n    guidList.valueAdded.on(attachAttrsChangedListener);\r\n    guidList.valueRemoved.on(unattachAttrsChangedListener);\r\n\r\n    // Redraw\r\n    //\r\n\r\n    drawable.redraw();\r\n\r\n    // Dispose\r\n\r\n    parentPane.dispose.on(function () {\r\n        guidList.valueAdded.off(addRow);\r\n        guidList.valueMoved.off(valueMoved);\r\n        guidList.valueRemoved.off(removeRow);\r\n\r\n        guidList.valueAdded.off(attachAttrsChangedListener);\r\n        guidList.valueRemoved.off(unattachAttrsChangedListener);\r\n    });\r\n}\r\n","// Util\r\n\r\nexport * from './webglimpse/util/util';\r\nexport * from './webglimpse/util/cache';\r\nexport * from './webglimpse/util/multikey_cache';\r\nexport * from './webglimpse/bounds';\r\nexport * from './webglimpse/color';\r\nexport * from './webglimpse/matrix';\r\nexport * from './webglimpse/util/ordered_set';\r\nexport * from './webglimpse/util/notification';\r\nexport * from './webglimpse/util/sorted_arrays';\r\nexport * from './webglimpse/util/binary_tree';\r\nexport * from './webglimpse/util/sorted_multimap';\r\nexport * from './webglimpse/util/split';\r\n\r\n\r\n// WebGL\r\n\r\nexport * from './webglimpse/buffer';\r\nexport * from './webglimpse/shader';\r\nexport * from './webglimpse/texture';\r\nexport * from './webglimpse/text';\r\n\r\n\r\n// Core\r\n\r\nexport * from './webglimpse/core';\r\nexport * from './webglimpse/misc';\r\nexport * from './webglimpse/label';\r\nexport * from './webglimpse/scroll';\r\nexport * from './webglimpse/layout/inset_layout';\r\nexport * from './webglimpse/layout/corner_layout';\r\nexport * from './webglimpse/layout/row_layout';\r\nexport * from './webglimpse/layout/column_layout';\r\nexport * from './webglimpse/layout/overlay_layout';\r\nexport * from './webglimpse/layout/card_layout';\r\nexport * from './webglimpse/painter/border_painter';\r\nexport * from './webglimpse/plot/axis';\r\nexport * from './webglimpse/plot/plot_layout';\r\nexport * from './webglimpse/plot/edge_axis_painter';\r\nexport * from './webglimpse/plot/line_painter';\r\nexport * from './webglimpse/gradient';\r\nexport * from './webglimpse/plot/heatmap_painter';\r\n\r\n\r\n// Time\r\n\r\nexport * from './webglimpse/time';\r\nexport * from './webglimpse/timeline/time_axis';\r\nexport * from './webglimpse/timeline/time_axis_painter';\r\nexport * from './webglimpse/timeline/time_grid_painter';\r\nexport * from './webglimpse/timeline/timeline_model';\r\nexport * from './webglimpse/timeline/timeline_layout';\r\nexport * from './webglimpse/timeline/timeline_cursor_painter';\r\nexport * from './webglimpse/timeline/timeline_annotation_painter';\r\nexport * from './webglimpse/timeline/timeline_annotation_style';\r\nexport * from './webglimpse/timeline/timeline_event_style';\r\nexport * from './webglimpse/timeline/timeline_ui';\r\nexport * from './webglimpse/timeline/timeline_row';\r\nexport * from './webglimpse/timeline/timeline_lanes';\r\nexport * from './webglimpse/timeline/timeline_events_row';\r\nexport * from './webglimpse/timeline/timeline_timeseries_row';\r\nexport * from './webglimpse/timeline/timeline_styles';\r\nexport * from './webglimpse/timeline/timeline_pane';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["clamp"],"mappings":"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"}