UNPKG

14.3 kBJavaScriptView Raw
1function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
2
3import { ConcreteBounds, NewElementBuilder } from '@glimmer/runtime';
4var TEXT_NODE = 3;
5var NEEDS_EXTRA_CLOSE = new WeakMap();
6
7function currentNode(cursor) {
8 var element = cursor.element,
9 nextSibling = cursor.nextSibling;
10
11 if (nextSibling === null) {
12 return element.lastChild;
13 } else {
14 return nextSibling.previousSibling;
15 }
16}
17
18var SerializeBuilder = /*#__PURE__*/function (_NewElementBuilder) {
19 _inheritsLoose(SerializeBuilder, _NewElementBuilder);
20
21 function SerializeBuilder() {
22 var _this;
23
24 _this = _NewElementBuilder.apply(this, arguments) || this;
25 _this.serializeBlockDepth = 0;
26 return _this;
27 }
28
29 var _proto = SerializeBuilder.prototype;
30
31 _proto.__openBlock = function __openBlock() {
32 var tagName = this.element.tagName;
33
34 if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {
35 var depth = this.serializeBlockDepth++;
36
37 this.__appendComment("%+b:" + depth + "%");
38 }
39
40 _NewElementBuilder.prototype.__openBlock.call(this);
41 };
42
43 _proto.__closeBlock = function __closeBlock() {
44 var tagName = this.element.tagName;
45
46 _NewElementBuilder.prototype.__closeBlock.call(this);
47
48 if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {
49 var depth = --this.serializeBlockDepth;
50
51 this.__appendComment("%-b:" + depth + "%");
52 }
53 };
54
55 _proto.__appendHTML = function __appendHTML(html) {
56 var tagName = this.element.tagName;
57
58 if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {
59 return _NewElementBuilder.prototype.__appendHTML.call(this, html);
60 } // Do we need to run the html tokenizer here?
61
62
63 var first = this.__appendComment('%glmr%');
64
65 if (tagName === 'TABLE') {
66 var openIndex = html.indexOf('<');
67
68 if (openIndex > -1) {
69 var tr = html.slice(openIndex + 1, openIndex + 3);
70
71 if (tr === 'tr') {
72 html = "<tbody>" + html + "</tbody>";
73 }
74 }
75 }
76
77 if (html === '') {
78 this.__appendComment('% %');
79 } else {
80 _NewElementBuilder.prototype.__appendHTML.call(this, html);
81 }
82
83 var last = this.__appendComment('%glmr%');
84
85 return new ConcreteBounds(this.element, first, last);
86 };
87
88 _proto.__appendText = function __appendText(string) {
89 var tagName = this.element.tagName;
90 var current = currentNode(this);
91
92 if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {
93 return _NewElementBuilder.prototype.__appendText.call(this, string);
94 } else if (string === '') {
95 return this.__appendComment('% %');
96 } else if (current && current.nodeType === TEXT_NODE) {
97 this.__appendComment('%|%');
98 }
99
100 return _NewElementBuilder.prototype.__appendText.call(this, string);
101 };
102
103 _proto.closeElement = function closeElement() {
104 if (NEEDS_EXTRA_CLOSE.has(this.element)) {
105 NEEDS_EXTRA_CLOSE["delete"](this.element);
106
107 _NewElementBuilder.prototype.closeElement.call(this);
108 }
109
110 return _NewElementBuilder.prototype.closeElement.call(this);
111 };
112
113 _proto.openElement = function openElement(tag) {
114 if (tag === 'tr') {
115 if (this.element.tagName !== 'TBODY' && this.element.tagName !== 'THEAD' && this.element.tagName !== 'TFOOT') {
116 this.openElement('tbody'); // This prevents the closeBlock comment from being re-parented
117 // under the auto inserted tbody. Rehydration builder needs to
118 // account for the insertion since it is injected here and not
119 // really in the template.
120
121 NEEDS_EXTRA_CLOSE.set(this.constructing, true);
122 this.flushElement(null);
123 }
124 }
125
126 return _NewElementBuilder.prototype.openElement.call(this, tag);
127 };
128
129 _proto.pushRemoteElement = function pushRemoteElement(element, cursorId, insertBefore) {
130 if (insertBefore === void 0) {
131 insertBefore = null;
132 }
133
134 var dom = this.dom;
135 var script = dom.createElement('script');
136 script.setAttribute('glmr', cursorId);
137 dom.insertBefore(element, script, insertBefore);
138 return _NewElementBuilder.prototype.pushRemoteElement.call(this, element, cursorId, insertBefore);
139 };
140
141 return SerializeBuilder;
142}(NewElementBuilder);
143
144export function serializeBuilder(env, cursor) {
145 return SerializeBuilder.forInitialRender(env, cursor);
146}
147//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL25vZGUvbGliL3NlcmlhbGl6ZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsU0FBQSxjQUFBLEVBQUEsaUJBQUEsUUFBQSxrQkFBQTtBQUlBLElBQU0sU0FBUyxHQUFmLENBQUE7QUFFQSxJQUFNLGlCQUFpQixHQUFHLElBQTFCLE9BQTBCLEVBQTFCOztBQUVBLFNBQUEsV0FBQSxDQUFBLE1BQUEsRUFDOEU7QUFBQSxNQUV4RSxPQUZ3RSxHQUU1RSxNQUY0RSxDQUV4RSxPQUZ3RTtBQUFBLE1BRTdELFdBRjZELEdBRTVFLE1BRjRFLENBRTdELFdBRjZEOztBQUk1RSxNQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLFdBQU8sT0FBTyxDQUFkLFNBQUE7QUFERixHQUFBLE1BRU87QUFDTCxXQUFPLFdBQVcsQ0FBbEIsZUFBQTtBQUNEO0FBQ0Y7O0lBRUQsZ0I7OztBQUFBLDhCQUFBO0FBQUE7OztBQUNVLFVBQUEsbUJBQUEsR0FBQSxDQUFBO0FBRFY7QUE0R0M7Ozs7U0F6R0MsVyxHQUFBLHVCQUFXO0FBQUEsUUFDSCxPQURHLEdBQ1MsS0FBbEIsT0FEUyxDQUNILE9BREc7O0FBR1QsUUFBSSxPQUFPLEtBQVAsT0FBQSxJQUF1QixPQUFPLEtBQTlCLFFBQUEsSUFBK0MsT0FBTyxLQUExRCxPQUFBLEVBQXdFO0FBQ3RFLFVBQUksS0FBSyxHQUFHLEtBQVosbUJBQVksRUFBWjs7QUFDQSxXQUFBLGVBQUEsVUFBQSxLQUFBO0FBQ0Q7O0FBRUQsaUNBQUEsV0FBQTtBQUNELEc7O1NBRUQsWSxHQUFBLHdCQUFZO0FBQUEsUUFDSixPQURJLEdBQ1EsS0FBbEIsT0FEVSxDQUNKLE9BREk7O0FBR1YsaUNBQUEsWUFBQTs7QUFFQSxRQUFJLE9BQU8sS0FBUCxPQUFBLElBQXVCLE9BQU8sS0FBOUIsUUFBQSxJQUErQyxPQUFPLEtBQTFELE9BQUEsRUFBd0U7QUFDdEUsVUFBSSxLQUFLLEdBQUcsRUFBRSxLQUFkLG1CQUFBOztBQUNBLFdBQUEsZUFBQSxVQUFBLEtBQUE7QUFDRDtBQUNGLEc7O1NBRUQsWSxHQUFBLHNCQUFZLElBQVosRUFBeUI7QUFBQSxRQUNqQixPQURpQixHQUNMLEtBQWxCLE9BRHVCLENBQ2pCLE9BRGlCOztBQUd2QixRQUFJLE9BQU8sS0FBUCxPQUFBLElBQXVCLE9BQU8sS0FBOUIsUUFBQSxJQUErQyxPQUFPLEtBQTFELE9BQUEsRUFBd0U7QUFDdEUsMENBQU8sWUFBUCxZQUFBLElBQUE7QUFKcUIsS0FBQSxDQU92Qjs7O0FBQ0EsUUFBSSxLQUFLLEdBQUcsS0FBQSxlQUFBLENBQVosUUFBWSxDQUFaOztBQUNBLFFBQUksT0FBTyxLQUFYLE9BQUEsRUFBeUI7QUFDdkIsVUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFKLE9BQUEsQ0FBaEIsR0FBZ0IsQ0FBaEI7O0FBQ0EsVUFBSSxTQUFTLEdBQUcsQ0FBaEIsQ0FBQSxFQUFvQjtBQUNsQixZQUFJLEVBQUUsR0FBRyxJQUFJLENBQUosS0FBQSxDQUFXLFNBQVMsR0FBcEIsQ0FBQSxFQUEwQixTQUFTLEdBQTVDLENBQVMsQ0FBVDs7QUFDQSxZQUFJLEVBQUUsS0FBTixJQUFBLEVBQWlCO0FBQ2YsVUFBQSxJQUFJLGVBQUosSUFBSSxhQUFKO0FBQ0Q7QUFDRjtBQUNGOztBQUNELFFBQUksSUFBSSxLQUFSLEVBQUEsRUFBaUI7QUFDZixXQUFBLGVBQUEsQ0FBQSxLQUFBO0FBREYsS0FBQSxNQUVPO0FBQ0wsbUNBQUEsWUFBQSxZQUFBLElBQUE7QUFDRDs7QUFFRCxRQUFJLElBQUksR0FBRyxLQUFBLGVBQUEsQ0FBWCxRQUFXLENBQVg7O0FBQ0EsV0FBTyxJQUFBLGNBQUEsQ0FBbUIsS0FBbkIsT0FBQSxFQUFBLEtBQUEsRUFBUCxJQUFPLENBQVA7QUFDRCxHOztTQUVELFksR0FBQSxzQkFBWSxNQUFaLEVBQTJCO0FBQUEsUUFDbkIsT0FEbUIsR0FDUCxLQUFsQixPQUR5QixDQUNuQixPQURtQjtBQUV6QixRQUFJLE9BQU8sR0FBRyxXQUFXLENBQXpCLElBQXlCLENBQXpCOztBQUVBLFFBQUksT0FBTyxLQUFQLE9BQUEsSUFBdUIsT0FBTyxLQUE5QixRQUFBLElBQStDLE9BQU8sS0FBMUQsT0FBQSxFQUF3RTtBQUN0RSwwQ0FBTyxZQUFQLFlBQUEsTUFBQTtBQURGLEtBQUEsTUFFTyxJQUFJLE1BQU0sS0FBVixFQUFBLEVBQW1CO0FBQ3hCLGFBQVEsS0FBQSxlQUFBLENBQVIsS0FBUSxDQUFSO0FBREssS0FBQSxNQUVBLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBUCxRQUFBLEtBQWYsU0FBQSxFQUErQztBQUNwRCxXQUFBLGVBQUEsQ0FBQSxLQUFBO0FBQ0Q7O0FBRUQsd0NBQU8sWUFBUCxZQUFBLE1BQUE7QUFDRCxHOztTQUVELFksR0FBQSx3QkFBWTtBQUNWLFFBQUksaUJBQWlCLENBQWpCLEdBQUEsQ0FBc0IsS0FBMUIsT0FBSSxDQUFKLEVBQXlDO0FBQ3ZDLE1BQUEsaUJBQUEsVUFBQSxDQUF5QixLQUF6QixPQUFBOztBQUNBLG1DQUFBLFlBQUE7QUFDRDs7QUFFRCx3Q0FBQSxZQUFBO0FBQ0QsRzs7U0FFRCxXLEdBQUEscUJBQVcsR0FBWCxFQUF1QjtBQUNyQixRQUFJLEdBQUcsS0FBUCxJQUFBLEVBQWtCO0FBQ2hCLFVBQ0UsS0FBQSxPQUFBLENBQUEsT0FBQSxLQUFBLE9BQUEsSUFDQSxLQUFBLE9BQUEsQ0FBQSxPQUFBLEtBREEsT0FBQSxJQUVBLEtBQUEsT0FBQSxDQUFBLE9BQUEsS0FIRixPQUFBLEVBSUU7QUFDQSxhQUFBLFdBQUEsQ0FEQSxPQUNBLEVBREEsQ0FFQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxRQUFBLGlCQUFpQixDQUFqQixHQUFBLENBQXNCLEtBQXRCLFlBQUEsRUFBQSxJQUFBO0FBQ0EsYUFBQSxZQUFBLENBQUEsSUFBQTtBQUNEO0FBQ0Y7O0FBRUQsd0NBQU8sV0FBUCxZQUFBLEdBQUE7QUFDRCxHOztTQUVELGlCLEdBQUEsMkJBQWlCLE9BQWpCLEVBQWlCLFFBQWpCLEVBR0UsWUFIRixFQUd3QztBQUFBLFFBQXRDLFlBQXNDO0FBQXRDLE1BQUEsWUFBc0MsR0FIdkIsSUFHdUI7QUFBQTs7QUFBQSxRQUVoQyxHQUZnQyxHQUV0QyxJQUZzQyxDQUVoQyxHQUZnQztBQUd0QyxRQUFJLE1BQU0sR0FBRyxHQUFHLENBQUgsYUFBQSxDQUFiLFFBQWEsQ0FBYjtBQUNBLElBQUEsTUFBTSxDQUFOLFlBQUEsQ0FBQSxNQUFBLEVBQUEsUUFBQTtBQUNBLElBQUEsR0FBRyxDQUFILFlBQUEsQ0FBQSxPQUFBLEVBQUEsTUFBQSxFQUFBLFlBQUE7QUFDQSx3Q0FBTyxpQkFBUCxZQUFPLE9BQVAsRUFBTyxRQUFQLEVBQUEsWUFBQTtBQUNELEc7OztFQTNHSCxpQjs7QUE4R0EsT0FBTSxTQUFBLGdCQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsRUFFK0Q7QUFFbkUsU0FBTyxnQkFBZ0IsQ0FBaEIsZ0JBQUEsQ0FBQSxHQUFBLEVBQVAsTUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEJvdW5kcyxcbiAgRW52aXJvbm1lbnQsXG4gIE9wdGlvbixcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIE1heWJlLFxuICBNb2RpZmllckluc3RhbmNlLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbmNyZXRlQm91bmRzLCBOZXdFbGVtZW50QnVpbGRlciB9IGZyb20gJ0BnbGltbWVyL3J1bnRpbWUnO1xuaW1wb3J0IHsgUmVtb3RlTGl2ZUJsb2NrIH0gZnJvbSAnQGdsaW1tZXIvcnVudGltZSc7XG5pbXBvcnQgdHlwZSB7IFNpbXBsZUVsZW1lbnQsIFNpbXBsZU5vZGUsIFNpbXBsZVRleHQgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuXG5jb25zdCBURVhUX05PREUgPSAzO1xuXG5jb25zdCBORUVEU19FWFRSQV9DTE9TRSA9IG5ldyBXZWFrTWFwPFNpbXBsZU5vZGU+KCk7XG5cbmZ1bmN0aW9uIGN1cnJlbnROb2RlKFxuICBjdXJzb3I6IEVsZW1lbnRCdWlsZGVyIHwgeyBlbGVtZW50OiBTaW1wbGVFbGVtZW50OyBuZXh0U2libGluZzogU2ltcGxlTm9kZSB9XG4pOiBPcHRpb248U2ltcGxlTm9kZT4ge1xuICBsZXQgeyBlbGVtZW50LCBuZXh0U2libGluZyB9ID0gY3Vyc29yO1xuXG4gIGlmIChuZXh0U2libGluZyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50Lmxhc3RDaGlsZDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICB9XG59XG5cbmNsYXNzIFNlcmlhbGl6ZUJ1aWxkZXIgZXh0ZW5kcyBOZXdFbGVtZW50QnVpbGRlciBpbXBsZW1lbnRzIEVsZW1lbnRCdWlsZGVyIHtcbiAgcHJpdmF0ZSBzZXJpYWxpemVCbG9ja0RlcHRoID0gMDtcblxuICBfX29wZW5CbG9jaygpOiB2b2lkIHtcbiAgICBsZXQgeyB0YWdOYW1lIH0gPSB0aGlzLmVsZW1lbnQ7XG5cbiAgICBpZiAodGFnTmFtZSAhPT0gJ1RJVExFJyAmJiB0YWdOYW1lICE9PSAnU0NSSVBUJyAmJiB0YWdOYW1lICE9PSAnU1RZTEUnKSB7XG4gICAgICBsZXQgZGVwdGggPSB0aGlzLnNlcmlhbGl6ZUJsb2NrRGVwdGgrKztcbiAgICAgIHRoaXMuX19hcHBlbmRDb21tZW50KGAlK2I6JHtkZXB0aH0lYCk7XG4gICAgfVxuXG4gICAgc3VwZXIuX19vcGVuQmxvY2soKTtcbiAgfVxuXG4gIF9fY2xvc2VCbG9jaygpOiB2b2lkIHtcbiAgICBsZXQgeyB0YWdOYW1lIH0gPSB0aGlzLmVsZW1lbnQ7XG5cbiAgICBzdXBlci5fX2Nsb3NlQmxvY2soKTtcblxuICAgIGlmICh0YWdOYW1lICE9PSAnVElUTEUnICYmIHRhZ05hbWUgIT09ICdTQ1JJUFQnICYmIHRhZ05hbWUgIT09ICdTVFlMRScpIHtcbiAgICAgIGxldCBkZXB0aCA9IC0tdGhpcy5zZXJpYWxpemVCbG9ja0RlcHRoO1xuICAgICAgdGhpcy5fX2FwcGVuZENvbW1lbnQoYCUtYjoke2RlcHRofSVgKTtcbiAgICB9XG4gIH1cblxuICBfX2FwcGVuZEhUTUwoaHRtbDogc3RyaW5nKTogQm91bmRzIHtcbiAgICBsZXQgeyB0YWdOYW1lIH0gPSB0aGlzLmVsZW1lbnQ7XG5cbiAgICBpZiAodGFnTmFtZSA9PT0gJ1RJVExFJyB8fCB0YWdOYW1lID09PSAnU0NSSVBUJyB8fCB0YWdOYW1lID09PSAnU1RZTEUnKSB7XG4gICAgICByZXR1cm4gc3VwZXIuX19hcHBlbmRIVE1MKGh0bWwpO1xuICAgIH1cblxuICAgIC8vIERvIHdlIG5lZWQgdG8gcnVuIHRoZSBodG1sIHRva2VuaXplciBoZXJlP1xuICAgIGxldCBmaXJzdCA9IHRoaXMuX19hcHBlbmRDb21tZW50KCclZ2xtciUnKTtcbiAgICBpZiAodGFnTmFtZSA9PT0gJ1RBQkxFJykge1xuICAgICAgbGV0IG9wZW5JbmRleCA9IGh0bWwuaW5kZXhPZignPCcpO1xuICAgICAgaWYgKG9wZW5JbmRleCA+IC0xKSB7XG4gICAgICAgIGxldCB0ciA9IGh0bWwuc2xpY2Uob3BlbkluZGV4ICsgMSwgb3BlbkluZGV4ICsgMyk7XG4gICAgICAgIGlmICh0ciA9PT0gJ3RyJykge1xuICAgICAgICAgIGh0bWwgPSBgPHRib2R5PiR7aHRtbH08L3Rib2R5PmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICB0aGlzLl9fYXBwZW5kQ29tbWVudCgnJSAlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLl9fYXBwZW5kSFRNTChodG1sKTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdCA9IHRoaXMuX19hcHBlbmRDb21tZW50KCclZ2xtciUnKTtcbiAgICByZXR1cm4gbmV3IENvbmNyZXRlQm91bmRzKHRoaXMuZWxlbWVudCwgZmlyc3QsIGxhc3QpO1xuICB9XG5cbiAgX19hcHBlbmRUZXh0KHN0cmluZzogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgbGV0IHsgdGFnTmFtZSB9ID0gdGhpcy5lbGVtZW50O1xuICAgIGxldCBjdXJyZW50ID0gY3VycmVudE5vZGUodGhpcyk7XG5cbiAgICBpZiAodGFnTmFtZSA9PT0gJ1RJVExFJyB8fCB0YWdOYW1lID09PSAnU0NSSVBUJyB8fCB0YWdOYW1lID09PSAnU1RZTEUnKSB7XG4gICAgICByZXR1cm4gc3VwZXIuX19hcHBlbmRUZXh0KHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChzdHJpbmcgPT09ICcnKSB7XG4gICAgICByZXR1cm4gKHRoaXMuX19hcHBlbmRDb21tZW50KCclICUnKSBhcyBhbnkpIGFzIFNpbXBsZVRleHQ7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50ICYmIGN1cnJlbnQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgdGhpcy5fX2FwcGVuZENvbW1lbnQoJyV8JScpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5fX2FwcGVuZFRleHQoc3RyaW5nKTtcbiAgfVxuXG4gIGNsb3NlRWxlbWVudCgpOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPiB7XG4gICAgaWYgKE5FRURTX0VYVFJBX0NMT1NFLmhhcyh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICBORUVEU19FWFRSQV9DTE9TRS5kZWxldGUodGhpcy5lbGVtZW50KTtcbiAgICAgIHN1cGVyLmNsb3NlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5jbG9zZUVsZW1lbnQoKTtcbiAgfVxuXG4gIG9wZW5FbGVtZW50KHRhZzogc3RyaW5nKSB7XG4gICAgaWYgKHRhZyA9PT0gJ3RyJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmVsZW1lbnQudGFnTmFtZSAhPT0gJ1RCT0RZJyAmJlxuICAgICAgICB0aGlzLmVsZW1lbnQudGFnTmFtZSAhPT0gJ1RIRUFEJyAmJlxuICAgICAgICB0aGlzLmVsZW1lbnQudGFnTmFtZSAhPT0gJ1RGT09UJ1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMub3BlbkVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIGNsb3NlQmxvY2sgY29tbWVudCBmcm9tIGJlaW5nIHJlLXBhcmVudGVkXG4gICAgICAgIC8vIHVuZGVyIHRoZSBhdXRvIGluc2VydGVkIHRib2R5LiBSZWh5ZHJhdGlvbiBidWlsZGVyIG5lZWRzIHRvXG4gICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBpbnNlcnRpb24gc2luY2UgaXQgaXMgaW5qZWN0ZWQgaGVyZSBhbmQgbm90XG4gICAgICAgIC8vIHJlYWxseSBpbiB0aGUgdGVtcGxhdGUuXG4gICAgICAgIE5FRURTX0VYVFJBX0NMT1NFLnNldCh0aGlzLmNvbnN0cnVjdGluZyEsIHRydWUpO1xuICAgICAgICB0aGlzLmZsdXNoRWxlbWVudChudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub3BlbkVsZW1lbnQodGFnKTtcbiAgfVxuXG4gIHB1c2hSZW1vdGVFbGVtZW50KFxuICAgIGVsZW1lbnQ6IFNpbXBsZUVsZW1lbnQsXG4gICAgY3Vyc29ySWQ6IHN0cmluZyxcbiAgICBpbnNlcnRCZWZvcmU6IE1heWJlPFNpbXBsZU5vZGU+ID0gbnVsbFxuICApOiBPcHRpb248UmVtb3RlTGl2ZUJsb2NrPiB7XG4gICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgIGxldCBzY3JpcHQgPSBkb20uY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnZ2xtcicsIGN1cnNvcklkKTtcbiAgICBkb20uaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHNjcmlwdCwgaW5zZXJ0QmVmb3JlKTtcbiAgICByZXR1cm4gc3VwZXIucHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgY3Vyc29ySWQsIGluc2VydEJlZm9yZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUJ1aWxkZXIoXG4gIGVudjogRW52aXJvbm1lbnQsXG4gIGN1cnNvcjogeyBlbGVtZW50OiBTaW1wbGVFbGVtZW50OyBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+IH1cbik6IEVsZW1lbnRCdWlsZGVyIHtcbiAgcmV0dXJuIFNlcmlhbGl6ZUJ1aWxkZXIuZm9ySW5pdGlhbFJlbmRlcihlbnYsIGN1cnNvcik7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9
\No newline at end of file