occam-nominal 1.0.367 → 1.0.372
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/element/assertion/contained.js +114 -106
- package/lib/element/assertion/defined.js +91 -94
- package/lib/element/assertion/type.js +13 -8
- package/lib/element/assumption/implicit.js +7 -7
- package/lib/element/assumption.js +6 -7
- package/lib/element/claim.js +5 -5
- package/lib/element/combinator.js +36 -24
- package/lib/element/constraint.js +6 -7
- package/lib/element/constructor.js +5 -5
- package/lib/element/declaration/combinator.js +9 -8
- package/lib/element/declaration/metavariable.js +18 -18
- package/lib/element/declaration/variable.js +4 -4
- package/lib/element/equality.js +62 -70
- package/lib/element/fact/premise.js +1 -1
- package/lib/element/frame.js +86 -107
- package/lib/element/goal.js +108 -114
- package/lib/element/judgement.js +51 -57
- package/lib/element/metavariable.js +32 -29
- package/lib/element/property.js +3 -3
- package/lib/element/rule.js +30 -27
- package/lib/element/signature.js +15 -17
- package/lib/element/substitution/frame.js +52 -52
- package/lib/element/substitution/reference.js +55 -50
- package/lib/element/substitution/term.js +52 -52
- package/lib/element/variable.js +16 -16
- package/lib/pass/continuation.js +30 -17
- package/lib/pass/continuationZip.js +36 -25
- package/lib/pass/zip.js +7 -5
- package/lib/process/equate.js +7 -7
- package/lib/process/validation.js +12 -18
- package/lib/utilities/continuation.js +1 -16
- package/package.json +9 -9
- package/src/element/assertion/contained.js +126 -124
- package/src/element/assertion/defined.js +100 -112
- package/src/element/assertion/type.js +15 -7
- package/src/element/assumption/implicit.js +6 -7
- package/src/element/assumption.js +5 -8
- package/src/element/claim.js +4 -4
- package/src/element/combinator.js +46 -25
- package/src/element/constraint.js +5 -8
- package/src/element/constructor.js +4 -4
- package/src/element/declaration/combinator.js +10 -9
- package/src/element/declaration/metavariable.js +20 -21
- package/src/element/declaration/variable.js +4 -4
- package/src/element/equality.js +74 -87
- package/src/element/fact/premise.js +1 -1
- package/src/element/frame.js +100 -131
- package/src/element/goal.js +127 -134
- package/src/element/judgement.js +60 -67
- package/src/element/metavariable.js +38 -30
- package/src/element/property.js +2 -2
- package/src/element/rule.js +39 -32
- package/src/element/signature.js +14 -19
- package/src/element/substitution/frame.js +64 -61
- package/src/element/substitution/reference.js +67 -55
- package/src/element/substitution/term.js +64 -61
- package/src/element/variable.js +19 -17
- package/src/pass/continuation.js +45 -22
- package/src/pass/continuationZip.js +51 -33
- package/src/pass/zip.js +7 -4
- package/src/process/equate.js +10 -10
- package/src/process/validation.js +11 -21
- package/src/utilities/continuation.js +0 -23
package/lib/element/judgement.js
CHANGED
|
@@ -116,9 +116,9 @@ const _default = (0, _elements.define)(class Judgement extends _occamlanguages.E
|
|
|
116
116
|
findSubproofAssertion(context) {
|
|
117
117
|
return this.goal.findSubproofAssertion(context);
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
const judgementNode = this.getJudgementNode(), judgement = context.findJudgementByJudgementNode(judgementNode)
|
|
121
|
-
return
|
|
119
|
+
findJudgement(context) {
|
|
120
|
+
const judgementNode = this.getJudgementNode(), judgement = context.findJudgementByJudgementNode(judgementNode);
|
|
121
|
+
return judgement;
|
|
122
122
|
}
|
|
123
123
|
compareStep(step, context) {
|
|
124
124
|
let comparesToStep = false;
|
|
@@ -152,71 +152,65 @@ const _default = (0, _elements.define)(class Judgement extends _occamlanguages.E
|
|
|
152
152
|
return this.frame.compareMetavariableName(metavariableName);
|
|
153
153
|
}
|
|
154
154
|
validate(context, continuation) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
validateFrame
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
], context, (validates)=>{
|
|
177
|
-
let judgement = null;
|
|
178
|
-
if (validates) {
|
|
179
|
-
judgement = this; ///
|
|
155
|
+
let validates;
|
|
156
|
+
const judgementnString = this.getString(); ///
|
|
157
|
+
context.trace(`Validating the '${judgementnString}' judgement...`);
|
|
158
|
+
let judgementn;
|
|
159
|
+
const judgement = this.findJudgement(context);
|
|
160
|
+
if (judgement !== null) {
|
|
161
|
+
context.debug(`The '${judgementnString}' judgement is already present.`);
|
|
162
|
+
validates = continuation(judgementn, context);
|
|
163
|
+
} else {
|
|
164
|
+
judgementn = this;
|
|
165
|
+
const validateGoal = this.validateGoal.bind(this), validateFrame = this.validateFrame.bind(this);
|
|
166
|
+
validates = (0, _continuation.all)([
|
|
167
|
+
validateGoal,
|
|
168
|
+
validateFrame
|
|
169
|
+
], context, (context)=>{
|
|
170
|
+
let validates;
|
|
171
|
+
const validateWhenStated = this.validateWhenStated.bind(this), validateWhenDerived = this.validateWhenDerived.bind(this);
|
|
172
|
+
validates = (0, _continuation.exists)([
|
|
173
|
+
validateWhenStated,
|
|
174
|
+
validateWhenDerived
|
|
175
|
+
], context, (context)=>{
|
|
180
176
|
context.addJudgement(judgement);
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
return continuation(judgement);
|
|
177
|
+
return continuation(judgementn, context);
|
|
178
|
+
});
|
|
179
|
+
return validates;
|
|
186
180
|
});
|
|
187
|
-
}
|
|
181
|
+
}
|
|
182
|
+
if (validates) {
|
|
183
|
+
context.debug(`...validated the '${judgementnString}' judgement.`);
|
|
184
|
+
}
|
|
185
|
+
return validates;
|
|
188
186
|
}
|
|
189
187
|
validateGoal(context, continuation) {
|
|
188
|
+
let goalValidates;
|
|
190
189
|
const judgementString = this.getString(); ///
|
|
191
190
|
context.trace(`Validating the '${judgementString}' judgement's goal...`);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
this.goal = goal;
|
|
196
|
-
goalValidates = true;
|
|
197
|
-
}
|
|
198
|
-
if (goalValidates) {
|
|
199
|
-
context.debug(`...validated the '${judgementString}' judgement's goal.`);
|
|
200
|
-
}
|
|
201
|
-
return continuation(goalValidates);
|
|
191
|
+
goalValidates = this.goal.validate(context, (goal, context)=>{
|
|
192
|
+
this.goal = goal;
|
|
193
|
+
return continuation(context);
|
|
202
194
|
});
|
|
195
|
+
if (goalValidates) {
|
|
196
|
+
context.debug(`...validates the'${judgementString}' judgement's goal.`);
|
|
197
|
+
}
|
|
198
|
+
return goalValidates;
|
|
203
199
|
}
|
|
204
200
|
validateFrame(context, continuation) {
|
|
201
|
+
let frameValidates;
|
|
205
202
|
const judgementString = this.getString(); ///
|
|
206
203
|
context.trace(`Validating the '${judgementString}' judgement's frame...`);
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
this.frame = frame;
|
|
211
|
-
frameValidates = true;
|
|
212
|
-
}
|
|
213
|
-
if (frameValidates) {
|
|
214
|
-
context.trace(`...validated the '${judgementString}' judgement's frame.`);
|
|
215
|
-
}
|
|
216
|
-
return continuation(frameValidates);
|
|
204
|
+
frameValidates = this.frame.validate(context, (frame, context)=>{
|
|
205
|
+
this.frame = frame;
|
|
206
|
+
return continuation(context);
|
|
217
207
|
});
|
|
208
|
+
if (frameValidates) {
|
|
209
|
+
context.debug(`...validates the'${judgementString}' judgement's frame.`);
|
|
210
|
+
}
|
|
211
|
+
return frameValidates;
|
|
218
212
|
}
|
|
219
|
-
|
|
213
|
+
_validateWhenStated(context, continuation) {
|
|
220
214
|
const stated = context.isStated();
|
|
221
215
|
if (!stated) {
|
|
222
216
|
const validatesWhenStated = false;
|
|
@@ -231,7 +225,7 @@ const _default = (0, _elements.define)(class Judgement extends _occamlanguages.E
|
|
|
231
225
|
}
|
|
232
226
|
return continuation(validatesWhenStated);
|
|
233
227
|
}
|
|
234
|
-
|
|
228
|
+
_validateWhenDerived(context, continuation) {
|
|
235
229
|
const stated = context.isStated();
|
|
236
230
|
if (stated) {
|
|
237
231
|
const validatesWhenDerived = false;
|
|
@@ -304,4 +298,4 @@ function implicitAssumptionsFromFacts(facts, context) {
|
|
|
304
298
|
return implicitAssumptions;
|
|
305
299
|
}
|
|
306
300
|
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2p1ZGdlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5pbXBvcnQgeyBFbGVtZW50LCBicmVha1BvaW50VXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IG9uZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlLH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250ZXh0XCI7XG5pbXBvcnQgeyBhbGwsIGV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyBlcXVhdGVTdGF0ZW1lbnRzIH0gZnJvbSBcIi4uL3Byb2Nlc3MvZXF1YXRlXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUp1ZGdlbWVudCB9IGZyb20gXCIuLi9wcm9jZXNzL2luc3RhbnRpYXRlXCI7XG5pbXBvcnQgeyBqdWRnZW1lbnRGcm9tU3RhdGVtZW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuXG5jb25zdCB7IHB1c2ggfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBicmVha1BvaW50RnJvbUpTT04sIGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIH0gPSBicmVha1BvaW50VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmUoY2xhc3MgSnVkZ2VtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgZnJhbWUsIGdvYWwpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xuICAgIHRoaXMuZ29hbCA9IGdvYWw7XG4gIH1cblxuICBnZXRGcmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZTtcbiAgfVxuXG4gIGdldEFzc3VtcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ29hbDtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudE5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGp1ZGdlbWVudE5vZGUgPSBub2RlOyAvLy9cblxuICAgIHJldHVybiBqdWRnZW1lbnROb2RlO1xuICB9XG5cbiAgaXNTaW5ndWxhcigpIHtcbiAgICBjb25zdCBqdWRnZW1lbnROb2RlID0gdGhpcy5nZXRKdWRnZW1lbnROb2RlKCksXG4gICAgICAgICAgc2luZ3VsYXIgPSBqdWRnZW1lbnROb2RlLmlzU2luZ3VsYXIoKTtcblxuICAgIHJldHVybiBzaW5ndWxhcjtcbiAgfVxuXG4gIGlzRXF1YWxUbyhqdWRnZW1lbnQpIHtcbiAgICBjb25zdCBqdWRnZW1lbnROb2RlID0ganVkZ2VtZW50LmdldE5vZGUoKSxcbiAgICAgICAgICBqdWRnZW1lbnROb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBqdWRnZW1lbnROb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZURlZmluZWQobWV0YXZhcmlhYmxlKSB7IHJldHVybiB0aGlzLmZyYW1lLmlzTWV0YXZhcmlhYmxlRGVmaW5lZChtZXRhdmFyaWFibGUpOyB9XG5cbiAgaXNJbXBsaWNpdCgpIHsgcmV0dXJuIHRoaXMuZnJhbWUuaXNJbXBsaWNpdCgpOyB9XG5cbiAgZ2V0U3RhdGVtZW50KCkgeyByZXR1cm4gdGhpcy5nb2FsLmdldFN0YXRlbWVudCgpOyB9XG5cbiAgZ2V0UmVmZXJlbmNlKCkgeyByZXR1cm4gdGhpcy5nb2FsLmdldFJlZmVyZW5jZSgpOyB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlKCkgeyByZXR1cm4gdGhpcy5mcmFtZS5nZXRNZXRhdmFyaWFibGUoKTsgfVxuXG4gIGdldEFzc3VtcHRpb25zKGNvbnRleHQpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgZnJhbWVBc3N1bXB0aW9ucyA9IHRoaXMuZnJhbWUuZ2V0QXNzdW1wdGlvbnMoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIGZyYW1lQXNzdW1wdGlvbnMpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZmFjdHMgPSBjb250ZXh0LmdldEZhY3RzKCksXG4gICAgICAgICAgICBpbXBsaWNpdEFzc3VtcHRpb25zID0gaW1wbGljaXRBc3N1bXB0aW9uc0Zyb21GYWN0cyhmYWN0cywgY29udGV4dCk7XG5cbiAgICAgIHB1c2goYXNzdW1wdGlvbnMsIGltcGxpY2l0QXNzdW1wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3N1bXB0aW9ucztcbiAgfVxuXG4gIG1hdGNoSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGp1ZGdlbWVudE5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAganVkZ2VtZW50Tm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4ganVkZ2VtZW50Tm9kZU1hdGNoZXM7XG4gIH1cblxuICBtYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkgeyByZXR1cm4gdGhpcy5mcmFtZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7IH1cblxuICBmaW5kU3VicHJvb2ZBc3NlcnRpb24oY29udGV4dCkgeyByZXR1cm4gdGhpcy5nb2FsLmZpbmRTdWJwcm9vZkFzc2VydGlvbihjb250ZXh0KTsgfVxuXG4gIGZpbmRWYWxpZEp1ZGdlbWVudChjb250ZXh0KSB7XG4gICAgY29uc3QganVkZ2VtZW50Tm9kZSA9IHRoaXMuZ2V0SnVkZ2VtZW50Tm9kZSgpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IGNvbnRleHQuZmluZEp1ZGdlbWVudEJ5SnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKSxcbiAgICAgICAgICB2YWxpZEp1ZGdlbWVuZXQgPSBqdWRnZW1lbnQ7ICAvLy9cblxuICAgIHJldHVybiB2YWxpZEp1ZGdlbWVuZXQ7XG4gIH1cblxuICBjb21wYXJlU3RlcChzdGVwLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbXBhcmVzVG9TdGVwID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwU3RyaW5nID0gc3RlcC5nZXRTdHJpbmcoKSxcbiAgICAgIGp1ZGdlbWVudFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYENvbXBhcmluZyB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgdG8gdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gc3RlcC5nZXRTdGF0ZW1lbnQoKSxcbiAgICAgIGNvbXBhcmVzVG9TdGF0ZW1lbnQgPSB0aGlzLmNvbXBhcmVTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgIGlmIChjb21wYXJlc1RvU3RhdGVtZW50KSB7XG4gICAgICBjb21wYXJlc1RvU3RlcCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmVzVG9TdGVwKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5jb21wYXJlZCB0aGUgJyR7c3RlcFN0cmluZ30nIHN0ZXAgdG8gdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFyZXNUb1N0ZXA7XG4gIH1cblxuICBjb21wYXJlU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICAgIGxldCBjb21wYXJlc1RvU3RhdGVtZW50ID0gZmFsc2U7XG5cbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB0byB0aGUgJyR7anVkZ2VtZW50U3RyaW5nfScganVkZ2VtZW50Li4uYCk7XG5cbiAgICBjb25zdCBsZWZ0U3RhdGVtZW50ID0gc3RhdGVtZW50OyAgLy8vXG5cbiAgICBzdGF0ZW1lbnQgPSB0aGlzLmdldFN0YXRlbWVudCgpO1xuXG4gICAgY29uc3QgcmlnaHRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRzRXF1YXRlID0gZXF1YXRlU3RhdGVtZW50cyhsZWZ0U3RhdGVtZW50LCByaWdodFN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50c0VxdWF0ZSkge1xuICAgICAgY29tcGFyZXNUb1N0YXRlbWVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmVzVG9TdGF0ZW1lbnQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLmNvbXBhcmVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdG8gdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFyZXNUb1N0YXRlbWVudDtcbiAgfVxuXG4gIGNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHsgcmV0dXJuIHRoaXMuZnJhbWUuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7IH1cblxuICB2YWxpZGF0ZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuLi5gKTtcblxuICAgIGNvbnN0IHZhbGlkSnVkZ2VtZW50ID0gdGhpcy5maW5kVmFsaWRKdWRnZW1lbnQoY29udGV4dCk7XG5cbiAgICBpZiAodmFsaWRKdWRnZW1lbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGp1ZGdlbWVudCA9IHZhbGlkSnVkZ2VtZW50OyAvLy9cblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuYCk7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oanVkZ2VtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZUdvYWwgPSB0aGlzLnZhbGlkYXRlR29hbC5iaW5kKHRoaXMpLFxuICAgICAgICAgIHZhbGlkYXRlRnJhbWUgPSB0aGlzLnZhbGlkYXRlRnJhbWUuYmluZCh0aGlzKTtcblxuICAgIHJldHVybiBhbGwoW1xuICAgICAgdmFsaWRhdGVGcmFtZSxcbiAgICAgIHZhbGlkYXRlR29hbFxuICAgIF0sIGNvbnRleHQsICh2YWxpZGF0ZXMpID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnN0IGp1ZGdlbWVudCA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihqdWRnZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWxpZGF0ZVdoZW5TdGF0ZWQgPSB0aGlzLnZhbGlkYXRlV2hlblN0YXRlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdmFsaWRhdGVXaGVuRGVyaXZlZCA9IHRoaXMudmFsaWRhdGVXaGVuRGVyaXZlZC5iaW5kKHRoaXMpO1xuXG4gICAgICByZXR1cm4gZXhpc3RzKFtcbiAgICAgICAgdmFsaWRhdGVXaGVuU3RhdGVkLFxuICAgICAgICB2YWxpZGF0ZVdoZW5EZXJpdmVkXG4gICAgICBdLCBjb250ZXh0LCAodmFsaWRhdGVzKSA9PiB7XG4gICAgICAgIGxldCBqdWRnZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICBqdWRnZW1lbnQgPSB0aGlzOyAvLy9cblxuICAgICAgICAgIGNvbnRleHQuYWRkSnVkZ2VtZW50KGp1ZGdlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGp1ZGdlbWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlR29hbChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCdzIGdvYWwuLi5gKTtcblxuICAgIHJldHVybiB0aGlzLmdvYWwudmFsaWRhdGUoY29udGV4dCwgKGdvYWwpID0+IHtcbiAgICAgIGxldCBnb2FsVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICAgIGlmIChnb2FsICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZ29hbCA9IGdvYWw7XG5cbiAgICAgICAgZ29hbFZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChnb2FsVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7anVkZ2VtZW50U3RyaW5nfScganVkZ2VtZW50J3MgZ29hbC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihnb2FsVmFsaWRhdGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlRnJhbWUoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QganVkZ2VtZW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQncyBmcmFtZS4uLmApO1xuXG4gICAgcmV0dXJuIHRoaXMuZnJhbWUudmFsaWRhdGUoY29udGV4dCwgKGZyYW1lKSA9PiB7XG4gICAgICBsZXQgZnJhbWVWYWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgICAgaWYgKGZyYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcblxuICAgICAgICBmcmFtZVZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmFtZVZhbGlkYXRlcykge1xuICAgICAgICBjb250ZXh0LnRyYWNlKGAuLi52YWxpZGF0ZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCdzIGZyYW1lLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGZyYW1lVmFsaWRhdGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlblN0YXRlZChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBzdGF0ZWQgPSBjb250ZXh0LmlzU3RhdGVkKCk7XG5cbiAgICBpZiAoIXN0YXRlZCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVzV2hlblN0YXRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5TdGF0ZWQpO1xuICAgIH1cblxuICAgIGxldCB2YWxpZGF0ZXNXaGVuU3RhdGVkO1xuXG4gICAgY29uc3QganVkZ2VtZW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7anVkZ2VtZW50U3RyaW5nfScgc3RhdGVkIGp1ZGdlbWVudC4uLmApO1xuXG4gICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRydWU7XG5cbiAgICBpZiAodmFsaWRhdGVzV2hlblN0YXRlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBzdGF0ZWQganVkZ2VtZW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlblN0YXRlZCk7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5EZXJpdmVkKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmIChzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlc1doZW5EZXJpdmVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuRGVyaXZlZCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBkZXJpdmVkIGp1ZGdlbWVudC4uLmApO1xuXG4gICAgY29uc3Qgc2NoZW1hcyA9IGNvbnRleHQuZ2V0U2NoZW1hcygpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IHRoaXM7IC8vL1xuXG4gICAgcmV0dXJuIG9uZShzY2hlbWFzLCAoc2NoZW1hLCBjb250aW51YXRpb24pID0+IHtcbiAgICAgIHNjaGVtYS51bmlmeUp1ZGdlbWVudChqdWRnZW1lbnQsIGNvbnRleHQsIGNvbnRpbnVhdGlvbik7XG4gICAgfSwgKGp1ZGdlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoanVkZ2VtZW50VW5pZmllcykge1xuICAgICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWxpZGF0ZXNXaGVuRGVyaXZlZCkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGRlcml2ZWQganVkZ2VtZW50LmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5EZXJpdmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJKdWRnZW1lbnRcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIHJldHVybiBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmcgfSA9IGpzb24sXG4gICAgICAgICAgICBqdWRnZW1lbnROb2RlID0gaW5zdGFudGlhdGVKdWRnZW1lbnQoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG5vZGUgPSBqdWRnZW1lbnROb2RlLCAgLy8vXG4gICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgZnJhbWUgPSBmcmFtZUZyb21KdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgZ29hbCA9IGdvYWxGcm9tSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlLCBjb250ZXh0KTtcblxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgICAgIGNvbnN0IGp1ZGdlbWVudCA9IG5ldyBKdWRnZW1lbnQoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBmcmFtZSwgZ29hbCk7XG5cbiAgICAgIHJldHVybiBqdWRnZW1lbnQ7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50LmdldE5vZGUoKSxcbiAgICAgIGp1ZGdlbWVudCA9IGp1ZGdlbWVudEZyb21TdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmFjdChmYWN0LCBjb250ZXh0KSB7XG4gICAgbGV0IGp1ZGdlbWVudCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gZmFjdC5nZXRTdGF0ZW1lbnROb2RlKCk7XG5cbiAgICBpZiAoc3RhdGVtZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50RnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGp1ZGdlbWVudDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGdvYWxGcm9tSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGdvYWxOb2RlID0ganVkZ2VtZW50Tm9kZS5nZXRHb2FsTm9kZSgpLFxuICAgICAgICBnb2FsID0gY29udGV4dC5maW5kR29hbEJ5R29sYU5vZGUoZ29hbE5vZGUpO1xuXG4gIHJldHVybiBnb2FsO1xufVxuXG5mdW5jdGlvbiBmcmFtZUZyb21KdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgZnJhbWVOb2RlID0ganVkZ2VtZW50Tm9kZS5nZXRGcmFtZU5vZGUoKSxcbiAgICAgICAgZnJhbWUgPSBjb250ZXh0LmZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSk7XG5cbiAgcmV0dXJuIGZyYW1lO1xufVxuXG5mdW5jdGlvbiBpbXBsaWNpdEFzc3VtcHRpb25zRnJvbUZhY3RzKGZhY3RzLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgSW1wbGljaXRBc3N1bXB0aW9uIH0gPSBlbGVtZW50cyxcbiAgICAgICAgaW1wbGljaXRBc3N1bXB0aW9ucyA9IGZhY3RzLm1hcCgoZmFjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGZhY3QuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgICAgaW1wbGljaXRBc3N1bXB0aW9uID0gSW1wbGljaXRBc3N1bXB0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgICAgICAgIHJldHVybiBpbXBsaWNpdEFzc3VtcHRpb247XG4gICAgICAgIH0pO1xuXG4gIHJldHVybiBpbXBsaWNpdEFzc3VtcHRpb25zO1xufVxuXG4iXSwibmFtZXMiOlsicHVzaCIsImFycmF5VXRpbGl0aWVzIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiSnVkZ2VtZW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsImZyYW1lIiwiZ29hbCIsImdldEZyYW1lIiwiZ2V0QXNzdW1wdGlvbiIsImdldEp1ZGdlbWVudE5vZGUiLCJnZXROb2RlIiwianVkZ2VtZW50Tm9kZSIsImlzU2luZ3VsYXIiLCJzaW5ndWxhciIsImlzRXF1YWxUbyIsImp1ZGdlbWVudCIsImp1ZGdlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hKdWRnZW1lbnROb2RlIiwiZXF1YWxUbyIsImlzTWV0YXZhcmlhYmxlRGVmaW5lZCIsIm1ldGF2YXJpYWJsZSIsImlzSW1wbGljaXQiLCJnZXRTdGF0ZW1lbnQiLCJnZXRSZWZlcmVuY2UiLCJnZXRNZXRhdmFyaWFibGUiLCJnZXRBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwiZnJhbWVBc3N1bXB0aW9ucyIsImZhY3RzIiwiZ2V0RmFjdHMiLCJpbXBsaWNpdEFzc3VtcHRpb25zIiwiaW1wbGljaXRBc3N1bXB0aW9uc0Zyb21GYWN0cyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsImZpbmRTdWJwcm9vZkFzc2VydGlvbiIsImZpbmRWYWxpZEp1ZGdlbWVudCIsImZpbmRKdWRnZW1lbnRCeUp1ZGdlbWVudE5vZGUiLCJ2YWxpZEp1ZGdlbWVuZXQiLCJjb21wYXJlU3RlcCIsInN0ZXAiLCJjb21wYXJlc1RvU3RlcCIsInN0ZXBTdHJpbmciLCJnZXRTdHJpbmciLCJqdWRnZW1lbnRTdHJpbmciLCJ0cmFjZSIsInN0YXRlbWVudCIsImNvbXBhcmVzVG9TdGF0ZW1lbnQiLCJjb21wYXJlU3RhdGVtZW50IiwiZGVidWciLCJzdGF0ZW1lbnRTdHJpbmciLCJsZWZ0U3RhdGVtZW50IiwicmlnaHRTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRzRXF1YXRlIiwiZXF1YXRlU3RhdGVtZW50cyIsImNvbXBhcmVNZXRhdmFyaWFibGVOYW1lIiwibWV0YXZhcmlhYmxlTmFtZSIsInZhbGlkYXRlIiwiY29udGludWF0aW9uIiwidmFsaWRKdWRnZW1lbnQiLCJ2YWxpZGF0ZUdvYWwiLCJiaW5kIiwidmFsaWRhdGVGcmFtZSIsImFsbCIsInZhbGlkYXRlcyIsInZhbGlkYXRlV2hlblN0YXRlZCIsInZhbGlkYXRlV2hlbkRlcml2ZWQiLCJleGlzdHMiLCJhZGRKdWRnZW1lbnQiLCJnb2FsVmFsaWRhdGVzIiwiZnJhbWVWYWxpZGF0ZXMiLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ2YWxpZGF0ZXNXaGVuRGVyaXZlZCIsInNjaGVtYXMiLCJnZXRTY2hlbWFzIiwib25lIiwic2NoZW1hIiwidW5pZnlKdWRnZW1lbnQiLCJqdWRnZW1lbnRVbmlmaWVzIiwidG9KU09OIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwiaW5zdGFudGlhdGVKdWRnZW1lbnQiLCJmcmFtZUZyb21KdWRnZW1lbnROb2RlIiwiZ29hbEZyb21KdWRnZW1lbnROb2RlIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudE5vZGUiLCJqdWRnZW1lbnRGcm9tU3RhdGVtZW50Tm9kZSIsImZyb21GYWN0IiwiZmFjdCIsImdldFN0YXRlbWVudE5vZGUiLCJnb2FsTm9kZSIsImdldEdvYWxOb2RlIiwiZmluZEdvYWxCeUdvbGFOb2RlIiwiZnJhbWVOb2RlIiwiZ2V0RnJhbWVOb2RlIiwiZmluZEZyYW1lQnlGcmFtZU5vZGUiLCJJbXBsaWNpdEFzc3VtcHRpb24iLCJlbGVtZW50cyIsIm1hcCIsImltcGxpY2l0QXNzdW1wdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBa0JBOzs7ZUFBQTs7OzJCQWhCK0I7Z0NBQ2M7a0VBRXhCOzhCQUVEO3lCQUVRO3dCQUVLOzZCQUNJO3lCQUNNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFM0MsTUFBTSxFQUFF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
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2p1ZGdlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5pbXBvcnQgeyBFbGVtZW50LCBicmVha1BvaW50VXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLWxhbmd1YWdlc1wiO1xuXG5pbXBvcnQgZWxlbWVudHMgZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5cbmltcG9ydCB7IG9uZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlLH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250ZXh0XCI7XG5pbXBvcnQgeyBhbGwsIGV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyBlcXVhdGVTdGF0ZW1lbnRzIH0gZnJvbSBcIi4uL3Byb2Nlc3MvZXF1YXRlXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUp1ZGdlbWVudCB9IGZyb20gXCIuLi9wcm9jZXNzL2luc3RhbnRpYXRlXCI7XG5pbXBvcnQgeyBqdWRnZW1lbnRGcm9tU3RhdGVtZW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuXG5jb25zdCB7IHB1c2ggfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBicmVha1BvaW50RnJvbUpTT04sIGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OIH0gPSBicmVha1BvaW50VXRpbGl0aWVzO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmUoY2xhc3MgSnVkZ2VtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgZnJhbWUsIGdvYWwpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5mcmFtZSA9IGZyYW1lO1xuICAgIHRoaXMuZ29hbCA9IGdvYWw7XG4gIH1cblxuICBnZXRGcmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZTtcbiAgfVxuXG4gIGdldEFzc3VtcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ29hbDtcbiAgfVxuXG4gIGdldEp1ZGdlbWVudE5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGp1ZGdlbWVudE5vZGUgPSBub2RlOyAvLy9cblxuICAgIHJldHVybiBqdWRnZW1lbnROb2RlO1xuICB9XG5cbiAgaXNTaW5ndWxhcigpIHtcbiAgICBjb25zdCBqdWRnZW1lbnROb2RlID0gdGhpcy5nZXRKdWRnZW1lbnROb2RlKCksXG4gICAgICAgICAgc2luZ3VsYXIgPSBqdWRnZW1lbnROb2RlLmlzU2luZ3VsYXIoKTtcblxuICAgIHJldHVybiBzaW5ndWxhcjtcbiAgfVxuXG4gIGlzRXF1YWxUbyhqdWRnZW1lbnQpIHtcbiAgICBjb25zdCBqdWRnZW1lbnROb2RlID0ganVkZ2VtZW50LmdldE5vZGUoKSxcbiAgICAgICAgICBqdWRnZW1lbnROb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hKdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBqdWRnZW1lbnROb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBpc01ldGF2YXJpYWJsZURlZmluZWQobWV0YXZhcmlhYmxlKSB7IHJldHVybiB0aGlzLmZyYW1lLmlzTWV0YXZhcmlhYmxlRGVmaW5lZChtZXRhdmFyaWFibGUpOyB9XG5cbiAgaXNJbXBsaWNpdCgpIHsgcmV0dXJuIHRoaXMuZnJhbWUuaXNJbXBsaWNpdCgpOyB9XG5cbiAgZ2V0U3RhdGVtZW50KCkgeyByZXR1cm4gdGhpcy5nb2FsLmdldFN0YXRlbWVudCgpOyB9XG5cbiAgZ2V0UmVmZXJlbmNlKCkgeyByZXR1cm4gdGhpcy5nb2FsLmdldFJlZmVyZW5jZSgpOyB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlKCkgeyByZXR1cm4gdGhpcy5mcmFtZS5nZXRNZXRhdmFyaWFibGUoKTsgfVxuXG4gIGdldEFzc3VtcHRpb25zKGNvbnRleHQpIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtdLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgZnJhbWVBc3N1bXB0aW9ucyA9IHRoaXMuZnJhbWUuZ2V0QXNzdW1wdGlvbnMoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIGZyYW1lQXNzdW1wdGlvbnMpO1xuXG4gICAgaWYgKG1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZmFjdHMgPSBjb250ZXh0LmdldEZhY3RzKCksXG4gICAgICAgICAgICBpbXBsaWNpdEFzc3VtcHRpb25zID0gaW1wbGljaXRBc3N1bXB0aW9uc0Zyb21GYWN0cyhmYWN0cywgY29udGV4dCk7XG5cbiAgICAgIHB1c2goYXNzdW1wdGlvbnMsIGltcGxpY2l0QXNzdW1wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3N1bXB0aW9ucztcbiAgfVxuXG4gIG1hdGNoSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGp1ZGdlbWVudE5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAganVkZ2VtZW50Tm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4ganVkZ2VtZW50Tm9kZU1hdGNoZXM7XG4gIH1cblxuICBtYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSkgeyByZXR1cm4gdGhpcy5mcmFtZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7IH1cblxuICBmaW5kU3VicHJvb2ZBc3NlcnRpb24oY29udGV4dCkgeyByZXR1cm4gdGhpcy5nb2FsLmZpbmRTdWJwcm9vZkFzc2VydGlvbihjb250ZXh0KTsgfVxuXG4gIGZpbmRKdWRnZW1lbnQoY29udGV4dCkge1xuICAgIGNvbnN0IGp1ZGdlbWVudE5vZGUgPSB0aGlzLmdldEp1ZGdlbWVudE5vZGUoKSxcbiAgICAgICAgICBqdWRnZW1lbnQgPSBjb250ZXh0LmZpbmRKdWRnZW1lbnRCeUp1ZGdlbWVudE5vZGUoanVkZ2VtZW50Tm9kZSk7XG5cbiAgICByZXR1cm4ganVkZ2VtZW50O1xuICB9XG5cbiAgY29tcGFyZVN0ZXAoc3RlcCwgY29udGV4dCkge1xuICAgIGxldCBjb21wYXJlc1RvU3RlcCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcFN0cmluZyA9IHN0ZXAuZ2V0U3RyaW5nKCksXG4gICAgICBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwIHRvIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudCA9IHN0ZXAuZ2V0U3RhdGVtZW50KCksXG4gICAgICBjb21wYXJlc1RvU3RhdGVtZW50ID0gdGhpcy5jb21wYXJlU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICBpZiAoY29tcGFyZXNUb1N0YXRlbWVudCkge1xuICAgICAgY29tcGFyZXNUb1N0ZXAgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlc1RvU3RlcCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uY29tcGFyZWQgdGhlICcke3N0ZXBTdHJpbmd9JyBzdGVwIHRvIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9TdGVwO1xuICB9XG5cbiAgY29tcGFyZVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgICBsZXQgY29tcGFyZXNUb1N0YXRlbWVudCA9IGZhbHNlO1xuXG4gICAgY29uc3QganVkZ2VtZW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQ29tcGFyaW5nIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgdG8gdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudC4uLmApO1xuXG4gICAgY29uc3QgbGVmdFN0YXRlbWVudCA9IHN0YXRlbWVudDsgIC8vL1xuXG4gICAgc3RhdGVtZW50ID0gdGhpcy5nZXRTdGF0ZW1lbnQoKTtcblxuICAgIGNvbnN0IHJpZ2h0U3RhdGVtZW50ID0gc3RhdGVtZW50LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50c0VxdWF0ZSA9IGVxdWF0ZVN0YXRlbWVudHMobGVmdFN0YXRlbWVudCwgcmlnaHRTdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudHNFcXVhdGUpIHtcbiAgICAgIGNvbXBhcmVzVG9TdGF0ZW1lbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlc1RvU3RhdGVtZW50KSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5jb21wYXJlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHRvIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9TdGF0ZW1lbnQ7XG4gIH1cblxuICBjb21wYXJlTWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKSB7IHJldHVybiB0aGlzLmZyYW1lLmNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpOyB9XG5cbiAgdmFsaWRhdGUoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgbGV0IHZhbGlkYXRlcztcblxuICAgIGNvbnN0IGp1ZGdlbWVudG5TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRuU3RyaW5nfScganVkZ2VtZW50Li4uYCk7XG5cbiAgICBsZXQganVkZ2VtZW50bjtcblxuICAgIGNvbnN0IGp1ZGdlbWVudCA9IHRoaXMuZmluZEp1ZGdlbWVudChjb250ZXh0KTtcblxuICAgIGlmIChqdWRnZW1lbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYFRoZSAnJHtqdWRnZW1lbnRuU3RyaW5nfScganVkZ2VtZW50IGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgdmFsaWRhdGVzID0gY29udGludWF0aW9uKGp1ZGdlbWVudG4sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBqdWRnZW1lbnRuID0gdGhpcztcblxuICAgICAgY29uc3QgdmFsaWRhdGVHb2FsID0gdGhpcy52YWxpZGF0ZUdvYWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbGlkYXRlRnJhbWUgPSB0aGlzLnZhbGlkYXRlRnJhbWUuYmluZCh0aGlzKTtcblxuICAgICAgdmFsaWRhdGVzID0gYWxsKFtcbiAgICAgICAgdmFsaWRhdGVHb2FsLFxuICAgICAgICB2YWxpZGF0ZUZyYW1lXG4gICAgICBdLCBjb250ZXh0LCAoY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgdmFsaWRhdGVzO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlV2hlblN0YXRlZCA9IHRoaXMudmFsaWRhdGVXaGVuU3RhdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgIHZhbGlkYXRlV2hlbkRlcml2ZWQgPSB0aGlzLnZhbGlkYXRlV2hlbkRlcml2ZWQuYmluZCh0aGlzKTtcblxuICAgICAgICB2YWxpZGF0ZXMgPSBleGlzdHMoW1xuICAgICAgICAgIHZhbGlkYXRlV2hlblN0YXRlZCxcbiAgICAgICAgICB2YWxpZGF0ZVdoZW5EZXJpdmVkXG4gICAgICAgIF0sIGNvbnRleHQsIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgY29udGV4dC5hZGRKdWRnZW1lbnQoanVkZ2VtZW50KTtcblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oanVkZ2VtZW50biwgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2p1ZGdlbWVudG5TdHJpbmd9JyBqdWRnZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlR29hbChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgZ29hbFZhbGlkYXRlcztcblxuICAgIGNvbnN0IGp1ZGdlbWVudFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCdzIGdvYWwuLi5gKTtcblxuICAgIGdvYWxWYWxpZGF0ZXMgPSB0aGlzLmdvYWwudmFsaWRhdGUoY29udGV4dCwgKGdvYWwsIGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMuZ29hbCA9IGdvYWw7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oY29udGV4dCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZ29hbFZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVzIHRoZScke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCdzIGdvYWwuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdvYWxWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZUZyYW1lKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCBmcmFtZVZhbGlkYXRlcztcblxuICAgIGNvbnN0IGp1ZGdlbWVudFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGp1ZGdlbWVudCdzIGZyYW1lLi4uYCk7XG5cbiAgICBmcmFtZVZhbGlkYXRlcyA9IHRoaXMuZnJhbWUudmFsaWRhdGUoY29udGV4dCwgKGZyYW1lLCBjb250ZXh0KSA9PiB7XG4gICAgICB0aGlzLmZyYW1lID0gZnJhbWU7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oY29udGV4dCk7XG4gICAgfSk7XG5cbiAgICBpZiAoZnJhbWVWYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlcyB0aGUnJHtqdWRnZW1lbnRTdHJpbmd9JyBqdWRnZW1lbnQncyBmcmFtZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWVWYWxpZGF0ZXM7XG4gIH1cblxuICBfdmFsaWRhdGVXaGVuU3RhdGVkKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmICghc3RhdGVkKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlblN0YXRlZCk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQ7XG5cbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBzdGF0ZWQganVkZ2VtZW50Li4uYCk7XG5cbiAgICB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gdHJ1ZTtcblxuICAgIGlmICh2YWxpZGF0ZXNXaGVuU3RhdGVkKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIHN0YXRlZCBqdWRnZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuU3RhdGVkKTtcbiAgfVxuXG4gIF92YWxpZGF0ZVdoZW5EZXJpdmVkKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmIChzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlc1doZW5EZXJpdmVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuRGVyaXZlZCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqdWRnZW1lbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtqdWRnZW1lbnRTdHJpbmd9JyBkZXJpdmVkIGp1ZGdlbWVudC4uLmApO1xuXG4gICAgY29uc3Qgc2NoZW1hcyA9IGNvbnRleHQuZ2V0U2NoZW1hcygpLFxuICAgICAgICAgIGp1ZGdlbWVudCA9IHRoaXM7IC8vL1xuXG4gICAgcmV0dXJuIG9uZShzY2hlbWFzLCAoc2NoZW1hLCBjb250aW51YXRpb24pID0+IHtcbiAgICAgIHNjaGVtYS51bmlmeUp1ZGdlbWVudChqdWRnZW1lbnQsIGNvbnRleHQsIGNvbnRpbnVhdGlvbik7XG4gICAgfSwgKGp1ZGdlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoanVkZ2VtZW50VW5pZmllcykge1xuICAgICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWxpZGF0ZXNXaGVuRGVyaXZlZCkge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2p1ZGdlbWVudFN0cmluZ30nIGRlcml2ZWQganVkZ2VtZW50LmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHZhbGlkYXRlc1doZW5EZXJpdmVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJKdWRnZW1lbnRcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIHJldHVybiBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgeyBzdHJpbmcgfSA9IGpzb24sXG4gICAgICAgICAgICBqdWRnZW1lbnROb2RlID0gaW5zdGFudGlhdGVKdWRnZW1lbnQoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG5vZGUgPSBqdWRnZW1lbnROb2RlLCAgLy8vXG4gICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgZnJhbWUgPSBmcmFtZUZyb21KdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgZ29hbCA9IGdvYWxGcm9tSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlLCBjb250ZXh0KTtcblxuICAgICAgY29udGV4dCA9IG51bGw7XG5cbiAgICAgIGNvbnN0IGp1ZGdlbWVudCA9IG5ldyBKdWRnZW1lbnQoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBmcmFtZSwgZ29hbCk7XG5cbiAgICAgIHJldHVybiBqdWRnZW1lbnQ7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50LmdldE5vZGUoKSxcbiAgICAgIGp1ZGdlbWVudCA9IGp1ZGdlbWVudEZyb21TdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGp1ZGdlbWVudDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tRmFjdChmYWN0LCBjb250ZXh0KSB7XG4gICAgbGV0IGp1ZGdlbWVudCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnROb2RlID0gZmFjdC5nZXRTdGF0ZW1lbnROb2RlKCk7XG5cbiAgICBpZiAoc3RhdGVtZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAganVkZ2VtZW50ID0ganVkZ2VtZW50RnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGp1ZGdlbWVudDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGdvYWxGcm9tSnVkZ2VtZW50Tm9kZShqdWRnZW1lbnROb2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IGdvYWxOb2RlID0ganVkZ2VtZW50Tm9kZS5nZXRHb2FsTm9kZSgpLFxuICAgICAgICBnb2FsID0gY29udGV4dC5maW5kR29hbEJ5R29sYU5vZGUoZ29hbE5vZGUpO1xuXG4gIHJldHVybiBnb2FsO1xufVxuXG5mdW5jdGlvbiBmcmFtZUZyb21KdWRnZW1lbnROb2RlKGp1ZGdlbWVudE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgZnJhbWVOb2RlID0ganVkZ2VtZW50Tm9kZS5nZXRGcmFtZU5vZGUoKSxcbiAgICAgICAgZnJhbWUgPSBjb250ZXh0LmZpbmRGcmFtZUJ5RnJhbWVOb2RlKGZyYW1lTm9kZSk7XG5cbiAgcmV0dXJuIGZyYW1lO1xufVxuXG5mdW5jdGlvbiBpbXBsaWNpdEFzc3VtcHRpb25zRnJvbUZhY3RzKGZhY3RzLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgSW1wbGljaXRBc3N1bXB0aW9uIH0gPSBlbGVtZW50cyxcbiAgICAgICAgaW1wbGljaXRBc3N1bXB0aW9ucyA9IGZhY3RzLm1hcCgoZmFjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGZhY3QuZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgICAgaW1wbGljaXRBc3N1bXB0aW9uID0gSW1wbGljaXRBc3N1bXB0aW9uLmZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgICAgICAgIHJldHVybiBpbXBsaWNpdEFzc3VtcHRpb247XG4gICAgICAgIH0pO1xuXG4gIHJldHVybiBpbXBsaWNpdEFzc3VtcHRpb25zO1xufVxuXG4iXSwibmFtZXMiOlsicHVzaCIsImFycmF5VXRpbGl0aWVzIiwiYnJlYWtQb2ludEZyb21KU09OIiwiYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiSnVkZ2VtZW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsImZyYW1lIiwiZ29hbCIsImdldEZyYW1lIiwiZ2V0QXNzdW1wdGlvbiIsImdldEp1ZGdlbWVudE5vZGUiLCJnZXROb2RlIiwianVkZ2VtZW50Tm9kZSIsImlzU2luZ3VsYXIiLCJzaW5ndWxhciIsImlzRXF1YWxUbyIsImp1ZGdlbWVudCIsImp1ZGdlbWVudE5vZGVNYXRjaGVzIiwibWF0Y2hKdWRnZW1lbnROb2RlIiwiZXF1YWxUbyIsImlzTWV0YXZhcmlhYmxlRGVmaW5lZCIsIm1ldGF2YXJpYWJsZSIsImlzSW1wbGljaXQiLCJnZXRTdGF0ZW1lbnQiLCJnZXRSZWZlcmVuY2UiLCJnZXRNZXRhdmFyaWFibGUiLCJnZXRBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwiZnJhbWVBc3N1bXB0aW9ucyIsImZhY3RzIiwiZ2V0RmFjdHMiLCJpbXBsaWNpdEFzc3VtcHRpb25zIiwiaW1wbGljaXRBc3N1bXB0aW9uc0Zyb21GYWN0cyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsImZpbmRTdWJwcm9vZkFzc2VydGlvbiIsImZpbmRKdWRnZW1lbnQiLCJmaW5kSnVkZ2VtZW50QnlKdWRnZW1lbnROb2RlIiwiY29tcGFyZVN0ZXAiLCJzdGVwIiwiY29tcGFyZXNUb1N0ZXAiLCJzdGVwU3RyaW5nIiwiZ2V0U3RyaW5nIiwianVkZ2VtZW50U3RyaW5nIiwidHJhY2UiLCJzdGF0ZW1lbnQiLCJjb21wYXJlc1RvU3RhdGVtZW50IiwiY29tcGFyZVN0YXRlbWVudCIsImRlYnVnIiwic3RhdGVtZW50U3RyaW5nIiwibGVmdFN0YXRlbWVudCIsInJpZ2h0U3RhdGVtZW50Iiwic3RhdGVtZW50c0VxdWF0ZSIsImVxdWF0ZVN0YXRlbWVudHMiLCJjb21wYXJlTWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5hbWUiLCJ2YWxpZGF0ZSIsImNvbnRpbnVhdGlvbiIsInZhbGlkYXRlcyIsImp1ZGdlbWVudG5TdHJpbmciLCJqdWRnZW1lbnRuIiwidmFsaWRhdGVHb2FsIiwiYmluZCIsInZhbGlkYXRlRnJhbWUiLCJhbGwiLCJ2YWxpZGF0ZVdoZW5TdGF0ZWQiLCJ2YWxpZGF0ZVdoZW5EZXJpdmVkIiwiZXhpc3RzIiwiYWRkSnVkZ2VtZW50IiwiZ29hbFZhbGlkYXRlcyIsImZyYW1lVmFsaWRhdGVzIiwiX3ZhbGlkYXRlV2hlblN0YXRlZCIsInN0YXRlZCIsImlzU3RhdGVkIiwidmFsaWRhdGVzV2hlblN0YXRlZCIsIl92YWxpZGF0ZVdoZW5EZXJpdmVkIiwidmFsaWRhdGVzV2hlbkRlcml2ZWQiLCJzY2hlbWFzIiwiZ2V0U2NoZW1hcyIsIm9uZSIsInNjaGVtYSIsInVuaWZ5SnVkZ2VtZW50IiwianVkZ2VtZW50VW5pZmllcyIsInRvSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJuYW1lIiwiZnJvbUpTT04iLCJpbnN0YW50aWF0ZSIsImluc3RhbnRpYXRlSnVkZ2VtZW50IiwiZnJhbWVGcm9tSnVkZ2VtZW50Tm9kZSIsImdvYWxGcm9tSnVkZ2VtZW50Tm9kZSIsImZyb21TdGF0ZW1lbnQiLCJzdGF0ZW1lbnROb2RlIiwianVkZ2VtZW50RnJvbVN0YXRlbWVudE5vZGUiLCJmcm9tRmFjdCIsImZhY3QiLCJnZXRTdGF0ZW1lbnROb2RlIiwiZ29hbE5vZGUiLCJnZXRHb2FsTm9kZSIsImZpbmRHb2FsQnlHb2xhTm9kZSIsImZyYW1lTm9kZSIsImdldEZyYW1lTm9kZSIsImZpbmRGcmFtZUJ5RnJhbWVOb2RlIiwiSW1wbGljaXRBc3N1bXB0aW9uIiwiZWxlbWVudHMiLCJtYXAiLCJpbXBsaWNpdEFzc3VtcHRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWtCQTs7O2VBQUE7OzsyQkFoQitCO2dDQUNjO2tFQUV4Qjs4QkFFRDt5QkFFUTt3QkFFSzs2QkFDSTt5QkFDTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTNDLE1BQU0sRUFBRUEsSUFBSSxFQUFFLEdBQUdDLHlCQUFjLEVBQ3pCLEVBQUVDLGtCQUFrQixFQUFFQywwQkFBMEIsRUFBRSxHQUFHQyxtQ0FBbUI7TUFFOUUsV0FBZUMsSUFBQUEsZ0JBQU0sRUFBQyxNQUFNQyxrQkFBa0JDLHVCQUFPO0lBQ25ELFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFB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
|
|
@@ -266,18 +266,18 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
266
266
|
return termValidates;
|
|
267
267
|
}
|
|
268
268
|
unifyFrame(frame, generalContext, specificContext, continuation) {
|
|
269
|
-
const context = specificContext, frameString = frame.getString(), metavariableString = this.getString();
|
|
270
|
-
context.trace(`Unifying the '${frameString}' frame with the '${metavariableString}' metavariable...`);
|
|
271
|
-
const
|
|
272
|
-
if (
|
|
269
|
+
const context = specificContext, frameString = frame.getString(), metavariableString = this.getString();
|
|
270
|
+
context.trace(`Unifying the '${frameString}' frame with the '${metavariableString}}' metavariable...`);
|
|
271
|
+
const frameMetavariableCompares = this.compareFrameMetavariable(frame, generalContext, specificContext);
|
|
272
|
+
if (frameMetavariableCompares) {
|
|
273
273
|
const frameUnifies = true;
|
|
274
274
|
return continuation(frameUnifies);
|
|
275
275
|
}
|
|
276
276
|
const metavariable = this, metavariableNode = metavariable.getNode(), derivedSubstitution = context.findDerivedSubstitutionByMetavariableNode(metavariableNode);
|
|
277
277
|
if (derivedSubstitution !== null) {
|
|
278
278
|
let frameUnifies = false;
|
|
279
|
-
const
|
|
280
|
-
if (
|
|
279
|
+
const derivedSubstitutionComparesToTerm = derivedSubstitution.compareTerm(frame, context);
|
|
280
|
+
if (derivedSubstitutionComparesToTerm) {
|
|
281
281
|
const derivedSubstitutionString = derivedSubstitution.getString();
|
|
282
282
|
context.trace(`The '${derivedSubstitutionString}' derived substitution is already present.`);
|
|
283
283
|
frameUnifies = true;
|
|
@@ -285,18 +285,18 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
285
285
|
return continuation(frameUnifies);
|
|
286
286
|
}
|
|
287
287
|
const { FrameSubstitution } = _elements.default, frameSubstitution = FrameSubstitution.fromFrameAndMetavariable(frame, metavariable, generalContext, specificContext);
|
|
288
|
-
|
|
289
|
-
let
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
}
|
|
295
|
-
if (frameUnifies) {
|
|
296
|
-
context.debug(`...unified the '${frameString}' frame with the '${metavariableString}' metavariable.`);
|
|
297
|
-
}
|
|
298
|
-
return continuation(frameUnifies);
|
|
288
|
+
frameSubstitution.validate(context, (frameSubstitution, context)=>{
|
|
289
|
+
let validates;
|
|
290
|
+
const derivedSubstitution = frameSubstitution; ///
|
|
291
|
+
context.addDerivedSubstitution(derivedSubstitution);
|
|
292
|
+
validates = true;
|
|
293
|
+
return validates;
|
|
299
294
|
});
|
|
295
|
+
const frameUnifies = true;
|
|
296
|
+
if (frameUnifies) {
|
|
297
|
+
context.debug(`...unified the '${frameString}' frame with the '${metavariableString}' variable.`);
|
|
298
|
+
}
|
|
299
|
+
return continuation(frameUnifies);
|
|
300
300
|
}
|
|
301
301
|
unifyStatement(statement, generalContext, specificContext, continuation) {
|
|
302
302
|
const context = specificContext, statementString = statement.getString(), metavariableString = this.getString();
|
|
@@ -339,8 +339,8 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
339
339
|
return continuation(statementUnifies);
|
|
340
340
|
}
|
|
341
341
|
unifyReference(reference, generalContext, specificContext, continuation) {
|
|
342
|
-
const context = specificContext, referenceString = reference.getString(), metavariableString = this.getString();
|
|
343
|
-
context.trace(`Unifying the '${referenceString}' reference with the '${metavariableString}' metavariable...`);
|
|
342
|
+
const context = specificContext, referenceString = reference.getString(), metavariableString = this.getString();
|
|
343
|
+
context.trace(`Unifying the '${referenceString}' reference with the '${metavariableString}}' metavariable...`);
|
|
344
344
|
const referenceMetavariableCompares = this.compareReferenceMetavariable(reference, generalContext, specificContext);
|
|
345
345
|
if (referenceMetavariableCompares) {
|
|
346
346
|
const referenceUnifies = true;
|
|
@@ -349,8 +349,8 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
349
349
|
const metavariable = this, metavariableNode = metavariable.getNode(), derivedSubstitution = context.findDerivedSubstitutionByMetavariableNode(metavariableNode);
|
|
350
350
|
if (derivedSubstitution !== null) {
|
|
351
351
|
let referenceUnifies = false;
|
|
352
|
-
const
|
|
353
|
-
if (
|
|
352
|
+
const derivedSubstitutionComparesToTerm = derivedSubstitution.compareTerm(reference, context);
|
|
353
|
+
if (derivedSubstitutionComparesToTerm) {
|
|
354
354
|
const derivedSubstitutionString = derivedSubstitution.getString();
|
|
355
355
|
context.trace(`The '${derivedSubstitutionString}' derived substitution is already present.`);
|
|
356
356
|
referenceUnifies = true;
|
|
@@ -358,15 +358,18 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
358
358
|
return continuation(referenceUnifies);
|
|
359
359
|
}
|
|
360
360
|
const { ReferenceSubstitution } = _elements.default, referenceSubstitution = ReferenceSubstitution.fromReferenceAndMetavariable(reference, metavariable, generalContext, specificContext);
|
|
361
|
-
|
|
361
|
+
referenceSubstitution.validate(context, (referenceSubstitution, context)=>{
|
|
362
|
+
let validates;
|
|
362
363
|
const derivedSubstitution = referenceSubstitution; ///
|
|
363
364
|
context.addDerivedSubstitution(derivedSubstitution);
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
context.debug(`...unified the '${referenceString}' reference with the '${metavariableString}' metavariable.`);
|
|
367
|
-
}
|
|
368
|
-
return continuation(referenceUnifies);
|
|
365
|
+
validates = true;
|
|
366
|
+
return validates;
|
|
369
367
|
});
|
|
368
|
+
const referenceUnifies = true;
|
|
369
|
+
if (referenceUnifies) {
|
|
370
|
+
context.debug(`...unified the '${referenceString}' reference with the '${metavariableString}' variable.`);
|
|
371
|
+
}
|
|
372
|
+
return continuation(referenceUnifies);
|
|
370
373
|
}
|
|
371
374
|
unifyMetavariable(metavariable, context, continuation) {
|
|
372
375
|
let metavariableUnifies;
|
|
@@ -389,7 +392,7 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
389
392
|
return continuation(metavariableUnifiesIntrinsically);
|
|
390
393
|
});
|
|
391
394
|
}
|
|
392
|
-
|
|
395
|
+
compareFrameMetavariable(frame, generalContext, specificContext) {
|
|
393
396
|
let frameMetavariablCompares = false;
|
|
394
397
|
const context = specificContext, frameString = frame.getString(), metavariableString = this.getString(); ///
|
|
395
398
|
context.trace(`Comparing the '${frameString}' frame's metavariable to the '${metavariableString}' metavariable...`);
|
|
@@ -463,4 +466,4 @@ const _default = (0, _elements.define)(class Metavariable extends _occamlanguage
|
|
|
463
466
|
}
|
|
464
467
|
});
|
|
465
468
|
|
|
466
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L21ldGF2YXJpYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVNZXRhdmFyaWFibGUgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgbWV0YVR5cGVGcm9tSlNPTiwgbWV0YVR5cGVUb01ldGFUeXBlSlNPTiB9IGZyb20gXCIuLi91dGlsaXRpZXMvanNvblwiO1xuaW1wb3J0IHsgdW5pZnlNZXRhdmFyaWFibGUsIHVuaWZ5TWV0YXZhcmlhYmxlSW50cmluc2ljYWxseSB9IGZyb20gXCIuLi9wcm9jZXNzL3VuaWZ5XCI7XG5pbXBvcnQgeyBuYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUsIHRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZSwgdHlwZUZyb21NZXRhdmFyaWFibGVOb2RlLCBtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuXG5jb25zdCB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBNZXRhdmFyaWFibGUgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBuYW1lLCB0ZXJtLCB0eXBlLCBtZXRhVHlwZSkge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG4gICAgXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0VGVybSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtO1xuICB9XG5cbiAgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0TWV0YVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YVR5cGU7XG4gIH1cblxuICBzZXRNZXRhVHlwZShtZXRhVHlwZSkge1xuICAgIHRoaXMubWV0YVR5cGUgPSBtZXRhVHlwZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBub2RlOyAgLy8vXG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlTm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5hbWUoKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOb2RlLmdldE1ldGF2YXJpYWJsZU5hbWUoKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOYW1lO1xuICB9XG5cbiAgaXNEZWNsYXJlZCgpIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9ICh0aGlzLm1ldGFUeXBlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBkZWNsYXJlZDtcbiAgfVxuXG4gIGlzRXF1YWxUbyhtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBpc01ldGFUeXBlRXF1YWxUbyhtZXRhVHlwZSkgeyByZXR1cm4gdGhpcy5tZXRhVHlwZS5pc0VxdWFsVG8obWV0YVR5cGUpOyB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBub2RlID0gbWV0YXZhcmlhYmxlTm9kZSwgLy8vXG4gICAgICAgICAgbm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTm9kZShub2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG5vZGVNYXRjaGVzOyAvLy9cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcztcbiAgfVxuXG4gIGZpbmRNZXRhdmFyaWFibGUoY29udGV4dCkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5vZGUoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgY29tcGFyZU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlLmdldE5hbWUoKSxcbiAgICAgICAgICBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSksXG4gICAgICAgICAgY29tcGFyZXNUb01ldGF2YXJpYWJsZSA9IGNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb01ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBuYW1lTWV0YXZhcmlhYmxlTmFtZSA9ICh0aGlzLm5hbWUgPT09IG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbmFtZU1ldGF2YXJpYWJsZU5hbWU7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZTtcbiAgfVxuXG4gIHZlcmlmeShjb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgdGVybVZlcmlmaWVzID0gdGhpcy52ZXJpZnlUZXJtKGNvbnRleHQpO1xuXG4gICAgaWYgKHRlcm1WZXJpZmllcykge1xuICAgICAgY29uc3QgdHlwZVZlcmlmaWVzID0gdGhpcy52ZXJpZnlUeXBlKGNvbnRleHQpO1xuXG4gICAgICBpZiAodHlwZVZlcmlmaWVzKSB7XG4gICAgICAgIHZlcmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgdmVyaWZ5VGVybShjb250ZXh0KSB7XG4gICAgbGV0IHRlcm1WZXJpZmllcyA9IHRydWU7ICAvLy9cblxuICAgIGlmICh0aGlzLnRlcm0gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0aGlzLnRlcm0uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgICB0ZXJtVmVyaWZpZXMgPSBmYWxzZTtcblxuICAgICAgY29udGV4dC50cmFjZShgQSAnJHt0ZXJtU3RyaW5nfScgdGVybSBpcyBwcmVzZW50IGluIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcm1WZXJpZmllcztcbiAgfVxuXG4gIHZlcmlmeVR5cGUoY29udGV4dCkge1xuICAgIGxldCB0eXBlVmVyaWZpZXMgPSB0cnVlOyAgLy8vXG5cbiAgICBpZiAodGhpcy50eXBlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS4uLmApO1xuXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRoaXMudHlwZS5nZXROYW1lKCksXG4gICAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgICAgIHR5cGVWZXJpZmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlVmVyaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWRzIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0eXBlLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlVmVyaWZpZXM7XG4gIH1cblxuICB2YWxpZGF0ZShzdHJpY3QsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGlmIChjb250aW51YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWF0aW9uID0gY29udGV4dDsgLy8vXG5cbiAgICAgIGNvbnRleHQgPSBzdHJpY3Q7IC8vL1xuXG4gICAgICBzdHJpY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdGVzO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGxldCBtZXRhdmFyaWFibGU7XG5cbiAgICBtZXRhdmFyaWFibGUgPSB0aGlzLmZpbmRNZXRhdmFyaWFibGUoY29udGV4dCk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgdmFsaWRhdGVzID0gY29udGludWF0aW9uKG1ldGF2YXJpYWJsZSwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGF2YXJpYWJsZSA9IHRoaXM7ICAvLy9cblxuICAgICAgY29uc3QgdmFsaWRhdGVOYW1lID0gdGhpcy52YWxpZGF0ZU5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbGlkYXRlVHlwZSA9IHRoaXMudmFsaWRhdGVUeXBlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB2YWxpZGF0ZVRlcm0gPSB0aGlzLnZhbGlkYXRlVGVybS5iaW5kKHRoaXMpO1xuXG4gICAgICB2YWxpZGF0ZXMgPSBhbGwoW1xuICAgICAgICB2YWxpZGF0ZU5hbWUsXG4gICAgICAgIHZhbGlkYXRlVHlwZSxcbiAgICAgICAgdmFsaWRhdGVUZXJtXG4gICAgICBdLCBzdHJpY3QsIGNvbnRleHQsIChzdHJpY3QsIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgaWYgKGRlY2xhcmVkTWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29udGV4dC5hZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24obWV0YXZhcmlhYmxlLCBjb250ZXh0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZU5hbWUoc3RyaWN0LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgbmFtZVZhbGlkYXRlcyA9IHRydWU7IC8vL1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgZGVjbGFyZWRNZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmREZWNsYXJlZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGlmIChkZWNsYXJlZE1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVR5cGUgPSBkZWNsYXJlZE1ldGF2YXJpYWJsZS5nZXRNZXRhVHlwZSgpLFxuICAgICAgICAgICAgbWV0YVR5cGVTdHJpbmcgPSBtZXRhVHlwZS5nZXRTdHJpbmcoKTtcblxuICAgICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBTZXR0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyBtZXRhLXR5cGUgdG8gdGhlICcke21ldGFUeXBlU3RyaW5nfScgbWV0YS10eXBlLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIG5hbWVWYWxpZGF0ZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZVZhbGlkYXRlcykge1xuICAgICAgbmFtZVZhbGlkYXRlcyA9IGNvbnRpbnVhdGlvbihzdHJpY3QsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChuYW1lVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIG5hbWUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVR5cGUoc3RyaWN0LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdHlwZVZhbGlkYXRlcztcblxuICAgIGlmICh0aGlzLnR5cGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuLi5gKTtcblxuICAgICAgdHlwZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRoaXMudHlwZS5nZXROYW1lKCksXG4gICAgICAgICAgICB0eXBlUHJlc2VuZXQgPSBjb250ZXh0LmlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVQcmVzZW5ldCkge1xuICAgICAgICB0eXBlVmFsaWRhdGVzID0gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQudHJhY2UoYC4uLnZhbGlkYXRlZCAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVWYWxpZGF0ZXMgPSBjb250aW51YXRpb24oc3RyaWN0LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlVGVybShzdHJpY3QsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCB0ZXJtVmFsaWRhdGVzO1xuXG4gICAgaWYgKHRoaXMudGVybSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLi4uYCk7XG5cbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5hbWUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgIGlmIChkZWNsYXJlZE1ldGF2YXJpYWJsZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgdGVybVZhbGlkYXRlcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlcm1WYWxpZGF0ZXMgPSB0aGlzLnRlcm0udmFsaWRhdGUoY29udGV4dCwgKHRlcm0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGVybSA9IHRlcm07XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc3RyaWN0LCBjb250ZXh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGRlY2xhcmVkTWV0YXZhcmlhYmxlLmdldFR5cGUoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRlcm1WYWxpZGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXJtVmFsaWRhdGVzID0gdGhpcy50ZXJtLnZhbGlkYXRlR2l2ZW5UeXBlKHR5cGUsIGNvbnRleHQsICh0ZXJtLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlcm1WYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLmApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXJtVmFsaWRhdGVzID0gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcm1WYWxpZGF0ZXM7XG4gIH1cblxuICB1bmlmeUZyYW1lKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzID0gdGhpcy5jb21wYXJlRnJhZW1NZXRhdmFyYWlibGUoZnJhbWUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKGZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcykge1xuICAgICAgY29uc3QgZnJhbWVVbmlmaWVzID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihmcmFtZVVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMsICAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBkZXJpdmVkU3Vic3RpdHV0aW9uID0gY29udGV4dC5maW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgIGlmIChkZXJpdmVkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBsZXQgZnJhbWVVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25GcmFtZUNvbXBhcmVzVG9GcmFtZSA9IGRlcml2ZWRTdWJzdGl0dXRpb24uY29tcGFyZUZyYW1lKGZyYW1lLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb25GcmFtZUNvbXBhcmVzVG9GcmFtZSkge1xuICAgICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7ZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZ30nIGRlcml2ZWQgc3Vic3RpdHV0aW9uIGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgICBmcmFtZVVuaWZpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGZyYW1lVW5pZmllcyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBGcmFtZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgZnJhbWVTdWJzdGl0dXRpb24gPSBGcmFtZVN1YnN0aXR1dGlvbi5mcm9tRnJhbWVBbmRNZXRhdmFyaWFibGUoZnJhbWUsIG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gZnJhbWVTdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCwgKGZyYW1lU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBsZXQgZnJhbWVVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgIGlmIChmcmFtZVN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uID0gZnJhbWVTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgICBjb250ZXh0LmFkZERlcml2ZWRTdWJzdGl0dXRpb24oZGVyaXZlZFN1YnN0aXR1dGlvbik7XG5cbiAgICAgICAgZnJhbWVVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZyYW1lVW5pZmllcykge1xuICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihmcmFtZVVuaWZpZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ319JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdGhpcy5jb21wYXJlU3RhdGVtZW50TWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN0YXRlbWVudFVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMsICAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBzdWJsaW5nU3Vic3RpdHV0aW9uTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUuZ2V0U2libGluZ1N1YnN0aXR1dGlvbk5vZGUoKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25Ob2RlID0gc3VibGluZ1N1YnN0aXR1dGlvbk5vZGUsIC8vL1xuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb24gPSAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZERlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZERlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICBpZiAoZGVyaXZlZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IHN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmNvbXBhcmVTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25TdHJpbmcgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgZGVyaXZlZCBzdWJzdGl0dXRpb24gaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICAgIHN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN0YXRlbWVudFVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gPSBlbGVtZW50cztcblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0LCAvLy9cbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKTtcblxuICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbiA9IFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCwgKHN0YXRlbWVudFN1YnN0aXR1dGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgbGV0IHZhbGlkYXRlcztcblxuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IHN0YXRlbWVudFN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZERlcml2ZWRTdWJzdGl0dXRpb24oZGVyaXZlZFN1YnN0aXR1dGlvbik7XG5cbiAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRVbmlmaWVzID0gdHJ1ZTtcblxuICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3RhdGVtZW50VW5pZmllcyk7XG4gIH1cblxuICB1bmlmeVJlZmVyZW5jZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMgPSB0aGlzLmNvbXBhcmVSZWZlcmVuY2VNZXRhdmFyaWFibGUocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgIGlmIChyZWZlcmVuY2VNZXRhdmFyaWFibGVDb21wYXJlcykge1xuICAgICAgY29uc3QgcmVmZXJlbmNlVW5pZmllcyA9IHRydWU7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24ocmVmZXJlbmNlVW5pZmllcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcywgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGUuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgIGxldCByZWZlcmVuY2VVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25SZWZlcmVuY2VDb21wYXJlc1RvUmVmZXJlbmNlID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5jb21wYXJlUmVmZXJlbmNlKHJlZmVyZW5jZSwgY29udGV4dCk7XG5cbiAgICAgIGlmIChkZXJpdmVkU3Vic3RpdHV0aW9uUmVmZXJlbmNlQ29tcGFyZXNUb1JlZmVyZW5jZSkge1xuICAgICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7ZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZ30nIGRlcml2ZWQgc3Vic3RpdHV0aW9uIGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgICByZWZlcmVuY2VVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VVbmlmaWVzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IFJlZmVyZW5jZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgcmVmZXJlbmNlU3Vic3RpdHV0aW9uID0gUmVmZXJlbmNlU3Vic3RpdHV0aW9uLmZyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUocmVmZXJlbmNlLCBtZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVN1YnN0aXR1dGlvbi52YWxpZGF0ZShjb250ZXh0LCAocmVmZXJlbmNlU3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uID0gcmVmZXJlbmNlU3Vic3RpdHV0aW9uOyAgLy8vXG5cbiAgICAgIGNvbnRleHQuYWRkRGVyaXZlZFN1YnN0aXR1dGlvbihkZXJpdmVkU3Vic3RpdHV0aW9uKTtcblxuICAgICAgY29uc3QgcmVmZXJlbmNlVW5pZmllcyA9IHRydWU7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24ocmVmZXJlbmNlVW5pZmllcyk7XG4gICAgfSk7XG4gIH1cblxuICB1bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCBtZXRhdmFyaWFibGVVbmlmaWVzO1xuXG4gICAgZGVidWdnZXJcblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0ID0gY29udGV4dCwgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmcgPSBnZW5lcmFsTWV0YXZhcmlhYmxlLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHVuaWZ5TWV0YXZhcmlhYmxlKGdlbmVyYWxNZXRhdmFyaWFibGUsIHNwZWNpZmljTWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgIGlmIChtZXRhdmFyaWFibGVVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzcGVjaWZpY01ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB3aXRoIHRoZSAnJHtnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVVbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlNZXRhdmFyaWFibGVJbnRyaW5zaWNhbGx5KG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSxcbiAgICAgICAgICBnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nID0gZ2VuZXJhbE1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5Li4uYCk7XG5cbiAgICB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkoZ2VuZXJhbE1ldGF2YXJpYWJsZSwgc3BlY2lmaWNNZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSkgPT4ge1xuICAgICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXNJbnRyaW5zaWNhbGx5KSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHdpdGggdGhlICcke2dlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgaW50cmluc2ljYWxseS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSk7XG4gICAgfSk7XG4gIH1cblxuICBjb21wYXJlRnJhZW1NZXRhdmFyYWlibGUoZnJhbWUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9IGdlbmVyYWxDb250ZXh0LmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0RmlsZVBhdGggPSBzcGVjaWZpY0NvbnRleHQuZ2V0RmlsZVBhdGgoKTtcblxuICAgIGlmIChnZW5lcmFsQ29udGV4dEZpbGVQYXRoID09PSBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLCAgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IGZyYW1lLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIGZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uY29tcGFyZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzO1xuICB9XG5cbiAgY29tcGFyZVJlZmVyZW5jZU1ldGF2YXJpYWJsZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYENvbXBhcmluZyB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlJ3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPSBnZW5lcmFsQ29udGV4dC5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIHNwZWNpZmljQ29udGV4dEZpbGVQYXRoID0gc3BlY2lmaWNDb250ZXh0LmdldEZpbGVQYXRoKCk7XG5cbiAgICBpZiAoZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9PT0gc3BlY2lmaWNDb250ZXh0RmlsZVBhdGgpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gcmVmZXJlbmNlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHJlZmVyZW5jZU1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLmNvbXBhcmVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXM7XG4gIH1cblxuICBjb21wYXJlU3RhdGVtZW50TWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dEZpbGVQYXRoID0gZ2VuZXJhbENvbnRleHQuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCA9IHNwZWNpZmljQ29udGV4dC5nZXRGaWxlUGF0aCgpO1xuXG4gICAgaWYgKGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPT09IHNwZWNpZmljQ29udGV4dEZpbGVQYXRoKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5jb21wYXJlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50J3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IG1ldGFUeXBlSlNPTiA9IG1ldGFUeXBlVG9NZXRhVHlwZUpTT04odGhpcy5tZXRhVHlwZSksXG4gICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUpTT04sICAvLy9cbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludCxcbiAgICAgIG1ldGFUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIk1ldGF2YXJpYWJsZVwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBpbnN0YW50aWF0ZU1ldGF2YXJpYWJsZShzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICBuYW1lID0gbmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgdGVybSA9IHRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGUgPSBuZXcgTWV0YXZhcmlhYmxlKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgbmFtZSwgdGVybSwgdHlwZSwgbWV0YVR5cGUpO1xuXG4gICAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHN0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJNZXRhdmFyaWFibGUiLCJFbGVtZW50IiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwibmFtZSIsInRlcm0iLCJ0eXBlIiwibWV0YVR5cGUiLCJnZXROYW1lIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRNZXRhVHlwZSIsInNldE1ldGFUeXBlIiwiZ2V0TWV0YXZhcmlhYmxlTm9kZSIsImdldE5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5hbWUiLCJpc0RlY2xhcmVkIiwiZGVjbGFyZWQiLCJpc0VxdWFsVG8iLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImVxdWFsVG8iLCJpc01ldGFUeXBlRXF1YWxUbyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwiZmluZE1ldGF2YXJpYWJsZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJjb21wYXJlTWV0YXZhcmlhYmxlIiwiY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJjb21wYXJlTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVzVG9NZXRhdmFyaWFibGUiLCJuYW1lTWV0YXZhcmlhYmxlTmFtZSIsInZlcmlmeSIsInZlcmlmaWVzIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ0ZXJtVmVyaWZpZXMiLCJ2ZXJpZnlUZXJtIiwidHlwZVZlcmlmaWVzIiwidmVyaWZ5VHlwZSIsImRlYnVnIiwidGVybVN0cmluZyIsInR5cGVOYW1lIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidmFsaWRhdGUiLCJzdHJpY3QiLCJjb250aW51YXRpb24iLCJ1bmRlZmluZWQiLCJ2YWxpZGF0ZXMiLCJ2YWxpZGF0ZU5hbWUiLCJiaW5kIiwidmFsaWRhdGVUeXBlIiwidmFsaWRhdGVUZXJtIiwiYWxsIiwiZGVjbGFyZWRNZXRhdmFyaWFibGUiLCJmaW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJhZGRNZXRhdmFyaWFibGUiLCJuYW1lVmFsaWRhdGVzIiwibWV0YVR5cGVTdHJpbmciLCJ0eXBlVmFsaWRhdGVzIiwidHlwZVByZXNlbmV0IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ0ZXJtVmFsaWRhdGVzIiwidmFsaWRhdGVHaXZlblR5cGUiLCJ1bmlmeUZyYW1lIiwiZnJhbWUiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsImZyYW1lU3RyaW5nIiwiZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzIiwiY29tcGFyZUZyYWVtTWV0YXZhcmFpYmxlIiwiZnJhbWVVbmlmaWVzIiwiZGVyaXZlZFN1YnN0aXR1dGlvbiIsImZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlIiwiZGVyaXZlZFN1YnN0aXR1dGlvbkZyYW1lQ29tcGFyZXNUb0ZyYW1lIiwiY29tcGFyZUZyYW1lIiwiZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZyIsIkZyYW1lU3Vic3RpdHV0aW9uIiwiZWxlbWVudHMiLCJmcmFtZVN1YnN0aXR1dGlvbiIsImZyb21GcmFtZUFuZE1ldGF2YXJpYWJsZSIsImFkZERlcml2ZWRTdWJzdGl0dXRpb24iLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzIiwiY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZSIsInN0YXRlbWVudFVuaWZpZXMiLCJzdWJsaW5nU3Vic3RpdHV0aW9uTm9kZSIsImdldFNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZSIsImZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsImRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvU3RhdGVtZW50IiwiY29tcGFyZVN0YXRlbWVudCIsIlN0YXRlbWVudFN1YnN0aXR1dGlvbiIsInN0YXRlbWVudFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwiZnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZSIsInVuaWZ5UmVmZXJlbmNlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlU3RyaW5nIiwicmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMiLCJjb21wYXJlUmVmZXJlbmNlTWV0YXZhcmlhYmxlIiwicmVmZXJlbmNlVW5pZmllcyIsImRlcml2ZWRTdWJzdGl0dXRpb25SZWZlcmVuY2VDb21wYXJlc1RvUmVmZXJlbmNlIiwiY29tcGFyZVJlZmVyZW5jZSIsIlJlZmVyZW5jZVN1YnN0aXR1dGlvbiIsInJlZmVyZW5jZVN1YnN0aXR1dGlvbiIsImZyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZVVuaWZpZXMiLCJnZW5lcmFsTWV0YXZhcmlhYmxlIiwic3BlY2lmaWNNZXRhdmFyaWFibGUiLCJnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nIiwic3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmciLCJ1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkiLCJtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSIsImdlbmVyYWxDb250ZXh0RmlsZVBhdGgiLCJnZXRGaWxlUGF0aCIsInNwZWNpZmljQ29udGV4dEZpbGVQYXRoIiwidG9KU09OIiwibWV0YVR5cGVKU09OIiwibWV0YVR5cGVUb01ldGFUeXBlSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwiaW5zdGFudGlhdGVNZXRhdmFyaWFibGUiLCJuYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJ0ZXJtRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJ0eXBlRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhVHlwZUZyb21KU09OIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudE5vZGUiLCJtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBZ0JBOzs7ZUFBQTs7O2dDQWQ2QztrRUFFeEI7OEJBRUQ7eUJBRVE7NkJBQ1k7c0JBQ2lCO3VCQUNTO3lCQUMwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVILE1BQU0sRUFBRUEsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLHFCQUFxQkMsdUJBQU87SUFDdEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxRQUFRLENBQUU7UUFDekUsS0FBSyxDQUFDUCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLFFBQVEsR0FBR0E7SUFDbEI7SUFFQUMsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDSixJQUFJO0lBQ2xCO0lBRUFLLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQ0osSUFBSTtJQUNsQjtJQUVBSyxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUNKLElBQUk7SUFDbEI7SUFFQUssY0FB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
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L21ldGF2YXJpYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVNZXRhdmFyaWFibGUgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgbWV0YVR5cGVGcm9tSlNPTiwgbWV0YVR5cGVUb01ldGFUeXBlSlNPTiB9IGZyb20gXCIuLi91dGlsaXRpZXMvanNvblwiO1xuaW1wb3J0IHsgdW5pZnlNZXRhdmFyaWFibGUsIHVuaWZ5TWV0YXZhcmlhYmxlSW50cmluc2ljYWxseSB9IGZyb20gXCIuLi9wcm9jZXNzL3VuaWZ5XCI7XG5pbXBvcnQgeyBuYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUsIHRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZSwgdHlwZUZyb21NZXRhdmFyaWFibGVOb2RlLCBtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuXG5jb25zdCB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBNZXRhdmFyaWFibGUgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCBuYW1lLCB0ZXJtLCB0eXBlLCBtZXRhVHlwZSkge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG4gICAgXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuICB9XG5cbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0VGVybSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXJtO1xuICB9XG5cbiAgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlO1xuICB9XG5cbiAgZ2V0TWV0YVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YVR5cGU7XG4gIH1cblxuICBzZXRNZXRhVHlwZShtZXRhVHlwZSkge1xuICAgIHRoaXMubWV0YVR5cGUgPSBtZXRhVHlwZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBub2RlOyAgLy8vXG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlTm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZU5hbWUoKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZU5hbWUgPSBtZXRhdmFyaWFibGVOb2RlLmdldE1ldGF2YXJpYWJsZU5hbWUoKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOYW1lO1xuICB9XG5cbiAgaXNEZWNsYXJlZCgpIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9ICh0aGlzLm1ldGFUeXBlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBkZWNsYXJlZDtcbiAgfVxuXG4gIGlzRXF1YWxUbyhtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBpc01ldGFUeXBlRXF1YWxUbyhtZXRhVHlwZSkgeyByZXR1cm4gdGhpcy5tZXRhVHlwZS5pc0VxdWFsVG8obWV0YVR5cGUpOyB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHtcbiAgICBjb25zdCBub2RlID0gbWV0YXZhcmlhYmxlTm9kZSwgLy8vXG4gICAgICAgICAgbm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTm9kZShub2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG5vZGVNYXRjaGVzOyAvLy9cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcztcbiAgfVxuXG4gIGZpbmRNZXRhdmFyaWFibGUoY29udGV4dCkge1xuICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5vZGUoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG5cbiAgY29tcGFyZU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOYW1lID0gbWV0YXZhcmlhYmxlLmdldE5hbWUoKSxcbiAgICAgICAgICBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuY29tcGFyZU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSksXG4gICAgICAgICAgY29tcGFyZXNUb01ldGF2YXJpYWJsZSA9IGNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb01ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGNvbXBhcmVNZXRhdmFyaWFibGVOYW1lKG1ldGF2YXJpYWJsZU5hbWUpIHtcbiAgICBjb25zdCBuYW1lTWV0YXZhcmlhYmxlTmFtZSA9ICh0aGlzLm5hbWUgPT09IG1ldGF2YXJpYWJsZU5hbWUpLFxuICAgICAgICAgIGNvbXBhcmVzVG9NZXRhdmFyaWFibGVOYW1lID0gbmFtZU1ldGF2YXJpYWJsZU5hbWU7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvTWV0YXZhcmlhYmxlTmFtZTtcbiAgfVxuXG4gIHZlcmlmeShjb250ZXh0KSB7XG4gICAgbGV0IHZlcmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgdGVybVZlcmlmaWVzID0gdGhpcy52ZXJpZnlUZXJtKGNvbnRleHQpO1xuXG4gICAgaWYgKHRlcm1WZXJpZmllcykge1xuICAgICAgY29uc3QgdHlwZVZlcmlmaWVzID0gdGhpcy52ZXJpZnlUeXBlKGNvbnRleHQpO1xuXG4gICAgICBpZiAodHlwZVZlcmlmaWVzKSB7XG4gICAgICAgIHZlcmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVyaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcmlmaWVzO1xuICB9XG5cbiAgdmVyaWZ5VGVybShjb250ZXh0KSB7XG4gICAgbGV0IHRlcm1WZXJpZmllcyA9IHRydWU7ICAvLy9cblxuICAgIGlmICh0aGlzLnRlcm0gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0aGlzLnRlcm0uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgICB0ZXJtVmVyaWZpZXMgPSBmYWxzZTtcblxuICAgICAgY29udGV4dC50cmFjZShgQSAnJHt0ZXJtU3RyaW5nfScgdGVybSBpcyBwcmVzZW50IGluIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcm1WZXJpZmllcztcbiAgfVxuXG4gIHZlcmlmeVR5cGUoY29udGV4dCkge1xuICAgIGxldCB0eXBlVmVyaWZpZXMgPSB0cnVlOyAgLy8vXG5cbiAgICBpZiAodGhpcy50eXBlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgdHlwZS4uLmApO1xuXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRoaXMudHlwZS5nZXROYW1lKCksXG4gICAgICAgICAgICB0eXBlID0gY29udGV4dC5maW5kVHlwZUJ5VHlwZU5hbWUodHlwZU5hbWUpO1xuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgICAgIHR5cGVWZXJpZmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlVmVyaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWRzIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0eXBlLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlVmVyaWZpZXM7XG4gIH1cblxuICB2YWxpZGF0ZShzdHJpY3QsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGlmIChjb250aW51YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWF0aW9uID0gY29udGV4dDsgLy8vXG5cbiAgICAgIGNvbnRleHQgPSBzdHJpY3Q7IC8vL1xuXG4gICAgICBzdHJpY3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdGVzO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGxldCBtZXRhdmFyaWFibGU7XG5cbiAgICBtZXRhdmFyaWFibGUgPSB0aGlzLmZpbmRNZXRhdmFyaWFibGUoY29udGV4dCk7XG5cbiAgICBpZiAobWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgdmFsaWRhdGVzID0gY29udGludWF0aW9uKG1ldGF2YXJpYWJsZSwgY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGF2YXJpYWJsZSA9IHRoaXM7ICAvLy9cblxuICAgICAgY29uc3QgdmFsaWRhdGVOYW1lID0gdGhpcy52YWxpZGF0ZU5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbGlkYXRlVHlwZSA9IHRoaXMudmFsaWRhdGVUeXBlLmJpbmQodGhpcyksXG4gICAgICAgICAgICB2YWxpZGF0ZVRlcm0gPSB0aGlzLnZhbGlkYXRlVGVybS5iaW5kKHRoaXMpO1xuXG4gICAgICB2YWxpZGF0ZXMgPSBhbGwoW1xuICAgICAgICB2YWxpZGF0ZU5hbWUsXG4gICAgICAgIHZhbGlkYXRlVHlwZSxcbiAgICAgICAgdmFsaWRhdGVUZXJtXG4gICAgICBdLCBzdHJpY3QsIGNvbnRleHQsIChzdHJpY3QsIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgICAgaWYgKGRlY2xhcmVkTWV0YXZhcmlhYmxlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29udGV4dC5hZGRNZXRhdmFyaWFibGUobWV0YXZhcmlhYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24obWV0YXZhcmlhYmxlLCBjb250ZXh0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZU5hbWUoc3RyaWN0LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgbmFtZVZhbGlkYXRlcyA9IHRydWU7IC8vL1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlJ3MgbmFtZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTmFtZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTmFtZSgpLCAgLy8vXG4gICAgICAgICAgZGVjbGFyZWRNZXRhdmFyaWFibGUgPSBjb250ZXh0LmZpbmREZWNsYXJlZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTmFtZShtZXRhdmFyaWFibGVOYW1lKTtcblxuICAgIGlmIChkZWNsYXJlZE1ldGF2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YVR5cGUgPSBkZWNsYXJlZE1ldGF2YXJpYWJsZS5nZXRNZXRhVHlwZSgpLFxuICAgICAgICAgICAgbWV0YVR5cGVTdHJpbmcgPSBtZXRhVHlwZS5nZXRTdHJpbmcoKTtcblxuICAgICAgdGhpcy5tZXRhVHlwZSA9IG1ldGFUeXBlO1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBTZXR0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyBtZXRhLXR5cGUgdG8gdGhlICcke21ldGFUeXBlU3RyaW5nfScgbWV0YS10eXBlLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIG5hbWVWYWxpZGF0ZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZVZhbGlkYXRlcykge1xuICAgICAgbmFtZVZhbGlkYXRlcyA9IGNvbnRpbnVhdGlvbihzdHJpY3QsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChuYW1lVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIG5hbWUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVR5cGUoc3RyaWN0LCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdHlwZVZhbGlkYXRlcztcblxuICAgIGlmICh0aGlzLnR5cGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuLi5gKTtcblxuICAgICAgdHlwZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB0eXBlTmFtZSA9IHRoaXMudHlwZS5nZXROYW1lKCksXG4gICAgICAgICAgICB0eXBlUHJlc2VuZXQgPSBjb250ZXh0LmlzVHlwZVByZXNlbnRCeVR5cGVOYW1lKHR5cGVOYW1lKTtcblxuICAgICAgaWYgKHR5cGVQcmVzZW5ldCkge1xuICAgICAgICB0eXBlVmFsaWRhdGVzID0gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGVzKSB7XG4gICAgICAgIGNvbnRleHQudHJhY2UoYC4uLnZhbGlkYXRlZCAgdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSdzIHR5cGUuYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVWYWxpZGF0ZXMgPSBjb250aW51YXRpb24oc3RyaWN0LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlVGVybShzdHJpY3QsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCB0ZXJtVmFsaWRhdGVzO1xuXG4gICAgaWYgKHRoaXMudGVybSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLi4uYCk7XG5cbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5hbWUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5hbWUoKSxcbiAgICAgICAgICAgIGRlY2xhcmVkTWV0YXZhcmlhYmxlID0gY29udGV4dC5maW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUobWV0YXZhcmlhYmxlTmFtZSk7XG5cbiAgICAgIGlmIChkZWNsYXJlZE1ldGF2YXJpYWJsZSA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgdGVybVZhbGlkYXRlcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlcm1WYWxpZGF0ZXMgPSB0aGlzLnRlcm0udmFsaWRhdGUoY29udGV4dCwgKHRlcm0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGVybSA9IHRlcm07XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc3RyaWN0LCBjb250ZXh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGRlY2xhcmVkTWV0YXZhcmlhYmxlLmdldFR5cGUoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRlcm1WYWxpZGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXJtVmFsaWRhdGVzID0gdGhpcy50ZXJtLnZhbGlkYXRlR2l2ZW5UeXBlKHR5cGUsIGNvbnRleHQsICh0ZXJtLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlcm1WYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUncyB0ZXJtLmApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXJtVmFsaWRhdGVzID0gY29udGludWF0aW9uKHN0cmljdCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlcm1WYWxpZGF0ZXM7XG4gIH1cblxuICB1bmlmeUZyYW1lKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfX0nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgZnJhbWVNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRoaXMuY29tcGFyZUZyYW1lTWV0YXZhcmlhYmxlKGZyYW1lLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgIGlmIChmcmFtZU1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICBjb25zdCBmcmFtZVVuaWZpZXMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGZyYW1lVW5pZmllcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcywgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGUuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgIGxldCBmcmFtZVVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9UZXJtID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5jb21wYXJlVGVybShmcmFtZSwgY29udGV4dCk7XG5cbiAgICAgIGlmIChkZXJpdmVkU3Vic3RpdHV0aW9uQ29tcGFyZXNUb1Rlcm0pIHtcbiAgICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZyA9IGRlcml2ZWRTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgVGhlICcke2Rlcml2ZWRTdWJzdGl0dXRpb25TdHJpbmd9JyBkZXJpdmVkIHN1YnN0aXR1dGlvbiBpcyBhbHJlYWR5IHByZXNlbnQuYCk7XG5cbiAgICAgICAgZnJhbWVVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihmcmFtZVVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgRnJhbWVTdWJzdGl0dXRpb24gfSA9IGVsZW1lbnRzLFxuICAgICAgICAgIGZyYW1lU3Vic3RpdHV0aW9uID0gRnJhbWVTdWJzdGl0dXRpb24uZnJvbUZyYW1lQW5kTWV0YXZhcmlhYmxlKGZyYW1lLCBtZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgZnJhbWVTdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCwgKGZyYW1lU3Vic3RpdHV0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICBsZXQgdmFsaWRhdGVzO1xuXG4gICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uID0gZnJhbWVTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGREZXJpdmVkU3Vic3RpdHV0aW9uKGRlcml2ZWRTdWJzdGl0dXRpb24pO1xuXG4gICAgICB2YWxpZGF0ZXMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdmFsaWRhdGVzO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZnJhbWVVbmlmaWVzID0gdHJ1ZTtcblxuICAgIGlmIChmcmFtZVVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihmcmFtZVVuaWZpZXMpO1xuICB9XG5cbiAgdW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3RyaW5nID0gc3RhdGVtZW50LmdldFN0cmluZygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZVN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ319JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdGhpcy5jb21wYXJlU3RhdGVtZW50TWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50TWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN0YXRlbWVudFVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMsICAvLy9cbiAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlID0gbWV0YXZhcmlhYmxlLmdldE5vZGUoKSxcbiAgICAgICAgICBzdWJsaW5nU3Vic3RpdHV0aW9uTm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUuZ2V0U2libGluZ1N1YnN0aXR1dGlvbk5vZGUoKSxcbiAgICAgICAgICBzdWJzdGl0dXRpb25Ob2RlID0gc3VibGluZ1N1YnN0aXR1dGlvbk5vZGUsIC8vL1xuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb24gPSAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZERlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGVBbmRTdWJzdGl0dXRpb25Ob2RlKG1ldGF2YXJpYWJsZU5vZGUsIHN1YnN0aXR1dGlvbk5vZGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZERlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICBpZiAoZGVyaXZlZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IHN0YXRlbWVudFVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbkNvbXBhcmVzVG9TdGF0ZW1lbnQgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmNvbXBhcmVTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTtcblxuICAgICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25TdHJpbmcgPSBkZXJpdmVkU3Vic3RpdHV0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFRoZSAnJHtkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nfScgZGVyaXZlZCBzdWJzdGl0dXRpb24gaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICAgIHN0YXRlbWVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN0YXRlbWVudFVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gPSBlbGVtZW50cztcblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBpZiAoc3Vic3RpdHV0aW9uTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdlbmVyYWxDb250ZXh0LCAvLy9cbiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZFN1YnN0aXR1dGlvbkJ5U3Vic3RpdHV0aW9uTm9kZShzdWJzdGl0dXRpb25Ob2RlKTtcblxuICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gU3RhdGVtZW50U3Vic3RpdHV0aW9uLmZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbiA9IFN0YXRlbWVudFN1YnN0aXR1dGlvbi5mcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICB9XG5cbiAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24udmFsaWRhdGUoY29udGV4dCwgKHN0YXRlbWVudFN1YnN0aXR1dGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgbGV0IHZhbGlkYXRlcztcblxuICAgICAgY29uc3QgZGVyaXZlZFN1YnN0aXR1dGlvbiA9IHN0YXRlbWVudFN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgICBjb250ZXh0LmFkZERlcml2ZWRTdWJzdGl0dXRpb24oZGVyaXZlZFN1YnN0aXR1dGlvbik7XG5cbiAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRVbmlmaWVzID0gdHJ1ZTtcblxuICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24oc3RhdGVtZW50VW5pZmllcyk7XG4gIH1cblxuICB1bmlmeVJlZmVyZW5jZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2Ugd2l0aCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfX0nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMgPSB0aGlzLmNvbXBhcmVSZWZlcmVuY2VNZXRhdmFyaWFibGUocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgIGlmIChyZWZlcmVuY2VNZXRhdmFyaWFibGVDb21wYXJlcykge1xuICAgICAgY29uc3QgcmVmZXJlbmNlVW5pZmllcyA9IHRydWU7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24ocmVmZXJlbmNlVW5pZmllcyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcywgIC8vL1xuICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBtZXRhdmFyaWFibGUuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGRlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgIGxldCByZWZlcmVuY2VVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvVGVybSA9IGRlcml2ZWRTdWJzdGl0dXRpb24uY29tcGFyZVRlcm0ocmVmZXJlbmNlLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvVGVybSkge1xuICAgICAgICBjb25zdCBkZXJpdmVkU3Vic3RpdHV0aW9uU3RyaW5nID0gZGVyaXZlZFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBUaGUgJyR7ZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZ30nIGRlcml2ZWQgc3Vic3RpdHV0aW9uIGlzIGFscmVhZHkgcHJlc2VudC5gKTtcblxuICAgICAgICByZWZlcmVuY2VVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VVbmlmaWVzKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IFJlZmVyZW5jZVN1YnN0aXR1dGlvbiB9ID0gZWxlbWVudHMsXG4gICAgICAgICAgcmVmZXJlbmNlU3Vic3RpdHV0aW9uID0gUmVmZXJlbmNlU3Vic3RpdHV0aW9uLmZyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUocmVmZXJlbmNlLCBtZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgcmVmZXJlbmNlU3Vic3RpdHV0aW9uLnZhbGlkYXRlKGNvbnRleHQsIChyZWZlcmVuY2VTdWJzdGl0dXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgIGxldCB2YWxpZGF0ZXM7XG5cbiAgICAgIGNvbnN0IGRlcml2ZWRTdWJzdGl0dXRpb24gPSByZWZlcmVuY2VTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5hZGREZXJpdmVkU3Vic3RpdHV0aW9uKGRlcml2ZWRTdWJzdGl0dXRpb24pO1xuXG4gICAgICB2YWxpZGF0ZXMgPSB0cnVlO1xuXG4gICAgICByZXR1cm4gdmFsaWRhdGVzO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVmZXJlbmNlVW5pZmllcyA9IHRydWU7XG5cbiAgICBpZiAocmVmZXJlbmNlVW5pZmllcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlIHdpdGggdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIHZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24ocmVmZXJlbmNlVW5pZmllcyk7XG4gIH1cblxuICB1bmlmeU1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCBtZXRhdmFyaWFibGVVbmlmaWVzO1xuXG4gICAgZGVidWdnZXJcblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0ID0gY29udGV4dCwgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmcgPSBnZW5lcmFsTWV0YXZhcmlhYmxlLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgbWV0YXZhcmlhYmxlVW5pZmllcyA9IHVuaWZ5TWV0YXZhcmlhYmxlKGdlbmVyYWxNZXRhdmFyaWFibGUsIHNwZWNpZmljTWV0YXZhcmlhYmxlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgIGlmIChtZXRhdmFyaWFibGVVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzcGVjaWZpY01ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSB3aXRoIHRoZSAnJHtnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLmApO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVVbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlNZXRhdmFyaWFibGVJbnRyaW5zaWNhbGx5KG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxNZXRhdmFyaWFibGUgPSB0aGlzLCAvLy9cbiAgICAgICAgICBzcGVjaWZpY01ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZSxcbiAgICAgICAgICBnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nID0gZ2VuZXJhbE1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIHNwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nID0gc3BlY2lmaWNNZXRhdmFyaWFibGUuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgd2l0aCB0aGUgJyR7Z2VuZXJhbE1ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZSBpbnRyaW5zaWNhbGx5Li4uYCk7XG5cbiAgICB1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkoZ2VuZXJhbE1ldGF2YXJpYWJsZSwgc3BlY2lmaWNNZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSkgPT4ge1xuICAgICAgaWYgKG1ldGF2YXJpYWJsZVVuaWZpZXNJbnRyaW5zaWNhbGx5KSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljTWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHdpdGggdGhlICcke2dlbmVyYWxNZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgaW50cmluc2ljYWxseS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSk7XG4gICAgfSk7XG4gIH1cblxuICBjb21wYXJlRnJhbWVNZXRhdmFyaWFibGUoZnJhbWUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgZnJhbWVTdHJpbmcgPSBmcmFtZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9IGdlbmVyYWxDb250ZXh0LmdldEZpbGVQYXRoKCksXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0RmlsZVBhdGggPSBzcGVjaWZpY0NvbnRleHQuZ2V0RmlsZVBhdGgoKTtcblxuICAgIGlmIChnZW5lcmFsQ29udGV4dEZpbGVQYXRoID09PSBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLCAgLy8vXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IGZyYW1lLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIGZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4uY29tcGFyZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWVNZXRhdmFyaWFibENvbXBhcmVzO1xuICB9XG5cbiAgY29tcGFyZVJlZmVyZW5jZU1ldGF2YXJpYWJsZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYENvbXBhcmluZyB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgcmVmZXJlbmNlJ3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuLi5gKTtcblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPSBnZW5lcmFsQ29udGV4dC5nZXRGaWxlUGF0aCgpLFxuICAgICAgICAgIHNwZWNpZmljQ29udGV4dEZpbGVQYXRoID0gc3BlY2lmaWNDb250ZXh0LmdldEZpbGVQYXRoKCk7XG5cbiAgICBpZiAoZ2VuZXJhbENvbnRleHRGaWxlUGF0aCA9PT0gc3BlY2lmaWNDb250ZXh0RmlsZVBhdGgpIHtcbiAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZU5vZGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZU5vZGUoKSxcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzID0gcmVmZXJlbmNlLm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICAgICAgaWYgKG1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzKSB7XG4gICAgICAgIHJlZmVyZW5jZU1ldGF2YXJpYWJsZUNvbXBhcmVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLmNvbXBhcmVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyByZWZlcmVuY2UncyBtZXRhdmFyaWFibGUgdG8gdGhlICcke21ldGF2YXJpYWJsZVN0cmluZ30nIG1ldGF2YXJpYWJsZS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXM7XG4gIH1cblxuICBjb21wYXJlU3RhdGVtZW50TWV0YXZhcmlhYmxlKHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGxldCBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBDb21wYXJpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCdzIG1ldGF2YXJpYWJsZSB0byB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dEZpbGVQYXRoID0gZ2VuZXJhbENvbnRleHQuZ2V0RmlsZVBhdGgoKSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHRGaWxlUGF0aCA9IHNwZWNpZmljQ29udGV4dC5nZXRGaWxlUGF0aCgpO1xuXG4gICAgaWYgKGdlbmVyYWxDb250ZXh0RmlsZVBhdGggPT09IHNwZWNpZmljQ29udGV4dEZpbGVQYXRoKSB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IHN0YXRlbWVudC5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICBzdGF0ZW1lbnRNZXRhdmFyaWFibGVDb21wYXJlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi5jb21wYXJlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50J3MgbWV0YXZhcmlhYmxlIHRvIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IG1ldGFUeXBlSlNPTiA9IG1ldGFUeXBlVG9NZXRhVHlwZUpTT04odGhpcy5tZXRhVHlwZSksXG4gICAgICAgICAgbWV0YVR5cGUgPSBtZXRhVHlwZUpTT04sICAvLy9cbiAgICAgICAgICBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludCxcbiAgICAgIG1ldGFUeXBlXG4gICAgfTtcblxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIk1ldGF2YXJpYWJsZVwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZU5vZGUgPSBpbnN0YW50aWF0ZU1ldGF2YXJpYWJsZShzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgbm9kZSA9IG1ldGF2YXJpYWJsZU5vZGUsICAvLy9cbiAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICBuYW1lID0gbmFtZUZyb21NZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgdGVybSA9IHRlcm1Gcm9tTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlRnJvbU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBtZXRhVHlwZSA9IG1ldGFUeXBlRnJvbUpTT04oanNvbiwgY29udGV4dCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGUgPSBuZXcgTWV0YXZhcmlhYmxlKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgbmFtZSwgdGVybSwgdHlwZSwgbWV0YVR5cGUpO1xuXG4gICAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHN0YXRlbWVudC5nZXROb2RlKCksXG4gICAgICAgICAgbWV0YXZhcmlhYmxlID0gbWV0YXZhcmlhYmxlRnJvbVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbWV0YXZhcmlhYmxlO1xuICB9XG59KTtcbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJNZXRhdmFyaWFibGUiLCJFbGVtZW50IiwiY29udGV4dCIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwibmFtZSIsInRlcm0iLCJ0eXBlIiwibWV0YVR5cGUiLCJnZXROYW1lIiwiZ2V0VGVybSIsImdldFR5cGUiLCJnZXRNZXRhVHlwZSIsInNldE1ldGFUeXBlIiwiZ2V0TWV0YXZhcmlhYmxlTm9kZSIsImdldE5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwiZ2V0TWV0YXZhcmlhYmxlTmFtZSIsIm1ldGF2YXJpYWJsZU5hbWUiLCJpc0RlY2xhcmVkIiwiZGVjbGFyZWQiLCJpc0VxdWFsVG8iLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsImVxdWFsVG8iLCJpc01ldGFUeXBlRXF1YWxUbyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwiZmluZE1ldGF2YXJpYWJsZSIsImZpbmRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5vZGUiLCJjb21wYXJlTWV0YXZhcmlhYmxlIiwiY29tcGFyZXNUb01ldGF2YXJpYWJsZU5hbWUiLCJjb21wYXJlTWV0YXZhcmlhYmxlTmFtZSIsImNvbXBhcmVzVG9NZXRhdmFyaWFibGUiLCJuYW1lTWV0YXZhcmlhYmxlTmFtZSIsInZlcmlmeSIsInZlcmlmaWVzIiwibWV0YXZhcmlhYmxlU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ0ZXJtVmVyaWZpZXMiLCJ2ZXJpZnlUZXJtIiwidHlwZVZlcmlmaWVzIiwidmVyaWZ5VHlwZSIsImRlYnVnIiwidGVybVN0cmluZyIsInR5cGVOYW1lIiwiZmluZFR5cGVCeVR5cGVOYW1lIiwidmFsaWRhdGUiLCJzdHJpY3QiLCJjb250aW51YXRpb24iLCJ1bmRlZmluZWQiLCJ2YWxpZGF0ZXMiLCJ2YWxpZGF0ZU5hbWUiLCJiaW5kIiwidmFsaWRhdGVUeXBlIiwidmFsaWRhdGVUZXJtIiwiYWxsIiwiZGVjbGFyZWRNZXRhdmFyaWFibGUiLCJmaW5kRGVjbGFyZWRNZXRhdmFyaWFibGVCeU1ldGF2YXJpYWJsZU5hbWUiLCJhZGRNZXRhdmFyaWFibGUiLCJuYW1lVmFsaWRhdGVzIiwibWV0YVR5cGVTdHJpbmciLCJ0eXBlVmFsaWRhdGVzIiwidHlwZVByZXNlbmV0IiwiaXNUeXBlUHJlc2VudEJ5VHlwZU5hbWUiLCJ0ZXJtVmFsaWRhdGVzIiwidmFsaWRhdGVHaXZlblR5cGUiLCJ1bmlmeUZyYW1lIiwiZnJhbWUiLCJnZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsImZyYW1lU3RyaW5nIiwiZnJhbWVNZXRhdmFyaWFibGVDb21wYXJlcyIsImNvbXBhcmVGcmFtZU1ldGF2YXJpYWJsZSIsImZyYW1lVW5pZmllcyIsImRlcml2ZWRTdWJzdGl0dXRpb24iLCJmaW5kRGVyaXZlZFN1YnN0aXR1dGlvbkJ5TWV0YXZhcmlhYmxlTm9kZSIsImRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvVGVybSIsImNvbXBhcmVUZXJtIiwiZGVyaXZlZFN1YnN0aXR1dGlvblN0cmluZyIsIkZyYW1lU3Vic3RpdHV0aW9uIiwiZWxlbWVudHMiLCJmcmFtZVN1YnN0aXR1dGlvbiIsImZyb21GcmFtZUFuZE1ldGF2YXJpYWJsZSIsImFkZERlcml2ZWRTdWJzdGl0dXRpb24iLCJ1bmlmeVN0YXRlbWVudCIsInN0YXRlbWVudCIsInN0YXRlbWVudFN0cmluZyIsInN0YXRlbWVudE1ldGF2YXJpYWJsZUNvbXBhcmVzIiwiY29tcGFyZVN0YXRlbWVudE1ldGF2YXJpYWJsZSIsInN0YXRlbWVudFVuaWZpZXMiLCJzdWJsaW5nU3Vic3RpdHV0aW9uTm9kZSIsImdldFNpYmxpbmdTdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uTm9kZSIsImZpbmREZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlQW5kU3Vic3RpdHV0aW9uTm9kZSIsImRlcml2ZWRTdWJzdGl0dXRpb25Db21wYXJlc1RvU3RhdGVtZW50IiwiY29tcGFyZVN0YXRlbWVudCIsIlN0YXRlbWVudFN1YnN0aXR1dGlvbiIsInN0YXRlbWVudFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImZpbmRTdWJzdGl0dXRpb25CeVN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwiZnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZSIsInVuaWZ5UmVmZXJlbmNlIiwicmVmZXJlbmNlIiwicmVmZXJlbmNlU3RyaW5nIiwicmVmZXJlbmNlTWV0YXZhcmlhYmxlQ29tcGFyZXMiLCJjb21wYXJlUmVmZXJlbmNlTWV0YXZhcmlhYmxlIiwicmVmZXJlbmNlVW5pZmllcyIsIlJlZmVyZW5jZVN1YnN0aXR1dGlvbiIsInJlZmVyZW5jZVN1YnN0aXR1dGlvbiIsImZyb21SZWZlcmVuY2VBbmRNZXRhdmFyaWFibGUiLCJ1bmlmeU1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZVVuaWZpZXMiLCJnZW5lcmFsTWV0YXZhcmlhYmxlIiwic3BlY2lmaWNNZXRhdmFyaWFibGUiLCJnZW5lcmFsTWV0YXZhcmlhYmxlU3RyaW5nIiwic3BlY2lmaWNNZXRhdmFyaWFibGVTdHJpbmciLCJ1bmlmeU1ldGF2YXJpYWJsZUludHJpbnNpY2FsbHkiLCJtZXRhdmFyaWFibGVVbmlmaWVzSW50cmluc2ljYWxseSIsImZyYW1lTWV0YXZhcmlhYmxDb21wYXJlcyIsImdlbmVyYWxDb250ZXh0RmlsZVBhdGgiLCJnZXRGaWxlUGF0aCIsInNwZWNpZmljQ29udGV4dEZpbGVQYXRoIiwidG9KU09OIiwibWV0YVR5cGVKU09OIiwibWV0YVR5cGVUb01ldGFUeXBlSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwiaW5zdGFudGlhdGVNZXRhdmFyaWFibGUiLCJuYW1lRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJ0ZXJtRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJ0eXBlRnJvbU1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhVHlwZUZyb21KU09OIiwiZnJvbVN0YXRlbWVudCIsInN0YXRlbWVudE5vZGUiLCJtZXRhdmFyaWFibGVGcm9tU3RhdGVtZW50Tm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBZ0JBOzs7ZUFBQTs7O2dDQWQ2QztrRUFFeEI7OEJBRUQ7eUJBRVE7NkJBQ1k7c0JBQ2lCO3VCQUNTO3lCQUMwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVILE1BQU0sRUFBRUEsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLHFCQUFxQkMsdUJBQU87SUFDdEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxJQUFJLEVBQUVDLElBQUksRUFBRUMsSUFBSSxFQUFFQyxRQUFRLENBQUU7UUFDekUsS0FBSyxDQUFDUCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLElBQUksR0FBR0E7UUFDWixJQUFJLENBQUNDLFFBQVEsR0FBR0E7SUFDbEI7SUFFQUMsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDSixJQUFJO0lBQ2xCO0lBRUFLLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQ0osSUFBSTtJQUNsQjtJQUVBSyxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUNKLElBQUk7SUFDbEI7SUFFQUssY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDSixRQUFRO0lBQ3RCO0lBRUFLLFlBQVlMLFFBQVEs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
|