symbol-table.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  2. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  3. function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
  4. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  5. var __classPrivateFieldSet = this && this.__classPrivateFieldSet || function (receiver, privateMap, value) {
  6. if (!privateMap.has(receiver)) {
  7. throw new TypeError("attempted to set private field on non-instance");
  8. }
  9. privateMap.set(receiver, value);
  10. return value;
  11. };
  12. var __classPrivateFieldGet = this && this.__classPrivateFieldGet || function (receiver, privateMap) {
  13. if (!privateMap.has(receiver)) {
  14. throw new TypeError("attempted to get private field on non-instance");
  15. }
  16. return privateMap.get(receiver);
  17. };
  18. var _hasEval;
  19. import { dict } from '@glimmer/util';
  20. import { isUpperCase } from './utils';
  21. export var SymbolTable = /*#__PURE__*/function () {
  22. function SymbolTable() {}
  23. SymbolTable.top = function top(locals, customizeComponentName) {
  24. return new ProgramSymbolTable(locals, customizeComponentName);
  25. };
  26. var _proto = SymbolTable.prototype;
  27. _proto.child = function child(locals) {
  28. var _this = this;
  29. var symbols = locals.map(function (name) {
  30. return _this.allocate(name);
  31. });
  32. return new BlockSymbolTable(this, locals, symbols);
  33. };
  34. return SymbolTable;
  35. }();
  36. export var ProgramSymbolTable = /*#__PURE__*/function (_SymbolTable) {
  37. _inheritsLoose(ProgramSymbolTable, _SymbolTable);
  38. function ProgramSymbolTable(templateLocals, customizeComponentName) {
  39. var _this2;
  40. _this2 = _SymbolTable.call(this) || this;
  41. _this2.templateLocals = templateLocals;
  42. _this2.customizeComponentName = customizeComponentName;
  43. _this2.symbols = [];
  44. _this2.upvars = [];
  45. _this2.size = 1;
  46. _this2.named = dict();
  47. _this2.blocks = dict();
  48. _this2.usedTemplateLocals = [];
  49. _hasEval.set(_assertThisInitialized(_this2), false);
  50. return _this2;
  51. }
  52. var _proto2 = ProgramSymbolTable.prototype;
  53. _proto2.getUsedTemplateLocals = function getUsedTemplateLocals() {
  54. return this.usedTemplateLocals;
  55. };
  56. _proto2.setHasEval = function setHasEval() {
  57. __classPrivateFieldSet(this, _hasEval, true);
  58. };
  59. _proto2.has = function has(name) {
  60. return this.templateLocals.indexOf(name) !== -1;
  61. };
  62. _proto2.get = function get(name) {
  63. var index = this.usedTemplateLocals.indexOf(name);
  64. if (index !== -1) {
  65. return [index, true];
  66. }
  67. index = this.usedTemplateLocals.length;
  68. this.usedTemplateLocals.push(name);
  69. return [index, true];
  70. };
  71. _proto2.getLocalsMap = function getLocalsMap() {
  72. return dict();
  73. };
  74. _proto2.getEvalInfo = function getEvalInfo() {
  75. var locals = this.getLocalsMap();
  76. return Object.keys(locals).map(function (symbol) {
  77. return locals[symbol];
  78. });
  79. };
  80. _proto2.allocateFree = function allocateFree(name, resolution) {
  81. // If the name in question is an uppercase (i.e. angle-bracket) component invocation, run
  82. // the optional `customizeComponentName` function provided to the precompiler.
  83. if (resolution.resolution() === 39
  84. /* GetFreeAsComponentHead */
  85. && resolution.isAngleBracket && isUpperCase(name)) {
  86. name = this.customizeComponentName(name);
  87. }
  88. var index = this.upvars.indexOf(name);
  89. if (index !== -1) {
  90. return index;
  91. }
  92. index = this.upvars.length;
  93. this.upvars.push(name);
  94. return index;
  95. };
  96. _proto2.allocateNamed = function allocateNamed(name) {
  97. var named = this.named[name];
  98. if (!named) {
  99. named = this.named[name] = this.allocate(name);
  100. }
  101. return named;
  102. };
  103. _proto2.allocateBlock = function allocateBlock(name) {
  104. if (name === 'inverse') {
  105. name = 'else';
  106. }
  107. var block = this.blocks[name];
  108. if (!block) {
  109. block = this.blocks[name] = this.allocate("&" + name);
  110. }
  111. return block;
  112. };
  113. _proto2.allocate = function allocate(identifier) {
  114. this.symbols.push(identifier);
  115. return this.size++;
  116. };
  117. _createClass(ProgramSymbolTable, [{
  118. key: "hasEval",
  119. get: function get() {
  120. return __classPrivateFieldGet(this, _hasEval);
  121. }
  122. }]);
  123. return ProgramSymbolTable;
  124. }(SymbolTable);
  125. _hasEval = new WeakMap();
  126. export var BlockSymbolTable = /*#__PURE__*/function (_SymbolTable2) {
  127. _inheritsLoose(BlockSymbolTable, _SymbolTable2);
  128. function BlockSymbolTable(parent, symbols, slots) {
  129. var _this3;
  130. _this3 = _SymbolTable2.call(this) || this;
  131. _this3.parent = parent;
  132. _this3.symbols = symbols;
  133. _this3.slots = slots;
  134. return _this3;
  135. }
  136. var _proto3 = BlockSymbolTable.prototype;
  137. _proto3.has = function has(name) {
  138. return this.symbols.indexOf(name) !== -1 || this.parent.has(name);
  139. };
  140. _proto3.get = function get(name) {
  141. var slot = this.symbols.indexOf(name);
  142. return slot === -1 ? this.parent.get(name) : [this.slots[slot], false];
  143. };
  144. _proto3.getLocalsMap = function getLocalsMap() {
  145. var _this4 = this;
  146. var dict = this.parent.getLocalsMap();
  147. this.symbols.forEach(function (symbol) {
  148. return dict[symbol] = _this4.get(symbol)[0];
  149. });
  150. return dict;
  151. };
  152. _proto3.getEvalInfo = function getEvalInfo() {
  153. var locals = this.getLocalsMap();
  154. return Object.keys(locals).map(function (symbol) {
  155. return locals[symbol];
  156. });
  157. };
  158. _proto3.setHasEval = function setHasEval() {
  159. this.parent.setHasEval();
  160. };
  161. _proto3.allocateFree = function allocateFree(name, resolution) {
  162. return this.parent.allocateFree(name, resolution);
  163. };
  164. _proto3.allocateNamed = function allocateNamed(name) {
  165. return this.parent.allocateNamed(name);
  166. };
  167. _proto3.allocateBlock = function allocateBlock(name) {
  168. return this.parent.allocateBlock(name);
  169. };
  170. _proto3.allocate = function allocate(identifier) {
  171. return this.parent.allocate(identifier);
  172. };
  173. _createClass(BlockSymbolTable, [{
  174. key: "locals",
  175. get: function get() {
  176. return this.symbols;
  177. }
  178. }]);
  179. return BlockSymbolTable;
  180. }(SymbolTable);
  181. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc3ltYm9sLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLFNBQUEsSUFBQSxRQUFBLGVBQUE7QUFHQSxTQUFBLFdBQUEsUUFBQSxTQUFBO0FBRUEsV0FBTSxXQUFOO0FBQUE7O0FBQUEsY0FDRSxHQURGLEdBQ0UsYUFBQSxNQUFBLEVBQUEsc0JBQUEsRUFFbUQ7QUFFakQsV0FBTyxJQUFBLGtCQUFBLENBQUEsTUFBQSxFQUFQLHNCQUFPLENBQVA7QUFDRCxHQU5IOztBQUFBOztBQUFBLFNBcUJFLEtBckJGLEdBcUJFLGVBQUssTUFBTCxFQUFzQjtBQUFBOztBQUNwQixRQUFJLE9BQU8sR0FBRyxNQUFNLENBQU4sR0FBQSxDQUFZLFVBQUEsSUFBRDtBQUFBLGFBQVUsS0FBQSxDQUFBLFFBQUEsQ0FBbkMsSUFBbUMsQ0FBVjtBQUFBLEtBQVgsQ0FBZDtBQUNBLFdBQU8sSUFBQSxnQkFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0QsR0F4Qkg7O0FBQUE7QUFBQTtBQTJCQSxXQUFNLGtCQUFOO0FBQUE7O0FBQ0UsOEJBQUEsY0FBQSxFQUFBLHNCQUFBLEVBRTJEO0FBQUE7O0FBRXpEO0FBSFEsV0FBQSxjQUFBLEdBQUEsY0FBQTtBQUNBLFdBQUEsc0JBQUEsR0FBQSxzQkFBQTtBQUtILFdBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxXQUFBLE1BQUEsR0FBQSxFQUFBO0FBRUMsV0FBQSxJQUFBLEdBQUEsQ0FBQTtBQUNBLFdBQUEsS0FBQSxHQUFRLElBQVIsRUFBQTtBQUNBLFdBQUEsTUFBQSxHQUFTLElBQVQsRUFBQTtBQUNBLFdBQUEsa0JBQUEsR0FBQSxFQUFBOztBQUVSLElBQUEsUUFBQSxDQUFBLEdBQUEsaUNBQUEsS0FBQTs7QUFiMkQ7QUFHMUQ7O0FBTkg7O0FBQUEsVUFrQkUscUJB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QUFDRCxHQXRCSDs7QUFBQSxVQXdCRSxXQXhCRixHQXdCRSx1QkFBVztBQUNULFFBQUksTUFBTSxHQUFHLEtBQWIsWUFBYSxFQUFiO0FBQ0EsV0FBTyxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLENBQXlCLFVBQUEsTUFBRDtBQUFBLGFBQVksTUFBTSxDQUFqRCxNQUFpRCxDQUFsQjtBQUFBLEtBQXhCLENBQVA7QUFDRCxHQTNCSDs7QUFBQSxVQTZCRSxVQTdCRixHQTZCRSxzQkFBVTtBQUNSLFNBQUEsTUFBQSxDQUFBLFVBQUE7QUFDRCxHQS9CSDs7QUFBQSxVQWlDRSxZQWpDRixHQWlDRSxzQkFBWSxJQUFaLEVBQVksVUFBWixFQUE4RDtBQUM1RCxXQUFPLEtBQUEsTUFBQSxDQUFBLFlBQUEsQ0FBQSxJQUFBLEVBQVAsVUFBTyxDQUFQO0FBQ0QsR0FuQ0g7O0FBQUEsVUFxQ0UsYUFyQ0YsR0FxQ0UsdUJBQWEsSUFBYixFQUEwQjtBQUN4QixXQUFPLEtBQUEsTUFBQSxDQUFBLGFBQUEsQ0FBUCxJQUFPLENBQVA7QUFDRCxHQXZDSDs7QUFBQSxVQXlDRSxhQXpDRixHQXlDRSx1QkFBYSxJQUFiLEVBQTBCO0FBQ3hCLFdBQU8sS0FBQSxNQUFBLENBQUEsYUFBQSxDQUFQLElBQU8sQ0FBUDtBQUNELEdBM0NIOztBQUFBLFVBNkNFLFFBN0NGLEdBNkNFLGtCQUFRLFVBQVIsRUFBMkI7QUFDekIsV0FBTyxLQUFBLE1BQUEsQ0FBQSxRQUFBLENBQVAsVUFBTyxDQUFQO0FBQ0QsR0EvQ0g7O0FBQUE7QUFBQTtBQUFBLHdCQUtZO0FBQ1IsYUFBTyxLQUFQLE9BQUE7QUFDRDtBQVBIOztBQUFBO0FBQUEsRUFBTSxXQUFOIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29yZSwgRGljdCwgU2V4cE9wY29kZXMgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGRpY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgQVNUdjIgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBpc1VwcGVyQ2FzZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3ltYm9sVGFibGUge1xuICBzdGF0aWMgdG9wKFxuICAgIGxvY2Fsczogc3RyaW5nW10sXG4gICAgY3VzdG9taXplQ29tcG9uZW50TmFtZTogKGlucHV0OiBzdHJpbmcpID0+IHN0cmluZ1xuICApOiBQcm9ncmFtU3ltYm9sVGFibGUge1xuICAgIHJldHVybiBuZXcgUHJvZ3JhbVN5bWJvbFRhYmxlKGxvY2FscywgY3VzdG9taXplQ29tcG9uZW50TmFtZSk7XG4gIH1cblxuICBhYnN0cmFjdCBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgZ2V0KG5hbWU6IHN0cmluZyk6IFtzeW1ib2w6IG51bWJlciwgaXNSb290OiBib29sZWFuXTtcblxuICBhYnN0cmFjdCBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+O1xuICBhYnN0cmFjdCBnZXRFdmFsSW5mbygpOiBDb3JlLkV2YWxJbmZvO1xuXG4gIGFic3RyYWN0IGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyO1xuICBhYnN0cmFjdCBhbGxvY2F0ZU5hbWVkKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYWJzdHJhY3QgYWxsb2NhdGVCbG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFic3RyYWN0IGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlcjtcblxuICBhYnN0cmFjdCBzZXRIYXNFdmFsKCk6IHZvaWQ7XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IEJsb2NrU3ltYm9sVGFibGUge1xuICAgIGxldCBzeW1ib2xzID0gbG9jYWxzLm1hcCgobmFtZSkgPT4gdGhpcy5hbGxvY2F0ZShuYW1lKSk7XG4gICAgcmV0dXJuIG5ldyBCbG9ja1N5bWJvbFRhYmxlKHRoaXMsIGxvY2Fscywgc3ltYm9scyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1TeW1ib2xUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZUxvY2Fsczogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSBjdXN0b21pemVDb21wb25lbnROYW1lOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgc3ltYm9sczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHVwdmFyczogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIHNpemUgPSAxO1xuICBwcml2YXRlIG5hbWVkID0gZGljdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgYmxvY2tzID0gZGljdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgdXNlZFRlbXBsYXRlTG9jYWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICNoYXNFdmFsID0gZmFsc2U7XG5cbiAgZ2V0VXNlZFRlbXBsYXRlTG9jYWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHM7XG4gIH1cblxuICBzZXRIYXNFdmFsKCk6IHZvaWQge1xuICAgIHRoaXMuI2hhc0V2YWwgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IGhhc0V2YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0V2YWw7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVMb2NhbHMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogW251bWJlciwgYm9vbGVhbl0ge1xuICAgIGxldCBpbmRleCA9IHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gW2luZGV4LCB0cnVlXTtcbiAgICB9XG5cbiAgICBpbmRleCA9IHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLmxlbmd0aDtcbiAgICB0aGlzLnVzZWRUZW1wbGF0ZUxvY2Fscy5wdXNoKG5hbWUpO1xuICAgIHJldHVybiBbaW5kZXgsIHRydWVdO1xuICB9XG5cbiAgZ2V0TG9jYWxzTWFwKCk6IERpY3Q8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGRpY3QoKTtcbiAgfVxuXG4gIGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm8ge1xuICAgIGxldCBsb2NhbHMgPSB0aGlzLmdldExvY2Fsc01hcCgpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsb2NhbHMpLm1hcCgoc3ltYm9sKSA9PiBsb2NhbHNbc3ltYm9sXSk7XG4gIH1cblxuICBhbGxvY2F0ZUZyZWUobmFtZTogc3RyaW5nLCByZXNvbHV0aW9uOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbik6IG51bWJlciB7XG4gICAgLy8gSWYgdGhlIG5hbWUgaW4gcXVlc3Rpb24gaXMgYW4gdXBwZXJjYXNlIChpLmUuIGFuZ2xlLWJyYWNrZXQpIGNvbXBvbmVudCBpbnZvY2F0aW9uLCBydW5cbiAgICAvLyB0aGUgb3B0aW9uYWwgYGN1c3RvbWl6ZUNvbXBvbmVudE5hbWVgIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIHRoZSBwcmVjb21waWxlci5cbiAgICBpZiAoXG4gICAgICByZXNvbHV0aW9uLnJlc29sdXRpb24oKSA9PT0gU2V4cE9wY29kZXMuR2V0RnJlZUFzQ29tcG9uZW50SGVhZCAmJlxuICAgICAgcmVzb2x1dGlvbi5pc0FuZ2xlQnJhY2tldCAmJlxuICAgICAgaXNVcHBlckNhc2UobmFtZSlcbiAgICApIHtcbiAgICAgIG5hbWUgPSB0aGlzLmN1c3RvbWl6ZUNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gdGhpcy51cHZhcnMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBpbmRleCA9IHRoaXMudXB2YXJzLmxlbmd0aDtcbiAgICB0aGlzLnVwdmFycy5wdXNoKG5hbWUpO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkW25hbWVdO1xuXG4gICAgaWYgKCFuYW1lZCkge1xuICAgICAgbmFtZWQgPSB0aGlzLm5hbWVkW25hbWVdID0gdGhpcy5hbGxvY2F0ZShuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZWQ7XG4gIH1cblxuICBhbGxvY2F0ZUJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgPT09ICdpbnZlcnNlJykge1xuICAgICAgbmFtZSA9ICdlbHNlJztcbiAgICB9XG5cbiAgICBsZXQgYmxvY2sgPSB0aGlzLmJsb2Nrc1tuYW1lXTtcblxuICAgIGlmICghYmxvY2spIHtcbiAgICAgIGJsb2NrID0gdGhpcy5ibG9ja3NbbmFtZV0gPSB0aGlzLmFsbG9jYXRlKGAmJHtuYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiBibG9jaztcbiAgfVxuXG4gIGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdGhpcy5zeW1ib2xzLnB1c2goaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSsrO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbG9ja1N5bWJvbFRhYmxlIGV4dGVuZHMgU3ltYm9sVGFibGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9sVGFibGUsIHB1YmxpYyBzeW1ib2xzOiBzdHJpbmdbXSwgcHVibGljIHNsb3RzOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgbG9jYWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xzO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbHMuaW5kZXhPZihuYW1lKSAhPT0gLTEgfHwgdGhpcy5wYXJlbnQuaGFzKG5hbWUpO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IFtudW1iZXIsIGJvb2xlYW5dIHtcbiAgICBsZXQgc2xvdCA9IHRoaXMuc3ltYm9scy5pbmRleE9mKG5hbWUpO1xuICAgIHJldHVybiBzbG90ID09PSAtMSA/IHRoaXMucGFyZW50LmdldChuYW1lKSA6IFt0aGlzLnNsb3RzW3Nsb3RdLCBmYWxzZV07XG4gIH1cblxuICBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+IHtcbiAgICBsZXQgZGljdCA9IHRoaXMucGFyZW50LmdldExvY2Fsc01hcCgpO1xuICAgIHRoaXMuc3ltYm9scy5mb3JFYWNoKChzeW1ib2wpID0+IChkaWN0W3N5bWJvbF0gPSB0aGlzLmdldChzeW1ib2wpWzBdKSk7XG4gICAgcmV0dXJuIGRpY3Q7XG4gIH1cblxuICBnZXRFdmFsSW5mbygpOiBDb3JlLkV2YWxJbmZvIHtcbiAgICBsZXQgbG9jYWxzID0gdGhpcy5nZXRMb2NhbHNNYXAoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobG9jYWxzKS5tYXAoKHN5bWJvbCkgPT4gbG9jYWxzW3N5bWJvbF0pO1xuICB9XG5cbiAgc2V0SGFzRXZhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudC5zZXRIYXNFdmFsKCk7XG4gIH1cblxuICBhbGxvY2F0ZUZyZWUobmFtZTogc3RyaW5nLCByZXNvbHV0aW9uOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmFsbG9jYXRlRnJlZShuYW1lLCByZXNvbHV0aW9uKTtcbiAgfVxuXG4gIGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVOYW1lZChuYW1lKTtcbiAgfVxuXG4gIGFsbG9jYXRlQmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVCbG9jayhuYW1lKTtcbiAgfVxuXG4gIGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmFsbG9jYXRlKGlkZW50aWZpZXIpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9