all files / src/js/lite/ ui.js

1.05% Statements 2/190
0% Branches 0/97
2.33% Functions 1/43
0.53% Lines 1/189
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
(function(global){global.wrappers['/Users/lqez/Dev/summernote/src/js/lite/ui.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
exports.__esModule = true;
var renderer_1 = require("../base/renderer");
var TooltipUI_1 = require("./ui/TooltipUI");
var DropdownUI_1 = require("./ui/DropdownUI");
var ModalUI_1 = require("./ui/ModalUI");
var editor = renderer_1["default"].create('<div class="note-editor note-frame"/>');
var toolbar = renderer_1["default"].create('<div class="note-toolbar" role="toolbar"/>');
var editingArea = renderer_1["default"].create('<div class="note-editing-area"/>');
var codable = renderer_1["default"].create('<textarea class="note-codable" role="textbox" aria-multiline="true"/>');
var editable = renderer_1["default"].create('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"/>');
var statusbar = renderer_1["default"].create([
    '<output class="note-status-output" role="status" aria-live="polite"/>',
    '<div class="note-statusbar" role="resize">',
    '  <div class="note-resizebar" role="seperator" aria-orientation="horizontal" aria-label="resize">',
    '    <div class="note-icon-bar"/>',
    '    <div class="note-icon-bar"/>',
    '    <div class="note-icon-bar"/>',
    '  </div>',
    '</div>',
].join(''));
var airEditor = renderer_1["default"].create('<div class="note-editor"/>');
var airEditable = renderer_1["default"].create([
    '<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"/>',
    '<output class="note-status-output" role="status" aria-live="polite"/>',
].join(''));
var buttonGroup = renderer_1["default"].create('<div class="note-btn-group">');
var button = renderer_1["default"].create('<button type="button" class="note-btn" role="button" tabindex="-1">', function ($node, options) {
    // set button type
    if (options && options.tooltip) {
        $node.attr({
            'aria-label': options.tooltip
        });
        $node.data('_lite_tooltip', new TooltipUI_1["default"]($node, {
            title: options.tooltip,
            container: options.container
        })).on('click', function (e) {
            $(e.currentTarget).data('_lite_tooltip').hide();
        });
    }
    if (options.contents) {
        $node.html(options.contents);
    }
    if (options && options.data && options.data.toggle === 'dropdown') {
        $node.data('_lite_dropdown', new DropdownUI_1["default"]($node, {
            container: options.container
        }));
    }
});
var dropdown = renderer_1["default"].create('<div class="note-dropdown-menu" role="list">', function ($node, options) {
    var markup = $.isArray(options.items) ? options.items.map(function (item) {
        var value = (typeof item === 'string') ? item : (item.value || '');
        var content = options.template ? options.template(item) : item;
        var $temp = $('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + value + '"></a>');
        $temp.html(content).data('item', item);
        return $temp;
    }) : options.items;
    $node.html(markup).attr({ 'aria-label': options.title });
    $node.on('click', '> .note-dropdown-item', function (e) {
        var $a = $(this);
        var item = $a.data('item');
        var value = $a.data('value');
        if (item.click) {
            item.click($a);
        }
        else if (options.itemClick) {
            options.itemClick(e, item, value);
        }
    });
});
var dropdownCheck = renderer_1["default"].create('<div class="note-dropdown-menu note-check" role="list">', function ($node, options) {
    var markup = $.isArray(options.items) ? options.items.map(function (item) {
        var value = (typeof item === 'string') ? item : (item.value || '');
        var content = options.template ? options.template(item) : item;
        var $temp = $('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '"></a>');
        $temp.html([icon(options.checkClassName), ' ', content]).data('item', item);
        return $temp;
    }) : options.items;
    $node.html(markup).attr({ 'aria-label': options.title });
    $node.on('click', '> .note-dropdown-item', function (e) {
        var $a = $(this);
        var item = $a.data('item');
        var value = $a.data('value');
        if (item.click) {
            item.click($a);
        }
        else if (options.itemClick) {
            options.itemClick(e, item, value);
        }
    });
});
var dropdownButtonContents = function (contents, options) {
    return contents + ' ' + icon(options.icons.caret, 'span');
};
var dropdownButton = function (opt, callback) {
    return buttonGroup([
        button({
            className: 'dropdown-toggle',
            contents: opt.title + ' ' + icon('note-icon-caret'),
            tooltip: opt.tooltip,
            data: {
                toggle: 'dropdown'
            }
        }),
        dropdown({
            className: opt.className,
            items: opt.items,
            template: opt.template,
            itemClick: opt.itemClick
        }),
    ], { callback: callback }).render();
};
var dropdownCheckButton = function (opt, callback) {
    return buttonGroup([
        button({
            className: 'dropdown-toggle',
            contents: opt.title + ' ' + icon('note-icon-caret'),
            tooltip: opt.tooltip,
            data: {
                toggle: 'dropdown'
            }
        }),
        dropdownCheck({
            className: opt.className,
            checkClassName: opt.checkClassName,
            items: opt.items,
            template: opt.template,
            itemClick: opt.itemClick
        }),
    ], { callback: callback }).render();
};
var paragraphDropdownButton = function (opt) {
    return buttonGroup([
        button({
            className: 'dropdown-toggle',
            contents: opt.title + ' ' + icon('note-icon-caret'),
            tooltip: opt.tooltip,
            data: {
                toggle: 'dropdown'
            }
        }),
        dropdown([
            buttonGroup({
                className: 'note-align',
                children: opt.items[0]
            }),
            buttonGroup({
                className: 'note-list',
                children: opt.items[1]
            }),
        ]),
    ]).render();
};
var tableMoveHandler = function (event, col, row) {
    var PX_PER_EM = 18;
    var $picker = $(event.target.parentNode); // target is mousecatcher
    var $dimensionDisplay = $picker.next();
    var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
    var $highlighted = $picker.find('.note-dimension-picker-highlighted');
    var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
    var posOffset;
    // HTML5 with jQuery - e.offsetX is undefined in Firefox
    if (event.offsetX === undefined) {
        var posCatcher = $(event.target).offset();
        posOffset = {
            x: event.pageX - posCatcher.left,
            y: event.pageY - posCatcher.top
        };
    }
    else {
        posOffset = {
            x: event.offsetX,
            y: event.offsetY
        };
    }
    var dim = {
        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
    };
    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });
    $catcher.data('value', dim.c + 'x' + dim.r);
    if (dim.c > 3 && dim.c < col) {
        $unhighlighted.css({ width: dim.c + 1 + 'em' });
    }
    if (dim.r > 3 && dim.r < row) {
        $unhighlighted.css({ height: dim.r + 1 + 'em' });
    }
    $dimensionDisplay.html(dim.c + ' x ' + dim.r);
};
var tableDropdownButton = function (opt) {
    return buttonGroup([
        button({
            className: 'dropdown-toggle',
            contents: opt.title + ' ' + icon('note-icon-caret'),
            tooltip: opt.tooltip,
            data: {
                toggle: 'dropdown'
            }
        }),
        dropdown({
            className: 'note-table',
            items: [
                '<div class="note-dimension-picker">',
                '  <div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"/>',
                '  <div class="note-dimension-picker-highlighted"/>',
                '  <div class="note-dimension-picker-unhighlighted"/>',
                '</div>',
                '<div class="note-dimension-display">1 x 1</div>',
            ].join('')
        }),
    ], {
        callback: function ($node) {
            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
            $catcher.css({
                width: opt.col + 'em',
                height: opt.row + 'em'
            })
                .mousedown(opt.itemClick)
                .mousemove(function (e) {
                tableMoveHandler(e, opt.col, opt.row);
            });
        }
    }).render();
};
var palette = renderer_1["default"].create('<div class="note-color-palette"/>', function ($node, options) {
    var contents = [];
    for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
        var eventName = options.eventName;
        var colors = options.colors[row];
        var colorsName = options.colorsName[row];
        var buttons = [];
        for (var col = 0, colSize = colors.length; col < colSize; col++) {
            var color = colors[col];
            var colorName = colorsName[col];
            buttons.push([
                '<button type="button" class="note-btn note-color-btn"',
                'style="background-color:', color, '" ',
                'data-event="', eventName, '" ',
                'data-value="', color, '" ',
                'title="', colorName, '" ',
                'aria-label="', colorName, '" ',
                'data-toggle="button" tabindex="-1"></button>',
            ].join(''));
        }
        contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
    }
    $node.html(contents.join(''));
    $node.find('.note-color-btn').each(function () {
        $(this).data('_lite_tooltip', new TooltipUI_1["default"]($(this), {
            container: options.container
        }));
    });
});
var colorDropdownButton = function (opt, type) {
    return buttonGroup({
        className: 'note-color',
        children: [
            button({
                className: 'note-current-color-button',
                contents: opt.title,
                tooltip: opt.lang.color.recent,
                click: opt.currentClick,
                callback: function ($button) {
                    var $recentColor = $button.find('.note-recent-color');
                    if (type !== 'foreColor') {
                        $recentColor.css('background-color', '#FFFF00');
                        $button.attr('data-backColor', '#FFFF00');
                    }
                }
            }),
            button({
                className: 'dropdown-toggle',
                contents: icon('note-icon-caret'),
                tooltip: opt.lang.color.more,
                data: {
                    toggle: 'dropdown'
                }
            }),
            dropdown({
                items: [
                    '<div>',
                    '<div class="note-btn-group btn-background-color">',
                    '  <div class="note-palette-title">' + opt.lang.color.background + '</div>',
                    '  <div>',
                    '<button type="button" class="note-color-reset note-btn note-btn-block" ' +
                        ' data-event="backColor" data-value="inherit">',
                    opt.lang.color.transparent,
                    '    </button>',
                    '  </div>',
                    '  <div class="note-holder" data-event="backColor"/>',
                    '  <div class="btn-sm">',
                    '    <input type="color" id="html5bcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">',
                    '    <button type="button" class="note-color-reset btn" data-event="backColor" data-value="cpbackColor">',
                    opt.lang.color.cpSelect,
                    '    </button>',
                    '  </div>',
                    '</div>',
                    '<div class="note-btn-group btn-foreground-color">',
                    '  <div class="note-palette-title">' + opt.lang.color.foreground + '</div>',
                    '  <div>',
                    '<button type="button" class="note-color-reset note-btn note-btn-block" ' +
                        ' data-event="removeFormat" data-value="foreColor">',
                    opt.lang.color.resetToDefault,
                    '    </button>',
                    '  </div>',
                    '  <div class="note-holder" data-event="foreColor"/>',
                    '  <div class="btn-sm">',
                    '    <input type="color" id="html5fcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">',
                    '    <button type="button" class="note-color-reset btn" data-event="foreColor" data-value="cpforeColor">',
                    opt.lang.color.cpSelect,
                    '    </button>',
                    '  </div>',
                    '</div>',
                    '</div>',
                ].join(''),
                callback: function ($dropdown) {
                    $dropdown.find('.note-holder').each(function () {
                        var $holder = $(this);
                        $holder.append(palette({
                            colors: opt.colors,
                            eventName: $holder.data('event')
                        }).render());
                    });
                    if (type === 'fore') {
                        $dropdown.find('.btn-background-color').hide();
                        $dropdown.css({ 'min-width': '210px' });
                    }
                    else if (type === 'back') {
                        $dropdown.find('.btn-foreground-color').hide();
                        $dropdown.css({ 'min-width': '210px' });
                    }
                },
                click: function (event) {
                    var $button = $(event.target);
                    var eventName = $button.data('event');
                    var value = $button.data('value');
                    var foreinput = document.getElementById('html5fcp').value;
                    var backinput = document.getElementById('html5bcp').value;
                    if (value === 'cp') {
                        event.stopPropagation();
                    }
                    else if (value === 'cpbackColor') {
                        value = backinput;
                    }
                    else if (value === 'cpforeColor') {
                        value = foreinput;
                    }
                    if (eventName && value) {
                        var key = eventName === 'backColor' ? 'background-color' : 'color';
                        var $color = $button.closest('.note-color').find('.note-recent-color');
                        var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
                        $color.css(key, value);
                        $currentButton.attr('data-' + eventName, value);
                        if (type === 'fore') {
                            opt.itemClick('foreColor', value);
                        }
                        else if (type === 'back') {
                            opt.itemClick('backColor', value);
                        }
                        else {
                            opt.itemClick(eventName, value);
                        }
                    }
                }
            }),
        ]
    }).render();
};
var dialog = renderer_1["default"].create('<div class="note-modal" aria-hidden="false" tabindex="-1" role="dialog"/>', function ($node, options) {
    if (options.fade) {
        $node.addClass('fade');
    }
    $node.attr({
        'aria-label': options.title
    });
    $node.html([
        '  <div class="note-modal-content">',
        (options.title
            ? '    <div class="note-modal-header">' +
                '      <button type="button" class="close" aria-label="Close" aria-hidden="true"><i class="note-icon-close"></i></button>' +
                '      <h4 class="note-modal-title">' + options.title + '</h4>' +
                '    </div>' : ''),
        '    <div class="note-modal-body">' + options.body + '</div>',
        (options.footer
            ? '    <div class="note-modal-footer">' + options.footer + '</div>' : ''),
        '  </div>',
    ].join(''));
    $node.data('modal', new ModalUI_1["default"]($node, options));
});
var videoDialog = function (opt) {
    var body = '<div class="note-form-group">' +
        '<label class="note-form-label">' +
        opt.lang.video.url + ' <small class="text-muted">' +
        opt.lang.video.providers + '</small>' +
        '</label>' +
        '<input class="note-video-url note-input" type="text" />' +
        '</div>';
    var footer = [
        '<button type="button" href="#" class="note-btn note-btn-primary note-video-btn disabled" disabled>',
        opt.lang.video.insert,
        '</button>',
    ].join('');
    return dialog({
        title: opt.lang.video.insert,
        fade: opt.fade,
        body: body,
        footer: footer
    }).render();
};
var imageDialog = function (opt) {
    var body = '<div class="note-form-group note-group-select-from-files">' +
        '<label class="note-form-label">' + opt.lang.image.selectFromFiles + '</label>' +
        '<input class="note-note-image-input note-input" type="file" name="files" accept="image/*" multiple="multiple" />' +
        opt.imageLimitation +
        '</div>' +
        '<div class="note-form-group" style="overflow:auto;">' +
        '<label class="note-form-label">' + opt.lang.image.url + '</label>' +
        '<input class="note-image-url note-input" type="text" />' +
        '</div>';
    var footer = [
        '<button href="#" type="button" class="note-btn note-btn-primary note-btn-large note-image-btn disabled" disabled>',
        opt.lang.image.insert,
        '</button>',
    ].join('');
    return dialog({
        title: opt.lang.image.insert,
        fade: opt.fade,
        body: body,
        footer: footer
    }).render();
};
var linkDialog = function (opt) {
    var body = '<div class="note-form-group">' +
        '<label class="note-form-label">' + opt.lang.link.textToDisplay + '</label>' +
        '<input class="note-link-text note-input" type="text" />' +
        '</div>' +
        '<div class="note-form-group">' +
        '<label class="note-form-label">' + opt.lang.link.url + '</label>' +
        '<input class="note-link-url note-input" type="text" value="http://" />' +
        '</div>' +
        (!opt.disableLinkTarget
            ? '<div class="checkbox">' +
                '<label>' + '<input type="checkbox" checked> ' + opt.lang.link.openInNewWindow + '</label>' +
                '</div>' : '');
    var footer = [
        '<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>',
        opt.lang.link.insert,
        '</button>',
    ].join('');
    return dialog({
        className: 'link-dialog',
        title: opt.lang.link.insert,
        fade: opt.fade,
        body: body,
        footer: footer
    }).render();
};
var popover = renderer_1["default"].create([
    '<div class="note-popover bottom">',
    '  <div class="note-popover-arrow"/>',
    '  <div class="popover-content note-children-container"/>',
    '</div>',
].join(''), function ($node, options) {
    var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
    $node.addClass(direction).hide();
    if (options.hideArrow) {
        $node.find('.note-popover-arrow').hide();
    }
});
var checkbox = renderer_1["default"].create('<div class="checkbox"></div>', function ($node, options) {
    $node.html([
        '<label' + (options.id ? ' for="' + options.id + '"' : '') + '>',
        ' <input role="checkbox" type="checkbox"' + (options.id ? ' id="' + options.id + '"' : ''),
        (options.checked ? ' checked' : ''),
        ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>',
        (options.text ? options.text : ''),
        '</label>',
    ].join(''));
});
var icon = function (iconClassName, tagName) {
    tagName = tagName || 'i';
    return '<' + tagName + ' class="' + iconClassName + '"/>';
};
var ui = {
    editor: editor,
    toolbar: toolbar,
    editingArea: editingArea,
    codable: codable,
    editable: editable,
    statusbar: statusbar,
    airEditor: airEditor,
    airEditable: airEditable,
    buttonGroup: buttonGroup,
    button: button,
    dropdown: dropdown,
    dropdownCheck: dropdownCheck,
    dropdownButton: dropdownButton,
    dropdownButtonContents: dropdownButtonContents,
    dropdownCheckButton: dropdownCheckButton,
    paragraphDropdownButton: paragraphDropdownButton,
    tableDropdownButton: tableDropdownButton,
    colorDropdownButton: colorDropdownButton,
    palette: palette,
    dialog: dialog,
    videoDialog: videoDialog,
    imageDialog: imageDialog,
    linkDialog: linkDialog,
    popover: popover,
    checkbox: checkbox,
    icon: icon,
    toggleBtn: function ($btn, isEnable) {
        $btn.toggleClass('disabled', !isEnable);
        $btn.attr('disabled', !isEnable);
    },
    toggleBtnActive: function ($btn, isActive) {
        $btn.toggleClass('active', isActive);
    },
    check: function ($dom, value) {
        $dom.find('.checked').removeClass('checked');
        $dom.find('[data-value="' + value + '"]').addClass('checked');
    },
    onDialogShown: function ($dialog, handler) {
        $dialog.one('note.modal.show', handler);
    },
    onDialogHidden: function ($dialog, handler) {
        $dialog.one('note.modal.hide', handler);
    },
    showDialog: function ($dialog) {
        $dialog.data('modal').show();
    },
    hideDialog: function ($dialog) {
        $dialog.data('modal').hide();
    },
    /**
     * get popover content area
     *
     * @param $popover
     * @returns {*}
     */
    getPopoverContent: function ($popover) {
        return $popover.find('.note-popover-content');
    },
    /**
     * get dialog's body area
     *
     * @param $dialog
     * @returns {*}
     */
    getDialogBody: function ($dialog) {
        return $dialog.find('.note-modal-body');
    },
    createLayout: function ($note, options) {
        var $editor = (options.airMode ? ui.airEditor([
            ui.editingArea([
                ui.airEditable(),
            ]),
        ]) : ui.editor([
            ui.toolbar(),
            ui.editingArea([
                ui.codable(),
                ui.editable(),
            ]),
            ui.statusbar(),
        ])).render();
        $editor.insertAfter($note);
        return {
            note: $note,
            editor: $editor,
            toolbar: $editor.find('.note-toolbar'),
            editingArea: $editor.find('.note-editing-area'),
            editable: $editor.find('.note-editable'),
            codable: $editor.find('.note-codable'),
            statusbar: $editor.find('.note-statusbar')
        };
    },
    removeLayout: function ($note, layoutInfo) {
        $note.html(layoutInfo.editable.html());
        layoutInfo.editor.remove();
        $note.off('summernote'); // remove summernote custom event
        $note.show();
    }
};
exports["default"] = ui;
 
},'src/js/lite/ui.js',{"../base/renderer":"/Users/lqez/Dev/summernote/src/js/base/renderer.js","./ui/TooltipUI":"/Users/lqez/Dev/summernote/src/js/lite/ui/TooltipUI.js","./ui/DropdownUI":"/Users/lqez/Dev/summernote/src/js/lite/ui/DropdownUI.js","./ui/ModalUI":"/Users/lqez/Dev/summernote/src/js/lite/ui/ModalUI.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1aS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUF3QztBQUN4Qyw0Q0FBdUM7QUFDdkMsOENBQXlDO0FBQ3pDLHdDQUFtQztBQUVuQyxJQUFNLE1BQU0sR0FBRyxxQkFBUSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0FBQ3hFLElBQU0sT0FBTyxHQUFHLHFCQUFRLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7QUFDOUUsSUFBTSxXQUFXLEdBQUcscUJBQVEsQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztBQUN4RSxJQUFNLE9BQU8sR0FBRyxxQkFBUSxDQUFDLE1BQU0sQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO0FBQ3pHLElBQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsTUFBTSxDQUFDLDBGQUEwRixDQUFDLENBQUM7QUFDN0gsSUFBTSxTQUFTLEdBQUcscUJBQVEsQ0FBQyxNQUFNLENBQUM7SUFDaEMsdUVBQXVFO0lBQ3ZFLDRDQUE0QztJQUM1QyxtR0FBbUc7SUFDbkcsa0NBQWtDO0lBQ2xDLGtDQUFrQztJQUNsQyxrQ0FBa0M7SUFDbEMsVUFBVTtJQUNWLFFBQVE7Q0FDVCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRVosSUFBTSxTQUFTLEdBQUcscUJBQVEsQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNoRSxJQUFNLFdBQVcsR0FBRyxxQkFBUSxDQUFDLE1BQU0sQ0FBQztJQUNsQywwRkFBMEY7SUFDMUYsdUVBQXVFO0NBQ3hFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFWixJQUFNLFdBQVcsR0FBRyxxQkFBUSxDQUFDLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3BFLElBQU0sTUFBTSxHQUFHLHFCQUFRLENBQUMsTUFBTSxDQUFDLHFFQUFxRSxFQUFFLFVBQVMs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LENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1FBQzFELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUM7Q0FDRixDQUFDO0FBRUYscUJBQWUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlbmRlcmVyIGZyb20gJy4uL2Jhc2UvcmVuZGVyZXInO1xuaW1wb3J0IFRvb2x0aXBVSSBmcm9tICcuL3VpL1Rvb2x0aXBVSSc7XG5pbXBvcnQgRHJvcGRvd25VSSBmcm9tICcuL3VpL0Ryb3Bkb3duVUknO1xuaW1wb3J0IE1vZGFsVUkgZnJvbSAnLi91aS9Nb2RhbFVJJztcblxuY29uc3QgZWRpdG9yID0gcmVuZGVyZXIuY3JlYXRlKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0b3Igbm90ZS1mcmFtZVwiLz4nKTtcbmNvbnN0IHRvb2xiYXIgPSByZW5kZXJlci5jcmVhdGUoJzxkaXYgY2xhc3M9XCJub3RlLXRvb2xiYXJcIiByb2xlPVwidG9vbGJhclwiLz4nKTtcbmNvbnN0IGVkaXRpbmdBcmVhID0gcmVuZGVyZXIuY3JlYXRlKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0aW5nLWFyZWFcIi8+Jyk7XG5jb25zdCBjb2RhYmxlID0gcmVuZGVyZXIuY3JlYXRlKCc8dGV4dGFyZWEgY2xhc3M9XCJub3RlLWNvZGFibGVcIiByb2xlPVwidGV4dGJveFwiIGFyaWEtbXVsdGlsaW5lPVwidHJ1ZVwiLz4nKTtcbmNvbnN0IGVkaXRhYmxlID0gcmVuZGVyZXIuY3JlYXRlKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiIGNvbnRlbnRFZGl0YWJsZT1cInRydWVcIiByb2xlPVwidGV4dGJveFwiIGFyaWEtbXVsdGlsaW5lPVwidHJ1ZVwiLz4nKTtcbmNvbnN0IHN0YXR1c2JhciA9IHJlbmRlcmVyLmNyZWF0ZShbXG4gICc8b3V0cHV0IGNsYXNzPVwibm90ZS1zdGF0dXMtb3V0cHV0XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiLz4nLFxuICAnPGRpdiBjbGFzcz1cIm5vdGUtc3RhdHVzYmFyXCIgcm9sZT1cInJlc2l6ZVwiPicsXG4gICcgIDxkaXYgY2xhc3M9XCJub3RlLXJlc2l6ZWJhclwiIHJvbGU9XCJzZXBlcmF0b3JcIiBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiIGFyaWEtbGFiZWw9XCJyZXNpemVcIj4nLFxuICAnICAgIDxkaXYgY2xhc3M9XCJub3RlLWljb24tYmFyXCIvPicsXG4gICcgICAgPGRpdiBjbGFzcz1cIm5vdGUtaWNvbi1iYXJcIi8+JyxcbiAgJyAgICA8ZGl2IGNsYXNzPVwibm90ZS1pY29uLWJhclwiLz4nLFxuICAnICA8L2Rpdj4nLFxuICAnPC9kaXY+Jyxcbl0uam9pbignJykpO1xuXG5jb25zdCBhaXJFZGl0b3IgPSByZW5kZXJlci5jcmVhdGUoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRvclwiLz4nKTtcbmNvbnN0IGFpckVkaXRhYmxlID0gcmVuZGVyZXIuY3JlYXRlKFtcbiAgJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCIgY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiIHJvbGU9XCJ0ZXh0Ym94XCIgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCIvPicsXG4gICc8b3V0cHV0IGNsYXNzPVwibm90ZS1zdGF0dXMtb3V0cHV0XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiLz4nLFxuXS5qb2luKCcnKSk7XG5cbmNvbnN0IGJ1dHRvbkdyb3VwID0gcmVuZGVyZXIuY3JlYXRlKCc8ZGl2IGNsYXNzPVwibm90ZS1idG4tZ3JvdXBcIj4nKTtcbmNvbnN0IGJ1dHRvbiA9IHJlbmRlcmVyLmNyZWF0ZSgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJub3RlLWJ0blwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCI+JywgZnVuY3Rpb24oJG5vZGUsIG9wdGlvbnMpIHtcbiAgLy8gc2V0IGJ1dHRvbiB0eXBlXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMudG9vbHRpcCkge1xuICAgICRub2RlLmF0dHIoe1xuICAgICAgJ2FyaWEtbGFiZWwnOiBvcHRpb25zLnRvb2x0aXAsXG4gICAgfSk7XG4gICAgJG5vZGUuZGF0YSgnX2xpdGVfdG9vbHRpcCcsIG5ldyBUb29sdGlwVUkoJG5vZGUsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRvb2x0aXAsXG4gICAgICBjb250YWluZXI6IG9wdGlvbnMuY29udGFpbmVyLFxuICAgIH0pKS5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ19saXRlX3Rvb2x0aXAnKS5oaWRlKCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY29udGVudHMpIHtcbiAgICAkbm9kZS5odG1sKG9wdGlvbnMuY29udGVudHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuZGF0YS50b2dnbGUgPT09ICdkcm9wZG93bicpIHtcbiAgICAkbm9kZS5kYXRhKCdfbGl0ZV9kcm9wZG93bicsIG5ldyBEcm9wZG93blVJKCRub2RlLCB7XG4gICAgICBjb250YWluZXI6IG9wdGlvbnMuY29udGFpbmVyLFxuICAgIH0pKTtcbiAgfVxufSk7XG5cbmNvbnN0IGRyb3Bkb3duID0gcmVuZGVyZXIuY3JlYXRlKCc8ZGl2IGNsYXNzPVwibm90ZS1kcm9wZG93bi1tZW51XCIgcm9sZT1cImxpc3RcIj4nLCBmdW5jdGlvbigkbm9kZSwgb3B0aW9ucykge1xuICBjb25zdCBtYXJrdXAgPSAkLmlzQXJyYXkob3B0aW9ucy5pdGVtcykgPyBvcHRpb25zLml0ZW1zLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgY29uc3QgdmFsdWUgPSAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGl0ZW0gOiAoaXRlbS52YWx1ZSB8fCAnJyk7XG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMudGVtcGxhdGUgPyBvcHRpb25zLnRlbXBsYXRlKGl0ZW0pIDogaXRlbTtcbiAgICBjb25zdCAkdGVtcCA9ICQoJzxhIGNsYXNzPVwibm90ZS1kcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHZhbHVlICsgJ1wiIHJvbGU9XCJsaXN0aXRlbVwiIGFyaWEtbGFiZWw9XCInICsgdmFsdWUgKyAnXCI+PC9hPicpO1xuXG4gICAgJHRlbXAuaHRtbChjb250ZW50KS5kYXRhKCdpdGVtJywgaXRlbSk7XG5cbiAgICByZXR1cm4gJHRlbXA7XG4gIH0pIDogb3B0aW9ucy5pdGVtcztcblxuICAkbm9kZS5odG1sKG1hcmt1cCkuYXR0cih7ICdhcmlhLWxhYmVsJzogb3B0aW9ucy50aXRsZSB9KTtcblxuICAkbm9kZS5vbignY2xpY2snLCAnPiAubm90ZS1kcm9wZG93bi1pdGVtJywgZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0ICRhID0gJCh0aGlzKTtcblxuICAgIGNvbnN0IGl0ZW0gPSAkYS5kYXRhKCdpdGVtJyk7XG4gICAgY29uc3QgdmFsdWUgPSAkYS5kYXRhKCd2YWx1ZScpO1xuXG4gICAgaWYgKGl0ZW0uY2xpY2spIHtcbiAgICAgIGl0ZW0uY2xpY2soJGEpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pdGVtQ2xpY2spIHtcbiAgICAgIG9wdGlvbnMuaXRlbUNsaWNrKGUsIGl0ZW0sIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmNvbnN0IGRyb3Bkb3duQ2hlY2sgPSByZW5kZXJlci5jcmVhdGUoJzxkaXYgY2xhc3M9XCJub3RlLWRyb3Bkb3duLW1lbnUgbm90ZS1jaGVja1wiIHJvbGU9XCJsaXN0XCI+JywgZnVuY3Rpb24oJG5vZGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgbWFya3VwID0gJC5pc0FycmF5KG9wdGlvbnMuaXRlbXMpID8gb3B0aW9ucy5pdGVtcy5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgIGNvbnN0IHZhbHVlID0gKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBpdGVtIDogKGl0ZW0udmFsdWUgfHwgJycpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBvcHRpb25zLnRlbXBsYXRlID8gb3B0aW9ucy50ZW1wbGF0ZShpdGVtKSA6IGl0ZW07XG5cbiAgICBjb25zdCAkdGVtcCA9ICQoJzxhIGNsYXNzPVwibm90ZS1kcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLXZhbHVlPVwiJyArIHZhbHVlICsgJ1wiIHJvbGU9XCJsaXN0aXRlbVwiIGFyaWEtbGFiZWw9XCInICsgaXRlbSArICdcIj48L2E+Jyk7XG4gICAgJHRlbXAuaHRtbChbaWNvbihvcHRpb25zLmNoZWNrQ2xhc3NOYW1lKSwgJyAnLCBjb250ZW50XSkuZGF0YSgnaXRlbScsIGl0ZW0pO1xuICAgIHJldHVybiAkdGVtcDtcbiAgfSkgOiBvcHRpb25zLml0ZW1zO1xuXG4gICRub2RlLmh0bWwobWFya3VwKS5hdHRyKHsgJ2FyaWEtbGFiZWwnOiBvcHRpb25zLnRpdGxlIH0pO1xuXG4gICRub2RlLm9uKCdjbGljaycsICc+IC5ub3RlLWRyb3Bkb3duLWl0ZW0nLCBmdW5jdGlvbihlKSB7XG4gICAgY29uc3QgJGEgPSAkKHRoaXMpO1xuXG4gICAgY29uc3QgaXRlbSA9ICRhLmRhdGEoJ2l0ZW0nKTtcbiAgICBjb25zdCB2YWx1ZSA9ICRhLmRhdGEoJ3ZhbHVlJyk7XG5cbiAgICBpZiAoaXRlbS5jbGljaykge1xuICAgICAgaXRlbS5jbGljaygkYSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLml0ZW1DbGljaykge1xuICAgICAgb3B0aW9ucy5pdGVtQ2xpY2soZSwgaXRlbSwgdmFsdWUpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuY29uc3QgZHJvcGRvd25CdXR0b25Db250ZW50cyA9IGZ1bmN0aW9uKGNvbnRlbnRzLCBvcHRpb25zKSB7XG4gIHJldHVybiBjb250ZW50cyArICcgJyArIGljb24ob3B0aW9ucy5pY29ucy5jYXJldCwgJ3NwYW4nKTtcbn07XG5cbmNvbnN0IGRyb3Bkb3duQnV0dG9uID0gZnVuY3Rpb24ob3B0LCBjYWxsYmFjaykge1xuICByZXR1cm4gYnV0dG9uR3JvdXAoW1xuICAgIGJ1dHRvbih7XG4gICAgICBjbGFzc05hbWU6ICdkcm9wZG93bi10b2dnbGUnLFxuICAgICAgY29udGVudHM6IG9wdC50aXRsZSArICcgJyArIGljb24oJ25vdGUtaWNvbi1jYXJldCcpLFxuICAgICAgdG9vbHRpcDogb3B0LnRvb2x0aXAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRvZ2dsZTogJ2Ryb3Bkb3duJyxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZHJvcGRvd24oe1xuICAgICAgY2xhc3NOYW1lOiBvcHQuY2xhc3NOYW1lLFxuICAgICAgaXRlbXM6IG9wdC5pdGVtcyxcbiAgICAgIHRlbXBsYXRlOiBvcHQudGVtcGxhdGUsXG4gICAgICBpdGVtQ2xpY2s6IG9wdC5pdGVtQ2xpY2ssXG4gICAgfSksXG4gIF0sIHsgY2FsbGJhY2s6IGNhbGxiYWNrIH0pLnJlbmRlcigpO1xufTtcblxuY29uc3QgZHJvcGRvd25DaGVja0J1dHRvbiA9IGZ1bmN0aW9uKG9wdCwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGJ1dHRvbkdyb3VwKFtcbiAgICBidXR0b24oe1xuICAgICAgY2xhc3NOYW1lOiAnZHJvcGRvd24tdG9nZ2xlJyxcbiAgICAgIGNvbnRlbnRzOiBvcHQudGl0bGUgKyAnICcgKyBpY29uKCdub3RlLWljb24tY2FyZXQnKSxcbiAgICAgIHRvb2x0aXA6IG9wdC50b29sdGlwLFxuICAgICAgZGF0YToge1xuICAgICAgICB0b2dnbGU6ICdkcm9wZG93bicsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIGRyb3Bkb3duQ2hlY2soe1xuICAgICAgY2xhc3NOYW1lOiBvcHQuY2xhc3NOYW1lLFxuICAgICAgY2hlY2tDbGFzc05hbWU6IG9wdC5jaGVja0NsYXNzTmFtZSxcbiAgICAgIGl0ZW1zOiBvcHQuaXRlbXMsXG4gICAgICB0ZW1wbGF0ZTogb3B0LnRlbXBsYXRlLFxuICAgICAgaXRlbUNsaWNrOiBvcHQuaXRlbUNsaWNrLFxuICAgIH0pLFxuICBdLCB7IGNhbGxiYWNrOiBjYWxsYmFjayB9KS5yZW5kZXIoKTtcbn07XG5cbmNvbnN0IHBhcmFncmFwaERyb3Bkb3duQnV0dG9uID0gZnVuY3Rpb24ob3B0KSB7XG4gIHJldHVybiBidXR0b25Hcm91cChbXG4gICAgYnV0dG9uKHtcbiAgICAgIGNsYXNzTmFtZTogJ2Ryb3Bkb3duLXRvZ2dsZScsXG4gICAgICBjb250ZW50czogb3B0LnRpdGxlICsgJyAnICsgaWNvbignbm90ZS1pY29uLWNhcmV0JyksXG4gICAgICB0b29sdGlwOiBvcHQudG9vbHRpcCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdG9nZ2xlOiAnZHJvcGRvd24nLFxuICAgICAgfSxcbiAgICB9KSxcbiAgICBkcm9wZG93bihbXG4gICAgICBidXR0b25Hcm91cCh7XG4gICAgICAgIGNsYXNzTmFtZTogJ25vdGUtYWxpZ24nLFxuICAgICAgICBjaGlsZHJlbjogb3B0Lml0ZW1zWzBdLFxuICAgICAgfSksXG4gICAgICBidXR0b25Hcm91cCh7XG4gICAgICAgIGNsYXNzTmFtZTogJ25vdGUtbGlzdCcsXG4gICAgICAgIGNoaWxkcmVuOiBvcHQuaXRlbXNbMV0sXG4gICAgICB9KSxcbiAgICBdKSxcbiAgXSkucmVuZGVyKCk7XG59O1xuXG5jb25zdCB0YWJsZU1vdmVIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQsIGNvbCwgcm93KSB7XG4gIGNvbnN0IFBYX1BFUl9FTSA9IDE4O1xuICBjb25zdCAkcGlja2VyID0gJChldmVudC50YXJnZXQucGFyZW50Tm9kZSk7IC8vIHRhcmdldCBpcyBtb3VzZWNhdGNoZXJcbiAgY29uc3QgJGRpbWVuc2lvbkRpc3BsYXkgPSAkcGlja2VyLm5leHQoKTtcbiAgY29uc3QgJGNhdGNoZXIgPSAkcGlja2VyLmZpbmQoJy5ub3RlLWRpbWVuc2lvbi1waWNrZXItbW91c2VjYXRjaGVyJyk7XG4gIGNvbnN0ICRoaWdobGlnaHRlZCA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci1oaWdobGlnaHRlZCcpO1xuICBjb25zdCAkdW5oaWdobGlnaHRlZCA9ICRwaWNrZXIuZmluZCgnLm5vdGUtZGltZW5zaW9uLXBpY2tlci11bmhpZ2hsaWdodGVkJyk7XG5cbiAgbGV0IHBvc09mZnNldDtcbiAgLy8gSFRNTDUgd2l0aCBqUXVlcnkgLSBlLm9mZnNldFggaXMgdW5kZWZpbmVkIGluIEZpcmVmb3hcbiAgaWYgKGV2ZW50Lm9mZnNldFggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHBvc0NhdGNoZXIgPSAkKGV2ZW50LnRhcmdldCkub2Zmc2V0KCk7XG4gICAgcG9zT2Zmc2V0ID0ge1xuICAgICAgeDogZXZlbnQucGFnZVggLSBwb3NDYXRjaGVyLmxlZnQsXG4gICAgICB5OiBldmVudC5wYWdlWSAtIHBvc0NhdGNoZXIudG9wLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcG9zT2Zmc2V0ID0ge1xuICAgICAgeDogZXZlbnQub2Zmc2V0WCxcbiAgICAgIHk6IGV2ZW50Lm9mZnNldFksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGRpbSA9IHtcbiAgICBjOiBNYXRoLmNlaWwocG9zT2Zmc2V0LnggLyBQWF9QRVJfRU0pIHx8IDEsXG4gICAgcjogTWF0aC5jZWlsKHBvc09mZnNldC55IC8gUFhfUEVSX0VNKSB8fCAxLFxuICB9O1xuXG4gICRoaWdobGlnaHRlZC5jc3MoeyB3aWR0aDogZGltLmMgKyAnZW0nLCBoZWlnaHQ6IGRpbS5yICsgJ2VtJyB9KTtcbiAgJGNhdGNoZXIuZGF0YSgndmFsdWUnLCBkaW0uYyArICd4JyArIGRpbS5yKTtcblxuICBpZiAoZGltLmMgPiAzICYmIGRpbS5jIDwgY29sKSB7XG4gICAgJHVuaGlnaGxpZ2h0ZWQuY3NzKHsgd2lkdGg6IGRpbS5jICsgMSArICdlbScgfSk7XG4gIH1cblxuICBpZiAoZGltLnIgPiAzICYmIGRpbS5yIDwgcm93KSB7XG4gICAgJHVuaGlnaGxpZ2h0ZWQuY3NzKHsgaGVpZ2h0OiBkaW0uciArIDEgKyAnZW0nIH0pO1xuICB9XG5cbiAgJGRpbWVuc2lvbkRpc3BsYXkuaHRtbChkaW0uYyArICcgeCAnICsgZGltLnIpO1xufTtcblxuY29uc3QgdGFibGVEcm9wZG93bkJ1dHRvbiA9IGZ1bmN0aW9uKG9wdCkge1xuICByZXR1cm4gYnV0dG9uR3JvdXAoW1xuICAgIGJ1dHRvbih7XG4gICAgICBjbGFzc05hbWU6ICdkcm9wZG93bi10b2dnbGUnLFxuICAgICAgY29udGVudHM6IG9wdC50aXRsZSArICcgJyArIGljb24oJ25vdGUtaWNvbi1jYXJldCcpLFxuICAgICAgdG9vbHRpcDogb3B0LnRvb2x0aXAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRvZ2dsZTogJ2Ryb3Bkb3duJyxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgZHJvcGRvd24oe1xuICAgICAgY2xhc3NOYW1lOiAnbm90ZS10YWJsZScsXG4gICAgICBpdGVtczogW1xuICAgICAgICAnPGRpdiBjbGFzcz1cIm5vdGUtZGltZW5zaW9uLXBpY2tlclwiPicsXG4gICAgICAgICcgIDxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXItbW91c2VjYXRjaGVyXCIgZGF0YS1ldmVudD1cImluc2VydFRhYmxlXCIgZGF0YS12YWx1ZT1cIjF4MVwiLz4nLFxuICAgICAgICAnICA8ZGl2IGNsYXNzPVwibm90ZS1kaW1lbnNpb24tcGlja2VyLWhpZ2hsaWdodGVkXCIvPicsXG4gICAgICAgICcgIDxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1waWNrZXItdW5oaWdobGlnaHRlZFwiLz4nLFxuICAgICAgICAnPC9kaXY+JyxcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJub3RlLWRpbWVuc2lvbi1kaXNwbGF5XCI+MSB4IDE8L2Rpdj4nLFxuICAgICAgXS5qb2luKCcnKSxcbiAgICB9KSxcbiAgXSwge1xuICAgIGNhbGxiYWNrOiBmdW5jdGlvbigkbm9kZSkge1xuICAgICAgY29uc3QgJGNhdGNoZXIgPSAkbm9kZS5maW5kKCcubm90ZS1kaW1lbnNpb24tcGlja2VyLW1vdXNlY2F0Y2hlcicpO1xuICAgICAgJGNhdGNoZXIuY3NzKHtcbiAgICAgICAgd2lkdGg6IG9wdC5jb2wgKyAnZW0nLFxuICAgICAgICBoZWlnaHQ6IG9wdC5yb3cgKyAnZW0nLFxuICAgICAgfSlcbiAgICAgICAgLm1vdXNlZG93bihvcHQuaXRlbUNsaWNrKVxuICAgICAgICAubW91c2Vtb3ZlKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICB0YWJsZU1vdmVIYW5kbGVyKGUsIG9wdC5jb2wsIG9wdC5yb3cpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICB9KS5yZW5kZXIoKTtcbn07XG5cbmNvbnN0IHBhbGV0dGUgPSByZW5kZXJlci5jcmVhdGUoJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXBhbGV0dGVcIi8+JywgZnVuY3Rpb24oJG5vZGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgY29udGVudHMgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMCwgcm93U2l6ZSA9IG9wdGlvbnMuY29sb3JzLmxlbmd0aDsgcm93IDwgcm93U2l6ZTsgcm93KyspIHtcbiAgICBjb25zdCBldmVudE5hbWUgPSBvcHRpb25zLmV2ZW50TmFtZTtcbiAgICBjb25zdCBjb2xvcnMgPSBvcHRpb25zLmNvbG9yc1tyb3ddO1xuICAgIGNvbnN0IGNvbG9yc05hbWUgPSBvcHRpb25zLmNvbG9yc05hbWVbcm93XTtcbiAgICBjb25zdCBidXR0b25zID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMCwgY29sU2l6ZSA9IGNvbG9ycy5sZW5ndGg7IGNvbCA8IGNvbFNpemU7IGNvbCsrKSB7XG4gICAgICBjb25zdCBjb2xvciA9IGNvbG9yc1tjb2xdO1xuICAgICAgY29uc3QgY29sb3JOYW1lID0gY29sb3JzTmFtZVtjb2xdO1xuICAgICAgYnV0dG9ucy5wdXNoKFtcbiAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1idG4gbm90ZS1jb2xvci1idG5cIicsXG4gICAgICAgICdzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JywgY29sb3IsICdcIiAnLFxuICAgICAgICAnZGF0YS1ldmVudD1cIicsIGV2ZW50TmFtZSwgJ1wiICcsXG4gICAgICAgICdkYXRhLXZhbHVlPVwiJywgY29sb3IsICdcIiAnLFxuICAgICAgICAndGl0bGU9XCInLCBjb2xvck5hbWUsICdcIiAnLFxuICAgICAgICAnYXJpYS1sYWJlbD1cIicsIGNvbG9yTmFtZSwgJ1wiICcsXG4gICAgICAgICdkYXRhLXRvZ2dsZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj48L2J1dHRvbj4nLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuICAgIGNvbnRlbnRzLnB1c2goJzxkaXYgY2xhc3M9XCJub3RlLWNvbG9yLXJvd1wiPicgKyBidXR0b25zLmpvaW4oJycpICsgJzwvZGl2PicpO1xuICB9XG4gICRub2RlLmh0bWwoY29udGVudHMuam9pbignJykpO1xuXG4gICRub2RlLmZpbmQoJy5ub3RlLWNvbG9yLWJ0bicpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgJCh0aGlzKS5kYXRhKCdfbGl0ZV90b29sdGlwJywgbmV3IFRvb2x0aXBVSSgkKHRoaXMpLCB7XG4gICAgICBjb250YWluZXI6IG9wdGlvbnMuY29udGFpbmVyLFxuICAgIH0pKTtcbiAgfSk7XG59KTtcblxuY29uc3QgY29sb3JEcm9wZG93bkJ1dHRvbiA9IGZ1bmN0aW9uKG9wdCwgdHlwZSkge1xuICByZXR1cm4gYnV0dG9uR3JvdXAoe1xuICAgIGNsYXNzTmFtZTogJ25vdGUtY29sb3InLFxuICAgIGNoaWxkcmVuOiBbXG4gICAgICBidXR0b24oe1xuICAgICAgICBjbGFzc05hbWU6ICdub3RlLWN1cnJlbnQtY29sb3ItYnV0dG9uJyxcbiAgICAgICAgY29udGVudHM6IG9wdC50aXRsZSxcbiAgICAgICAgdG9vbHRpcDogb3B0LmxhbmcuY29sb3IucmVjZW50LFxuICAgICAgICBjbGljazogb3B0LmN1cnJlbnRDbGljayxcbiAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uKCRidXR0b24pIHtcbiAgICAgICAgICBjb25zdCAkcmVjZW50Q29sb3IgPSAkYnV0dG9uLmZpbmQoJy5ub3RlLXJlY2VudC1jb2xvcicpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgIT09ICdmb3JlQ29sb3InKSB7XG4gICAgICAgICAgICAkcmVjZW50Q29sb3IuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGRkZGMDAnKTtcbiAgICAgICAgICAgICRidXR0b24uYXR0cignZGF0YS1iYWNrQ29sb3InLCAnI0ZGRkYwMCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgYnV0dG9uKHtcbiAgICAgICAgY2xhc3NOYW1lOiAnZHJvcGRvd24tdG9nZ2xlJyxcbiAgICAgICAgY29udGVudHM6IGljb24oJ25vdGUtaWNvbi1jYXJldCcpLFxuICAgICAgICB0b29sdGlwOiBvcHQubGFuZy5jb2xvci5tb3JlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdG9nZ2xlOiAnZHJvcGRvd24nLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBkcm9wZG93bih7XG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgJzxkaXY+JyxcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cIm5vdGUtYnRuLWdyb3VwIGJ0bi1iYWNrZ3JvdW5kLWNvbG9yXCI+JyxcbiAgICAgICAgICAnICA8ZGl2IGNsYXNzPVwibm90ZS1wYWxldHRlLXRpdGxlXCI+JyArIG9wdC5sYW5nLmNvbG9yLmJhY2tncm91bmQgKyAnPC9kaXY+JyxcbiAgICAgICAgICAnICA8ZGl2PicsXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1jb2xvci1yZXNldCBub3RlLWJ0biBub3RlLWJ0bi1ibG9ja1wiICcgK1xuICAgICAgICAgICcgZGF0YS1ldmVudD1cImJhY2tDb2xvclwiIGRhdGEtdmFsdWU9XCJpbmhlcml0XCI+JyxcbiAgICAgICAgICBvcHQubGFuZy5jb2xvci50cmFuc3BhcmVudCxcbiAgICAgICAgICAnICAgIDwvYnV0dG9uPicsXG4gICAgICAgICAgJyAgPC9kaXY+JyxcbiAgICAgICAgICAnICA8ZGl2IGNsYXNzPVwibm90ZS1ob2xkZXJcIiBkYXRhLWV2ZW50PVwiYmFja0NvbG9yXCIvPicsXG4gICAgICAgICAgJyAgPGRpdiBjbGFzcz1cImJ0bi1zbVwiPicsXG4gICAgICAgICAgJyAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgaWQ9XCJodG1sNWJjcFwiIGNsYXNzPVwibm90ZS1idG4gYnRuLWRlZmF1bHRcIiB2YWx1ZT1cIiMyMTEwNEFcIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgZGF0YS12YWx1ZT1cImNwXCI+JyxcbiAgICAgICAgICAnICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1jb2xvci1yZXNldCBidG5cIiBkYXRhLWV2ZW50PVwiYmFja0NvbG9yXCIgZGF0YS12YWx1ZT1cImNwYmFja0NvbG9yXCI+JyxcbiAgICAgICAgICBvcHQubGFuZy5jb2xvci5jcFNlbGVjdCxcbiAgICAgICAgICAnICAgIDwvYnV0dG9uPicsXG4gICAgICAgICAgJyAgPC9kaXY+JyxcbiAgICAgICAgICAnPC9kaXY+JyxcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cIm5vdGUtYnRuLWdyb3VwIGJ0bi1mb3JlZ3JvdW5kLWNvbG9yXCI+JyxcbiAgICAgICAgICAnICA8ZGl2IGNsYXNzPVwibm90ZS1wYWxldHRlLXRpdGxlXCI+JyArIG9wdC5sYW5nLmNvbG9yLmZvcmVncm91bmQgKyAnPC9kaXY+JyxcbiAgICAgICAgICAnICA8ZGl2PicsXG4gICAgICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1jb2xvci1yZXNldCBub3RlLWJ0biBub3RlLWJ0bi1ibG9ja1wiICcgK1xuICAgICAgICAgICcgZGF0YS1ldmVudD1cInJlbW92ZUZvcm1hdFwiIGRhdGEtdmFsdWU9XCJmb3JlQ29sb3JcIj4nLFxuICAgICAgICAgIG9wdC5sYW5nLmNvbG9yLnJlc2V0VG9EZWZhdWx0LFxuICAgICAgICAgICcgICAgPC9idXR0b24+JyxcbiAgICAgICAgICAnICA8L2Rpdj4nLFxuICAgICAgICAgICcgIDxkaXYgY2xhc3M9XCJub3RlLWhvbGRlclwiIGRhdGEtZXZlbnQ9XCJmb3JlQ29sb3JcIi8+JyxcbiAgICAgICAgICAnICA8ZGl2IGNsYXNzPVwiYnRuLXNtXCI+JyxcbiAgICAgICAgICAnICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cImh0bWw1ZmNwXCIgY2xhc3M9XCJub3RlLWJ0biBidG4tZGVmYXVsdFwiIHZhbHVlPVwiIzIxMTA0QVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiBkYXRhLXZhbHVlPVwiY3BcIj4nLFxuICAgICAgICAgICcgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJub3RlLWNvbG9yLXJlc2V0IGJ0blwiIGRhdGEtZXZlbnQ9XCJmb3JlQ29sb3JcIiBkYXRhLXZhbHVlPVwiY3Bmb3JlQ29sb3JcIj4nLFxuICAgICAgICAgIG9wdC5sYW5nLmNvbG9yLmNwU2VsZWN0LFxuICAgICAgICAgICcgICAgPC9idXR0b24+JyxcbiAgICAgICAgICAnICA8L2Rpdj4nLFxuICAgICAgICAgICc8L2Rpdj4nLFxuICAgICAgICAgICc8L2Rpdj4nLFxuICAgICAgICBdLmpvaW4oJycpLFxuICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24oJGRyb3Bkb3duKSB7XG4gICAgICAgICAgJGRyb3Bkb3duLmZpbmQoJy5ub3RlLWhvbGRlcicpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCAkaG9sZGVyID0gJCh0aGlzKTtcbiAgICAgICAgICAgICRob2xkZXIuYXBwZW5kKHBhbGV0dGUoe1xuICAgICAgICAgICAgICBjb2xvcnM6IG9wdC5jb2xvcnMsXG4gICAgICAgICAgICAgIGV2ZW50TmFtZTogJGhvbGRlci5kYXRhKCdldmVudCcpLFxuICAgICAgICAgICAgfSkucmVuZGVyKCkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdmb3JlJykge1xuICAgICAgICAgICAgJGRyb3Bkb3duLmZpbmQoJy5idG4tYmFja2dyb3VuZC1jb2xvcicpLmhpZGUoKTtcbiAgICAgICAgICAgICRkcm9wZG93bi5jc3MoeyAnbWluLXdpZHRoJzogJzIxMHB4JyB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdiYWNrJykge1xuICAgICAgICAgICAgJGRyb3Bkb3duLmZpbmQoJy5idG4tZm9yZWdyb3VuZC1jb2xvcicpLmhpZGUoKTtcbiAgICAgICAgICAgICRkcm9wZG93bi5jc3MoeyAnbWluLXdpZHRoJzogJzIxMHB4JyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIGNvbnN0ICRidXR0b24gPSAkKGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gJGJ1dHRvbi5kYXRhKCdldmVudCcpO1xuICAgICAgICAgIGxldCB2YWx1ZSA9ICRidXR0b24uZGF0YSgndmFsdWUnKTtcbiAgICAgICAgICBjb25zdCBmb3JlaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHRtbDVmY3AnKS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBiYWNraW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaHRtbDViY3AnKS52YWx1ZTtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICdjcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdjcGJhY2tDb2xvcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFja2lucHV0O1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdjcGZvcmVDb2xvcicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZm9yZWlucHV0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudE5hbWUgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50TmFtZSA9PT0gJ2JhY2tDb2xvcicgPyAnYmFja2dyb3VuZC1jb2xvcicgOiAnY29sb3InO1xuICAgICAgICAgICAgY29uc3QgJGNvbG9yID0gJGJ1dHRvbi5jbG9zZXN0KCcubm90ZS1jb2xvcicpLmZpbmQoJy5ub3RlLXJlY2VudC1jb2xvcicpO1xuICAgICAgICAgICAgY29uc3QgJGN1cnJlbnRCdXR0b24gPSAkYnV0dG9uLmNsb3Nlc3QoJy5ub3RlLWNvbG9yJykuZmluZCgnLm5vdGUtY3VycmVudC1jb2xvci1idXR0b24nKTtcblxuICAgICAgICAgICAgJGNvbG9yLmNzcyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICRjdXJyZW50QnV0dG9uLmF0dHIoJ2RhdGEtJyArIGV2ZW50TmFtZSwgdmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2ZvcmUnKSB7XG4gICAgICAgICAgICAgIG9wdC5pdGVtQ2xpY2soJ2ZvcmVDb2xvcicsIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2JhY2snKSB7XG4gICAgICAgICAgICAgIG9wdC5pdGVtQ2xpY2soJ2JhY2tDb2xvcicsIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wdC5pdGVtQ2xpY2soZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgXSxcbiAgfSkucmVuZGVyKCk7XG59O1xuXG5jb25zdCBkaWFsb2cgPSByZW5kZXJlci5jcmVhdGUoJzxkaXYgY2xhc3M9XCJub3RlLW1vZGFsXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIvPicsIGZ1bmN0aW9uKCRub2RlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmZhZGUpIHtcbiAgICAkbm9kZS5hZGRDbGFzcygnZmFkZScpO1xuICB9XG4gICRub2RlLmF0dHIoe1xuICAgICdhcmlhLWxhYmVsJzogb3B0aW9ucy50aXRsZSxcbiAgfSk7XG4gICRub2RlLmh0bWwoW1xuICAgICcgIDxkaXYgY2xhc3M9XCJub3RlLW1vZGFsLWNvbnRlbnRcIj4nLFxuICAgIChvcHRpb25zLnRpdGxlXG4gICAgICA/ICcgICAgPGRpdiBjbGFzcz1cIm5vdGUtbW9kYWwtaGVhZGVyXCI+JyArXG4gICAgJyAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aSBjbGFzcz1cIm5vdGUtaWNvbi1jbG9zZVwiPjwvaT48L2J1dHRvbj4nICtcbiAgICAnICAgICAgPGg0IGNsYXNzPVwibm90ZS1tb2RhbC10aXRsZVwiPicgKyBvcHRpb25zLnRpdGxlICsgJzwvaDQ+JyArXG4gICAgJyAgICA8L2Rpdj4nIDogJydcbiAgICApLFxuICAgICcgICAgPGRpdiBjbGFzcz1cIm5vdGUtbW9kYWwtYm9keVwiPicgKyBvcHRpb25zLmJvZHkgKyAnPC9kaXY+JyxcbiAgICAob3B0aW9ucy5mb290ZXJcbiAgICAgID8gJyAgICA8ZGl2IGNsYXNzPVwibm90ZS1tb2RhbC1mb290ZXJcIj4nICsgb3B0aW9ucy5mb290ZXIgKyAnPC9kaXY+JyA6ICcnXG4gICAgKSxcbiAgICAnICA8L2Rpdj4nLFxuICBdLmpvaW4oJycpKTtcblxuICAkbm9kZS5kYXRhKCdtb2RhbCcsIG5ldyBNb2RhbFVJKCRub2RlLCBvcHRpb25zKSk7XG59KTtcblxuY29uc3QgdmlkZW9EaWFsb2cgPSBmdW5jdGlvbihvcHQpIHtcbiAgY29uc3QgYm9keSA9ICc8ZGl2IGNsYXNzPVwibm90ZS1mb3JtLWdyb3VwXCI+JyArXG4gICAgJzxsYWJlbCBjbGFzcz1cIm5vdGUtZm9ybS1sYWJlbFwiPicgK1xuICAgIG9wdC5sYW5nLnZpZGVvLnVybCArICcgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPicgK1xuICAgIG9wdC5sYW5nLnZpZGVvLnByb3ZpZGVycyArICc8L3NtYWxsPicgK1xuICAgICc8L2xhYmVsPicgK1xuICAgICc8aW5wdXQgY2xhc3M9XCJub3RlLXZpZGVvLXVybCBub3RlLWlucHV0XCIgdHlwZT1cInRleHRcIiAvPicgK1xuICAgICc8L2Rpdj4nO1xuICBjb25zdCBmb290ZXIgPSBbXG4gICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGhyZWY9XCIjXCIgY2xhc3M9XCJub3RlLWJ0biBub3RlLWJ0bi1wcmltYXJ5IG5vdGUtdmlkZW8tYnRuIGRpc2FibGVkXCIgZGlzYWJsZWQ+JyxcbiAgICBvcHQubGFuZy52aWRlby5pbnNlcnQsXG4gICAgJzwvYnV0dG9uPicsXG4gIF0uam9pbignJyk7XG5cbiAgcmV0dXJuIGRpYWxvZyh7XG4gICAgdGl0bGU6IG9wdC5sYW5nLnZpZGVvLmluc2VydCxcbiAgICBmYWRlOiBvcHQuZmFkZSxcbiAgICBib2R5OiBib2R5LFxuICAgIGZvb3RlcjogZm9vdGVyLFxuICB9KS5yZW5kZXIoKTtcbn07XG5cbmNvbnN0IGltYWdlRGlhbG9nID0gZnVuY3Rpb24ob3B0KSB7XG4gIGNvbnN0IGJvZHkgPSAnPGRpdiBjbGFzcz1cIm5vdGUtZm9ybS1ncm91cCBub3RlLWdyb3VwLXNlbGVjdC1mcm9tLWZpbGVzXCI+JyArXG4gICAgJzxsYWJlbCBjbGFzcz1cIm5vdGUtZm9ybS1sYWJlbFwiPicgKyBvcHQubGFuZy5pbWFnZS5zZWxlY3RGcm9tRmlsZXMgKyAnPC9sYWJlbD4nICtcbiAgICAnPGlucHV0IGNsYXNzPVwibm90ZS1ub3RlLWltYWdlLWlucHV0IG5vdGUtaW5wdXRcIiB0eXBlPVwiZmlsZVwiIG5hbWU9XCJmaWxlc1wiIGFjY2VwdD1cImltYWdlLypcIiBtdWx0aXBsZT1cIm11bHRpcGxlXCIgLz4nICtcbiAgICBvcHQuaW1hZ2VMaW1pdGF0aW9uICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJub3RlLWZvcm0tZ3JvdXBcIiBzdHlsZT1cIm92ZXJmbG93OmF1dG87XCI+JyArXG4gICAgJzxsYWJlbCBjbGFzcz1cIm5vdGUtZm9ybS1sYWJlbFwiPicgKyBvcHQubGFuZy5pbWFnZS51cmwgKyAnPC9sYWJlbD4nICtcbiAgICAnPGlucHV0IGNsYXNzPVwibm90ZS1pbWFnZS11cmwgbm90ZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgLz4nICtcbiAgICAnPC9kaXY+JztcbiAgY29uc3QgZm9vdGVyID0gW1xuICAgICc8YnV0dG9uIGhyZWY9XCIjXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1idG4gbm90ZS1idG4tcHJpbWFyeSBub3RlLWJ0bi1sYXJnZSBub3RlLWltYWdlLWJ0biBkaXNhYmxlZFwiIGRpc2FibGVkPicsXG4gICAgb3B0LmxhbmcuaW1hZ2UuaW5zZXJ0LFxuICAgICc8L2J1dHRvbj4nLFxuICBdLmpvaW4oJycpO1xuXG4gIHJldHVybiBkaWFsb2coe1xuICAgIHRpdGxlOiBvcHQubGFuZy5pbWFnZS5pbnNlcnQsXG4gICAgZmFkZTogb3B0LmZhZGUsXG4gICAgYm9keTogYm9keSxcbiAgICBmb290ZXI6IGZvb3RlcixcbiAgfSkucmVuZGVyKCk7XG59O1xuXG5jb25zdCBsaW5rRGlhbG9nID0gZnVuY3Rpb24ob3B0KSB7XG4gIGNvbnN0IGJvZHkgPSAnPGRpdiBjbGFzcz1cIm5vdGUtZm9ybS1ncm91cFwiPicgK1xuICAgICc8bGFiZWwgY2xhc3M9XCJub3RlLWZvcm0tbGFiZWxcIj4nICsgb3B0LmxhbmcubGluay50ZXh0VG9EaXNwbGF5ICsgJzwvbGFiZWw+JyArXG4gICAgJzxpbnB1dCBjbGFzcz1cIm5vdGUtbGluay10ZXh0IG5vdGUtaW5wdXRcIiB0eXBlPVwidGV4dFwiIC8+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8ZGl2IGNsYXNzPVwibm90ZS1mb3JtLWdyb3VwXCI+JyArXG4gICAgJzxsYWJlbCBjbGFzcz1cIm5vdGUtZm9ybS1sYWJlbFwiPicgKyBvcHQubGFuZy5saW5rLnVybCArICc8L2xhYmVsPicgK1xuICAgICc8aW5wdXQgY2xhc3M9XCJub3RlLWxpbmstdXJsIG5vdGUtaW5wdXRcIiB0eXBlPVwidGV4dFwiIHZhbHVlPVwiaHR0cDovL1wiIC8+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICghb3B0LmRpc2FibGVMaW5rVGFyZ2V0XG4gICAgICA/ICc8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj4nICtcbiAgICAgICc8bGFiZWw+JyArICc8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD4gJyArIG9wdC5sYW5nLmxpbmsub3BlbkluTmV3V2luZG93ICsgJzwvbGFiZWw+JyArXG4gICAgICAnPC9kaXY+JyA6ICcnXG4gICAgKTtcbiAgY29uc3QgZm9vdGVyID0gW1xuICAgICc8YnV0dG9uIGhyZWY9XCIjXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibm90ZS1idG4gbm90ZS1idG4tcHJpbWFyeSBub3RlLWxpbmstYnRuIGRpc2FibGVkXCIgZGlzYWJsZWQ+JyxcbiAgICBvcHQubGFuZy5saW5rLmluc2VydCxcbiAgICAnPC9idXR0b24+JyxcbiAgXS5qb2luKCcnKTtcblxuICByZXR1cm4gZGlhbG9nKHtcbiAgICBjbGFzc05hbWU6ICdsaW5rLWRpYWxvZycsXG4gICAgdGl0bGU6IG9wdC5sYW5nLmxpbmsuaW5zZXJ0LFxuICAgIGZhZGU6IG9wdC5mYWRlLFxuICAgIGJvZHk6IGJvZHksXG4gICAgZm9vdGVyOiBmb290ZXIsXG4gIH0pLnJlbmRlcigpO1xufTtcblxuY29uc3QgcG9wb3ZlciA9IHJlbmRlcmVyLmNyZWF0ZShbXG4gICc8ZGl2IGNsYXNzPVwibm90ZS1wb3BvdmVyIGJvdHRvbVwiPicsXG4gICcgIDxkaXYgY2xhc3M9XCJub3RlLXBvcG92ZXItYXJyb3dcIi8+JyxcbiAgJyAgPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudCBub3RlLWNoaWxkcmVuLWNvbnRhaW5lclwiLz4nLFxuICAnPC9kaXY+Jyxcbl0uam9pbignJyksIGZ1bmN0aW9uKCRub2RlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHR5cGVvZiBvcHRpb25zLmRpcmVjdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmRpcmVjdGlvbiA6ICdib3R0b20nO1xuXG4gICRub2RlLmFkZENsYXNzKGRpcmVjdGlvbikuaGlkZSgpO1xuXG4gIGlmIChvcHRpb25zLmhpZGVBcnJvdykge1xuICAgICRub2RlLmZpbmQoJy5ub3RlLXBvcG92ZXItYXJyb3cnKS5oaWRlKCk7XG4gIH1cbn0pO1xuXG5jb25zdCBjaGVja2JveCA9IHJlbmRlcmVyLmNyZWF0ZSgnPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+PC9kaXY+JywgZnVuY3Rpb24oJG5vZGUsIG9wdGlvbnMpIHtcbiAgJG5vZGUuaHRtbChbXG4gICAgJzxsYWJlbCcgKyAob3B0aW9ucy5pZCA/ICcgZm9yPVwiJyArIG9wdGlvbnMuaWQgKyAnXCInIDogJycpICsgJz4nLFxuICAgICcgPGlucHV0IHJvbGU9XCJjaGVja2JveFwiIHR5cGU9XCJjaGVja2JveFwiJyArIChvcHRpb25zLmlkID8gJyBpZD1cIicgKyBvcHRpb25zLmlkICsgJ1wiJyA6ICcnKSxcbiAgICAob3B0aW9ucy5jaGVja2VkID8gJyBjaGVja2VkJyA6ICcnKSxcbiAgICAnIGFyaWEtY2hlY2tlZD1cIicgKyAob3B0aW9ucy5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAnXCIvPicsXG4gICAgKG9wdGlvbnMudGV4dCA/IG9wdGlvbnMudGV4dCA6ICcnKSxcbiAgICAnPC9sYWJlbD4nLFxuICBdLmpvaW4oJycpKTtcbn0pO1xuXG5jb25zdCBpY29uID0gZnVuY3Rpb24oaWNvbkNsYXNzTmFtZSwgdGFnTmFtZSkge1xuICB0YWdOYW1lID0gdGFnTmFtZSB8fCAnaSc7XG4gIHJldHVybiAnPCcgKyB0YWdOYW1lICsgJyBjbGFzcz1cIicgKyBpY29uQ2xhc3NOYW1lICsgJ1wiLz4nO1xufTtcblxuY29uc3QgdWkgPSB7XG4gIGVkaXRvcjogZWRpdG9yLFxuICB0b29sYmFyOiB0b29sYmFyLFxuICBlZGl0aW5nQXJlYTogZWRpdGluZ0FyZWEsXG4gIGNvZGFibGU6IGNvZGFibGUsXG4gIGVkaXRhYmxlOiBlZGl0YWJsZSxcbiAgc3RhdHVzYmFyOiBzdGF0dXNiYXIsXG4gIGFpckVkaXRvcjogYWlyRWRpdG9yLFxuICBhaXJFZGl0YWJsZTogYWlyRWRpdGFibGUsXG4gIGJ1dHRvbkdyb3VwOiBidXR0b25Hcm91cCxcbiAgYnV0dG9uOiBidXR0b24sXG4gIGRyb3Bkb3duOiBkcm9wZG93bixcbiAgZHJvcGRvd25DaGVjazogZHJvcGRvd25DaGVjayxcbiAgZHJvcGRvd25CdXR0b246IGRyb3Bkb3duQnV0dG9uLFxuICBkcm9wZG93bkJ1dHRvbkNvbnRlbnRzOiBkcm9wZG93bkJ1dHRvbkNvbnRlbnRzLFxuICBkcm9wZG93bkNoZWNrQnV0dG9uOiBkcm9wZG93bkNoZWNrQnV0dG9uLFxuICBwYXJhZ3JhcGhEcm9wZG93bkJ1dHRvbjogcGFyYWdyYXBoRHJvcGRvd25CdXR0b24sXG4gIHRhYmxlRHJvcGRvd25CdXR0b246IHRhYmxlRHJvcGRvd25CdXR0b24sXG4gIGNvbG9yRHJvcGRvd25CdXR0b246IGNvbG9yRHJvcGRvd25CdXR0b24sXG4gIHBhbGV0dGU6IHBhbGV0dGUsXG4gIGRpYWxvZzogZGlhbG9nLFxuICB2aWRlb0RpYWxvZzogdmlkZW9EaWFsb2csXG4gIGltYWdlRGlhbG9nOiBpbWFnZURpYWxvZyxcbiAgbGlua0RpYWxvZzogbGlua0RpYWxvZyxcbiAgcG9wb3ZlcjogcG9wb3ZlcixcbiAgY2hlY2tib3g6IGNoZWNrYm94LFxuICBpY29uOiBpY29uLFxuXG4gIHRvZ2dsZUJ0bjogZnVuY3Rpb24oJGJ0biwgaXNFbmFibGUpIHtcbiAgICAkYnRuLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG4gICAgJGJ0bi5hdHRyKCdkaXNhYmxlZCcsICFpc0VuYWJsZSk7XG4gIH0sXG5cbiAgdG9nZ2xlQnRuQWN0aXZlOiBmdW5jdGlvbigkYnRuLCBpc0FjdGl2ZSkge1xuICAgICRidG4udG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcbiAgfSxcblxuICBjaGVjazogZnVuY3Rpb24oJGRvbSwgdmFsdWUpIHtcbiAgICAkZG9tLmZpbmQoJy5jaGVja2VkJykucmVtb3ZlQ2xhc3MoJ2NoZWNrZWQnKTtcbiAgICAkZG9tLmZpbmQoJ1tkYXRhLXZhbHVlPVwiJyArIHZhbHVlICsgJ1wiXScpLmFkZENsYXNzKCdjaGVja2VkJyk7XG4gIH0sXG5cbiAgb25EaWFsb2dTaG93bjogZnVuY3Rpb24oJGRpYWxvZywgaGFuZGxlcikge1xuICAgICRkaWFsb2cub25lKCdub3RlLm1vZGFsLnNob3cnLCBoYW5kbGVyKTtcbiAgfSxcblxuICBvbkRpYWxvZ0hpZGRlbjogZnVuY3Rpb24oJGRpYWxvZywgaGFuZGxlcikge1xuICAgICRkaWFsb2cub25lKCdub3RlLm1vZGFsLmhpZGUnLCBoYW5kbGVyKTtcbiAgfSxcblxuICBzaG93RGlhbG9nOiBmdW5jdGlvbigkZGlhbG9nKSB7XG4gICAgJGRpYWxvZy5kYXRhKCdtb2RhbCcpLnNob3coKTtcbiAgfSxcblxuICBoaWRlRGlhbG9nOiBmdW5jdGlvbigkZGlhbG9nKSB7XG4gICAgJGRpYWxvZy5kYXRhKCdtb2RhbCcpLmhpZGUoKTtcbiAgfSxcblxuICAvKipcbiAgICogZ2V0IHBvcG92ZXIgY29udGVudCBhcmVhXG4gICAqXG4gICAqIEBwYXJhbSAkcG9wb3ZlclxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldFBvcG92ZXJDb250ZW50OiBmdW5jdGlvbigkcG9wb3Zlcikge1xuICAgIHJldHVybiAkcG9wb3Zlci5maW5kKCcubm90ZS1wb3BvdmVyLWNvbnRlbnQnKTtcbiAgfSxcblxuICAvKipcbiAgICogZ2V0IGRpYWxvZydzIGJvZHkgYXJlYVxuICAgKlxuICAgKiBAcGFyYW0gJGRpYWxvZ1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldERpYWxvZ0JvZHk6IGZ1bmN0aW9uKCRkaWFsb2cpIHtcbiAgICByZXR1cm4gJGRpYWxvZy5maW5kKCcubm90ZS1tb2RhbC1ib2R5Jyk7XG4gIH0sXG5cbiAgY3JlYXRlTGF5b3V0OiBmdW5jdGlvbigkbm90ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0ICRlZGl0b3IgPSAob3B0aW9ucy5haXJNb2RlID8gdWkuYWlyRWRpdG9yKFtcbiAgICAgIHVpLmVkaXRpbmdBcmVhKFtcbiAgICAgICAgdWkuYWlyRWRpdGFibGUoKSxcbiAgICAgIF0pLFxuICAgIF0pIDogdWkuZWRpdG9yKFtcbiAgICAgIHVpLnRvb2xiYXIoKSxcbiAgICAgIHVpLmVkaXRpbmdBcmVhKFtcbiAgICAgICAgdWkuY29kYWJsZSgpLFxuICAgICAgICB1aS5lZGl0YWJsZSgpLFxuICAgICAgXSksXG4gICAgICB1aS5zdGF0dXNiYXIoKSxcbiAgICBdKSkucmVuZGVyKCk7XG5cbiAgICAkZWRpdG9yLmluc2VydEFmdGVyKCRub3RlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBub3RlOiAkbm90ZSxcbiAgICAgIGVkaXRvcjogJGVkaXRvcixcbiAgICAgIHRvb2xiYXI6ICRlZGl0b3IuZmluZCgnLm5vdGUtdG9vbGJhcicpLFxuICAgICAgZWRpdGluZ0FyZWE6ICRlZGl0b3IuZmluZCgnLm5vdGUtZWRpdGluZy1hcmVhJyksXG4gICAgICBlZGl0YWJsZTogJGVkaXRvci5maW5kKCcubm90ZS1lZGl0YWJsZScpLFxuICAgICAgY29kYWJsZTogJGVkaXRvci5maW5kKCcubm90ZS1jb2RhYmxlJyksXG4gICAgICBzdGF0dXNiYXI6ICRlZGl0b3IuZmluZCgnLm5vdGUtc3RhdHVzYmFyJyksXG4gICAgfTtcbiAgfSxcblxuICByZW1vdmVMYXlvdXQ6IGZ1bmN0aW9uKCRub3RlLCBsYXlvdXRJbmZvKSB7XG4gICAgJG5vdGUuaHRtbChsYXlvdXRJbmZvLmVkaXRhYmxlLmh0bWwoKSk7XG4gICAgbGF5b3V0SW5mby5lZGl0b3IucmVtb3ZlKCk7XG4gICAgJG5vdGUub2ZmKCdzdW1tZXJub3RlJyk7IC8vIHJlbW92ZSBzdW1tZXJub3RlIGN1c3RvbSBldmVudFxuICAgICRub3RlLnNob3coKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVpO1xuIl19