all files / src/js/base/module/ HintPopover.js

28.47% Statements 39/137
7.55% Branches 4/53
19.23% Functions 5/26
27.94% Lines 38/136
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 97× 97× 97× 97× 97× 97× 97× 97× 97×                           99×                                                                                                                                                                                                                                                                                                                                  
(function(global){global.wrappers['/Users/lqez/Dev/summernote/src/js/base/module/HintPopover.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
exports.__esModule = true;
var jquery_1 = require("jquery");
var func_1 = require("../core/func");
var lists_1 = require("../core/lists");
var dom_1 = require("../core/dom");
var range_1 = require("../core/range");
var key_1 = require("../core/key");
var POPOVER_DIST = 5;
var HintPopover = /** @class */ (function () {
    function HintPopover(context) {
        var _this = this;
        this.context = context;
        this.ui = jquery_1["default"].summernote.ui;
        this.$editable = context.layoutInfo.editable;
        this.options = context.options;
        this.hint = this.options.hint || [];
        this.direction = this.options.hintDirection || 'bottom';
        this.hints = jquery_1["default"].isArray(this.hint) ? this.hint : [this.hint];
        this.events = {
            'summernote.keyup': function (we, e) {
                if (!e.isDefaultPrevented()) {
                    _this.handleKeyup(e);
                }
            },
            'summernote.keydown': function (we, e) {
                _this.handleKeydown(e);
            },
            'summernote.disable summernote.dialog.shown': function () {
                _this.hide();
            }
        };
    }
    HintPopover.prototype.shouldInitialize = function () {
        return this.hints.length > 0;
    };
    HintPopover.prototype.initialize = function () {
        var _this = this;
        this.lastWordRange = null;
        this.$popover = this.ui.popover({
            className: 'note-hint-popover',
            hideArrow: true,
            direction: ''
        }).render().appendTo(this.options.container);
        this.$popover.hide();
        this.$content = this.$popover.find('.popover-content,.note-popover-content');
        this.$content.on('click', '.note-hint-item', function (e) {
            _this.$content.find('.active').removeClass('active');
            jquery_1["default"](e.currentTarget).addClass('active');
            _this.replace();
        });
    };
    HintPopover.prototype.destroy = function () {
        this.$popover.remove();
    };
    HintPopover.prototype.selectItem = function ($item) {
        this.$content.find('.active').removeClass('active');
        $item.addClass('active');
        this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);
    };
    HintPopover.prototype.moveDown = function () {
        var $current = this.$content.find('.note-hint-item.active');
        var $next = $current.next();
        if ($next.length) {
            this.selectItem($next);
        }
        else {
            var $nextGroup = $current.parent().next();
            if (!$nextGroup.length) {
                $nextGroup = this.$content.find('.note-hint-group').first();
            }
            this.selectItem($nextGroup.find('.note-hint-item').first());
        }
    };
    HintPopover.prototype.moveUp = function () {
        var $current = this.$content.find('.note-hint-item.active');
        var $prev = $current.prev();
        if ($prev.length) {
            this.selectItem($prev);
        }
        else {
            var $prevGroup = $current.parent().prev();
            if (!$prevGroup.length) {
                $prevGroup = this.$content.find('.note-hint-group').last();
            }
            this.selectItem($prevGroup.find('.note-hint-item').last());
        }
    };
    HintPopover.prototype.replace = function () {
        var $item = this.$content.find('.note-hint-item.active');
        if ($item.length) {
            var node = this.nodeFromItem($item);
            // XXX: consider to move codes to editor for recording redo/undo.
            this.lastWordRange.insertNode(node);
            range_1["default"].createFromNode(node).collapse().select();
            this.lastWordRange = null;
            this.hide();
            this.context.triggerEvent('change', this.$editable.html(), this.$editable[0]);
            this.context.invoke('editor.focus');
        }
    };
    HintPopover.prototype.nodeFromItem = function ($item) {
        var hint = this.hints[$item.data('index')];
        var item = $item.data('item');
        var node = hint.content ? hint.content(item) : item;
        if (typeof node === 'string') {
            node = dom_1["default"].createText(node);
        }
        return node;
    };
    HintPopover.prototype.createItemTemplates = function (hintIdx, items) {
        var hint = this.hints[hintIdx];
        return items.map(function (item, idx) {
            var $item = jquery_1["default"]('<div class="note-hint-item"/>');
            $item.append(hint.template ? hint.template(item) : item + '');
            $item.data({
                'index': hintIdx,
                'item': item
            });
            return $item;
        });
    };
    HintPopover.prototype.handleKeydown = function (e) {
        if (!this.$popover.is(':visible')) {
            return;
        }
        if (e.keyCode === key_1["default"].code.ENTER) {
            e.preventDefault();
            this.replace();
        }
        else if (e.keyCode === key_1["default"].code.UP) {
            e.preventDefault();
            this.moveUp();
        }
        else if (e.keyCode === key_1["default"].code.DOWN) {
            e.preventDefault();
            this.moveDown();
        }
    };
    HintPopover.prototype.searchKeyword = function (index, keyword, callback) {
        var hint = this.hints[index];
        if (hint && hint.match.test(keyword) && hint.search) {
            var matches = hint.match.exec(keyword);
            hint.search(matches[1], callback);
        }
        else {
            callback();
        }
    };
    HintPopover.prototype.createGroup = function (idx, keyword) {
        var _this = this;
        var $group = jquery_1["default"]('<div class="note-hint-group note-hint-group-' + idx + '"/>');
        this.searchKeyword(idx, keyword, function (items) {
            items = items || [];
            if (items.length) {
                $group.html(_this.createItemTemplates(idx, items));
                _this.show();
            }
        });
        return $group;
    };
    HintPopover.prototype.handleKeyup = function (e) {
        var _this = this;
        if (!lists_1["default"].contains([key_1["default"].code.ENTER, key_1["default"].code.UP, key_1["default"].code.DOWN], e.keyCode)) {
            var wordRange = this.context.invoke('editor.getLastRange').getWordRange();
            var keyword_1 = wordRange.toString();
            if (this.hints.length && keyword_1) {
                this.$content.empty();
                var bnd = func_1["default"].rect2bnd(lists_1["default"].last(wordRange.getClientRects()));
                if (bnd) {
                    this.$popover.hide();
                    this.lastWordRange = wordRange;
                    this.hints.forEach(function (hint, idx) {
                        if (hint.match.test(keyword_1)) {
                            _this.createGroup(idx, keyword_1).appendTo(_this.$content);
                        }
                    });
                    // select first .note-hint-item
                    this.$content.find('.note-hint-item:first').addClass('active');
                    // set position for popover after group is created
                    if (this.direction === 'top') {
                        this.$popover.css({
                            left: bnd.left,
                            top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
                        });
                    }
                    else {
                        this.$popover.css({
                            left: bnd.left,
                            top: bnd.top + bnd.height + POPOVER_DIST
                        });
                    }
                }
            }
            else {
                this.hide();
            }
        }
    };
    HintPopover.prototype.show = function () {
        this.$popover.show();
    };
    HintPopover.prototype.hide = function () {
        this.$popover.hide();
    };
    return HintPopover;
}());
exports["default"] = HintPopover;
 
},'src/js/base/module/HintPopover.js',{"jquery":"/Users/lqez/Dev/summernote/node_modules/jquery/dist/jquery.js","../core/func":"/Users/lqez/Dev/summernote/src/js/base/core/func.js","../core/lists":"/Users/lqez/Dev/summernote/src/js/base/core/lists.js","../core/dom":"/Users/lqez/Dev/summernote/src/js/base/core/dom.js","../core/range":"/Users/lqez/Dev/summernote/src/js/base/core/range.js","../core/key":"/Users/lqez/Dev/summernote/src/js/base/core/key.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGludFBvcG92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJIaW50UG9wb3Zlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUF1QjtBQUN2QixxQ0FBZ0M7QUFDaEMsdUNBQWtDO0FBQ2xDLG1DQUE4QjtBQUM5Qix1Q0FBa0M7QUFDbEMsbUNBQThCO0FBRTlCLElBQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUV2QjtJQUNFLHFCQUFZLE9BQU87UUFBbkIsaUJBdUJDO1FBdEJDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsbUJBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsbUJBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osa0JBQWtCLEVBQUUsVUFBQyxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFO29CQUMzQixLQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyQjtZQUNILENBQUM7WUFDRCxvQkFBb0IsRUFB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QUFJLEdBQUo7UUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwwQkFBSSxHQUFKO1FBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBeE5ELElBd05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBmdW5jIGZyb20gJy4uL2NvcmUvZnVuYyc7XG5pbXBvcnQgbGlzdHMgZnJvbSAnLi4vY29yZS9saXN0cyc7XG5pbXBvcnQgZG9tIGZyb20gJy4uL2NvcmUvZG9tJztcbmltcG9ydCByYW5nZSBmcm9tICcuLi9jb3JlL3JhbmdlJztcbmltcG9ydCBrZXkgZnJvbSAnLi4vY29yZS9rZXknO1xuXG5jb25zdCBQT1BPVkVSX0RJU1QgPSA1O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaW50UG9wb3ZlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdGhpcy51aSA9ICQuc3VtbWVybm90ZS51aTtcbiAgICB0aGlzLiRlZGl0YWJsZSA9IGNvbnRleHQubGF5b3V0SW5mby5lZGl0YWJsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgdGhpcy5oaW50ID0gdGhpcy5vcHRpb25zLmhpbnQgfHwgW107XG4gICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuaGludERpcmVjdGlvbiB8fCAnYm90dG9tJztcbiAgICB0aGlzLmhpbnRzID0gJC5pc0FycmF5KHRoaXMuaGludCkgPyB0aGlzLmhpbnQgOiBbdGhpcy5oaW50XTtcblxuICAgIHRoaXMuZXZlbnRzID0ge1xuICAgICAgJ3N1bW1lcm5vdGUua2V5dXAnOiAod2UsIGUpID0+IHtcbiAgICAgICAgaWYgKCFlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVLZXl1cChlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICdzdW1tZXJub3RlLmtleWRvd24nOiAod2UsIGUpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVLZXlkb3duKGUpO1xuICAgICAgfSxcbiAgICAgICdzdW1tZXJub3RlLmRpc2FibGUgc3VtbWVybm90ZS5kaWFsb2cuc2hvd24nOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc2hvdWxkSW5pdGlhbGl6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oaW50cy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmxhc3RXb3JkUmFuZ2UgPSBudWxsO1xuICAgIHRoaXMuJHBvcG92ZXIgPSB0aGlzLnVpLnBvcG92ZXIoe1xuICAgICAgY2xhc3NOYW1lOiAnbm90ZS1oaW50LXBvcG92ZXInLFxuICAgICAgaGlkZUFycm93OiB0cnVlLFxuICAgICAgZGlyZWN0aW9uOiAnJyxcbiAgICB9KS5yZW5kZXIoKS5hcHBlbmRUbyh0aGlzLm9wdGlvbnMuY29udGFpbmVyKTtcblxuICAgIHRoaXMuJHBvcG92ZXIuaGlkZSgpO1xuICAgIHRoaXMuJGNvbnRlbnQgPSB0aGlzLiRwb3BvdmVyLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQsLm5vdGUtcG9wb3Zlci1jb250ZW50Jyk7XG4gICAgdGhpcy4kY29udGVudC5vbignY2xpY2snLCAnLm5vdGUtaGludC1pdGVtJywgKGUpID0+IHtcbiAgICAgIHRoaXMuJGNvbnRlbnQuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB0aGlzLnJlcGxhY2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4kcG9wb3Zlci5yZW1vdmUoKTtcbiAgfVxuXG4gIHNlbGVjdEl0ZW0oJGl0ZW0pIHtcbiAgICB0aGlzLiRjb250ZW50LmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgJGl0ZW0uYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG4gICAgdGhpcy4kY29udGVudFswXS5zY3JvbGxUb3AgPSAkaXRlbVswXS5vZmZzZXRUb3AgLSAodGhpcy4kY29udGVudC5pbm5lckhlaWdodCgpIC8gMik7XG4gIH1cblxuICBtb3ZlRG93bigpIHtcbiAgICBjb25zdCAkY3VycmVudCA9IHRoaXMuJGNvbnRlbnQuZmluZCgnLm5vdGUtaGludC1pdGVtLmFjdGl2ZScpO1xuICAgIGNvbnN0ICRuZXh0ID0gJGN1cnJlbnQubmV4dCgpO1xuXG4gICAgaWYgKCRuZXh0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKCRuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0ICRuZXh0R3JvdXAgPSAkY3VycmVudC5wYXJlbnQoKS5uZXh0KCk7XG5cbiAgICAgIGlmICghJG5leHRHcm91cC5sZW5ndGgpIHtcbiAgICAgICAgJG5leHRHcm91cCA9IHRoaXMuJGNvbnRlbnQuZmluZCgnLm5vdGUtaGludC1ncm91cCcpLmZpcnN0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0SXRlbSgkbmV4dEdyb3VwLmZpbmQoJy5ub3RlLWhpbnQtaXRlbScpLmZpcnN0KCkpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVVcCgpIHtcbiAgICBjb25zdCAkY3VycmVudCA9IHRoaXMuJGNvbnRlbnQuZmluZCgnLm5vdGUtaGludC1pdGVtLmFjdGl2ZScpO1xuICAgIGNvbnN0ICRwcmV2ID0gJGN1cnJlbnQucHJldigpO1xuXG4gICAgaWYgKCRwcmV2Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RJdGVtKCRwcmV2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0ICRwcmV2R3JvdXAgPSAkY3VycmVudC5wYXJlbnQoKS5wcmV2KCk7XG5cbiAgICAgIGlmICghJHByZXZHcm91cC5sZW5ndGgpIHtcbiAgICAgICAgJHByZXZHcm91cCA9IHRoaXMuJGNvbnRlbnQuZmluZCgnLm5vdGUtaGludC1ncm91cCcpLmxhc3QoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3RJdGVtKCRwcmV2R3JvdXAuZmluZCgnLm5vdGUtaGludC1pdGVtJykubGFzdCgpKTtcbiAgICB9XG4gIH1cblxuICByZXBsYWNlKCkge1xuICAgIGNvbnN0ICRpdGVtID0gdGhpcy4kY29udGVudC5maW5kKCcubm90ZS1oaW50LWl0ZW0uYWN0aXZlJyk7XG5cbiAgICBpZiAoJGl0ZW0ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlRnJvbUl0ZW0oJGl0ZW0pO1xuICAgICAgLy8gWFhYOiBjb25zaWRlciB0byBtb3ZlIGNvZGVzIHRvIGVkaXRvciBmb3IgcmVjb3JkaW5nIHJlZG8vdW5kby5cbiAgICAgIHRoaXMubGFzdFdvcmRSYW5nZS5pbnNlcnROb2RlKG5vZGUpO1xuICAgICAgcmFuZ2UuY3JlYXRlRnJvbU5vZGUobm9kZSkuY29sbGFwc2UoKS5zZWxlY3QoKTtcblxuICAgICAgdGhpcy5sYXN0V29yZFJhbmdlID0gbnVsbDtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5jb250ZXh0LnRyaWdnZXJFdmVudCgnY2hhbmdlJywgdGhpcy4kZWRpdGFibGUuaHRtbCgpLCB0aGlzLiRlZGl0YWJsZVswXSk7XG4gICAgICB0aGlzLmNvbnRleHQuaW52b2tlKCdlZGl0b3IuZm9jdXMnKTtcbiAgICB9XG4gIH1cblxuICBub2RlRnJvbUl0ZW0oJGl0ZW0pIHtcbiAgICBjb25zdCBoaW50ID0gdGhpcy5oaW50c1skaXRlbS5kYXRhKCdpbmRleCcpXTtcbiAgICBjb25zdCBpdGVtID0gJGl0ZW0uZGF0YSgnaXRlbScpO1xuICAgIGxldCBub2RlID0gaGludC5jb250ZW50ID8gaGludC5jb250ZW50KGl0ZW0pIDogaXRlbTtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBub2RlID0gZG9tLmNyZWF0ZVRleHQobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgY3JlYXRlSXRlbVRlbXBsYXRlcyhoaW50SWR4LCBpdGVtcykge1xuICAgIGNvbnN0IGhpbnQgPSB0aGlzLmhpbnRzW2hpbnRJZHhdO1xuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgJGl0ZW0gPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1oaW50LWl0ZW1cIi8+Jyk7XG4gICAgICAkaXRlbS5hcHBlbmQoaGludC50ZW1wbGF0ZSA/IGhpbnQudGVtcGxhdGUoaXRlbSkgOiBpdGVtICsgJycpO1xuICAgICAgJGl0ZW0uZGF0YSh7XG4gICAgICAgICdpbmRleCc6IGhpbnRJZHgsXG4gICAgICAgICdpdGVtJzogaXRlbSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICRpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlS2V5ZG93bihlKSB7XG4gICAgaWYgKCF0aGlzLiRwb3BvdmVyLmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGUua2V5Q29kZSA9PT0ga2V5LmNvZGUuRU5URVIpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMucmVwbGFjZSgpO1xuICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSBrZXkuY29kZS5VUCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlVXAoKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PT0ga2V5LmNvZGUuRE9XTikge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlRG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaEtleXdvcmQoaW5kZXgsIGtleXdvcmQsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGludCA9IHRoaXMuaGludHNbaW5kZXhdO1xuICAgIGlmIChoaW50ICYmIGhpbnQubWF0Y2gudGVzdChrZXl3b3JkKSAmJiBoaW50LnNlYXJjaCkge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGhpbnQubWF0Y2guZXhlYyhrZXl3b3JkKTtcbiAgICAgIGhpbnQuc2VhcmNoKG1hdGNoZXNbMV0sIGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVHcm91cChpZHgsIGtleXdvcmQpIHtcbiAgICBjb25zdCAkZ3JvdXAgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1oaW50LWdyb3VwIG5vdGUtaGludC1ncm91cC0nICsgaWR4ICsgJ1wiLz4nKTtcbiAgICB0aGlzLnNlYXJjaEtleXdvcmQoaWR4LCBrZXl3b3JkLCAoaXRlbXMpID0+IHtcbiAgICAgIGl0ZW1zID0gaXRlbXMgfHwgW107XG4gICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICRncm91cC5odG1sKHRoaXMuY3JlYXRlSXRlbVRlbXBsYXRlcyhpZHgsIGl0ZW1zKSk7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRncm91cDtcbiAgfVxuXG4gIGhhbmRsZUtleXVwKGUpIHtcbiAgICBpZiAoIWxpc3RzLmNvbnRhaW5zKFtrZXkuY29kZS5FTlRFUiwga2V5LmNvZGUuVVAsIGtleS5jb2RlLkRPV05dLCBlLmtleUNvZGUpKSB7XG4gICAgICBjb25zdCB3b3JkUmFuZ2UgPSB0aGlzLmNvbnRleHQuaW52b2tlKCdlZGl0b3IuZ2V0TGFzdFJhbmdlJykuZ2V0V29yZFJhbmdlKCk7XG4gICAgICBjb25zdCBrZXl3b3JkID0gd29yZFJhbmdlLnRvU3RyaW5nKCk7XG4gICAgICBpZiAodGhpcy5oaW50cy5sZW5ndGggJiYga2V5d29yZCkge1xuICAgICAgICB0aGlzLiRjb250ZW50LmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3QgYm5kID0gZnVuYy5yZWN0MmJuZChsaXN0cy5sYXN0KHdvcmRSYW5nZS5nZXRDbGllbnRSZWN0cygpKSk7XG4gICAgICAgIGlmIChibmQpIHtcbiAgICAgICAgICB0aGlzLiRwb3BvdmVyLmhpZGUoKTtcbiAgICAgICAgICB0aGlzLmxhc3RXb3JkUmFuZ2UgPSB3b3JkUmFuZ2U7XG4gICAgICAgICAgdGhpcy5oaW50cy5mb3JFYWNoKChoaW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmIChoaW50Lm1hdGNoLnRlc3Qoa2V5d29yZCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChpZHgsIGtleXdvcmQpLmFwcGVuZFRvKHRoaXMuJGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHNlbGVjdCBmaXJzdCAubm90ZS1oaW50LWl0ZW1cbiAgICAgICAgICB0aGlzLiRjb250ZW50LmZpbmQoJy5ub3RlLWhpbnQtaXRlbTpmaXJzdCcpLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAgIC8vIHNldCBwb3NpdGlvbiBmb3IgcG9wb3ZlciBhZnRlciBncm91cCBpcyBjcmVhdGVkXG4gICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wJykge1xuICAgICAgICAgICAgdGhpcy4kcG9wb3Zlci5jc3Moe1xuICAgICAgICAgICAgICBsZWZ0OiBibmQubGVmdCxcbiAgICAgICAgICAgICAgdG9wOiBibmQudG9wIC0gdGhpcy4kcG9wb3Zlci5vdXRlckhlaWdodCgpIC0gUE9QT1ZFUl9ESVNULFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJHBvcG92ZXIuY3NzKHtcbiAgICAgICAgICAgICAgbGVmdDogYm5kLmxlZnQsXG4gICAgICAgICAgICAgIHRvcDogYm5kLnRvcCArIGJuZC5oZWlnaHQgKyBQT1BPVkVSX0RJU1QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNob3coKSB7XG4gICAgdGhpcy4kcG9wb3Zlci5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuJHBvcG92ZXIuaGlkZSgpO1xuICB9XG59XG4iXX0=