occam-verify-cli 1.0.448 → 1.0.457

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.
Files changed (161) hide show
  1. package/lib/constants.js +1 -5
  2. package/lib/context/file.js +50 -78
  3. package/lib/context/fragment.js +77 -0
  4. package/lib/context/release.js +3 -3
  5. package/lib/context/scoped.js +314 -0
  6. package/lib/context/transient.js +371 -0
  7. package/lib/element/assumption.js +71 -84
  8. package/lib/element/combinator/bracketed.js +1 -10
  9. package/lib/element/conclusion.js +11 -8
  10. package/lib/element/constructor/bracketed.js +1 -10
  11. package/lib/element/declaration/combinator.js +1 -2
  12. package/lib/element/declaration/metavariable.js +3 -3
  13. package/lib/element/declaration/variable.js +3 -3
  14. package/lib/element/deduction.js +18 -13
  15. package/lib/element/frame.js +40 -46
  16. package/lib/element/judgement.js +35 -56
  17. package/lib/element/metaType.js +5 -4
  18. package/lib/element/metavariable.js +6 -6
  19. package/lib/element/proof.js +4 -4
  20. package/lib/element/proofAssertion/premise.js +308 -0
  21. package/lib/element/proofAssertion/step.js +305 -0
  22. package/lib/element/proofAssertion/supposition.js +322 -0
  23. package/lib/element/proofAssertion.js +5 -9
  24. package/lib/element/reference.js +24 -23
  25. package/lib/element/rule.js +4 -4
  26. package/lib/element/section.js +4 -4
  27. package/lib/element/statement.js +2 -7
  28. package/lib/element/subproof.js +4 -4
  29. package/lib/element/substitution/frame.js +7 -7
  30. package/lib/element/substitution/statement.js +15 -39
  31. package/lib/element/substitution.js +5 -5
  32. package/lib/element/term.js +12 -10
  33. package/lib/element/topLevelAssertion/axiom.js +329 -0
  34. package/lib/element/{conjecture.js → topLevelAssertion/conjecture.js} +7 -7
  35. package/lib/element/{lemma.js → topLevelAssertion/lemma.js} +6 -6
  36. package/lib/element/{theorem.js → topLevelAssertion/theorem.js} +7 -7
  37. package/lib/element/topLevelAssertion.js +427 -0
  38. package/lib/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +7 -7
  39. package/lib/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +7 -7
  40. package/lib/element/topLevelMetaAssertion.js +289 -0
  41. package/lib/element/type.js +4 -4
  42. package/lib/element/variable.js +20 -20
  43. package/lib/metaTypes.js +18 -15
  44. package/lib/node/proofAssertion/premise.js +116 -0
  45. package/lib/node/proofAssertion/step.js +152 -0
  46. package/lib/node/proofAssertion/supposition.js +116 -0
  47. package/lib/node/{premise.js → proofAssertion.js} +11 -18
  48. package/lib/node/statement.js +2 -2
  49. package/lib/node/substitution/statement.js +2 -2
  50. package/lib/node/{axiom.js → topLevelAssertion/axiom.js} +7 -7
  51. package/lib/node/{conjecture.js → topLevelAssertion/conjecture.js} +7 -7
  52. package/lib/node/{lemma.js → topLevelAssertion/lemma.js} +7 -7
  53. package/lib/node/{theorem.js → topLevelAssertion/theorem.js} +7 -7
  54. package/lib/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +9 -9
  55. package/lib/node/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +7 -7
  56. package/lib/node/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +7 -7
  57. package/lib/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +9 -9
  58. package/lib/nonTerminalNodeMap.js +13 -13
  59. package/lib/preamble.js +10 -10
  60. package/lib/process/instantiate.js +6 -9
  61. package/lib/process/unify.js +7 -6
  62. package/lib/types.js +3 -3
  63. package/lib/utilities/bnf.js +5 -5
  64. package/lib/utilities/context.js +28 -0
  65. package/lib/utilities/element.js +101 -99
  66. package/lib/utilities/fragment.js +23 -0
  67. package/lib/utilities/instance.js +12 -34
  68. package/lib/utilities/json.js +3 -2
  69. package/lib/utilities/string.js +42 -21
  70. package/lib/utilities/unification.js +17 -17
  71. package/lib/utilities/validation.js +22 -25
  72. package/package.json +2 -2
  73. package/src/constants.js +0 -1
  74. package/src/context/file.js +48 -55
  75. package/src/context/fragment.js +38 -0
  76. package/src/context/release.js +4 -2
  77. package/src/context/{local.js → scoped.js} +8 -100
  78. package/src/context/{temporary.js → transient.js} +9 -131
  79. package/src/element/assumption.js +69 -85
  80. package/src/element/combinator/bracketed.js +0 -7
  81. package/src/element/conclusion.js +14 -10
  82. package/src/element/constructor/bracketed.js +0 -7
  83. package/src/element/declaration/combinator.js +0 -1
  84. package/src/element/declaration/metavariable.js +2 -2
  85. package/src/element/declaration/variable.js +5 -5
  86. package/src/element/deduction.js +22 -15
  87. package/src/element/frame.js +36 -48
  88. package/src/element/judgement.js +33 -58
  89. package/src/element/metaType.js +4 -4
  90. package/src/element/metavariable.js +8 -6
  91. package/src/element/proof.js +3 -3
  92. package/src/element/{premise.js → proofAssertion/premise.js} +23 -23
  93. package/src/element/{step.js → proofAssertion/step.js} +32 -40
  94. package/src/element/{supposition.js → proofAssertion/supposition.js} +24 -24
  95. package/src/element/proofAssertion.js +6 -13
  96. package/src/element/reference.js +23 -21
  97. package/src/element/rule.js +3 -3
  98. package/src/element/section.js +4 -4
  99. package/src/element/statement.js +2 -9
  100. package/src/element/subproof.js +3 -3
  101. package/src/element/substitution/frame.js +10 -13
  102. package/src/element/substitution/statement.js +20 -52
  103. package/src/element/substitution.js +3 -3
  104. package/src/element/term.js +10 -9
  105. package/src/element/{axiom.js → topLevelAssertion/axiom.js} +15 -15
  106. package/src/element/{conjecture.js → topLevelAssertion/conjecture.js} +4 -4
  107. package/src/element/{lemma.js → topLevelAssertion/lemma.js} +3 -3
  108. package/src/element/{theorem.js → topLevelAssertion/theorem.js} +4 -4
  109. package/src/element/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +9 -9
  110. package/src/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +4 -4
  111. package/src/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +4 -4
  112. package/src/element/{metaLemmaMetatheorem.js → topLevelMetaAssertion.js} +7 -7
  113. package/src/element/type.js +2 -4
  114. package/src/element/variable.js +17 -17
  115. package/src/metaTypes.js +25 -9
  116. package/src/node/proofAssertion/premise.js +16 -0
  117. package/src/node/{step.js → proofAssertion/step.js} +4 -18
  118. package/src/node/proofAssertion/supposition.js +16 -0
  119. package/src/node/proofAssertion.js +23 -0
  120. package/src/node/statement.js +1 -1
  121. package/src/node/substitution/statement.js +1 -1
  122. package/src/node/topLevelAssertion/axiom.js +13 -0
  123. package/src/node/topLevelAssertion/conjecture.js +13 -0
  124. package/src/node/topLevelAssertion/lemma.js +13 -0
  125. package/src/node/topLevelAssertion/theorem.js +13 -0
  126. package/src/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +1 -1
  127. package/src/node/topLevelMetaAssertion/metaLemma.js +13 -0
  128. package/src/node/topLevelMetaAssertion/metatheorem.js +13 -0
  129. package/src/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +1 -1
  130. package/src/nonTerminalNodeMap.js +12 -12
  131. package/src/preamble.js +9 -9
  132. package/src/process/instantiate.js +31 -32
  133. package/src/process/unify.js +6 -5
  134. package/src/types.js +4 -2
  135. package/src/utilities/bnf.js +3 -2
  136. package/src/utilities/context.js +20 -0
  137. package/src/utilities/element.js +169 -162
  138. package/src/utilities/fragment.js +11 -0
  139. package/src/utilities/instance.js +19 -42
  140. package/src/utilities/json.js +3 -1
  141. package/src/utilities/string.js +53 -28
  142. package/src/utilities/unification.js +16 -16
  143. package/src/utilities/validation.js +26 -35
  144. package/lib/context/local.js +0 -605
  145. package/lib/context/temporary.js +0 -752
  146. package/lib/element/axiom.js +0 -329
  147. package/lib/element/axiomLemmaTheoremConjecture.js +0 -427
  148. package/lib/element/metaLemmaMetatheorem.js +0 -289
  149. package/lib/element/premise.js +0 -307
  150. package/lib/element/step.js +0 -311
  151. package/lib/element/supposition.js +0 -320
  152. package/lib/node/step.js +0 -166
  153. package/lib/node/supposition.js +0 -130
  154. package/src/node/axiom.js +0 -13
  155. package/src/node/conjecture.js +0 -13
  156. package/src/node/lemma.js +0 -13
  157. package/src/node/metaLemma.js +0 -13
  158. package/src/node/metatheorem.js +0 -13
  159. package/src/node/premise.js +0 -30
  160. package/src/node/supposition.js +0 -30
  161. package/src/node/theorem.js +0 -13
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _elements = /*#__PURE__*/ _interop_require_wildcard(require("../../elements"));
12
+ var _proofAssertion = /*#__PURE__*/ _interop_require_default(require("../proofAssertion"));
13
+ var _transient = /*#__PURE__*/ _interop_require_default(require("../../context/transient"));
14
+ var _unification = require("../../utilities/unification");
15
+ var _statement = require("../../utilities/statement");
16
+ function _assert_this_initialized(self) {
17
+ if (self === void 0) {
18
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
19
+ }
20
+ return self;
21
+ }
22
+ function _call_super(_this, derived, args) {
23
+ derived = _get_prototype_of(derived);
24
+ return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
25
+ }
26
+ function _class_call_check(instance, Constructor) {
27
+ if (!(instance instanceof Constructor)) {
28
+ throw new TypeError("Cannot call a class as a function");
29
+ }
30
+ }
31
+ function _defineProperties(target, props) {
32
+ for(var i = 0; i < props.length; i++){
33
+ var descriptor = props[i];
34
+ descriptor.enumerable = descriptor.enumerable || false;
35
+ descriptor.configurable = true;
36
+ if ("value" in descriptor) descriptor.writable = true;
37
+ Object.defineProperty(target, descriptor.key, descriptor);
38
+ }
39
+ }
40
+ function _create_class(Constructor, protoProps, staticProps) {
41
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
42
+ if (staticProps) _defineProperties(Constructor, staticProps);
43
+ return Constructor;
44
+ }
45
+ function _define_property(obj, key, value) {
46
+ if (key in obj) {
47
+ Object.defineProperty(obj, key, {
48
+ value: value,
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true
52
+ });
53
+ } else {
54
+ obj[key] = value;
55
+ }
56
+ return obj;
57
+ }
58
+ function _get_prototype_of(o) {
59
+ _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
60
+ return o.__proto__ || Object.getPrototypeOf(o);
61
+ };
62
+ return _get_prototype_of(o);
63
+ }
64
+ function _inherits(subClass, superClass) {
65
+ if (typeof superClass !== "function" && superClass !== null) {
66
+ throw new TypeError("Super expression must either be null or a function");
67
+ }
68
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
69
+ constructor: {
70
+ value: subClass,
71
+ writable: true,
72
+ configurable: true
73
+ }
74
+ });
75
+ if (superClass) _set_prototype_of(subClass, superClass);
76
+ }
77
+ function _interop_require_default(obj) {
78
+ return obj && obj.__esModule ? obj : {
79
+ default: obj
80
+ };
81
+ }
82
+ function _getRequireWildcardCache(nodeInterop) {
83
+ if (typeof WeakMap !== "function") return null;
84
+ var cacheBabelInterop = new WeakMap();
85
+ var cacheNodeInterop = new WeakMap();
86
+ return (_getRequireWildcardCache = function(nodeInterop) {
87
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
88
+ })(nodeInterop);
89
+ }
90
+ function _interop_require_wildcard(obj, nodeInterop) {
91
+ if (!nodeInterop && obj && obj.__esModule) {
92
+ return obj;
93
+ }
94
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
95
+ return {
96
+ default: obj
97
+ };
98
+ }
99
+ var cache = _getRequireWildcardCache(nodeInterop);
100
+ if (cache && cache.has(obj)) {
101
+ return cache.get(obj);
102
+ }
103
+ var newObj = {
104
+ __proto__: null
105
+ };
106
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
107
+ for(var key in obj){
108
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
109
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
110
+ if (desc && (desc.get || desc.set)) {
111
+ Object.defineProperty(newObj, key, desc);
112
+ } else {
113
+ newObj[key] = obj[key];
114
+ }
115
+ }
116
+ }
117
+ newObj.default = obj;
118
+ if (cache) {
119
+ cache.set(obj, newObj);
120
+ }
121
+ return newObj;
122
+ }
123
+ function _possible_constructor_return(self, call) {
124
+ if (call && (_type_of(call) === "object" || typeof call === "function")) {
125
+ return call;
126
+ }
127
+ return _assert_this_initialized(self);
128
+ }
129
+ function _set_prototype_of(o, p) {
130
+ _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
131
+ o.__proto__ = p;
132
+ return o;
133
+ };
134
+ return _set_prototype_of(o, p);
135
+ }
136
+ function _type_of(obj) {
137
+ "@swc/helpers - typeof";
138
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
139
+ }
140
+ function _is_native_reflect_construct() {
141
+ try {
142
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
143
+ } catch (_) {}
144
+ return (_is_native_reflect_construct = function() {
145
+ return !!result;
146
+ })();
147
+ }
148
+ var _Step;
149
+ var _default = (0, _elements.define)((_Step = /*#__PURE__*/ function(ProofAssertion) {
150
+ _inherits(Step, ProofAssertion);
151
+ function Step(context, string, node, statement, reference, satisfiesAssertion) {
152
+ _class_call_check(this, Step);
153
+ var _this;
154
+ _this = _call_super(this, Step, [
155
+ context,
156
+ string,
157
+ node,
158
+ statement
159
+ ]);
160
+ _this.reference = reference;
161
+ _this.satisfiesAssertion = satisfiesAssertion;
162
+ return _this;
163
+ }
164
+ _create_class(Step, [
165
+ {
166
+ key: "getReference",
167
+ value: function getReference() {
168
+ return this.reference;
169
+ }
170
+ },
171
+ {
172
+ key: "getSatisfiesAssertion",
173
+ value: function getSatisfiesAssertion() {
174
+ return this.satisfiesAssertion;
175
+ }
176
+ },
177
+ {
178
+ key: "isSatisfied",
179
+ value: function isSatisfied() {
180
+ var satisfied = this.satisfiesAssertion !== null;
181
+ return satisfied;
182
+ }
183
+ },
184
+ {
185
+ key: "isQualified",
186
+ value: function isQualified() {
187
+ var qualified = this.reference !== null;
188
+ return qualified;
189
+ }
190
+ },
191
+ {
192
+ key: "isStated",
193
+ value: function isStated() {
194
+ var qualified = this.isQualified(), stated = qualified; ///
195
+ return stated;
196
+ }
197
+ },
198
+ {
199
+ key: "compareTermAndPropertyRelation",
200
+ value: function compareTermAndPropertyRelation(term, propertyRelation, context) {
201
+ var comparesToTermAndPropertyRelation = false;
202
+ var statement = this.getStatement(), propertyAssertion = (0, _statement.propertyAssertionFromStatement)(statement, context);
203
+ if (propertyAssertion !== null) {
204
+ comparesToTermAndPropertyRelation = propertyAssertion.compareTermAndPropertyRelation(term, propertyRelation, context);
205
+ }
206
+ return comparesToTermAndPropertyRelation;
207
+ }
208
+ },
209
+ {
210
+ key: "verify",
211
+ value: function verify(substitutions, assignments, context) {
212
+ var _this = this;
213
+ var verifies = false;
214
+ var transientContext = _transient.default.fromNothing(context);
215
+ context = transientContext; ///
216
+ var node = this.getNode(), stepString = this.getString(); ///
217
+ context.trace("Verifying the '".concat(stepString, "' step..."), node);
218
+ var statement = this.getStatement();
219
+ if (statement === null) {
220
+ context.debug("Unable to verify the '".concat(stepString, "' step because it is nonsense."), node);
221
+ } else {
222
+ var referenceValidates = this.validateReference(context);
223
+ if (referenceValidates) {
224
+ var satisfiesAssertioVeriries = this.verifySatisfiesAssertion(context);
225
+ if (satisfiesAssertioVeriries) {
226
+ var stated = this.isStated(), statementValidates = statement.validate(assignments, stated, context);
227
+ if (statementValidates) {
228
+ var statementUnifies = _unification.unifyStatements.some(function(unifyStatement) {
229
+ var statementUnifies = unifyStatement(statement, _this.reference, _this.satisfiesAssertion, substitutions, context);
230
+ if (statementUnifies) {
231
+ return true;
232
+ }
233
+ });
234
+ if (statementUnifies) {
235
+ verifies = true;
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ if (verifies) {
242
+ this.setContext(context);
243
+ context.debug("...verified the '".concat(stepString, "' step."), node);
244
+ }
245
+ return verifies;
246
+ }
247
+ },
248
+ {
249
+ key: "validateReference",
250
+ value: function validateReference(context) {
251
+ var referenceValidates = true;
252
+ if (this.reference !== null) {
253
+ var node = this.getNode(), stepString = this.getString();
254
+ context.trace("Validating the '".concat(stepString, "' step's reference... "), node);
255
+ referenceValidates = this.reference.validate(context);
256
+ if (referenceValidates) {
257
+ context.debug("...validating the '".concat(stepString, "' step's reference. "), node);
258
+ }
259
+ }
260
+ return referenceValidates;
261
+ }
262
+ },
263
+ {
264
+ key: "verifySatisfiesAssertion",
265
+ value: function verifySatisfiesAssertion(context) {
266
+ var satisfiesAssertionVerifies = true; ///
267
+ if (this.satisfiesAssertion !== null) {
268
+ var node = this.getNode(), stepString = this.getString(); ///
269
+ context.trace("Verifying the '".concat(stepString, "' step's satisfies assertion... "), node);
270
+ var stated = true, assignments = null;
271
+ satisfiesAssertionVerifies = this.satisfiesAssertion.validate(assignments, stated, context);
272
+ if (satisfiesAssertionVerifies) {
273
+ context.debug("...verified the '".concat(stepString, "' step's satisfies assertion. "), node);
274
+ }
275
+ }
276
+ return satisfiesAssertionVerifies;
277
+ }
278
+ },
279
+ {
280
+ key: "unifyWithSatisfiesAssertion",
281
+ value: function unifyWithSatisfiesAssertion(satisfiesAssertion, context) {
282
+ var unifiesWithSatisfiesAssertion = false;
283
+ var stepString = this.getString(), satisfiesAssertionString = satisfiesAssertion.getString();
284
+ context.trace("Unifying the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion..."), this.node);
285
+ var reference = satisfiesAssertion.getReference(), axiom = context.findAxiomByReference(reference);
286
+ if (axiom !== null) {
287
+ var Substitutions = _elements.default.Substitutions, step = this, substitutions = Substitutions.fromNothing(), stepUnifies = axiom.unifyStep(step, substitutions, context);
288
+ if (stepUnifies) {
289
+ var substitutionsCompare = satisfiesAssertion.compareSubstitutions(substitutions, context);
290
+ if (substitutionsCompare) {
291
+ unifiesWithSatisfiesAssertion = true;
292
+ }
293
+ }
294
+ }
295
+ if (unifiesWithSatisfiesAssertion) {
296
+ context.debug("...unified the '".concat(stepString, "' step with the '").concat(satisfiesAssertionString, "' satisfies assertion."), this.node);
297
+ }
298
+ return unifiesWithSatisfiesAssertion;
299
+ }
300
+ }
301
+ ]);
302
+ return Step;
303
+ }(_proofAssertion.default), _define_property(_Step, "name", "Step"), _Step));
304
+
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3Byb29mQXNzZXJ0aW9uL3N0ZXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBlbGVtZW50cyBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCBQcm9vZkFzc2VydGlvbiBmcm9tIFwiLi4vcHJvb2ZBc3NlcnRpb25cIjtcbmltcG9ydCBUcmFuc2llbnRDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0L3RyYW5zaWVudFwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IHVuaWZ5U3RhdGVtZW50cyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvdW5pZmljYXRpb25cIjtcbmltcG9ydCB7IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc3RhdGVtZW50XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBTdGVwIGV4dGVuZHMgUHJvb2ZBc3NlcnRpb24ge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCwgcmVmZXJlbmNlLCBzYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIHN0YXRlbWVudCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLnNhdGlzZmllc0Fzc2VydGlvbiA9IHNhdGlzZmllc0Fzc2VydGlvbjtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7XG4gIH1cblxuICBnZXRTYXRpc2ZpZXNBc3NlcnRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uO1xuICB9XG5cbiAgaXNTYXRpc2ZpZWQoKSB7XG4gICAgY29uc3Qgc2F0aXNmaWVkID0gKHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBzYXRpc2ZpZWQ7XG4gIH1cblxuICBpc1F1YWxpZmllZCgpIHtcbiAgICBjb25zdCBxdWFsaWZpZWQgPSAodGhpcy5yZWZlcmVuY2UgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHF1YWxpZmllZDtcbiAgfVxuXG4gIGlzU3RhdGVkKCkge1xuICAgIGNvbnN0IHF1YWxpZmllZCA9IHRoaXMuaXNRdWFsaWZpZWQoKSxcbiAgICAgICAgICBzdGF0ZWQgPSBxdWFsaWZpZWQ7IC8vL1xuXG4gICAgcmV0dXJuIHN0YXRlZDtcbiAgfVxuXG4gIGNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbih0ZXJtLCBwcm9wZXJ0eVJlbGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICBwcm9wZXJ0eUFzc2VydGlvbiA9IHByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHByb3BlcnR5QXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24gPSBwcm9wZXJ0eUFzc2VydGlvbi5jb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24odGVybSwgcHJvcGVydHlSZWxhdGlvbiwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbjtcbiAgfVxuXG4gIHZlcmlmeShzdWJzdGl0dXRpb25zLCBhc3NpZ25tZW50cywgY29udGV4dCkge1xuICAgIGxldCB2ZXJpZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgdHJhbnNpZW50Q29udGV4dCA9IFRyYW5zaWVudENvbnRleHQuZnJvbU5vdGhpbmcoY29udGV4dCk7XG5cbiAgICBjb250ZXh0ID0gdHJhbnNpZW50Q29udGV4dDsgLy8vXG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcC4uLmAsIG5vZGUpO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKTtcblxuICAgIGlmIChzdGF0ZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYFVuYWJsZSB0byB2ZXJpZnkgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwIGJlY2F1c2UgaXQgaXMgbm9uc2Vuc2UuYCwgbm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZVZhbGlkYXRlcyA9IHRoaXMudmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3Qgc2F0aXNmaWVzQXNzZXJ0aW9WZXJpcmllcyA9IHRoaXMudmVyaWZ5U2F0aXNmaWVzQXNzZXJ0aW9uKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChzYXRpc2ZpZXNBc3NlcnRpb1ZlcmlyaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGVkID0gdGhpcy5pc1N0YXRlZCgpLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudFZhbGlkYXRlcyA9IHN0YXRlbWVudC52YWxpZGF0ZShhc3NpZ25tZW50cywgc3RhdGVkLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudFVuaWZpZXMgPSB1bmlmeVN0YXRlbWVudHMuc29tZSgodW5pZnlTdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50VW5pZmllcyA9IHVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgdGhpcy5yZWZlcmVuY2UsIHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uLCBzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgdmVyaWZpZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2ZXJpZmllcykge1xuICAgICAgdGhpcy5zZXRDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAuYCwgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgdmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCkge1xuICAgIGxldCByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgICBzdGVwU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAncyByZWZlcmVuY2UuLi4gYCwgbm9kZSk7XG5cbiAgICAgIHJlZmVyZW5jZVZhbGlkYXRlcyA9IHRoaXMucmVmZXJlbmNlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgICBpZiAocmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRpbmcgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwJ3MgcmVmZXJlbmNlLiBgLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlVmFsaWRhdGVzO1xuICB9XG5cbiAgdmVyaWZ5U2F0aXNmaWVzQXNzZXJ0aW9uKGNvbnRleHQpIHtcbiAgICBsZXQgc2F0aXNmaWVzQXNzZXJ0aW9uVmVyaWZpZXMgPSB0cnVlOyAgLy8vXG5cbiAgICBpZiAodGhpcy5zYXRpc2ZpZXNBc3NlcnRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICAgIHN0ZXBTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAncyBzYXRpc2ZpZXMgYXNzZXJ0aW9uLi4uIGAsIG5vZGUpO1xuXG4gICAgICBjb25zdCBzdGF0ZWQgPSB0cnVlLFxuICAgICAgICAgICAgYXNzaWdubWVudHMgPSBudWxsO1xuXG4gICAgICBzYXRpc2ZpZXNBc3NlcnRpb25WZXJpZmllcyA9IHRoaXMuc2F0aXNmaWVzQXNzZXJ0aW9uLnZhbGlkYXRlKGFzc2lnbm1lbnRzLCBzdGF0ZWQsIGNvbnRleHQpO1xuXG4gICAgICBpZiAoc2F0aXNmaWVzQXNzZXJ0aW9uVmVyaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwJ3Mgc2F0aXNmaWVzIGFzc2VydGlvbi4gYCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhdGlzZmllc0Fzc2VydGlvblZlcmlmaWVzO1xuICB9XG5cbiAgdW5pZnlXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uKHNhdGlzZmllc0Fzc2VydGlvbiwgY29udGV4dCkge1xuICAgIGxldCB1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbiA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksIC8vL1xuICAgICAgICAgIHNhdGlzZmllc0Fzc2VydGlvblN0cmluZyA9IHNhdGlzZmllc0Fzc2VydGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzdGVwU3RyaW5nfScgc3RlcCB3aXRoIHRoZSAnJHtzYXRpc2ZpZXNBc3NlcnRpb25TdHJpbmd9JyBzYXRpc2ZpZXMgYXNzZXJ0aW9uLi4uYCwgdGhpcy5ub2RlKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHNhdGlzZmllc0Fzc2VydGlvbi5nZXRSZWZlcmVuY2UoKSxcbiAgICAgICAgICBheGlvbSA9IGNvbnRleHQuZmluZEF4aW9tQnlSZWZlcmVuY2UocmVmZXJlbmNlKTtcblxuICAgIGlmIChheGlvbSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgeyBTdWJzdGl0dXRpb25zIH0gPSBlbGVtZW50cyxcbiAgICAgICAgICAgIHN0ZXAgPSB0aGlzLCAgLy8vXG4gICAgICAgICAgICBzdWJzdGl0dXRpb25zID0gU3Vic3RpdHV0aW9ucy5mcm9tTm90aGluZygpLFxuICAgICAgICAgICAgc3RlcFVuaWZpZXMgPSBheGlvbS51bmlmeVN0ZXAoc3RlcCwgc3Vic3RpdHV0aW9ucywgY29udGV4dCk7XG5cbiAgICAgIGlmIChzdGVwVW5pZmllcykge1xuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zQ29tcGFyZSA9IHNhdGlzZmllc0Fzc2VydGlvbi5jb21wYXJlU3Vic3RpdHV0aW9ucyhzdWJzdGl0dXRpb25zLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoc3Vic3RpdHV0aW9uc0NvbXBhcmUpIHtcbiAgICAgICAgICB1bmlmaWVzV2l0aFNhdGlzZmllc0Fzc2VydGlvbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb24pIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwIHdpdGggdGhlICcke3NhdGlzZmllc0Fzc2VydGlvblN0cmluZ30nIHNhdGlzZmllcyBhc3NlcnRpb24uYCwgdGhpcy5ub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pZmllc1dpdGhTYXRpc2ZpZXNBc3NlcnRpb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiU3RlcFwiO1xufSk7XG4iXSwibmFtZXMiOlsiZGVmaW5lIiwiU3RlcCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwic3RhdGVtZW50IiwicmVmZXJlbmNlIiwic2F0aXNmaWVzQXNzZXJ0aW9uIiwiZ2V0UmVmZXJlbmNlIiwiZ2V0U2F0aXNmaWVzQXNzZXJ0aW9uIiwiaXNTYXRpc2ZpZWQiLCJzYXRpc2ZpZWQiLCJpc1F1YWxpZmllZCIsInF1YWxpZmllZCIsImlzU3RhdGVkIiwic3RhdGVkIiwiY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uIiwidGVybSIsInByb3BlcnR5UmVsYXRpb24iLCJjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24iLCJnZXRTdGF0ZW1lbnQiLCJwcm9wZXJ0eUFzc2VydGlvbiIsInByb3BlcnR5QXNzZXJ0aW9uRnJvbVN0YXRlbWVudCIsInZlcmlmeSIsInN1YnN0aXR1dGlvbnMiLCJhc3NpZ25tZW50cyIsInZlcmlmaWVzIiwidHJhbnNpZW50Q29udGV4dCIsIlRyYW5zaWVudENvbnRleHQiLCJmcm9tTm90aGluZyIsImdldE5vZGUiLCJzdGVwU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJkZWJ1ZyIsInJlZmVyZW5jZVZhbGlkYXRlcyIsInZhbGlkYXRlUmVmZXJlbmNlIiwic2F0aXNmaWVzQXNzZXJ0aW9WZXJpcmllcyIsInZlcmlmeVNhdGlzZmllc0Fzc2VydGlvbiIsInN0YXRlbWVudFZhbGlkYXRlcyIsInZhbGlkYXRlIiwic3RhdGVtZW50VW5pZmllcyIsInVuaWZ5U3RhdGVtZW50cyIsInNvbWUiLCJ1bmlmeVN0YXRlbWVudCIsInNldENvbnRleHQiLCJzYXRpc2ZpZXNBc3NlcnRpb25WZXJpZmllcyIsInVuaWZ5V2l0aFNhdGlzZmllc0Fzc2VydGlvbiIsInVuaWZpZXNXaXRoU2F0aXNmaWVzQXNzZXJ0aW9uIiwic2F0aXNmaWVzQXNzZXJ0aW9uU3RyaW5nIiwiYXhpb20iLCJmaW5kQXhpb21CeVJlZmVyZW5jZSIsIlN1YnN0aXR1dGlvbnMiLCJlbGVtZW50cyIsInN0ZXAiLCJzdGVwVW5pZmllcyIsInVuaWZ5U3RlcCIsInN1YnN0aXR1dGlvbnNDb21wYXJlIiwiY29tcGFyZVN1YnN0aXR1dGlvbnMiLCJQcm9vZkFzc2VydGlvbiIsIm5hbWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVVBOzs7ZUFBQTs7O2dFQVJxQjtxRUFDTTtnRUFDRTsyQkFHRzt5QkFDZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFL0MsV0FBZUEsSUFBQUEsZ0JBQU0seUJBQUM7O2FBQU1DLEtBQ2RDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFQyxrQkFBa0I7Z0NBRGpETjs7Z0JBRXhCLGtCQUZ3QkE7WUFFbEJDO1lBQVNDO1lBQVFDO1lBQU1DOztRQUU3QixNQUFLQyxTQUFTLEdBQUdBO1FBQ2pCLE1BQUtDLGtCQUFrQixHQUFHQTs7Ozs7WUFHNUJDLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0YsU0FBUztZQUN2Qjs7O1lBRUFHLEtBQUFBO21CQUFBQSxTQUFBQTtnQkFDRSxPQUFPLElBQUksQ0FBQ0Ysa0JBQWtCO1lBQ2hDOzs7WUFFQUcsS0FBQUE7bUJBQUFBLFNBQUFBO2dCQUNF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