occam-verify-cli 0.0.453 → 0.0.455

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 (40) hide show
  1. package/bin/utilities/fileSystem.js +15 -2
  2. package/lib/assertion.js +8 -1
  3. package/lib/context/file.js +42 -6
  4. package/lib/context/proof.js +25 -4
  5. package/lib/context/release/directory.js +16 -5
  6. package/lib/context/release/file.js +25 -11
  7. package/lib/kinds.js +5 -1
  8. package/lib/theorem.js +146 -0
  9. package/lib/variable.js +8 -1
  10. package/lib/verify/declaration/topLevel.js +7 -3
  11. package/lib/verify/derivation.js +112 -0
  12. package/lib/verify/equality.js +3 -16
  13. package/lib/verify/metaDerivation.js +47 -39
  14. package/lib/verify/proof.js +83 -0
  15. package/lib/verify/statement/unqualified.js +65 -4
  16. package/lib/verify/statement.js +2 -2
  17. package/lib/verify/term.js +12 -12
  18. package/lib/verify/termAsConstructor.js +2 -2
  19. package/lib/verify/theorem.js +57 -0
  20. package/package.json +3 -3
  21. package/src/assertion.js +8 -1
  22. package/src/context/file.js +45 -5
  23. package/src/context/proof.js +8 -4
  24. package/src/context/release/directory.js +17 -4
  25. package/src/context/release/file.js +29 -12
  26. package/src/kinds.js +1 -0
  27. package/src/theorem.js +130 -0
  28. package/src/variable.js +6 -0
  29. package/src/verify/assertion/type.js +25 -12
  30. package/src/verify/declaration/topLevel.js +7 -0
  31. package/src/verify/derivation.js +156 -0
  32. package/src/verify/equality.js +3 -22
  33. package/src/verify/metaDerivation.js +57 -45
  34. package/src/verify/proof.js +123 -0
  35. package/src/verify/statement/unqualified.js +69 -2
  36. package/src/verify/statement.js +2 -1
  37. package/src/verify/term.js +16 -17
  38. package/src/verify/termAsConstructor.js +1 -2
  39. package/src/verify/theorem.js +77 -0
  40. package/lib/verify/assertion/type.js +0 -104
@@ -9,17 +9,24 @@ const termNodeQuery = nodeQuery("/argument/term!"),
9
9
  typeNodeQuery = nodeQuery("/argument/type!"),
10
10
  variableNodeQuery = nodeQuery("/term/variable!");
11
11
 
12
- export default function verifyTerm(termNode, types, values, context) {
12
+ export default function verifyTerm(termNode, types, context) {
13
13
  let termVerified = false;
14
14
 
15
15
  context.begin(termNode);
16
16
 
17
- const termVerifiedAsVariable = verifyTermAsVariable(termNode, types, values, context);
17
+ const variables = [],
18
+ termVerifiedAsVariable = verifyTermAsVariable(termNode, variables, context);
18
19
 
19
20
  if (termVerifiedAsVariable) {
21
+ const firstVariable = first(variables),
22
+ variable = firstVariable, ///
23
+ type = variable.getType();
24
+
25
+ types.push(type);
26
+
20
27
  termVerified = true;
21
28
  } else {
22
- const termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, values, context);
29
+ const termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, context);
23
30
 
24
31
  if (termVerifiedAgainstConstructors) {
25
32
  termVerified = true;
@@ -33,7 +40,7 @@ export default function verifyTerm(termNode, types, values, context) {
33
40
  return termVerified;
34
41
  }
35
42
 
36
- export function verifyTermAsVariable(termNode, types, values, context) {
43
+ export function verifyTermAsVariable(termNode, variables, context) {
37
44
  let termVerifiedAsVariable = false;
38
45
 
39
46
  context.begin(termNode);
@@ -47,13 +54,9 @@ export function verifyTermAsVariable(termNode, types, values, context) {
47
54
  if (!variablePresent) {
48
55
  context.error(`The ${variableName} variable is not present.`)
49
56
  } else {
50
- const variable = context.findVariableByVariableName(variableName),
51
- type = variable.getType(),
52
- value = variable.getValue();
57
+ const variable = context.findVariableByVariableName(variableName);
53
58
 
54
- types.push(type);
55
-
56
- values.push(value);
59
+ variables.push(variable);
57
60
 
58
61
  termVerifiedAsVariable = true;
59
62
  }
@@ -66,7 +69,7 @@ export function verifyTermAsVariable(termNode, types, values, context) {
66
69
  return termVerifiedAsVariable;
67
70
  }
68
71
 
69
- export function verifyTermAgainstConstructors(termNode, types, values, context) {
72
+ export function verifyTermAgainstConstructors(termNode, types, context) {
70
73
  let termVerifiedAgainstConstructors = false;
71
74
 
72
75
  context.begin(termNode);
@@ -81,13 +84,10 @@ export function verifyTermAgainstConstructors(termNode, types, values, context)
81
84
  }) || null;
82
85
 
83
86
  if (constructor !== null) {
84
- const type = constructor.getType(),
85
- value = termNode; ///
87
+ const type = constructor.getType();
86
88
 
87
89
  types.push(type);
88
90
 
89
- values.push(value);
90
-
91
91
  termVerifiedAgainstConstructors = true;
92
92
  }
93
93
 
@@ -211,8 +211,7 @@ function verifyArgumentNode(argumentNode, constructorArgumentNode, context) {
211
211
  context.error(`The ${argumentString} argument should be a term, not a type`);
212
212
  } else {
213
213
  const types = [],
214
- values = [],
215
- termVerified = verifyTerm(termNode, types, values, context);
214
+ termVerified = verifyTerm(termNode, types, context);
216
215
 
217
216
  if (termVerified) {
218
217
  const firstType = first(types),
@@ -138,9 +138,8 @@ function verifyNonTerminalNode(nonTerminalNode, fileContext) {
138
138
  case TERM_RULE_NAME: {
139
139
  const termNode = nonTerminalNode, ///
140
140
  types = [],
141
- values = [],
142
141
  context = fileContext, ///
143
- termVerified = verifyTerm(termNode, types, values, context);
142
+ termVerified = verifyTerm(termNode, types, context);
144
143
 
145
144
  if (termVerified) {
146
145
  const firstType = first(types),
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ import Theorem from "../theorem";
4
+ import verifyLabels from "../verify/labels";
5
+ import ProofContext from "../context/proof";
6
+ import verifyUnqualifiedStatement from "../verify/statement/unqualified";
7
+ import verifyIndicativeConditional from "../verify/indicativeConditional";
8
+
9
+ import { front, last } from "../utilities/array";
10
+ import { nodesAsString } from "../utilities/string";
11
+ import { nodeQuery, nodesQuery } from "../utilities/query";
12
+
13
+ const labelNodesQuery = nodesQuery("/theorem/label"),
14
+ statementNodeQuery = nodeQuery("/unqualifiedStatement/statement!"),
15
+ statementNodesQuery = nodesQuery("/indicativeConditional/unqualifiedStatement/statement!"),
16
+ unqualifiedStatementNodeQuery = nodeQuery("/theorem/unqualifiedStatement!"),
17
+ indicativeConditionalNodeQuery = nodeQuery("/theorem/indicativeConditional!");
18
+
19
+ export default function verifyTheorem(theoremNode, fileContext) {
20
+ let theoremVerified = false;
21
+
22
+ fileContext.begin(theoremNode);
23
+
24
+ const labelNodes = labelNodesQuery(theoremNode),
25
+ labelsString = nodesAsString(labelNodes),
26
+ proofContext = ProofContext.fromFileContext(fileContext);
27
+
28
+ fileContext.debug(`Verifying the '${labelsString}' theorem...`);
29
+
30
+ const labels = [],
31
+ labelsVerified = verifyLabels(labelNodes, labels, fileContext);
32
+
33
+ if (labelsVerified) {
34
+ const unqualifiedStatementNode = unqualifiedStatementNodeQuery(theoremNode),
35
+ indicativeConditionalNode = indicativeConditionalNodeQuery(theoremNode);
36
+
37
+ if (unqualifiedStatementNode !== null) {
38
+ const unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
39
+
40
+ if (unqualifiedStatementVerified) {
41
+ const statementNode = statementNodeQuery(unqualifiedStatementNode),
42
+ theorem = Theorem.fromLabelsAndStatementNode(labels, statementNode);
43
+
44
+ fileContext.addTheorem(theorem);
45
+
46
+ theoremVerified = true;
47
+ }
48
+ }
49
+
50
+ if (indicativeConditionalNode !== null) {
51
+ const indicativeConditionalVerified = verifyIndicativeConditional(indicativeConditionalNode, proofContext);
52
+
53
+ if (indicativeConditionalVerified !== null) {
54
+ const statementNodes = statementNodesQuery(indicativeConditionalNode),
55
+ lastStatementNode = last(statementNodes),
56
+ frontStatementNodes = front(statementNodes),
57
+ consequentStatementNode = lastStatementNode, ///
58
+ suppositionStatementNodes = frontStatementNodes, ///
59
+ theorem = Theorem.fromLabelsSuppositionStatementNodesAndConsequentStatementNode(labels, suppositionStatementNodes, consequentStatementNode);
60
+
61
+ fileContext.addTheorem(theorem);
62
+
63
+ theoremVerified = true;
64
+ }
65
+ }
66
+ }
67
+
68
+ if (theoremVerified) {
69
+ fileContext.info(`Verified the '${labelsString}' theorem.`);
70
+ }
71
+
72
+ theoremVerified ?
73
+ fileContext.complete(theoremNode) :
74
+ fileContext.halt(theoremNode);
75
+
76
+ return theoremVerified;
77
+ }
@@ -1,104 +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 verifyTypeAssertion;
9
- }
10
- });
11
- var _variable = /*#__PURE__*/ _interopRequireDefault(require("../../variable"));
12
- var _term = /*#__PURE__*/ _interopRequireWildcard(require("../../verify/term"));
13
- var _array = require("../../utilities/array");
14
- var _string = require("../../utilities/string");
15
- var _query = require("../../utilities/query");
16
- function _interopRequireDefault(obj) {
17
- return obj && obj.__esModule ? obj : {
18
- default: obj
19
- };
20
- }
21
- function _getRequireWildcardCache(nodeInterop) {
22
- if (typeof WeakMap !== "function") return null;
23
- var cacheBabelInterop = new WeakMap();
24
- var cacheNodeInterop = new WeakMap();
25
- return (_getRequireWildcardCache = function(nodeInterop) {
26
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
27
- })(nodeInterop);
28
- }
29
- function _interopRequireWildcard(obj, nodeInterop) {
30
- if (!nodeInterop && obj && obj.__esModule) {
31
- return obj;
32
- }
33
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
34
- return {
35
- default: obj
36
- };
37
- }
38
- var cache = _getRequireWildcardCache(nodeInterop);
39
- if (cache && cache.has(obj)) {
40
- return cache.get(obj);
41
- }
42
- var newObj = {};
43
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
44
- for(var key in obj){
45
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
46
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
47
- if (desc && (desc.get || desc.set)) {
48
- Object.defineProperty(newObj, key, desc);
49
- } else {
50
- newObj[key] = obj[key];
51
- }
52
- }
53
- }
54
- newObj.default = obj;
55
- if (cache) {
56
- cache.set(obj, newObj);
57
- }
58
- return newObj;
59
- }
60
- var termNodeQuery = (0, _query.nodeQuery)("/typeAssertion/term"), typeNodeQuery = (0, _query.nodeQuery)("/typeAssertion/type");
61
- function verifyTypeAssertion(typeAssertionNode, proofContext) {
62
- var typeAssertionVerified = false;
63
- proofContext.begin(typeAssertionNode);
64
- var typeNode = typeNodeQuery(typeAssertionNode), typeName = (0, _query.typeNameFromTypeNode)(typeNode), typePresent = proofContext.isTypePresentByTypeName(typeName);
65
- if (!typePresent) {
66
- proofContext.error("The ".concat(typeName, " type is not present."));
67
- } else {
68
- var derived = proofContext.isDerived();
69
- if (derived) {
70
- debugger;
71
- } else {
72
- var types = [], values = [], context = proofContext, termNode = termNodeQuery(typeAssertionNode), termString = (0, _string.nodeAsString)(termNode), termVerifiedAsVariable = (0, _term.verifyTermAsVariable)(termNode, types, values, context);
73
- if (termVerifiedAsVariable) {
74
- var firstValue = (0, _array.first)(values), variableName = termString, value = firstValue; ///
75
- if (value !== undefined) {
76
- proofContext.error("The value of the ".concat(variableName, " variable is not undefined."));
77
- } else {
78
- var type = proofContext.findTypeByTypeName(typeName), firstType = (0, _array.first)(types), variableType = firstType, typeEqualToOrSubTypeOfVariableType = type.isEqualToOrSubTypeOf(variableType);
79
- if (!typeEqualToOrSubTypeOfVariableType) {
80
- proofContext.error("The asserted type of the ".concat(variableName, " variable is not equal to or a sub-type of its declared type."));
81
- } else {
82
- var name = variableName, variable = _variable.default.fromTypeAndName(type, name);
83
- proofContext.addVariable(variable);
84
- typeAssertionVerified = true;
85
- }
86
- }
87
- } else {
88
- var termVerifiedAgainstConstructors = (0, _term.verifyTermAgainstConstructors)(termNode, types, values, context);
89
- if (termVerifiedAgainstConstructors) {
90
- var type1 = proofContext.findTypeByTypeName(typeName), firstType1 = (0, _array.first)(types), termType = firstType1, typeEqualToOrSubTypeOfTermType = type1.isEqualToOrSubTypeOf(termType);
91
- if (!typeEqualToOrSubTypeOfTermType) {
92
- proofContext.error("The asserted type of the '".concat(termString, "' term is not equal to or a sub-type of its declared type."));
93
- } else {
94
- typeAssertionVerified = true;
95
- }
96
- }
97
- }
98
- }
99
- }
100
- typeAssertionVerified ? proofContext.complete(typeAssertionNode) : proofContext.halt(typeAssertionNode);
101
- return typeAssertionVerified;
102
- }
103
-
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJpZnkvYXNzZXJ0aW9uL3R5cGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBWYXJpYWJsZSBmcm9tIFwiLi4vLi4vdmFyaWFibGVcIjtcbmltcG9ydCB2ZXJpZnlUZXJtIGZyb20gXCIuLi8uLi92ZXJpZnkvdGVybVwiO1xuXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYXJyYXlcIjtcbmltcG9ydCB7IG5vZGVBc1N0cmluZyB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvc3RyaW5nXCI7XG5pbXBvcnQgeyBub2RlUXVlcnksIHR5cGVOYW1lRnJvbVR5cGVOb2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9xdWVyeVwiO1xuaW1wb3J0IHsgdmVyaWZ5VGVybUFzVmFyaWFibGUsIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzIH0gZnJvbSBcIi4uLy4uL3ZlcmlmeS90ZXJtXCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdHlwZUFzc2VydGlvbi90ZXJtXCIpLFxuICAgICAgdHlwZU5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi90eXBlQXNzZXJ0aW9uL3R5cGVcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVR5cGVBc3NlcnRpb24odHlwZUFzc2VydGlvbk5vZGUsIHByb29mQ29udGV4dCkge1xuICBsZXQgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gZmFsc2U7XG5cbiAgcHJvb2ZDb250ZXh0LmJlZ2luKHR5cGVBc3NlcnRpb25Ob2RlKTtcblxuICBjb25zdCB0eXBlTm9kZSA9IHR5cGVOb2RlUXVlcnkodHlwZUFzc2VydGlvbk5vZGUpLFxuICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVR5cGVOb2RlKHR5cGVOb2RlKSxcbiAgICAgICAgdHlwZVByZXNlbnQgPSBwcm9vZkNvbnRleHQuaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gIGlmICghdHlwZVByZXNlbnQpIHtcbiAgICBwcm9vZkNvbnRleHQuZXJyb3IoYFRoZSAke3R5cGVOYW1lfSB0eXBlIGlzIG5vdCBwcmVzZW50LmApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlcml2ZWQgPSBwcm9vZkNvbnRleHQuaXNEZXJpdmVkKCk7XG5cbiAgICBpZiAoZGVyaXZlZCkge1xuICAgICAgZGVidWdnZXJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZXMgPSBbXSxcbiAgICAgICAgICAgIHZhbHVlcyA9IFtdLFxuICAgICAgICAgICAgY29udGV4dCA9IHByb29mQ29udGV4dCwgLy8vXG4gICAgICAgICAgICB0ZXJtTm9kZSA9IHRlcm1Ob2RlUXVlcnkodHlwZUFzc2VydGlvbk5vZGUpLFxuICAgICAgICAgICAgdGVybVN0cmluZyA9IG5vZGVBc1N0cmluZyh0ZXJtTm9kZSksXG4gICAgICAgICAgICB0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlID0gdmVyaWZ5VGVybUFzVmFyaWFibGUodGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpO1xuXG4gICAgICBpZiAodGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gZmlyc3QodmFsdWVzKSxcbiAgICAgICAgICAgICAgdmFyaWFibGVOYW1lID0gdGVybVN0cmluZywgLy8vXG4gICAgICAgICAgICAgIHZhbHVlID0gZmlyc3RWYWx1ZTsgLy8vXG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9vZkNvbnRleHQuZXJyb3IoYFRoZSB2YWx1ZSBvZiB0aGUgJHt2YXJpYWJsZU5hbWV9IHZhcmlhYmxlIGlzIG5vdCB1bmRlZmluZWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHByb29mQ29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpLFxuICAgICAgICAgICAgICAgIGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZVR5cGUgPSBmaXJzdFR5cGUsIC8vL1xuICAgICAgICAgICAgICAgIHR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZWYXJpYWJsZVR5cGUgPSB0eXBlLmlzRXF1YWxUb09yU3ViVHlwZU9mKHZhcmlhYmxlVHlwZSk7XG5cbiAgICAgICAgICBpZiAoIXR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZWYXJpYWJsZVR5cGUpIHtcbiAgICAgICAgICAgIHByb29mQ29udGV4dC5lcnJvcihgVGhlIGFzc2VydGVkIHR5cGUgb2YgdGhlICR7dmFyaWFibGVOYW1lfSB2YXJpYWJsZSBpcyBub3QgZXF1YWwgdG8gb3IgYSBzdWItdHlwZSBvZiBpdHMgZGVjbGFyZWQgdHlwZS5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHZhcmlhYmxlTmFtZSwgIC8vL1xuICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSBWYXJpYWJsZS5mcm9tVHlwZUFuZE5hbWUodHlwZSwgbmFtZSk7XG5cbiAgICAgICAgICAgIHByb29mQ29udGV4dC5hZGRWYXJpYWJsZSh2YXJpYWJsZSk7XG5cbiAgICAgICAgICAgIHR5cGVBc3NlcnRpb25WZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzID0gdmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnModGVybU5vZGUsIHR5cGVzLCB2YWx1ZXMsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICh0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IHByb29mQ29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpLFxuICAgICAgICAgICAgICAgIGZpcnN0VHlwZSA9IGZpcnN0KHR5cGVzKSxcbiAgICAgICAgICAgICAgICB0ZXJtVHlwZSA9IGZpcnN0VHlwZSwgLy8vXG4gICAgICAgICAgICAgICAgdHlwZUVxdWFsVG9PclN1YlR5cGVPZlRlcm1UeXBlID0gdHlwZS5pc0VxdWFsVG9PclN1YlR5cGVPZih0ZXJtVHlwZSk7XG5cbiAgICAgICAgICBpZiAoIXR5cGVFcXVhbFRvT3JTdWJUeXBlT2ZUZXJtVHlwZSkge1xuICAgICAgICAgICAgcHJvb2ZDb250ZXh0LmVycm9yKGBUaGUgYXNzZXJ0ZWQgdHlwZSBvZiB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gaXMgbm90IGVxdWFsIHRvIG9yIGEgc3ViLXR5cGUgb2YgaXRzIGRlY2xhcmVkIHR5cGUuYCk7XG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdHlwZUFzc2VydGlvblZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQgP1xuICAgIHByb29mQ29udGV4dC5jb21wbGV0ZSh0eXBlQXNzZXJ0aW9uTm9kZSkgOlxuICAgICAgcHJvb2ZDb250ZXh0LmhhbHQodHlwZUFzc2VydGlvbk5vZGUpO1xuXG4gIHJldHVybiB0eXBlQXNzZXJ0aW9uVmVyaWZpZWQ7XG59XG4iXSwibmFtZXMiOlsidmVyaWZ5VHlwZUFzc2VydGlvbiIsInRlcm1Ob2RlUXVlcnkiLCJub2RlUXVlcnkiLCJ0eXBlTm9kZVF1ZXJ5IiwidHlwZUFzc2VydGlvbk5vZGUiLCJwcm9vZkNvbnRleHQiLCJ0eXBlQXNzZXJ0aW9uVmVyaWZpZWQiLCJiZWdpbiIsInR5cGVOb2RlIiwidHlwZU5hbWUiLCJ0eXBlTmFtZUZyb21UeXBlTm9kZSIsInR5cGVQcmVzZW50IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJlcnJvciIsImRlcml2ZWQiLCJpc0Rlcml2ZWQiLCJ0eXBlcyIsInZhbHVlcyIsImNvbnRleHQiLCJ0ZXJtTm9kZSIsInRlcm1TdHJpbmciLCJub2RlQXNTdHJpbmciLCJ0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFzVmFyaWFibGUiLCJmaXJzdFZhbHVlIiwiZmlyc3QiLCJ2YXJpYWJsZU5hbWUiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsInR5cGUiLCJmaW5kVHlwZUJ5VHlwZU5hbWUiLCJmaXJzdFR5cGUiLCJ2YXJpYWJsZVR5cGUiLCJ0eXBlRXF1YWxUb09yU3ViVHlwZU9mVmFyaWFibGVUeXBlIiwiaXNFcXVhbFRvT3JTdWJUeXBlT2YiLCJuYW1lIiwidmFyaWFibGUiLCJWYXJpYWJsZSIsImZyb21UeXBlQW5kTmFtZSIsImFkZFZhcmlhYmxlIiwidGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyIsInZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzIiwidGVybVR5cGUiLCJ0eXBlRXF1YWxUb09yU3ViVHlwZU9mVGVybVR5cGUiLCJjb21wbGV0ZSIsImhhbHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWFBOzs7ZUFBd0JBOzs7NkRBWEg7MERBQ0U7cUJBRUQ7c0JBQ087cUJBQ21COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHaEQsSUFBTUMsZ0JBQWdCQyxJQUFBQSxnQkFBUyxFQUFDLHdCQUMxQkMsZ0JBQWdCRCxJQUFBQSxnQkFBUyxFQUFDO0FBRWpCLFNBQVNGLG9CQUFvQkksaUJBQWlCLEVBQUVDLFlBQVksRUFBRTtJQUMzRSxJQUFJQyx3QkFBd0IsS0FBSztJQUVqQ0QsYUFBYUUsS0FBSyxDQUFDSDtJQUVuQixJQUFNSSxXQUFXTCxjQUFjQyxvQkFDekJLLFdBQVdDLElBQUFBLDJCQUFvQixFQUFDRixXQUNoQ0csY0FBY04sYUFBYU8sdUJBQXVCLENBQUNIO0lBRXpELElBQUksQ0FBQ0UsYUFBYTtRQUNoQk4sYUFBYVEsS0FBSyxDQUFDLEFBQUMsT0FBZSxPQUFUSixVQUFTO0lBQ3JDLE9BQU87UUFDTCxJQUFNSyxVQUFVVCxhQUFhVSxTQUFTO1FBRXRDLElBQUlELFNBQVM7WUFDWCxRQUFRO1FBQ1YsT0FBTztZQUNMLElBQU1FLFFBQVEsRUFBRSxFQUNWQyxTQUFTLEVBQUUsRUFDWEMsVUFBVWIsY0FDVmMsV0FBV2xCLGNBQWNHLG9CQUN6QmdCLGFBQWFDLElBQUFBLG9CQUFZLEVBQUNGLFdBQzFCRyx5QkFBeUJDLElBQUFBLDBCQUFvQixFQUFDSixVQUFVSCxPQUFPQyxRQUFRQztZQUU3RSxJQUFJSSx3QkFBd0I7Z0JBQzFCLElBQU1FLGFBQWFDLElBQUFBLFlBQUssRUFBQ1IsU0FDbkJTLGVBQWVOLFlBQ2ZPLFFBQVFILFlBQVksR0FBRztnQkFFN0IsSUFBSUcsVUFBVUMsV0FBVztvQkFDdkJ2QixhQUFhUSxLQUFLLENBQUMsQUFBQyxvQkFBZ0MsT0FBYmEsY0FBYTtnQkFDdEQsT0FBTztvQkFDTCxJQUFNRyxPQUFPeEIsYUFBYXlCLGtCQUFrQixDQUFDckIsV0FDdkNzQixZQUFZTixJQUFBQSxZQUFLLEVBQUNULFFBQ2xCZ0IsZUFBZUQsV0FDZkUscUNBQXFDSixLQUFLSyxvQkFBb0IsQ0FBQ0Y7b0JBRXJFLElBQUksQ0FBQ0Msb0NBQW9DO3dCQUN2QzVCLGFBQWFRLEtBQUssQ0FBQyxBQUFDLDRCQUF3QyxPQUFiYSxjQUFhO29CQUM5RCxPQUFPO3dCQUNMLElBQU1TLE9BQU9ULGNBQ1BVLFdBQVdDLGlCQUFRLENBQUNDLGVBQWUsQ0FBQ1QsTUFBTU07d0JBRWhEOUIsYUFBYWtDLFdBQVcsQ0FBQ0g7d0JBRXpCOUIsd0JBQXdCLElBQUk7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBTWtDLGtDQUFrQ0MsSUFBQUEsbUNBQTZCLEVBQUN0QixVQUFVSCxPQUFPQyxRQUFRQztnQkFFL0YsSUFBSXNCLGlDQUFpQztvQkFDbkMsSUFBTVgsUUFBT3hCLGFBQWF5QixrQkFBa0IsQ0FBQ3JCLFdBQ3ZDc0IsYUFBWU4sSUFBQUEsWUFBSyxFQUFDVCxRQUNsQjBCLFdBQVdYLFlBQ1hZLGlDQUFpQ2QsTUFBS0ssb0JBQW9CLENBQUNRO29CQUVqRSxJQUFJLENBQUNDLGdDQUFnQzt3QkFDbkN0QyxhQUFhUSxLQUFLLENBQUMsQUFBQyw2QkFBdUMsT0FBWE8sWUFBVztvQkFDN0QsT0FBTzt3QkFFTGQsd0JBQXdCLElBQUk7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEQSx3QkFDRUQsYUFBYXVDLFFBQVEsQ0FBQ3hDLHFCQUNwQkMsYUFBYXdDLElBQUksQ0FBQ3pDLGtCQUFrQjtJQUV4QyxPQUFPRTtBQUNUIn0=