occam-verify-cli 1.0.448 → 1.0.472
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.
- package/lib/constants.js +13 -5
- package/lib/context/ephemeral.js +270 -0
- package/lib/context/file.js +136 -128
- package/lib/context/liminal.js +120 -0
- package/lib/context/literal.js +92 -0
- package/lib/context/nominal.js +15 -1
- package/lib/context/release.js +68 -9
- package/lib/context/scoped.js +322 -0
- package/lib/context/synthetic.js +133 -0
- package/lib/element/assertion/contained.js +66 -66
- package/lib/element/assertion/defined.js +32 -32
- package/lib/element/assertion/property.js +39 -39
- package/lib/element/assertion/satisfies.js +22 -22
- package/lib/element/assumption.js +71 -87
- package/lib/element/combinator/bracketed.js +1 -10
- package/lib/element/conclusion.js +19 -15
- package/lib/element/constructor/bracketed.js +1 -10
- package/lib/element/constructor.js +2 -2
- package/lib/element/declaration/combinator.js +1 -2
- package/lib/element/declaration/metavariable.js +3 -3
- package/lib/element/declaration/variable.js +3 -3
- package/lib/element/deduction.js +26 -20
- package/lib/element/derivation.js +3 -3
- package/lib/element/equality.js +5 -5
- package/lib/element/equivalence.js +112 -107
- package/lib/element/equivalences.js +24 -10
- package/lib/element/error.js +3 -3
- package/lib/element/frame.js +73 -62
- package/lib/element/hypothesis.js +2 -2
- package/lib/element/judgement.js +40 -60
- package/lib/element/metaType.js +4 -4
- package/lib/element/metavariable.js +49 -38
- package/lib/element/parameter.js +13 -5
- package/lib/element/procedureCall.js +16 -16
- package/lib/element/proof.js +14 -13
- package/lib/element/proofAssertion/premise.js +319 -0
- package/lib/element/proofAssertion/step.js +309 -0
- package/lib/element/proofAssertion/supposition.js +333 -0
- package/lib/element/proofAssertion.js +20 -10
- package/lib/element/propertyRelation.js +2 -2
- package/lib/element/reference.js +72 -30
- package/lib/element/rule.js +26 -28
- package/lib/element/section.js +5 -5
- package/lib/element/signature.js +9 -6
- package/lib/element/statement.js +44 -36
- package/lib/element/subproof.js +18 -17
- package/lib/element/substitution/frame.js +86 -49
- package/lib/element/substitution/reference.js +101 -19
- package/lib/element/substitution/statement.js +128 -105
- package/lib/element/substitution/term.js +93 -57
- package/lib/element/substitution.js +20 -69
- package/lib/element/substitutions.js +49 -34
- package/lib/element/term.js +41 -30
- package/lib/element/topLevelAssertion/axiom.js +331 -0
- package/lib/element/{conjecture.js → topLevelAssertion/conjecture.js} +10 -10
- package/lib/element/{lemma.js → topLevelAssertion/lemma.js} +9 -9
- package/lib/element/{theorem.js → topLevelAssertion/theorem.js} +8 -8
- package/lib/element/topLevelAssertion.js +434 -0
- package/lib/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +8 -8
- package/lib/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +8 -8
- package/lib/element/topLevelMetaAssertion.js +293 -0
- package/lib/element/type.js +4 -4
- package/lib/element/variable.js +48 -40
- package/lib/index.js +3 -3
- package/lib/main.js +3 -3
- package/lib/metaTypes.js +18 -15
- package/lib/node/frame.js +2 -2
- package/lib/node/metavariable.js +4 -4
- package/lib/node/parameter.js +28 -7
- package/lib/node/proofAssertion/premise.js +116 -0
- package/lib/node/proofAssertion/step.js +152 -0
- package/lib/node/proofAssertion/supposition.js +116 -0
- package/lib/node/{premise.js → proofAssertion.js} +11 -18
- package/lib/node/statement.js +2 -2
- package/lib/node/substitution/frame.js +9 -31
- package/lib/node/substitution/reference.js +137 -0
- package/lib/node/substitution/statement.js +9 -31
- package/lib/node/substitution/term.js +9 -23
- package/lib/node/{axiom.js → topLevelAssertion/axiom.js} +7 -7
- package/lib/node/{conjecture.js → topLevelAssertion/conjecture.js} +7 -7
- package/lib/node/{lemma.js → topLevelAssertion/lemma.js} +7 -7
- package/lib/node/{theorem.js → topLevelAssertion/theorem.js} +7 -7
- package/lib/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +9 -9
- package/lib/node/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +7 -7
- package/lib/node/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +7 -7
- package/lib/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +9 -9
- package/lib/nonTerminalNodeMap.js +15 -14
- package/lib/preamble.js +10 -10
- package/lib/process/instantiate.js +6 -21
- package/lib/process/unify.js +11 -10
- package/lib/tokenTypes.js +22 -0
- package/lib/types.js +3 -3
- package/lib/utilities/bnf.js +5 -5
- package/lib/utilities/context.js +63 -0
- package/lib/utilities/element.js +235 -408
- package/lib/utilities/instance.js +12 -34
- package/lib/utilities/json.js +3 -2
- package/lib/utilities/string.js +56 -21
- package/lib/utilities/unification.js +38 -32
- package/lib/utilities/validation.js +47 -50
- package/package.json +2 -2
- package/src/constants.js +12 -1
- package/src/context/ephemeral.js +257 -0
- package/src/context/file.js +108 -116
- package/src/context/liminal.js +67 -0
- package/src/context/literal.js +51 -0
- package/src/context/nominal.js +12 -0
- package/src/context/release.js +48 -8
- package/src/context/{local.js → scoped.js} +43 -125
- package/src/context/synthetic.js +60 -0
- package/src/element/assertion/contained.js +49 -47
- package/src/element/assertion/defined.js +29 -27
- package/src/element/assertion/property.js +35 -35
- package/src/element/assertion/satisfies.js +19 -18
- package/src/element/assumption.js +71 -93
- package/src/element/combinator/bracketed.js +0 -7
- package/src/element/conclusion.js +25 -24
- package/src/element/constructor/bracketed.js +0 -7
- package/src/element/constructor.js +1 -1
- package/src/element/declaration/combinator.js +0 -1
- package/src/element/declaration/metavariable.js +2 -2
- package/src/element/declaration/variable.js +5 -5
- package/src/element/deduction.js +33 -31
- package/src/element/derivation.js +2 -2
- package/src/element/equality.js +4 -4
- package/src/element/equivalence.js +115 -135
- package/src/element/equivalences.js +9 -7
- package/src/element/error.js +4 -2
- package/src/element/frame.js +80 -65
- package/src/element/hypothesis.js +1 -1
- package/src/element/judgement.js +42 -62
- package/src/element/metaType.js +3 -4
- package/src/element/metavariable.js +59 -56
- package/src/element/parameter.js +10 -5
- package/src/element/procedureCall.js +20 -18
- package/src/element/proof.js +14 -16
- package/src/element/{premise.js → proofAssertion/premise.js} +57 -53
- package/src/element/{step.js → proofAssertion/step.js} +59 -62
- package/src/element/{supposition.js → proofAssertion/supposition.js} +67 -56
- package/src/element/proofAssertion.js +24 -13
- package/src/element/propertyRelation.js +1 -1
- package/src/element/reference.js +87 -37
- package/src/element/rule.js +31 -37
- package/src/element/section.js +5 -5
- package/src/element/signature.js +8 -8
- package/src/element/statement.js +52 -48
- package/src/element/subproof.js +16 -18
- package/src/element/substitution/frame.js +104 -50
- package/src/element/substitution/reference.js +120 -20
- package/src/element/substitution/statement.js +169 -130
- package/src/element/substitution/term.js +104 -63
- package/src/element/substitution.js +16 -58
- package/src/element/substitutions.js +43 -41
- package/src/element/term.js +47 -41
- package/src/element/{axiom.js → topLevelAssertion/axiom.js} +22 -20
- package/src/element/{conjecture.js → topLevelAssertion/conjecture.js} +5 -6
- package/src/element/{lemma.js → topLevelAssertion/lemma.js} +5 -6
- package/src/element/{theorem.js → topLevelAssertion/theorem.js} +5 -5
- package/src/element/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +37 -33
- package/src/element/{metaLemma.js → topLevelMetaAssertion/metaLemma.js} +5 -6
- package/src/element/{metatheorem.js → topLevelMetaAssertion/metatheorem.js} +5 -6
- package/src/element/{metaLemmaMetatheorem.js → topLevelMetaAssertion.js} +19 -17
- package/src/element/type.js +2 -4
- package/src/element/variable.js +47 -48
- package/src/index.js +2 -1
- package/src/main.js +2 -1
- package/src/metaTypes.js +25 -9
- package/src/node/frame.js +1 -1
- package/src/node/metavariable.js +3 -3
- package/src/node/parameter.js +32 -5
- package/src/node/proofAssertion/premise.js +16 -0
- package/src/node/{step.js → proofAssertion/step.js} +4 -18
- package/src/node/proofAssertion/supposition.js +16 -0
- package/src/node/proofAssertion.js +23 -0
- package/src/node/statement.js +1 -1
- package/src/node/substitution/frame.js +6 -32
- package/src/node/substitution/reference.js +38 -0
- package/src/node/substitution/statement.js +6 -32
- package/src/node/substitution/term.js +6 -22
- package/src/node/topLevelAssertion/axiom.js +13 -0
- package/src/node/topLevelAssertion/conjecture.js +13 -0
- package/src/node/topLevelAssertion/lemma.js +13 -0
- package/src/node/topLevelAssertion/theorem.js +13 -0
- package/src/node/{axiomLemmaTheoremConjecture.js → topLevelAssertion.js} +1 -1
- package/src/node/topLevelMetaAssertion/metaLemma.js +13 -0
- package/src/node/topLevelMetaAssertion/metatheorem.js +13 -0
- package/src/node/{metaLemmaMetaTheorem.js → topLevelMetaAssertion.js} +1 -1
- package/src/nonTerminalNodeMap.js +15 -12
- package/src/preamble.js +9 -9
- package/src/process/instantiate.js +27 -36
- package/src/process/unify.js +10 -9
- package/src/tokenTypes.js +4 -0
- package/src/types.js +4 -2
- package/src/utilities/bnf.js +3 -2
- package/src/utilities/context.js +46 -0
- package/src/utilities/element.js +302 -509
- package/src/utilities/instance.js +19 -42
- package/src/utilities/json.js +3 -1
- package/src/utilities/string.js +69 -28
- package/src/utilities/unification.js +41 -38
- package/src/utilities/validation.js +66 -75
- package/lib/context/local.js +0 -605
- package/lib/context/temporary.js +0 -752
- package/lib/element/axiom.js +0 -329
- package/lib/element/axiomLemmaTheoremConjecture.js +0 -427
- package/lib/element/metaLemmaMetatheorem.js +0 -289
- package/lib/element/premise.js +0 -307
- package/lib/element/step.js +0 -311
- package/lib/element/supposition.js +0 -320
- package/lib/log.js +0 -150
- package/lib/node/step.js +0 -166
- package/lib/node/supposition.js +0 -130
- package/src/context/temporary.js +0 -476
- package/src/log.js +0 -118
- package/src/node/axiom.js +0 -13
- package/src/node/conjecture.js +0 -13
- package/src/node/lemma.js +0 -13
- package/src/node/metaLemma.js +0 -13
- package/src/node/metatheorem.js +0 -13
- package/src/node/premise.js +0 -30
- package/src/node/supposition.js +0 -30
- package/src/node/theorem.js +0 -13
package/lib/context/local.js
DELETED
|
@@ -1,605 +0,0 @@
|
|
|
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 _necessary = require("necessary");
|
|
12
|
-
var _elements = /*#__PURE__*/ _interop_require_default(require("../elements"));
|
|
13
|
-
function _array_like_to_array(arr, len) {
|
|
14
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
15
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
16
|
-
return arr2;
|
|
17
|
-
}
|
|
18
|
-
function _array_without_holes(arr) {
|
|
19
|
-
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
20
|
-
}
|
|
21
|
-
function _class_call_check(instance, Constructor) {
|
|
22
|
-
if (!(instance instanceof Constructor)) {
|
|
23
|
-
throw new TypeError("Cannot call a class as a function");
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function _defineProperties(target, props) {
|
|
27
|
-
for(var i = 0; i < props.length; i++){
|
|
28
|
-
var descriptor = props[i];
|
|
29
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
30
|
-
descriptor.configurable = true;
|
|
31
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
32
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function _create_class(Constructor, protoProps, staticProps) {
|
|
36
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
37
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
38
|
-
return Constructor;
|
|
39
|
-
}
|
|
40
|
-
function _interop_require_default(obj) {
|
|
41
|
-
return obj && obj.__esModule ? obj : {
|
|
42
|
-
default: obj
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function _iterable_to_array(iter) {
|
|
46
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
47
|
-
}
|
|
48
|
-
function _non_iterable_spread() {
|
|
49
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
50
|
-
}
|
|
51
|
-
function _to_consumable_array(arr) {
|
|
52
|
-
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
53
|
-
}
|
|
54
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
55
|
-
if (!o) return;
|
|
56
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
57
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
58
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
59
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
60
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
61
|
-
}
|
|
62
|
-
var last = _necessary.arrayUtilities.last;
|
|
63
|
-
var LocalContext = /*#__PURE__*/ function() {
|
|
64
|
-
function LocalContext(context, variables, judgements, equivalences, subproofOrProofAssertions) {
|
|
65
|
-
_class_call_check(this, LocalContext);
|
|
66
|
-
this.context = context;
|
|
67
|
-
this.variables = variables;
|
|
68
|
-
this.judgements = judgements;
|
|
69
|
-
this.equivalences = equivalences;
|
|
70
|
-
this.subproofOrProofAssertions = subproofOrProofAssertions;
|
|
71
|
-
}
|
|
72
|
-
_create_class(LocalContext, [
|
|
73
|
-
{
|
|
74
|
-
key: "getContext",
|
|
75
|
-
value: function getContext() {
|
|
76
|
-
return this.context;
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
key: "getVariables",
|
|
81
|
-
value: function getVariables() {
|
|
82
|
-
var nested = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
|
|
83
|
-
var variables;
|
|
84
|
-
if (nested) {
|
|
85
|
-
variables = this.context.getVariables();
|
|
86
|
-
variables = _to_consumable_array(this.variables).concat(_to_consumable_array(variables));
|
|
87
|
-
} else {
|
|
88
|
-
variables = this.variables;
|
|
89
|
-
}
|
|
90
|
-
return variables;
|
|
91
|
-
}
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
key: "getJudgements",
|
|
95
|
-
value: function getJudgements() {
|
|
96
|
-
var judgements = this.context.getJudgements();
|
|
97
|
-
judgements = _to_consumable_array(this.judgements).concat(_to_consumable_array(judgements));
|
|
98
|
-
return judgements;
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
key: "getEquivalences",
|
|
103
|
-
value: function getEquivalences() {
|
|
104
|
-
var equivalences = this.context.getEquivalences();
|
|
105
|
-
equivalences = this.equivalences.mergedWith(equivalences); ///
|
|
106
|
-
return equivalences;
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
key: "getProofAssertions",
|
|
111
|
-
value: function getProofAssertions() {
|
|
112
|
-
var subproofOrProofAssertions = this.getSubproofOrProofAssertions(), proofAssertions = subproofOrProofAssertions.filter(function(subproofOrProofAssertion) {
|
|
113
|
-
var subproofOrProofAssertionproofAssertion = subproofOrProofAssertion.isProofAssertion();
|
|
114
|
-
if (subproofOrProofAssertionproofAssertion) {
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
return proofAssertions;
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
key: "getLastProofAssertion",
|
|
123
|
-
value: function getLastProofAssertion() {
|
|
124
|
-
var lastProofAssertion = null;
|
|
125
|
-
var proofAssertions = this.getProofAssertions(), proofAssertionsLength = proofAssertions.length;
|
|
126
|
-
if (proofAssertionsLength > 0) {
|
|
127
|
-
lastProofAssertion = last(proofAssertions);
|
|
128
|
-
}
|
|
129
|
-
return lastProofAssertion;
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
key: "getSubproofOrProofAssertions",
|
|
134
|
-
value: function getSubproofOrProofAssertions() {
|
|
135
|
-
var subproofOrProofAssertions = this.context.getSubproofOrProofAssertions();
|
|
136
|
-
subproofOrProofAssertions = _to_consumable_array(subproofOrProofAssertions).concat(_to_consumable_array(this.subproofOrProofAssertions));
|
|
137
|
-
return subproofOrProofAssertions;
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
key: "getFilePath",
|
|
142
|
-
value: function getFilePath() {
|
|
143
|
-
return this.context.getFilePath();
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
key: "getLexer",
|
|
148
|
-
value: function getLexer() {
|
|
149
|
-
return this.context.getLexer();
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
key: "getParser",
|
|
154
|
-
value: function getParser() {
|
|
155
|
-
return this.context.getParser();
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
key: "getAxioms",
|
|
160
|
-
value: function getAxioms() {
|
|
161
|
-
return this.context.getAxioms();
|
|
162
|
-
}
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
key: "getLemmas",
|
|
166
|
-
value: function getLemmas() {
|
|
167
|
-
return this.context.getLemmas();
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
key: "getTheorems",
|
|
172
|
-
value: function getTheorems() {
|
|
173
|
-
return this.context.getTheorems();
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
key: "getConjectures",
|
|
178
|
-
value: function getConjectures() {
|
|
179
|
-
return this.context.getConjectures();
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
key: "getCombinators",
|
|
184
|
-
value: function getCombinators() {
|
|
185
|
-
return this.context.getCombinators();
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
key: "getConstructors",
|
|
190
|
-
value: function getConstructors() {
|
|
191
|
-
return this.context.getConstructors();
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
key: "getTypePrefix",
|
|
196
|
-
value: function getTypePrefix() {
|
|
197
|
-
return this.context.getTypePrefix();
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
key: "addAxiom",
|
|
202
|
-
value: function addAxiom(axiom) {
|
|
203
|
-
this.context.addAxiom(axiom);
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
key: "addLemma",
|
|
208
|
-
value: function addLemma(lemma) {
|
|
209
|
-
this.context.addLemma(lemma);
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
key: "addTheorem",
|
|
214
|
-
value: function addTheorem(theorem) {
|
|
215
|
-
this.context.addTheorem(theorem);
|
|
216
|
-
}
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
key: "addEquality",
|
|
220
|
-
value: function addEquality(equality) {
|
|
221
|
-
var equalityAdded;
|
|
222
|
-
var equalityReflexive = equality.isReflexive();
|
|
223
|
-
if (!equalityReflexive) {
|
|
224
|
-
var Equivalence = _elements.default.Equivalence, equivalence = Equivalence.fromEquality(equality), context = this; ///
|
|
225
|
-
this.equivalences = this.equivalences.mergedWithEquivalence(equivalence, context);
|
|
226
|
-
}
|
|
227
|
-
equalityAdded = true;
|
|
228
|
-
if (equalityAdded) {
|
|
229
|
-
var context1 = this, equalityString = equality.getString();
|
|
230
|
-
context1.trace("Added the '".concat(equalityString, "' equality."));
|
|
231
|
-
}
|
|
232
|
-
return equalityAdded;
|
|
233
|
-
}
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
key: "addVariable",
|
|
237
|
-
value: function addVariable(variable) {
|
|
238
|
-
var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
|
239
|
-
var variableAdded = false;
|
|
240
|
-
var variableIdentifier = variable.getIdentifier(), variablePresent = this.isVariablePresentByVariableIdentifier(variableIdentifier, nested);
|
|
241
|
-
if (!variablePresent) {
|
|
242
|
-
this.variables.push(variable);
|
|
243
|
-
variableAdded = true;
|
|
244
|
-
}
|
|
245
|
-
if (variableAdded) {
|
|
246
|
-
var context = this, variableString = variable.getString();
|
|
247
|
-
context.trace("Added the '".concat(variableString, "' variable."));
|
|
248
|
-
}
|
|
249
|
-
return variableAdded;
|
|
250
|
-
}
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
key: "addJudgement",
|
|
254
|
-
value: function addJudgement(judgement) {
|
|
255
|
-
var judgementAdded = false;
|
|
256
|
-
var metavariable = judgement.getMetavariable(), judgementPresent = this.isJudgementPresentByMetavariable(metavariable);
|
|
257
|
-
if (!judgementPresent) {
|
|
258
|
-
this.judgements.push(judgement);
|
|
259
|
-
judgementAdded = true;
|
|
260
|
-
}
|
|
261
|
-
if (judgementAdded) {
|
|
262
|
-
var context = this, judgementString = judgement.getString();
|
|
263
|
-
context.trace("Added the '".concat(judgementString, "' judgement."));
|
|
264
|
-
}
|
|
265
|
-
return judgementAdded;
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
key: "addSubproofOrProofAssertion",
|
|
270
|
-
value: function addSubproofOrProofAssertion(subproofOrProofAssertion) {
|
|
271
|
-
this.subproofOrProofAssertions.push(subproofOrProofAssertion);
|
|
272
|
-
}
|
|
273
|
-
},
|
|
274
|
-
{
|
|
275
|
-
key: "findProcedureByName",
|
|
276
|
-
value: function findProcedureByName(name) {
|
|
277
|
-
return this.context.findProcedureByName(name);
|
|
278
|
-
}
|
|
279
|
-
},
|
|
280
|
-
{
|
|
281
|
-
key: "findLabelByReference",
|
|
282
|
-
value: function findLabelByReference(reference, context) {
|
|
283
|
-
return this.context.findLabelByReference(reference, context);
|
|
284
|
-
}
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
key: "findRuleByReference",
|
|
288
|
-
value: function findRuleByReference(reference) {
|
|
289
|
-
return this.context.findRuleByReference(reference);
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
key: "findAxiomByReference",
|
|
294
|
-
value: function findAxiomByReference(reference) {
|
|
295
|
-
return this.context.findAxiomByReference(reference);
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
key: "findLemmaByReference",
|
|
300
|
-
value: function findLemmaByReference(reference) {
|
|
301
|
-
return this.context.findLemmaByReference(reference);
|
|
302
|
-
}
|
|
303
|
-
},
|
|
304
|
-
{
|
|
305
|
-
key: "findTheoremByReference",
|
|
306
|
-
value: function findTheoremByReference(reference) {
|
|
307
|
-
return this.context.findTheoremByReference(reference);
|
|
308
|
-
}
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
key: "findConjectureByReference",
|
|
312
|
-
value: function findConjectureByReference(reference) {
|
|
313
|
-
return this.context.findConjectureByReference(reference);
|
|
314
|
-
}
|
|
315
|
-
},
|
|
316
|
-
{
|
|
317
|
-
key: "findMetaLemmasByReference",
|
|
318
|
-
value: function findMetaLemmasByReference(reference) {
|
|
319
|
-
return this.context.findMetaLemmasByReference(reference);
|
|
320
|
-
}
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
key: "findMetatheoremsByReference",
|
|
324
|
-
value: function findMetatheoremsByReference(reference) {
|
|
325
|
-
return this.context.findMetatheoremsByReference(reference);
|
|
326
|
-
}
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
key: "findMetaLemmaMetatheoremByReference",
|
|
330
|
-
value: function findMetaLemmaMetatheoremByReference(reference) {
|
|
331
|
-
return this.context.findMetaLemmaMetatheoremByReference(reference);
|
|
332
|
-
}
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
key: "findMetaLemmaMetatheoremsByReference",
|
|
336
|
-
value: function findMetaLemmaMetatheoremsByReference(reference) {
|
|
337
|
-
return this.context.findMetaLemmaMetatheoremsByReference(reference);
|
|
338
|
-
}
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
key: "findVariableByVariableIdentifier",
|
|
342
|
-
value: function findVariableByVariableIdentifier(variableIdentifier) {
|
|
343
|
-
var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
|
344
|
-
var variables = this.getVariables(nested), variable = variables.find(function(variable) {
|
|
345
|
-
var variableComparesToVariableIdentifier = variable.compareVariableIdentifier(variableIdentifier);
|
|
346
|
-
if (variableComparesToVariableIdentifier) {
|
|
347
|
-
return true;
|
|
348
|
-
}
|
|
349
|
-
}) || null;
|
|
350
|
-
return variable;
|
|
351
|
-
}
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
key: "findJudgementByMetavariable",
|
|
355
|
-
value: function findJudgementByMetavariable(metavariable) {
|
|
356
|
-
var judgements = this.getJudgements(), judgement = judgements.find(function(judgement) {
|
|
357
|
-
var judgementSingular = judgement.isSingular();
|
|
358
|
-
if (judgementSingular) {
|
|
359
|
-
var judgementMetavariable = judgement.getMetavariable(), judgementMetavariableEqualToMetavariable = judgementMetavariable.isEqualTo(metavariable);
|
|
360
|
-
if (judgementMetavariableEqualToMetavariable) {
|
|
361
|
-
return true;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}) || null;
|
|
365
|
-
return judgement;
|
|
366
|
-
}
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
key: "findEquivalenceByTerm",
|
|
370
|
-
value: function findEquivalenceByTerm(term) {
|
|
371
|
-
return this.equivalences.findEquivalenceByTerm(term);
|
|
372
|
-
}
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
key: "findMetavariable",
|
|
376
|
-
value: function findMetavariable(metavariable) {
|
|
377
|
-
return this.context.findMetavariable(metavariable);
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
{
|
|
381
|
-
key: "findLabelByMetavariable",
|
|
382
|
-
value: function findLabelByMetavariable(metavariable) {
|
|
383
|
-
return this.context.findLabelByMetavariable(metavariable);
|
|
384
|
-
}
|
|
385
|
-
},
|
|
386
|
-
{
|
|
387
|
-
key: "findTypeByNominalTypeName",
|
|
388
|
-
value: function findTypeByNominalTypeName(nominalTypeName) {
|
|
389
|
-
return this.context.findTypeByNominalTypeName(nominalTypeName);
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
{
|
|
393
|
-
key: "findMetaTypeByMetaTypeName",
|
|
394
|
-
value: function findMetaTypeByMetaTypeName(metaTypeName) {
|
|
395
|
-
return this.context.findMetaTypeByMetaTypeName(metaTypeName);
|
|
396
|
-
}
|
|
397
|
-
},
|
|
398
|
-
{
|
|
399
|
-
key: "findMetavariableByMetavariableName",
|
|
400
|
-
value: function findMetavariableByMetavariableName(metavariableName) {
|
|
401
|
-
return this.context.findMetavariableByMetavariableName(metavariableName);
|
|
402
|
-
}
|
|
403
|
-
},
|
|
404
|
-
{
|
|
405
|
-
key: "isProcedurePresentByName",
|
|
406
|
-
value: function isProcedurePresentByName(name) {
|
|
407
|
-
return this.context.isProcedurePresentByName(name);
|
|
408
|
-
}
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
key: "isLabelPresentByReference",
|
|
412
|
-
value: function isLabelPresentByReference(reference) {
|
|
413
|
-
return this.context.isLabelPresentByReference(reference);
|
|
414
|
-
}
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
key: "isMetavariablePresentByReference",
|
|
418
|
-
value: function isMetavariablePresentByReference(reference) {
|
|
419
|
-
return this.context.isMetavariablePresentByReference(reference);
|
|
420
|
-
}
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
key: "isMetaLemmaMetatheoremPresentByReference",
|
|
424
|
-
value: function isMetaLemmaMetatheoremPresentByReference(reference) {
|
|
425
|
-
return this.context.isMetaLemmaMetatheoremPresentByReference(reference);
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
|
-
{
|
|
429
|
-
key: "findAxiomLemmaTheoremOrConjectureByReference",
|
|
430
|
-
value: function findAxiomLemmaTheoremOrConjectureByReference(reference) {
|
|
431
|
-
return this.context.findAxiomLemmaTheoremOrConjectureByReference(reference);
|
|
432
|
-
}
|
|
433
|
-
},
|
|
434
|
-
{
|
|
435
|
-
key: "isMetavariablePresent",
|
|
436
|
-
value: function isMetavariablePresent(metavariable) {
|
|
437
|
-
return this.context.isMetavariablePresent(metavariable);
|
|
438
|
-
}
|
|
439
|
-
},
|
|
440
|
-
{
|
|
441
|
-
key: "isTypePresentByTypeName",
|
|
442
|
-
value: function isTypePresentByTypeName(typeName) {
|
|
443
|
-
var includeRelease = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, includeDependencies = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
|
|
444
|
-
return this.context.isTypePresentByTypeName(typeName, includeRelease, includeDependencies);
|
|
445
|
-
}
|
|
446
|
-
},
|
|
447
|
-
{
|
|
448
|
-
key: "isTypePresentByNominalTypeName",
|
|
449
|
-
value: function isTypePresentByNominalTypeName(nominalTypeName) {
|
|
450
|
-
return this.context.isTypePresentByNominalTypeName(nominalTypeName);
|
|
451
|
-
}
|
|
452
|
-
},
|
|
453
|
-
{
|
|
454
|
-
key: "isTypePresentByPrefixedTypeName",
|
|
455
|
-
value: function isTypePresentByPrefixedTypeName(prefixedTypeName) {
|
|
456
|
-
return this.context.isTypePresentByPrefixedTypeName(prefixedTypeName);
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
{
|
|
460
|
-
key: "isTypePrefixPresentByTypePrefixName",
|
|
461
|
-
value: function isTypePrefixPresentByTypePrefixName(typePrefixName) {
|
|
462
|
-
return this.context.isTypePrefixPresentByTypePrefixName(typePrefixName);
|
|
463
|
-
}
|
|
464
|
-
},
|
|
465
|
-
{
|
|
466
|
-
key: "isVariablePresentByVariableIdentifier",
|
|
467
|
-
value: function isVariablePresentByVariableIdentifier(variableIdentifier) {
|
|
468
|
-
var nested = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
|
469
|
-
var variable = this.findVariableByVariableIdentifier(variableIdentifier, nested), variablePresent = variable !== null;
|
|
470
|
-
return variablePresent;
|
|
471
|
-
}
|
|
472
|
-
},
|
|
473
|
-
{
|
|
474
|
-
key: "isLabelPresentByMetavariableName",
|
|
475
|
-
value: function isLabelPresentByMetavariableName(metavariableName) {
|
|
476
|
-
return this.context.isLabelPresentByMetavariableName(metavariableName);
|
|
477
|
-
}
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
key: "isLabelPresentByMetavariable",
|
|
481
|
-
value: function isLabelPresentByMetavariable(metavariable) {
|
|
482
|
-
return this.context.isLabelPresentByMetavariable(metavariable);
|
|
483
|
-
}
|
|
484
|
-
},
|
|
485
|
-
{
|
|
486
|
-
key: "isMetavariablePresentByMetavariableName",
|
|
487
|
-
value: function isMetavariablePresentByMetavariableName(metavariableNode) {
|
|
488
|
-
return this.context.isMetavariablePresentByMetavariableName(metavariableNode);
|
|
489
|
-
}
|
|
490
|
-
},
|
|
491
|
-
{
|
|
492
|
-
key: "isJudgementPresentByMetavariable",
|
|
493
|
-
value: function isJudgementPresentByMetavariable(metavariable) {
|
|
494
|
-
var judgement = this.findJudgementByMetavariable(metavariable), judgementPresent = judgement !== null;
|
|
495
|
-
return judgementPresent;
|
|
496
|
-
}
|
|
497
|
-
},
|
|
498
|
-
{
|
|
499
|
-
key: "isTermGrounded",
|
|
500
|
-
value: function isTermGrounded(term) {
|
|
501
|
-
var context = this, equivalences = this.getEquivalences(), groundedTerms = [], definedVariables = [];
|
|
502
|
-
equivalences.separateGroundedTermsAndDefinedVariables(groundedTerms, definedVariables, context);
|
|
503
|
-
var termMatchesGroundedTerm = groundedTerms.some(function(groundedTerm) {
|
|
504
|
-
var groundedTermNode = groundedTerm.getNode(), groundedTermNodeMatches = term.matchNode(groundedTermNode);
|
|
505
|
-
if (groundedTermNodeMatches) {
|
|
506
|
-
return true;
|
|
507
|
-
}
|
|
508
|
-
}), termGrounded = termMatchesGroundedTerm; ///
|
|
509
|
-
return termGrounded;
|
|
510
|
-
}
|
|
511
|
-
},
|
|
512
|
-
{
|
|
513
|
-
key: "isVariableDefined",
|
|
514
|
-
value: function isVariableDefined(variable) {
|
|
515
|
-
var context = this, equivalences = this.getEquivalences(), groundedTerms = [], definedVariables = [];
|
|
516
|
-
equivalences.separateGroundedTermsAndDefinedVariables(groundedTerms, definedVariables, context);
|
|
517
|
-
var variableMatchesDefinedVariable = definedVariables.some(function(definedVariable) {
|
|
518
|
-
var definedVariableEqualToVariable = definedVariable.isEqualTo(variable);
|
|
519
|
-
if (definedVariableEqualToVariable === variable) {
|
|
520
|
-
return true;
|
|
521
|
-
}
|
|
522
|
-
}), variableDefined = variableMatchesDefinedVariable; ///
|
|
523
|
-
return variableDefined;
|
|
524
|
-
}
|
|
525
|
-
},
|
|
526
|
-
{
|
|
527
|
-
key: "isMetavariableDefined",
|
|
528
|
-
value: function isMetavariableDefined(metavariable) {
|
|
529
|
-
var judgementPresent = this.isJudgementPresentByMetavariable(metavariable), metavariableDefined = judgementPresent; ///
|
|
530
|
-
return metavariableDefined;
|
|
531
|
-
}
|
|
532
|
-
},
|
|
533
|
-
{
|
|
534
|
-
key: "compareTermAndPropertyRelation",
|
|
535
|
-
value: function compareTermAndPropertyRelation(term, propertyRelation) {
|
|
536
|
-
var context = this, proofAssertions = this.getProofAssertions(), comparesToTermAndPropertyRelation = proofAssertions.some(function(proofAssertion) {
|
|
537
|
-
var comparesToTermAndPropertyRelation = proofAssertion.compareTermAndPropertyRelation(term, propertyRelation, context);
|
|
538
|
-
if (comparesToTermAndPropertyRelation) {
|
|
539
|
-
return true;
|
|
540
|
-
}
|
|
541
|
-
});
|
|
542
|
-
return comparesToTermAndPropertyRelation;
|
|
543
|
-
}
|
|
544
|
-
},
|
|
545
|
-
{
|
|
546
|
-
key: "nodeAsString",
|
|
547
|
-
value: function nodeAsString(node) {
|
|
548
|
-
return this.context.nodeAsString(node);
|
|
549
|
-
}
|
|
550
|
-
},
|
|
551
|
-
{
|
|
552
|
-
key: "nodesAsString",
|
|
553
|
-
value: function nodesAsString(node) {
|
|
554
|
-
return this.context.nodesAsString(node);
|
|
555
|
-
}
|
|
556
|
-
},
|
|
557
|
-
{
|
|
558
|
-
key: "trace",
|
|
559
|
-
value: function trace(message) {
|
|
560
|
-
var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
561
|
-
this.context.trace(message, node);
|
|
562
|
-
}
|
|
563
|
-
},
|
|
564
|
-
{
|
|
565
|
-
key: "debug",
|
|
566
|
-
value: function debug(message) {
|
|
567
|
-
var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
568
|
-
this.context.debug(message, node);
|
|
569
|
-
}
|
|
570
|
-
},
|
|
571
|
-
{
|
|
572
|
-
key: "info",
|
|
573
|
-
value: function info(message) {
|
|
574
|
-
var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
575
|
-
this.context.info(message, node);
|
|
576
|
-
}
|
|
577
|
-
},
|
|
578
|
-
{
|
|
579
|
-
key: "warning",
|
|
580
|
-
value: function warning(message) {
|
|
581
|
-
var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
582
|
-
this.context.warning(message, node);
|
|
583
|
-
}
|
|
584
|
-
},
|
|
585
|
-
{
|
|
586
|
-
key: "error",
|
|
587
|
-
value: function error(message) {
|
|
588
|
-
var node = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
589
|
-
this.context.error(message, node);
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
], [
|
|
593
|
-
{
|
|
594
|
-
key: "fromNothing",
|
|
595
|
-
value: function fromNothing(context) {
|
|
596
|
-
var Equivalences = _elements.default.Equivalences, variables = [], judgements = [], equivalences = Equivalences.fromNothing(), subproofOrProofAssertions = [], localContext = new LocalContext(context, variables, judgements, equivalences, subproofOrProofAssertions);
|
|
597
|
-
return localContext;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
]);
|
|
601
|
-
return LocalContext;
|
|
602
|
-
}();
|
|
603
|
-
var _default = LocalContext;
|
|
604
|
-
|
|
605
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2xvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5jb25zdCB7IGxhc3QgfSA9IGFycmF5VXRpbGl0aWVzO1xuXG5jbGFzcyBMb2NhbENvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCB2YXJpYWJsZXMsIGp1ZGdlbWVudHMsIGVxdWl2YWxlbmNlcywgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucykge1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7XG4gICAgdGhpcy5qdWRnZW1lbnRzID0ganVkZ2VtZW50cztcbiAgICB0aGlzLmVxdWl2YWxlbmNlcyA9IGVxdWl2YWxlbmNlcztcbiAgICB0aGlzLnN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgZ2V0VmFyaWFibGVzKG5lc3RlZCA9IHRydWUpIHtcbiAgICBsZXQgdmFyaWFibGVzO1xuXG4gICAgaWYgKG5lc3RlZCkge1xuICAgICAgdmFyaWFibGVzID0gdGhpcy5jb250ZXh0LmdldFZhcmlhYmxlcygpO1xuXG4gICAgICB2YXJpYWJsZXMgPSBbXG4gICAgICAgIC4uLnRoaXMudmFyaWFibGVzLFxuICAgICAgICAuLi52YXJpYWJsZXNcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcmlhYmxlcyA9IHRoaXMudmFyaWFibGVzO1xuICAgIH1cblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cblxuICBnZXRKdWRnZW1lbnRzKCkge1xuICAgIGxldCBqdWRnZW1lbnRzID0gdGhpcy5jb250ZXh0LmdldEp1ZGdlbWVudHMoKTtcblxuICAgIGp1ZGdlbWVudHMgPSBbIC8vL1xuICAgICAgLi4udGhpcy5qdWRnZW1lbnRzLFxuICAgICAgLi4uanVkZ2VtZW50c1xuICAgIF1cblxuICAgIHJldHVybiBqdWRnZW1lbnRzO1xuICB9XG5cbiAgZ2V0RXF1aXZhbGVuY2VzKCkge1xuICAgIGxldCBlcXVpdmFsZW5jZXMgPSB0aGlzLmNvbnRleHQuZ2V0RXF1aXZhbGVuY2VzKCk7XG5cbiAgICBlcXVpdmFsZW5jZXMgPSB0aGlzLmVxdWl2YWxlbmNlcy5tZXJnZWRXaXRoKGVxdWl2YWxlbmNlcyk7ICAvLy9cblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cblxuICBnZXRQcm9vZkFzc2VydGlvbnMoKSB7XG4gICAgY29uc3Qgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IHRoaXMuZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpLFxuICAgICAgICAgIHByb29mQXNzZXJ0aW9ucyA9IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMuZmlsdGVyKChzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnByb29mQXNzZXJ0aW9uID0gc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uLmlzUHJvb2ZBc3NlcnRpb24oKTtcblxuICAgICAgICAgICAgaWYgKHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnByb29mQXNzZXJ0aW9uKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb29mQXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldExhc3RQcm9vZkFzc2VydGlvbigpIHtcbiAgICBsZXQgbGFzdFByb29mQXNzZXJ0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IHByb29mQXNzZXJ0aW9ucyA9IHRoaXMuZ2V0UHJvb2ZBc3NlcnRpb25zKCksXG4gICAgICAgICAgcHJvb2ZBc3NlcnRpb25zTGVuZ3RoID0gcHJvb2ZBc3NlcnRpb25zLmxlbmd0aDtcblxuICAgIGlmIChwcm9vZkFzc2VydGlvbnNMZW5ndGggPiAwKSB7XG4gICAgICBsYXN0UHJvb2ZBc3NlcnRpb24gPSBsYXN0KHByb29mQXNzZXJ0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RQcm9vZkFzc2VydGlvbjtcbiAgfVxuXG4gIGdldFN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMoKSB7XG4gICAgbGV0IHN1YnByb29mT3JQcm9vZkFzc2VydGlvbnMgPSB0aGlzLmNvbnRleHQuZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucygpO1xuXG4gICAgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyA9IFsgIC8vL1xuICAgICAgLi4uc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyxcbiAgICAgIC4uLnRoaXMuc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uc1xuICAgIF07XG5cbiAgICByZXR1cm4gc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucztcbiAgfVxuXG4gIGdldEZpbGVQYXRoKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldEZpbGVQYXRoKCk7IH1cblxuICBnZXRMZXhlcigpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRMZXhlcigpOyB9XG5cbiAgZ2V0UGFyc2VyKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldFBhcnNlcigpOyB9XG5cbiAgZ2V0QXhpb21zKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldEF4aW9tcygpOyB9XG5cbiAgZ2V0TGVtbWFzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldExlbW1hcygpOyB9XG5cbiAgZ2V0VGhlb3JlbXMoKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZ2V0VGhlb3JlbXMoKTsgfVxuXG4gIGdldENvbmplY3R1cmVzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldENvbmplY3R1cmVzKCk7IH1cblxuICBnZXRDb21iaW5hdG9ycygpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDb21iaW5hdG9ycygpOyB9XG5cbiAgZ2V0Q29uc3RydWN0b3JzKCkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmdldENvbnN0cnVjdG9ycygpOyB9XG5cbiAgZ2V0VHlwZVByZWZpeCgpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRUeXBlUHJlZml4KCk7IH1cblxuICBhZGRBeGlvbShheGlvbSkgeyB0aGlzLmNvbnRleHQuYWRkQXhpb20oYXhpb20pOyB9XG5cbiAgYWRkTGVtbWEobGVtbWEpIHsgdGhpcy5jb250ZXh0LmFkZExlbW1hKGxlbW1hKTsgfVxuXG4gIGFkZFRoZW9yZW0odGhlb3JlbSkgeyB0aGlzLmNvbnRleHQuYWRkVGhlb3JlbSh0aGVvcmVtKTsgfVxuXG4gIGFkZEVxdWFsaXR5KGVxdWFsaXR5KSB7XG4gICAgbGV0IGVxdWFsaXR5QWRkZWQ7XG5cbiAgICBjb25zdCBlcXVhbGl0eVJlZmxleGl2ZSA9IGVxdWFsaXR5LmlzUmVmbGV4aXZlKCk7XG5cbiAgICBpZiAoIWVxdWFsaXR5UmVmbGV4aXZlKSB7XG4gICAgICBjb25zdCB7IEVxdWl2YWxlbmNlIH0gPSBlbGVtZW50cyxcbiAgICAgICAgICAgIGVxdWl2YWxlbmNlID0gRXF1aXZhbGVuY2UuZnJvbUVxdWFsaXR5KGVxdWFsaXR5KSxcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzOyAvLy9cblxuICAgICAgdGhpcy5lcXVpdmFsZW5jZXMgPSB0aGlzLmVxdWl2YWxlbmNlcy5tZXJnZWRXaXRoRXF1aXZhbGVuY2UoZXF1aXZhbGVuY2UsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGVxdWFsaXR5QWRkZWQgPSB0cnVlO1xuXG4gICAgaWYgKGVxdWFsaXR5QWRkZWQpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICAgIGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHtlcXVhbGl0eVN0cmluZ30nIGVxdWFsaXR5LmApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVxdWFsaXR5QWRkZWQ7XG4gIH1cblxuICBhZGRWYXJpYWJsZSh2YXJpYWJsZSwgbmVzdGVkID0gdHJ1ZSkge1xuICAgIGxldCB2YXJpYWJsZUFkZGVkID0gZmFsc2U7XG5cbiAgICBjb25zdCB2YXJpYWJsZUlkZW50aWZpZXIgPSB2YXJpYWJsZS5nZXRJZGVudGlmaWVyKCksXG4gICAgICAgICAgdmFyaWFibGVQcmVzZW50ID0gdGhpcy5pc1ZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllciwgbmVzdGVkKTtcblxuICAgIGlmICghdmFyaWFibGVQcmVzZW50KSB7XG4gICAgICB0aGlzLnZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcblxuICAgICAgdmFyaWFibGVBZGRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhcmlhYmxlQWRkZWQpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLFxuICAgICAgICAgICAgdmFyaWFibGVTdHJpbmcgPSB2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgICAgY29udGV4dC50cmFjZShgQWRkZWQgdGhlICcke3ZhcmlhYmxlU3RyaW5nfScgdmFyaWFibGUuYClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFyaWFibGVBZGRlZDtcbiAgfVxuXG4gIGFkZEp1ZGdlbWVudChqdWRnZW1lbnQpIHtcbiAgICBsZXQganVkZ2VtZW50QWRkZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IGp1ZGdlbWVudC5nZXRNZXRhdmFyaWFibGUoKSxcbiAgICAgICAgICBqdWRnZW1lbnRQcmVzZW50ID0gdGhpcy5pc0p1ZGdlbWVudFByZXNlbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuXG4gICAgaWYgKCFqdWRnZW1lbnRQcmVzZW50KSB7XG4gICAgICB0aGlzLmp1ZGdlbWVudHMucHVzaChqdWRnZW1lbnQpO1xuXG4gICAgICBqdWRnZW1lbnRBZGRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGp1ZGdlbWVudEFkZGVkKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgICBqdWRnZW1lbnRTdHJpbmcgPSBqdWRnZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGNvbnRleHQudHJhY2UoYEFkZGVkIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuYClcbiAgICB9XG5cbiAgICByZXR1cm4ganVkZ2VtZW50QWRkZWQ7XG4gIH1cblxuICBhZGRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24oc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uKSB7XG4gICAgdGhpcy5zdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zLnB1c2goc3VicHJvb2ZPclByb29mQXNzZXJ0aW9uKTtcbiAgfVxuXG4gIGZpbmRQcm9jZWR1cmVCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRQcm9jZWR1cmVCeU5hbWUobmFtZSk7IH1cblxuICBmaW5kTGFiZWxCeVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTGFiZWxCeVJlZmVyZW5jZShyZWZlcmVuY2UsIGNvbnRleHQpOyB9XG5cbiAgZmluZFJ1bGVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kUnVsZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kQXhpb21CeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgZmluZExlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZExlbW1hQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRUaGVvcmVtQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZFRoZW9yZW1CeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgZmluZENvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kQ29uamVjdHVyZUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kTWV0YUxlbW1hc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UocmVmZXJlbmNlKTsgfVxuXG4gIGZpbmRNZXRhTGVtbWFNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmZpbmRNZXRhTGVtbWFNZXRhdGhlb3JlbUJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kTWV0YUxlbW1hTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UocmVmZXJlbmNlKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZE1ldGFMZW1tYU1ldGF0aGVvcmVtc0J5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kVmFyaWFibGVCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIsIG5lc3RlZCA9IHRydWUpIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcyhuZXN0ZWQpLFxuICAgICAgICAgIHZhcmlhYmxlID0gdmFyaWFibGVzLmZpbmQoKHZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIgPSB2YXJpYWJsZS5jb21wYXJlVmFyaWFibGVJZGVudGlmaWVyKHZhcmlhYmxlSWRlbnRpZmllcik7XG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUNvbXBhcmVzVG9WYXJpYWJsZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiB2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRKdWRnZW1lbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudFNpbmd1bGFyID0ganVkZ2VtZW50LmlzU2luZ3VsYXIoKTtcblxuICAgICAgICAgICAgaWYgKGp1ZGdlbWVudFNpbmd1bGFyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE1ldGF2YXJpYWJsZSA9IGp1ZGdlbWVudC5nZXRNZXRhdmFyaWFibGUoKSxcbiAgICAgICAgICAgICAgICAgICAganVkZ2VtZW50TWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZSA9IGp1ZGdlbWVudE1ldGF2YXJpYWJsZS5pc0VxdWFsVG8obWV0YXZhcmlhYmxlKTtcblxuICAgICAgICAgICAgICBpZiAoanVkZ2VtZW50TWV0YXZhcmlhYmxlRXF1YWxUb01ldGF2YXJpYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBqdWRnZW1lbnQ7XG4gIH1cblxuICBmaW5kRXF1aXZhbGVuY2VCeVRlcm0odGVybSkgeyByZXR1cm4gdGhpcy5lcXVpdmFsZW5jZXMuZmluZEVxdWl2YWxlbmNlQnlUZXJtKHRlcm0pOyB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7IH1cblxuICBmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTGFiZWxCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpOyB9XG5cbiAgZmluZFR5cGVCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kVHlwZUJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSk7IH1cblxuICBmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZShtZXRhVHlwZU5hbWUpOyB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTsgfVxuXG4gIGlzUHJvY2VkdXJlUHJlc2VudEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lKG5hbWUpOyB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc0xhYmVsUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc01ldGF2YXJpYWJsZVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgaXNNZXRhTGVtbWFNZXRhdGhlb3JlbVByZXNlbnRCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc01ldGFMZW1tYU1ldGF0aGVvcmVtUHJlc2VudEJ5UmVmZXJlbmNlKHJlZmVyZW5jZSk7IH1cblxuICBmaW5kQXhpb21MZW1tYVRoZW9yZW1PckNvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5maW5kQXhpb21MZW1tYVRoZW9yZW1PckNvbmplY3R1cmVCeVJlZmVyZW5jZShyZWZlcmVuY2UpOyB9XG5cbiAgaXNNZXRhdmFyaWFibGVQcmVzZW50KG1ldGF2YXJpYWJsZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTWV0YXZhcmlhYmxlUHJlc2VudChtZXRhdmFyaWFibGUpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUodHlwZU5hbWUsIGluY2x1ZGVSZWxlYXNlID0gdHJ1ZSwgaW5jbHVkZURlcGVuZGVuY2llcyA9IHRydWUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc1R5cGVQcmVzZW50QnlUeXBlTmFtZSh0eXBlTmFtZSwgaW5jbHVkZVJlbGVhc2UsIGluY2x1ZGVEZXBlbmRlbmNpZXMpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5Tm9taW5hbFR5cGVOYW1lKG5vbWluYWxUeXBlTmFtZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzVHlwZVByZXNlbnRCeU5vbWluYWxUeXBlTmFtZShub21pbmFsVHlwZU5hbWUpOyB9XG5cbiAgaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNUeXBlUHJlc2VudEJ5UHJlZml4ZWRUeXBlTmFtZShwcmVmaXhlZFR5cGVOYW1lKTsgfVxuXG4gIGlzVHlwZVByZWZpeFByZXNlbnRCeVR5cGVQcmVmaXhOYW1lKHR5cGVQcmVmaXhOYW1lKSB7IHJldHVybiB0aGlzLmNvbnRleHQuaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUodHlwZVByZWZpeE5hbWUpOyB9XG5cbiAgaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlSWRlbnRpZmllcih2YXJpYWJsZUlkZW50aWZpZXIsIG5lc3RlZCA9IHRydWUpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuZmluZFZhcmlhYmxlQnlWYXJpYWJsZUlkZW50aWZpZXIodmFyaWFibGVJZGVudGlmaWVyLCBuZXN0ZWQpLFxuICAgICAgICAgIHZhcmlhYmxlUHJlc2VudCA9ICh2YXJpYWJsZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVQcmVzZW50O1xuICB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpOyB9XG5cbiAgaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHsgcmV0dXJuIHRoaXMuY29udGV4dC5pc0xhYmVsUHJlc2VudEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSk7IH1cblxuICBpc01ldGF2YXJpYWJsZVByZXNlbnRCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTm9kZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0LmlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOb2RlKTsgfVxuXG4gIGlzSnVkZ2VtZW50UHJlc2VudEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSkge1xuICAgIGNvbnN0IGp1ZGdlbWVudCA9IHRoaXMuZmluZEp1ZGdlbWVudEJ5TWV0YXZhcmlhYmxlKG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAganVkZ2VtZW50UHJlc2VudCA9IChqdWRnZW1lbnQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudFByZXNlbnQ7XG4gIH1cblxuICBpc1Rlcm1Hcm91bmRlZCh0ZXJtKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGVxdWl2YWxlbmNlcyA9IHRoaXMuZ2V0RXF1aXZhbGVuY2VzKCksXG4gICAgICAgICAgZ3JvdW5kZWRUZXJtcyA9IFtdLFxuICAgICAgICAgIGRlZmluZWRWYXJpYWJsZXMgPSBbXTtcblxuICAgIGVxdWl2YWxlbmNlcy5zZXBhcmF0ZUdyb3VuZGVkVGVybXNBbmREZWZpbmVkVmFyaWFibGVzKGdyb3VuZGVkVGVybXMsIGRlZmluZWRWYXJpYWJsZXMsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgdGVybU1hdGNoZXNHcm91bmRlZFRlcm0gPSBncm91bmRlZFRlcm1zLnNvbWUoKGdyb3VuZGVkVGVybSkgPT4ge1xuICAgICAgICBjb25zdCBncm91bmRlZFRlcm1Ob2RlID0gZ3JvdW5kZWRUZXJtLmdldE5vZGUoKSxcbiAgICAgICAgICAgICAgZ3JvdW5kZWRUZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoTm9kZShncm91bmRlZFRlcm1Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKGdyb3VuZGVkVGVybU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRlcm1Hcm91bmRlZCA9IHRlcm1NYXRjaGVzR3JvdW5kZWRUZXJtOyAvLy9cblxuICAgIHJldHVybiB0ZXJtR3JvdW5kZWQ7XG4gIH1cblxuICBpc1ZhcmlhYmxlRGVmaW5lZCh2YXJpYWJsZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBlcXVpdmFsZW5jZXMgPSB0aGlzLmdldEVxdWl2YWxlbmNlcygpLFxuICAgICAgICAgIGdyb3VuZGVkVGVybXMgPSBbXSxcbiAgICAgICAgICBkZWZpbmVkVmFyaWFibGVzID0gW107XG5cbiAgICBlcXVpdmFsZW5jZXMuc2VwYXJhdGVHcm91bmRlZFRlcm1zQW5kRGVmaW5lZFZhcmlhYmxlcyhncm91bmRlZFRlcm1zLCBkZWZpbmVkVmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgIGNvbnN0IHZhcmlhYmxlTWF0Y2hlc0RlZmluZWRWYXJpYWJsZSA9IGRlZmluZWRWYXJpYWJsZXMuc29tZSgoZGVmaW5lZFZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkVmFyaWFibGVFcXVhbFRvVmFyaWFibGUgPSBkZWZpbmVkVmFyaWFibGUuaXNFcXVhbFRvKHZhcmlhYmxlKTtcblxuICAgICAgICAgICAgaWYgKGRlZmluZWRWYXJpYWJsZUVxdWFsVG9WYXJpYWJsZSA9PT0gdmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFyaWFibGVEZWZpbmVkID0gdmFyaWFibGVNYXRjaGVzRGVmaW5lZFZhcmlhYmxlOyAvLy9cblxuICAgIHJldHVybiB2YXJpYWJsZURlZmluZWQ7XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZURlZmluZWQobWV0YXZhcmlhYmxlKSB7XG4gICAgY29uc3QganVkZ2VtZW50UHJlc2VudCA9IHRoaXMuaXNKdWRnZW1lbnRQcmVzZW50QnlNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVEZWZpbmVkID0ganVkZ2VtZW50UHJlc2VudDsgLy8vXG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlRGVmaW5lZFxuICB9XG5cbiAgY29tcGFyZVRlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uKHRlcm0sIHByb3BlcnR5UmVsYXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgcHJvb2ZBc3NlcnRpb25zID0gdGhpcy5nZXRQcm9vZkFzc2VydGlvbnMoKSxcbiAgICAgICAgICBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb24gPSBwcm9vZkFzc2VydGlvbnMuc29tZSgocHJvb2ZBc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbiA9IHByb29mQXNzZXJ0aW9uLmNvbXBhcmVUZXJtQW5kUHJvcGVydHlSZWxhdGlvbih0ZXJtLCBwcm9wZXJ0eVJlbGF0aW9uLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKGNvbXBhcmVzVG9UZXJtQW5kUHJvcGVydHlSZWxhdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb21wYXJlc1RvVGVybUFuZFByb3BlcnR5UmVsYXRpb247XG4gIH1cblxuICBub2RlQXNTdHJpbmcobm9kZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0Lm5vZGVBc1N0cmluZyhub2RlKTsgfVxuXG4gIG5vZGVzQXNTdHJpbmcobm9kZSkgeyByZXR1cm4gdGhpcy5jb250ZXh0Lm5vZGVzQXNTdHJpbmcobm9kZSk7IH1cblxuICB0cmFjZShtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQudHJhY2UobWVzc2FnZSwgbm9kZSk7IH1cblxuICBkZWJ1ZyhtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQuZGVidWcobWVzc2FnZSwgbm9kZSk7IH1cblxuICBpbmZvKG1lc3NhZ2UsIG5vZGUgPSBudWxsKSB7IHRoaXMuY29udGV4dC5pbmZvKG1lc3NhZ2UsIG5vZGUpOyB9XG5cbiAgd2FybmluZyhtZXNzYWdlLCBub2RlID0gbnVsbCkgeyB0aGlzLmNvbnRleHQud2FybmluZyhtZXNzYWdlLCBub2RlKTsgfVxuXG4gIGVycm9yKG1lc3NhZ2UsIG5vZGUgPSBudWxsKSB7IHRoaXMuY29udGV4dC5lcnJvcihtZXNzYWdlLCBub2RlKTsgfVxuXG4gIHN0YXRpYyBmcm9tTm90aGluZyhjb250ZXh0KSB7XG4gICAgY29uc3QgeyBFcXVpdmFsZW5jZXMgfSA9IGVsZW1lbnRzLFxuICAgICAgICAgIHZhcmlhYmxlcyA9IFtdLFxuICAgICAgICAgIGp1ZGdlbWVudHMgPSBbXSxcbiAgICAgICAgICBlcXVpdmFsZW5jZXMgPSBFcXVpdmFsZW5jZXMuZnJvbU5vdGhpbmcoKSxcbiAgICAgICAgICBzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zID0gW10sXG4gICAgICAgICAgbG9jYWxDb250ZXh0ID0gbmV3IExvY2FsQ29udGV4dChjb250ZXh0LCB2YXJpYWJsZXMsIGp1ZGdlbWVudHMsIGVxdWl2YWxlbmNlcywgc3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyk7XG5cbiAgICByZXR1cm4gbG9jYWxDb250ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvY2FsQ29udGV4dDsiXSwibmFtZXMiOlsibGFzdCIsImFycmF5VXRpbGl0aWVzIiwiTG9jYWxDb250ZXh0IiwiY29udGV4dCIsInZhcmlhYmxlcyIsImp1ZGdlbWVudHMiLCJlcXVpdmFsZW5jZXMiLCJzdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb25zIiwiZ2V0Q29udGV4dCIsImdldFZhcmlhYmxlcyIsIm5lc3RlZCIsImdldEp1ZGdlbWVudHMiLCJnZXRFcXVpdmFsZW5jZXMiLCJtZXJnZWRXaXRoIiwiZ2V0UHJvb2ZBc3NlcnRpb25zIiwiZ2V0U3VicHJvb2ZPclByb29mQXNzZXJ0aW9ucyIsInByb29mQXNzZXJ0aW9ucyIsImZpbHRlciIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbiIsInN1YnByb29mT3JQcm9vZkFzc2VydGlvbnByb29mQXNzZXJ0aW9uIiwiaXNQcm9vZkFzc2VydGlvbiIsImdldExhc3RQcm9vZkFzc2VydGlvbiIsImxhc3RQcm9vZkFzc2VydGlvbiIsInByb29mQXNzZXJ0aW9uc0xlbmd0aCIsImxlbmd0aCIsImdldEZpbGVQYXRoIiwiZ2V0TGV4ZXIiLCJnZXRQYXJzZXIiLCJnZXRBeGlvbXMiLCJnZXRMZW1tYXMiLCJnZXRUaGVvcmVtcyIsImdldENvbmplY3R1cmVzIiwiZ2V0Q29tYmluYXRvcnMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJnZXRUeXBlUHJlZml4IiwiYWRkQXhpb20iLCJheGlvbSIsImFkZExlbW1hIiwibGVtbWEiLCJhZGRUaGVvcmVtIiwidGhlb3JlbSIsImFkZEVxdWFsaXR5IiwiZXF1YWxpdHkiLCJlcXVhbGl0eUFkZGVkIiwiZXF1YWxpdHlSZWZsZXhpdmUiLCJpc1JlZmxleGl2ZSIsIkVxdWl2YWxlbmNlIiwiZWxlbWVudHMiLCJlcXVpdmFsZW5jZSIsImZyb21FcXVhbGl0eSIsIm1lcmdlZFdpdGhFcXVpdmFsZW5jZSIsImVxdWFsaXR5U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJhZGRWYXJpYWJsZSIsInZhcmlhYmxlIiwidmFyaWFibGVBZGRlZCIsInZhcmlhYmxlSWRlbnRpZmllciIsImdldElkZW50aWZpZXIiLCJ2YXJpYWJsZVByZXNlbnQiLCJpc1ZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVJZGVudGlmaWVyIiwicHVzaCIsInZhcmlhYmxlU3RyaW5nIiwiYWRkSnVkZ2VtZW50IiwianVkZ2VtZW50IiwianVkZ2VtZW50QWRkZWQiLCJtZXRhdmFyaWFibGUiLCJnZXRNZXRhdmFyaWFibGUiLCJqdWRnZW1lbnRQcmVzZW50IiwiaXNKdWRnZW1lbnRQcmVzZW50QnlNZXRhdmFyaWFibGUiLCJqdWRnZW1lbnRTdHJpbmciLCJhZGRTdWJwcm9vZk9yUHJvb2ZBc3NlcnRpb24iLCJmaW5kUHJvY2VkdXJlQnlOYW1lIiwibmFtZSIsImZpbmRMYWJlbEJ5UmVmZXJlbmNlIiwicmVmZXJlbmNlIiwiZmluZFJ1bGVCeVJlZmVyZW5jZSIsImZpbmRBeGlvbUJ5UmVmZXJlbmNlIiwiZmluZExlbW1hQnlSZWZlcmVuY2UiLCJmaW5kVGhlb3JlbUJ5UmVmZXJlbmNlIiwiZmluZENvbmplY3R1cmVCeVJlZmVyZW5jZSIsImZpbmRNZXRhTGVtbWFzQnlSZWZlcmVuY2UiLCJmaW5kTWV0YXRoZW9yZW1zQnlSZWZlcmVuY2UiLCJmaW5kTWV0YUxlbW1hTWV0YXRoZW9yZW1CeVJlZmVyZW5jZSIsImZpbmRNZXRhTGVtbWFNZXRhdGhlb3JlbXNCeVJlZmVyZW5jZSIsImZpbmRWYXJpYWJsZUJ5VmFyaWFibGVJZGVudGlmaWVyIiwiZmluZCIsInZhcmlhYmxlQ29tcGFyZXNUb1ZhcmlhYmxlSWRlbnRpZmllciIsImNvbXBhcmVWYXJpYWJsZUlkZW50aWZpZXIiLCJmaW5kSnVkZ2VtZW50QnlNZXRhdmFyaWFibGUiLCJqdWRnZW1lbnRTaW5ndWxhciIsImlzU2luZ3VsYXIiLCJqdWRnZW1lbnRNZXRhdmFyaWFibGUiLCJqdWRnZW1lbnRNZXRhdmFyaWFibGVFcXVhbFRvTWV0YXZhcmlhYmxlIiwiaXNFcXVhbFRvIiwiZmluZEVxdWl2YWxlbmNlQnlUZXJtIiwidGVybSIsImZpbmRNZXRhdmFyaWFibGUiLCJmaW5kTGFiZWxCeU1ldGF2YXJpYWJsZSIsImZpbmRUeXBlQnlOb21pbmFsVHlwZU5hbWUiLCJub21pbmFsVHlwZU5hbWUiLCJmaW5kTWV0YVR5cGVCeU1ldGFUeXBlTmFtZSIsIm1ldGFUeXBlTmFtZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJtZXRhdmFyaWFibGVOYW1lIiwiaXNQcm9jZWR1cmVQcmVzZW50QnlOYW1lIiwiaXNMYWJlbFByZXNlbnRCeVJlZmVyZW5jZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5UmVmZXJlbmNlIiwiaXNNZXRhTGVtbWFNZXRhdGhlb3JlbVByZXNlbnRCeVJlZmVyZW5jZSIsImZpbmRBeGlvbUxlbW1hVGhlb3JlbU9yQ29uamVjdHVyZUJ5UmVmZXJlbmNlIiwiaXNNZXRhdmFyaWFibGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ0eXBlTmFtZSIsImluY2x1ZGVSZWxlYXNlIiwiaW5jbHVkZURlcGVuZGVuY2llcyIsImlzVHlwZVByZXNlbnRCeU5vbWluYWxUeXBlTmFtZSIsImlzVHlwZVByZXNlbnRCeVByZWZpeGVkVHlwZU5hbWUiLCJwcmVmaXhlZFR5cGVOYW1lIiwiaXNUeXBlUHJlZml4UHJlc2VudEJ5VHlwZVByZWZpeE5hbWUiLCJ0eXBlUHJlZml4TmFtZSIsImlzTGFiZWxQcmVzZW50QnlNZXRhdmFyaWFibGVOYW1lIiwiaXNMYWJlbFByZXNlbnRCeU1ldGF2YXJpYWJsZSIsImlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJpc1Rlcm1Hcm91bmRlZCIsImdyb3VuZGVkVGVybXMiLCJkZWZpbmVkVmFyaWFibGVzIiwic2VwYXJhdGVHcm91bmRlZFRlcm1zQW5kRGVmaW5lZFZhcmlhYmxlcyIsInRlcm1NYXRjaGVzR3JvdW5kZWRUZXJtIiwic29tZSIsImdyb3VuZGVkVGVybSIsImdyb3VuZGVkVGVybU5vZGUiLCJnZXROb2RlIiwiZ3JvdW5kZWRUZXJtTm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJ0ZXJtR3JvdW5kZWQiLCJpc1ZhcmlhYmxlRGVmaW5lZCIsInZhcmlhYmxlTWF0Y2hlc0RlZmluZWRWYXJpYWJsZSIsImRlZmluZWRWYXJpYWJsZSIsImRlZmluZWRWYXJpYWJsZUVxdWFsVG9WYXJpYWJsZSIsInZhcmlhYmxlRGVmaW5lZCIsImlzTWV0YXZhcmlhYmxlRGVmaW5lZCIsIm1ldGF2YXJpYWJsZURlZmluZWQiLCJjb21wYXJlVGVybUFuZFByb3BlcnR5UmVsYXRpb24iLCJwcm9wZXJ0eVJlbGF0aW9uIiwiY29tcGFyZXNUb1Rlcm1BbmRQcm9wZXJ0eVJlbGF0aW9uIiwicHJvb2ZBc3NlcnRpb24iLCJub2RlQXNTdHJpbmciLCJub2RlIiwibm9kZXNBc1N0cmluZyIsIm1lc3NhZ2UiLCJkZWJ1ZyIsImluZm8iLCJ3YXJuaW5nIiwiZXJyb3IiLCJmcm9tTm90aGluZyIsIkVxdWl2YWxlbmNlcyIsImxvY2FsQ29udGV4dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBa1lBOzs7ZUFBQTs7O3lCQWhZK0I7K0RBRVY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|