occam-verify-cli 1.0.806 → 1.0.814

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 (103) hide show
  1. package/lib/context/bounded.js +242 -0
  2. package/lib/context/branching.js +3 -3
  3. package/lib/context/ephemeral.js +3 -3
  4. package/lib/context/file/nominal.js +16 -16
  5. package/lib/context/liminal.js +26 -30
  6. package/lib/context/synoptic.js +272 -0
  7. package/lib/context.js +66 -54
  8. package/lib/element/assertion/defined.js +8 -8
  9. package/lib/element/assertion/satisfies.js +15 -11
  10. package/lib/element/assertion.js +5 -5
  11. package/lib/element/assumption/metaLevel.js +3 -3
  12. package/lib/element/conclusion.js +11 -8
  13. package/lib/element/deduction.js +11 -8
  14. package/lib/element/derivation.js +1 -7
  15. package/lib/element/frame.js +6 -14
  16. package/lib/element/label.js +5 -8
  17. package/lib/element/metavariable.js +17 -17
  18. package/lib/element/procedureCall.js +10 -6
  19. package/lib/element/proof.js +2 -2
  20. package/lib/element/proofAssertion/premise.js +27 -27
  21. package/lib/element/proofAssertion/step.js +26 -6
  22. package/lib/element/proofAssertion/supposition.js +27 -27
  23. package/lib/element/proofAssertion.js +10 -10
  24. package/lib/element/reference.js +9 -13
  25. package/lib/element/rule.js +42 -44
  26. package/lib/element/signature.js +4 -4
  27. package/lib/element/statement.js +35 -45
  28. package/lib/element/subproof.js +5 -5
  29. package/lib/element/substitution/frame.js +16 -11
  30. package/lib/element/substitution/reference.js +15 -10
  31. package/lib/element/substitution/statement.js +62 -56
  32. package/lib/element/substitution/term.js +15 -10
  33. package/lib/element/substitution.js +29 -31
  34. package/lib/element/term.js +1 -16
  35. package/lib/element/topLevelAssertion/axiom.js +5 -3
  36. package/lib/element/topLevelAssertion.js +37 -39
  37. package/lib/element/topLevelMetaAssertion.js +2 -2
  38. package/lib/element/variable.js +6 -6
  39. package/lib/node/frame.js +1 -9
  40. package/lib/node/statement.js +1 -9
  41. package/lib/node/term.js +1 -19
  42. package/lib/process/assign.js +23 -31
  43. package/lib/utilities/context.js +41 -42
  44. package/lib/utilities/element.js +33 -5
  45. package/lib/utilities/equivalence.js +4 -4
  46. package/lib/utilities/equivalences.js +28 -13
  47. package/lib/utilities/instance.js +3 -3
  48. package/lib/utilities/string.js +2 -2
  49. package/lib/utilities/substitutions.js +16 -15
  50. package/lib/utilities/unification.js +133 -124
  51. package/package.json +4 -4
  52. package/src/context/{proof.js → bounded.js} +9 -9
  53. package/src/context/branching.js +2 -2
  54. package/src/context/ephemeral.js +2 -2
  55. package/src/context/file/nominal.js +15 -15
  56. package/src/context/liminal.js +29 -35
  57. package/src/context/{synthetic.js → synoptic.js} +84 -4
  58. package/src/context.js +88 -69
  59. package/src/element/assertion/defined.js +8 -8
  60. package/src/element/assertion/satisfies.js +17 -10
  61. package/src/element/assertion.js +8 -8
  62. package/src/element/assumption/metaLevel.js +4 -2
  63. package/src/element/conclusion.js +12 -7
  64. package/src/element/deduction.js +12 -7
  65. package/src/element/derivation.js +0 -2
  66. package/src/element/frame.js +7 -20
  67. package/src/element/label.js +3 -5
  68. package/src/element/metavariable.js +27 -27
  69. package/src/element/procedureCall.js +15 -10
  70. package/src/element/proof.js +2 -2
  71. package/src/element/proofAssertion/premise.js +41 -41
  72. package/src/element/proofAssertion/step.js +39 -9
  73. package/src/element/proofAssertion/supposition.js +41 -41
  74. package/src/element/proofAssertion.js +10 -9
  75. package/src/element/reference.js +9 -13
  76. package/src/element/rule.js +59 -63
  77. package/src/element/signature.js +3 -3
  78. package/src/element/statement.js +54 -68
  79. package/src/element/subproof.js +5 -5
  80. package/src/element/substitution/frame.js +18 -8
  81. package/src/element/substitution/reference.js +16 -7
  82. package/src/element/substitution/statement.js +87 -74
  83. package/src/element/substitution/term.js +15 -6
  84. package/src/element/substitution.js +38 -41
  85. package/src/element/term.js +0 -26
  86. package/src/element/topLevelAssertion/axiom.js +5 -2
  87. package/src/element/topLevelAssertion.js +51 -55
  88. package/src/element/topLevelMetaAssertion.js +2 -2
  89. package/src/element/variable.js +5 -5
  90. package/src/node/frame.js +0 -12
  91. package/src/node/statement.js +0 -12
  92. package/src/node/term.js +0 -28
  93. package/src/process/assign.js +35 -46
  94. package/src/utilities/context.js +41 -43
  95. package/src/utilities/element.js +32 -4
  96. package/src/utilities/equivalence.js +3 -4
  97. package/src/utilities/equivalences.js +29 -17
  98. package/src/utilities/instance.js +3 -3
  99. package/src/utilities/string.js +2 -2
  100. package/src/utilities/substitutions.js +17 -15
  101. package/src/utilities/unification.js +145 -119
  102. package/lib/context/proof.js +0 -242
  103. package/lib/context/synthetic.js +0 -212
@@ -0,0 +1,272 @@
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 SynopticContext;
9
+ }
10
+ });
11
+ const _necessary = require("necessary");
12
+ const _context = /*#__PURE__*/ _interop_require_default(require("../context"));
13
+ function _interop_require_default(obj) {
14
+ return obj && obj.__esModule ? obj : {
15
+ default: obj
16
+ };
17
+ }
18
+ const { push, last, compress } = _necessary.arrayUtilities;
19
+ class SynopticContext extends _context.default {
20
+ constructor(context, contexts){
21
+ super(context);
22
+ this.contexts = contexts;
23
+ }
24
+ getContexts() {
25
+ return this.contexts;
26
+ }
27
+ getTerms() {
28
+ const terms = [];
29
+ this.contexts.forEach((context)=>{
30
+ const contextTerms = context.getTerms();
31
+ push(terms, contextTerms);
32
+ });
33
+ compress(terms, (termA, termB)=>{
34
+ const termAComparesToTermB = termA.compareTerm(termB);
35
+ if (!termAComparesToTermB) {
36
+ return true;
37
+ }
38
+ });
39
+ return terms;
40
+ }
41
+ getFrames() {
42
+ const frames = [];
43
+ this.contexts.forEach((context)=>{
44
+ const contextFrames = context.getFrames();
45
+ push(frames, contextFrames);
46
+ });
47
+ compress(frames, (frameA, frameB)=>{
48
+ const frameAEqualToFrameB = frameA.isEqualTo(frameB);
49
+ if (!frameAEqualToFrameB) {
50
+ return true;
51
+ }
52
+ });
53
+ return frames;
54
+ }
55
+ getEqualities() {
56
+ const equalities = [];
57
+ this.contexts.forEach((context)=>{
58
+ const contextEqualities = context.getEqualities();
59
+ push(equalities, contextEqualities);
60
+ });
61
+ compress(equalities, (equalityA, equalityB)=>{
62
+ const equalityAEqualToEqualityB = equalityA.isEqualTo(equalityB);
63
+ if (!equalityAEqualToEqualityB) {
64
+ return true;
65
+ }
66
+ });
67
+ return equalities;
68
+ }
69
+ getJudgements() {
70
+ const judgements = [];
71
+ this.contexts.forEach((context)=>{
72
+ const contextJudgements = context.getJudgements();
73
+ push(judgements, contextJudgements);
74
+ });
75
+ compress(judgements, (judgementA, judgementB)=>{
76
+ const judgementAEqualToJudgementB = judgementA.isEqualTo(judgementB);
77
+ if (!judgementAEqualToJudgementB) {
78
+ return true;
79
+ }
80
+ });
81
+ return judgements;
82
+ }
83
+ getStatements() {
84
+ const statements = [];
85
+ this.contexts.forEach((context)=>{
86
+ const contextStatements = context.getStatements();
87
+ push(statements, contextStatements);
88
+ });
89
+ compress(statements, (statementA, statementB)=>{
90
+ const statementAEqualToStatementB = statementA.isEqualTo(statementB);
91
+ if (!statementAEqualToStatementB) {
92
+ return true;
93
+ }
94
+ });
95
+ return statements;
96
+ }
97
+ getAssertions() {
98
+ const assertions = [];
99
+ this.contexts.forEach((context)=>{
100
+ const contextAssertions = context.getAssertions();
101
+ push(assertions, contextAssertions);
102
+ });
103
+ compress(assertions, (assertionA, assertionB)=>{
104
+ const assertionAEqualToAssertionB = assertionA.isEqualTo(assertionB);
105
+ if (!assertionAEqualToAssertionB) {
106
+ return true;
107
+ }
108
+ });
109
+ return assertions;
110
+ }
111
+ getReferences() {
112
+ const references = [];
113
+ this.contexts.forEach((context)=>{
114
+ const contextReferences = context.getReferences();
115
+ push(references, contextReferences);
116
+ });
117
+ compress(references, (referenceA, referenceB)=>{
118
+ const referenceAEqualToReferenceB = referenceA.isEqualTo(referenceB);
119
+ if (!referenceAEqualToReferenceB) {
120
+ return true;
121
+ }
122
+ });
123
+ return references;
124
+ }
125
+ getAssumptions() {
126
+ const assumptions = [];
127
+ this.contexts.forEach((context)=>{
128
+ const contextAssumptions = context.getAssumptions();
129
+ push(assumptions, contextAssumptions);
130
+ });
131
+ compress(assumptions, (assumptionA, assumptionB)=>{
132
+ const assumptionAEqualToAssumptionB = assumptionA.isEqualTo(assumptionB);
133
+ if (!assumptionAEqualToAssumptionB) {
134
+ return true;
135
+ }
136
+ });
137
+ return assumptions;
138
+ }
139
+ getMetavariables() {
140
+ const metavariables = [];
141
+ this.contexts.forEach((context)=>{
142
+ const contextMetavariables = context.getMetavariables();
143
+ push(metavariables, contextMetavariables);
144
+ });
145
+ compress(metavariables, (metavariableA, metavariableB)=>{
146
+ const metavariableAEqualToMetavariableB = metavariableA.isEqualTo(metavariableB);
147
+ if (!metavariableAEqualToMetavariableB) {
148
+ return true;
149
+ }
150
+ });
151
+ return metavariables;
152
+ }
153
+ getSubstitutions() {
154
+ const substitutions = [];
155
+ this.contexts.forEach((context)=>{
156
+ const contextSubstitutions = context.getSubstitutions();
157
+ push(substitutions, contextSubstitutions);
158
+ });
159
+ compress(substitutions, (substitutionA, substitutionB)=>{
160
+ const substitutionAEqualToSubstitutionB = substitutionA.isEqualTo(substitutionB);
161
+ if (!substitutionAEqualToSubstitutionB) {
162
+ return true;
163
+ }
164
+ });
165
+ return substitutions;
166
+ }
167
+ findTermByTermNode(termNode) {
168
+ const terms = this.getTerms(), term = terms.find((term)=>{
169
+ const termNodeMatches = term.matchTermNode(termNode);
170
+ if (termNodeMatches) {
171
+ return true;
172
+ }
173
+ }) || null;
174
+ return term;
175
+ }
176
+ findFrameByFrameNode(frameNode) {
177
+ const frames = this.getFrames(), frame = frames.find((frame)=>{
178
+ const frameNodeMatches = frame.matchFrameNode(frameNode);
179
+ if (frameNodeMatches) {
180
+ return true;
181
+ }
182
+ }) || null;
183
+ return frame;
184
+ }
185
+ findEqualityByEqualityNode(equalityNode) {
186
+ const equalities = this.getEqualities(), equality = equalities.find((equality)=>{
187
+ const equalityNodeMatches = equality.matchEqualityNode(equalityNode);
188
+ if (equalityNodeMatches) {
189
+ return true;
190
+ }
191
+ }) || null;
192
+ return equality;
193
+ }
194
+ findJudgementByJudgementNode(judgementNode) {
195
+ const judgements = this.getJudgements(), judgement = judgements.find((judgement)=>{
196
+ const judgementNodeMatches = judgement.matchJudgementNode(judgementNode);
197
+ if (judgementNodeMatches) {
198
+ return true;
199
+ }
200
+ }) || null;
201
+ return judgement;
202
+ }
203
+ findStatementByStatementNode(statementNode) {
204
+ const statements = this.getStatements(), statement = statements.find((statement)=>{
205
+ const statementNodeMatches = statement.matchStatementNode(statementNode);
206
+ if (statementNodeMatches) {
207
+ return true;
208
+ }
209
+ }) || null;
210
+ return statement;
211
+ }
212
+ findReferenceByReferenceNode(referenceNode) {
213
+ const references = this.getReferences(), reference = references.find((reference)=>{
214
+ const referenceMatcheReferenceNode = reference.matchReferenceNode(referenceNode);
215
+ if (referenceMatcheReferenceNode) {
216
+ return true;
217
+ }
218
+ }) || null;
219
+ return reference;
220
+ }
221
+ findAssertionByAssertionNode(assertionNode) {
222
+ const assertions = this.getAssertions(), assertion = assertions.find((assertion)=>{
223
+ const assertionNodeMatches = assertion.matchAssertionNode(assertionNode);
224
+ if (assertionNodeMatches) {
225
+ return true;
226
+ }
227
+ }) || null;
228
+ return assertion;
229
+ }
230
+ findAssumptionByAssumptionNode(assumptionNode) {
231
+ const assumptions = this.getAssumptions(), assumption = assumptions.find((assumption)=>{
232
+ const assumptionNodeMatches = assumption.matchAssumptionNode(assumptionNode);
233
+ if (assumptionNodeMatches) {
234
+ return true;
235
+ }
236
+ }) || null;
237
+ return assumption;
238
+ }
239
+ findReferenceByMetavariableNode(metavariableNode) {
240
+ const references = this.getReferences(), reference = references.find((reference)=>{
241
+ const referenceMatcheMetavariableNode = reference.matchMetavariableNode(metavariableNode);
242
+ if (referenceMatcheMetavariableNode) {
243
+ return true;
244
+ }
245
+ }) || null;
246
+ return reference;
247
+ }
248
+ findMetavariableByMetavariableNode(metavariableNode) {
249
+ const metavariables = this.getMetavariables(), metavariable = metavariables.find((metavariable)=>{
250
+ const metavariableNodeMatches = metavariable.matchMetavariableNode(metavariableNode);
251
+ if (metavariableNodeMatches) {
252
+ return true;
253
+ }
254
+ }) || null;
255
+ return metavariable;
256
+ }
257
+ findSubstitutionBySubstitutionNode(substitutionNode) {
258
+ const substitutions = this.getSubstitutions(), substitution = substitutions.find((substitution)=>{
259
+ const substitutionNodeMatches = substitution.matchSubstitutionNode(substitutionNode);
260
+ if (substitutionNodeMatches) {
261
+ return true;
262
+ }
263
+ }) || null;
264
+ return substitution;
265
+ }
266
+ static fromContexts(...contexts) {
267
+ const lastContext = last(contexts), context = lastContext, synopticContext = new SynopticContext(context, contexts);
268
+ return synopticContext;
269
+ }
270
+ }
271
+
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L3N5bm9wdGljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IENvbnRleHQgZnJvbSBcIi4uL2NvbnRleHRcIjtcblxuY29uc3QgeyBwdXNoLCBsYXN0LCBjb21wcmVzcyB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bm9wdGljQ29udGV4dCBleHRlbmRzIENvbnRleHQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBjb250ZXh0cykge1xuICAgIHN1cGVyKGNvbnRleHQpO1xuXG4gICAgdGhpcy5jb250ZXh0cyA9IGNvbnRleHRzO1xuICB9XG5cbiAgZ2V0Q29udGV4dHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dHM7XG4gIH1cblxuICBnZXRUZXJtcygpIHtcbiAgICBjb25zdCB0ZXJtcyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0VGVybXMgPSBjb250ZXh0LmdldFRlcm1zKCk7XG5cbiAgICAgIHB1c2godGVybXMsIGNvbnRleHRUZXJtcyk7XG4gICAgfSk7XG4gICAgXG4gICAgY29tcHJlc3ModGVybXMsICh0ZXJtQSwgdGVybUIpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1BQ29tcGFyZXNUb1Rlcm1CID0gdGVybUEuY29tcGFyZVRlcm0odGVybUIpO1xuICAgICAgXG4gICAgICBpZiAoIXRlcm1BQ29tcGFyZXNUb1Rlcm1CKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlcm1zO1xuICB9XG5cbiAgZ2V0RnJhbWVzKCkge1xuICAgIGNvbnN0IGZyYW1lcyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0RnJhbWVzID0gY29udGV4dC5nZXRGcmFtZXMoKTtcblxuICAgICAgcHVzaChmcmFtZXMsIGNvbnRleHRGcmFtZXMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3MoZnJhbWVzLCAoZnJhbWVBLCBmcmFtZUIpID0+IHtcbiAgICAgIGNvbnN0IGZyYW1lQUVxdWFsVG9GcmFtZUIgPSBmcmFtZUEuaXNFcXVhbFRvKGZyYW1lQik7XG5cbiAgICAgIGlmICghZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmcmFtZXM7XG4gIH1cblxuICBnZXRFcXVhbGl0aWVzKCkge1xuICAgIGNvbnN0IGVxdWFsaXRpZXMgPSBbXTtcblxuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dEVxdWFsaXRpZXMgPSBjb250ZXh0LmdldEVxdWFsaXRpZXMoKTtcblxuICAgICAgcHVzaChlcXVhbGl0aWVzLCBjb250ZXh0RXF1YWxpdGllcyk7XG4gICAgfSk7XG5cbiAgICBjb21wcmVzcyhlcXVhbGl0aWVzLCAoZXF1YWxpdHlBLCBlcXVhbGl0eUIpID0+IHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG5cbiAgICAgIGlmICghZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5Qikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlcXVhbGl0aWVzO1xuICB9XG5cbiAgZ2V0SnVkZ2VtZW50cygpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRKdWRnZW1lbnRzID0gY29udGV4dC5nZXRKdWRnZW1lbnRzKCk7XG5cbiAgICAgIHB1c2goanVkZ2VtZW50cywgY29udGV4dEp1ZGdlbWVudHMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3MoanVkZ2VtZW50cywgKGp1ZGdlbWVudEEsIGp1ZGdlbWVudEIpID0+IHtcbiAgICAgIGNvbnN0IGp1ZGdlbWVudEFFcXVhbFRvSnVkZ2VtZW50QiA9IGp1ZGdlbWVudEEuaXNFcXVhbFRvKGp1ZGdlbWVudEIpO1xuXG4gICAgICBpZiAoIWp1ZGdlbWVudEFFcXVhbFRvSnVkZ2VtZW50Qikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBqdWRnZW1lbnRzO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50cygpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRTdGF0ZW1lbnRzID0gY29udGV4dC5nZXRTdGF0ZW1lbnRzKCk7XG5cbiAgICAgIHB1c2goc3RhdGVtZW50cywgY29udGV4dFN0YXRlbWVudHMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3Moc3RhdGVtZW50cywgKHN0YXRlbWVudEEsIHN0YXRlbWVudEIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50QiA9IHN0YXRlbWVudEEuaXNFcXVhbFRvKHN0YXRlbWVudEIpO1xuXG4gICAgICBpZiAoIXN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50Qikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgZ2V0QXNzZXJ0aW9ucygpIHtcbiAgICBjb25zdCBhc3NlcnRpb25zID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRBc3NlcnRpb25zID0gY29udGV4dC5nZXRBc3NlcnRpb25zKCk7XG5cbiAgICAgIHB1c2goYXNzZXJ0aW9ucywgY29udGV4dEFzc2VydGlvbnMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3MoYXNzZXJ0aW9ucywgKGFzc2VydGlvbkEsIGFzc2VydGlvbkIpID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiA9IGFzc2VydGlvbkEuaXNFcXVhbFRvKGFzc2VydGlvbkIpO1xuXG4gICAgICBpZiAoIWFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0UmVmZXJlbmNlcygpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gW107XG5cbiAgICB0aGlzLmNvbnRleHRzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRSZWZlcmVuY2VzID0gY29udGV4dC5nZXRSZWZlcmVuY2VzKCk7XG5cbiAgICAgIHB1c2gocmVmZXJlbmNlcywgY29udGV4dFJlZmVyZW5jZXMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3MocmVmZXJlbmNlcywgKHJlZmVyZW5jZUEsIHJlZmVyZW5jZUIpID0+IHtcbiAgICAgIGNvbnN0IHJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQiA9IHJlZmVyZW5jZUEuaXNFcXVhbFRvKHJlZmVyZW5jZUIpO1xuXG4gICAgICBpZiAoIXJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG5cbiAgZ2V0QXNzdW1wdGlvbnMoKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXTtcblxuICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dEFzc3VtcHRpb25zID0gY29udGV4dC5nZXRBc3N1bXB0aW9ucygpO1xuXG4gICAgICBwdXNoKGFzc3VtcHRpb25zLCBjb250ZXh0QXNzdW1wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgY29tcHJlc3MoYXNzdW1wdGlvbnMsIChhc3N1bXB0aW9uQSwgYXNzdW1wdGlvbkIpID0+IHtcbiAgICAgIGNvbnN0IGFzc3VtcHRpb25BRXF1YWxUb0Fzc3VtcHRpb25CID0gYXNzdW1wdGlvbkEuaXNFcXVhbFRvKGFzc3VtcHRpb25CKTtcblxuICAgICAgaWYgKCFhc3N1bXB0aW9uQUVxdWFsVG9Bc3N1bXB0aW9uQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhc3N1bXB0aW9ucztcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZXMoKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0TWV0YXZhcmlhYmxlcyA9IGNvbnRleHQuZ2V0TWV0YXZhcmlhYmxlcygpO1xuXG4gICAgICBwdXNoKG1ldGF2YXJpYWJsZXMsIGNvbnRleHRNZXRhdmFyaWFibGVzKTtcbiAgICB9KTtcblxuICAgIGNvbXByZXNzKG1ldGF2YXJpYWJsZXMsIChtZXRhdmFyaWFibGVBLCBtZXRhdmFyaWFibGVCKSA9PiB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIgPSBtZXRhdmFyaWFibGVBLmlzRXF1YWxUbyhtZXRhdmFyaWFibGVCKTtcblxuICAgICAgaWYgKCFtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlcztcbiAgfVxuXG4gIGdldFN1YnN0aXR1dGlvbnMoKSB7XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IFtdO1xuXG4gICAgdGhpcy5jb250ZXh0cy5mb3JFYWNoKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0U3Vic3RpdHV0aW9ucyA9IGNvbnRleHQuZ2V0U3Vic3RpdHV0aW9ucygpO1xuXG4gICAgICBwdXNoKHN1YnN0aXR1dGlvbnMsIGNvbnRleHRTdWJzdGl0dXRpb25zKTtcbiAgICB9KTtcblxuICAgIGNvbXByZXNzKHN1YnN0aXR1dGlvbnMsIChzdWJzdGl0dXRpb25BLCBzdWJzdGl0dXRpb25CKSA9PiB7XG4gICAgICBjb25zdCBzdWJzdGl0dXRpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIgPSBzdWJzdGl0dXRpb25BLmlzRXF1YWxUbyhzdWJzdGl0dXRpb25CKTtcblxuICAgICAgaWYgKCFzdWJzdGl0dXRpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9ucztcbiAgfVxuXG4gIGZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm1zID0gdGhpcy5nZXRUZXJtcygpLFxuICAgICAgICAgIHRlcm0gPSB0ZXJtcy5maW5kKCh0ZXJtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXJtTm9kZU1hdGNoZXMgPSB0ZXJtLm1hdGNoVGVybU5vZGUodGVybU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAodGVybU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lcyA9IHRoaXMuZ2V0RnJhbWVzKCksXG4gICAgICAgICAgZnJhbWUgPSBmcmFtZXMuZmluZCgoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lTm9kZU1hdGNoZXMgPSBmcmFtZS5tYXRjaEZyYW1lTm9kZShmcmFtZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZnJhbWVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSB7XG4gICAgY29uc3QgZXF1YWxpdGllcyA9IHRoaXMuZ2V0RXF1YWxpdGllcygpLFxuICAgICAgICAgIGVxdWFsaXR5ID0gZXF1YWxpdGllcy5maW5kKChlcXVhbGl0eSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXF1YWxpdHlOb2RlTWF0Y2hlcyA9IGVxdWFsaXR5Lm1hdGNoRXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChlcXVhbGl0eU5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZXF1YWxpdHk7XG4gIH1cblxuICBmaW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpIHtcbiAgICBjb25zdCBqdWRnZW1lbnRzID0gdGhpcy5nZXRKdWRnZW1lbnRzKCksXG4gICAgICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50cy5maW5kKChqdWRnZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGp1ZGdlbWVudE5vZGVNYXRjaGVzID0ganVkZ2VtZW50Lm1hdGNoSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKTtcblxuICAgICAgICAgICAgaWYgKGp1ZGdlbWVudE5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IHRoaXMuZ2V0U3RhdGVtZW50cygpLFxuICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudHMuZmluZCgoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZW1lbnROb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaFN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZW1lbnROb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlUmVmZXJlbmNlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaFJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVSZWZlcmVuY2VOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRBc3N1bXB0aW9uQnlBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zID0gdGhpcy5nZXRBc3N1bXB0aW9ucygpLFxuICAgICAgICAgIGFzc3VtcHRpb24gPSBhc3N1bXB0aW9ucy5maW5kKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uTm9kZU1hdGNoZXMgPSBhc3N1bXB0aW9uLm1hdGNoQXNzdW1wdGlvbk5vZGUoYXNzdW1wdGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoYXNzdW1wdGlvbk5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbjtcbiAgfVxuXG4gIGZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldFJlZmVyZW5jZXMoKSxcbiAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VzLmZpbmQoKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSA9IHJlZmVyZW5jZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VNYXRjaGVNZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlO1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG1ldGF2YXJpYWJsZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUoc3Vic3RpdHV0aW9uTm9kZSkge1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25zLmZpbmQoKHN1YnN0aXR1dGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMgPSBzdWJzdGl0dXRpb24ubWF0Y2hTdWJzdGl0dXRpb25Ob2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvbnRleHRzKC4uLmNvbnRleHRzKSB7XG4gICAgY29uc3QgbGFzdENvbnRleHQgPSBsYXN0KGNvbnRleHRzKSxcbiAgICAgICAgICBjb250ZXh0ID0gbGFzdENvbnRleHQsICAvLy9cbiAgICAgICAgICBzeW5vcHRpY0NvbnRleHQgPSBuZXcgU3lub3B0aWNDb250ZXh0KGNvbnRleHQsIGNvbnRleHRzKTtcblxuICAgIHJldHVybiBzeW5vcHRpY0NvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTeW5vcHRpY0NvbnRleHQiLCJwdXNoIiwibGFzdCIsImNvbXByZXNzIiwiYXJyYXlVdGlsaXRpZXMiLCJDb250ZXh0IiwiY29udGV4dCIsImNvbnRleHRzIiwiZ2V0Q29udGV4dHMiLCJnZXRUZXJtcyIsInRlcm1zIiwiZm9yRWFjaCIsImNvbnRleHRUZXJtcyIsInRlcm1BIiwidGVybUIiLCJ0ZXJtQUNvbXBhcmVzVG9UZXJtQiIsImNvbXBhcmVUZXJtIiwiZ2V0RnJhbWVzIiwiZnJhbWVzIiwiY29udGV4dEZyYW1lcyIsImZyYW1lQSIsImZyYW1lQiIsImZyYW1lQUVxdWFsVG9GcmFtZUIiLCJpc0VxdWFsVG8iLCJnZXRFcXVhbGl0aWVzIiwiZXF1YWxpdGllcyIsImNvbnRleHRFcXVhbGl0aWVzIiwiZXF1YWxpdHlBIiwiZXF1YWxpdHlCIiwiZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5QiIsImdldEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRzIiwiY29udGV4dEp1ZGdlbWVudHMiLCJqdWRnZW1lbnRBIiwianVkZ2VtZW50QiIsImp1ZGdlbWVudEFFcXVhbFRvSnVkZ2VtZW50QiIsImdldFN0YXRlbWVudHMiLCJzdGF0ZW1lbnRzIiwiY29udGV4dFN0YXRlbWVudHMiLCJzdGF0ZW1lbnRBIiwic3RhdGVtZW50QiIsInN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50QiIsImdldEFzc2VydGlvbnMiLCJhc3NlcnRpb25zIiwiY29udGV4dEFzc2VydGlvbnMiLCJhc3NlcnRpb25BIiwiYXNzZXJ0aW9uQiIsImFzc2VydGlvbkFFcXVhbFRvQXNzZXJ0aW9uQiIsImdldFJlZmVyZW5jZXMiLCJyZWZlcmVuY2VzIiwiY29udGV4dFJlZmVyZW5jZXMiLCJyZWZlcmVuY2VBIiwicmVmZXJlbmNlQiIsInJlZmVyZW5jZUFFcXVhbFRvUmVmZXJlbmNlQiIsImdldEFzc3VtcHRpb25zIiwiYXNzdW1wdGlvbnMiLCJjb250ZXh0QXNzdW1wdGlvbnMiLCJhc3N1bXB0aW9uQSIsImFzc3VtcHRpb25CIiwiYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJnZXRNZXRhdmFyaWFibGVzIiwibWV0YXZhcmlhYmxlcyIsImNvbnRleHRNZXRhdmFyaWFibGVzIiwibWV0YXZhcmlhYmxlQSIsIm1ldGF2YXJpYWJsZUIiLCJtZXRhdmFyaWFibGVBRXF1YWxUb01ldGF2YXJpYWJsZUIiLCJnZXRTdWJzdGl0dXRpb25zIiwic3Vic3RpdHV0aW9ucyIsImNvbnRleHRTdWJzdGl0dXRpb25zIiwic3Vic3RpdHV0aW9uQSIsInN1YnN0aXR1dGlvbkIiLCJzdWJzdGl0dXRpb25BRXF1YWxUb1N1YnN0aXR1dGlvbkIiLCJmaW5kVGVybUJ5VGVybU5vZGUiLCJ0ZXJtTm9kZSIsInRlcm0iLCJmaW5kIiwidGVybU5vZGVNYXRjaGVzIiwibWF0Y2hUZXJtTm9kZSIsImZpbmRGcmFtZUJ5RnJhbWVOb2RlIiwiZnJhbWVOb2RlIiwiZnJhbWUiLCJmcmFtZU5vZGVNYXRjaGVzIiwibWF0Y2hGcmFtZU5vZGUiLCJmaW5kRXF1YWxpdHlCeUVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5Tm9kZSIsImVxdWFsaXR5IiwiZXF1YWxpdHlOb2RlTWF0Y2hlcyIsIm1hdGNoRXF1YWxpdHlOb2RlIiwiZmluZEp1ZGdlbWVudEJ5SnVkZ2VtZW50Tm9kZSIsImp1ZGdlbWVudE5vZGUiLCJqdWRnZW1lbnQiLCJqdWRnZW1lbnROb2RlTWF0Y2hlcyIsIm1hdGNoSnVkZ2VtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50Iiwic3RhdGVtZW50Tm9kZU1hdGNoZXMiLCJtYXRjaFN0YXRlbWVudE5vZGUiLCJmaW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlIiwicmVmZXJlbmNlTm9kZSIsInJlZmVyZW5jZSIsInJlZmVyZW5jZU1hdGNoZVJlZmVyZW5jZU5vZGUiLCJtYXRjaFJlZmVyZW5jZU5vZGUiLCJmaW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbiIsImFzc2VydGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3NlcnRpb25Ob2RlIiwiZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlIiwiYXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3N1bXB0aW9uTm9kZSIsImZpbmRSZWZlcmVuY2VCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwicmVmZXJlbmNlTWF0Y2hlTWV0YXZhcmlhYmxlTm9kZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJzdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uTm9kZU1hdGNoZXMiLCJtYXRjaFN1YnN0aXR1dGlvbk5vZGUiLCJm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