UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

102 lines 15.2 kB
/* * Copyright (c) 2014, Metron, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import { Pane } from '../core'; import { newBackgroundPainter } from '../misc'; import { hasval } from '../util/util'; export function newInsets(...insets) { switch (insets.length) { case 1: return { top: insets[0], right: insets[0], bottom: insets[0], left: insets[0] }; case 2: return { top: insets[0], right: insets[1], bottom: insets[0], left: insets[1] }; case 3: return { top: insets[0], right: insets[1], bottom: insets[2], left: insets[1] }; case 4: return { top: insets[0], right: insets[1], bottom: insets[2], left: insets[3] }; default: throw new Error('Expected 1, 2, 3, or 4 args, but found ' + insets.length); } } export function newInsetLayout(insets) { return { updatePrefSize: function (parentPrefSize, children) { if (children.length === 0) { parentPrefSize.w = insets.left + insets.right; parentPrefSize.h = insets.top + insets.bottom; } else if (children.length === 1) { const childPrefSize = children[0].prefSize; parentPrefSize.w = (hasval(childPrefSize.w) ? childPrefSize.w + insets.left + insets.right : null); parentPrefSize.h = (hasval(childPrefSize.h) ? childPrefSize.h + insets.top + insets.bottom : null); } else if (children.length > 1) { throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children'); } }, updateChildViewports: function (children, parentViewport) { if (children.length === 1) { const childViewport = children[0].viewport; childViewport.setEdges(parentViewport.iStart + insets.left, parentViewport.iEnd - insets.right, parentViewport.jStart + insets.bottom, parentViewport.jEnd - insets.top); } else if (children.length > 1) { throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children'); } } }; } export function newInsetPane(pane, insets, bgColor = null, consumeInputEvents = true) { const insetPane = new Pane(newInsetLayout(insets), consumeInputEvents); if (hasval(bgColor)) { insetPane.addPainter(newBackgroundPainter(bgColor)); } insetPane.addPane(pane); return insetPane; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXRfbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvbGF5b3V0L2luc2V0X2xheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE9BQU8sRUFBdUIsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBV3RDLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBRyxNQUFnQjtJQUN6QyxRQUFRLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFFbkIsS0FBSyxDQUFDO1lBQ0YsT0FBTztnQkFDSCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZCxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ2xCLENBQUM7UUFFTixLQUFLLENBQUM7WUFDRixPQUFPO2dCQUNILEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDbEIsQ0FBQztRQUVOLEtBQUssQ0FBQztZQUNGLE9BQU87Z0JBQ0gsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUNsQixDQUFDO1FBRU4sS0FBSyxDQUFDO1lBQ0YsT0FBTztnQkFDSCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZCxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ2xCLENBQUM7UUFFTjtZQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2xGO0FBQ0wsQ0FBQztBQUdELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYztJQUN6QyxPQUFlO1FBQ1gsY0FBYyxFQUFFLFVBQVUsY0FBb0IsRUFBRSxRQUF1QjtZQUNuRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixjQUFjLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDOUMsY0FBYyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDakQ7aUJBQ0ksSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDM0MsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkcsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RztpQkFDSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2FBQ2xIO1FBQ0wsQ0FBQztRQUNELG9CQUFvQixFQUFFLFVBQVUsUUFBdUIsRUFBRSxjQUFrQztZQUN2RixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUMzQyxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksRUFDdEQsY0FBYyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUNsQyxjQUFjLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQ3JDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pDO2lCQUNJLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUM7YUFDbEg7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUM7QUFHRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQVUsRUFBRSxNQUFjLEVBQUUsVUFBaUIsSUFBSSxFQUFFLHFCQUE4QixJQUFJO0lBQzlHLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUN2RDtJQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgTWV0cm9uLCBJbmMuXHJcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXHJcbiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcclxuICpcclxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXHJcbiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxyXG4gKlxyXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXHJcbiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cclxuICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXHJcbiAqXHJcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXHJcbiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XHJcbiAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXHJcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXHJcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcclxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcclxuICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXHJcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcclxuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXHJcbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXHJcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXHJcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKi9cclxuaW1wb3J0IHsgTGF5b3V0LCBMYXlvdXRFbnRyeSwgUGFuZSB9IGZyb20gJy4uL2NvcmUnO1xyXG5pbXBvcnQgeyBTaXplLCBCb3VuZHNVbm1vZGlmaWFibGUgfSBmcm9tICcuLi9ib3VuZHMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL2NvbG9yJztcclxuaW1wb3J0IHsgbmV3QmFja2dyb3VuZFBhaW50ZXIgfSBmcm9tICcuLi9taXNjJztcclxuaW1wb3J0IHsgaGFzdmFsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEluc2V0cyB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIHJpZ2h0OiBudW1iZXI7XHJcbiAgICBib3R0b206IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdJbnNldHMoLi4uaW5zZXRzOiBudW1iZXJbXSk6IEluc2V0cyB7XHJcbiAgICBzd2l0Y2ggKGluc2V0cy5sZW5ndGgpIHtcclxuXHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzBdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMF1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMV1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMl0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMV1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMl0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbM11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAxLCAyLCAzLCBvciA0IGFyZ3MsIGJ1dCBmb3VuZCAnICsgaW5zZXRzLmxlbmd0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3SW5zZXRMYXlvdXQoaW5zZXRzOiBJbnNldHMpOiBMYXlvdXQge1xyXG4gICAgcmV0dXJuIDxMYXlvdXQ+e1xyXG4gICAgICAgIHVwZGF0ZVByZWZTaXplOiBmdW5jdGlvbiAocGFyZW50UHJlZlNpemU6IFNpemUsIGNoaWxkcmVuOiBMYXlvdXRFbnRyeVtdKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLncgPSBpbnNldHMubGVmdCArIGluc2V0cy5yaWdodDtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLmggPSBpbnNldHMudG9wICsgaW5zZXRzLmJvdHRvbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkUHJlZlNpemUgPSBjaGlsZHJlblswXS5wcmVmU2l6ZTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLncgPSAoaGFzdmFsKGNoaWxkUHJlZlNpemUudykgPyBjaGlsZFByZWZTaXplLncgKyBpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCA6IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50UHJlZlNpemUuaCA9IChoYXN2YWwoY2hpbGRQcmVmU2l6ZS5oKSA/IGNoaWxkUHJlZlNpemUuaCArIGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tIDogbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnNldCBsYXlvdXQgd29ya3Mgd2l0aCBhdCBtb3N0IDEgY2hpbGQsIGJ1dCBwYW5lIGhhcyAnICsgdGhpcy5jaGlsZHJlbi5sZW5ndGggKyAnIGNoaWxkcmVuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZUNoaWxkVmlld3BvcnRzOiBmdW5jdGlvbiAoY2hpbGRyZW46IExheW91dEVudHJ5W10sIHBhcmVudFZpZXdwb3J0OiBCb3VuZHNVbm1vZGlmaWFibGUpIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRWaWV3cG9ydCA9IGNoaWxkcmVuWzBdLnZpZXdwb3J0O1xyXG4gICAgICAgICAgICAgICAgY2hpbGRWaWV3cG9ydC5zZXRFZGdlcyhwYXJlbnRWaWV3cG9ydC5pU3RhcnQgKyBpbnNldHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWaWV3cG9ydC5pRW5kIC0gaW5zZXRzLnJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZpZXdwb3J0LmpTdGFydCArIGluc2V0cy5ib3R0b20sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vmlld3BvcnQuakVuZCAtIGluc2V0cy50b3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zZXQgbGF5b3V0IHdvcmtzIHdpdGggYXQgbW9zdCAxIGNoaWxkLCBidXQgcGFuZSBoYXMgJyArIHRoaXMuY2hpbGRyZW4ubGVuZ3RoICsgJyBjaGlsZHJlbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdJbnNldFBhbmUocGFuZTogUGFuZSwgaW5zZXRzOiBJbnNldHMsIGJnQ29sb3I6IENvbG9yID0gbnVsbCwgY29uc3VtZUlucHV0RXZlbnRzOiBib29sZWFuID0gdHJ1ZSk6IFBhbmUge1xyXG4gICAgY29uc3QgaW5zZXRQYW5lID0gbmV3IFBhbmUobmV3SW5zZXRMYXlvdXQoaW5zZXRzKSwgY29uc3VtZUlucHV0RXZlbnRzKTtcclxuICAgIGlmIChoYXN2YWwoYmdDb2xvcikpIHtcclxuICAgICAgICBpbnNldFBhbmUuYWRkUGFpbnRlcihuZXdCYWNrZ3JvdW5kUGFpbnRlcihiZ0NvbG9yKSk7XHJcbiAgICB9XHJcbiAgICBpbnNldFBhbmUuYWRkUGFuZShwYW5lKTtcclxuICAgIHJldHVybiBpbnNldFBhbmU7XHJcbn1cclxuXHJcblxyXG4iXX0=