builders.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. var __rest = this && this.__rest || function (s, e) {
  2. var t = {};
  3. for (var p in s) {
  4. if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  5. }
  6. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  7. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  8. }
  9. return t;
  10. };
  11. import { assert, assertPresent, assign } from '@glimmer/util';
  12. import { SourceSlice } from '../source/slice';
  13. import { SpanList } from '../source/span-list';
  14. import * as ASTv2 from './api';
  15. export var Builder = /*#__PURE__*/function () {
  16. function Builder() {}
  17. var _proto = Builder.prototype;
  18. // TEMPLATE //
  19. _proto.template = function template(symbols, body, loc) {
  20. return new ASTv2.Template({
  21. table: symbols,
  22. body: body,
  23. loc: loc
  24. });
  25. } // INTERNAL (these nodes cannot be reached when doing general-purpose visiting) //
  26. ;
  27. _proto.block = function block(symbols, body, loc) {
  28. return new ASTv2.Block({
  29. scope: symbols,
  30. body: body,
  31. loc: loc
  32. });
  33. };
  34. _proto.namedBlock = function namedBlock(name, block, loc) {
  35. return new ASTv2.NamedBlock({
  36. name: name,
  37. block: block,
  38. attrs: [],
  39. componentArgs: [],
  40. modifiers: [],
  41. loc: loc
  42. });
  43. };
  44. _proto.simpleNamedBlock = function simpleNamedBlock(name, block, loc) {
  45. return new BuildElement({
  46. selfClosing: false,
  47. attrs: [],
  48. componentArgs: [],
  49. modifiers: [],
  50. comments: []
  51. }).named(name, block, loc);
  52. };
  53. _proto.slice = function slice(chars, loc) {
  54. return new SourceSlice({
  55. loc: loc,
  56. chars: chars
  57. });
  58. };
  59. _proto.args = function args(positional, named, loc) {
  60. return new ASTv2.Args({
  61. loc: loc,
  62. positional: positional,
  63. named: named
  64. });
  65. };
  66. _proto.positional = function positional(exprs, loc) {
  67. return new ASTv2.PositionalArguments({
  68. loc: loc,
  69. exprs: exprs
  70. });
  71. };
  72. _proto.namedArgument = function namedArgument(key, value) {
  73. return new ASTv2.NamedArgument({
  74. name: key,
  75. value: value
  76. });
  77. };
  78. _proto.named = function named(entries, loc) {
  79. return new ASTv2.NamedArguments({
  80. loc: loc,
  81. entries: entries
  82. });
  83. };
  84. _proto.attr = function attr(_ref, loc) {
  85. var name = _ref.name,
  86. value = _ref.value,
  87. trusting = _ref.trusting;
  88. return new ASTv2.HtmlAttr({
  89. loc: loc,
  90. name: name,
  91. value: value,
  92. trusting: trusting
  93. });
  94. };
  95. _proto.splatAttr = function splatAttr(symbol, loc) {
  96. return new ASTv2.SplatAttr({
  97. symbol: symbol,
  98. loc: loc
  99. });
  100. };
  101. _proto.arg = function arg(_ref2, loc) {
  102. var name = _ref2.name,
  103. value = _ref2.value,
  104. trusting = _ref2.trusting;
  105. return new ASTv2.ComponentArg({
  106. name: name,
  107. value: value,
  108. trusting: trusting,
  109. loc: loc
  110. });
  111. } // EXPRESSIONS //
  112. ;
  113. _proto.path = function path(head, tail, loc) {
  114. return new ASTv2.PathExpression({
  115. loc: loc,
  116. ref: head,
  117. tail: tail
  118. });
  119. };
  120. _proto.self = function self(loc) {
  121. return new ASTv2.ThisReference({
  122. loc: loc
  123. });
  124. };
  125. _proto.at = function at(name, symbol, loc) {
  126. // the `@` should be included so we have a complete source range
  127. false && assert(name[0] === '@', "call builders.at() with a string that starts with '@'");
  128. return new ASTv2.ArgReference({
  129. loc: loc,
  130. name: new SourceSlice({
  131. loc: loc,
  132. chars: name
  133. }),
  134. symbol: symbol
  135. });
  136. };
  137. _proto.freeVar = function freeVar(_ref3) {
  138. var name = _ref3.name,
  139. context = _ref3.context,
  140. symbol = _ref3.symbol,
  141. loc = _ref3.loc;
  142. false && assert(name !== 'this', "You called builders.freeVar() with 'this'. Call builders.this instead");
  143. false && assert(name[0] !== '@', "You called builders.freeVar() with '" + name + "'. Call builders.at('" + name + "') instead");
  144. return new ASTv2.FreeVarReference({
  145. name: name,
  146. resolution: context,
  147. symbol: symbol,
  148. loc: loc
  149. });
  150. };
  151. _proto.localVar = function localVar(name, symbol, isTemplateLocal, loc) {
  152. false && assert(name !== 'this', "You called builders.var() with 'this'. Call builders.this instead");
  153. false && assert(name[0] !== '@', "You called builders.var() with '" + name + "'. Call builders.at('" + name + "') instead");
  154. return new ASTv2.LocalVarReference({
  155. loc: loc,
  156. name: name,
  157. isTemplateLocal: isTemplateLocal,
  158. symbol: symbol
  159. });
  160. };
  161. _proto.sexp = function sexp(parts, loc) {
  162. return new ASTv2.CallExpression({
  163. loc: loc,
  164. callee: parts.callee,
  165. args: parts.args
  166. });
  167. };
  168. _proto.deprecatedCall = function deprecatedCall(arg, callee, loc) {
  169. return new ASTv2.DeprecatedCallExpression({
  170. loc: loc,
  171. arg: arg,
  172. callee: callee
  173. });
  174. };
  175. _proto.interpolate = function interpolate(parts, loc) {
  176. assertPresent(parts);
  177. return new ASTv2.InterpolateExpression({
  178. loc: loc,
  179. parts: parts
  180. });
  181. };
  182. _proto.literal = function literal(value, loc) {
  183. return new ASTv2.LiteralExpression({
  184. loc: loc,
  185. value: value
  186. });
  187. } // STATEMENTS //
  188. ;
  189. _proto.append = function append(_ref4, loc) {
  190. var table = _ref4.table,
  191. trusting = _ref4.trusting,
  192. value = _ref4.value;
  193. return new ASTv2.AppendContent({
  194. table: table,
  195. trusting: trusting,
  196. value: value,
  197. loc: loc
  198. });
  199. };
  200. _proto.modifier = function modifier(_ref5, loc) {
  201. var callee = _ref5.callee,
  202. args = _ref5.args;
  203. return new ASTv2.ElementModifier({
  204. loc: loc,
  205. callee: callee,
  206. args: args
  207. });
  208. };
  209. _proto.namedBlocks = function namedBlocks(blocks, loc) {
  210. return new ASTv2.NamedBlocks({
  211. loc: loc,
  212. blocks: blocks
  213. });
  214. };
  215. _proto.blockStatement = function blockStatement(_a, loc) {
  216. var symbols = _a.symbols,
  217. program = _a.program,
  218. _a$inverse = _a.inverse,
  219. inverse = _a$inverse === void 0 ? null : _a$inverse,
  220. call = __rest(_a, ["symbols", "program", "inverse"]);
  221. var blocksLoc = program.loc;
  222. var blocks = [this.namedBlock(SourceSlice.synthetic('default'), program, program.loc)];
  223. if (inverse) {
  224. blocksLoc = blocksLoc.extend(inverse.loc);
  225. blocks.push(this.namedBlock(SourceSlice.synthetic('else'), inverse, inverse.loc));
  226. }
  227. return new ASTv2.InvokeBlock({
  228. loc: loc,
  229. blocks: this.namedBlocks(blocks, blocksLoc),
  230. callee: call.callee,
  231. args: call.args
  232. });
  233. };
  234. _proto.element = function element(options) {
  235. return new BuildElement(options);
  236. };
  237. return Builder;
  238. }();
  239. export var BuildElement = /*#__PURE__*/function () {
  240. function BuildElement(base) {
  241. this.base = base;
  242. this.builder = new Builder();
  243. }
  244. var _proto2 = BuildElement.prototype;
  245. _proto2.simple = function simple(tag, body, loc) {
  246. return new ASTv2.SimpleElement(assign({
  247. tag: tag,
  248. body: body,
  249. componentArgs: [],
  250. loc: loc
  251. }, this.base));
  252. };
  253. _proto2.named = function named(name, block, loc) {
  254. return new ASTv2.NamedBlock(assign({
  255. name: name,
  256. block: block,
  257. componentArgs: [],
  258. loc: loc
  259. }, this.base));
  260. };
  261. _proto2.selfClosingComponent = function selfClosingComponent(callee, loc) {
  262. return new ASTv2.InvokeComponent(assign({
  263. loc: loc,
  264. callee: callee,
  265. // point the empty named blocks at the `/` self-closing tag
  266. blocks: new ASTv2.NamedBlocks({
  267. blocks: [],
  268. loc: loc.sliceEndChars({
  269. skipEnd: 1,
  270. chars: 1
  271. })
  272. })
  273. }, this.base));
  274. };
  275. _proto2.componentWithDefaultBlock = function componentWithDefaultBlock(callee, children, symbols, loc) {
  276. var block = this.builder.block(symbols, children, loc);
  277. var namedBlock = this.builder.namedBlock(SourceSlice.synthetic('default'), block, loc); // BUILDER.simpleNamedBlock('default', children, symbols, loc);
  278. return new ASTv2.InvokeComponent(assign({
  279. loc: loc,
  280. callee: callee,
  281. blocks: this.builder.namedBlocks([namedBlock], namedBlock.loc)
  282. }, this.base));
  283. };
  284. _proto2.componentWithNamedBlocks = function componentWithNamedBlocks(callee, blocks, loc) {
  285. return new ASTv2.InvokeComponent(assign({
  286. loc: loc,
  287. callee: callee,
  288. blocks: this.builder.namedBlocks(blocks, SpanList.range(blocks))
  289. }, this.base));
  290. };
  291. return BuildElement;
  292. }();
  293. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9idWlsZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0EsU0FBQSxNQUFBLEVBQUEsYUFBQSxFQUFBLE1BQUEsUUFBQSxlQUFBO0FBRUEsU0FBQSxXQUFBLFFBQUEsaUJBQUE7QUFFQSxTQUFBLFFBQUEsUUFBQSxxQkFBQTtBQUVBLE9BQU8sS0FBUCxLQUFBLE1BQUEsT0FBQTtBQU9BLFdBQU0sT0FBTjtBQUFBOztBQUFBOztBQUNFO0FBREYsU0FHRSxRQUhGLEdBR0Usa0JBQVEsT0FBUixFQUFRLElBQVIsRUFBUSxHQUFSLEVBR2lCO0FBRWYsV0FBTyxJQUFJLEtBQUssQ0FBVCxRQUFBLENBQW1CO0FBQ3hCLE1BQUEsS0FBSyxFQURtQixPQUFBO0FBRXhCLE1BQUEsSUFGd0IsRUFFeEIsSUFGd0I7QUFHeEIsTUFBQSxHQUFBLEVBQUE7QUFId0IsS0FBbkIsQ0FBUDtBQVJnQixHQUFwQixDQWVFO0FBZkY7O0FBQUEsU0FpQkUsS0FqQkYsR0FpQkUsZUFBSyxPQUFMLEVBQUssSUFBTCxFQUFLLEdBQUwsRUFBMkU7QUFDekUsV0FBTyxJQUFJLEtBQUssQ0FBVCxLQUFBLENBQWdCO0FBQ3JCLE1BQUEsS0FBSyxFQURnQixPQUFBO0FBRXJCLE1BQUEsSUFGcUIsRUFFckIsSUFGcUI7QUFHckIsTUFBQSxHQUFBLEVBQUE7QUFIcUIsS0FBaEIsQ0FBUDtBQUtELEdBdkJIOztBQUFBLFNBeUJFLFVBekJGLEdBeUJFLG9CQUFVLElBQVYsRUFBVSxLQUFWLEVBQVUsR0FBVixFQUFpRTtBQUMvRCxXQUFPLElBQUksS0FBSyxDQUFULFVBQUEsQ0FBcUI7QUFDMUIsTUFBQSxJQUQwQixFQUMxQixJQUQwQjtBQUUxQixNQUFBLEtBRjBCLEVBRTFCLEtBRjBCO0FBRzFCLE1BQUEsS0FBSyxFQUhxQixFQUFBO0FBSTFCLE1BQUEsYUFBYSxFQUphLEVBQUE7QUFLMUIsTUFBQSxTQUFTLEVBTGlCLEVBQUE7QUFNMUIsTUFBQSxHQUFBLEVBQUE7QUFOMEIsS0FBckIsQ0FBUDtBQVFELEdBbENIOztBQUFBLFNBb0NFLGdCQXBDRixHQW9DRSwwQkFBZ0IsSUFBaEIsRUFBZ0IsS0FBaEIsRUFBZ0IsR0FBaEIsRUFBdUU7QUFDckUsV0FBTyxJQUFBLFlBQUEsQ0FBaUI7QUFDdEIsTUFBQSxXQUFXLEVBRFcsS0FBQTtBQUV0QixNQUFBLEtBQUssRUFGaUIsRUFBQTtBQUd0QixNQUFBLGFBQWEsRUFIUyxFQUFBO0FBSXRCLE1BQUEsU0FBUyxFQUphLEVBQUE7QUFLdEIsTUFBQSxRQUFRLEVBQUU7QUFMWSxLQUFqQixFQUFBLEtBQUEsQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFQLEdBQU8sQ0FBUDtBQU9ELEdBNUNIOztBQUFBLFNBOENFLEtBOUNGLEdBOENFLGVBQUssS0FBTCxFQUFLLEdBQUwsRUFBb0M7QUFDbEMsV0FBTyxJQUFBLFdBQUEsQ0FBZ0I7QUFDckIsTUFBQSxHQURxQixFQUNyQixHQURxQjtBQUVyQixNQUFBLEtBQUEsRUFBQTtBQUZxQixLQUFoQixDQUFQO0FBSUQsR0FuREg7O0FBQUEsU0FxREUsSUFyREYsR0FxREUsY0FBSSxVQUFKLEVBQUksS0FBSixFQUFJLEdBQUosRUFHaUI7QUFFZixXQUFPLElBQUksS0FBSyxDQUFULElBQUEsQ0FBZTtBQUNwQixNQUFBLEdBRG9CLEVBQ3BCLEdBRG9CO0FBRXBCLE1BQUEsVUFGb0IsRUFFcEIsVUFGb0I7QUFHcEIsTUFBQSxLQUFBLEVBQUE7QUFIb0IsS0FBZixDQUFQO0FBS0QsR0EvREg7O0FBQUEsU0FpRUUsVUFqRUYsR0FpRUUsb0JBQVUsS0FBVixFQUFVLEdBQVYsRUFBeUQ7QUFDdkQsV0FBTyxJQUFJLEtBQUssQ0FBVCxtQkFBQSxDQUE4QjtBQUNuQyxNQUFBLEdBRG1DLEVBQ25DLEdBRG1DO0FBRW5DLE1BQUEsS0FBQSxFQUFBO0FBRm1DLEtBQTlCLENBQVA7QUFJRCxHQXRFSDs7QUFBQSxTQXdFRSxhQXhFRixHQXdFRSx1QkFBYSxHQUFiLEVBQWEsS0FBYixFQUEyRDtBQUN6RCxXQUFPLElBQUksS0FBSyxDQUFULGFBQUEsQ0FBd0I7QUFDN0IsTUFBQSxJQUFJLEVBRHlCLEdBQUE7QUFFN0IsTUFBQSxLQUFBLEVBQUE7QUFGNkIsS0FBeEIsQ0FBUDtBQUlELEdBN0VIOztBQUFBLFNBK0VFLEtBL0VGLEdBK0VFLGVBQUssT0FBTCxFQUFLLEdBQUwsRUFBcUQ7QUFDbkQsV0FBTyxJQUFJLEtBQUssQ0FBVCxjQUFBLENBQXlCO0FBQzlCLE1BQUEsR0FEOEIsRUFDOUIsR0FEOEI7QUFFOUIsTUFBQSxPQUFBLEVBQUE7QUFGOEIsS0FBekIsQ0FBUDtBQUlELEdBcEZIOztBQUFBLFNBc0ZFLElBdEZGLEdBc0ZFLG9CQUFJLEdBQUosRUFNaUI7QUFBQSxRQUxmLElBS2UsUUFMZixJQUtlO0FBQUEsUUFMZixLQUtlLFFBTGYsS0FLZTtBQUFBLFFBRmIsUUFFYSxRQUZiLFFBRWE7QUFFZixXQUFPLElBQUksS0FBSyxDQUFULFFBQUEsQ0FBbUI7QUFDeEIsTUFBQSxHQUR3QixFQUN4QixHQUR3QjtBQUV4QixNQUFBLElBRndCLEVBRXhCLElBRndCO0FBR3hCLE1BQUEsS0FId0IsRUFHeEIsS0FId0I7QUFJeEIsTUFBQSxRQUFBLEVBQUE7QUFKd0IsS0FBbkIsQ0FBUDtBQU1ELEdBcEdIOztBQUFBLFNBc0dFLFNBdEdGLEdBc0dFLG1CQUFTLE1BQVQsRUFBUyxHQUFULEVBQXlDO0FBQ3ZDLFdBQU8sSUFBSSxLQUFLLENBQVQsU0FBQSxDQUFvQjtBQUN6QixNQUFBLE1BRHlCLEVBQ3pCLE1BRHlCO0FBRXpCLE1BQUEsR0FBQSxFQUFBO0FBRnlCLEtBQXBCLENBQVA7QUFJRCxHQTNHSDs7QUFBQSxTQTZHRSxHQTdHRixHQTZHRSxvQkFBRyxHQUFILEVBTWlCO0FBQUEsUUFMZixJQUtlLFNBTGYsSUFLZTtBQUFBLFFBTGYsS0FLZSxTQUxmLEtBS2U7QUFBQSxRQUZiLFFBRWEsU0FGYixRQUVhO0FBRWYsV0FBTyxJQUFJLEtBQUssQ0FBVCxZQUFBLENBQXVCO0FBQzVCLE1BQUEsSUFENEIsRUFDNUIsSUFENEI7QUFFNUIsTUFBQSxLQUY0QixFQUU1QixLQUY0QjtBQUc1QixNQUFBLFFBSDRCLEVBRzVCLFFBSDRCO0FBSTVCLE1BQUEsR0FBQSxFQUFBO0FBSjRCLEtBQXZCLENBQVA7QUFySGdCLEdBQXBCLENBNkhFO0FBN0hGOztBQUFBLFNBK0hFLElBL0hGLEdBK0hFLGNBQUksSUFBSixFQUFJLElBQUosRUFBSSxHQUFKLEVBQXdFO0FBQ3RFLFdBQU8sSUFBSSxLQUFLLENBQVQsY0FBQSxDQUF5QjtBQUM5QixNQUFBLEdBRDhCLEVBQzlCLEdBRDhCO0FBRTlCLE1BQUEsR0FBRyxFQUYyQixJQUFBO0FBRzlCLE1BQUEsSUFBQSxFQUFBO0FBSDhCLEtBQXpCLENBQVA7QUFLRCxHQXJJSDs7QUFBQSxTQXVJRSxJQXZJRixHQXVJRSxjQUFJLEdBQUosRUFBb0I7QUFDbEIsV0FBTyxJQUFJLEtBQUssQ0FBVCxhQUFBLENBQXdCO0FBQzdCLE1BQUEsR0FBQSxFQUFBO0FBRDZCLEtBQXhCLENBQVA7QUFHRCxHQTNJSDs7QUFBQSxTQTZJRSxFQTdJRixHQTZJRSxZQUFFLElBQUYsRUFBRSxNQUFGLEVBQUUsR0FBRixFQUFnRDtBQUM5QztBQUQ4QyxhQUU5QyxNQUFNLENBQUMsSUFBSSxDQUFKLENBQUksQ0FBSixLQUZ1QyxHQUV4QywwREFGd0M7QUFJOUMsV0FBTyxJQUFJLEtBQUssQ0FBVCxZQUFBLENBQXVCO0FBQzVCLE1BQUEsR0FENEIsRUFDNUIsR0FENEI7QUFFNUIsTUFBQSxJQUFJLEVBQUUsSUFBQSxXQUFBLENBQWdCO0FBQUUsUUFBQSxHQUFGLEVBQUUsR0FBRjtBQUFPLFFBQUEsS0FBSyxFQUFFO0FBQWQsT0FBaEIsQ0FGc0I7QUFHNUIsTUFBQSxNQUFBLEVBQUE7QUFINEIsS0FBdkIsQ0FBUDtBQUtELEdBdEpIOztBQUFBLFNBd0pFLE9BeEpGLEdBd0pFLHdCQVVDO0FBQUEsUUFWTyxJQVVQLFNBVk8sSUFVUDtBQUFBLFFBVk8sT0FVUCxTQVZPLE9BVVA7QUFBQSxRQVZPLE1BVVAsU0FWTyxNQVVQO0FBQUEsUUFOQyxHQU1ELFNBTkMsR0FNRDtBQUFBLGFBQ0MsTUFBTSxDQUNKLElBQUksS0FGUCxNQUNPLDBFQURQO0FBQUEsYUFLQyxNQUFNLENBQ0osSUFBSSxDQUFKLENBQUksQ0FBSixLQURJLEdBQUEsMkNBRW1DLElBRm5DLDZCQUxQLElBS08sZ0JBTFA7QUFVQyxXQUFPLElBQUksS0FBSyxDQUFULGdCQUFBLENBQTJCO0FBQ2hDLE1BQUEsSUFEZ0MsRUFDaEMsSUFEZ0M7QUFFaEMsTUFBQSxVQUFVLEVBRnNCLE9BQUE7QUFHaEMsTUFBQSxNQUhnQyxFQUdoQyxNQUhnQztBQUloQyxNQUFBLEdBQUEsRUFBQTtBQUpnQyxLQUEzQixDQUFQO0FBTUQsR0FsTEg7O0FBQUEsU0FvTEUsUUFwTEYsR0FvTEUsa0JBQVEsSUFBUixFQUFRLE1BQVIsRUFBUSxlQUFSLEVBQVEsR0FBUixFQUlpQjtBQUFBLGFBRWYsTUFBTSxDQUFDLElBQUksS0FGSSxNQUVULHNFQUZTO0FBQUEsYUFHZixNQUFNLENBQ0osSUFBSSxDQUFKLENBQUksQ0FBSixLQURJLEdBQUEsdUNBRStCLElBRi9CLDZCQUhTLElBR1QsZ0JBSFM7QUFRZixXQUFPLElBQUksS0FBSyxDQUFULGlCQUFBLENBQTRCO0FBQ2pDLE1BQUEsR0FEaUMsRUFDakMsR0FEaUM7QUFFakMsTUFBQSxJQUZpQyxFQUVqQyxJQUZpQztBQUdqQyxNQUFBLGVBSGlDLEVBR2pDLGVBSGlDO0FBSWpDLE1BQUEsTUFBQSxFQUFBO0FBSmlDLEtBQTVCLENBQVA7QUFNRCxHQXRNSDs7QUFBQSxTQXdNRSxJQXhNRixHQXdNRSxjQUFJLEtBQUosRUFBSSxHQUFKLEVBQXNDO0FBQ3BDLFdBQU8sSUFBSSxLQUFLLENBQVQsY0FBQSxDQUF5QjtBQUM5QixNQUFBLEdBRDhCLEVBQzlCLEdBRDhCO0FBRTlCLE1BQUEsTUFBTSxFQUFFLEtBQUssQ0FGaUIsTUFBQTtBQUc5QixNQUFBLElBQUksRUFBRSxLQUFLLENBQUM7QUFIa0IsS0FBekIsQ0FBUDtBQUtELEdBOU1IOztBQUFBLFNBZ05FLGNBaE5GLEdBZ05FLHdCQUFjLEdBQWQsRUFBYyxNQUFkLEVBQWMsR0FBZCxFQUdpQjtBQUVmLFdBQU8sSUFBSSxLQUFLLENBQVQsd0JBQUEsQ0FBbUM7QUFDeEMsTUFBQSxHQUR3QyxFQUN4QyxHQUR3QztBQUV4QyxNQUFBLEdBRndDLEVBRXhDLEdBRndDO0FBR3hDLE1BQUEsTUFBQSxFQUFBO0FBSHdDLEtBQW5DLENBQVA7QUFLRCxHQTFOSDs7QUFBQSxTQTRORSxXQTVORixHQTRORSxxQkFBVyxLQUFYLEVBQVcsR0FBWCxFQUEwRDtBQUN4RCxJQUFBLGFBQWEsQ0FBYixLQUFhLENBQWI7QUFFQSxXQUFPLElBQUksS0FBSyxDQUFULHFCQUFBLENBQWdDO0FBQ3JDLE1BQUEsR0FEcUMsRUFDckMsR0FEcUM7QUFFckMsTUFBQSxLQUFBLEVBQUE7QUFGcUMsS0FBaEMsQ0FBUDtBQUlELEdBbk9IOztBQUFBLFNBOE9FLE9BOU9GLEdBOE9FLGlCQUFPLEtBQVAsRUFBTyxHQUFQLEVBRWlCO0FBRWYsV0FBTyxJQUFJLEtBQUssQ0FBVCxpQkFBQSxDQUE0QjtBQUNqQyxNQUFBLEdBRGlDLEVBQ2pDLEdBRGlDO0FBRWpDLE1BQUEsS0FBQSxFQUFBO0FBRmlDLEtBQTVCLENBQVA7QUFsUGdCLEdBQXBCLENBd1BFO0FBeFBGOztBQUFBLFNBMFBFLE1BMVBGLEdBMFBFLHVCQUFNLEdBQU4sRUFNaUI7QUFBQSxRQUxmLEtBS2UsU0FMZixLQUtlO0FBQUEsUUFMZixRQUtlLFNBTGYsUUFLZTtBQUFBLFFBRmIsS0FFYSxTQUZiLEtBRWE7QUFFZixXQUFPLElBQUksS0FBSyxDQUFULGFBQUEsQ0FBd0I7QUFDN0IsTUFBQSxLQUQ2QixFQUM3QixLQUQ2QjtBQUU3QixNQUFBLFFBRjZCLEVBRTdCLFFBRjZCO0FBRzdCLE1BQUEsS0FINkIsRUFHN0IsS0FINkI7QUFJN0IsTUFBQSxHQUFBLEVBQUE7QUFKNkIsS0FBeEIsQ0FBUDtBQU1ELEdBeFFIOztBQUFBLFNBMFFFLFFBMVFGLEdBMFFFLHlCQUFRLEdBQVIsRUFBcUQ7QUFBQSxRQUE1QyxNQUE0QyxTQUE1QyxNQUE0QztBQUFBLFFBQWxDLElBQWtDLFNBQWxDLElBQWtDO0FBQ25ELFdBQU8sSUFBSSxLQUFLLENBQVQsZUFBQSxDQUEwQjtBQUMvQixNQUFBLEdBRCtCLEVBQy9CLEdBRCtCO0FBRS9CLE1BQUEsTUFGK0IsRUFFL0IsTUFGK0I7QUFHL0IsTUFBQSxJQUFBLEVBQUE7QUFIK0IsS0FBMUIsQ0FBUDtBQUtELEdBaFJIOztBQUFBLFNBa1JFLFdBbFJGLEdBa1JFLHFCQUFXLE1BQVgsRUFBVyxHQUFYLEVBQXVEO0FBQ3JELFdBQU8sSUFBSSxLQUFLLENBQVQsV0FBQSxDQUFzQjtBQUMzQixNQUFBLEdBRDJCLEVBQzNCLEdBRDJCO0FBRTNCLE1BQUEsTUFBQSxFQUFBO0FBRjJCLEtBQXRCLENBQVA7QUFJRCxHQXZSSDs7QUFBQSxTQXlSRSxjQXpSRixHQXlSRSx3QkFBYyxFQUFkLEVBQWMsR0FBZCxFQVdpQjtBQUFBLFFBVmYsT0FVZSxHQVBDLEVBT0QsQ0FWZixPQVVlO0FBQUEsUUFWZixPQVVlLEdBUEMsRUFPRCxDQVZmLE9BVWU7QUFBQSxxQkFQQyxFQU9ELENBUGIsT0FPYTtBQUFBLFFBUGIsT0FPYSwyQkFQSCxJQU9HO0FBQUEsUUFOVixJQU1VLEdBTk4sTUFBQSxDQUFBLEVBQUEsRUFKVCxDQUFBLFNBQUEsRUFBQSxTQUFBLEVBQUEsU0FBQSxDQUlTLENBTU07O0FBRWYsUUFBSSxTQUFTLEdBQUcsT0FBTyxDQUF2QixHQUFBO0FBQ0EsUUFBSSxNQUFNLEdBQW1DLENBQzNDLEtBQUEsVUFBQSxDQUFnQixXQUFXLENBQVgsU0FBQSxDQUFoQixTQUFnQixDQUFoQixFQUFBLE9BQUEsRUFBMkQsT0FBTyxDQURwRSxHQUNFLENBRDJDLENBQTdDOztBQUdBLFFBQUEsT0FBQSxFQUFhO0FBQ1gsTUFBQSxTQUFTLEdBQUcsU0FBUyxDQUFULE1BQUEsQ0FBaUIsT0FBTyxDQUFwQyxHQUFZLENBQVo7QUFDQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksS0FBQSxVQUFBLENBQWdCLFdBQVcsQ0FBWCxTQUFBLENBQWhCLE1BQWdCLENBQWhCLEVBQUEsT0FBQSxFQUF3RCxPQUFPLENBQTNFLEdBQVksQ0FBWjtBQUNEOztBQUVELFdBQU8sSUFBSSxLQUFLLENBQVQsV0FBQSxDQUFzQjtBQUMzQixNQUFBLEdBRDJCLEVBQzNCLEdBRDJCO0FBRTNCLE1BQUEsTUFBTSxFQUFFLEtBQUEsV0FBQSxDQUFBLE1BQUEsRUFGbUIsU0FFbkIsQ0FGbUI7QUFHM0IsTUFBQSxNQUFNLEVBQUUsSUFBSSxDQUhlLE1BQUE7QUFJM0IsTUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFDO0FBSmdCLEtBQXRCLENBQVA7QUFNRCxHQXJUSDs7QUFBQSxTQXVURSxPQXZURixHQXVURSxpQkFBTyxPQUFQLEVBQWlDO0FBQy9CLFdBQU8sSUFBQSxZQUFBLENBQVAsT0FBTyxDQUFQO0FBQ0QsR0F6VEg7O0FBQUE7QUFBQTtBQW9VQSxXQUFNLFlBQU47QUFFRSx3QkFBQSxJQUFBLEVBQTJDO0FBQXRCLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFDbkIsU0FBQSxPQUFBLEdBQWUsSUFBZixPQUFlLEVBQWY7QUFDRDs7QUFKSDs7QUFBQSxVQU1FLE1BTkYsR0FNRSxnQkFBTSxHQUFOLEVBQU0sSUFBTixFQUFNLEdBQU4sRUFBbUU7QUFDakUsV0FBTyxJQUFJLEtBQUssQ0FBVCxhQUFBLENBQ0wsTUFBTSxDQUNKO0FBQ0UsTUFBQSxHQURGLEVBQ0UsR0FERjtBQUVFLE1BQUEsSUFGRixFQUVFLElBRkY7QUFHRSxNQUFBLGFBQWEsRUFIZixFQUFBO0FBSUUsTUFBQSxHQUFBLEVBQUE7QUFKRixLQURJLEVBT0osS0FSSixJQUNRLENBREQsQ0FBUDtBQVdELEdBbEJIOztBQUFBLFVBb0JFLEtBcEJGLEdBb0JFLGVBQUssSUFBTCxFQUFLLEtBQUwsRUFBSyxHQUFMLEVBQTREO0FBQzFELFdBQU8sSUFBSSxLQUFLLENBQVQsVUFBQSxDQUNMLE1BQU0sQ0FDSjtBQUNFLE1BQUEsSUFERixFQUNFLElBREY7QUFFRSxNQUFBLEtBRkYsRUFFRSxLQUZGO0FBR0UsTUFBQSxhQUFhLEVBSGYsRUFBQTtBQUlFLE1BQUEsR0FBQSxFQUFBO0FBSkYsS0FESSxFQU9KLEtBUkosSUFDUSxDQURELENBQVA7QUFXRCxHQWhDSDs7QUFBQSxVQWtDRSxvQkFsQ0YsR0FrQ0UsOEJBQW9CLE1BQXBCLEVBQW9CLEdBQXBCLEVBQWtFO0FBQ2hFLFdBQU8sSUFBSSxLQUFLLENBQVQsZUFBQSxDQUNMLE1BQU0sQ0FDSjtBQUNFLE1BQUEsR0FERixFQUNFLEdBREY7QUFFRSxNQUFBLE1BRkYsRUFFRSxNQUZGO0FBR0U7QUFDQSxNQUFBLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBVCxXQUFBLENBQXNCO0FBQzVCLFFBQUEsTUFBTSxFQURzQixFQUFBO0FBRTVCLFFBQUEsR0FBRyxFQUFFLEdBQUcsQ0FBSCxhQUFBLENBQWtCO0FBQUUsVUFBQSxPQUFPLEVBQVQsQ0FBQTtBQUFjLFVBQUEsS0FBSyxFQUFFO0FBQXJCLFNBQWxCO0FBRnVCLE9BQXRCO0FBSlYsS0FESSxFQVVKLEtBWEosSUFDUSxDQURELENBQVA7QUFjRCxHQWpESDs7QUFBQSxVQW1ERSx5QkFuREYsR0FtREUsbUNBQXlCLE1BQXpCLEVBQXlCLFFBQXpCLEVBQXlCLE9BQXpCLEVBQXlCLEdBQXpCLEVBSWlCO0FBRWYsUUFBSSxLQUFLLEdBQUcsS0FBQSxPQUFBLENBQUEsS0FBQSxDQUFBLE9BQUEsRUFBQSxRQUFBLEVBQVosR0FBWSxDQUFaO0FBQ0EsUUFBSSxVQUFVLEdBQUcsS0FBQSxPQUFBLENBQUEsVUFBQSxDQUF3QixXQUFXLENBQVgsU0FBQSxDQUF4QixTQUF3QixDQUF4QixFQUFBLEtBQUEsRUFIRixHQUdFLENBQWpCLENBSGUsQ0FHeUU7O0FBRXhGLFdBQU8sSUFBSSxLQUFLLENBQVQsZUFBQSxDQUNMLE1BQU0sQ0FDSjtBQUNFLE1BQUEsR0FERixFQUNFLEdBREY7QUFFRSxNQUFBLE1BRkYsRUFFRSxNQUZGO0FBR0UsTUFBQSxNQUFNLEVBQUUsS0FBQSxPQUFBLENBQUEsV0FBQSxDQUF5QixDQUF6QixVQUF5QixDQUF6QixFQUF1QyxVQUFVLENBQWpELEdBQUE7QUFIVixLQURJLEVBTUosS0FQSixJQUNRLENBREQsQ0FBUDtBQVVELEdBdEVIOztBQUFBLFVBd0VFLHdCQXhFRixHQXdFRSxrQ0FBd0IsTUFBeEIsRUFBd0IsTUFBeEIsRUFBd0IsR0FBeEIsRUFHaUI7QUFFZixXQUFPLElBQUksS0FBSyxDQUFULGVBQUEsQ0FDTCxNQUFNLENBQ0o7QUFDRSxNQUFBLEdBREYsRUFDRSxHQURGO0FBRUUsTUFBQSxNQUZGLEVBRUUsTUFGRjtBQUdFLE1BQUEsTUFBTSxFQUFFLEtBQUEsT0FBQSxDQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQWlDLFFBQVEsQ0FBUixLQUFBLENBQWpDLE1BQWlDLENBQWpDO0FBSFYsS0FESSxFQU1KLEtBUEosSUFDUSxDQURELENBQVA7QUFVRCxHQXZGSDs7QUFBQTtBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0UHJlc2VudCwgYXNzaWduIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IFNvdXJjZVNsaWNlIH0gZnJvbSAnLi4vc291cmNlL3NsaWNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgeyBTcGFuTGlzdCB9IGZyb20gJy4uL3NvdXJjZS9zcGFuLWxpc3QnO1xuaW1wb3J0IHsgQmxvY2tTeW1ib2xUYWJsZSwgUHJvZ3JhbVN5bWJvbFRhYmxlLCBTeW1ib2xUYWJsZSB9IGZyb20gJy4uL3N5bWJvbC10YWJsZSc7XG5pbXBvcnQgKiBhcyBBU1R2MiBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbFBhcnRzIHtcbiAgY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgYXJnczogQVNUdjIuQXJncztcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkZXIge1xuICAvLyBURU1QTEFURSAvL1xuXG4gIHRlbXBsYXRlKFxuICAgIHN5bWJvbHM6IFByb2dyYW1TeW1ib2xUYWJsZSxcbiAgICBib2R5OiBBU1R2Mi5Db250ZW50Tm9kZVtdLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5UZW1wbGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5UZW1wbGF0ZSh7XG4gICAgICB0YWJsZTogc3ltYm9scyxcbiAgICAgIGJvZHksXG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICAvLyBJTlRFUk5BTCAodGhlc2Ugbm9kZXMgY2Fubm90IGJlIHJlYWNoZWQgd2hlbiBkb2luZyBnZW5lcmFsLXB1cnBvc2UgdmlzaXRpbmcpIC8vXG5cbiAgYmxvY2soc3ltYm9sczogQmxvY2tTeW1ib2xUYWJsZSwgYm9keTogQVNUdjIuQ29udGVudE5vZGVbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuQmxvY2sge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQmxvY2soe1xuICAgICAgc2NvcGU6IHN5bWJvbHMsXG4gICAgICBib2R5LFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgbmFtZWRCbG9jayhuYW1lOiBTb3VyY2VTbGljZSwgYmxvY2s6IEFTVHYyLkJsb2NrLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5OYW1lZEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQmxvY2soe1xuICAgICAgbmFtZSxcbiAgICAgIGJsb2NrLFxuICAgICAgYXR0cnM6IFtdLFxuICAgICAgY29tcG9uZW50QXJnczogW10sXG4gICAgICBtb2RpZmllcnM6IFtdLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgc2ltcGxlTmFtZWRCbG9jayhuYW1lOiBTb3VyY2VTbGljZSwgYmxvY2s6IEFTVHYyLkJsb2NrLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5OYW1lZEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkRWxlbWVudCh7XG4gICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICBhdHRyczogW10sXG4gICAgICBjb21wb25lbnRBcmdzOiBbXSxcbiAgICAgIG1vZGlmaWVyczogW10sXG4gICAgICBjb21tZW50czogW10sXG4gICAgfSkubmFtZWQobmFtZSwgYmxvY2ssIGxvYyk7XG4gIH1cblxuICBzbGljZShjaGFyczogc3RyaW5nLCBsb2M6IFNvdXJjZVNwYW4pOiBTb3VyY2VTbGljZSB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VTbGljZSh7XG4gICAgICBsb2MsXG4gICAgICBjaGFycyxcbiAgICB9KTtcbiAgfVxuXG4gIGFyZ3MoXG4gICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgICBuYW1lZDogQVNUdjIuTmFtZWRBcmd1bWVudHMsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkFyZ3Mge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQXJncyh7XG4gICAgICBsb2MsXG4gICAgICBwb3NpdGlvbmFsLFxuICAgICAgbmFtZWQsXG4gICAgfSk7XG4gIH1cblxuICBwb3NpdGlvbmFsKGV4cHJzOiBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5Qb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLlBvc2l0aW9uYWxBcmd1bWVudHMoe1xuICAgICAgbG9jLFxuICAgICAgZXhwcnMsXG4gICAgfSk7XG4gIH1cblxuICBuYW1lZEFyZ3VtZW50KGtleTogU291cmNlU2xpY2UsIHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSk6IEFTVHYyLk5hbWVkQXJndW1lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRBcmd1bWVudCh7XG4gICAgICBuYW1lOiBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIG5hbWVkKGVudHJpZXM6IEFTVHYyLk5hbWVkQXJndW1lbnRbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRBcmd1bWVudHMge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRBcmd1bWVudHMoe1xuICAgICAgbG9jLFxuICAgICAgZW50cmllcyxcbiAgICB9KTtcbiAgfVxuXG4gIGF0dHIoXG4gICAge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgfTogeyBuYW1lOiBTb3VyY2VTbGljZTsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyB0cnVzdGluZzogYm9vbGVhbiB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5IdG1sQXR0ciB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5IdG1sQXR0cih7XG4gICAgICBsb2MsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICB0cnVzdGluZyxcbiAgICB9KTtcbiAgfVxuXG4gIHNwbGF0QXR0cihzeW1ib2w6IG51bWJlciwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuU3BsYXRBdHRyIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLlNwbGF0QXR0cih7XG4gICAgICBzeW1ib2wsXG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICBhcmcoXG4gICAge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgfTogeyBuYW1lOiBTb3VyY2VTbGljZTsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyB0cnVzdGluZzogYm9vbGVhbiB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5Db21wb25lbnRBcmcge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ29tcG9uZW50QXJnKHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRydXN0aW5nLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRVhQUkVTU0lPTlMgLy9cblxuICBwYXRoKGhlYWQ6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlLCB0YWlsOiBTb3VyY2VTbGljZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5QYXRoRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5QYXRoRXhwcmVzc2lvbih7XG4gICAgICBsb2MsXG4gICAgICByZWY6IGhlYWQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICB9XG5cbiAgc2VsZihsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5UaGlzUmVmZXJlbmNlKHtcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIGF0KG5hbWU6IHN0cmluZywgc3ltYm9sOiBudW1iZXIsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICAvLyB0aGUgYEBgIHNob3VsZCBiZSBpbmNsdWRlZCBzbyB3ZSBoYXZlIGEgY29tcGxldGUgc291cmNlIHJhbmdlXG4gICAgYXNzZXJ0KG5hbWVbMF0gPT09ICdAJywgYGNhbGwgYnVpbGRlcnMuYXQoKSB3aXRoIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ0AnYCk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkFyZ1JlZmVyZW5jZSh7XG4gICAgICBsb2MsXG4gICAgICBuYW1lOiBuZXcgU291cmNlU2xpY2UoeyBsb2MsIGNoYXJzOiBuYW1lIH0pLFxuICAgICAgc3ltYm9sLFxuICAgIH0pO1xuICB9XG5cbiAgZnJlZVZhcih7XG4gICAgbmFtZSxcbiAgICBjb250ZXh0LFxuICAgIHN5bWJvbCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29udGV4dDogQVNUdjIuRnJlZVZhclJlc29sdXRpb247XG4gICAgc3ltYm9sOiBudW1iZXI7XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjIuRnJlZVZhclJlZmVyZW5jZSB7XG4gICAgYXNzZXJ0KFxuICAgICAgbmFtZSAhPT0gJ3RoaXMnLFxuICAgICAgYFlvdSBjYWxsZWQgYnVpbGRlcnMuZnJlZVZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGBcbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLmZyZWVWYXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuRnJlZVZhclJlZmVyZW5jZSh7XG4gICAgICBuYW1lLFxuICAgICAgcmVzb2x1dGlvbjogY29udGV4dCxcbiAgICAgIHN5bWJvbCxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIGxvY2FsVmFyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzeW1ib2w6IG51bWJlcixcbiAgICBpc1RlbXBsYXRlTG9jYWw6IGJvb2xlYW4sXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICBhc3NlcnQobmFtZSAhPT0gJ3RoaXMnLCBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgKTtcbiAgICBhc3NlcnQoXG4gICAgICBuYW1lWzBdICE9PSAnQCcsXG4gICAgICBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuTG9jYWxWYXJSZWZlcmVuY2Uoe1xuICAgICAgbG9jLFxuICAgICAgbmFtZSxcbiAgICAgIGlzVGVtcGxhdGVMb2NhbCxcbiAgICAgIHN5bWJvbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNleHAocGFydHM6IENhbGxQYXJ0cywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuQ2FsbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgY2FsbGVlOiBwYXJ0cy5jYWxsZWUsXG4gICAgICBhcmdzOiBwYXJ0cy5hcmdzLFxuICAgIH0pO1xuICB9XG5cbiAgZGVwcmVjYXRlZENhbGwoXG4gICAgYXJnOiBTb3VyY2VTbGljZSxcbiAgICBjYWxsZWU6IEFTVHYyLkZyZWVWYXJSZWZlcmVuY2UsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkRlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgYXJnLFxuICAgICAgY2FsbGVlLFxuICAgIH0pO1xuICB9XG5cbiAgaW50ZXJwb2xhdGUocGFydHM6IEFTVHYyLkV4cHJlc3Npb25Ob2RlW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbiB7XG4gICAgYXNzZXJ0UHJlc2VudChwYXJ0cyk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbih7XG4gICAgICBsb2MsXG4gICAgICBwYXJ0cyxcbiAgICB9KTtcbiAgfVxuXG4gIGxpdGVyYWwodmFsdWU6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBzdHJpbmcgfTtcbiAgbGl0ZXJhbCh2YWx1ZTogbnVtYmVyLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbiAmIHsgdmFsdWU6IG51bWJlciB9O1xuICBsaXRlcmFsKHZhbHVlOiBib29sZWFuLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbiAmIHsgdmFsdWU6IGJvb2xlYW4gfTtcbiAgbGl0ZXJhbCh2YWx1ZTogbnVsbCwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBudWxsIH07XG4gIGxpdGVyYWwodmFsdWU6IHVuZGVmaW5lZCwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgbGl0ZXJhbChcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uO1xuICBsaXRlcmFsKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBTVEFURU1FTlRTIC8vXG5cbiAgYXBwZW5kKFxuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgICB2YWx1ZSxcbiAgICB9OiB7IHRhYmxlOiBTeW1ib2xUYWJsZTsgdHJ1c3Rpbmc6IGJvb2xlYW47IHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5BcHBlbmRDb250ZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkFwcGVuZENvbnRlbnQoe1xuICAgICAgdGFibGUsXG4gICAgICB0cnVzdGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgbW9kaWZpZXIoeyBjYWxsZWUsIGFyZ3MgfTogQ2FsbFBhcnRzLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5FbGVtZW50TW9kaWZpZXIge1xuICAgIHJldHVybiBuZXcgQVNUdjIuRWxlbWVudE1vZGlmaWVyKHtcbiAgICAgIGxvYyxcbiAgICAgIGNhbGxlZSxcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG4gIH1cblxuICBuYW1lZEJsb2NrcyhibG9ja3M6IEFTVHYyLk5hbWVkQmxvY2tbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRCbG9ja3Mge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRCbG9ja3Moe1xuICAgICAgbG9jLFxuICAgICAgYmxvY2tzLFxuICAgIH0pO1xuICB9XG5cbiAgYmxvY2tTdGF0ZW1lbnQoXG4gICAge1xuICAgICAgc3ltYm9scyxcbiAgICAgIHByb2dyYW0sXG4gICAgICBpbnZlcnNlID0gbnVsbCxcbiAgICAgIC4uLmNhbGxcbiAgICB9OiB7XG4gICAgICBzeW1ib2xzOiBTeW1ib2xUYWJsZTtcbiAgICAgIHByb2dyYW06IEFTVHYyLkJsb2NrO1xuICAgICAgaW52ZXJzZT86IEFTVHYyLkJsb2NrIHwgbnVsbDtcbiAgICB9ICYgQ2FsbFBhcnRzLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5JbnZva2VCbG9jayB7XG4gICAgbGV0IGJsb2Nrc0xvYyA9IHByb2dyYW0ubG9jO1xuICAgIGxldCBibG9ja3M6IFByZXNlbnRBcnJheTxBU1R2Mi5OYW1lZEJsb2NrPiA9IFtcbiAgICAgIHRoaXMubmFtZWRCbG9jayhTb3VyY2VTbGljZS5zeW50aGV0aWMoJ2RlZmF1bHQnKSwgcHJvZ3JhbSwgcHJvZ3JhbS5sb2MpLFxuICAgIF07XG4gICAgaWYgKGludmVyc2UpIHtcbiAgICAgIGJsb2Nrc0xvYyA9IGJsb2Nrc0xvYy5leHRlbmQoaW52ZXJzZS5sb2MpO1xuICAgICAgYmxvY2tzLnB1c2godGhpcy5uYW1lZEJsb2NrKFNvdXJjZVNsaWNlLnN5bnRoZXRpYygnZWxzZScpLCBpbnZlcnNlLCBpbnZlcnNlLmxvYykpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQmxvY2soe1xuICAgICAgbG9jLFxuICAgICAgYmxvY2tzOiB0aGlzLm5hbWVkQmxvY2tzKGJsb2NrcywgYmxvY2tzTG9jKSxcbiAgICAgIGNhbGxlZTogY2FsbC5jYWxsZWUsXG4gICAgICBhcmdzOiBjYWxsLmFyZ3MsXG4gICAgfSk7XG4gIH1cblxuICBlbGVtZW50KG9wdGlvbnM6IEJ1aWxkQmFzZUVsZW1lbnQpOiBCdWlsZEVsZW1lbnQge1xuICAgIHJldHVybiBuZXcgQnVpbGRFbGVtZW50KG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRCYXNlRWxlbWVudCB7XG4gIHNlbGZDbG9zaW5nOiBib29sZWFuO1xuICBhdHRyczogQVNUdjIuSHRtbE9yU3BsYXRBdHRyW107XG4gIGNvbXBvbmVudEFyZ3M6IEFTVHYyLkNvbXBvbmVudEFyZ1tdO1xuICBtb2RpZmllcnM6IEFTVHYyLkVsZW1lbnRNb2RpZmllcltdO1xuICBjb21tZW50czogQVNUdjIuR2xpbW1lckNvbW1lbnRbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkRWxlbWVudCB7XG4gIHJlYWRvbmx5IGJ1aWxkZXI6IEJ1aWxkZXI7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGJhc2U6IEJ1aWxkQmFzZUVsZW1lbnQpIHtcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICB9XG5cbiAgc2ltcGxlKHRhZzogU291cmNlU2xpY2UsIGJvZHk6IEFTVHYyLkNvbnRlbnROb2RlW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLlNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuU2ltcGxlRWxlbWVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNvbXBvbmVudEFyZ3M6IFtdLFxuICAgICAgICAgIGxvYyxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5hbWVkKG5hbWU6IFNvdXJjZVNsaWNlLCBibG9jazogQVNUdjIuQmxvY2ssIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLk5hbWVkQmxvY2sge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRCbG9jayhcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgY29tcG9uZW50QXJnczogW10sXG4gICAgICAgICAgbG9jLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgc2VsZkNsb3NpbmdDb21wb25lbnQoY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuSW52b2tlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkludm9rZUNvbXBvbmVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGxvYyxcbiAgICAgICAgICBjYWxsZWUsXG4gICAgICAgICAgLy8gcG9pbnQgdGhlIGVtcHR5IG5hbWVkIGJsb2NrcyBhdCB0aGUgYC9gIHNlbGYtY2xvc2luZyB0YWdcbiAgICAgICAgICBibG9ja3M6IG5ldyBBU1R2Mi5OYW1lZEJsb2Nrcyh7XG4gICAgICAgICAgICBibG9ja3M6IFtdLFxuICAgICAgICAgICAgbG9jOiBsb2Muc2xpY2VFbmRDaGFycyh7IHNraXBFbmQ6IDEsIGNoYXJzOiAxIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50V2l0aERlZmF1bHRCbG9jayhcbiAgICBjYWxsZWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlLFxuICAgIGNoaWxkcmVuOiBBU1R2Mi5Db250ZW50Tm9kZVtdLFxuICAgIHN5bWJvbHM6IEJsb2NrU3ltYm9sVGFibGUsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkludm9rZUNvbXBvbmVudCB7XG4gICAgbGV0IGJsb2NrID0gdGhpcy5idWlsZGVyLmJsb2NrKHN5bWJvbHMsIGNoaWxkcmVuLCBsb2MpO1xuICAgIGxldCBuYW1lZEJsb2NrID0gdGhpcy5idWlsZGVyLm5hbWVkQmxvY2soU291cmNlU2xpY2Uuc3ludGhldGljKCdkZWZhdWx0JyksIGJsb2NrLCBsb2MpOyAvLyBCVUlMREVSLnNpbXBsZU5hbWVkQmxvY2soJ2RlZmF1bHQnLCBjaGlsZHJlbiwgc3ltYm9scywgbG9jKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQ29tcG9uZW50KFxuICAgICAgYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIGNhbGxlZSxcbiAgICAgICAgICBibG9ja3M6IHRoaXMuYnVpbGRlci5uYW1lZEJsb2NrcyhbbmFtZWRCbG9ja10sIG5hbWVkQmxvY2subG9jKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpdGhOYW1lZEJsb2NrcyhcbiAgICBjYWxsZWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlLFxuICAgIGJsb2NrczogUHJlc2VudEFycmF5PEFTVHYyLk5hbWVkQmxvY2s+LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5JbnZva2VDb21wb25lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQ29tcG9uZW50KFxuICAgICAgYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIGNhbGxlZSxcbiAgICAgICAgICBibG9ja3M6IHRoaXMuYnVpbGRlci5uYW1lZEJsb2NrcyhibG9ja3MsIFNwYW5MaXN0LnJhbmdlKGJsb2NrcykpLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9