occam-nominal 1.0.327 → 1.0.329

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "default", {
11
11
  const _occamlanguages = require("occam-languages");
12
12
  const _assertion = /*#__PURE__*/ _interop_require_default(require("../assertion"));
13
13
  const _elements = require("../../elements");
14
+ const _continuation = require("../../utilities/continuation");
14
15
  const _context = require("../../utilities/context");
15
16
  const _instantiate = require("../../process/instantiate");
16
17
  const _json = require("../../utilities/json");
@@ -39,41 +40,38 @@ const _default = (0, _elements.define)(class TypeAssertion extends _assertion.de
39
40
  const node = this.getNode(), typeAssertionNode = node; ///
40
41
  return typeAssertionNode;
41
42
  }
42
- async validate(context) {
43
- let typeAssertion = null;
43
+ validate(context, continuation) {
44
44
  const typeAssertionString = this.getString(); ///
45
45
  context.trace(`Validating the '${typeAssertionString}' type assertion...`);
46
- let validates = false;
47
46
  const validAssertion = this.findValidAssertion(context);
48
47
  if (validAssertion !== null) {
49
- validates = true;
50
- typeAssertion = validAssertion; ///
48
+ const typeAssertion = validAssertion; ///
51
49
  context.debug(`...the '${typeAssertionString}' type assertion is already valid.`);
52
- } else {
53
- const typeValidates = this.validateType(context);
54
- if (typeValidates) {
55
- const stated = context.isStated();
56
- let validatesWhenStated = false, validatesWhenDerived = false;
57
- if (stated) {
58
- validatesWhenStated = this.validateWhenStated(context);
59
- } else {
60
- validatesWhenDerived = await this.validateWhenDerived(context);
50
+ return continuation(typeAssertion);
51
+ }
52
+ this.validateType(context, (typeValidates)=>{
53
+ if (!typeValidates) {
54
+ const typeAssertion = null;
55
+ return continuation(typeAssertion);
56
+ }
57
+ const validateWhenStated = this.validateWhenStated.bind(this), validateWhenDerived = this.validateWhenDerived.bind(this);
58
+ return (0, _continuation.exists)([
59
+ validateWhenStated,
60
+ validateWhenDerived
61
+ ], context, (validates)=>{
62
+ let typeAssertion = null;
63
+ if (validates) {
64
+ const assertion = this; ///
65
+ typeAssertion = assertion; ///
66
+ this.assign(context);
67
+ context.addAssertion(assertion);
61
68
  }
62
- if (validatesWhenStated || validatesWhenDerived) {
63
- validates = true;
69
+ if (validates) {
70
+ context.debug(`...verified the '${typeAssertionString}' type assertion.`);
64
71
  }
65
- }
66
- if (validates) {
67
- const assertion = this; ///
68
- typeAssertion = assertion; ///
69
- this.assign(context);
70
- context.addAssertion(assertion);
71
- }
72
- }
73
- if (validates) {
74
- context.debug(`...verified the '${typeAssertionString}' type assertion.`);
75
- }
76
- return typeAssertion;
72
+ return continuation(typeAssertion);
73
+ });
74
+ });
77
75
  }
78
76
  discharge(context) {
79
77
  let discharges = false;
@@ -94,8 +92,8 @@ const _default = (0, _elements.define)(class TypeAssertion extends _assertion.de
94
92
  }
95
93
  return discharges;
96
94
  }
97
- validateType(context) {
98
- let typeValidates;
95
+ validateType(context, continuation) {
96
+ let typeValidates = false;
99
97
  const typeAssertionString = this.getString(); ///
100
98
  context.trace(`Validating the '${typeAssertionString}' type assertion's type...`);
101
99
  const nominalTypeName = this.type.getNominalTypeName(), type = context.findTypeByNominalTypeName(nominalTypeName);
@@ -109,51 +107,64 @@ const _default = (0, _elements.define)(class TypeAssertion extends _assertion.de
109
107
  if (typeValidates) {
110
108
  context.debug(`...validated the '${typeAssertionString}' type assertion's type.`);
111
109
  }
112
- return typeValidates;
110
+ return continuation(typeValidates);
113
111
  }
114
- async validateWhenStated(context) {
115
- let validatesWhenStated = false;
112
+ validateWhenStated(context, continuation) {
113
+ const stated = context.isStated();
114
+ if (!stated) {
115
+ const validatesWhenStated = false;
116
+ return continuation(validatesWhenStated);
117
+ }
116
118
  const typeAssertionString = this.getString(); ///
117
119
  context.trace(`Validating the '${typeAssertionString}' stated type assertion...`);
118
- const term = await this.term.validate(context, async (term, context)=>{
119
- let validatesForwards = false;
120
+ this.term.validate(context, (term, context)=>{
121
+ if (term === null) {
122
+ const validatesWhenStated = false;
123
+ return continuation(validatesWhenStated);
124
+ }
120
125
  const termType = term.getType(), termTypeEqualToType = termType.isEqualTo(this.type), termTypeSuperTypeOfType = termType.isSuperTypeOf(this.type);
126
+ let validatesWhenStated = false;
121
127
  if (false) {
122
128
  ///
123
129
  } else if (termTypeEqualToType) {
124
- validatesForwards = true;
130
+ validatesWhenStated = true;
125
131
  } else if (termTypeSuperTypeOfType) {
126
132
  const termEstablished = term.isEstablished();
127
133
  if (termEstablished) {
128
- validatesForwards = true;
134
+ validatesWhenStated = true;
129
135
  }
130
136
  }
131
- return validatesForwards;
137
+ if (validatesWhenStated) {
138
+ this.term = term;
139
+ }
140
+ if (validatesWhenStated) {
141
+ context.debug(`...validated the '${typeAssertionString}' stated type assertion.`);
142
+ }
143
+ return continuation(validatesWhenStated);
132
144
  });
133
- if (term !== null) {
134
- this.term = term;
135
- validatesWhenStated = true;
136
- }
137
- if (validatesWhenStated) {
138
- context.debug(`...validated the '${typeAssertionString}' stated type assertion.`);
139
- }
140
- return validatesWhenStated;
141
145
  }
142
- validateWhenDerived(context) {
143
- let validatesWhenDerived = false;
146
+ validateWhenDerived(context, continuation) {
147
+ const stated = context.isStated();
148
+ if (stated) {
149
+ const validatesWhenDerived = false;
150
+ return continuation(validatesWhenDerived);
151
+ }
144
152
  const typeAssertionString = this.getString(); ///
145
153
  context.trace(`Validating the '${typeAssertionString}' derived type assertion...`);
146
- const term = validateWhenDerived(this.term, this.type, context);
147
- if (term !== null) {
148
- this.term = term;
149
- validatesWhenDerived = true;
150
- }
151
- if (validatesWhenDerived) {
152
- context.debug(`...validated the '${typeAssertionString}' derived type assertion.`);
153
- }
154
- return validatesWhenDerived;
154
+ validateWhenDerived(this.term, this.type, context, (term)=>{
155
+ let validatesWhenDerived = false;
156
+ if (term !== null) {
157
+ this.term = term;
158
+ validatesWhenDerived = true;
159
+ }
160
+ if (validatesWhenDerived) {
161
+ context.debug(`...validated the '${typeAssertionString}' derived type assertion.`);
162
+ }
163
+ return continuation(validatesWhenDerived);
164
+ });
155
165
  }
156
166
  unifyIndependently(generalContext, specificContext) {
167
+ debugger;
157
168
  let unifiesIndependently = false;
158
169
  const context = specificContext, typeAssertionString = this.getString(); ///
159
170
  context.trace(`Unifying the '${typeAssertionString}' type assertion independently...`);
@@ -208,21 +219,26 @@ const _default = (0, _elements.define)(class TypeAssertion extends _assertion.de
208
219
  return typeAssertion;
209
220
  }
210
221
  });
211
- async function validateWhenDerived(term, type, context) {
212
- if (term !== null) {
213
- term = await term.validate(context, async (term, context)=>{
214
- let validatesForwards = false;
215
- const termType = term.getType(), termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
216
- if (termTypeEqualToOrSubTypeOfType) {
217
- const termEstablished = term.isEstablished();
218
- if (termEstablished) {
219
- validatesForwards = true;
220
- }
221
- }
222
- return validatesForwards;
223
- });
222
+ function validateWhenDerived(term, type, context, continuation) {
223
+ if (term === null) {
224
+ return continuation(term);
224
225
  }
225
- return term;
226
+ term.validate(context, (term, context)=>{
227
+ if (term === null) {
228
+ return continuation(term);
229
+ }
230
+ const termType = term.getType(), termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
231
+ if (!termTypeEqualToOrSubTypeOfType) {
232
+ term = null;
233
+ return continuation(term);
234
+ }
235
+ const termEstablished = term.isEstablished();
236
+ if (!termEstablished) {
237
+ term = null;
238
+ return continuation(term);
239
+ }
240
+ return continuation(term);
241
+ });
226
242
  }
227
243
 
228
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L2Fzc2VydGlvbi90eXBlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBicmVha1BvaW50VXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gXCIuLi9hc3NlcnRpb25cIjtcblxuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVUeXBlQXNzZXJ0aW9uIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IHR5cGVGcm9tSlNPTiwgdHlwZVRvVHlwZUpTT04gfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2pzb25cIjtcbmltcG9ydCB7IHRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N1YnN0aXR1dGlvbnNcIjtcbmltcG9ydCB7IHZhcmlhYmxlQXNzaWdubWVudEZyb21UeXBlQXNzZXJ0aW9uIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvYXNzaWduXCI7XG5pbXBvcnQgeyB0ZXJtRnJvbVR5cGVBc3NlcnRpb25Ob2RlLCB0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudE5vZGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcblxuY29uc3QgeyBicmVha1BvaW50RnJvbUpTT04sIGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIH0gPSBicmVha1BvaW50VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmUoY2xhc3MgVHlwZUFzc2VydGlvbiBleHRlbmRzIEFzc2VydGlvbiB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgdGVybSwgdHlwZSkge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXRUeXBlQXNzZXJ0aW9uTkJvZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHR5cGVBc3NlcnRpb25Ob2RlID0gbm9kZTsgLy8vXG5cbiAgICByZXR1cm4gdHlwZUFzc2VydGlvbk5vZGU7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZShjb250ZXh0KSB7XG4gICAgbGV0IHR5cGVBc3NlcnRpb24gPSBudWxsO1xuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgbGV0IHZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgdmFsaWRBc3NlcnRpb24gPSB0aGlzLmZpbmRWYWxpZEFzc2VydGlvbihjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZEFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgdmFsaWRhdGVzID0gdHJ1ZTtcblxuICAgICAgdHlwZUFzc2VydGlvbiA9IHZhbGlkQXNzZXJ0aW9uOyAvLy9cblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbiBpcyBhbHJlYWR5IHZhbGlkLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVR5cGUoY29udGV4dCk7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgICAgICBsZXQgdmFsaWRhdGVzV2hlblN0YXRlZCA9IGZhbHNlLFxuICAgICAgICAgICAgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGVkKSB7XG4gICAgICAgICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRoaXMudmFsaWRhdGVXaGVuU3RhdGVkKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gYXdhaXQgdGhpcy52YWxpZGF0ZVdoZW5EZXJpdmVkKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQgfHwgdmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgICAgICB2YWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uID0gdGhpczsgLy8vXG5cbiAgICAgICAgdHlwZUFzc2VydGlvbiA9IGFzc2VydGlvbjsgIC8vL1xuXG4gICAgICAgIHRoaXMuYXNzaWduKGNvbnRleHQpO1xuXG4gICAgICAgIGNvbnRleHQuYWRkQXNzZXJ0aW9uKGFzc2VydGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZUFzc2VydGlvbjtcbiAgfVxuXG4gIGRpc2NoYXJnZShjb250ZXh0KSB7XG4gICAgbGV0IGRpc2NoYXJnZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHR5cGVBc3NlcnRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBEaXNjaGFyZ2luZyB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHR5cGUgYXNzZXJ0aW9uLi4uYCk7XG5cbiAgICBjb25zdCB0ZXJtID0gdGVybUZyb21UZXJtQW5kU3Vic3RpdHV0aW9ucyh0aGlzLnRlcm0sIGNvbnRleHQpO1xuXG4gICAgaWYgKHRlcm0gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm1UeXBlID0gdGVybS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0eXBlRXF1YWxUb1Rlcm1UeXBlID0gdGhpcy50eXBlLmlzRXF1YWxUbyh0ZXJtVHlwZSk7XG5cbiAgICAgIGlmICh0eXBlRXF1YWxUb1Rlcm1UeXBlKSB7XG4gICAgICAgIGNvbnN0IHRlcm1Fc3RhYmxpc2hlZCA9IHRlcm0uaXNFc3RhYmxpc2hlZCgpO1xuXG4gICAgICAgIGlmICh0ZXJtRXN0YWJsaXNoZWQpIHtcbiAgICAgICAgICBkaXNjaGFyZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXNjaGFyZ2VzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5kaXNjaGFyZ2VkIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc2NoYXJnZXM7XG4gIH1cblxuICB2YWxpZGF0ZVR5cGUoY29udGV4dCkge1xuICAgIGxldCB0eXBlVmFsaWRhdGVzO1xuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbidzIHR5cGUuLi5gKTtcblxuICAgIGNvbnN0IG5vbWluYWxUeXBlTmFtZSA9IHRoaXMudHlwZS5nZXROb21pbmFsVHlwZU5hbWUoKSxcbiAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcblxuICAgICAgdHlwZVZhbGlkYXRlcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGVTdHJpbmcgPSB0aGlzLnR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQuZGVidWcoYFRoZSAnJHt0eXBlU3RyaW5nfScgdHlwZSBpcyBub3QgcHJlc2VudC5gKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZVZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgdHlwZSBhc3NlcnRpb24ncyB0eXBlLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlVmFsaWRhdGVzO1xuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVXaGVuU3RhdGVkKGNvbnRleHQpIHtcbiAgICBsZXQgdmFsaWRhdGVzV2hlblN0YXRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHN0YXRlZCB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgdGVybSA9IGF3YWl0IHRoaXMudGVybS52YWxpZGF0ZShjb250ZXh0LCBhc3luYyAodGVybSwgY29udGV4dCkgPT4ge1xuICAgICAgbGV0IHZhbGlkYXRlc0ZvcndhcmRzID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRlcm1UeXBlID0gdGVybS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0ZXJtVHlwZUVxdWFsVG9UeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvKHRoaXMudHlwZSksXG4gICAgICAgICAgICB0ZXJtVHlwZVN1cGVyVHlwZU9mVHlwZSA9IHRlcm1UeXBlLmlzU3VwZXJUeXBlT2YodGhpcy50eXBlKTtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIC8vL1xuICAgICAgfSBlbHNlIGlmICh0ZXJtVHlwZUVxdWFsVG9UeXBlKSB7XG4gICAgICAgIHZhbGlkYXRlc0ZvcndhcmRzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGVybVR5cGVTdXBlclR5cGVPZlR5cGUpIHtcbiAgICAgICAgY29uc3QgdGVybUVzdGFibGlzaGVkID0gdGVybS5pc0VzdGFibGlzaGVkKCk7XG5cbiAgICAgICAgaWYgKHRlcm1Fc3RhYmxpc2hlZCkge1xuICAgICAgICAgIHZhbGlkYXRlc0ZvcndhcmRzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsaWRhdGVzRm9yd2FyZHM7XG4gICAgfSk7XG5cbiAgICBpZiAodGVybSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy50ZXJtID0gdGVybTtcblxuICAgICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHN0YXRlZCB0eXBlIGFzc2VydGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzV2hlblN0YXRlZDtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlbkRlcml2ZWQoY29udGV4dCkge1xuICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIGRlcml2ZWQgdHlwZSBhc3NlcnRpb24uLi5gKTtcblxuICAgIGNvbnN0IHRlcm0gPSB2YWxpZGF0ZVdoZW5EZXJpdmVkKHRoaXMudGVybSwgdGhpcy50eXBlLCBjb250ZXh0KTtcblxuICAgIGlmICh0ZXJtICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuXG4gICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlc1doZW5EZXJpdmVkKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyBkZXJpdmVkIHR5cGUgYXNzZXJ0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZXNXaGVuRGVyaXZlZDtcbiAgfVxuXG4gIHVuaWZ5SW5kZXBlbmRlbnRseShnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSB7XG4gICAgbGV0IHVuaWZpZXNJbmRlcGVuZGVudGx5ID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAvLy9cbiAgICAgICAgICB0eXBlQXNzZXJ0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHR5cGUgYXNzZXJ0aW9uIGluZGVwZW5kZW50bHkuLi5gKTtcblxuICAgIGxldCB0ZXJtO1xuXG4gICAgdGVybSA9IHRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnModGhpcy50ZXJtLCBjb250ZXh0KTtcblxuICAgIHRlcm0gPSB2YWxpZGF0ZVdoZW5EZXJpdmVkKHRlcm0sIHRoaXMudHlwZSwgY29udGV4dCk7IC8vXG5cbiAgICBpZiAodGVybSAhPT0gbnVsbCkge1xuICAgICAgdW5pZmllc0luZGVwZW5kZW50bHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh1bmlmaWVzSW5kZXBlbmRlbnRseSkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHR5cGUgYXNzZXJ0aW9uIGluZGVwZW5kZW50bHkuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaWZpZXNJbmRlcGVuZGVudGx5O1xuICB9XG5cbiAgYXNzaWduKGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGF0ZWQgPSBjb250ZXh0LmlzU3RhdGVkKCk7XG5cbiAgICBpZiAoIXN0YXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVBc3NlcnRpb24gPSB0aGlzLCAvLy9cbiAgICAgICAgICB2YXJpYWJsZUFzc2lnbWVudCA9IHZhcmlhYmxlQXNzaWdubWVudEZyb21UeXBlQXNzZXJ0aW9uKHR5cGVBc3NlcnRpb24sIGNvbnRleHQpO1xuXG4gICAgY29udGV4dC5hZGRBc3NpZ25tZW50KHZhcmlhYmxlQXNzaWdtZW50KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCB0eXBlSlNPTiA9IHR5cGVUb1R5cGVKU09OKHRoaXMudHlwZSksXG4gICAgICAgICAgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpLFxuICAgICAgICAgIHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICBsZXQgYnJlYWtQb2ludDtcblxuICAgIGJyZWFrUG9pbnQgPSB0aGlzLmdldEJyZWFrUG9pbnQoKTtcblxuICAgIGNvbnN0IGJyZWFrUG9pbnRKU09OID0gYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04oYnJlYWtQb2ludCk7XG5cbiAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEpTT047ICAvLy9cblxuICAgIGNvbnN0IHR5cGUgPSB0eXBlSlNPTixcbiAgICAgICAgICBqc29uID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIGJyZWFrUG9pbnQsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIlR5cGVBc3NlcnRpb25cIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGxldCB0eXBlQXNzZXJ0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbjtcblxuICAgIGlmICh0aGlzLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICB0eXBlQXNzZXJ0aW9uTm9kZSA9IGluc3RhbnRpYXRlVHlwZUFzc2VydGlvbihzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgICBub2RlID0gdHlwZUFzc2VydGlvbk5vZGUsIC8vL1xuICAgICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgICB0ZXJtID0gdGVybUZyb21UeXBlQXNzZXJ0aW9uTm9kZSh0eXBlQXNzZXJ0aW9uTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICAgIHR5cGUgPSB0eXBlRnJvbUpTT04oanNvbiwgY29udGV4dCk7XG5cbiAgICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgICAgICAgdHlwZUFzc2VydGlvbiA9IG5ldyBUeXBlQXNzZXJ0aW9uKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgdGVybSwgdHlwZSk7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZUFzc2VydGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICAgIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHR5cGVBc3NlcnRpb24gPSB0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gdHlwZUFzc2VydGlvbjtcbiAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlV2hlbkRlcml2ZWQodGVybSwgdHlwZSwgY29udGV4dCkge1xuICBpZiAodGVybSAhPT0gbnVsbCkge1xuICAgIHRlcm0gPSBhd2FpdCB0ZXJtLnZhbGlkYXRlKGNvbnRleHQsIGFzeW5jICh0ZXJtLCBjb250ZXh0KSA9PiB7XG4gICAgICBsZXQgdmFsaWRhdGVzRm9yd2FyZHMgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdGVybVR5cGUgPSB0ZXJtLmdldFR5cGUoKSxcbiAgICAgICAgICAgIHRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mVHlwZSA9IHRlcm1UeXBlLmlzRXF1YWxUb09yU3ViVHlwZU9mKHR5cGUpO1xuXG4gICAgICBpZiAodGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlKSB7XG4gICAgICAgIGNvbnN0IHRlcm1Fc3RhYmxpc2hlZCA9IHRlcm0uaXNFc3RhYmxpc2hlZCgpO1xuXG4gICAgICAgIGlmICh0ZXJtRXN0YWJsaXNoZWQpIHtcbiAgICAgICAgICB2YWxpZGF0ZXNGb3J3YXJkcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkYXRlc0ZvcndhcmRzO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRlcm07XG59XG4iXSwibmFtZXMiOlsiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiVHlwZUFzc2VydGlvbiIsIkFzc2VydGlvbiIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInRlcm0iLCJ0eXBlIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRUeXBlQXNzZXJ0aW9uTkJvZGUiLCJnZXROb2RlIiwidHlwZUFzc2VydGlvbk5vZGUiLCJ2YWxpZGF0ZSIsInR5cGVBc3NlcnRpb24iLCJ0eXBlQXNzZXJ0aW9uU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2YWxpZGF0ZXMiLCJ2YWxpZEFzc2VydGlvbiIsImZpbmRWYWxpZEFzc2VydGlvbiIsImRlYnVnIiwidHlwZVZhbGlkYXRlcyIsInZhbGlkYXRlVHlwZSIsInN0YXRlZCIsImlzU3RhdGVkIiwidmFsaWRhdGVzV2hlblN0YXRlZCIsInZhbGlkYXRlc1doZW5EZXJpdmVkIiwidmFsaWRhdGVXaGVuU3RhdGVkIiwidmFsaWRhdGVXaGVuRGVyaXZlZCIsImFzc2VydGlvbiIsImFzc2lnbiIsImFkZEFzc2VydGlvbiIsImRpc2NoYXJnZSIsImRpc2NoYXJnZXMiLCJ0ZXJtRnJvbVRlcm1BbmRTdWJzdGl0dXRpb25zIiwidGVybVR5cGUiLCJ0eXBlRXF1YWxUb1Rlcm1UeXBlIiwiaXNFcXVhbFRvIiwidGVybUVzdGFibGlzaGVkIiwiaXNFc3RhYmxpc2hlZCIsIm5vbWluYWxUeXBlTmFtZSIsImdldE5vbWluYWxUeXBlTmFtZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJ0eXBlU3RyaW5nIiwidmFsaWRhdGVzRm9yd2FyZHMiLCJ0ZXJtVHlwZUVxdWFsVG9UeXBlIiwidGVybVR5cGVTdXBlclR5cGVPZlR5cGUiLCJpc1N1cGVyVHlwZU9mIiwidW5pZnlJbmRlcGVuZGVudGx5IiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJ1bmlmaWVzSW5kZXBlbmRlbnRseSIsInZhcmlhYmxlQXNzaWdtZW50IiwidmFyaWFibGVBc3NpZ25tZW50RnJvbVR5cGVBc3NlcnRpb24iLCJhZGRBc3NpZ25tZW50IiwidG9KU09OIiwidHlwZUpTT04iLCJ0eXBlVG9UeXBlSlNPTiIsIm5hbWUiLCJnZXROYW1lIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsImZyb21KU09OIiwiaW5zdGFudGlhdGUiLCJpbnN0YW50aWF0ZVR5cGVBc3NlcnRpb24iLCJ0ZXJtRnJvbVR5cGVBc3NlcnRpb25Ob2RlIiwidHlwZUZyb21KU09OIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudE5vZGUiLCJ0eXBlQXNzZXJ0aW9uRnJvbVN0YXRlbWVudE5vZGUiLCJ0ZXJtVHlwZUVxdWFsVG9PclN1YlR5cGVPZlR5cGUiLCJpc0VxdWFsVG9PclN1YlR5cGVPZiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBZ0JBOzs7ZUFBQTs7O2dDQWRvQztrRUFFZDswQkFFQzt5QkFDSzs2QkFDYTtzQkFDSTsrQkFDQTt3QkFDTzt5QkFDc0I7Ozs7OztBQUUxRSxNQUFNLEVBQUVBLGtCQUFrQixFQUFFQywwQkFBMEIsRUFBRSxHQUFHQyxtQ0FBbUI7TUFFOUUsV0FBZUMsSUFBQUEsZ0JBQU0sRUFBQyxNQUFNQyxzQkFBc0JDLGtCQUFTO0lBQ3pELFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsSUFBSSxFQUFFQyxJQUFJLENBQUU7UUFDekQsS0FBSyxDQUFDTCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7SUFDZDtJQUVBQyxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUNGLElBQUk7SUFDbEI7SUFFQUcsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDRixJQUFJO0lBQ2xCO0lBRUFHLHdCQUF3QjtRQUN0QixNQUFNTixPQUFPLElBQUksQ0FBQ08sT0FBTyxJQUNuQkMsb0JBQW9CUixNQUFNLEdBQUc7UUFFbkMsT0FBT1E7SUFDVDtJQUVBLE1BQU1DLFNBQVNYLE9BQU8sRUFBRTtRQUN0QixJQUFJWSxnQkFBZ0I7UUFFcEIsTUFBTUMsc0JBQXNCLElBQUksQ0FBQ0MsU0FBUyxJQUFLLEdBQUc7UUFFbERkLFFBQVFlLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFRixvQkFBb0IsbUJBQW1C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
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L2Fzc2VydGlvbi90eXBlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBicmVha1BvaW50VXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gXCIuLi9hc3NlcnRpb25cIjtcblxuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlVHlwZUFzc2VydGlvbiB9IGZyb20gXCIuLi8uLi9wcm9jZXNzL2luc3RhbnRpYXRlXCI7XG5pbXBvcnQgeyB0eXBlRnJvbUpTT04sIHR5cGVUb1R5cGVKU09OIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9qc29uXCI7XG5pbXBvcnQgeyB0ZXJtRnJvbVRlcm1BbmRTdWJzdGl0dXRpb25zIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9zdWJzdGl0dXRpb25zXCI7XG5pbXBvcnQgeyB2YXJpYWJsZUFzc2lnbm1lbnRGcm9tVHlwZUFzc2VydGlvbiB9IGZyb20gXCIuLi8uLi9wcm9jZXNzL2Fzc2lnblwiO1xuaW1wb3J0IHsgdGVybUZyb21UeXBlQXNzZXJ0aW9uTm9kZSwgdHlwZUFzc2VydGlvbkZyb21TdGF0ZW1lbnROb2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5cbmNvbnN0IHsgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIFR5cGVBc3NlcnRpb24gZXh0ZW5kcyBBc3NlcnRpb24ge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRlcm0sIHR5cGUpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgZ2V0VGVybSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtO1xuICB9XG5cbiAgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0VHlwZUFzc2VydGlvbk5Cb2RlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICB0eXBlQXNzZXJ0aW9uTm9kZSA9IG5vZGU7IC8vL1xuXG4gICAgcmV0dXJuIHR5cGVBc3NlcnRpb25Ob2RlO1xuICB9XG5cbiAgdmFsaWRhdGUoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgdHlwZUFzc2VydGlvblN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgdmFsaWRBc3NlcnRpb24gPSB0aGlzLmZpbmRWYWxpZEFzc2VydGlvbihjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZEFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgdHlwZUFzc2VydGlvbiA9IHZhbGlkQXNzZXJ0aW9uOyAvLy9cblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbiBpcyBhbHJlYWR5IHZhbGlkLmApO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHR5cGVBc3NlcnRpb24pO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVUeXBlKGNvbnRleHQsICh0eXBlVmFsaWRhdGVzKSA9PiB7XG4gICAgICBpZiAoIXR5cGVWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3QgdHlwZUFzc2VydGlvbiA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih0eXBlQXNzZXJ0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGVXaGVuU3RhdGVkID0gdGhpcy52YWxpZGF0ZVdoZW5TdGF0ZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbGlkYXRlV2hlbkRlcml2ZWQgPSB0aGlzLnZhbGlkYXRlV2hlbkRlcml2ZWQuYmluZCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGV4aXN0cyhbXG4gICAgICAgIHZhbGlkYXRlV2hlblN0YXRlZCxcbiAgICAgICAgdmFsaWRhdGVXaGVuRGVyaXZlZFxuICAgICAgXSwgY29udGV4dCwgKHZhbGlkYXRlcykgPT4ge1xuICAgICAgICBsZXQgdHlwZUFzc2VydGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgICAgIGNvbnN0IGFzc2VydGlvbiA9IHRoaXM7IC8vL1xuXG4gICAgICAgICAgdHlwZUFzc2VydGlvbiA9IGFzc2VydGlvbjsgIC8vL1xuXG4gICAgICAgICAgdGhpcy5hc3NpZ24oY29udGV4dCk7XG5cbiAgICAgICAgICBjb250ZXh0LmFkZEFzc2VydGlvbihhc3NlcnRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHR5cGVBc3NlcnRpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjaGFyZ2UoY29udGV4dCkge1xuICAgIGxldCBkaXNjaGFyZ2VzID0gZmFsc2U7XG5cbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgRGlzY2hhcmdpbmcgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgY29uc3QgdGVybSA9IHRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnModGhpcy50ZXJtLCBjb250ZXh0KTtcblxuICAgIGlmICh0ZXJtICE9PSBudWxsKSB7XG4gICAgICBjb25zdCB0ZXJtVHlwZSA9IHRlcm0uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgdHlwZUVxdWFsVG9UZXJtVHlwZSA9IHRoaXMudHlwZS5pc0VxdWFsVG8odGVybVR5cGUpO1xuXG4gICAgICBpZiAodHlwZUVxdWFsVG9UZXJtVHlwZSkge1xuICAgICAgICBjb25zdCB0ZXJtRXN0YWJsaXNoZWQgPSB0ZXJtLmlzRXN0YWJsaXNoZWQoKTtcblxuICAgICAgICBpZiAodGVybUVzdGFibGlzaGVkKSB7XG4gICAgICAgICAgZGlzY2hhcmdlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzY2hhcmdlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uZGlzY2hhcmdlZCB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHR5cGUgYXNzZXJ0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBkaXNjaGFyZ2VzO1xuICB9XG5cbiAgdmFsaWRhdGVUeXBlKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCB0eXBlVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIHR5cGUgYXNzZXJ0aW9uJ3MgdHlwZS4uLmApO1xuXG4gICAgY29uc3Qgbm9taW5hbFR5cGVOYW1lID0gdGhpcy50eXBlLmdldE5vbWluYWxUeXBlTmFtZSgpLFxuICAgICAgICAgIHR5cGUgPSBjb250ZXh0LmZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUobm9taW5hbFR5cGVOYW1lKTtcblxuICAgIGlmICh0eXBlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgICB0eXBlVmFsaWRhdGVzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZVN0cmluZyA9IHRoaXMudHlwZS5nZXRTdHJpbmcoKTtcblxuICAgICAgY29udGV4dC5kZWJ1ZyhgVGhlICcke3R5cGVTdHJpbmd9JyB0eXBlIGlzIG5vdCBwcmVzZW50LmApO1xuICAgIH1cblxuICAgIGlmICh0eXBlVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyB0eXBlIGFzc2VydGlvbidzIHR5cGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih0eXBlVmFsaWRhdGVzKTtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlblN0YXRlZChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzdGF0ZWQgPSBjb250ZXh0LmlzU3RhdGVkKCk7XG5cbiAgICBpZiAoIXN0YXRlZCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVzV2hlblN0YXRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5TdGF0ZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVBc3NlcnRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3R5cGVBc3NlcnRpb25TdHJpbmd9JyBzdGF0ZWQgdHlwZSBhc3NlcnRpb24uLi5gKTtcblxuICAgIHRoaXMudGVybS52YWxpZGF0ZShjb250ZXh0LCAodGVybSwgY29udGV4dCkgPT4ge1xuICAgICAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVzV2hlblN0YXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlblN0YXRlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlcm1UeXBlID0gdGVybS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0ZXJtVHlwZUVxdWFsVG9UeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvKHRoaXMudHlwZSksXG4gICAgICAgICAgICB0ZXJtVHlwZVN1cGVyVHlwZU9mVHlwZSA9IHRlcm1UeXBlLmlzU3VwZXJUeXBlT2YodGhpcy50eXBlKTtcblxuICAgICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIC8vL1xuICAgICAgfSBlbHNlIGlmICh0ZXJtVHlwZUVxdWFsVG9UeXBlKSB7XG4gICAgICAgIHZhbGlkYXRlc1doZW5TdGF0ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICh0ZXJtVHlwZVN1cGVyVHlwZU9mVHlwZSkge1xuICAgICAgICBjb25zdCB0ZXJtRXN0YWJsaXNoZWQgPSB0ZXJtLmlzRXN0YWJsaXNoZWQoKTtcblxuICAgICAgICBpZiAodGVybUVzdGFibGlzaGVkKSB7XG4gICAgICAgICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQpIHtcbiAgICAgICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgc3RhdGVkIHR5cGUgYXNzZXJ0aW9uLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5TdGF0ZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVXaGVuRGVyaXZlZChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzdGF0ZWQgPSBjb250ZXh0LmlzU3RhdGVkKCk7XG5cbiAgICBpZiAoc3RhdGVkKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5EZXJpdmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlQXNzZXJ0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgZGVyaXZlZCB0eXBlIGFzc2VydGlvbi4uLmApO1xuXG4gICAgdmFsaWRhdGVXaGVuRGVyaXZlZCh0aGlzLnRlcm0sIHRoaXMudHlwZSwgY29udGV4dCwgKHRlcm0pID0+IHtcbiAgICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGVybSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuXG4gICAgICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRlc1doZW5EZXJpdmVkKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7dHlwZUFzc2VydGlvblN0cmluZ30nIGRlcml2ZWQgdHlwZSBhc3NlcnRpb24uYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlbkRlcml2ZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5pZnlJbmRlcGVuZGVudGx5KGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcblxuICAgIGRlYnVnZ2VyXG5cbiAgICBsZXQgdW5pZmllc0luZGVwZW5kZW50bHkgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsIC8vL1xuICAgICAgICAgIHR5cGVBc3NlcnRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgdHlwZSBhc3NlcnRpb24gaW5kZXBlbmRlbnRseS4uLmApO1xuXG4gICAgbGV0IHRlcm07XG5cbiAgICB0ZXJtID0gdGVybUZyb21UZXJtQW5kU3Vic3RpdHV0aW9ucyh0aGlzLnRlcm0sIGNvbnRleHQpO1xuXG4gICAgdGVybSA9IHZhbGlkYXRlV2hlbkRlcml2ZWQodGVybSwgdGhpcy50eXBlLCBjb250ZXh0KTsgLy9cblxuICAgIGlmICh0ZXJtICE9PSBudWxsKSB7XG4gICAgICB1bmlmaWVzSW5kZXBlbmRlbnRseSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHVuaWZpZXNJbmRlcGVuZGVudGx5KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHt0eXBlQXNzZXJ0aW9uU3RyaW5nfScgdHlwZSBhc3NlcnRpb24gaW5kZXBlbmRlbnRseS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pZmllc0luZGVwZW5kZW50bHk7XG4gIH1cblxuICBhc3NpZ24oY29udGV4dCkge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmICghc3RhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUFzc2VydGlvbiA9IHRoaXMsIC8vL1xuICAgICAgICAgIHZhcmlhYmxlQXNzaWdtZW50ID0gdmFyaWFibGVBc3NpZ25tZW50RnJvbVR5cGVBc3NlcnRpb24odHlwZUFzc2VydGlvbiwgY29udGV4dCk7XG5cbiAgICBjb250ZXh0LmFkZEFzc2lnbm1lbnQodmFyaWFibGVBc3NpZ21lbnQpO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHR5cGVKU09OID0gdHlwZVRvVHlwZUpTT04odGhpcy50eXBlKSxcbiAgICAgICAgICBuYW1lID0gdGhpcy5nZXROYW1lKCksXG4gICAgICAgICAgc3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVKU09OLFxuICAgICAgICAgIGpzb24gPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgYnJlYWtQb2ludCxcbiAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiVHlwZUFzc2VydGlvblwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IHR5cGVBc3NlcnRpb24gPSBudWxsO1xuXG4gICAgY29uc3QgeyBuYW1lIH0gPSBqc29uO1xuXG4gICAgaWYgKHRoaXMubmFtZSA9PT0gbmFtZSkge1xuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgeyBzdHJpbmcgfSA9IGpzb24sXG4gICAgICAgICAgICAgIHR5cGVBc3NlcnRpb25Ob2RlID0gaW5zdGFudGlhdGVUeXBlQXNzZXJ0aW9uKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICAgIG5vZGUgPSB0eXBlQXNzZXJ0aW9uTm9kZSwgLy8vXG4gICAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICAgIHRlcm0gPSB0ZXJtRnJvbVR5cGVBc3NlcnRpb25Ob2RlKHR5cGVBc3NlcnRpb25Ob2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgdHlwZSA9IHR5cGVGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcblxuICAgICAgICBjb250ZXh0ID0gbnVsbDtcblxuICAgICAgICB0eXBlQXNzZXJ0aW9uID0gbmV3IFR5cGVBc3NlcnRpb24oY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCB0ZXJtLCB0eXBlKTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlQXNzZXJ0aW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHN0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgICAgdHlwZUFzc2VydGlvbiA9IHR5cGVBc3NlcnRpb25Gcm9tU3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlLCBjb250ZXh0KTtcblxuICAgIHJldHVybiB0eXBlQXNzZXJ0aW9uO1xuICB9XG59KTtcblxuZnVuY3Rpb24gdmFsaWRhdGVXaGVuRGVyaXZlZCh0ZXJtLCB0eXBlLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgaWYgKHRlcm0gPT09IG51bGwpIHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm0pO1xuICB9XG5cbiAgdGVybS52YWxpZGF0ZShjb250ZXh0LCAodGVybSwgY29udGV4dCkgPT4ge1xuICAgIGlmICh0ZXJtID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRlcm1UeXBlID0gdGVybS5nZXRUeXBlKCksXG4gICAgICAgICAgdGVybVR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUeXBlID0gdGVybVR5cGUuaXNFcXVhbFRvT3JTdWJUeXBlT2YodHlwZSk7XG5cbiAgICBpZiAoIXRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mVHlwZSkge1xuICAgICAgdGVybSA9IG51bGw7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVybUVzdGFibGlzaGVkID0gdGVybS5pc0VzdGFibGlzaGVkKCk7XG5cbiAgICBpZiAoIXRlcm1Fc3RhYmxpc2hlZCkge1xuICAgICAgdGVybSA9IG51bGw7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih0ZXJtKTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiVHlwZUFzc2VydGlvbiIsIkFzc2VydGlvbiIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInRlcm0iLCJ0eXBlIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRUeXBlQXNzZXJ0aW9uTkJvZGUiLCJnZXROb2RlIiwidHlwZUFzc2VydGlvbk5vZGUiLCJ2YWxpZGF0ZSIsImNvbnRpbnVhdGlvbiIsInR5cGVBc3NlcnRpb25TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInZhbGlkQXNzZXJ0aW9uIiwiZmluZFZhbGlkQXNzZXJ0aW9uIiwidHlwZUFzc2VydGlvbiIsImRlYnVnIiwidmFsaWRhdGVUeXBlIiwidHlwZVZhbGlkYXRlcyIsInZhbGlkYXRlV2hlblN0YXRlZCIsImJpbmQiLCJ2YWxpZGF0ZVdoZW5EZXJpdmVkIiwiZXhpc3RzIiwidmFsaWRhdGVzIiwiYXNzZXJ0aW9uIiwiYXNzaWduIiwiYWRkQXNzZXJ0aW9uIiwiZGlzY2hhcmdlIiwiZGlzY2hhcmdlcyIsInRlcm1Gcm9tVGVybUFuZFN1YnN0aXR1dGlvbnMiLCJ0ZXJtVHlwZSIsInR5cGVFcXVhbFRvVGVybVR5cGUiLCJpc0VxdWFsVG8iLCJ0ZXJtRXN0YWJsaXNoZWQiLCJpc0VzdGFibGlzaGVkIiwibm9taW5hbFR5cGVOYW1lIiwiZ2V0Tm9taW5hbFR5cGVOYW1lIiwiZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZSIsInR5cGVTdHJpbmciLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ0ZXJtVHlwZUVxdWFsVG9UeXBlIiwidGVybVR5cGVTdXBlclR5cGVPZlR5cGUiLCJpc1N1cGVyVHlwZU9mIiwidmFsaWRhdGVzV2hlbkRlcml2ZWQiLCJ1bmlmeUluZGVwZW5kZW50bHkiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsInVuaWZpZXNJbmRlcGVuZGVudGx5IiwidmFyaWFibGVBc3NpZ21lbnQiLCJ2YXJpYWJsZUFzc2lnbm1lbnRGcm9tVHlwZUFzc2VydGlvbiIsImFkZEFzc2lnbm1lbnQiLCJ0b0pTT04iLCJ0eXBlSlNPTiIsInR5cGVUb1R5cGVKU09OIiwibmFtZSIsImdldE5hbWUiLCJnZXRCcmVha1BvaW50IiwiYnJlYWtQb2ludEpTT04iLCJqc29uIiwiZnJvbUpTT04iLCJpbnN0YW50aWF0ZSIsImluc3RhbnRpYXRlVHlwZUFzc2VydGlvbiIsInRlcm1Gcm9tVHlwZUFzc2VydGlvbk5vZGUiLCJ0eXBlRnJvbUpTT04iLCJmcm9tU3RhdGVtZW50Iiwic3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZSIsInR5cGVBc3NlcnRpb25Gcm9tU3RhdGVtZW50Tm9kZSIsInRlcm1UeXBlRXF1YWxUb09yU3ViVHlwZU9mVHlwZSIsImlzRXF1YWxUb09yU3ViVHlwZU9mIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFpQkE7OztlQUFBOzs7Z0NBZm9DO2tFQUVkOzBCQUVDOzhCQUNBO3lCQUNLOzZCQUNhO3NCQUNJOytCQUNBO3dC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
@@ -21,37 +21,37 @@ const _default = (0, _elements.define)(class BracketedConstructor extends _const
21
21
  const node = this.getNode(), bracketedConstructorNode = node; ///
22
22
  return bracketedConstructorNode;
23
23
  }
24
- async unifyTerm(term, context, validateForwards) {
25
- let termUnifies;
24
+ unifyTerm(term, context, continuation) {
26
25
  const termString = term.getString();
27
26
  context.trace(`Unifying the '${termString}' term with the bracketed constructor...`);
28
- termUnifies = await super.unifyTerm(term, context, async (term, context)=>{
29
- let validatesForwards = false;
27
+ super.unifyTerm(term, context, (termUnifies)=>{
28
+ if (!termUnifies) {
29
+ return continuation(termUnifies);
30
+ }
30
31
  const bracketedTerm = term, bracketedTermNode = bracketedTerm.getNode(), singularTermNode = bracketedTermNode.getSingularTermNode();
31
- if (singularTermNode !== null) {
32
- const bracketlessTermNode = singularTermNode; ///
33
- let bracketlessTerm;
34
- bracketlessTerm = (0, _element.termFromTermNode)(bracketlessTermNode, context);
35
- bracketlessTerm = await bracketlessTerm.validate(context, async (bracketlessTerm, context)=>{
36
- let validatesForwards;
37
- const type = bracketlessTerm.getType(), provisional = bracketlessTerm.isProvisional();
38
- bracketedTerm.setType(type);
39
- bracketedTerm.setProvisional(provisional);
40
- validatesForwards = await validateForwards(bracketedTerm, context);
41
- return validatesForwards;
42
- });
43
- if (bracketlessTerm !== null) {
44
- validatesForwards = true;
45
- }
32
+ if (singularTermNode === null) {
33
+ const termUnifies = false;
34
+ return continuation(termUnifies);
46
35
  }
47
- return validatesForwards;
36
+ const bracketlessTermNode = singularTermNode, bracketlessTerm = (0, _element.termFromTermNode)(bracketlessTermNode, context);
37
+ bracketlessTerm.validate(context, (bracketlessTerm, context)=>{
38
+ if (bracketlessTerm === null) {
39
+ const termUnifies = false;
40
+ return continuation(termUnifies);
41
+ }
42
+ let termUnifies;
43
+ const type = bracketlessTerm.getType(), provisional = bracketlessTerm.isProvisional();
44
+ bracketedTerm.setType(type);
45
+ bracketedTerm.setProvisional(provisional);
46
+ termUnifies = true;
47
+ if (termUnifies) {
48
+ context.debug(`...unified the '${termString}' term with the bracketed constructor.`);
49
+ }
50
+ return continuation(termUnifies);
51
+ });
48
52
  });
49
- if (termUnifies) {
50
- context.debug(`...unified the '${termString}' term with the bracketed constructor.`);
51
- }
52
- return termUnifies;
53
53
  }
54
54
  static name = "BracketedConstructor";
55
55
  });
56
56
 
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cnVjdG9yL2JyYWNrZXRlZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IENvbnN0cnVjdG9yIGZyb20gXCIuLi9jb25zdHJ1Y3RvclwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IHRlcm1Gcm9tVGVybU5vZGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIEJyYWNrZXRlZENvbnN0cnVjdG9yIGV4dGVuZHMgQ29uc3RydWN0b3Ige1xuICBnZXRCcmFja2V0ZWRDb25zdHJ1Y3Rvck5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGJyYWNrZXRlZENvbnN0cnVjdG9yTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBicmFja2V0ZWRDb25zdHJ1Y3Rvck5vZGU7XG4gIH1cblxuICBhc3luYyB1bmlmeVRlcm0odGVybSwgY29udGV4dCwgdmFsaWRhdGVGb3J3YXJkcykge1xuICAgIGxldCB0ZXJtVW5pZmllcztcblxuICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0ZXJtLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIHdpdGggdGhlIGJyYWNrZXRlZCBjb25zdHJ1Y3Rvci4uLmApO1xuXG4gICAgdGVybVVuaWZpZXMgPSBhd2FpdCBzdXBlci51bmlmeVRlcm0odGVybSwgY29udGV4dCwgYXN5bmMgKHRlcm0sIGNvbnRleHQpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0ZXNGb3J3YXJkcyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBicmFja2V0ZWRUZXJtID0gdGVybSwgLy8vXG4gICAgICAgICAgICBicmFja2V0ZWRUZXJtTm9kZSA9IGJyYWNrZXRlZFRlcm0uZ2V0Tm9kZSgpLFxuICAgICAgICAgICAgc2luZ3VsYXJUZXJtTm9kZSA9IGJyYWNrZXRlZFRlcm1Ob2RlLmdldFNpbmd1bGFyVGVybU5vZGUoKTtcblxuICAgICAgaWYgKHNpbmd1bGFyVGVybU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgYnJhY2tldGxlc3NUZXJtTm9kZSA9IHNpbmd1bGFyVGVybU5vZGU7IC8vL1xuXG4gICAgICAgIGxldCBicmFja2V0bGVzc1Rlcm07XG5cbiAgICAgICAgYnJhY2tldGxlc3NUZXJtID0gdGVybUZyb21UZXJtTm9kZShicmFja2V0bGVzc1Rlcm1Ob2RlLCBjb250ZXh0KTtcblxuICAgICAgICBicmFja2V0bGVzc1Rlcm0gPSBhd2FpdCBicmFja2V0bGVzc1Rlcm0udmFsaWRhdGUoY29udGV4dCwgYXN5bmMgKGJyYWNrZXRsZXNzVGVybSwgY29udGV4dCkgPT4geyAgLy8vXG4gICAgICAgICAgbGV0IHZhbGlkYXRlc0ZvcndhcmRzO1xuXG4gICAgICAgICAgY29uc3QgdHlwZSA9IGJyYWNrZXRsZXNzVGVybS5nZXRUeXBlKCksXG4gICAgICAgICAgICAgICAgcHJvdmlzaW9uYWwgPSBicmFja2V0bGVzc1Rlcm0uaXNQcm92aXNpb25hbCgpO1xuXG4gICAgICAgICAgYnJhY2tldGVkVGVybS5zZXRUeXBlKHR5cGUpO1xuXG4gICAgICAgICAgYnJhY2tldGVkVGVybS5zZXRQcm92aXNpb25hbChwcm92aXNpb25hbCk7XG5cbiAgICAgICAgICB2YWxpZGF0ZXNGb3J3YXJkcyA9IGF3YWl0IHZhbGlkYXRlRm9yd2FyZHMoYnJhY2tldGVkVGVybSwgY29udGV4dCk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsaWRhdGVzRm9yd2FyZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChicmFja2V0bGVzc1Rlcm0gIT09IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0ZXNGb3J3YXJkcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbGlkYXRlc0ZvcndhcmRzO1xuICAgIH0pO1xuXG4gICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB3aXRoIHRoZSBicmFja2V0ZWQgY29uc3RydWN0b3IuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcm1VbmlmaWVzO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIkJyYWNrZXRlZENvbnN0cnVjdG9yXCI7XG59KTtcbiJdLCJuYW1lcyI6WyJkZWZpbmUiLCJCcmFja2V0ZWRDb25zdHJ1Y3RvciIsIkNvbnN0cnVjdG9yIiwiZ2V0QnJhY2tldGVkQ29uc3RydWN0b3JOb2RlIiwibm9kZSIsImdldE5vZGUiLCJicmFja2V0ZWRDb25zdHJ1Y3Rvck5vZGUiLCJ1bmlmeVRlcm0iLCJ0ZXJtIiwiY29udGV4dCIsInZhbGlkYXRlRm9yd2FyZHMiLCJ0ZXJtVW5pZmllcyIsInRlcm1TdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsInZhbGlkYXRlc0ZvcndhcmRzIiwiYnJhY2tldGVkVGVybSIsImJyYWNrZXRlZFRlcm1Ob2RlIiwic2luZ3VsYXJUZXJtTm9kZSIsImdldFNpbmd1bGFyVGVybU5vZGUiLCJicmFja2V0bGVzc1Rlcm1Ob2RlIiwiYnJhY2tldGxlc3NUZXJtIiwidGVybUZyb21UZXJtTm9kZSIsInZhbGlkYXRlIiwidHlwZSIsImdldFR5cGUiLCJwcm92aXNpb25hbCIsImlzUHJvdmlzaW9uYWwiLCJzZXRUeXBlIiwic2V0UHJvdmlzaW9uYWwiLCJkZWJ1ZyIsIm5hbWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQU9BOzs7ZUFBQTs7O29FQUx3QjswQkFFRDt5QkFDVTs7Ozs7O01BRWpDLFdBQWVBLElBQUFBLGdCQUFNLEVBQUMsTUFBTUMsNkJBQTZCQyxvQkFBVztJQUNsRUMsOEJBQThCO1FBQzVCLE1BQU1DLE9BQU8sSUFBSSxDQUFDQyxPQUFPLElBQ25CQywyQkFBMkJGLE1BQU8sR0FBRztRQUUzQyxPQUFPRTtJQUNUO0lBRUEsTUFBTUMsVUFBVUMsSUFBSSxFQUFFQyxPQUFPLEVBQUVDLGdCQUFnQixFQUFFO1FBQy9DLElBQUlDO1FBRUosTUFBTUMsYUFBYUosS0FBS0ssU0FBUztRQUVqQ0osUUFBUUssS0FBSyxDQUFDLENBQUMsY0FBYyxFQUFFRixXQUFXLHdDQUF3QyxDQUFDO1FBRW5GRCxjQUFjLE1BQU0sS0FBSyxDQUFDSixVQUFVQyxNQUFNQyxTQUFTLE9BQU9ELE1BQU1DO1lBQzlELElBQUlNLG9CQUFvQjtZQUV4QixNQUFNQyxnQkFBZ0JSLE1BQ2hCUyxvQkFBb0JELGNBQWNYLE9BQU8sSUFDekNhLG1CQUFtQkQsa0JBQWtCRSxtQkFBbUI7WUFFOUQsSUFBSUQscUJBQXFCLE1BQU07Z0JBQzdCLE1BQU1FLHNCQUFzQkYsa0JBQWtCLEdBQUc7Z0JBRWpELElBQUlHO2dCQUVKQSxrQkFBa0JDLElBQUFBLHlCQUFnQixFQUFDRixxQkFBcUJYO2dCQUV4RFksa0JBQWtCLE1BQU1BLGdCQUFnQkUsUUFBUSxDQUFDZCxTQUFTLE9BQU9ZLGlCQUFpQlo7b0JBQ2hGLElBQUlNO29CQUVKLE1BQU1TLE9BQU9ILGdCQUFnQkksT0FBTyxJQUM5QkMsY0FBY0wsZ0JBQWdCTSxhQUFhO29CQUVqRFgsY0FBY1ksT0FBTyxDQUFDSjtvQkFFdEJSLGNBQWNhLGNBQWMsQ0FBQ0g7b0JBRTdCWCxvQkFBb0IsTUFBTUwsaUJBQWlCTSxlQUFlUDtvQkFFMUQsT0FBT007Z0JBQ1Q7Z0JBRUEsSUFBSU0sb0JBQW9CLE1BQU07b0JBQzVCTixvQkFBb0I7Z0JBQ3RCO1lBQ0Y7WUFFQSxPQUFPQTtRQUNUO1FBRUEsSUFBSUosYUFBYTtZQUNmRixRQUFRcUIsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVsQixXQUFXLHNDQUFzQyxDQUFDO1FBQ3JGO1FBRUEsT0FBT0Q7SUFDVDtJQUVBLE9BQU9vQixPQUFPLHVCQUF1QjtBQUN2QyJ9
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cnVjdG9yL2JyYWNrZXRlZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IENvbnN0cnVjdG9yIGZyb20gXCIuLi9jb25zdHJ1Y3RvclwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IHRlcm1Gcm9tVGVybU5vZGUgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2VsZW1lbnRcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIEJyYWNrZXRlZENvbnN0cnVjdG9yIGV4dGVuZHMgQ29uc3RydWN0b3Ige1xuICBnZXRCcmFja2V0ZWRDb25zdHJ1Y3Rvck5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGJyYWNrZXRlZENvbnN0cnVjdG9yTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBicmFja2V0ZWRDb25zdHJ1Y3Rvck5vZGU7XG4gIH1cblxuICB1bmlmeVRlcm0odGVybSwgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgdGVybVN0cmluZyA9IHRlcm0uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gd2l0aCB0aGUgYnJhY2tldGVkIGNvbnN0cnVjdG9yLi4uYCk7XG5cbiAgICBzdXBlci51bmlmeVRlcm0odGVybSwgY29udGV4dCwgKHRlcm1VbmlmaWVzKSA9PiB7XG4gICAgICBpZiAoIXRlcm1VbmlmaWVzKSB7XG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVVuaWZpZXMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBicmFja2V0ZWRUZXJtID0gdGVybSwgLy8vXG4gICAgICAgICAgICBicmFja2V0ZWRUZXJtTm9kZSA9IGJyYWNrZXRlZFRlcm0uZ2V0Tm9kZSgpLFxuICAgICAgICAgICAgc2luZ3VsYXJUZXJtTm9kZSA9IGJyYWNrZXRlZFRlcm1Ob2RlLmdldFNpbmd1bGFyVGVybU5vZGUoKTtcblxuICAgICAgaWYgKHNpbmd1bGFyVGVybU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdGVybVVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1VbmlmaWVzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnJhY2tldGxlc3NUZXJtTm9kZSA9IHNpbmd1bGFyVGVybU5vZGUsIC8vL1xuICAgICAgICAgICAgYnJhY2tldGxlc3NUZXJtID0gdGVybUZyb21UZXJtTm9kZShicmFja2V0bGVzc1Rlcm1Ob2RlLCBjb250ZXh0KTtcblxuICAgICAgYnJhY2tldGxlc3NUZXJtLnZhbGlkYXRlKGNvbnRleHQsIChicmFja2V0bGVzc1Rlcm0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKGJyYWNrZXRsZXNzVGVybSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHRlcm1VbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1VbmlmaWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0ZXJtVW5pZmllcztcblxuICAgICAgICBjb25zdCB0eXBlID0gYnJhY2tldGxlc3NUZXJtLmdldFR5cGUoKSxcbiAgICAgICAgICAgICAgcHJvdmlzaW9uYWwgPSBicmFja2V0bGVzc1Rlcm0uaXNQcm92aXNpb25hbCgpO1xuXG4gICAgICAgIGJyYWNrZXRlZFRlcm0uc2V0VHlwZSh0eXBlKTtcblxuICAgICAgICBicmFja2V0ZWRUZXJtLnNldFByb3Zpc2lvbmFsKHByb3Zpc2lvbmFsKTtcblxuICAgICAgICB0ZXJtVW5pZmllcyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gd2l0aCB0aGUgYnJhY2tldGVkIGNvbnN0cnVjdG9yLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih0ZXJtVW5pZmllcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJCcmFja2V0ZWRDb25zdHJ1Y3RvclwiO1xufSk7XG4iXSwibmFtZXMiOlsiZGVmaW5lIiwiQnJhY2tldGVkQ29uc3RydWN0b3IiLCJDb25zdHJ1Y3RvciIsImdldEJyYWNrZXRlZENvbnN0cnVjdG9yTm9kZSIsIm5vZGUiLCJnZXROb2RlIiwiYnJhY2tldGVkQ29uc3RydWN0b3JOb2RlIiwidW5pZnlUZXJtIiwidGVybSIsImNvbnRleHQiLCJjb250aW51YXRpb24iLCJ0ZXJtU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ0ZXJtVW5pZmllcyIsImJyYWNrZXRlZFRlcm0iLCJicmFja2V0ZWRUZXJtTm9kZSIsInNpbmd1bGFyVGVybU5vZGUiLCJnZXRTaW5ndWxhclRlcm1Ob2RlIiwiYnJhY2tldGxlc3NUZXJtTm9kZSIsImJyYWNrZXRsZXNzVGVybSIsInRlcm1Gcm9tVGVybU5vZGUiLCJ2YWxpZGF0ZSIsInR5cGUiLCJnZXRUeXBlIiwicHJvdmlzaW9uYWwiLCJpc1Byb3Zpc2lvbmFsIiwic2V0VHlwZSIsInNldFByb3Zpc2lvbmFsIiwiZGVidWciLCJuYW1lIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFPQTs7O2VBQUE7OztvRUFMd0I7MEJBRUQ7eUJBQ1U7Ozs7OztNQUVqQyxXQUFlQSxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLDZCQUE2QkMsb0JBQVc7SUFDbEVDLDhCQUE4QjtRQUM1QixNQUFNQyxPQUFPLElBQUksQ0FBQ0MsT0FBTyxJQUNuQkMsMkJBQTJCRixNQUFPLEdBQUc7UUFFM0MsT0FBT0U7SUFDVDtJQUVBQyxVQUFVQyxJQUFJLEVBQUVDLE9BQU8sRUFBRUMsWUFBWSxFQUFFO1FBQ3JDLE1BQU1DLGFBQWFILEtBQUtJLFNBQVM7UUFFakNILFFBQVFJLEtBQUssQ0FBQyxDQUFDLGNBQWMsRUFBRUYsV0FBVyx3Q0FBd0MsQ0FBQztRQUVuRixLQUFLLENBQUNKLFVBQVVDLE1BQU1DLFNBQVMsQ0FBQ0s7WUFDOUIsSUFBSSxDQUFDQSxhQUFhO2dCQUNoQixPQUFPSixhQUFhSTtZQUN0QjtZQUVBLE1BQU1DLGdCQUFnQlAsTUFDaEJRLG9CQUFvQkQsY0FBY1YsT0FBTyxJQUN6Q1ksbUJBQW1CRCxrQkFBa0JFLG1CQUFtQjtZQUU5RCxJQUFJRCxxQkFBcUIsTUFBTTtnQkFDN0IsTUFBTUgsY0FBYztnQkFFcEIsT0FBT0osYUFBYUk7WUFDdEI7WUFFQSxNQUFNSyxzQkFBc0JGLGtCQUN0Qkcsa0JBQWtCQyxJQUFBQSx5QkFBZ0IsRUFBQ0YscUJBQXFCVjtZQUU5RFcsZ0JBQWdCRSxRQUFRLENBQUNiLFNBQVMsQ0FBQ1csaUJBQWlCWDtnQkFDbEQsSUFBSVcsb0JBQW9CLE1BQU07b0JBQzVCLE1BQU1OLGNBQWM7b0JBRXBCLE9BQU9KLGFBQWFJO2dCQUN0QjtnQkFFQSxJQUFJQTtnQkFFSixNQUFNUyxPQUFPSCxnQkFBZ0JJLE9BQU8sSUFDOUJDLGNBQWNMLGdCQUFnQk0sYUFBYTtnQkFFakRYLGNBQWNZLE9BQU8sQ0FBQ0o7Z0JBRXRCUixjQUFjYSxjQUFjLENBQUNIO2dCQUU3QlgsY0FBYztnQkFFZCxJQUFJQSxhQUFhO29CQUNmTCxRQUFRb0IsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUVsQixXQUFXLHNDQUFzQyxDQUFDO2dCQUNyRjtnQkFFQSxPQUFPRCxhQUFhSTtZQUN0QjtRQUNGO0lBQ0Y7SUFFQSxPQUFPZ0IsT0FBTyx1QkFBdUI7QUFDdkMifQ==
@@ -129,30 +129,34 @@ const _default = (0, _elements.define)(class Constructor extends _occamlanguages
129
129
  });
130
130
  }
131
131
  unifyTerm(term, context, continuation) {
132
- let termUnifies = false;
133
132
  const termString = term.getString(), includeType = true, constructorString = this.getString(includeType); ///
134
133
  context.trace(`Unifying the '${termString}' term with the '${constructorString}' constructor...`);
135
- const hypothesesDiscardedGivenTerm = this.dischargeHypothesesGivenTerm(term, context);
136
- if (hypothesesDiscardedGivenTerm) {
137
- const constructor = this, constructorContext = constructor.getContext(), generalContext = constructorContext, specifiContext = context, termUnifiesWithConstructor = (0, _unify.unifyTermWithConstructor)(term, constructor, generalContext, specifiContext);
138
- if (termUnifiesWithConstructor) {
134
+ this.dischargeHypothesesGivenTerm(term, context, (hypothesesDiscardedGivenTerm)=>{
135
+ if (!hypothesesDiscardedGivenTerm) {
136
+ const termUnifies = false;
137
+ return continuation(termUnifies);
138
+ }
139
+ const constructor = this, constructorContext = constructor.getContext(), generalContext = constructorContext, specifiContext = context; ///
140
+ (0, _unify.unifyTermWithConstructor)(term, constructor, generalContext, specifiContext, (termUnifiesWithConstructor)=>{
141
+ if (!termUnifiesWithConstructor) {
142
+ const termUnifies = false;
143
+ return continuation(termUnifies);
144
+ }
145
+ let termUnifies;
139
146
  const provisional = this.type.isProvisional();
140
147
  term.setType(this.type);
141
148
  term.setProvisional(provisional);
142
- const validatesForwards = validateForwards(term, context);
143
- if (validatesForwards) {
144
- termUnifies = true;
149
+ termUnifies = true;
150
+ if (termUnifies) {
151
+ context.debug(`...unified the '${termString}' term with the '${constructorString}' constructor.`);
145
152
  }
146
- }
147
- }
148
- if (termUnifies) {
149
- context.debug(`...unified the '${termString}' term with the '${constructorString}' constructor.`);
150
- }
151
- return termUnifies;
153
+ return continuation(termUnifies);
154
+ });
155
+ });
152
156
  }
153
- dischargeHypothesisGivenTerm(hypothesis, term, context) {
157
+ dischargeHypothesisGivenTerm(hypothesis, term, context, continuation) {
154
158
  let hypothesisDischargesGivenTerm;
155
- this.break(context);
159
+ debugger;
156
160
  const termString = term.getString(), hypothesisString = hypothesis.getString(), constructorString = this.getString(); ///
157
161
  context.trace(`Discharding the '${constructorString}' constructor's '${hypothesisString}' hypothesis given the '${termString}' term...`);
158
162
  hypothesisDischargesGivenTerm = hypothesis.dischargeGivenTerm(term, context);
@@ -161,18 +165,15 @@ const _default = (0, _elements.define)(class Constructor extends _occamlanguages
161
165
  }
162
166
  return hypothesisDischargesGivenTerm;
163
167
  }
164
- dischargeHypothesesGivenTerm(term, context) {
165
- let hypothesesDischargesGivenTerm = true; ///
168
+ dischargeHypothesesGivenTerm(term, context, continuation) {
166
169
  const hypothetical = this.isHypothetical();
167
- if (hypothetical) {
168
- hypothesesDischargesGivenTerm = every(this.hypotheses, (hypothesis)=>{
169
- const hypothesisDischarges = this.dischargeHypothesisGivenTerm(hypothesis, term, context);
170
- if (hypothesisDischarges) {
171
- return true;
172
- }
173
- });
170
+ if (!hypothetical) {
171
+ const hypothesesDischargesGivenTerm = true; ///
172
+ return continuation(hypothesesDischargesGivenTerm);
174
173
  }
175
- return hypothesesDischargesGivenTerm;
174
+ return every(this.hypotheses, (hypothesis, continuation)=>{
175
+ this.dischargeHypothesisGivenTerm(hypothesis, term, context, continuation);
176
+ }, continuation);
176
177
  }
177
178
  toJSON() {
178
179
  const context = this.getContext();
@@ -204,4 +205,4 @@ const _default = (0, _elements.define)(class Constructor extends _occamlanguages
204
205
  }
205
206
  });
206
207
 
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cnVjdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFbGVtZW50LCBicmVha1BvaW50VXRpbGl0aWVzLCBjb250aW51YXRpb25VdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250aW51YXRpb25cIjtcbmltcG9ydCB7IGJhc2VUeXBlRnJvbU5vdGhpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3R5cGVcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZSB9IGZyb20gXCIuLi9wcm9jZXNzL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRlcm1Gcm9tQ29uc3RydWN0b3JOb2RlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyB1bmlmeVRlcm1XaXRoQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9wcm9jZXNzL3ZhbGlkYXRlXCI7XG5pbXBvcnQgeyB0eXBlRnJvbUpTT04sIHR5cGVUb1R5cGVKU09OIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9qc29uXCI7XG5pbXBvcnQgeyBhdHRlbXB0LCBzZXJpYWxpc2UsIHVuc2VyaWFsaXNlLCBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuXG5jb25zdCB7IGV2ZXJ5IH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBDb25zdHJ1Y3RvciBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRlcm0sIHR5cGUsIGh5cG90aGVzZXMpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaHlwb3RoZXNlcyA9IGh5cG90aGVzZXM7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXRIeXBvdGhlc2VzKCkge1xuICAgIHJldHVybiB0aGlzLmh5cG90aGVzZXM7XG4gIH1cblxuICBzZXRIeXBvdGhlc2VzKGh5cG90aGVzZXMpIHtcbiAgICB0aGlzLmh5cG90aGVzZXMgPSBoeXBvdGhlc2VzO1xuICB9XG5cbiAgaXNIeXBvdGhldGljYWwoKSB7XG4gICAgY29uc3QgaHlwb3RoZXNlc0xlbmd0aCA9IHRoaXMuaHlwb3RoZXNlcy5sZW5ndGgsXG4gICAgICAgICAgaHlwb3RoZXRpY2FsID0gKGh5cG90aGVzZXNMZW5ndGggPiAwKTtcblxuICAgIHJldHVybiBoeXBvdGhldGljYWw7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3Rvck5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBjb25zdHJ1Y3Rvck5vZGU7XG4gIH1cblxuICBnZXRTdHJpbmcoaW5jbHVkZVR5cGUgPSB0cnVlKSB7XG4gICAgbGV0IHN0cmluZztcblxuICAgIGlmIChpbmNsdWRlVHlwZSkge1xuICAgICAgY29uc3QgdGVybVN0cmluZyA9IHRoaXMudGVybS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0aGlzLnR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIHN0cmluZyA9IGAke3Rlcm1TdHJpbmd9LiR7dHlwZVN0cmluZ31gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmcgPSBzdXBlci5nZXRTdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgc2V0VHlwZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIHZlcmlmeShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuLi5gKTtcblxuICAgIGF0dGVtcHQoKGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVUZXJtKGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzKSA9PiB7XG4gICAgICAgIGlmICh0ZXJtVmFsaWRhdGVzKSB7XG4gICAgICAgICAgdmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcmlmaWVzKSB7XG4gICAgICAgICAgdGhpcy5jb21taXQoY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3Rvci5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odmVyaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVRlcm0oY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgaW5jbHVkZVR5cGUgPSBmYWxzZSxcbiAgICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGluY2x1ZGVUeXBlKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLi4uYCk7XG5cbiAgICBjb25zdCB2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlID0gdGhpcy52YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlLmJpbmQodGhpcyksXG4gICAgICAgICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvciA9IHRoaXMudmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3Rvci5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGV4aXN0cyhbXG4gICAgICB2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlLFxuICAgICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvclxuICAgIF0sIGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzKSA9PiB7XG4gICAgICBpZiAodGVybVZhbGlkYXRlcykge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1WYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBoeXBvdGh0aWNhbCA9IHRoaXMuaXNIeXBvdGhldGljYWwoKTtcblxuICAgIGlmICghaHlwb3RodGljYWwpIHtcbiAgICAgIGNvbnN0IHRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzVmFyaWFibGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yJ3MgdGVybS4uLmApO1xuXG4gICAgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZSh0aGlzLnRlcm0sIGNvbnRleHQsICh0ZXJtLCBjb250ZXh0KSA9PiB7XG4gICAgICBsZXQgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdHlwZSA9IHRlcm0uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICAgIGlmICh0eXBlID09PSBiYXNlVHlwZSkge1xuICAgICAgICB0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlVGVybUFzQ29uc3RydWN0b3IoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgaHlwb3RodGljYWwgPSB0aGlzLmlzSHlwb3RoZXRpY2FsKCk7XG5cbiAgICBpZiAoaHlwb3RodGljYWwpIHtcbiAgICAgIGNvbnN0IHRlcm1WYWxpZGF0ZXNBc0NvbnN0cnVjdG9yID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yJ3MgdGVybS4uLmApO1xuXG4gICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3Rvcih0aGlzLnRlcm0sIGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzQXNDb25zdHJ1Y3RvcikgPT4ge1xuICAgICAgaWYgKHRlcm1WYWxpZGF0ZXNBc0NvbnN0cnVjdG9yKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3RvcidzIHRlcm0uYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5pZnlUZXJtKHRlcm0sIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCB0ZXJtVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgdGVybVN0cmluZyA9IHRlcm0uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgaW5jbHVkZVR5cGUgPSB0cnVlLFxuICAgICAgICAgIGNvbnN0cnVjdG9yU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoaW5jbHVkZVR5cGUpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gd2l0aCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3Rvci4uLmApO1xuXG4gICAgY29uc3QgaHlwb3RoZXNlc0Rpc2NhcmRlZEdpdmVuVGVybSA9IHRoaXMuZGlzY2hhcmdlSHlwb3RoZXNlc0dpdmVuVGVybSh0ZXJtLCBjb250ZXh0KTtcblxuICAgIGlmIChoeXBvdGhlc2VzRGlzY2FyZGVkR2l2ZW5UZXJtKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMsIC8vL1xuICAgICAgICAgICAgY29uc3RydWN0b3JDb250ZXh0ID0gY29uc3RydWN0b3IuZ2V0Q29udGV4dCgpLFxuICAgICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBjb25zdHJ1Y3RvckNvbnRleHQsICAvLy9cbiAgICAgICAgICAgIHNwZWNpZmlDb250ZXh0ID0gY29udGV4dCwgLy8vXG4gICAgICAgICAgICB0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvciA9IHVuaWZ5VGVybVdpdGhDb25zdHJ1Y3Rvcih0ZXJtLCBjb25zdHJ1Y3RvciwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmlDb250ZXh0KTtcblxuICAgICAgaWYgKHRlcm1VbmlmaWVzV2l0aENvbnN0cnVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHByb3Zpc2lvbmFsID0gdGhpcy50eXBlLmlzUHJvdmlzaW9uYWwoKTtcblxuICAgICAgICB0ZXJtLnNldFR5cGUodGhpcy50eXBlKTtcblxuICAgICAgICB0ZXJtLnNldFByb3Zpc2lvbmFsKHByb3Zpc2lvbmFsKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZXNGb3J3YXJkcyA9IHZhbGlkYXRlRm9yd2FyZHModGVybSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlc0ZvcndhcmRzKSB7XG4gICAgICAgICAgdGVybVVuaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSB3aXRoIHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yLmApO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXJtVW5pZmllcztcbiAgfVxuXG4gIGRpc2NoYXJnZUh5cG90aGVzaXNHaXZlblRlcm0oaHlwb3RoZXNpcywgdGVybSwgY29udGV4dCkge1xuICAgIGxldCBoeXBvdGhlc2lzRGlzY2hhcmdlc0dpdmVuVGVybTtcblxuICAgIHRoaXMuYnJlYWsoY29udGV4dCk7XG5cbiAgICBjb25zdCB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBoeXBvdGhlc2lzU3RyaW5nID0gaHlwb3RoZXNpcy5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgRGlzY2hhcmRpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyAnJHtoeXBvdGhlc2lzU3RyaW5nfScgaHlwb3RoZXNpcyBnaXZlbiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0uLi5gKTtcblxuICAgIGh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtID0gaHlwb3RoZXNpcy5kaXNjaGFyZ2VHaXZlblRlcm0odGVybSwgY29udGV4dCk7XG5cbiAgICBpZiAoaHlwb3RoZXNpc0Rpc2NoYXJnZXNHaXZlblRlcm0pIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLmRpc2NoYXJnZXMgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyAnJHtoeXBvdGhlc2lzU3RyaW5nfScgaHlwb3RoZXNpcyBnaXZlbiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtO1xuICB9XG5cbiAgZGlzY2hhcmdlSHlwb3RoZXNlc0dpdmVuVGVybSh0ZXJtLCBjb250ZXh0KSB7XG4gICAgbGV0IGh5cG90aGVzZXNEaXNjaGFyZ2VzR2l2ZW5UZXJtID0gdHJ1ZTsgIC8vL1xuXG4gICAgY29uc3QgaHlwb3RoZXRpY2FsID0gdGhpcy5pc0h5cG90aGV0aWNhbCgpO1xuXG4gICAgaWYgKGh5cG90aGV0aWNhbCkge1xuICAgICAgaHlwb3RoZXNlc0Rpc2NoYXJnZXNHaXZlblRlcm0gPSBldmVyeSh0aGlzLmh5cG90aGVzZXMsIChoeXBvdGhlc2lzKSA9PiB7XG4gICAgICAgIGNvbnN0IGh5cG90aGVzaXNEaXNjaGFyZ2VzID0gdGhpcy5kaXNjaGFyZ2VIeXBvdGhlc2lzR2l2ZW5UZXJtKGh5cG90aGVzaXMsIHRlcm0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChoeXBvdGhlc2lzRGlzY2hhcmdlcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaHlwb3RoZXNlc0Rpc2NoYXJnZXNHaXZlblRlcm07XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcmV0dXJuIHNlcmlhbGlzZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVR5cGUgPSBmYWxzZSxcbiAgICAgICAgICAgIHR5cGVKU09OID0gdHlwZVRvVHlwZUpTT04odGhpcy50eXBlKSxcbiAgICAgICAgICAgIHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGluY2x1ZGVUeXBlKTtcblxuICAgICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICAgIGJyZWFrUG9pbnQgPSB0aGlzLmdldEJyZWFrUG9pbnQoKTtcblxuICAgICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlSlNPTiwgIC8vL1xuICAgICAgICAgICAganNvbiA9IHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBicmVha1BvaW50LFxuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9O1xuXG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJDb25zdHJ1Y3RvclwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnN0cnVjdG9yO1xuXG4gICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHVuc2VyaWFsaXNlKChqc29uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3Rvck5vZGUgPSBpbnN0YW50aWF0ZUNvbnN0cnVjdG9yKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICAgIG5vZGUgPSBjb25zdHJ1Y3Rvck5vZGUsIC8vL1xuICAgICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgICB0ZXJtID0gdGVybUZyb21Db25zdHJ1Y3Rvck5vZGUoY29uc3RydWN0b3JOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgdHlwZSA9IHR5cGVGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdHJ1Y3RvciA9IG5ldyBDb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRlcm0sIHR5cGUpO1xuICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gIH1cbn0pO1xuIl0sIm5hbWVzIjpbImV2ZXJ5IiwiY29udGludWF0aW9uVXRpbGl0aWVzIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiQ29uc3RydWN0b3IiLCJFbGVtZW50IiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwidGVybSIsInR5cGUiLCJoeXBvdGhlc2VzIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRIeXBvdGhlc2VzIiwic2V0SHlwb3RoZXNlcyIsImlzSHlwb3RoZXRpY2FsIiwiaHlwb3RoZXNlc0xlbmd0aCIsImxlbmd0aCIsImh5cG90aGV0aWNhbCIsImdldENvbnN0cnVjdG9yTm9kZSIsImdldE5vZGUiLCJjb25zdHJ1Y3Rvck5vZGUiLCJnZXRTdHJpbmciLCJpbmNsdWRlVHlwZSIsInRlcm1TdHJpbmciLCJ0eXBlU3RyaW5nIiwic2V0VHlwZSIsInZlcmlmeSIsImNvbnRpbnVhdGlvbiIsInZlcmlmaWVzIiwiY29uc3RydWN0b3JTdHJpbmciLCJ0cmFjZSIsImF0dGVtcHQiLCJ2YWxpZGF0ZVRlcm0iLCJ0ZXJtVmFsaWRhdGVzIiwiY29tbWl0IiwiZGVidWciLCJ2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlIiwiYmluZCIsInZhbGlkYXRlVGVybUFzQ29uc3RydWN0b3IiLCJleGlzdHMiLCJoeXBvdGh0aWNhbCIsInRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlIiwiYmFzZVR5cGUiLCJiYXNlVHlwZUZyb21Ob3RoaW5nIiwidGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IiLCJ1bmlmeVRlcm0iLCJ0ZXJtVW5pZmllcyIsImh5cG90aGVzZXNEaXNjYXJkZWRHaXZlblRlcm0iLCJkaXNjaGFyZ2VIeXBvdGhlc2VzR2l2ZW5UZXJtIiwiY29uc3RydWN0b3IiLCJjb25zdHJ1Y3RvckNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpQ29udGV4dCIsInRlcm1VbmlmaWVzV2l0aENvbnN0cnVjdG9yIiwidW5pZnlUZXJtV2l0aENvbnN0cnVjdG9yIiwicHJvdmlzaW9uYWwiLCJpc1Byb3Zpc2lvbmFsIiwic2V0UHJvdmlzaW9uYWwiLCJ2YWxpZGF0ZXNGb3J3YXJkcyIsInZhbGlkYXRlRm9yd2FyZHMiLCJkaXNjaGFyZ2VIeXBvdGhlc2lzR2l2ZW5UZXJtIiwiaHlwb3RoZXNpcyIsImh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtIiwiYnJlYWsiLCJoeXBvdGhlc2lzU3RyaW5nIiwiZGlzY2hhcmdlR2l2ZW5UZXJtIiwiaHlwb3RoZXNlc0Rpc2NoYXJnZXNHaXZlblRlcm0iLCJoeXBvdGhlc2lzRGlzY2hhcmdlcyIsInRvSlNPTiIsInNlcmlhbGlzZSIsInR5cGVKU09OIiwidHlwZVRvVHlwZUpTT04iLCJnZXRCcmVha1BvaW50IiwiYnJlYWtQb2ludEpTT04iLCJqc29uIiwibmFtZSIsImZyb21KU09OIiwiaW5zdGFudGlhdGUiLCJ1bnNlcmlhbGlzZSIsImluc3RhbnRpYXRlQ29uc3RydWN0b3IiLCJ0ZXJtRnJvbUNvbnN0cnVjdG9yTm9kZSIsInR5cGVGcm9tSlNPTiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBa0JBOzs7ZUFBQTs7O2dDQWhCb0U7MEJBRTdDOzhCQUNBO3NCQUNhOzZCQUNHOzRCQUNBO3lCQUNDO3VCQUNDOzBCQUNDO3NCQUNHO3lCQUNnQjtBQUU3RCxNQUFNLEVBQUVBLEtBQUssRUFBRSxHQUFHQyxxQ0FBcUIsRUFDakMsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLG9CQUFvQkMsdUJBQU87SUFDckQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsVUFBVSxDQUFFO1FBQ3JFLEtBQUssQ0FBQ04sU0FBU0MsUUFBUUMsTUFBTUM7UUFFN0IsSUFBSSxDQUFDQyxJQUFJLEdBQUdBO1FBQ1osSUFBSSxDQUFDQyxJQUFJLEdBQUdBO1FBQ1osSUFBSSxDQUFDQyxVQUFVLEdBQUdBO0lB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
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cnVjdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBFbGVtZW50LCBicmVha1BvaW50VXRpbGl0aWVzLCBjb250aW51YXRpb25VdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250aW51YXRpb25cIjtcbmltcG9ydCB7IGJhc2VUeXBlRnJvbU5vdGhpbmcgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3R5cGVcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZSB9IGZyb20gXCIuLi9wcm9jZXNzL3ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRlcm1Gcm9tQ29uc3RydWN0b3JOb2RlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyB1bmlmeVRlcm1XaXRoQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9wcm9jZXNzL3ZhbGlkYXRlXCI7XG5pbXBvcnQgeyB0eXBlRnJvbUpTT04sIHR5cGVUb1R5cGVKU09OIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9qc29uXCI7XG5pbXBvcnQgeyBhdHRlbXB0LCBzZXJpYWxpc2UsIHVuc2VyaWFsaXNlLCBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuXG5jb25zdCB7IGV2ZXJ5IH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBDb25zdHJ1Y3RvciBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRlcm0sIHR5cGUsIGh5cG90aGVzZXMpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy50ZXJtID0gdGVybTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaHlwb3RoZXNlcyA9IGh5cG90aGVzZXM7XG4gIH1cblxuICBnZXRUZXJtKCkge1xuICAgIHJldHVybiB0aGlzLnRlcm07XG4gIH1cblxuICBnZXRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBnZXRIeXBvdGhlc2VzKCkge1xuICAgIHJldHVybiB0aGlzLmh5cG90aGVzZXM7XG4gIH1cblxuICBzZXRIeXBvdGhlc2VzKGh5cG90aGVzZXMpIHtcbiAgICB0aGlzLmh5cG90aGVzZXMgPSBoeXBvdGhlc2VzO1xuICB9XG5cbiAgaXNIeXBvdGhldGljYWwoKSB7XG4gICAgY29uc3QgaHlwb3RoZXNlc0xlbmd0aCA9IHRoaXMuaHlwb3RoZXNlcy5sZW5ndGgsXG4gICAgICAgICAgaHlwb3RoZXRpY2FsID0gKGh5cG90aGVzZXNMZW5ndGggPiAwKTtcblxuICAgIHJldHVybiBoeXBvdGhldGljYWw7XG4gIH1cblxuICBnZXRDb25zdHJ1Y3Rvck5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cnVjdG9yTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBjb25zdHJ1Y3Rvck5vZGU7XG4gIH1cblxuICBnZXRTdHJpbmcoaW5jbHVkZVR5cGUgPSB0cnVlKSB7XG4gICAgbGV0IHN0cmluZztcblxuICAgIGlmIChpbmNsdWRlVHlwZSkge1xuICAgICAgY29uc3QgdGVybVN0cmluZyA9IHRoaXMudGVybS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHR5cGVTdHJpbmcgPSB0aGlzLnR5cGUuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIHN0cmluZyA9IGAke3Rlcm1TdHJpbmd9LiR7dHlwZVN0cmluZ31gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmcgPSBzdXBlci5nZXRTdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgc2V0VHlwZSh0eXBlKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIHZlcmlmeShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdmVyaWZpZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuLi5gKTtcblxuICAgIGF0dGVtcHQoKGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVUZXJtKGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzKSA9PiB7XG4gICAgICAgIGlmICh0ZXJtVmFsaWRhdGVzKSB7XG4gICAgICAgICAgdmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZlcmlmaWVzKSB7XG4gICAgICAgICAgdGhpcy5jb21taXQoY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3Rvci5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odmVyaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVRlcm0oY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgaW5jbHVkZVR5cGUgPSBmYWxzZSxcbiAgICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGluY2x1ZGVUeXBlKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLi4uYCk7XG5cbiAgICBjb25zdCB2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlID0gdGhpcy52YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlLmJpbmQodGhpcyksXG4gICAgICAgICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvciA9IHRoaXMudmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3Rvci5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGV4aXN0cyhbXG4gICAgICB2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlLFxuICAgICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3RvclxuICAgIF0sIGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzKSA9PiB7XG4gICAgICBpZiAodGVybVZhbGlkYXRlcykge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1WYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBoeXBvdGh0aWNhbCA9IHRoaXMuaXNIeXBvdGhldGljYWwoKTtcblxuICAgIGlmICghaHlwb3RodGljYWwpIHtcbiAgICAgIGNvbnN0IHRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzVmFyaWFibGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yJ3MgdGVybS4uLmApO1xuXG4gICAgdmFsaWRhdGVUZXJtQXNWYXJpYWJsZSh0aGlzLnRlcm0sIGNvbnRleHQsICh0ZXJtLCBjb250ZXh0KSA9PiB7XG4gICAgICBsZXQgdGVybVZhbGlkYXRlc0FzVmFyaWFibGUgPSBmYWxzZTtcblxuICAgICAgY29uc3QgdHlwZSA9IHRlcm0uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgYmFzZVR5cGUgPSBiYXNlVHlwZUZyb21Ob3RoaW5nKCk7XG5cbiAgICAgIGlmICh0eXBlID09PSBiYXNlVHlwZSkge1xuICAgICAgICB0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXJtVmFsaWRhdGVzQXNWYXJpYWJsZSkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyB0ZXJtLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlVGVybUFzQ29uc3RydWN0b3IoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgaHlwb3RodGljYWwgPSB0aGlzLmlzSHlwb3RoZXRpY2FsKCk7XG5cbiAgICBpZiAoaHlwb3RodGljYWwpIHtcbiAgICAgIGNvbnN0IHRlcm1WYWxpZGF0ZXNBc0NvbnN0cnVjdG9yID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGluY2x1ZGVUeXBlID0gZmFsc2UsXG4gICAgICAgICAgY29uc3RydWN0b3JTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhpbmNsdWRlVHlwZSk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yJ3MgdGVybS4uLmApO1xuXG4gICAgdmFsaWRhdGVUZXJtQXNDb25zdHJ1Y3Rvcih0aGlzLnRlcm0sIGNvbnRleHQsICh0ZXJtVmFsaWRhdGVzQXNDb25zdHJ1Y3RvcikgPT4ge1xuICAgICAgaWYgKHRlcm1WYWxpZGF0ZXNBc0NvbnN0cnVjdG9yKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3RvcidzIHRlcm0uYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5pZnlUZXJtKHRlcm0sIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0ZXJtLmdldFN0cmluZygpLFxuICAgICAgICAgIGluY2x1ZGVUeXBlID0gdHJ1ZSxcbiAgICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGluY2x1ZGVUeXBlKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIHdpdGggdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuLi5gKTtcblxuICAgIHRoaXMuZGlzY2hhcmdlSHlwb3RoZXNlc0dpdmVuVGVybSh0ZXJtLCBjb250ZXh0LCAoaHlwb3RoZXNlc0Rpc2NhcmRlZEdpdmVuVGVybSkgPT4ge1xuICAgICAgaWYgKCFoeXBvdGhlc2VzRGlzY2FyZGVkR2l2ZW5UZXJtKSB7XG4gICAgICAgIGNvbnN0IHRlcm1VbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih0ZXJtVW5pZmllcyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcywgLy8vXG4gICAgICAgICAgICBjb25zdHJ1Y3RvckNvbnRleHQgPSBjb25zdHJ1Y3Rvci5nZXRDb250ZXh0KCksXG4gICAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnN0cnVjdG9yQ29udGV4dCwgIC8vL1xuICAgICAgICAgICAgc3BlY2lmaUNvbnRleHQgPSBjb250ZXh0OyAvLy9cblxuICAgICAgdW5pZnlUZXJtV2l0aENvbnN0cnVjdG9yKHRlcm0sIGNvbnN0cnVjdG9yLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaUNvbnRleHQsICh0ZXJtVW5pZmllc1dpdGhDb25zdHJ1Y3RvcikgPT4ge1xuICAgICAgICBpZiAoIXRlcm1VbmlmaWVzV2l0aENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgdGVybVVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVVuaWZpZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRlcm1VbmlmaWVzO1xuXG4gICAgICAgIGNvbnN0IHByb3Zpc2lvbmFsID0gdGhpcy50eXBlLmlzUHJvdmlzaW9uYWwoKTtcblxuICAgICAgICB0ZXJtLnNldFR5cGUodGhpcy50eXBlKTtcblxuICAgICAgICB0ZXJtLnNldFByb3Zpc2lvbmFsKHByb3Zpc2lvbmFsKTtcblxuICAgICAgICB0ZXJtVW5pZmllcyA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRlcm1VbmlmaWVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gd2l0aCB0aGUgJyR7Y29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3Rvci5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odGVybVVuaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjaGFyZ2VIeXBvdGhlc2lzR2l2ZW5UZXJtKGh5cG90aGVzaXMsIHRlcm0sIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCBoeXBvdGhlc2lzRGlzY2hhcmdlc0dpdmVuVGVybTtcblxuICAgIGRlYnVnZ2VyXG5cbiAgICBjb25zdCB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBoeXBvdGhlc2lzU3RyaW5nID0gaHlwb3RoZXNpcy5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgRGlzY2hhcmRpbmcgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyAnJHtoeXBvdGhlc2lzU3RyaW5nfScgaHlwb3RoZXNpcyBnaXZlbiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0uLi5gKTtcblxuICAgIGh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtID0gaHlwb3RoZXNpcy5kaXNjaGFyZ2VHaXZlblRlcm0odGVybSwgY29udGV4dCk7XG5cbiAgICBpZiAoaHlwb3RoZXNpc0Rpc2NoYXJnZXNHaXZlblRlcm0pIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLmRpc2NoYXJnZXMgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IncyAnJHtoeXBvdGhlc2lzU3RyaW5nfScgaHlwb3RoZXNpcyBnaXZlbiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtO1xuICB9XG5cbiAgZGlzY2hhcmdlSHlwb3RoZXNlc0dpdmVuVGVybSh0ZXJtLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBoeXBvdGhldGljYWwgPSB0aGlzLmlzSHlwb3RoZXRpY2FsKCk7XG5cbiAgICBpZiAoIWh5cG90aGV0aWNhbCkge1xuICAgICAgY29uc3QgaHlwb3RoZXNlc0Rpc2NoYXJnZXNHaXZlblRlcm0gPSB0cnVlOyAgLy8vXG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oaHlwb3RoZXNlc0Rpc2NoYXJnZXNHaXZlblRlcm0pO1xuICAgIH1cblxuICAgIHJldHVybiBldmVyeSh0aGlzLmh5cG90aGVzZXMsIChoeXBvdGhlc2lzLCBjb250aW51YXRpb24pID0+IHtcbiAgICAgIHRoaXMuZGlzY2hhcmdlSHlwb3RoZXNpc0dpdmVuVGVybShoeXBvdGhlc2lzLCB0ZXJtLCBjb250ZXh0LCBjb250aW51YXRpb24pO1xuICAgIH0sIGNvbnRpbnVhdGlvbik7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcmV0dXJuIHNlcmlhbGlzZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZVR5cGUgPSBmYWxzZSxcbiAgICAgICAgICAgIHR5cGVKU09OID0gdHlwZVRvVHlwZUpTT04odGhpcy50eXBlKSxcbiAgICAgICAgICAgIHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGluY2x1ZGVUeXBlKTtcblxuICAgICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICAgIGJyZWFrUG9pbnQgPSB0aGlzLmdldEJyZWFrUG9pbnQoKTtcblxuICAgICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlSlNPTiwgIC8vL1xuICAgICAgICAgICAganNvbiA9IHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBicmVha1BvaW50LFxuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9O1xuXG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJDb25zdHJ1Y3RvclwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnN0cnVjdG9yO1xuXG4gICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHVuc2VyaWFsaXNlKChqc29uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3Rvck5vZGUgPSBpbnN0YW50aWF0ZUNvbnN0cnVjdG9yKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICAgIG5vZGUgPSBjb25zdHJ1Y3Rvck5vZGUsIC8vL1xuICAgICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgICB0ZXJtID0gdGVybUZyb21Db25zdHJ1Y3Rvck5vZGUoY29uc3RydWN0b3JOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgdHlwZSA9IHR5cGVGcm9tSlNPTihqc29uLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdHJ1Y3RvciA9IG5ldyBDb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHRlcm0sIHR5cGUpO1xuICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gIH1cbn0pO1xuIl0sIm5hbWVzIjpbImV2ZXJ5IiwiY29udGludWF0aW9uVXRpbGl0aWVzIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiQ29uc3RydWN0b3IiLCJFbGVtZW50IiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwidGVybSIsInR5cGUiLCJoeXBvdGhlc2VzIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRIeXBvdGhlc2VzIiwic2V0SHlwb3RoZXNlcyIsImlzSHlwb3RoZXRpY2FsIiwiaHlwb3RoZXNlc0xlbmd0aCIsImxlbmd0aCIsImh5cG90aGV0aWNhbCIsImdldENvbnN0cnVjdG9yTm9kZSIsImdldE5vZGUiLCJjb25zdHJ1Y3Rvck5vZGUiLCJnZXRTdHJpbmciLCJpbmNsdWRlVHlwZSIsInRlcm1TdHJpbmciLCJ0eXBlU3RyaW5nIiwic2V0VHlwZSIsInZlcmlmeSIsImNvbnRpbnVhdGlvbiIsInZlcmlmaWVzIiwiY29uc3RydWN0b3JTdHJpbmciLCJ0cmFjZSIsImF0dGVtcHQiLCJ2YWxpZGF0ZVRlcm0iLCJ0ZXJtVmFsaWRhdGVzIiwiY29tbWl0IiwiZGVidWciLCJ2YWxpZGF0ZVRlcm1Bc1ZhcmlhYmxlIiwiYmluZCIsInZhbGlkYXRlVGVybUFzQ29uc3RydWN0b3IiLCJleGlzdHMiLCJoeXBvdGh0aWNhbCIsInRlcm1WYWxpZGF0ZXNBc1ZhcmlhYmxlIiwiYmFzZVR5cGUiLCJiYXNlVHlwZUZyb21Ob3RoaW5nIiwidGVybVZhbGlkYXRlc0FzQ29uc3RydWN0b3IiLCJ1bmlmeVRlcm0iLCJkaXNjaGFyZ2VIeXBvdGhlc2VzR2l2ZW5UZXJtIiwiaHlwb3RoZXNlc0Rpc2NhcmRlZEdpdmVuVGVybSIsInRlcm1VbmlmaWVzIiwiY29uc3RydWN0b3IiLCJjb25zdHJ1Y3RvckNvbnRleHQiLCJnZXRDb250ZXh0IiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpQ29udGV4dCIsInVuaWZ5VGVybVdpdGhDb25zdHJ1Y3RvciIsInRlcm1VbmlmaWVzV2l0aENvbnN0cnVjdG9yIiwicHJvdmlzaW9uYWwiLCJpc1Byb3Zpc2lvbmFsIiwic2V0UHJvdmlzaW9uYWwiLCJkaXNjaGFyZ2VIeXBvdGhlc2lzR2l2ZW5UZXJtIiwiaHlwb3RoZXNpcyIsImh5cG90aGVzaXNEaXNjaGFyZ2VzR2l2ZW5UZXJtIiwiaHlwb3RoZXNpc1N0cmluZyIsImRpc2NoYXJnZUdpdmVuVGVybSIsImh5cG90aGVzZXNEaXNjaGFyZ2VzR2l2ZW5UZXJtIiwidG9KU09OIiwic2VyaWFsaXNlIiwidHlwZUpTT04iLCJ0eXBlVG9UeXBlSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJuYW1lIiwiZnJvbUpTT04iLCJpbnN0YW50aWF0ZSIsInVuc2VyaWFsaXNlIiwiaW5zdGFudGlhdGVDb25zdHJ1Y3RvciIsInRlcm1Gcm9tQ29uc3RydWN0b3JOb2RlIiwidHlwZUZyb21KU09OIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFrQkE7OztlQUFBOzs7Z0NBaEJvRTswQkFFN0M7OEJBQ0E7c0JBQ2E7NkJBQ0c7NEJBQ0E7eUJBQ0M7dUJBQ0M7MEJBQ0M7c0JBQ0c7eUJBQ2dCO0FBRTdELE1BQU0sRUFBRUEsS0FBSyxFQUFFLEdBQUdDLHFDQUFxQixFQUNqQyxFQUFFQyxrQkFBa0IsRUFBRUMsMEJBQTBCLEVBQUUsR0FBR0MsbUNBQW1CO01BRTlFLFdBQWVDLElBQUFBLGdCQUFNLEVBQUMsTUFBTUMsb0JBQW9CQyx1QkFBTztJQUNyRCxZQUFZQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxVQUFVLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxVQUFVLENBQUU7UUFDckUsS0FBSyxDQUFDTixTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLFVBQVUsR0FBR0E7SUFDcEI7SUFFQUMsVUFBVTtRQUNSLE9B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