@citolab/qti-components 6.9.1-beta.77 → 6.9.1-beta.79
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/dist/custom-element-eslint-rules.js +67 -67
- package/dist/custom-elements.json +13728 -13669
- package/dist/index.global.js +1 -1
- package/dist/index.js +10 -1
- package/dist/index.min.js +4 -4
- package/dist/qti-components/index.cjs +10 -1
- package/dist/qti-components/index.d.cts +2 -2
- package/dist/qti-components/index.d.ts +2 -2
- package/dist/qti-components/index.js +10 -1
- package/dist/qti-components-jsx.d.ts +681 -703
- package/dist/qti-item/index.d.cts +1 -1
- package/dist/qti-item/index.d.ts +1 -1
- package/dist/qti-loader/index.d.cts +1 -1
- package/dist/qti-loader/index.d.ts +1 -1
- package/dist/{qti-simple-choice-C7xBKYaS.d.cts → qti-simple-choice-DC5DJota.d.cts} +5 -3
- package/dist/{qti-simple-choice-C7xBKYaS.d.ts → qti-simple-choice-DC5DJota.d.ts} +5 -3
- package/dist/vscode.html-custom-data.json +406 -406
- package/package.json +44 -16
|
@@ -1838,6 +1838,7 @@ var ChoicesMixin = (superClass, selector) => {
|
|
|
1838
1838
|
});
|
|
1839
1839
|
}
|
|
1840
1840
|
_setInputType(choiceElement) {
|
|
1841
|
+
this._internals.ariaLabel = this.maxChoices === 1 ? "radio-group" : "checkbox-group";
|
|
1841
1842
|
choiceElement.internals.role = this.maxChoices === 1 ? "radio" : "checkbox";
|
|
1842
1843
|
choiceElement.internals.states.add(choiceElement.internals.role);
|
|
1843
1844
|
}
|
|
@@ -2277,6 +2278,10 @@ var QtiChoiceInteraction = class extends VocabularyMixin(
|
|
|
2277
2278
|
ShuffleMixin(ChoicesMixin(Interaction, "qti-simple-choice"), "qti-simple-choice"),
|
|
2278
2279
|
"qti-simple-choice"
|
|
2279
2280
|
) {
|
|
2281
|
+
constructor() {
|
|
2282
|
+
super();
|
|
2283
|
+
this._internals.role = "group";
|
|
2284
|
+
}
|
|
2280
2285
|
render() {
|
|
2281
2286
|
return import_lit25.html`
|
|
2282
2287
|
<slot name="prompt"></slot><slot part="slot"></slot>
|
|
@@ -5172,6 +5177,10 @@ QtiGraphicGapMatchInteraction = __decorateClass([
|
|
|
5172
5177
|
var import_lit44 = require("lit");
|
|
5173
5178
|
var import_decorators47 = require("lit/decorators.js");
|
|
5174
5179
|
var QtiGraphicOrderInteraction = class extends ChoicesMixin(Interaction, "qti-hotspot-choice") {
|
|
5180
|
+
constructor() {
|
|
5181
|
+
super(...arguments);
|
|
5182
|
+
this._choiceElements = [];
|
|
5183
|
+
}
|
|
5175
5184
|
render() {
|
|
5176
5185
|
return import_lit44.html`
|
|
5177
5186
|
<slot name="prompt"></slot>
|
|
@@ -6497,4 +6506,4 @@ console.log(
|
|
|
6497
6506
|
itemContextVariables,
|
|
6498
6507
|
qtiAndMixin
|
|
6499
6508
|
});
|
|
6500
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS50cyIsICIuLi8uLi9zcmMvbGliL2RlY29yYXRvcnMvd2F0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC92b2NhYnVsYXJ5L3ZvY2FidWxhcnktbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcnVsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1yZXNwb25zZS1jb25kaXRpb24vcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS9xdGktc2V0LW91dGNvbWUtdmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtZWxzZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1hbmQvcXRpLWFuZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1hbmQvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYmFzZXZhbHVlL3F0aS1iYXNldmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29udGFpbnMvcXRpLWNvbnRhaW5zLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvcnJlY3QvcXRpLWNvcnJlY3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwtcm91bmRlZC9xdGktZXF1YWwtcm91bmRlZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC9xdGktZXF1YWwudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3QvcXRpLWd0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0ZS9xdGktZ3RlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWlzLW51bGwvcXRpLWlzLW51bGwudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHQvcXRpLWx0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0ZS9xdGktbHRlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcC1yZXNwb25zZS9xdGktbWFwLXJlc3BvbnNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcHBpbmcvcXRpLW1hcHBpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWF0Y2gvcXRpLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1lbWJlci9xdGktbWVtYmVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW11bHRpcGxlL3F0aS1tdWx0aXBsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ub3QvcXRpLW5vdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vci9xdGktb3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3JkZXJlZC9xdGktb3JkZXJlZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcmludGVkLXZhcmlhYmxlL3F0aS1wcmludGVkLXZhcmlhYmxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByb2R1Y3QvcXRpLXByb2R1Y3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktc3RyaW5nLW1hdGNoL3F0aS1zdHJpbmctbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktc3VtL3F0aS1zdW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktdmFyaWFibGUvcXRpLXZhcmlhYmxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1hcGkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2Ryb3BwYWJsZXMtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2ZsaXBwYWJsZXMtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL2RlY29yYXRvcnMvbGl2ZS1xdWVyeS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiIsICJpbXBvcnQgeyBwcm92aWRlIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzLCBPdXRjb21lQ2hhbmdlZERldGFpbHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgdHlwZSB7IFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlVmFsdWUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlLCBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB0eXBlIHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0VmFyaWFibGVzIH0gZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IFF0aVJlZ2lzdGVyVmFyaWFibGUgZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnRzL3F0aS1yZWdpc3Rlci12YXJpYWJsZSc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICBwcml2YXRlIF9jb250ZXh0OiBJdGVtQ29udGV4dCA9IHtcbiAgICBpZGVudGlmaWVyOiB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgIHZhcmlhYmxlczogaXRlbUNvbnRleHRWYXJpYWJsZXNcbiAgfTtcblxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh7XG4gICAgICBpZGVudGlmaWVyOiB2LmlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgIHR5cGU6IHYudHlwZSxcbiAgICAgIC8vIGFkZCBleHRlcm5hbHNjb3JlZCwgYSBmaXhlZCBwcm9wIHRvIHRoZSB0ZXN0LCBzbyB0aGUgdGVzdGNvbnRleHQgY2FuIHJlYWQgYW5kIGRlY2lkZSBob3cgdG8gc2NvcmUgdGhpcyBpdGVtXG4gICAgICAuLi4odi50eXBlID09PSAnb3V0Y29tZScgJiYgdi5pZGVudGlmaWVyID09PSAnU0NPUkUnXG4gICAgICAgID8geyBleHRlcm5hbFNjb3JlZDogKHYgYXMgT3V0Y29tZVZhcmlhYmxlKS5leHRlcm5hbFNjb3JlZCB9XG4gICAgICAgIDoge30pXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YXJpYWJsZXModmFsdWU6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5zb21lKHYgPT4gISgnaWRlbnRpZmllcicgaW4gdikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhcmlhYmxlcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgVmFyaWFibGVEZWNsYXJhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQudmFsdWUgPSB2YXJpYWJsZS52YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnZhbHVlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgKGU6IFF0aVJlZ2lzdGVyVmFyaWFibGUpID0+IHtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSB7IC4uLnRoaXMuX2NvbnRleHQsIHZhcmlhYmxlczogWy4uLnRoaXMuX2NvbnRleHQudmFyaWFibGVzLCBlLmRldGFpbC52YXJpYWJsZV0gfTtcbiAgICAgIHRoaXMuX2luaXRpYWxDb250ZXh0ID0gdGhpcy5fY29udGV4dDtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCAoZTogQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgZmVlZGJhY2tFbGVtZW50ID0gZS5kZXRhaWw7XG4gICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLnB1c2goZmVlZGJhY2tFbGVtZW50KTtcbiAgICAgIGZlZWRiYWNrRWxlbWVudC5jaGVja1Nob3dGZWVkYmFjayhmZWVkYmFja0VsZW1lbnQub3V0Y29tZUlkZW50aWZpZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywgKGU6IEN1c3RvbUV2ZW50PG51bGw+KSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5wdXNoKGUudGFyZ2V0IGFzIEludGVyYWN0aW9uKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZC1hdHRlbXB0JywgKGU6IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IGNvdW50QXR0ZW1wdDogYm9vbGVhbiB9PikgPT4ge1xuICAgICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdCB9ID0gZS5kZXRhaWw7XG4gICAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2VJZGVudGlmaWVyLCAndHJ1ZScpO1xuICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UoY291bnRBdHRlbXB0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIC8vIHdvcmR0IGFhbmdlcm9lcGVuIHZhbnVpdCBkZSBwcm9jZXNzaW5ndGVtcGxhdGVcbiAgICAgICdxdGktc2V0LW91dGNvbWUtdmFsdWUnLFxuICAgICAgKGU6IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3V0Y29tZUlkZW50aWZpZXIsIHZhbHVlIH0gPSBlLmRldGFpbDtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUob3V0Y29tZUlkZW50aWZpZXIsIHZhbHVlKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB0aGlzLmhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUpO1xuICB9XG5cbiAgcHVibGljIHNob3dDb3JyZWN0UmVzcG9uc2Uoc2hvdzogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGVzID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmlsdGVyKFxuICAgICAgKHZhcmk6IFJlc3BvbnNlVmFyaWFibGUgfCBPdXRjb21lVmFyaWFibGUpID0+ICdjb3JyZWN0UmVzcG9uc2UnIGluIHZhcmkgJiYgdmFyaS5jb3JyZWN0UmVzcG9uc2VcbiAgICApIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCByZXNwb25zZXMgPSByZXNwb25zZVZhcmlhYmxlcy5tYXAoY3IgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiBjci5pZGVudGlmaWVyLFxuICAgICAgICByZXNwb25zZTogY3IuY29ycmVjdFJlc3BvbnNlXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfCB1bmRlZmluZWQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICApO1xuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGludGVyYWN0aW9uLmNvcnJlY3RSZXNwb25zZSA9IHNob3cgPyByZXNwb25zZS5yZXNwb25zZSA6ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzUmVzcG9uc2UoY291bnROdW1BdHRlbXB0czogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXNwb25zZVByb2Nlc3NvciA9IHRoaXMucXVlcnlTZWxlY3RvcjxRdGlSZXNwb25zZVByb2Nlc3Npbmc+KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpO1xuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2UgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHdlYmNvbXBvbmVudHMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG5cbiAgICBpZiAoY291bnROdW1BdHRlbXB0cykge1xuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoXG4gICAgICAgICdudW1BdHRlbXB0cycsXG4gICAgICAgICgrdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gJ251bUF0dGVtcHRzJyk/LnZhbHVlICsgMSkudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lbWl0KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2VkJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRSZXNwb25zZXMoKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2luaXRpYWxDb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3BvbnNlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFJlc3BvbnNlVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldE91dGNvbWUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8T3V0Y29tZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldFZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPj4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICB9XG5cbiAgLy8gc2F2aW5nIHByaXZhdGVzIGhlcmU6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaGFuZGxlVXBkYXRlUmVzcG9uc2VWYXJpYWJsZShldmVudDogQ3VzdG9tRXZlbnQ8UmVzcG9uc2VJbnRlcmFjdGlvbj4pIHtcbiAgICBjb25zdCB7IHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UgfSA9IGV2ZW50LmRldGFpbDtcbiAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUmVzcG9uc2VWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyID8gdiA6IHsgLi4udiwgdmFsdWU6IHZhbHVlIH0pKVxuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0PEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHM+KCdxdGktaW50ZXJhY3Rpb24tY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWRhcHRpdmUgPT09ICdmYWxzZScpIHtcbiAgICAgIC8vIGlmIGFkYXBhdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlT3V0Y29tZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5nZXRPdXRjb21lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFvdXRjb21lVmFyaWFibGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuIG5vdCBzZXQgcXRpLW91dGNvbWUtaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfSwgaXQgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiB7XG4gICAgICAgIGlmICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IG91dGNvbWVWYXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgPyB2YWx1ZSA6IFsuLi52LnZhbHVlLCB2YWx1ZSBhcyBzdHJpbmddXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG4gICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5mb3JFYWNoKGZlID0+IGZlLmNoZWNrU2hvd0ZlZWRiYWNrKGlkZW50aWZpZXIpKTtcblxuICAgIHRoaXMuX2VtaXQ8T3V0Y29tZUNoYW5nZWREZXRhaWxzPigncXRpLW91dGNvbWUtY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIG91dGNvbWVJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpPy52YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29tcGxldGlvblN0YXR1cygpOiAnY29tcGxldGVkJyB8ICdpbmNvbXBsZXRlJyB8ICdub3RfYXR0ZW1wdGVkJyB8ICd1bmtub3duJyB7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZXZlcnkoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdjb21wbGV0ZWQnO1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLnNvbWUoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdpbmNvbXBsZXRlJztcbiAgICByZXR1cm4gJ25vdF9hdHRlbXB0ZWQnO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdDxUPihuYW1lLCBkZXRhaWwgPSBudWxsKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFQ+KG5hbWUsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nOiBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgVXBkYXRlSGFuZGxlciA9IChwcmV2PzogdW5rbm93biwgbmV4dD86IHVua25vd24pID0+IHZvaWQ7XG5cbnR5cGUgTm9uVW5kZWZpbmVkPEE+ID0gQSBleHRlbmRzIHVuZGVmaW5lZCA/IG5ldmVyIDogQTtcblxudHlwZSBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiBOb25VbmRlZmluZWQ8VFtLXT4gZXh0ZW5kcyBVcGRhdGVIYW5kbGVyID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuaW50ZXJmYWNlIFdhdGNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbiAgd2FpdFVudGlsRmlyc3RVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgd2hlbiBvYnNlcnZlZCBwcm9wZXJ0aWVzIGNoYW5nZSwgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy4gVG8gd2FpdCBmb3IgYW5cbiAqIHVwZGF0ZSB0byBjb21wbGV0ZSBhZnRlciBhIGNoYW5nZSBvY2N1cnMsIHVzZSBgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZWAgaW4gdGhlIGhhbmRsZXIuIFRvIHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZVxuICogaW5pdGlhbCB1cGRhdGUvcmVuZGVyLCB1c2UgYHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfWAgb3IgYHRoaXMuaGFzVXBkYXRlZGAgaW4gdGhlIGhhbmRsZXIuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogQHdhdGNoKCdwcm9wTmFtZScpXG4gKiBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICogICAuLi5cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoKHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnMpIHtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxXYXRjaE9wdGlvbnM+ID0ge1xuICAgIHdhaXRVbnRpbEZpcnN0VXBkYXRlOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4ocHJvdG86IEVsZW1DbGFzcywgZGVjb3JhdGVkRm5OYW1lOiBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPEVsZW1DbGFzcz4pID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgY29uc3QgeyB1cGRhdGUgfSA9IHByb3RvO1xuICAgIGNvbnN0IHdhdGNoZWRQcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0eU5hbWUpID8gcHJvcGVydHlOYW1lIDogW3Byb3BlcnR5TmFtZV07XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gdXBkYXRlIGlzIGEgcHJvdGVjdGVkIHByb3BlcnR5XG4gICAgcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcywgY2hhbmdlZFByb3BzOiBNYXA8a2V5b2YgRWxlbUNsYXNzLCBFbGVtQ2xhc3Nba2V5b2YgRWxlbUNsYXNzXT4pIHtcbiAgICAgIHdhdGNoZWRQcm9wZXJ0aWVzLmZvckVhY2gocHJvcGVydHkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eSBhcyBrZXlvZiBFbGVtQ2xhc3M7XG4gICAgICAgIGlmIChjaGFuZ2VkUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGNoYW5nZWRQcm9wcy5nZXQoa2V5KTtcbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZWRPcHRpb25zLndhaXRVbnRpbEZpcnN0VXBkYXRlIHx8IHRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGUuY2FsbCh0aGlzLCBjaGFuZ2VkUHJvcHMpO1xuICAgIH07XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJdGVtQ29udGV4dCB7XG4gIGhyZWY/OiBzdHJpbmc7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgdmFyaWFibGVzOiBSZWFkb25seUFycmF5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+Pjtcbn1cblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0VmFyaWFibGVzID0gW1xuICB7XG4gICAgaWRlbnRpZmllcjogJ2NvbXBsZXRpb25TdGF0dXMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ3N0cmluZycsXG4gICAgdmFsdWU6ICd1bmtub3duJyxcbiAgICB0eXBlOiAnb3V0Y29tZSdcbiAgfSxcbiAge1xuICAgIGlkZW50aWZpZXI6ICdudW1BdHRlbXB0cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgdmFsdWU6ICcwJyxcbiAgICB0eXBlOiAncmVzcG9uc2UnXG4gIH1cbl0gYXMgVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXTtcblxuZXhwb3J0IGNvbnN0IGl0ZW1Db250ZXh0ID0gY3JlYXRlQ29udGV4dDxJdGVtQ29udGV4dD4oU3ltYm9sKCdpdGVtJykpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtIH0gZnJvbSAnLi4vLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGN1c3RvbSBlbGVtZW50IGZvciByZWZlcmVuY2luZyBhbiBhc3Nlc3NtZW50IHN0aW11bHVzLlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJylcbmV4cG9ydCBjbGFzcyBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWYgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBocmVmIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBocmVmID0gJyc7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyBpZiB0aGUgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnIGV2ZW50IGlzIG5vdCBwcmV2ZW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJywgeyBjYW5jZWxhYmxlOiB0cnVlLCBidWJibGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGlzUHJldmVudGVkID0gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1ByZXZlbnRlZCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpO1xuXG4gICAgICBjb25zdCBzdGltdWx1c1JlZiA9IGl0ZW0ucXVlcnlTZWxlY3RvcihgW2RhdGEtc3RpbXVsdXMtaWRyZWY9JHt0aGlzLmlkZW50aWZpZXJ9XWApO1xuICAgICAgaWYgKHN0aW11bHVzUmVmKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTdGltdWx1cyB3aXRoIGRhdGEtc3RpbXVsdXMtaWRyZWYgJHt0aGlzLmlkZW50aWZpZXJ9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgKiBAcGFyYW0gc3RpbXVsdXNSZWYgLSBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgc3RpbXVsdXMgd2lsbCBiZSBhcHBlbmRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZjogRWxlbWVudCkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmhyZWYuc3Vic3RyaW5nKDAsIHRoaXMuaHJlZi5sYXN0SW5kZXhPZignLycpKTtcbiAgICBjb25zdCBzdGltdWx1cyA9IGF3YWl0IHF0aVRyYW5zZm9ybUl0ZW0oKVxuICAgICAgLmxvYWQodGhpcy5ocmVmKVxuICAgICAgLnRoZW4oYXBpID0+IGFwaS5odG1sRG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiY29uc3QgeG1sID0gU3RyaW5nLnJhdztcblxuLyogICA8IS0tIGNvbnZlcnQgQ0RBVEEgdG8gY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJ0ZXh0KClbY29udGFpbnMoLiwgJ0NEQVRBJyldXCI+XG4gIDx4c2w6Y29tbWVudD5cbiAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gIDwveHNsOmNvbW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbiovXG5cbi8qXG4gIDwhLS0gcmVtb3ZlIHhtbCBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cImNvbW1lbnQoKVwiIC8+XG4gICovXG5cbmNvbnN0IHhtbFRvSFRNTCA9IHhtbGA8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj1cIjEuMFwiIHhtbG5zOnhzbD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiPlxuPHhzbDpvdXRwdXQgbWV0aG9kPVwiaHRtbFwiIHZlcnNpb249XCI1LjBcIiBlbmNvZGluZz1cIlVURi04XCIgaW5kZW50PVwieWVzXCIgLz5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIkAqfG5vZGUoKVwiPlxuICAgIDx4c2w6Y29weT5cbiAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cIkAqfG5vZGUoKVwiLz5cbiAgICA8L3hzbDpjb3B5PlxuICA8L3hzbDp0ZW1wbGF0ZT5cblxuICA8IS0tIHJlbW92ZSBleGlzdGluZyBuYW1lc3BhY2VzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiKlwiPlxuICAgIDwhLS0gcmVtb3ZlIGVsZW1lbnQgcHJlZml4IC0tPlxuICAgIDx4c2w6ZWxlbWVudCBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgIDwhLS0gcHJvY2VzcyBhdHRyaWJ1dGVzIC0tPlxuICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9XCJAKlwiPlxuICAgICAgICA8IS0tIHJlbW92ZSBhdHRyaWJ1dGUgcHJlZml4IC0tPlxuICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gICAgICAgIDwveHNsOmF0dHJpYnV0ZT5cbiAgICAgIDwveHNsOmZvci1lYWNoPlxuICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz5cbiAgPC94c2w6ZWxlbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuPC94c2w6c3R5bGVzaGVldD5gO1xuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgZWxlbWVudHMgd2l0aCBhIHNwZWNpZmljIHRhZyBuYW1lIGJ5IGFkZGluZyBhbiBleHRlbnNpb24gc3VmZml4XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCB0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFnTmFtZSkuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7dGFnTmFtZX0tJHtleHRlbnNpb259YDtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gIH0pO1xufVxuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgYW55IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNsYXNzIHBhdHRlcm4gKGUuZy4sIFwiZXh0ZW5kOnN1ZmZpeFwiKVxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgY2xhc3NOYW1lUGF0dGVybjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChgJHtjbGFzc05hbWVQYXR0ZXJufTpgKSkge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNsYXNzTmFtZS5zbGljZShgJHtjbGFzc05hbWVQYXR0ZXJufTpgLmxlbmd0aCk7XG4gICAgICAgICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke2VsZW1lbnQubm9kZU5hbWV9LSR7c3VmZml4fWA7XG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgd2l0aCBhIG5ldyB0YWcgbmFtZSBhbmQgY29weSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpIHtcbiAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnTmFtZSk7XG4gIC8vIENvcHkgYXR0cmlidXRlc1xuICBmb3IgKGNvbnN0IGF0dHIgb2YgZWxlbWVudC5hdHRyaWJ1dGVzKSB7XG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgfVxuICAvLyBDb3B5IGNoaWxkIG5vZGVzXG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtc0Zyb21UZXN0KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGl0ZW1zOiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXSA9IFtdO1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzZXNzbWVudC1pdGVtLXJlZicpLmZvckVhY2goZWwgPT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2NhdGVnb3J5Jyk7XG4gICAgaXRlbXMucHVzaCh7IGlkZW50aWZpZXIsIGhyZWYsIGNhdGVnb3J5IH0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5sZXQgY3VycmVudFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkWE1MKHVybCwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpIHtcbiAgaWYgKGNhbmNlbFByZXZpb3VzUmVxdWVzdCAmJiBjdXJyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRSZXF1ZXN0LmFib3J0KCk7IC8vIEFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QgaWYgdGhlcmUgaXMgb25lXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8WE1MRG9jdW1lbnQgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgY3VycmVudFJlcXVlc3QgPSB4aHI7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHJlcXVlc3RcblxuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuXG4gICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJlc29sdmUoeGhyLnJlc3BvbnNlWE1MKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTCh4bWxEb2N1bWVudDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgeG1sRnJhZ21lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbERvY3VtZW50LCAndGV4dC94bWwnKTtcbiAgcmV0dXJuIHhtbEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9IVE1MKHhtbEZyYWdtZW50OiBEb2N1bWVudCk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpO1xuICBjb25zdCB4c2x0RG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbFRvSFRNTCwgJ3RleHQveG1sJyk7XG4gIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbHREb2N1bWVudCk7XG4gIGNvbnN0IGl0ZW1IVE1MRnJhZ21lbnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWxGcmFnbWVudCwgZG9jdW1lbnQpO1xuICByZXR1cm4gaXRlbUhUTUxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2F0aW9uKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50LCBsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGlmICghbG9jYXRpb24uZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvY2F0aW9uICs9ICcvJztcbiAgfVxuXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzcmNdLFtocmVmXSxbcHJpbWFyeS1wYXRoXScpLmZvckVhY2goZWxXaXRoU3JjID0+IHtcbiAgICBsZXQgYXR0cjogJ3NyYycgfCAnaHJlZicgfCAncHJpbWFyeS1wYXRoJyB8ICcnID0gJyc7XG5cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnc3JjJykpIHtcbiAgICAgIGF0dHIgPSAnc3JjJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgYXR0ciA9ICdocmVmJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpKSB7XG4gICAgICBhdHRyID0gJ3ByaW1hcnktcGF0aCc7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoYXR0cik/LnRyaW0oKTtcblxuICAgIGlmICghYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgIGNvbnN0IG5ld1NyY1ZhbHVlID0gbG9jYXRpb24gKyBlbmNvZGVVUkkoYXR0clZhbHVlKTtcbiAgICAgIGVsV2l0aFNyYy5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV3U3JjVmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgY2RhdGFFbGVtZW50cyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1jdXN0b20tb3BlcmF0b3JbY2xhc3M9XCJqcy5vcmdcIl0gPiBxdGktYmFzZS12YWx1ZScpO1xuICBjZGF0YUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY29tbWVudFRleHQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKGNvbW1lbnRUZXh0LCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgLy8gcmVtb3ZlIHF0aS1zdHlsZXNoZWV0IHRhZ1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3R5bGVzaGVldCcpLmZvckVhY2goc3R5bGVzaGVldCA9PiBzdHlsZXNoZWV0LnJlbW92ZSgpKTtcbn1cbiIsICIvKipcbiAqIEJyb3dzZXIgYmFzZWQgUVRJLVhNTCB0byBIVE1MIHRyYW5zZm9ybWVyLlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybUl0ZW0oKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ3BhdGgvdG8veG1sL2ZpbGUueG1sJyk7XG4gKiBxdGlUcmFuc2Zvcm1lci5wYXRoKCcvYXNzZXNzbWVudEl0ZW0vaXRlbUJvZHknKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqIGNvbnN0IGh0bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci5odG1sZG9jKCk7XG4gKiBjb25zdCB4bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci54bWxkb2MoKTtcbiAqXG4gKiBxdGlUcmFuc2Zvcm1JdGVtKCkucGFyc2Uoc3RvcnlYTUwpLmh0bWwoKVxuICovXG5cbmltcG9ydCB7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudCxcbiAgZXh0ZW5kRWxlbWVudE5hbWUsXG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzLFxuICBsb2FkWE1MLFxuICBwYXJzZVhNTCxcbiAgc2V0TG9jYXRpb24sXG4gIHN0cmlwU3R5bGVTaGVldHMsXG4gIHRvSFRNTFxufSBmcm9tICcuL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICBsb2FkOiAodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdD86IGJvb2xlYW4pID0+IFByb21pc2U8dHJhbnNmb3JtSXRlbUFwaT47XG4gIHBhcnNlOiAoeG1sU3RyaW5nOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwY2lIb29rczogKHVyaTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50TmFtZTogKGVsZW1lbnROYW1lOiBzdHJpbmcsIGV4dGVuZDogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtPzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjdXN0b21JbnRlcmFjdGlvbjogKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY29udmVydENEQVRBdG9Db21tZW50OiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBzdHJpcFN0eWxlU2hlZXRzOiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gIHhtbDogKCkgPT4gc3RyaW5nO1xuICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybUl0ZW0gPSAoKSA9PiB7XG4gIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG5cbiAgY29uc3QgYXBpOiB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICAgIGFzeW5jIGxvYWQodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx0eXBlb2YgYXBpPiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dHlwZW9mIGFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsb2FkWE1MKHVyaSwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0KS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgLy8gc2V0IHRoZSBiYXNlIHBhdGggZm9yIGltYWdlcyBhbmQgb3RoZXIgcmVzb3VyY2VzLFxuICAgICAgICAgIC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgYmFzZSBwYXRoIHRvIHRoZSBkb2N1bWVudCByb290IGVsc2UgeW91IGNhbiB1c2UgdGhlIHBhdGggbWV0aG9kIHRvIHNldCBpdFxuICAgICAgICAgIGFwaS5wYXRoKHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwYXRoOiAobG9jYXRpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQsIGxvY2F0aW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBmbihmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCk6IHR5cGVvZiBhcGkge1xuICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBjaUhvb2tzKHVyaTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gWydob29rJywgJ21vZHVsZSddO1xuICAgICAgY29uc3QgZG9jdW1lbnRQYXRoID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZXMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZSArICddJyk7XG4gICAgICAgIHNyY0F0dHJpYnV0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb25zdCBzcmNWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkhO1xuICAgICAgICAgIGlmICghc3JjVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhc3JjVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICAvLyBKdXN0IHBhc3RlIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzcmMgbG9jYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50cm9vdFBhdGhcbiAgICAgICAgICAgIC8vIG9sZCBwY2lzIGNhbiBoYXZlIGEgLmpzLCBuZXcgcGNpJ3MgZG9uJ3RcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdiYXNlLXVybCcsIHVyaSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAgIGRvY3VtZW50UGF0aCArICcvJyArIGVuY29kZVVSSShzcmNWYWx1ZSArIChzcmNWYWx1ZS5lbmRzV2l0aCgnLmpzJykgPyAnJyA6ICcuanMnKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50TmFtZTogKHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50LCB0YWdOYW1lLCBleHRlbnNpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW06IHN0cmluZyA9ICdleHRlbmQnKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudCwgcGFyYW0pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGN1c3RvbUludGVyYWN0aW9uKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb24gPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdxdGktY3VzdG9tLWludGVyYWN0aW9uJyk7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCA9IHF0aUN1c3RvbUludGVyYWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1yZWYnLCBiYXNlUmVmKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLWl0ZW0nLCBiYXNlUmVmICsgYmFzZUl0ZW0pO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdkYXRhJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5yZW1vdmVDaGlsZChxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY29udmVydENEQVRBdG9Db21tZW50KCk6IHR5cGVvZiBhcGkge1xuICAgICAgY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBzdHJpcFN0eWxlU2hlZXRzKCk6IHR5cGVvZiBhcGkge1xuICAgICAgc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgaHRtbCgpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgIH0sXG4gICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICBodG1sRG9jKCkge1xuICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgcmV0dXJuIHhtbEZyYWdtZW50OyAvLyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcGk7XG59O1xuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBwYXJlbnQgZWxlbWVudCB0byBhcHBlbmQgdGhlIHNjb3BlZCBzdHlsZXNoZWV0IHRvLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzdHlsZXNoZWV0OicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQgIT09IG51bGwgJiYgdGhpcy50ZXh0Q29udGVudC50cmltKCkgIT09ICcnKSB7XG4gICAgICAvLyBNaW5pZnkgdGhlIGlubGluZSBDU1MgY29udGVudFxuICAgICAgY29uc3QgbWluaWZpZWRDc3MgPSB0aGlzLm1pbmlmeUNzcyh0aGlzLnRleHRDb250ZW50KTtcblxuICAgICAgLy8gRGlyZWN0bHkgY3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggdGhlIEBzY29wZSBzdXJyb3VuZGluZyB0aGUgbWluaWZpZWQgaW5saW5lIHN0eWxlc1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdObyBwYXJlbnQgZWxlbWVudCB0byBhcHBlbmQgdGhlIHNjb3BlZCBzdHlsZXNoZWV0IHRvLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWluaWZ5Q3NzKGNzc0NvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlIGNvbW1lbnRzLCB3aGl0ZXNwYWNlLCBhbmQgbmV3bGluZSBjaGFyYWN0ZXJzXG4gICAgcmV0dXJuIGNzc0NvbnRlbnRcbiAgICAgIC5yZXBsYWNlKC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKSAvLyBSZW1vdmUgY29tbWVudHNcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJykgLy8gQ29sbGFwc2Ugd2hpdGVzcGFjZVxuICAgICAgLnJlcGxhY2UoL1xccyooW3t9OjtdKVxccyovZywgJyQxJykgLy8gUmVtb3ZlIHNwYWNlcyBhcm91bmQge30sIDosIDtcbiAgICAgIC50cmltKCk7IC8vIFRyaW0gbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IHJlbW92ZSBzdHlsZXNoZWV0OicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc3R5bGVzaGVldCc6IFF0aVN0eWxlc2hlZXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogJ2h1bWFuJyB8ICdleHRlcm5hbE1hY2hpbmUnIHwgbnVsbCA9IG51bGw7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIGdldCBpbnRlcnBvbGF0aW9uVGFibGUoKTogTWFwPG51bWJlciwgbnVtYmVyPiB8IG51bGwge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZScpO1xuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5JykpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpICYmIGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG1pc3NpbmcgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykpO1xuICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHBhcnNlSW50KGVudHJ5LmdldEF0dHJpYnV0ZSgndGFyZ2V0LXZhbHVlJykpO1xuICAgICAgICBpZiAoaXNOYU4oc291cmNlVmFsdWUpIHx8IGlzTmFOKHRhcmdldFZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbm90IGEgbnVtYmVyIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZW50cmllcy5zZXQoc291cmNlVmFsdWUsIHRhcmdldFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZSxcbiAgICAgIGV4dGVybmFsU2NvcmVkOiB0aGlzLmV4dGVybmFsU2NvcmVkXG4gICAgfTtcbiAgICBvdXRjb21lVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMob3V0Y29tZVZhcmlhYmxlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MLnRyaW0oKSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZXMubGVuZ3RoID4gMSB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXNbMF07XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nOiBRdGlWYXJpYWJsZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlNYXBwaW5nIH0gZnJvbSAnLi4vLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcHBpbmcvcXRpLW1hcHBpbmcnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBjYXJkaW5hbGl0eTogQ2FyZGluYWxpdHk7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHB1YmxpYyBpdGVtQ29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHtcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY29ycmVjdFJlc3BvbnNlOiB0aGlzLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5IHx8ICdzaW5nbGUnLFxuICAgICAgbWFwcGluZzogdGhpcy5tYXBwaW5nLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgY2FuZGlkYXRlUmVzcG9uc2U6IG51bGxcbiAgICB9O1xuICAgIHJlc3BvbnNlVmFyaWFibGUudmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZXMocmVzcG9uc2VWYXJpYWJsZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogcmVzcG9uc2VWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIGNvbnN0IGNvcnJlY3RSZXNwb25zZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICBpZiAoY29ycmVjdFJlc3BvbnNlKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBjb3JyZWN0UmVzcG9uc2UucXVlcnlTZWxlY3RvckFsbCgncXRpLXZhbHVlJyk7XG4gICAgICBpZiAodGhpcy5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzBdLnRleHRDb250ZW50O1xuICAgICAgICB2YWx1ZXNbMF0ucmVtb3ZlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlc1tpXS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgdmFsdWVzW2ldLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBtYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1tYXBwaW5nJykgYXMgUXRpTWFwcGluZztcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtZGVjbGFyYXRpb24nOiBRdGlSZXNwb25zZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbycpXG5leHBvcnQgY2xhc3MgUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvLyBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAvLyAgIHNsb3Qge1xuICAvLyAgICAgZGlzcGxheTogaGlkZGVuO1xuICAvLyAgIH1cbiAgLy8gYDtcbiAgLy8gb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAvLyAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+IGA7XG4gIC8vIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mbyc6IFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm87XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29udGVudC1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlDb250ZW50Qm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb250ZW50LWJvZHknOiBRdGlDb250ZW50Qm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVicmljLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlSdWJyaWNCbG9jayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgb3ZlcnJpZGUgaWQ7IC8vID1cInF0aUFzcGVjdEluaG91ZFJ1YnJpY0Jsb2NrXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdXNlOiAnaW5zdHJ1Y3Rpb25zJyB8ICdzY29yaW5nJyB8ICduYXZpZ2F0aW9uJzsgLy8gID0gXCJzY29yaW5nXCJcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdmlldzogJ2F1dGhvcicgfCAnY2FuZGlkYXRlJyB8ICdwcm9jdG9yJyB8ICdzY29yZXInIHwgJ3Rlc3RDb25zdHJ1Y3RvcicgfCAndHV0b3InO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHRoaXMuY2xhc3NOYW1lcy5zcGxpdCgnICcpO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtZGlzY3JldGlvbmFyeS1wbGFjZW1lbnQnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1pbmxpbmUnOlxuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBieSBkZWZhdWx0IHB1dCB0aGlzIGluIGEgc2xvdCBpbiB0aGUgaXRlbS1ib2R5XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWJyaWMtYmxvY2snOiBRdGlSdWJyaWNCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IFByb3BlcnR5VmFsdWVNYXAsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWJsb2NrJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0Jsb2NrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub24ge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cImZlZWRiYWNrICR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1Nob3dGZWVkYmFjayh0aGlzLm91dGNvbWVJZGVudGlmaWVyKTtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWJsb2NrJzogUXRpRmVlZGJhY2tCbG9jaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJc051bGxPclVuZGVmaW5lZCB9IGZyb20gJy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUZlZWRiYWNrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnc2hvdy1oaWRlJyB9KVxuICBwcm90ZWN0ZWQgc2hvd0hpZGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ291dGNvbWUtaWRlbnRpZmllcicgfSlcbiAgcHVibGljIG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHByb3RlY3RlZCBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBzaG93U3RhdHVzOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nob3dGZWVkYmFjayhvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nKSB7ICAgIFxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IG91dGNvbWVJZGVudGlmaWVyKSB8fCBudWxsOztcblxuICAgIGlmICh0aGlzLm91dGNvbWVJZGVudGlmaWVyICE9PSBvdXRjb21lSWRlbnRpZmllciB8fCAhb3V0Y29tZVZhcmlhYmxlKSByZXR1cm47XG4gICAgbGV0IGlzRm91bmQgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRjb21lVmFyaWFibGUudmFsdWUpKSB7XG4gICAgICBpc0ZvdW5kID0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlLmluY2x1ZGVzKHRoaXMuaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRm91bmQgPVxuICAgICAgICAoIUlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAhSXNOdWxsT3JVbmRlZmluZWQob3V0Y29tZVZhcmlhYmxlPy52YWx1ZSkgJiZcbiAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPT09IG91dGNvbWVWYXJpYWJsZS52YWx1ZSkgfHxcbiAgICAgICAgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93RmVlZGJhY2soaXNGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dGZWVkYmFjayh2YWx1ZTogYm9vbGVhbikgeyAgICBcbiAgICB0aGlzLnNob3dTdGF0dXMgPSAodmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ3Nob3cnKSB8fCAoIXZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdoaWRlJykgPyAnb24nIDogJ29mZic7ICAgIFxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGRlY2ltYWxTZXBhcmF0b3IgPSAoKSA9PiB7XG4gIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoMC4xKS5yZXBsYWNlKC9cXGQvZywgJycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0ID0gKG51bWJlcjogbnVtYmVyIHwgc3RyaW5nKSA9PiB7XG4gIC8vIGNoZWNrIGlmIHR5cGUgaXMgc3RyaW5nXG4gIGlmICh0eXBlb2YgbnVtYmVyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudW1iZXI7XG4gIH1cbiAgY29uc3QgZFNlcCA9IGRlY2ltYWxTZXBhcmF0b3IoKTtcbiAgaWYgKGRTZXAgPT09ICcuJykge1xuICAgIHJldHVybiBudW1iZXIudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucmVwbGFjZSgnLicsICcnKS5yZXBsYWNlKGRTZXAsICcuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBJc051bGxPclVuZGVmaW5lZCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWZlZWRiYWNrLWlubGluZScpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tJbmxpbmUgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWZlZWRiYWNrLWlubGluZSc6IFF0aUZlZWRiYWNrSW5saW5lO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbW9kYWwtZmVlZGJhY2snKVxuZXhwb3J0IGNsYXNzIFF0aU1vZGFsRmVlZGJhY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYCA8c2xvdCBwYXJ0PVwiZmVlZGJhY2tcIiBjbGFzcz1cIiR7dGhpcy5zaG93U3RhdHVzfVwiPjwvc2xvdD4gYDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1vZGFsLWZlZWRiYWNrJzogUXRpTW9kYWxGZWVkYmFjaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcm93cyA9IDU7XG5cbiAgLyoqIGV4cGVjdGVkIGxlbmd0aCBpcyBtYXBwZWQgdG8gdGhlIHByb3BlcnR5IG1heGxlbmd0aCBvbiB0aGUgdGV4dGFyZWEgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgLyoqIHRleHQgYXBwZWFyaW5nIGluIHRoZSBleHRlbmRlZC10ZXh0LW50ZXJhY3Rpb24gaWYgaXQgaXMgZW1wdHkgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJylcbiAgaGFuZGxlY2xhc3NOYW1lc0NoYW5nZShvbGQsIGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XG4gICAgbGV0IHJvd3NTZXQgPSBmYWxzZTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMtJykpIHtcbiAgICAgICAgY29uc3QgbnJSb3dzID0gY2xhc3NOYW1lLnJlcGxhY2UoJ3F0aS1oZWlnaHQtbGluZXMtJywgJycpO1xuICAgICAgICB0aGlzLl9yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgcm93c1NldCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gSWYgbm8gcXRpLWhlaWdodC1saW5lcyBjbGFzcyBpcyBzZXQsIGNhbGN1bGF0ZSByb3dzIGJhc2VkIG9uIGV4cGVjdGVkTGVuZ3RoXG4gICAgaWYgKCFyb3dzU2V0ICYmIHRoaXMuZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVzdGltYXRlZFJvd3MgPSBNYXRoLmNlaWwodGhpcy5leHBlY3RlZExlbmd0aCAvIDUwKTsgLy8gICc1MCcgYmFzZWQgb24gYW4gZXN0aW1hdGUgZm9yIGNoYXJhY3RlcnMgcGVyIHJvd1xuICAgICAgdGhpcy5fcm93cyA9IGVzdGltYXRlZFJvd3M7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaW5pdGlhbGx5XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgY29uc3QgcGF0dGVyblNvdXJjZSA9XG4gICAgICAgIHRoaXMucGF0dGVybk1hc2suc3RhcnRzV2l0aCgnXicpICYmIHRoaXMucGF0dGVybk1hc2suZW5kc1dpdGgoJyQnKSA/IHRoaXMucGF0dGVybk1hc2sgOiBgXiR7dGhpcy5wYXR0ZXJuTWFza30kYDtcblxuICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVyblNvdXJjZSk7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpICYmIHBhdHRlcm4udGVzdCh0ZXh0YXJlYS52YWx1ZSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgdGV4dGFyZWEuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRleHRhcmVhLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiJHs1MDAwfVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgcm93cz1cIiR7dGhpcy5fcm93c31cIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAgIC52YWx1ZT0ke3RoaXMuX3ZhbHVlfVxuICAgICAgPjwvdGV4dGFyZWE+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBJSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQgPSB0cnVlOyAvLyBFbmFibGUgZm9ybSBhc3NvY2lhdGlvblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllciA9ICcnO1xuICAvKiogZGlzYWJsZWQgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiByZWFkb25seSBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIF9jb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIHByb3RlY3RlZCBfaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgfVxuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG5cbiAgcHVibGljIHJlcG9ydFZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMucmVwb3J0VmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW107XG4gIGFic3RyYWN0IHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgfVxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdleHBlY3RlZC1sZW5ndGgnIH0pIGV4cGVjdGVkTGVuZ3RoOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwYXR0ZXJuLW1hc2snIH0pIHBhdHRlcm5NYXNrOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdwbGFjZWhvbGRlci10ZXh0JyB9KSBwbGFjZWhvbGRlclRleHQ6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtcGF0dGVybm1hc2stbWVzc2FnZScgfSkgZGF0YVBhdHRlcm5tYXNrTWVzc2FnZTogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXR0ZXJuTWFzayAmJiB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpIHtcbiAgICAgIC8vIENsZWFyIGFueSBjdXN0b20gZXJyb3IgaWYgdGhlIGlucHV0IGlzIHZhbGlkXG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoe30pO1xuICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpOyAvLyBDbGVhciB0aGUgY3VzdG9tIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7IC8vIFNldCBjdXN0b20gbWVzc2FnZSBvbmx5IGlmIGludmFsaWRcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8aW5wdXRcbiAgICAgICAgcGFydD1cImlucHV0XCJcbiAgICAgICAgbmFtZT1cIiR7dGhpcy5yZXNwb25zZUlkZW50aWZpZXJ9XCJcbiAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD0kezEwMDB9XG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb3JyZWN0XCI+JHt0aGlzLl9jb3JyZWN0UmVzcG9uc2V9PC9kaXY+XG4gICAgYDtcbiAgfVxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlmICghaW5wdXQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgfVxuICBbcGFydD0nY29ycmVjdCddIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEuMXJlbTtcbiAgICBtaW4td2lkdGg6IDEuMXJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyLjNyZW07XG4gICAgbWluLXdpZHRoOiAyLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMy4zcmVtO1xuICAgIG1pbi13aWR0aDogMy4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQuMnJlbTtcbiAgICBtaW4td2lkdGg6IDQuMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA2LjZyZW07XG4gICAgbWluLXdpZHRoOiA2LjZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDhyZW07XG4gICAgbWluLXdpZHRoOiA4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxMnJlbTtcbiAgICBtaW4td2lkdGg6IDEycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxN3JlbTtcbiAgICBtaW4td2lkdGg6IDE3cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBtaW4td2lkdGg6IDIwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyNHJlbTtcbiAgICBtaW4td2lkdGg6IDI0cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zNSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAyOHJlbTtcbiAgICBtaW4td2lkdGg6IDI4cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzMnJlbTtcbiAgICBtaW4td2lkdGg6IDMycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC00NSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzNnJlbTtcbiAgICBtaW4td2lkdGg6IDM2cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC01MCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0MHJlbTtcbiAgICBtaW4td2lkdGg6IDQwcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC03MikgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA1N3JlbTtcbiAgICBtaW4td2lkdGg6IDU3cmVtO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90dGV4dCcpIHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nLCAnJyk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIgPSAoKSA9PiBodG1sYDxzbG90Pjwvc2xvdD5gO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dC1pbnRlcmFjdGlvbic6IFF0aUhvdHRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbmltcG9ydCB7IENob2ljZUludGVyZmFjZSB9IGZyb20gJy4uL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IHR5cGUgQ2hvaWNlID0gSFRNTEVsZW1lbnQgJiBDaG9pY2VJbnRlcmZhY2UgJiB7IGludGVybmFsczogRWxlbWVudEludGVybmFscyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZXNJbnRlcmZhY2UgZXh0ZW5kcyBJSW50ZXJhY3Rpb24ge1xuICBfY2hvaWNlRWxlbWVudHM6IEFycmF5PENob2ljZT47XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHB1YmxpYyBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcXVlcnkoJyN2YWxpZGF0aW9uTWVzc2FnZScpXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtaW5DaG9pY2VzID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1heENob2ljZXMgPSAxO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlKF9vbGRWYWx1ZTogbnVtYmVyLCBfbmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgfVxuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgICB9O1xuXG4gICAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IChjaG9pY2UucmVhZG9ubHkgPSByZWFkb25seSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZS5qb2luKCcsJykgOiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1pbmcgdGhpcy52YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdGhpcy5fdmFsdWUuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGlzLnZhbHVlIGlzIG5vdCBhbiBhcnJheVxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGlmIChyZXNwb25zZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGg7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgdmFsaWRpdHlNZXNzYWdlID0gJyc7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzICE9PSAwICYmIHNlbGVjdGVkQ291bnQgPiB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWF4U2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBjYW4gc2VsZWN0IGF0IG1vc3QgJHt0aGlzLm1heENob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA8IHRoaXMubWluQ2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5taW5TZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0ICR7dGhpcy5taW5DaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoXG4gICAgICAgICAgaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogdHJ1ZSB9LFxuICAgICAgICAgIHZhbGlkaXR5TWVzc2FnZSxcbiAgICAgICAgICBzZWxlY3RlZENob2ljZXNbc2VsZWN0ZWRDb3VudCAtIDFdIHx8IHRoaXMuX2Nob2ljZUVsZW1lbnRzWzBdIHx8IHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX2ludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIGNob2ljZUVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG5cbiAgICAgIFxuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMucHVzaChjaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gY2hvaWNlICE9PSBjaG9pY2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZXRlcm1pbmVJbnB1dFR5cGUoKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIHRoaXMuX3NldElucHV0VHlwZShjaG9pY2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQ6IENob2ljZSkge1xuICAgICAgLy8gY2hvaWNlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94Jyk7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCc7XG4gICAgICBjaG9pY2VFbGVtZW50LmludGVybmFscy5zdGF0ZXMuYWRkKGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUpXG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAvLyBjaG9pY2VFbGVtZW50LmFyaWFSZWFkT25seSA9IHRoaXMucmVhZG9ubHkgPT0gdHJ1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9Pikge1xuICAgICAgdGhpcy5fdG9nZ2xlQ2hvaWNlQ2hlY2tlZChldmVudC50YXJnZXQgYXMgQ2hvaWNlKTtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICAgIGlmIChjaG9pY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UsIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChjaG9pY2UuaW50ZXJuYWxzPy5zdGF0ZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAndHJ1ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8ICcnIDogc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBjaG9pY2UgZWxlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZSA6IFt0aGlzLl92YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGlzU2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUNob2ljZUludGVyYWN0aW9uXG4gIGV4dGVuZHMgVm9jYWJ1bGFyeU1peGluKFxuICAgIFNodWZmbGVNaXhpbihDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktc2ltcGxlLWNob2ljZScpLCAncXRpLXNpbXBsZS1jaG9pY2UnKSxcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnXG4gIClcbiAgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlXG57XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCIgaWQ9XCJ2YWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBTaHVmZmxlSW50ZXJmYWNlIHt9XG5leHBvcnQgY29uc3QgU2h1ZmZsZU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgU2h1ZmZsZUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9zaHVmZmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGNvbnZlcnRlcjogc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBzZXQgc2h1ZmZsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9zaHVmZmxlO1xuICAgICAgdGhpcy5fc2h1ZmZsZSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoJ3NodWZmbGUnLCBvbGRWYWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IHNodWZmbGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc2h1ZmZsZTtcbiAgICB9XG5cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAvLyBDYWxsIF9yZXNldFNodWZmbGVDaG9pY2VzIGluaXRpYWxseSB0byBzZXQgdGhlIENTUyBvcmRlciB0byBpbml0aWFsLlxuICAgICAgLy8gSWYgc2h1ZmZsZSBpcyB0cnVlLCBfc2h1ZmZsZUNob2ljZXMgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIHNldHRlci5cbiAgICAgIGlmICh0aGlzLnNodWZmbGUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oc2VsZWN0b3IpKTtcbiAgICAgIGNvbnN0IGZpeGVkRWxlbWVudHM6IEFycmF5PHsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICAgIGNvbnN0IG5vbkZpeGVkRWxlbWVudHM6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xuXG4gICAgICAvLyBTZXBhcmF0ZSBmaXhlZCBhbmQgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBmaXhlZEVsZW1lbnRzLnB1c2goeyBlbGVtZW50OiBjaG9pY2UsIGluZGV4OiBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub25GaXhlZEVsZW1lbnRzLnB1c2goY2hvaWNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSAxIG9yIGZld2VyIG5vbi1maXhlZCBlbGVtZW50cywgdGhyb3cgYW4gZXJyb3IgKG5vIHNodWZmbGUgcG9zc2libGUpXG4gICAgICBpZiAobm9uRml4ZWRFbGVtZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NodWZmbGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBmZXdlciB0aGFuIDIgbm9uLWZpeGVkIGVsZW1lbnRzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBpc1NodWZmbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEwOyAvLyBNYXggYXR0ZW1wdHMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgICAgbGV0IGF0dGVtcHQgPSAwO1xuXG4gICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcmRlciBmb3IgY29tcGFyaXNvblxuICAgICAgY29uc3Qgb3JpZ2luYWxPcmRlciA9IFsuLi5ub25GaXhlZEVsZW1lbnRzXTtcblxuICAgICAgLy8gU2h1ZmZsZSB1bnRpbCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCBvciBtYXhBdHRlbXB0cyBpcyByZWFjaGVkXG4gICAgICB3aGlsZSAoIWlzU2h1ZmZsZWQgJiYgYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGF0dGVtcHQrKztcblxuICAgICAgICAvLyBTaHVmZmxlIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gbm9uRml4ZWRFbGVtZW50cy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIFtub25GaXhlZEVsZW1lbnRzW2ldLCBub25GaXhlZEVsZW1lbnRzW2pdXSA9IFtub25GaXhlZEVsZW1lbnRzW2pdLCBub25GaXhlZEVsZW1lbnRzW2ldXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzaHVmZmxlZCByZXN1bHQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIG9yZGVyXG4gICAgICAgIGlzU2h1ZmZsZWQgPSAhbm9uRml4ZWRFbGVtZW50cy5ldmVyeSgoY2hvaWNlLCBpbmRleCkgPT4gY2hvaWNlID09PSBvcmlnaW5hbE9yZGVyW2luZGV4XSk7XG5cbiAgICAgICAgaWYgKGlzU2h1ZmZsZWQpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU2h1ZmZsZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2h1ZmZsZSB0aGUgY2hvaWNlcyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIG9yZGVyIHRvIGVhY2ggZWxlbWVudFxuICAgICAgbGV0IG9yZGVyID0gMTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNob2ljZS5oYXNBdHRyaWJ1dGUoJ2ZpeGVkJykpIHtcbiAgICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBub25GaXhlZENob2ljZSA9IG5vbkZpeGVkRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgICBub25GaXhlZENob2ljZSEuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgU3RyaW5nKG9yZGVyKyspKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzZXRTaHVmZmxlQ2hvaWNlcygpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsICdpbml0aWFsJyk7IC8vIGNob2ljZS5zdHlsZS5vcmRlciA9ICdpbml0aWFsJztcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU2h1ZmZsZUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUO1xufTtcblxuY29uc3Qgc3RyaW5nVG9Cb29sZWFuQ29udmVydGVyID0ge1xuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIH0sXG4gIHRvQXR0cmlidXRlKHZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG59O1xuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBQcm9wZXJ0eVZhbHVlcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG50eXBlIExhYmVsVHlwZSA9ICdxdGktbGFiZWxzLWRlY2ltYWwnIHwgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnIHwgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xudHlwZSBMYWJlbFN1ZmZpeFR5cGUgPSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJyB8ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyc7XG5cbmRlY2xhcmUgY2xhc3MgVm9jYWJ1bGFyeUludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgVm9jYWJ1bGFyeU1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgVm9jYWJ1bGFyeUVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIF9jbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX2FsbExhYmVscyA9IFsncXRpLWxhYmVscy1kZWNpbWFsJywgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnLCAncXRpLWxhYmVscy11cHBlci1hbHBoYSddO1xuICAgIHByaXZhdGUgX2FsbExhYmVsU3VmZml4ZXMgPSBbJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcsICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcyddIGFzIExhYmVsU3VmZml4VHlwZVtdO1xuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlXG4gICAgfSlcbiAgICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX2NsYXNzZXMuam9pbignICcpO1xuICAgICAgdGhpcy5fY2xhc3NlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG5cbiAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgLy8gdGhpcy5yZXF1ZXN0VXBkYXRlKCdjbGFzcycsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGNsYXNzKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fY2xhc3Nlcz8uam9pbignICcpIHx8ICcnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLnVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIGlmIChfY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzaHVmZmxlJykpIHtcbiAgICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkTGFiZWxzKCkge1xuICAgICAgY29uc3QgY2xhc3NDb250YWluc0xhYmVsID0gdGhpcy5fY2xhc3Nlcy5zb21lKFxuICAgICAgICBjbHMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGNscykgfHwgdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjbHMgYXMgTGFiZWxTdWZmaXhUeXBlKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGlzTnVtYmVyID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKCt2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgaWYgKGNsYXNzQ29udGFpbnNMYWJlbCkge1xuICAgICAgICBjb25zdCBjaG9pY2VFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoYyA9PiBjIGFzIFF0aVNpbXBsZUNob2ljZSk7XG4gICAgICAgIGNvbnN0IGNob2ljZXMgPSBjaG9pY2VFbGVtZW50c1xuICAgICAgICAgIC5tYXAoKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBlbDogY2hvaWNlLCBvcmRlcjogaXNOdW1iZXIoY2hvaWNlLnN0eWxlLm9yZGVyKSA/ICtjaG9pY2Uuc3R5bGUub3JkZXIgOiBpbmRleCArIDEgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcilcbiAgICAgICAgICAubWFwKGNob2ljZSA9PiBjaG9pY2UuZWwpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAoY2hvaWNlc1tpXSBhcyBRdGlTaW1wbGVDaG9pY2UpLm1hcmtlciA9IHRoaXMuX2dldExhYmVsKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9nZXRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgICBsZXQgbGFzdExhYmVsID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoYykpLnBvcCgpIGFzIExhYmVsVHlwZTtcbiAgICAgIGNvbnN0IGxhc3RMYWJlbFN1ZmZpeCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxTdWZmaXhlcy5pbmNsdWRlcyhjIGFzIExhYmVsU3VmZml4VHlwZSkpLnBvcCgpO1xuXG4gICAgICBpZiAoIWxhc3RMYWJlbCAmJiBsYXN0TGFiZWxTdWZmaXgpIHtcbiAgICAgICAgLy8gYSBzdWZmaXggd2l0aG91dCBhIGxhYmVsIGlzIHN0cmFuZ2Ugc28gYWRkIHF0aS1sYWJlbHMtdXBwZXItYWxwaGFcbiAgICAgICAgbGFzdExhYmVsID0gJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnO1xuICAgICAgfVxuICAgICAgbGV0IGxhYmVsID0gJyc7XG4gICAgICBzd2l0Y2ggKGxhc3RMYWJlbCkge1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWRlY2ltYWwnOlxuICAgICAgICAgIGxhYmVsID0gYCR7aW5kZXh9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1sb3dlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJykge1xuICAgICAgICBsYWJlbCArPSAnLic7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJykge1xuICAgICAgICBsYWJlbCArPSBgKWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuICB9XG4gIHJldHVybiBWb2NhYnVsYXJ5RWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxWb2NhYnVsYXJ5SW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogdmFyKC0tcXRpLWdhcC1zaXplKTtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gIH1cblxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1jaG9pY2UpIHtcbiAgICBmbGV4OiAwIDBcbiAgICAgIGNhbGMoKDEwMCUgLSAodmFyKC0tcXRpLWdhcC1zaXplKSAqIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSkgLyB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkgIWltcG9ydGFudDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDE7XG4gIH1cblxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMikgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDI7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTMpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAzO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy00KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNDtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDU7XG4gIH1cbiAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBsb2dpYyA9IG5ldyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvcigpO1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgICBsb2dpYy5wcm9jZXNzKHJ1bGVzKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJzogUXRpT3V0Y29tZVByb2Nlc3Npbmc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yIHtcbiAgcHVibGljIHByb2Nlc3MocnVsZXM6IFF0aVJ1bGVCYXNlW10pIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBtYXBSZXNwb25zZSwgbWFwUmVzcG9uc2VQb2ludCwgbWF0Y2hDb3JyZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncyc7XG5pbXBvcnQgeyB0eXBlIFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHJ1bGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcblxuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykpIHtcbiAgICAgIGNvbnN0IHNwbGl0dGVkVGVtcGxhdGVOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJykhLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBzcGxpdHRlZFRlbXBsYXRlTmFtZVtzcGxpdHRlZFRlbXBsYXRlTmFtZS5sZW5ndGggLSAxXS5yZXBsYWNlKCcueG1sJywgJycpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN3aXRjaCAodGVtcGxhdGVOYW1lKSB7XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZSc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlKS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlX3BvaW50Jzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2VQb2ludCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hdGNoX2NvcnJlY3QnOlxuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWF0Y2hDb3JyZWN0KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmcmFnbWVudEZyb21TdHJpbmcoc3RySFRNTDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0ckhUTUwpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJzogUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG1hdGNoQ29ycmVjdCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLW1hdGNoPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgICA8cXRpLWNvcnJlY3QgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktY29ycmVjdD5cbiAgICAgIDwvcXRpLW1hdGNoPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MTwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wLjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+IDwvcXRpLW1hcC1yZXNwb25zZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcblxuZXhwb3J0IGNvbnN0IG1hcFJlc3BvbnNlUG9pbnQgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1tYXAtcmVzcG9uc2UtcG9pbnQgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktbWFwLXJlc3BvbnNlLXBvaW50PlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuIiwgImltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJ0BjaXRvbGFiL3F0aS1jb21wb25lbnRzL3F0aS1jb21wb25lbnRzJztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuLyoqXG4gKiBUaGUgbG9va3VwT3V0Y29tZVZhbHVlIHJ1bGUgc2V0cyB0aGUgdmFsdWUgb2YgYW4gb3V0Y29tZSB2YXJpYWJsZSB0byB0aGUgdmFsdWUgb2J0YWluZWRcbiAqIGJ5IGxvb2tpbmcgdXAgdGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIGV4cHJlc3Npb24gaW4gdGhlIGxvb2t1cFRhYmxlIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhlIG91dGNvbWUncyBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIGdldCBjaGlsZEV4cHJlc3Npb24oKTogUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUpIHtcbiAgICAgIHZhbHVlID0gb3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZS5nZXQocGFyc2VJbnQodGhpcy5jaGlsZEV4cHJlc3Npb24uY2FsY3VsYXRlKCkpKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignbG9va3VwT3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJywgUXRpTG9va3VwT3V0Y29tZVZhbHVlKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlJzogUXRpTG9va3VwT3V0Y29tZVZhbHVlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1bGUnKVxuZXhwb3J0IGNsYXNzIFF0aVJ1bGUgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpUnVsZUJhc2Uge1xuICBwcm9jZXNzKCk6IGFueTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1bGUnOiBRdGlSdWxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlQ29uZGl0aW9uIGV4dGVuZHMgUXRpUnVsZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGJyYW5jaGVzID0gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aUV4cHJlc3Npb248YW55PltdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG5cbiAgICAgIGlmIChicmFuY2guY2FsY3VsYXRlKCkpIHtcbiAgICAgICAgKGJyYW5jaCBhcyB1bmtub3duIGFzIFF0aVJ1bGUpLnByb2Nlc3MoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWNvbmRpdGlvbicsIFF0aVJlc3BvbnNlQ29uZGl0aW9uKTtcbiIsICJpbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgb3V0Y29tZUlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuXG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlKGV4cHJlc3Npb24pO1xuICAgIGNvbnN0IHZhbHVlID0gcnVsZS5wcm9jZXNzKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWUubWFwKCh2OiBzdHJpbmcpID0+IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHYpKVxuICAgICAgICAgICAgOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTZXRPdXRjb21lVmFsdWVSdWxlPFQ+IGltcGxlbWVudHMgUXRpUnVsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb246IFF0aUV4cHJlc3Npb25CYXNlPFQ+KSB7fVxuXG4gIHByb2Nlc3MoKTogYW55IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbiA/IHRoaXMuZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSA6IG51bGw7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdzZXRPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIFF0aVNldE91dGNvbWVWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3Qgc3ViUnVsZXMgPSB0aGlzLmdldFN1YlJ1bGVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJSdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViUnVsZSA9IHN1YlJ1bGVzW2ldO1xuICAgICAgc3ViUnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UnLCBRdGlSZXNwb25zZUVsc2UpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VJZiB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1pZic7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlSWYge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWVsc2UtaWYnLCBRdGlSZXNwb25zZUVsc2VJZik7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi8uLi9xdGktcnVsZS9xdGktcnVsZSc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUVsc2UgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtZWxzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VFbHNlIHtcbiAgcHVibGljIG92ZXJyaWRlIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1pZicsIFF0aVJlc3BvbnNlSWYpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBpdGVtQ29udGV4dCwgSXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlNdWx0aXBsZSB9IGZyb20gJy4vcXRpLW11bHRpcGxlL3F0aS1tdWx0aXBsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICAvLyBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW07XG5cbiAgLy8gZ2V0VmFyaWFibGVzKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W107XG4gIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUV4cHJlc3Npb248VD4gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8VD4ge1xuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgcmVzdWx0OiBhbnk7XG5cbiAgLy8gaGlkZSB0aGUgc2xvdCB3aXRoIGNzc1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIHNsb3Qge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxwcmU+JHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlc3VsdCwgbnVsbCwgMil9PC9wcmU+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBjb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgZ2V0VmFyaWFibGVzID0gKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248bnVtYmVyIHwgc3RyaW5nIHwgKG51bWJlciB8IHN0cmluZylbXSB8IG51bGw+W10gPT5cbiAgICAvLyBGSVhNRTogaWYgdGhpcyBpdHNlbGYgaXMgbXVsdGlwbGUsIHRoaXMgd2lsbCBuZXZlciBlbnRlciB0aGUgcXRpLW11bHRpcGxlIHN3aXRjaFxuICAgIC8vIFNlZSB0aGlzIGV4YW1wbGUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tLzFFZFRlY2gvcXRpLWV4YW1wbGVzL2Jsb2IvbWFzdGVyL3F0aXYzLWV4YW1wbGVzL3BhY2thZ2luZy9pdGVtcy9FeGFtcGxlMDUtZmVlZGJhY2tCbG9jay1hZGFwdGl2ZS54bWxcblxuICAgIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbilcbiAgICAgIC5tYXAoKGU6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3F0aS1iYXNlLXZhbHVlJzoge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IGUuZ2V0QXR0cmlidXRlKCdiYXNlLXR5cGUnKSxcbiAgICAgICAgICAgICAgdmFsdWU6IGUudGV4dENvbnRlbnQudHJpbSgpLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLXZhcmlhYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLW11bHRpcGxlJzoge1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGUgPSBlIGFzIFF0aU11bHRpcGxlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gbXVsdGlwbGUuZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyOiAnJyxcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogdmFsdWVzWzBdLmJhc2VUeXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXMubWFwKHYgPT4gdi52YWx1ZSksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdtdWx0aXBsZScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLWNvcnJlY3QnOiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogcmVzcG9uc2VWYXJpYWJsZS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogcmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eVxuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAvLyBhZGRlZCBmb3IgdXNlIG9mIHF0aS1lcXVhbC1yb3VuZGVkXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gZSBhcyBRdGlFeHByZXNzaW9uPG51bWJlcj47XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXhwcmVzc2lvbi5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2RlZmF1bHQgbm90IHN1ZmZpY2llbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbn1cbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRoaXMucmVzdWx0ID0gdGhpcy5nZXRSZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdWx0KCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmV4cG9ydCBjbGFzcyBRdGlBbmQgZXh0ZW5kcyBxdGlBbmRNaXhpbihRdGlDb25kaXRpb25FeHByZXNzaW9uIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8UXRpQ29uZGl0aW9uRXhwcmVzc2lvbj4pIHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVDaGlsZHJlbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uPGFueT5bXSkpO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE1vY2tRdGlFeHByZXNzaW9uPFQ+ID0geyBjYWxjdWxhdGU6ICgpID0+IFQgfTtcbnR5cGUgTW9ja0NvbnN0cnVjdG9yID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4ge307XG5leHBvcnQgZnVuY3Rpb24gcXRpQW5kTWl4aW48VEJhc2UgZXh0ZW5kcyBNb2NrQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gIHJldHVybiBjbGFzcyBNb2NrUXRpQW5kIGV4dGVuZHMgQmFzZSB7XG4gICAgcHVibGljIGNhbGN1bGF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBBcnJheTxNb2NrUXRpRXhwcmVzc2lvbjxhbnk+Pikge1xuICAgICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNoaWxkcmVuLm1hcChjID0+IHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBNb2NrUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpO1xuICAgICAgICBsZXQgdmFsID0gZmFsc2U7XG4gICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbCBpbiBxdGktb3IsIGV4cGVjdGVkIGJvb2xlYW4nKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGUgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7IFF0aUFuZCB9IGZyb20gJy4vcXRpLWFuZCc7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1hbmQnLCBRdGlBbmQpO1xuXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hbmQnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYW5kJzogUXRpQW5kO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpQmFzZVZhbHVlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZSA9ICdzdHJpbmcnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGV4dENvbnRlbnQudHJpbSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1iYXNlLXZhbHVlJywgUXRpQmFzZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlDb250YWlucyBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzIGZvciBvdGhlciB0eXBlcyB0aGFuIGRpcmVjdGVkUGFpclxuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBlbnVtZXJhYmxlID0gcHJvamVjdGlvbjEuZmlsdGVyKHggPT4gcHJvamVjdGlvbjIuaW5jbHVkZXMoeCkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVudW1lcmFibGUubGVuZ3RoID4gMDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ3Vuc3VwcG9ydGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBjb250YWlucywgb25seSBiYXNlVHlwZTogZGlyZWN0ZWRQYWlyIGFuZCBjYXJkaW5hbGl0eTogbXVsdGlwbGUgaXMgc3VwcG9ydGVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgY29udGFpbnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvbnRhaW5zJywgUXRpQ29udGFpbnMpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpQ29ycmVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgZ2V0IGludGVycHJldGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnaW50ZXJwcmV0YXRpb24nKSB8fCAnJztcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgIGlmIChyZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlLmxlbmd0aCA+IDAgPyByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZVswXSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWNvcnJlY3QnLCBRdGlDb3JyZWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsUm91bmRlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgcm91bmRpbmdNb2RlOiAnZGVjaW1hbFBsYWNlcycgfCAnc2lnbmlmaWNhbnRGaWd1cmVzJyA9ICdzaWduaWZpY2FudEZpZ3VyZXMnO1xuXG4gIGdldCBmaWd1cmVzKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpO1xuICAgIGlmICghYXR0cikge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbWlzc2luZycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZpZ3VyZXMgPSBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnZmlndXJlcycpIHx8ICcwJyk7XG4gICAgaWYgKGlzTmFOKGZpZ3VyZXMpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5lZ2F0aXZlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAxICYmIHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEgZm9yIFJvdW5kaW5nTW9kZSBzaWduaWZpY2FudEZpZ3VyZXMnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmlndXJlcztcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHZhbHVlc1swXS5iYXNlVHlwZSkge1xuICAgICAgICBjYXNlICdpbnRlZ2VyJzpcbiAgICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmbG9hdDEudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKSA9PT0gZmxvYXQyLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQxICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykgPT09XG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDIgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZSBjYW5ub3QgYmUgY2FzdGVkIHRvIG51bWVyaWMgdmFsdWUgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yOiAke2Zsb2F0MX0sICR7ZmxvYXQyfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWVzIG90aGVyIHRoYW4gZmxvYXQgYW5kIGludCBjYW5ub3QgYmUgdXNlZCBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3IuYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsLXJvdW5kZWQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbC1yb3VuZGVkJywgUXRpRXF1YWxSb3VuZGVkKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRvbGVyYW5jZU1vZGU6ICdleGFjdCcgfCAncmVsYXRpdmUnIHwgJ2Fic29sdXRlJyA9ICdleGFjdCc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMudG9sZXJhbmNlTW9kZSAhPT0gJ2V4YWN0Jykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd0b2xlcmFuY2VNb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBlcXVhbCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsJywgUXRpRXF1YWwpO1xuIiwgImltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4nO1xuXG5leHBvcnQgY2xhc3MgU2NvcmluZ0hlbHBlciB7XG4gIHB1YmxpYyBzdGF0aWMgY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTE6IFJlYWRvbmx5PHN0cmluZz4sIHZhbHVlMjogUmVhZG9ubHk8c3RyaW5nPiwgYmFzZVR5cGU6IEJhc2VUeXBlKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChiYXNlVHlwZSkge1xuICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTI7XG4gICAgICBjYXNlICdpbnRlZ2VyJzoge1xuICAgICAgICBjb25zdCBpbnQxID0gcGFyc2VJbnQodmFsdWUxLCAxMCk7XG4gICAgICAgIGNvbnN0IGludDIgPSBwYXJzZUludCh2YWx1ZTIsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnQxKSAmJiAhaXNOYU4oaW50MikpIHtcbiAgICAgICAgICByZXR1cm4gaW50MSA9PT0gaW50MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBpbnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgY29uc3QgZmxvYXQxID0gcGFyc2VGbG9hdCh2YWx1ZTEpO1xuICAgICAgICBjb25zdCBmbG9hdDIgPSBwYXJzZUZsb2F0KHZhbHVlMik7XG4gICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgIHJldHVybiBmbG9hdDEgPT09IGZsb2F0MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb3VsZG4ndCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGZsb2F0LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncGFpcic6XG4gICAgICBjYXNlICdkaXJlY3RlZFBhaXInOiB7XG4gICAgICAgIGNvbnN0IHBhaXIxID0gdmFsdWUxLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBjb25zdCBwYWlyMiA9IHZhbHVlMi5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgaWYgKHBhaXIxLmxlbmd0aCA9PT0gMiAmJiBwYWlyMi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBpZiAoYmFzZVR5cGUgPT09ICdwYWlyJykge1xuICAgICAgICAgICAgcGFpcjEuc29ydCgpO1xuICAgICAgICAgICAgcGFpcjIuc29ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFpcjEuam9pbignICcpID09PSBwYWlyMi5qb2luKCcgJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY29tcGFyZWQgdHdvIHBhaXIgYnV0IG9uZSBvZiB0aGUgdmFsdWVzIGRvZXMgbm90IGhhdmUgMiB2YWx1ZXM6IDE6ICR7dmFsdWUxfSAyOiAke3ZhbHVlMn1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlHdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPiArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3QnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndCcsIFF0aUd0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlHdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID49ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ndGUnLCBRdGlHdGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpSXNOdWxsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGlmICghdmFyaWFibGVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB2YXJpYWJsZXNbMF0udmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgTnVsbCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWlzLW51bGwnLCBRdGlJc051bGwpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUx0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0JywgUXRpTHQpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUx0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPD0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWx0ZScsIFF0aUx0ZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwUmVzcG9uc2UgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNwb25zZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZChyID0+IHIuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKTtcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFJlc3BvbnNlICR7dGhpcy5pZGVudGlmaWVyfSBjYW4gbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWFwcGluZyA9IHJlc3BvbnNlLm1hcHBpbmc7XG4gICAgY29uc3QgY2FuZGlkYXRlUmVzcG9uc2VzID0gIUFycmF5LmlzQXJyYXkocmVzcG9uc2UudmFsdWUpID8gW3Jlc3BvbnNlLnZhbHVlXSA6IHJlc3BvbnNlLnZhbHVlO1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlUmVzcG9uc2Ugb2YgY2FuZGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IG1hcHBpbmcubWFwRW50cmllcy5maW5kKGVudHJ5ID0+IHtcbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhlbnRyeS5tYXBLZXksIGNhbmRpZGF0ZVJlc3BvbnNlLCByZXNwb25zZS5iYXNlVHlwZSk7XG4gICAgICB9KTtcbiAgICAgIGlmICghKG1hcHBlZFZhbHVlID09IG51bGwgfHwgbWFwcGVkVmFsdWUubWFwcGVkVmFsdWUgPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGVkVmFsdWUubWFwcGVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGluZy5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLmxvd2VyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5tYXgobWFwcGluZy5sb3dlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAobWFwcGluZy51cHBlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWluKG1hcHBpbmcudXBwZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXAtcmVzcG9uc2UnLCBRdGlNYXBSZXNwb25zZSk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcHBpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGVmYXVsdC12YWx1ZScsIHR5cGU6IE51bWJlciB9KSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDA7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAndXBwZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgdXBwZXJCb3VuZDogbnVtYmVyO1xuXG4gIHB1YmxpYyBnZXQgbWFwRW50cmllcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1tYXAtZW50cnknKSkubWFwKGVsID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hcEtleTogZWwuZ2V0QXR0cmlidXRlKCdtYXAta2V5JyksXG4gICAgICAgIG1hcHBlZFZhbHVlOiArZWwuZ2V0QXR0cmlidXRlKCdtYXBwZWQtdmFsdWUnKVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXBwaW5nJywgUXRpTWFwcGluZyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICAvL1BLIDogRklYTUUuXG4gIC8vIFRoaXMgd2FzIGEgbGl0dGxlIGV4cGVyaW1lbnQgaWYgd2UgY291bGQgY2FsbCB0aGUgbWF0Y2ggZnVuY3Rpb24gYXMgYSBzdGF0aWMgZnVuY3Rpb24sXG4gIC8vIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFsbCBraW5kIG9mIHRoaW5ncywgYnV0IG5vdyBlc3BlY2lhbGx5IGZvciB1c2UgaW5cbiAgLy8gcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi1zY3JpcHRcbiAgLy8gaW4gd2hpY2ggd2UgcGFzcyB0aGUgZXhwcmVzc2lvbnMgYXMgcHVyZSBmdW5jdGlvbnMsIGFuZCBob3BlIGZvciB0aGUgYmVzdC5cbiAgLy8gU0FETFksIHRoZSBnZXRWYXJpYWJsZXMgdGhyb3dzIHJvZXQgaW4gZGUgZXRlbi4uIHdlZXQgbm9nIG5pZXQgcHJlY2llcyBob2UgZGV6ZSB3ZXJrdC5cbiAgLy8gTWFhciBpayBnYSBlcmluIGR1aWtlbi5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWVUb01hcCA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IGNvcnJlY3RWYWx1ZUluZm8gPSB2YWx1ZXNbMV07XG4gICAgICByZXR1cm4gUXRpTWF0Y2gubWF0Y2godmFsdWVUb01hcCwgY29ycmVjdFZhbHVlSW5mbyk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWF0Y2godmFsdWVUb01hcDogUmVzcG9uc2VWYXJpYWJsZSwgY29ycmVjdFZhbHVlSW5mbzogUmVzcG9uc2VWYXJpYWJsZSkge1xuICAgIHN3aXRjaCAoY29ycmVjdFZhbHVlSW5mby5jYXJkaW5hbGl0eSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzoge1xuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCBBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlPy50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ29yZGVyZWQnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZVtpXSxcbiAgICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWVbaV0sXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbXVsdGlwbGUnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlLmxlbmd0aCAhPT0gY29ycmVjdFZhbHVlSW5mby52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFuc3dlckluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjb3JyZWN0QW5zd2VyIG9mIGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hpbmdWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgY29uc3QgYXJyID0gWy4uLnZhbHVlVG9NYXAudmFsdWVdO1xuICAgICAgICAgIGZvciAoY29uc3QgbXYgb2YgYXJyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoY29ycmVjdEFuc3dlciwgbXYsIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICBtYXRjaGluZ1ZhbHVlID0gbXY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgKGFyciBhcyBzdHJpbmdbXSkuc3BsaWNlKGFyci5pbmRleE9mKG1hdGNoaW5nVmFsdWUpLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbnN3ZXJJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hdGNoJywgUXRpTWF0Y2gpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1lbWJlciBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbiB8IG51bGw+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcblxuICAgIGlmICghKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHRha2VzIHR3byBzdWItZXhwcmVzc2lvbnMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbdmFsdWUxLCB2YWx1ZTJdID0gdmFsdWVzO1xuXG4gICAgaWYgKCEodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1doaWNoIG11c3QgYm90aCBoYXZlIHRoZSBzYW1lIGJhc2UtdHlwZScpO1xuICAgIH1cbiAgICBpZiAoISh2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2FuZCB0aGUgc2Vjb25kIG11c3QgYmUgYSBtdWx0aXBsZSBvciBvcmRlcmVkIGNvbnRhaW5lcicpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgbWVtYmVyIG9wZXJhdG9yIHNob3VsZCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBmbG9hdCcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSAnZHVyYXRpb24nIHx8IHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKCdJdCBtdXN0IG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGR1cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIHN1Yi1leHByZXNzaW9uIGlzIE5VTEwgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRvciBpcyBOVUxMXG4gICAgaWYgKHZhbHVlMS52YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZTIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSByZXN1bHQgaXMgYSBzaW5nbGUgYm9vbGVhbiB3aXRoIGEgdmFsdWUgb2YgJ3RydWUnIGlmIHRoZSB2YWx1ZSBnaXZlbiBieSB0aGUgZmlyc3Qgc3ViLWV4cHJlc3Npb24gaXMgaW4gdGhlIGNvbnRhaW5lciBkZWZpbmVkIGJ5IHRoZSBzZWNvbmQgc3ViLWV4cHJlc3Npb24uXG4gICAgY29uc3QgcHJvamVjdGlvbjEgPSB2YWx1ZTEudmFsdWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWVtYmVyJywgUXRpTWVtYmVyKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpTXVsdGlwbGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnbXVsdGlwbGUnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3QgdmFsdWVzID0gdmFyaWFibGVzLm1hcCh2ID0+IHYudmFsdWUpO1xuICAgIC8vIGNvbnNvbGUubG9nKHZhcmlhYmxlcyk7XG4gICAgLy8gY29uc3QgZmxhdHRlbmVkQXJyYXkgPSB2YWx1ZXMucmVkdWNlKChhY2M6IHN0cmluZ1tdLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAvLyAgIHJldHVybiBhY2MuY29uY2F0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlKTtcbiAgICAvLyB9LCBbXSk7XG4gICAgLy8gcmV0dXJuIGZsYXR0ZW5lZEFycmF5O1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tdWx0aXBsZScsIFF0aU11bHRpcGxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlOb3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuICFyZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbm90JywgUXRpTm90KTtcbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlPciBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5tYXAoYyA9PiB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIFF0aUV4cHJlc3Npb248YW55PjtcbiAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpO1xuICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbCBpbiBxdGktb3IsIGV4cGVjdGVkIGJvb2xlYW4nKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKGUgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcicsIFF0aU9yKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpT3JkZXJlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248UmVzcG9uc2VWYXJpYWJsZVtdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ29yZGVyZWQnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBvcmRlcmVkJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcmRlcmVkJywgUXRpT3JkZXJlZCk7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuZXhwb3J0IGNsYXNzIFF0aVByaW50ZWRWYXJpYWJsZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByaW50ZWQtdmFyaWFibGUnLCBRdGlQcmludGVkVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVByb2R1Y3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB2YWx1ZXMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdmbG9hdCcgfHwgY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciAqIHBhcnNlSW50KGN1cnJlbnRWYWx1ZS52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGNhbiBub3QgY29udmVydCB0byBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBoYXMgYW5vdGhlciBiYXNlVHlwZSAke2N1cnJlbnRWYWx1ZS5iYXNlVHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCAxKTtcbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcm9kdWN0JywgUXRpUHJvZHVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN0cmluZ01hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2FzZS1zZW5zaXRpdmUnIH0pIGNhc2VTZW5zaXRpdmUgPSAndHJ1ZSc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIHN0cmluZy1tYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB2MSA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUxLnZhbHVlIDogKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2MiA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUyLnZhbHVlIDogKHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHYxIGFzIHN0cmluZywgdjIgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktc3RyaW5nLW1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3RyaW5nLW1hdGNoJywgUXRpU3RyaW5nTWF0Y2gpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3VtIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogUXRpU3VtRXhwcmVzc2lvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9leHByZXNzaW9uID0gbmV3IFF0aVN1bUV4cHJlc3Npb24oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9leHByZXNzaW9uLmNhbGN1bGF0ZSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU3VtRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25zOiBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pIHt9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmV4cHJlc3Npb25zLm1hcChjID0+IHtcbiAgICAgIGlmICghYy5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGMuY2FsY3VsYXRlKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1zdW0sIGV4cGVjdGVkIG51bWJlcicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdW0nLCBRdGlTdW0pO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpLnZhbHVlXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS12YXJpYWJsZScsIFF0aVZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSU1TcGNpLCBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnLCBRdGlWYXJpYWJsZUpTT04gfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZWpzOiBhbnk7XG5kZWNsYXJlIGNvbnN0IGRlZmluZTogYW55O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBpbnRlcnZhbElkOiBhbnk7XG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBwcml2YXRlIHBjaTogSU1TcGNpPHVua25vd24+O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnbW9kdWxlJyB9KVxuICBtb2R1bGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2N1c3RvbS1pbnRlcmFjdGlvbi10eXBlLWlkZW50aWZpZXInIH0pXG4gIGN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UXRpVmFyaWFibGVKU09OKGlucHV0OiBRdGlWYXJpYWJsZUpTT04pOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgZm9yIChjb25zdCB0b3BMZXZlbEtleSBpbiBpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KHRvcExldmVsS2V5KSkge1xuICAgICAgICBjb25zdCBuZXN0ZWRPYmplY3QgPSBpbnB1dFt0b3BMZXZlbEtleSBhcyAnbGlzdCcgfCAnYmFzZSddO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICBpZiAobmVzdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KG5lc3RlZEtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXN0ZWRPYmplY3RbbmVzdGVkS2V5IGFzIGtleW9mIHR5cGVvZiBuZXN0ZWRPYmplY3RdO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKFN0cmluZyk7IC8vIENvbnZlcnQgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7IC8vIENvbnZlcnQgdGhlIHNpbmdsZSB2YWx1ZSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDaGVja2luZygpOiB2b2lkIHtcbiAgICAvLyBiZWNhdXNlIHRoZSBwY2kgZG9lc24ndCBoYXZlIGEgbWV0aG9kIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHdlJ2xsIHVzZSBhbiBpbnRlcnZhbFxuICAgIC8vIHRvIGNoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgY2hhbmdlZC4gSWYgY2hhbmdlZCB3ZSdsbCBzYXZlIHRoZSByZXNwb25zZVxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IG5ld1Jlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkICE9PSB0aGlzLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBzdHJpbmdpZmllZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnZlcnRRdGlWYXJpYWJsZUpTT04obmV3UmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ2hlY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7IC8vIEZPUiBOT1dcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIE9ubHkgc2V0IHN0YXRlIGlzIHN1cHBvcnRlZCBpbiBhIFBDSVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2U7XG4gIH1cblxuICBnZXRUQU9Db25maWcobm9kZSkge1xuICAgIGNvbnN0IGEgPSBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Byb3BlcnRpZXMnKTtcbiAgICBsZXQgY29uZmlnID0ge307XG5cbiAgICBjb25zdCBnZXRQcm9wZXJ0eVZhbHVlID0gZWwgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB7fTtcbiAgICAgIGNvbnN0IGtleSA9IGVsLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbC5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IGFsbEtleSA9IGNoaWxkcmVuLm1hcCgoYzogSFRNTEVsZW1lbnQpID0+IGMuZ2V0QXR0cmlidXRlKCdrZXknKSk7XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBhbGxLZXkubGVuZ3RoID4gMCAmJiAhYWxsS2V5LmZpbmQoayA9PiAhTnVtYmVyLmlzSW50ZWdlcigraykpO1xuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBjaGlsZHJlbi5tYXAoYyA9PiBnZXRDaGlsZFByb3BlcnRpZXMoYykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSBlbC50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRDaGlsZFByb3BlcnRpZXMgPSAoZWwpOiB7fSB8IHZvaWQgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWwuY2hpbGRyZW4pIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzID0geyAuLi5wcm9wZXJ0aWVzLCAuLi5nZXRQcm9wZXJ0eVZhbHVlKGNoaWxkKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnRpZXMgb2YgYSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydGllcy5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgY29uZmlnID0geyAuLi5jb25maWcsIC4uLmdldENoaWxkUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0NhbiBub3QgZmluZCBxdGktY3VzdG9tLWludGVyYWN0aW9uIGNvbmZpZycpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVnaXN0ZXIocGNpOiBJTVNwY2k8dW5rbm93bj4pIHtcbiAgICB0aGlzLnBjaSA9IHBjaTtcblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ1FUSS1DVVNUT00tSU5URVJBQ1RJT04nID8gJ1RBTycgOiAnSU1TJztcbiAgICBjb25zdCBkb206IEhUTUxFbGVtZW50ID1cbiAgICAgIHR5cGUgPT0gJ0lNUycgPyB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tYXJrdXAnKSA6IHRoaXMucXVlcnlTZWxlY3RvcignbWFya3VwJyk7XG4gICAgZG9tLmNsYXNzTGlzdC5hZGQoJ3F0aS1jdXN0b21JbnRlcmFjdGlvbicpO1xuXG4gICAgaWYgKHR5cGUgPT0gJ1RBTycgJiYgdGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykpIHtcbiAgICAgICh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSBhcyBIVE1MRWxlbWVudCkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IGFueSA9XG4gICAgICB0eXBlID09ICdJTVMnXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5kYXRhc2V0LFxuICAgICAgICAgICAgb25yZWFkeTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb25yZWFkeScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiB0aGlzLmdldFRBT0NvbmZpZyh0aGlzKTtcbiAgICBpZiAodHlwZSA9PSAnSU1TJykge1xuICAgICAgcGNpLmdldEluc3RhbmNlKGRvbSwgY29uZmlnLCB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAocGNpIGFzIGFueSkuaW5pdGlhbGl6ZSh0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsIGRvbS5maXJzdEVsZW1lbnRDaGlsZCwgY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gJ1RBTycpIHtcbiAgICAgIGNvbnN0IGxpbmtzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmsnKSkubWFwKGFjYyA9PiBhY2MuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgbGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBzdHlsZXMucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBzdHlsZXMudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICBzdHlsZXMuaHJlZiA9IGxpbms7XG4gICAgICAgIGRvbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRDaGVja2luZygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGRlZmluZSgncXRpQ3VzdG9tSW50ZXJhY3Rpb25Db250ZXh0JywgKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVnaXN0ZXI6IGN0eEEgPT4ge1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY3R4QSk7XG4gICAgICAgIH0sXG4gICAgICAgIG5vdGlmeVJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgLyogb25seSB1c2VkIGluIHRoZSBUQU8gdmVyc2lvbiAqL1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5idWlsZFJlcXVpcmVDb25maWcoKTtcbiAgICBjb25zdCByZXF1aXJlUENJID0gcmVxdWlyZWpzLmNvbmZpZyhjb25maWcpO1xuICAgIHJlcXVpcmVQQ0koWydyZXF1aXJlJ10sIHJlcXVpcmUgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1keW5hbWljLXJlcXVpcmVcbiAgICAgIHJlcXVpcmUoW3RoaXMubW9kdWxlXSk7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHJlcXVpcmVqcy51bmRlZih0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIpO1xuICAgIC8vIENsZWFyIHRoZSBtb2R1bGVzIGluIHRoZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dCA9IHJlcXVpcmVqcy5zLmNvbnRleHRzO1xuICAgIGRlbGV0ZSBjb250ZXh0W3RoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcl07XG4gICAgdGhpcy5zdG9wQ2hlY2tpbmcoKTtcbiAgfVxuXG4gIGJ1aWxkUmVxdWlyZUNvbmZpZygpIHtcbiAgICAvLyBTZXQgUmVxdWlyZUpTIHBhdGhzIGFuZCBzaGltIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgY29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnID0ge1xuICAgICAgY29udGV4dDogdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLFxuICAgICAgY2F0Y2hFcnJvcjogdHJ1ZSxcbiAgICAgIHBhdGhzOiB3aW5kb3dbJ3JlcXVpcmVQYXRocyddIHx8IHt9LFxuICAgICAgc2hpbTogd2luZG93WydyZXF1aXJlU2hpbSddIHx8IHt9XG4gICAgfTtcbiAgICAvLyBDaGVjayBpZiBSZXF1aXJlSlMgaXMgYXZhaWxhYmxlLCBpZiBub3QsIHNldCBhbiBlcnJvciBtZXNzYWdlXG4gICAgaWYgKCFnbG9iYWxUaGlzLnJlcXVpcmUpIHtcbiAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGBSZXF1aXJlSlMgbm90IGZvdW5kLiBQbGVhc2UgbG9hZCBpdCB2aWEgQ0ROOiBodHRwczovL2NkbmpzLmNvbS9saWJyYXJpZXMvcmVxdWlyZS5qc2A7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtdXJsJyk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb25Nb2R1bGVzID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlcycpO1xuXG4gICAgaWYgKGludGVyYWN0aW9uTW9kdWxlcykge1xuICAgICAgY29uc3QgbW9kdWxlcyA9IGludGVyYWN0aW9uTW9kdWxlcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlJyk7XG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZUlkID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVBhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnZmFsbGJhY2stcGF0aCcpO1xuXG4gICAgICAgIGlmIChtb2R1bGVJZCAmJiBwcmltYXJ5UGF0aCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHMgdXNpbmcgUmVxdWlyZUpTJ3MgZmFsbGJhY2sgYXJyYXlcbiAgICAgICAgICBjb25zdCBwYXRocyA9IGZhbGxiYWNrUGF0aFxuICAgICAgICAgICAgPyB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgocHJpbWFyeVBhdGgsIGJhc2VVcmwpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgoZmFsbGJhY2tQYXRoLCBiYXNlVXJsKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgocHJpbWFyeVBhdGgsIGJhc2VVcmwpO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aCA9IGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gfHwgW107XG4gICAgICAgICAgY29uZmlnLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoZXhpc3RpbmdQYXRoLCBwYXRocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMocGF0aDE6IHN0cmluZyB8IHN0cmluZ1tdLCBwYXRoMjogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYXRoMUFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMSkgPyBwYXRoMSA6IFtwYXRoMV07XG4gICAgY29uc3QgcGF0aDJBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDIpID8gcGF0aDIgOiBbcGF0aDJdO1xuICAgIHJldHVybiBwYXRoMUFycmF5LmNvbmNhdChwYXRoMkFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG4gIH1cblxuICBsb2FkQ29uZmlnID0gYXN5bmMgKHVybDogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogUHJvbWlzZTxNb2R1bGVSZXNvbHV0aW9uQ29uZmlnPiA9PiB7XG4gICAgdXJsID0gdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKHVybCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVDb25maWcgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgaWYgKHJlcXVpcmVDb25maWcub2spIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVxdWlyZUNvbmZpZy5qc29uKCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmcgPSBjb25maWcgYXMgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZztcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGVJZCBpbiBtb2R1bGVDb25nLnBhdGhzKSB7XG4gICAgICAgICAgaWYgKGJhc2VVcmwpIHtcbiAgICAgICAgICAgIG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSwgYmFzZVVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVDb25nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcgPSAocGF0aDogc3RyaW5nLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLmpzJC8sICcnKTtcbiAgICByZXR1cm4gcGF0aD8udG9Mb2NhbGVMb3dlckNhc2UoKS5zdGFydHNXaXRoKCdodHRwJykgfHwgIWJhc2VQYXRoXG4gICAgICA/IHBhdGhcbiAgICAgIDogdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKGAke2Jhc2VQYXRofS8ke3BhdGh9YCk7XG4gIH07XG5cbiAgZ2V0UmVzb2x2YWJsZVBhdGggPSAocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aClcbiAgICAgID8gcGF0aC5tYXAocCA9PiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHAsIGJhc2VQYXRoKSlcbiAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwYXRoLCBiYXNlUGF0aCk7XG4gIH07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD4ke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIH0gZnJvbSAnLi4vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsXG4gIHRydWUsXG4gICcuZGwnXG4pIHtcbiAgQHN0YXRlKCkgcHJpdmF0ZSBfY2hpbGRyZW5NYXA6IEVsZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUhhbmRsZXI6IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIgPSB0aGlzLl9yZWdpc3RlckNob2ljZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNob2ljZShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBjb25zdCBjaG9pY2UgPSBldmVudC50YXJnZXQgYXMgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgICB0aGlzLl9jaGlsZHJlbk1hcC5wdXNoKGNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICAgIDxkaXYgcGFydD1cImRyb3AtY29udGFpbmVyXCI+XG4gICAgICAgICR7dGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoID4gMCAmJlxuICAgICAgICBBcnJheS5mcm9tKEFycmF5KE1hdGguY2VpbCh0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggLyAyKSkua2V5cygpKS5tYXAoXG4gICAgICAgICAgKF8sIGluZGV4KSA9PlxuICAgICAgICAgICAgaHRtbGA8ZGl2IHBhcnQ9XCJhc3NvY2lhYmxlcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwibGVmdCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9sZWZ0XCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cInJpZ2h0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X3JpZ2h0XCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5gO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nOiBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUb3VjaERyYWdBbmREcm9wIHtcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0VGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0UG9pbnQgPSBudWxsOyAvLyBQb2ludCBvZiB0aGUgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSBsYXN0Q2xpY2tUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBjbGlja1xuICBwcml2YXRlIGlzRHJhZ2dhYmxlID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnZ2FibGUgZWxlbWVudCBpcyBhY3RpdmVcbiAgcHJpdmF0ZSBkcmFnU291cmNlOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRoZSBzb3VyY2UgZWxlbWVudCBiZWluZyBkcmFnZ2VkXG4gIHByaXZhdGUgZHJhZ0Nsb25lOiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIENsb25lIG9mIGRyYWcgc291cmNlIGZvciB2aXN1YWwgZmVlZGJhY2tcbiAgcHJpdmF0ZSB0b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlOyAvLyBGbGFnIGZvciB0b3VjaEVuZCBldmVudFxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWcgb3BlcmF0aW9uIGlzIG9uZ29pbmdcbiAgcHJpdmF0ZSBpbml0aWFsVHJhbnNmb3JtID0gJyc7IC8vIE9yaWdpbmFsIHRyYW5zZm9ybSBzdHlsZVxuICBwcml2YXRlIGhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTsgLy8gRmxhZyB0byBlbnN1cmUgZHJhZ3N0YXJ0IGV2ZW50IGlzIGRpc3BhdGNoZWQgb25jZVxuICBwcml2YXRlIHJvb3ROb2RlOiBOb2RlID0gbnVsbDsgLy8gUm9vdCBub2RlIGZvciBib3VuZGFyeSBjYWxjdWxhdGlvbnNcblxuICBwcml2YXRlIGZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGw7IC8vIFRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGRyYWdnYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgZm9jdXNhYmxlRHJvcFpvbmVzOiBIVE1MRWxlbWVudFtdID0gW107IC8vIEFsbCBkcm9wem9uZXMgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBJbmRleCBmb3IgdGFiYmluZyB0aHJvdWdoIGRyb3Agem9uZXNcblxuICBwcml2YXRlIGRhdGFUcmFuc2ZlciA9IHtcbiAgICBkYXRhOiB7fSxcbiAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgIH0sXG4gICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgIH0sXG4gICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gIH07XG4gIHByaXZhdGUgY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTsgLy8gT2Zmc2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJhZyBjbG9uZVxuXG4gIHByaXZhdGUgbGFzdFRhcmdldCA9IG51bGw7IC8vIExhc3QgdG91Y2ggdGFyZ2V0XG4gIHByaXZhdGUgY3VycmVudERyb3BUYXJnZXQgPSBudWxsOyAvLyBDdXJyZW50IGRyb3BwYWJsZSBlbGVtZW50XG4gIHByaXZhdGUgYWxsb3dDbGljayA9IHRydWU7IC8vIEZsYWcgdG8gYWxsb3cgb3IgcHJldmVudCBjbGlja1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBjb3B5U3R5bGVzRm9yRHJhZ0Nsb25lID0gdHJ1ZTtcbiAgZHJhZ09uQ2xpY2tFbmFibGVkID0gZmFsc2U7XG4gIHVzZURyYWdDbG9uZSA9IGZhbHNlOyAvLyBTZXQgdG8gdHJ1ZSB0byBkcmFnIHdpdGggYSBjbG9uZTsgc2V0IHRvIGZhbHNlIHRvIGRyYWcgdGhlIG9yaWdpbmFsIGVsZW1lbnRcblxuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9EUkFHX0RJU1RBTkNFID0gNTsgLy8gTWluaW11bSBwaXhlbCBtb3ZlbWVudCB0byBzdGFydCBkcmFnZ2luZ1xuICBwcml2YXRlIHJlYWRvbmx5IERSQUdfQ0xPTkVfT1BBQ0lUWSA9IDE7IC8vIE9wYWNpdHkgb2YgdGhlIGRyYWcgY2xvbmUgZWxlbWVudFxuICBpbml0aWFsVHJhbnNpdGlvbjogc3RyaW5nO1xuICAvLyBkcm9wcGFibGVzOiBFbGVtZW50W107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlO1xuICAgIH1cbiAgICBUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlID0gdGhpcztcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMgZm9yIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuaGFuZGxlVG91Y2hDYW5jZWwuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmhhbmRsZUtleVVwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlczogRWxlbWVudFtdKSB7XG4gICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGFkZERyb3BwYWJsZUVsZW1lbnRzKGRyb3BwYWJsZXM6IEVsZW1lbnRbXSkge1xuICAvLyAgIC8vIHRoaXMuZHJvcHBhYmxlcyA9IGRyb3BwYWJsZXM7XG4gIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgLy8gICAgIGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOyAvLyBNYWtlIGRyYWdnYWJsZSBlbGVtZW50cyBmb2N1c2FibGVcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBlbCBhcyBIVE1MRWxlbWVudCkpO1xuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gbnVsbCkpO1xuXG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSB7IHgsIHkgfTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG5cbiAgICAvLyBHZXQgdGhlIHJvb3Qgbm9kZVxuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Um9vdE5vZGUoKTtcblxuICAgIGlmICh0aGlzLmRyYWdPbkNsaWNrRW5hYmxlZCkge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBTYXZlIGluaXRpYWwgdHJhbnNmb3JtXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtID09PSAnbm9uZScgPyAnJyA6IGNvbXB1dGVkU3R5bGUudHJhbnNmb3JtO1xuXG4gICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gY29tcHV0ZWRTdHlsZS50cmFuc2l0aW9uIHx8ICcnO1xuXG4gICAgICAvLyBEaXNhYmxlIHRyYW5zaXRpb25zXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcblxuICAgICAgLy8gQ2FsY3VsYXRlIGNsb25lIG9mZnNldFxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHggLSByZWN0LmxlZnQ7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB5IC0gcmVjdC50b3A7XG5cbiAgICAgIC8vIFNldCBoaWdoZXIgei1pbmRleCB0byBicmluZyBpdCBvbiB0b3BcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnOTk5OSc7XG4gICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5mb2N1cygpO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnYWJsZSAmJiB0aGlzLmRyYWdTb3VyY2UpIHtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgICAgY29uc3QgY3VycmVudFRvdWNoID0geyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH07XG5cbiAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZURyYWdEaXN0YW5jZShjdXJyZW50VG91Y2gpID49IHRoaXMuTUlOX0RSQUdfRElTVEFOQ0UpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAvLyBFeGlzdGluZyBjb2RlIGZvciBjcmVhdGluZyBhbmQgaGFuZGxpbmcgdGhlIGRyYWcgY2xvbmVcbiAgICAgIGlmICghdGhpcy5kcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSB0aGlzLkRSQUdfQ0xPTkVfT1BBQ0lUWS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZSA9IHRoaXMuZHJhZ1NvdXJjZS5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuY29weVN0eWxlc0ZvckRyYWdDbG9uZSkge1xuICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kcmFnU291cmNlKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIGNvbXB1dGVkU3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZVtzdHlsZV0gPSBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIHRoZSBkcmFnIGNsb25lIHRvIHRoZSByb290IG5vZGVcbiAgICAgICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBob3N0IG9mIHRoZSBzaGFkb3cgcm9vdFxuICAgICAgICAgIHRoaXMucm9vdE5vZGUuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5zZXREcmFnQ2xvbmVTdHlsZXMoY3VycmVudFRvdWNoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBkcmFnZ2luZyB0aGUgb3JpZ2luYWwgZWxlbWVudCB1c2luZyBDU1MgdHJhbnNmb3Jtc1xuICAgICAgaWYgKHRoaXMudG91Y2hTdGFydFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGRlbHRhWCA9IGN1cnJlbnRUb3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueDtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55O1xuXG4gICAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgICAgLy8gY29uc3QgeyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH0gPSB0aGlzLmFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2JvdW5kZWREZWx0YVh9cHgsICR7Ym91bmRlZERlbHRhWX1weClgO1xuXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSBgJHt0aGlzLmluaXRpYWxUcmFuc2Zvcm19IHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpYDtcblxuICAgICAgICBpZiAoIXRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCkge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgICAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFRhcmdldCA9IHRoaXMuZmluZERyb3BUYXJnZXQoZSk7XG5cbiAgICBpZiAoZHJvcFRhcmdldCAhPT0gdGhpcy5sYXN0VGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdlbnRlcicpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMubGFzdFRhcmdldCwgJ2RyYWdsZWF2ZScpO1xuICAgICAgdGhpcy5sYXN0VGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gZHJvcFRhcmdldDtcbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnb3ZlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaEVuZChlKSB7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IHRydWU7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGxldCBkcm9wRm91bmQgPSBmYWxzZTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdkcm9wRm91bmQnLCBkcm9wRm91bmQpO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIGRyb3BGb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGRyYWdFbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnZHJhZ2VuZCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGRyYWdFbmRFdmVudFsnZGF0YVRyYW5zZmVyJ10gPSB7IGRyb3BFZmZlY3Q6ICdub25lJyB9O1xuICAgICAgdGhpcy5kcmFnU291cmNlPy5kaXNwYXRjaEV2ZW50KGRyYWdFbmRFdmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZShkcm9wRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaENhbmNlbChlKSB7XG4gICAgdGhpcy5yZXNldERyYWdTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFRhcmdldChldmVudCkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50KTtcbiAgICByZXR1cm4gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChkb2N1bWVudCwgeCwgeSk7XG4gIH1cblxuICBwcml2YXRlIGdldERyb3BUYXJnZXRBdFBvaW50KHJvb3Q6IERvY3VtZW50T3JTaGFkb3dSb290LCB4OiBudW1iZXIsIHk6IG51bWJlciwgZGVwdGg6IG51bWJlciA9IDApOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgLy8gTGltaXQgdGhlIHJlY3Vyc2lvbiBkZXB0aFxuICAgIGNvbnN0IE1BWF9ERVBUSCA9IDI7XG4gICAgaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gcm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIGFuIGFuY2VzdG9yIHdpdGggJ2Ryb3B6b25lJyBhdHRyaWJ1dGVcbiAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBTaGFkb3cgRE9NIGFuZCBkZXB0aCBsaW1pdCBub3QgcmVhY2hlZCwgdHJhdmVyc2UgaXRcbiAgICBpZiAoZWxlbWVudC5zaGFkb3dSb290ICYmIGRlcHRoIDwgTUFYX0RFUFRIKSB7XG4gICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gdGhpcy5nZXREcm9wVGFyZ2V0QXRQb2ludChlbGVtZW50LnNoYWRvd1Jvb3QsIHgsIHksIGRlcHRoICsgMSk7XG4gICAgICBpZiAoc2hhZG93RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gc2hhZG93RWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyBlbGVtZW50IHdpdGggJ2Ryb3B6b25lJyBmb3VuZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5mb2N1c2VkRWxlbWVudCkge1xuICAgICAgaWYgKGUua2V5ID09PSAnICcgJiYgIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIHRvIHN0YXJ0IGRyYWdnaW5nXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZSA9IHRoaXMuZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgLy8gU3RvcmUgdGhlIGRyb3Agem9uZXMgZm9yIG5hdmlnYXRpb25cbiAgICAgICAgdGhpcy5jb2xsZWN0RHJvcFpvbmVzKCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ1RhYicgJiYgdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFRhYiBrZXkgdG8gbmF2aWdhdGUgdGhyb3VnaCBkcm9wIHpvbmVzXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlVG9OZXh0RHJvcFpvbmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleVVwKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiB0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCBhZ2FpbiB0byBkcm9wIHRoZSBlbGVtZW50XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29sbGVjdERyb3Bab25lcygpIHtcbiAgICAvLyBDb2xsZWN0IGFsbCBlbGVtZW50cyB3aXRoIGRyb3B6b25lIGF0dHJpYnV0ZVxuICAgIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJvcHpvbmVdJykpIGFzIEhUTUxFbGVtZW50W107IC8vIEFycmF5LmZyb20odGhpcy5kcm9wcGFibGVzKTtcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIFJlc2V0IG5hdmlnYXRpb24gaW5kZXhcbiAgfVxuXG4gIHByaXZhdGUgbW92ZVRvTmV4dERyb3Bab25lKCkge1xuICAgIGlmICh0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFVwZGF0ZSBpbmRleCBmb3IgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9ICh0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ICsgMSkgJSB0aGlzLmZvY3VzYWJsZURyb3Bab25lcy5sZW5ndGg7XG5cbiAgICAvLyBGb2N1cyB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICBjb25zdCBuZXh0RHJvcFpvbmUgPSB0aGlzLmZvY3VzYWJsZURyb3Bab25lc1t0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4XTtcbiAgICBuZXh0RHJvcFpvbmUuZm9jdXMoKTtcblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGRyb3AgdGFyZ2V0XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG5leHREcm9wWm9uZTtcblxuICAgIC8vIERpc3BhdGNoIGRyYWdlbnRlciBldmVudFxuICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChuZXh0RHJvcFpvbmUsICdkcmFnZW50ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCwgcGFnZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzID8gZXZlbnQudG91Y2hlc1swXSA6IGV2ZW50O1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwYWdlID8gdG91Y2gucGFnZVggOiB0b3VjaC5jbGllbnRYLFxuICAgICAgeTogcGFnZSA/IHRvdWNoLnBhZ2VZIDogdG91Y2guY2xpZW50WVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueCA9IHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgdGhpcy5jbG9uZU9mZnNldC55ID0gdG91Y2guY2xpZW50WSAtIHJlY3QudG9wO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREcmFnQ2xvbmVTdHlsZXModG91Y2gpIHtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7dG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueX1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke3RvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lnh9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUuekluZGV4ID0gJzk5OTk5OSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkIHx8ICF0aGlzLmRyYWdDbG9uZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBuZXdMZWZ0ID0gdG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueDtcbiAgICAgIGNvbnN0IG5ld1RvcCA9IHRvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnk7XG5cbiAgICAgIC8vIEFwcGx5IGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9ID0gdGhpcy5hcHBseUJvdW5kYXJpZXMobmV3TGVmdCwgbmV3VG9wLCB0aGlzLmRyYWdDbG9uZSk7XG5cbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHtib3VuZGVkTGVmdH1weGA7XG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHtib3VuZGVkVG9wfXB4YDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgYW5kIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3RlbnRpYWwgbmV3IHBvc2l0aW9uXG4gICAgY29uc3QgbmV3TGVmdCA9IGVsZW1lbnRSZWN0LmxlZnQgKyBkZWx0YVg7XG4gICAgY29uc3QgbmV3VG9wID0gZWxlbWVudFJlY3QudG9wICsgZGVsdGFZO1xuXG4gICAgLy8gTGltaXQgdGhlIG5ldyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGVkIGRlbHRhIHZhbHVlc1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVggPSBib3VuZGVkTGVmdCAtIGVsZW1lbnRSZWN0LmxlZnQ7XG4gICAgY29uc3QgYm91bmRlZERlbHRhWSA9IGJvdW5kZWRUb3AgLSBlbGVtZW50UmVjdC50b3A7XG5cbiAgICByZXR1cm4geyBib3VuZGVkRGVsdGFYLCBib3VuZGVkRGVsdGFZIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0OiBudW1iZXIsIG5ld1RvcDogbnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIEdldCB0aGUgYm91bmRhcmllcyBvZiB0aGUgcm9vdCBub2RlXG4gICAgbGV0IGJvdW5kYXJ5UmVjdDogRE9NUmVjdDtcbiAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IHRoaXMucm9vdE5vZGUuaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZpZXdwb3J0XG4gICAgICBib3VuZGFyeVJlY3QgPSBuZXcgRE9NUmVjdCgwLCAwLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZWxlbWVudFJlY3Qud2lkdGg7XG4gICAgY29uc3QgZWxlbWVudEhlaWdodCA9IGVsZW1lbnRSZWN0LmhlaWdodDtcblxuICAgIC8vIExpbWl0IHRoZSBuZXdMZWZ0IGFuZCBuZXdUb3Agd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIHJldHVybiB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKHRvdWNoKTogbnVtYmVyIHtcbiAgICBjb25zdCB4RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54KTtcbiAgICBjb25zdCB5RGlzdCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLnRvdWNoU3RhcnRQb2ludC55KTtcbiAgICByZXR1cm4geERpc3QgKyB5RGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2hDdXN0b21FdmVudChlbGVtZW50LCBldmVudFR5cGUsIGJ1YmJsZSA9IHRydWUpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudFR5cGUsIHsgYnViYmxlczogYnViYmxlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgIGV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHRoaXMuZGF0YVRyYW5zZmVyO1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgaWYgKHRoaXMudXNlRHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gJzEuMCc7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lPy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc3R5bGVzXG4gICAgICAgIGlmICghZHJvcEZvdW5kKSB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS56SW5kZXggPSAnJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuaW5pdGlhbFRyYW5zaXRpb247XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gcHJvcGVydHlcbiAgICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5kcmFnQ2xvbmUgPSBudWxsO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IG51bGw7XG4gICAgdGhpcy50b3VjaEVuZFRyaWdnZXJlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyID0ge1xuICAgICAgZGF0YToge30sXG4gICAgICBzZXREYXRhKHR5cGUsIHZhbCkge1xuICAgICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgICB9LFxuICAgICAgZ2V0RGF0YSh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgICB9LFxuICAgICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gICAgfTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4gICAgdGhpcy5sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbFRyYW5zZm9ybSA9ICcnO1xuICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb290Tm9kZSA9IG51bGw7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgRHJvcHBhYmxlc0ludGVyZmFjZSB7fVxuXG5leHBvcnQgY29uc3QgRHJvcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICB1c2VTaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyb3BwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gdGhpcy5nZXREcm9wcGFibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRXZlbnRIYW5kbGVycygpO1xuICAgICAgZHJvcHBhYmxlcy5mb3JFYWNoKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgIHRoaXMucHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgICB0aGlzLm9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTogRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290ID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdvdmVySGFuZGxlciA9IHRoaXMuZHJhZ292ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIgPSB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2VudGVySGFuZGxlciA9IHRoaXMuZHJhZ2VudGVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcm9wSGFuZGxlciA9IHRoaXMuZHJvcEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5kcmFnbGVhdmVIYW5kbGVyKTtcbiAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9ic2VydmVEcm9wcGFibGVBdHRyaWJ1dGVzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCh7IGF0dHJpYnV0ZU5hbWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyb3BwYWJsZSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBkaXNhYmxlZCA9IGRyb3BwYWJsZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnZW50ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnb3ZlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRyb3BIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGV2LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLmZpbmREcmFnZ2FibGUoaWRlbnRpZmllcik7XG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSk7XG5cbiAgICAgIGlmICghZHJhZ2dhYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZHJhZ2dhYmxlICYmICF0aGlzLmlzVmFsaWREcm9wKGRyb3BwYWJsZSwgZHJhZ2dhYmxlKSkge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5tb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlLCBkcm9wcGFibGUpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJhZ2dhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApIHx8IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2lkZW50aWZpZXJ9XWApXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZERyb3AoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCwgZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICE9PSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtb3ZlRHJhZ2dhYmxlVG9Ecm9wcGFibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG5cbiAgICAgICAgLy8gY2hlY2tNYXhBc3NvY2lhdGlvbnMgYW5kIHNhdmVSZXNwb25zZSBhcmUgZGVmaW5lZC9vdmVycmlkZGVuIGluIGEgbWl4aW5cbiAgICAgICAgdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgICAgICB0aGlzWydzYXZlUmVzcG9uc2UnXShudWxsKTsgLy9cbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG5cbiAgICAgIC8vIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkcmFnbGVhdmVIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyb3BwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPERyb3BwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiLy8gVEhJUyBJUyBBIE1JWElOLCBUSElTIElTIEEgTUlYSU5cbi8vIFVTRSBMSUtFIFRISVNcbi8vIGBgYGNsYXNzIERyb3BMaXN0IGV4dGVuZHMgRmxpcHBhYmxlcyhMaXRFbGVtZW50KSB7YGBgXG4vLyBtaXhpbiB3aGljaCBhbmltYXRlcyBjaGlsZHJlbiB3aXRoIEZMSVBcbi8vIGEgY29tYmluYXRpb24gYmV0d2VlbiB0aGlzIGRpcmVjdGl2ZTpcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG4vLyBhbmQgYSB0dXRvcmlhbCBob3cgdG8gbWFrZSBhIG1peGluXG4vLyBodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb3NpdGlvbi9taXhpbnMvXG5cbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEZsaXBwYWJsZXNJbnRlcmZhY2Uge1xuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xufVxuXG4vLyBqdXN0IGEgY29udmVyc2lvbiBvZiBhIGFuZ3VsYXIgRkxJUCBkaXJlY3RpdmUsIG1hZGUgYXMgYSBNaXhpblxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbmV4cG9ydCBjb25zdCBGbGlwcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyb3BwYWJsZXNTZWw6IHN0cmluZyxcbiAgZHJhZ2dhYmxlc1NlbDogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRmxpcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICAvLyBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxFbGVtZW50LCBhbnk+KCk7XG4gICAgLy8gcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICAvLyBmbGlwcGFibGVzU2VsZWN0b3I6IHN0cmluZztcbiAgICAvLyBvdmVycmlkZSBhc3luYyBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKSB7XG4gICAgLy8gICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOyAvLyBwazogdGhpcyBpcyB0aGUga2V5IHRvIGNhbGN1bGF0ZSBjb3JyZWN0IHByb3BvcnRpb25zXG4gICAgLy8gICBjb25zdCBkcmFnZ2FibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJhZ2dhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJhZ2dhYmxlcy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYW5pbWF0ZU1lKTtcbiAgICAvLyAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsKSk7XG4gICAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goKGRyYWdnYWJsZSkgPT4ge1xuICAgIC8vICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJhZ2dhYmxlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgLy8gfVxuICAgIC8vIHByaXZhdGUgYW5pbWF0ZU1lID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zdGF0ZS5mb3JFYWNoKCh2YWx1ZSwgZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhdGUuZ2V0KGVsZW0pID09IG51bGwpIHtcbiAgICAvLyAgICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBjb25zdCBjYWNoZSA9IHRoaXMuc3RhdGUuZ2V0KGVsZW0pO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVggPSBjYWNoZS5sZWZ0IC0gbGVmdDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFZID0gY2FjaGUudG9wIC0gdG9wO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVcgPSBjYWNoZS53aWR0aCAvIHdpZHRoO1xuICAgIC8vICAgICBjb25zdCBkZWx0YUggPSBjYWNoZS5oZWlnaHQgLyBoZWlnaHQ7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICBjb25zdCB7IGR1cmF0aW9uLCBlYXNpbmcgfSA9IHsgZHVyYXRpb246IDM1MCwgZWFzaW5nOiAnY3ViaWMtYmV6aWVyKDAuMjYsIDAuODYsIDAuNDQsIDAuOTg1KScgfTtcbiAgICAvLyAgICAgZWxlbS5hbmltYXRlKFxuICAgIC8vICAgICAgIFtcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06IGBcbiAgICAvLyB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KVxuICAgIC8vIHNjYWxlKCR7ZGVsdGFXfSwgJHtkZWx0YUh9KVxuICAgIC8vIGAsXG4gICAgLy8gICAgICAgICAgIC8vIHdpZHRoOiBjYWNoZS53aWR0aCxcbiAgICAvLyAgICAgICAgICAgLy8gaGVpZ2h0OiBjYWNoZS5oZWlnaHQrICdweCcsXG4gICAgLy8gICAgICAgICAgIC8vIG9wYWNpdHk6IGNhY2hlLm9wYWNpdHksXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJ25vbmUnLFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICBdLFxuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGR1cmF0aW9uLFxuICAgIC8vICAgICAgICAgZWFzaW5nLFxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH07XG4gICAgLy8gb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgLy8gfVxuICB9XG4gIHJldHVybiBGbGlwcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxGbGlwcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BwYWJsZXNNaXhpbiB9IGZyb20gJy4vZHJvcHBhYmxlcy1taXhpbic7XG5pbXBvcnQgeyBGbGlwcGFibGVzTWl4aW4gfSBmcm9tICcuL2ZsaXBwYWJsZXMtbWl4aW4nO1xuXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGxpdmVRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvbGl2ZS1xdWVyeSc7XG5pbXBvcnQgeyBUb3VjaERyYWdBbmREcm9wIH0gZnJvbSAnLi9kcmFnLWRyb3AtYXBpJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5pbnRlcmZhY2UgSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbjtcbiAgZHJhZ0NhbkJlUGxhY2VkQmFjazogYm9vbGVhbjtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyYWdnYWJsZXNTZWxlY3Rvcjogc3RyaW5nLFxuICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlczogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBleHRlbmRzIEZsaXBwYWJsZXNNaXhpbihcbiAgICBEcm9wcGFibGVzTWl4aW4oc3VwZXJDbGFzcywgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXMsIGRyb3BwYWJsZXNTZWxlY3RvciksXG4gICAgZHJvcHBhYmxlc1NlbGVjdG9yLFxuICAgIGRyYWdnYWJsZXNTZWxlY3RvclxuICApIHtcbiAgICBwcm90ZWN0ZWQgZHJhZ2dhYmxlcyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIHsgcGFyZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PigpO1xuICAgIHByb3RlY3RlZCBkcm9wcGFibGVzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlLCB0eXBlOiBPYmplY3QgfSkgY29uZmlndXJhdGlvbjogSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uID0ge1xuICAgICAgY29weVN0eWxlc0RyYWdDbG9uZTogdHJ1ZSxcbiAgICAgIGRyYWdDYW5CZVBsYWNlZEJhY2s6IHRydWUsXG4gICAgICBkcmFnT25DbGljazogZmFsc2VcbiAgICB9O1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWluLWFzc29jaWF0aW9ucycgfSkgbWluQXNzb2NpYXRpb25zID0gMTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21heC1hc3NvY2lhdGlvbnMnIH0pIG1heEFzc29jaWF0aW9ucyA9IDE7XG5cbiAgICBAbGl2ZVF1ZXJ5KGRyYWdnYWJsZXNTZWxlY3RvcilcbiAgICBoYW5kbGVEcmFnZ2FibGVzQ2hhbmdlKGRyYWdzQWRkZWQ6IEhUTUxFbGVtZW50W10sIGRyYWdzUmVtb3ZlZDogRWxlbWVudFtdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBjb25zdCBuZXdEcmFnZ2FibGVzID0gdGhpcy5maWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ3NBZGRlZCk7XG5cbiAgICAgIGlmIChuZXdEcmFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZGROZXdEcmFnZ2FibGVzKG5ld0RyYWdnYWJsZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJvcHBhYmxlcygpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJhZ0Ryb3BBcGkoKSB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50PigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJFeGlzdGluZ0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IEhUTUxFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIGRyYWdnYWJsZXMuZmlsdGVyKGQgPT4gIXRoaXMuZHJhZ2dhYmxlcy5oYXMoZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTmV3RHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXMpO1xuICAgICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGRyYWdnYWJsZSA9PiB0aGlzLnN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5mcm9tKGRyYWdnYWJsZS5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGRyYWdnYWJsZSk7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuc2V0KGRyYWdnYWJsZSwge1xuICAgICAgICBwYXJlbnQ6IGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LFxuICAgICAgICBpbmRleFxuICAgICAgfSk7XG4gICAgICBkcmFnZ2FibGUuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gYGRyYWctJHtpbmRleH0tJHt0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8IGNyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICAgIGRyYWdnYWJsZS5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXNcbiAgICAgICAgICA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICAgICA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkcmFnZ2luZycsICcnKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ0VuZCA9IGFzeW5jIChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGRyYWdnYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG4gICAgICBjb25zdCB3YXNEcm9wcGVkID0gYXdhaXQgdGhpcy53YXNEcm9wcGVkKGV2KTtcbiAgICAgIGlmICghd2FzRHJvcHBlZCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmRyYWdDYW5CZVBsYWNlZEJhY2spIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5zZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCAnJykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQucmVtb3ZlQXR0cmlidXRlKCdlbmFibGVkJykpO1xuICAgIH1cblxuICAgIC8vIE1IOiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGlzIGNhbiBiZSB0ZXN0ZWQuXG4gICAgLy8gYmVjYXVzZSBJIGNhbid0IGdldCB0aGUgZHJvcEVmZmVjdCB0byBiZSAnbW92ZScgaW4gdGhlIHRlc3RcbiAgICBwcml2YXRlIGNoZWNrRm9yTW92ZVRlc3RJdGVtID0gKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgIGlmICghZXYuZGF0YVRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBsZXQgaGFzTW92ZVRlc3RJdGVtID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBkYXRhVHJhbnNmZXIgaXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGV2LmRhdGFUcmFuc2Zlci5pdGVtcyk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBpdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGl0ZW1zLCByZXNvbHZlIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5raW5kID09PSAnc3RyaW5nJyAmJiBpdGVtLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaXRlbS5nZXRBc1N0cmluZyhkYXRhID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEgPT09ICdtb3ZlLXRlc3QnKSB7XG4gICAgICAgICAgICAgICAgaGFzTW92ZVRlc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIHByb21pc2UgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgaXRlbXNcbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaXRlbSBpcyBub3QgJ3N0cmluZycsIHN0aWxsIGNvdW50IGRvd24gcGVuZGluZ1xuICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyB3YXNEcm9wcGVkKGV2OiBEcmFnRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IGhhc01vdmVUZXN0SXRlbSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JNb3ZlVGVzdEl0ZW0oZXYpO1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ICE9PSAnbm9uZScgfHwgaGFzTW92ZVRlc3RJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2FzTW92ZWQoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbW92ZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHsgcGFyZW50LCBpbmRleCB9ID0gdGhpcy5kcmFnZ2FibGVzLmdldChkcmFnZ2FibGUpO1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG5cbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgfSk7XG4gICAgICAvLyB0cmFuc2l0aW9uLmZpbmlzaGVkLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gICBkcmFnZ2FibGUuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoZWNrTWF4QXNzb2NpYXRpb25zKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goKGQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG1heE1hdGNoID0gKyhkLmdldEF0dHJpYnV0ZSgnbWF0Y2gtbWF4JykgfHwgMSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBc3NvY2lhdGlvbnMgPSBkLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGlzYWJsZURyb3BwYWJsZSA9IGN1cnJlbnRBc3NvY2lhdGlvbnMgPj0gbWF4TWF0Y2g7XG4gICAgICAgIGlmIChkaXNhYmxlRHJvcHBhYmxlKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRHJvcHBhYmxlKGQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc2FibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Ryb3B6b25lJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVEcm9wcGFibGUoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgIH1cblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgdmFsdWU/LmZvckVhY2goZW50cnkgPT4gdGhpcy5wbGFjZVJlc3BvbnNlKGVudHJ5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwbGFjZVJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IFtkcm9wSWQsIC4uLmRyYWdJZHNdID0gcmVzcG9uc2Uuc3BsaXQoJyAnKS5yZXZlcnNlKCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmZpbmREcm9wcGFibGVCeUlkKGRyb3BJZCk7XG4gICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHRoaXMucGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQsIGRyb3BwYWJsZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyb3BwYWJsZUJ5SWQoaWRlbnRpZmllcjogc3RyaW5nKTogRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbmQoZHJvcCA9PiBkcm9wLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkOiBzdHJpbmcsIGRyb3BwYWJsZTogRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2lkZW50aWZpZXI9JHtkcmFnSWR9XWApO1xuICAgICAgaWYgKCFkcm9wcGFibGUgfHwgIWRyYWdnYWJsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgZmluZCBkcmFnZ2FibGUgb3IgZHJvcHBhYmxlIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB2YWxpZEFzc29jaWF0aW9ucyA9IHRoaXMuZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTtcbiAgICAgIHJldHVybiB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSAwIHx8IHRoaXMubWluQXNzb2NpYXRpb25zIDw9IHZhbGlkQXNzb2NpYXRpb25zO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRBc3NvY2lhdGlvbnMoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmlsdGVyKGQgPT4gZC5jaGlsZEVsZW1lbnRDb3VudCA+IDApLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZVJlc3BvbnNlKCk6IHZvaWQge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0UmVzcG9uc2VEYXRhKCk6IHN0cmluZ1tdIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzXG4gICAgICAgIC5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgICAgICBjb25zdCBkcmFnZ2FibGVzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdnYWJsZXNJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICAgICAgY29uc3QgZHJvcHBhYmxlSWRlbnRpZmllciA9IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICByZXR1cm4gaWRlbnRpZmllcnMubWFwKGlkID0+IGAke2lkfSAke2Ryb3BwYWJsZUlkZW50aWZpZXJ9YCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mbGF0KCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcmVzZXQoc2F2ZSA9IHRydWUpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICBpZiAoc2F2ZSkgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc2V0RHJvcHBhYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVEcmFnZ2FibGUgPSAoZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHZpZXcgdHJhbnNpdGlvbnMgaWYgc3VwcG9ydGVkXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxJSW50ZXJhY3Rpb24+ICYgVDtcbn07XG4iLCAiLy8gQHdhdGNoIGRlY29yYXRvclxuLy9cbi8vIFJ1bnMgd2hlbiBhbiBvYnNlcnZlZCBwcm9wZXJ0eSBjaGFuZ2VzLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLlxuLy9cbi8vIFRvIHdhaXQgZm9yIGFuIHVwZGF0ZSB0byBjb21wbGV0ZSBhZnRlciBhIGNoYW5nZSBvY2N1cnMsIHVzZSBgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZWAgaW4gdGhlIGhhbmRsZXIuIFRvIHN0YXJ0XG4vLyB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyLCB1c2UgYHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfWAgb3IgYHRoaXMuaGFzVXBkYXRlZGAgaW4gdGhlIGhhbmRsZXIuXG4vL1xuLy8gVXNhZ2U6XG4vL1xuLy8gIEB3YXRjaCgncHJvcE5hbWUnKVxuLy8gIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4vLyAgICAuLi5cbi8vICB9XG5cbmltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgVXBkYXRlSGFuZGxlciA9IChwcmV2PzogdW5rbm93biwgbmV4dD86IHVua25vd24pID0+IHZvaWQ7XG5cbnR5cGUgTm9uVW5kZWZpbmVkPEE+ID0gQSBleHRlbmRzIHVuZGVmaW5lZCA/IG5ldmVyIDogQTtcblxudHlwZSBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbSyBpbiBrZXlvZiBUXS0/OiBOb25VbmRlZmluZWQ8VFtLXT4gZXh0ZW5kcyBVcGRhdGVIYW5kbGVyID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuaW50ZXJmYWNlIExpdmVRdWVyeU9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXZlUXVlcnkocXVlcnlTZWxlY3Rvcjogc3RyaW5nLCBvcHRpb25zPzogTGl2ZVF1ZXJ5T3B0aW9ucykge1xuICBsZXQgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8TGl2ZVF1ZXJ5T3B0aW9ucz4gPSB7XG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KFxuICAgIHByb3RvOiBFbGVtQ2xhc3MsXG4gICAgZGVjb3JhdGVkRm5OYW1lOiBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPEVsZW1DbGFzcz5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgeyBjb25uZWN0ZWRDYWxsYmFjaywgZGlzY29ubmVjdGVkQ2FsbGJhY2sgfSA9IHByb3RvO1xuXG4gICAgcHJvdG8uY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzKSB7XG4gICAgICBjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHRoaXMpO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSAobXV0YXRpb25MaXN0OiBNdXRhdGlvblJlY29yZFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzVG9XYXRjaCA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5U2VsZWN0b3IpKTtcbiAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbkxpc3QpIHtcbiAgICAgICAgICBjb25zdCBhZGRlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IHJlbW92ZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgYWRkZWROb2Rlcy5maW5kKG4gPT4gZWxlbWVudHNUb1dhdGNoLmluY2x1ZGVzKG4pKSkge1xuICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKGFkZGVkTm9kZXMsIHJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuXG4gICAgICBjb25zdCBlbGVtZW50c0FkZGVkID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5U2VsZWN0b3IpID8/IFtdO1xuICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKEFycmF5LmZyb20oZWxlbWVudHNBZGRlZCksIFtdKTtcbiAgICB9O1xuXG4gICAgcHJvdG8uZGlzY29ubmVjdGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzKSB7XG4gICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHRoaXMpO1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7IC8qIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgc2NhbGluZyBwb3NpdGlvbiAqL1xuICB9XG4gIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IDAuNXJlbTtcbiAgfVxuXG4gIDpob3N0OjpwYXJ0KGFzc29jaWFibGVzLWNvbnRhaW5lcikge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICAgIDE4MGRlZyxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSAtIDFweCksXG4gICAgICB2YXIoLS1xdGktYm9yZGVyLWNvbG9yLWdyYXkpIGNhbGMoNTAlKSxcbiAgICAgIHJnYigwIDAgMCAvIDAlKSBjYWxjKDUwJSArIDFweClcbiAgICApO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyByZW1vdmVEb3VibGVTbGFzaGVzIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIC8vIFRoaXMgY3VzdG9tLWludGVyYWN0aW9uIHN1cHBvcnQgdGhlIENFUyBBUEkgd2hpY2ggaXMgdXNlIGluIEZBQ0VUXG4gIC8vXG4gIC8vIEl0IHdvcmtzIGxpa2UgdGhpczpcbiAgLy8gMS4gVGhlIENJIG1hbmlmZXN0IGlzIGZldGNoZWRcbiAgLy8gMi4gQW4gaWZyYW1lIGlzIGNyZWF0ZWQgYW5kIHRoZSBmaXJzdCBzdHlsZSBhbmQgZmlyc3Qgc2NyaXB0IGZyb20gdGhlIG1hbmlmZXN0IGFyZSBsb2FkZWRcbiAgLy8gMy4gVGhlIGZpcnN0IHNjcmlwdCBpcyBib290c3RyYXAuanMgd2hpY2ggYWxzbyBjcmVhdGVzIGFuIGlmcmFtZSBhbmQgbG9hZHMgdGhlIGZpcnN0IG1lZGlhIGZyb20gdGhlIG1hbmlmZXN0XG4gIC8vIDQuIENvbW11bmljYXRpb24gaXMgZG9uZSB2aWEgdGhlIENFUyBBUEkgYnV0IGJlY2F1c2UgdGhlIGlmcmFtZSBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5wb3N0TWVzc2FnZVxuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBjaGFuZ2UgdGhlIHBhY2thZ2UgYnkgcmVwbGFjaW5nIHRoZSBib290c3RyYXAuanMgd2l0aCBvdXIgb3duIGFuZCBpbmplY3QgYSBwcm94eSBDRVMgQVBJIHRoYXQgY29tbXVuaWNhdGVzIHZpYSBwb3N0TWVzc2FnZVxuICAvLyBCZWNhdXNlIHdlIGFsc28gd2FudCB0byBydW4gdGhpcyBpbiBzdG9yeWJvb2ssIHdlIGNhbm5vdCB1c2Ugd2luZG93LnRvcCBiZWNhdXNlIHRvIHNlbmQgbWVzc2FnZXMgdGhlcmUsIGJlY2F1c2UgaW4gY2FzZSBvZiBzdG9yeWJvb2sgdGhhdCBpcyBub3QgdGhlIHRvcCB3aW5kb3cuXG4gIC8vIFNvIHdlIHNlbmQgbWVzc2FnZXMgdG8gYWxsIHBhcmVudCB3aW5kb3dzXG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UgPSB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlLmJpbmQodGhpcyk7XG4gIH1cblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEnIH0pXG4gIGRhdGE6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1pdGVtJyB9KVxuICBiYXNlSXRlbVVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLXJlZicgfSlcbiAgYmFzZVJlZlVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnaWQnIH0pXG4gIGlkOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuICBtYW5pZmVzdDoge1xuICAgIHNjcmlwdDogc3RyaW5nW107XG4gICAgc3R5bGU6IHN0cmluZ1tdO1xuICAgIG1lZGlhOiBzdHJpbmdbXTtcbiAgfTtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgdXJpVG9NYW5pZmVzdCA9IHRoaXMuZGF0YS5zdGFydHNXaXRoKCdodHRwJylcbiAgICAgID8gdGhpcy5kYXRhXG4gICAgICA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlSXRlbVVybCArICcvJyArIHRoaXMuZGF0YSk7XG4gICAgLy8gZmV0Y2ggdGhlIGpzb24gZmlsZSBsb2NhdGVkIGF0IHRoZSBkYXRhIGF0dHJpYnV0ZVxuICAgIGZldGNoKHVyaVRvTWFuaWZlc3QpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2V0dXBDRVMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBNSDogQ2hhbmdlZCB0aGUgZGVmYXVsdCBib290c3RyYXAuanMgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSVxuICAvLyBCZWNhdXNlIHRoZSBvbGQgb25lIHVzZXMgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHRoYXQgaXMgbm90IGFsbG93ZWQgdG8gYmUgYWNjZXNzZWQgd2hlbiB0aGUgQ0lcbiAgLy8gaXMgZW1iZWRkZWQgaW4gYW4gaWZyYW1lIGFuZCBjb21pbmcgZnJvbSBhbm90aGVyIGRvbWFpblxuICAvLyBUaGVyZWZvciB3ZSBuZWVkIHRvIHVzZSB0aGUgbmV3IENFUyBBUEkgdG8gY29tbXVuaWNhdGVzIHZpYSB0aGUgYnJvYWRjYXN0IEFQSVxuICBzZXR1cENFUygpIHtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3BjaUNvbnRhaW5lcicpIGFzIEhUTUxJRnJhbWVFbGVtZW50LFxuICAgICAgaWZyYW1lV2luID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLFxuICAgICAgaWZyYW1lRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudDtcblxuICAgIC8vIGNvbnN0IGNoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbCgnY2VzX2NoYW5uZWwnKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIGlmcmFtZURvYy5vcGVuKCk7XG4gICAgaWZyYW1lRG9jLndyaXRlKGBcbiAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICA8bGluayBocmVmPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc3R5bGVbMF19YCl9JyByZWw9XCJzdHlsZXNoZWV0XCIgLz5cbiAgICAgICAgICA8c2NyaXB0IHNyYz0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnNjcmlwdFswXX1gKX0nPjwvc2NyaXB0PlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5PjwvYm9keT5cbiAgICAgIDwvaHRtbD5cbiAgICAgIGApO1xuXG4gICAgaWZyYW1lRG9jLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldElGcmFtZXMoKSB7XG4gICAgY29uc3QgaWZyYW1lc0luU2hhZG93Um9vdCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY29uc3Qgb3V0ZXJJRnJhbWVzID0gWy4uLmlmcmFtZXNJblNoYWRvd1Jvb3QsIC4uLmlmcmFtZV07XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2Ygb3V0ZXJJRnJhbWVzKSB7XG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3V0ZXJEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIGlmIChvdXRlckRvYykge1xuICAgICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMob3V0ZXJEb2MsIG91dGVySUZyYW1lcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2V0IG9ubHkgdW5pcXVlIGlmcmFtZXNcbiAgICBvdXRlcklGcmFtZXMuZm9yRWFjaCgoaWZyYW1lLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKG91dGVySUZyYW1lcy5pbmRleE9mKGlmcmFtZSkgIT09IGluZGV4KSB7XG4gICAgICAgIG91dGVySUZyYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvdXRlcklGcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIGdldElubmVySUZyYW1lcyhpZnJhbWVEb2N1bWVudDogRG9jdW1lbnQsIGlmcmFtZXMgPSBbXSkge1xuICAgIC8vIEdldCBhbGwgaWZyYW1lcyBpbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVzID0gaWZyYW1lRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjdXJyZW50SWZyYW1lcy5mb3JFYWNoKGlmcmFtZSA9PiB7XG4gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgaWZyYW1lIHRvIHRoZSBsaXN0XG4gICAgICBpZnJhbWVzLnB1c2goaWZyYW1lKTtcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgZ2V0IGlmcmFtZXMgd2l0aGluIHRoZSBjdXJyZW50IGlmcmFtZVxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlmcmFtZSBzcmMgaXMgZnJvbSB0aGUgc2FtZSBvcmlnaW5cbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcblxuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgdGhpcy5nZXRJbm5lcklGcmFtZXMobmVzdGVkRG9jLCBpZnJhbWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgY3Jvc3Mtb3JpZ2luIGlmcmFtZTonLCBpZnJhbWVTcmMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlmcmFtZXM7XG4gIH1cblxuICBwcml2YXRlIHBvc3RUb1dpbmRvd0FuZElmcmFtZXModHlwZTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICB3aW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgY29uc3QgaWZyYW1lcyA9IHRoaXMuZ2V0SUZyYW1lcygpO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIGlmcmFtZXMpIHtcbiAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3N0TWVzc2FnZShldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgeyB0eXBlLCBkYXRhIH0gPSBldmVudC5kYXRhO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc2V0UmVzcG9uc2UnOlxuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZ2V0UmVzcG9uc2UnOiB7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygncmVzcG9uc2VEYXRhJywgdGhpcy5yYXdSZXNwb25zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZ2V0TWVkaWEnOiB7XG4gICAgICAgIGNvbnN0IG1lZGlhRGF0YSA9IHRoaXMubWFuaWZlc3QubWVkaWEubWFwKG1lZGlhID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBtZWRpYS5zdGFydHNXaXRoKCdodHRwJykgPyBtZWRpYSA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlUmVmVXJsICsgJy8nICsgbWVkaWEpO1xuICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ21lZGlhRGF0YScsIG1lZGlhRGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc2V0U3RhZ2VIZWlnaHQnOlxuICAgICAgICBjb25zb2xlLmxvZygnc2V0U3RhZ2VIZWlnaHQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlICE9PSAnJztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2U7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHZhbDtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8aWZyYW1lXG4gICAgICAgIHdpZHRoPSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyl9XG4gICAgICAgIGhlaWdodD0ke3RoaXMuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKX1cbiAgICAgICAgZnJhbWVib3JkZXI9XCIwXCJcbiAgICAgICAgdGl0bGU9XCJwY2lDb250YWluZXJcIlxuICAgICAgICBpZD1cInBjaUNvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICA8L2lmcmFtZT5cbiAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NvdW50LWF0dGVtcHQnIH0pXG4gIHB1YmxpYyBjb3VudEF0dGVtcHQ6IHN0cmluZyA9ICd0cnVlJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIHRpdGxlOiAnZW5kIGF0dGVtcHQnO1xuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxidXR0b24gP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0gcGFydD1cImJ1dHRvblwiIEBjbGljaz0ke3RoaXMuZW5kQXR0ZW1wdH0+JHt0aGlzLnRpdGxlfTwvYnV0dG9uPmA7XG4gIH1cbiAgcHVibGljIGVuZEF0dGVtcHQoZTogRXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2VuZC1hdHRlbXB0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdDogdGhpcy5jb3VudEF0dGVtcHQgPT09ICd0cnVlJyB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJzogUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1nYXAtdGV4dCcsIGZhbHNlLCAncXRpLWdhcCcpIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIC8qIFtwYXJ0PSdkcm9wcyddICwgKi9cbiAgICAgIFtwYXJ0PSdkcmFncyddIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+PHNsb3QgcGFydD1cImRyYWdzXCIgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD4gPHNsb3QgcGFydD1cImRyb3BzXCI+PC9zbG90PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGxldCBtYXRjaGVzOiB7IHRleHQ6IHN0cmluZzsgZ2FwOiBzdHJpbmcgfVtdID0gW107XG4gICAgY29uc3QgcmVzcG9uc2UgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgbWF0Y2hlcyA9IHJlc3BvbnNlLm1hcCh4ID0+IHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSB4LnNwbGl0KCcgJyk7XG4gICAgICAgIHJldHVybiB7IHRleHQ6IHNwbGl0WzBdLCBnYXA6IHNwbGl0WzFdIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXBzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZ2FwJyk7XG4gICAgZ2Fwcy5mb3JFYWNoKChnYXAsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZ2FwLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgY29uc3QgdGV4dElkZW50aWZpZXIgPSBtYXRjaGVzLmZpbmQoeCA9PiB4LmdhcCA9PT0gaWRlbnRpZmllcik/LnRleHQ7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktZ2FwLXRleHRbaWRlbnRpZmllcj1cIiR7dGV4dElkZW50aWZpZXJ9XCJdYCk/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgIGlmICh0ZXh0SWRlbnRpZmllciAmJiB0ZXh0KSB7XG4gICAgICAgIGlmICghZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGV4dFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHRpb24nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgZ2FwLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0ZXh0U3Bhbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ2FwLm5leHRFbGVtZW50U2libGluZz8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb3JyZWN0LW9wdGlvbicpKSB7XG4gICAgICAgIGdhcC5uZXh0RWxlbWVudFNpYmxpbmcucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIHN2ZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBxdWVyeSwgcXVlcnlBc3NpZ25lZEVsZW1lbnRzLCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIGhvdHNwb3RzO1xuICBzdGFydFBvaW50ID0gbnVsbDtcbiAgZW5kUG9pbnQgPSBudWxsO1xuICBAc3RhdGUoKSBfbGluZXMgPSBbXTtcbiAgQHN0YXRlKCkgc3RhcnRDb29yZDogeyB4OiBhbnk7IHk6IGFueSB9O1xuICBAc3RhdGUoKSBtb3VzZUNvb3JkOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIEBxdWVyeSgnc3ZnJykgc3ZnQ29udGFpbmVyO1xuICBAcXVlcnlBc3NpZ25lZEVsZW1lbnRzKHsgc2VsZWN0b3I6ICdpbWcnIH0pIGdySW1hZ2U7XG5cbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICAvLyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKHF0aS1hc3NvY2lhYmxlLWhvdHNwb3QpIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB9XG4gICAgICBsaW5lLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICBzdmcge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMHB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICB9XG4gICAgYFxuICBdO1xuICBzdmc6IFNWR1NWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVzID0gW107XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB0aGlzLl9saW5lcyA9IHZhbDtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXM7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxsaW5lLWNvbnRhaW5lcj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHdpZHRoPSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8ud2lkdGgpfVxuICAgICAgICAgIGhlaWdodD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LmhlaWdodCl9XG4gICAgICAgICAgdmlld2JveD1cIjAgMCAke3RoaXMuZ3JJbWFnZVswXT8ud2lkdGh9ICR7dGhpcy5nckltYWdlWzBdPy5oZWlnaHR9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgICAgdGhpcy5fbGluZXMsXG4gICAgICAgICAgICBsaW5lID0+IGxpbmUsXG4gICAgICAgICAgICAobGluZSwgaW5kZXgpID0+IHN2Z2BcbiAgICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgICBwYXJ0PVwibGluZVwiXG4gICAgICAgICAgICAgICAgeDE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgeDI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS5sZWZ0KX1cbiAgICAgICAgICAgICAgICB5Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLnRvcCl9XG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9saW5lcyA9IHRoaXMuX2xpbmVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgKX1cbiAgICAgICAgICAke3RoaXMuc3RhcnRQb2ludCAmJlxuICAgICAgICAgIHN2Z2A8bGluZVxuICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgIHgxPSR7dGhpcy5zdGFydENvb3JkLnh9XG4gICAgICAgICAgICB5MT0ke3RoaXMuc3RhcnRDb29yZC55fVxuICAgICAgICAgICAgeDI9JHt0aGlzLm1vdXNlQ29vcmQueH1cbiAgICAgICAgICAgIHkyPSR7dGhpcy5tb3VzZUNvb3JkLnl9XG4gICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgLz5gfVxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9saW5lLWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoZSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChlKTtcblxuICAgIHRoaXMuaG90c3BvdHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMubW91c2VDb29yZCA9IHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LFxuICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHRoaXMuaG90c3BvdHMuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdICsgJ3B4JztcbiAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV0gKyAncHgnO1xuXG4gICAgICBob3RzcG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRQb2ludCkge1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuc3RhcnRDb29yZCA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0sXG4gICAgICAgICAgICB5OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICsgJyAnICsgdGhpcy5lbmRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKVxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fbGluZXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRQb2ludCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uLy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkhvdHNwb3RzKFxuICBzaGFwZTogc3RyaW5nLFxuICBjb29yZHNOdW1iZXI6IG51bWJlcltdLFxuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQsXG4gIGhvdHNwb3Q6IFF0aUhvdHNwb3RDaG9pY2Vcbikge1xuICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGNlbnRlclhQZXIgPSAoY2VudGVyWCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGNlbnRlcllQZXIgPSAoY2VudGVyWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByYWRpdXNQZXIgPSAocmFkaXVzIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWFBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSA0ICogcmFkaXVzUGVyICsgJ3B4JztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgOTk5OXB4YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncmVjdCc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvbHknOlxuICAgICAge1xuICAgICAgICAvLyBmcm9tIGEsYixjLGQsZSxmID0+IFt7eDphLCB5OmJ9LHt4OmMsIHk6ZH0se3g6ZSwgeTpmfV1cbiAgICAgICAgY29uc3QgcG9seWNvb3JkcyA9IGNvb3Jkc051bWJlci5yZWR1Y2UoKGFjYywgY3VycmVudFZhbHVlLCBjdXJyZW50SW5kZXgsIHBvbHlDKSA9PiB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWwgPSBhY2MucG9wKCk7XG4gICAgICAgICAgICBhY2NbYWNjLmxlbmd0aF0gPSB7IHg6IGxhc3RWYWwsIHk6IHBvbHlDW2N1cnJlbnRJbmRleF0gfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2goY3VycmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBib3VuZGluZyBib3ggYnkgZmluZGluZyB0aGUgbWF4IGF4IG1pbiBjb29yZGluYXRlcyBvZiB4IGFuZCB5XG4gICAgICAgIGNvbnN0IGxlZnRYID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCByaWdodFggPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHRvcFkgPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbVkgPSBNYXRoLm1heCguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC55KSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBjYXVzZSB3ZSB3YW50IHRvIHVzZSBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG5cbiAgICAgICAgLy8gc2V0IHRoZSBob3RzcG90IG9uIHgseSBhbmQgc2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuXG4gICAgICAgIC8vIGFsbCB0aGUgcG9seWdvbiBwb2ludHMgc2hvdWxkIGJlIGNvcnJlY3RlZCBjYXVzZWQgdGhleSBhcmUgZnJvbVxuICAgICAgICAvLyBpbWFnZSAwLDAgcG9pbnQsIGFuZCBzaG91bGQgYmUgZnJvbSB0aGUgaG90c3BvdCBwb2ludCB3aGljaCBhbHJlYWR5XG4gICAgICAgIC8vIGhhcyBiZWVuIG9mZnNldHRlZCBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgcHJldmlvdXMgZmV3IGxpbmVzIG9mIGNvZGVcbiAgICAgICAgLy8gYWxzbyB0aGUgcG9pbnRzIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgaW1hZ2UsIGJ1dCBub3cgaGF2ZVxuICAgICAgICAvLyB0byBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgd2lkdGggb2YgdGhlIGhvdHNwb3RcbiAgICAgICAgY29uc3QgcG9seWdvbkRhdGEgPSBwb2x5Y29vcmRzLm1hcChwb2ludCA9PiAoe1xuICAgICAgICAgIHg6ICgocG9pbnQueCAtIGxlZnRYKSAvIChyaWdodFggLSBsZWZ0WCkpICogMTAwLFxuICAgICAgICAgIHk6ICgocG9pbnQueSAtIHRvcFkpIC8gKGJvdHRvbVkgLSB0b3BZKSkgKiAxMDBcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjbGlwIHBhdGggY29vcmRpbmF0ZSBzdHlsZSBpbiBwZXJjZW50YWdlc1xuICAgICAgICBjb25zdCBwb2x5RCA9IHBvbHlnb25EYXRhLm1hcChwID0+IE1hdGgucm91bmQocC54KSArICclICcgKyBNYXRoLnJvdW5kKHAueSkgKyAnJScpLmpvaW4oJywnKTtcblxuICAgICAgICAvLyA1MCUgMCUsIDEwMCUgNTAlLCA1MCUgMTAwJSwgMCUgNTAlXG4gICAgICAgIGhvdHNwb3Quc3R5bGUuY2xpcFBhdGggPSBgcG9seWdvbigke3BvbHlEfSlgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLWdhcC1pbWcnLFxuICBmYWxzZSxcbiAgJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnXG4pIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLWdhcC1pbWcnXSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZ2FwOiAxcmVtO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIEhvdHNwb3RDaG9pY2UgPSBDaG9pY2UgJiB7IG9yZGVyOiBudW1iZXIgfTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG5cbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIb3RzcG90T3JkZXIoZTogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkZW50aWZpZXIgfSA9IGUuZGV0YWlsO1xuXG4gICAgY29uc3QgaG90c3BvdCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbmQoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpIGFzIEhvdHNwb3RDaG9pY2U7XG5cbiAgICBjb25zdCBtYXhTZWxlY3Rpb24gPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLmNob2ljZU9yZGVyaW5nKSB7XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChob3RzcG90Lm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+IGkub3JkZXIgPiAwKS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdXNlciBhbHJlYWR5IHNlbGVjdGVkIDUgaW1hZ2VzLlxuICAgICAgICB9XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiAhIWkub3JkZXIpLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgICAgICBpZiAoaG90c3BvdC5vcmRlciA+IGhvdHNwb3Qub3JkZXIpIHtcbiAgICAgICAgICAgIGhvdHNwb3Qub3JkZXItLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhvdHNwb3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBob3RzcG90Lm9yZGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90c3BvdEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICAvLyBkbyBub3Qgc2VsZWN0ICggaGlnaGxpZ2h0IGJsdWUsIHRoZSBpbWFnZSlcbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAvKiB3aWR0aDoxMDAlOyAqL1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd1bnJlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nOiBRdGlIb3RzcG90SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyogXG5xdGktbWF0Y2gtaW50ZXJhY3Rpb25cbnF0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb25cbiovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4vLyB0c2xpbnQ6ZGlzYWJsZTogaW5kZW50XG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICBgO1xuXG4gIC8qKiB0aGUgbWluaW1hbCBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWluJ1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNaW46IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWF4J1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNYXg6IG51bWJlciA9IDE7XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2ZpeGVkJ1xuICB9KVxuICBwdWJsaWMgZml4ZWQgPSBmYWxzZTtcblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHRoZSBhc3NvY2lhdGUgaW50ZXJhY3Rpb24gdGhlcmUgaXMgYSBzcGVjaWFsIHNsb3QgZm9yIHRoZXNlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VzXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgfVxuXG4gIC8vIHBrOiBUaGlzIG5lZWRzIHNvbWUgZXhwbGFuYXRpb25cbiAgLy8gaW4gcXRpLW1hdGNoLWludGVyYWN0aW9uLCBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIHVzZWQgdG8gZGVub3RlIHRoZVxuICAvLyBkcmFnZ2FibGUsIGJ1dCBhbHNvIHRoZSBkcm9wcGFibGUuIFdFSVJELi4gYnV0IGxldHMgZGVhbCB3aXRoIGl0LlxuICAvLyBTbyB3ZSBoYXZlIGEgc2xvdCBmb3Igd2hlbmV2ZXIgYW5vdGhlciBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIGRyb3BwZWQgaW4gaGVyZS5cbiAgLy8gQW5kIHdlIGhhdmUgc2xvdCBmb3IgY29udGVudCBsaWtlIGluIHRoaXMgYXNzb2NpYXRlIGludGVyYWN0aW9uXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPHNsb3QgcGFydD1cImRyb3BzbG90XCIgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJzogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG4vLyBpbXBvcnQgY29tcG9uZW50U3R5bGVzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9zdHlsZXMvY29tcG9uZW50LnN0eWxlcyc7XG5cbi8qICR7Y29tcG9uZW50U3R5bGVzfSAqL1xuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBzbG90IHtcbiAgICAvKiBzbG90IHdoZXJlIHRoZSAqL1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDAuNXJlbTtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgLyogcHJldmVudHMgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmluZyB0aGUgc2FtZSBoZWlnaHQgKi9cbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgfVxuICBzbG90W25hbWU9J3Byb21wdCddIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1tYXRjaC1zZXQpIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmUgdGhlIHNhbWUgd2lkdGggKi9cbiAgICBmbGV4OiAxO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWVkaWEtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1lZGlhSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgX3ZhbHVlID0gMDtcbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICAgIC8vIG1heWJlIGNoZWNrIGlmIHRoZSBtZWRpYSBoYXMgYmVlbiBwbGF5ZWQ/XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uSW50ZXJhY3Rpb24ucHJvcGVydGllcyxcbiAgICAgIC4uLntcbiAgICAgICAgc3RlcDoge1xuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdzdGVwJyxcbiAgICAgICAgICBkZWZhdWx0OiAxMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gZ2V0IGF1ZGlvLCB2aWRlbyBvZiBvYmplY3QgdGFnLlxuICAgIGNvbnN0IG1lZGlhT2JqZWN0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndmlkZW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuICAgIGlmIChtZWRpYU9iamVjdCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGVuZGVkIGV2ZW50XG4gICAgICBtZWRpYU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcy52YWx1ZSBpcyBhIG51bWJlclxuICAgICAgICB0aGlzLl92YWx1ZSsrO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWVkaWEtaW50ZXJhY3Rpb24nOiBRdGlNZWRpYUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFNodWZmbGVNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbic7IC8vIEltcG9ydCB0aGUgbWl4aW5cbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgU2h1ZmZsZU1peGluKFxuICBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sIGBxdGktc2ltcGxlLWNob2ljZWAsIHRydWUsICdkcm9wLWxpc3QnKSxcbiAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuKSB7XG4gIGNoaWxkcmVuTWFwOiBFbGVtZW50W107XG5cbiAgQHN0YXRlKCkgbnJDaG9pY2VzOiBudW1iZXIgPSAwO1xuICBAc3RhdGUoKSBjb3JyZWN0UmVzcG9uc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBAc3RhdGUoKSBzaG93Q29ycmVjdFJlc3BvbnNlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGdyaWQtYXV0by1jb2x1bW5zOiAxZnI7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3AtbGlzdCddIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIGlmICh0aGlzLm5yQ2hvaWNlcyA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm5yQ2hvaWNlcyA9IGNob2ljZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD5cbiAgICAgIDxkaXYgcGFydD1cImNvbnRhaW5lclwiPlxuICAgICAgICA8c2xvdCBwYXJ0PVwiZHJhZ3NcIj4gPC9zbG90PlxuICAgICAgICA8ZGl2IHBhcnQ9XCJkcm9wc1wiPlxuICAgICAgICAgICR7QXJyYXkuZnJvbShBcnJheSh0aGlzLm5yQ2hvaWNlcykpLm1hcChcbiAgICAgICAgICAgIChfLCBpKSA9PlxuICAgICAgICAgICAgICBodG1sYDxkcm9wLWxpc3QgcGFydD1cImRyb3AtbGlzdFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aX1cIj48L2Ryb3AtbGlzdD4ke3RoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID4gaVxuICAgICAgICAgICAgICAgICAgPyB1bnNhZmVIVE1MKGA8c3BhbiBwYXJ0PSdjb3JyZWN0LXJlc3BvbnNlJz4ke3RoaXMuY29ycmVjdFJlc3BvbnNlc1tpXX08L3NwYW4+YClcbiAgICAgICAgICAgICAgICAgIDogJyd9YFxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgICAgcmVzcG9uc2VzLmZvckVhY2goKHJlc3BvbnNlLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2ltcGxlQ2hvaWNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgaWYgKCFzaW1wbGVDaG9pY2UpIHtcbiAgICAgICAgICBzaW1wbGVDaG9pY2UgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gc2ltcGxlQ2hvaWNlPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcyA9IFsuLi50aGlzLmNvcnJlY3RSZXNwb25zZXMsIHRleHRdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IHRydWU7XG4gIH1cblxuICAvLyBzb21lIGludGVyYWN0aW9ucyBoYXZlIGEgZGlmZmVyZW50IHdheSBvZiBnZXR0aW5nIHRoZSByZXNwb25zZVxuICAvLyB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBkcmFnIGFuZCBkcm9wIG1peGluIGNsYXNzXG4gIC8vIHlvdSBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBnZXRSZXNwb25zZSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3NcbiAgLy8gY2F1c2UgdGhleSBhcmUgZGlmZmVyZW50IGZvciBzb21lIGludGVyYWN0aW9ucy5cbiAgLy8gTUg6IGlzIHRoaXMgZnVuY3Rpb24gY2FsbGVkPyBTaG91bGRuJ3Qgd2UgdXNlIGdldFZhbHVlP1xuICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2UoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUNob2ljZT4odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Ryb3AtbGlzdCcpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZHJvcHBhYmxlcy5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ3NJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICByZXR1cm4gWy4uLmlkZW50aWZpZXJzXS5qb2luKCcgJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5jaGlsZHJlbk1hcC5mb3JFYWNoKGVsID0+IGVsLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbicsIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnKVxuZXhwb3J0IGNsYXNzIFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIHN0YXJ0WDogYW55O1xuICBzdGFydFk6IGFueTtcbiAgZHJhZ0VsZW1lbnQ6IGFueTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyID0gdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIERlZmluZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbW91c2Vtb3ZlIGV2ZW50IG9uIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICBkcmFnRWxlbWVudEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSB0aGUgbW91c2UgaGFzIG1vdmVkIHNpbmNlIHRoZSBsYXN0IGV2ZW50XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcmFnRWxlbWVudC5vZmZzZXRMZWZ0ICsgZGVsdGFYICsgJ3B4JztcbiAgICB0aGlzLmRyYWdFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0VG9wICsgZGVsdGFZICsgJ3B4JztcblxuICAgIC8vIFVwZGF0ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChhKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGEpO1xuXG4gICAgLy8gR2V0IHRoZSBkcmFnZ2FibGUgYW5kIGRyb3Agem9uZSBlbGVtZW50c1xuICAgIHRoaXMuZHJhZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24+aW1nJyk7XG4gICAgLy8gY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5zdGFydFggPSAwO1xuICAgIHRoaXMuc3RhcnRZID0gMDtcblxuICAgIC8vIEFkZCBhIG1vdXNlZG93biBldmVudCBsaXN0ZW5lciB0byB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLmRyYWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gU2F2ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICAgIC8vIEFkZCBhIG1vdXNlbW92ZSBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlTW92ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJzogUXRpUG9zaXRpb25PYmplY3RTdGFnZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICBwb2ludC1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1heENob2ljZXM6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gIHByaXZhdGUgX2ltZ0VsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHRyYWN0ZWQgY2xpY2sgaGFuZGxlciBtZXRob2RcbiAgcHJpdmF0ZSBfb25JbWFnZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuX3BvaW50cy5sZW5ndGggPCB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIGAke3h9ICR7eX1gXTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxwb2ludC1jb250YWluZXI+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIHRoaXMuX3BvaW50cyxcbiAgICAgICAgICBwb2ludCA9PiBwb2ludCxcbiAgICAgICAgICAocG9pbnQsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGAke3BvaW50LnNwbGl0KCcgJylbMF19cHhgLFxuICAgICAgICAgICAgICAgIHRvcDogYCR7cG9pbnQuc3BsaXQoJyAnKVsxXX1weGBcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgcG9pbnQgYXQgJHtwb2ludH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50cyA9IHRoaXMuX3BvaW50cy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9wb2ludC1jb250YWluZXI+YDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3BvaW50cyA9IFtdO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50cy5sZW5ndGggPj0gdGhpcy5taW5DaG9pY2VzICYmIHRoaXMuX3BvaW50cy5sZW5ndGggPD0gdGhpcy5tYXhDaG9pY2VzO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9wb2ludHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5faW1nRWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gQXR0YWNoIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gPGltZz4gZWxlbWVudCBmb3VuZCBpbiA8cXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbj4nKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nOiBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTbGlkZXJJbnRlcmFjdGlvbi5UeXBlIChxdGktc2xpZGVyLWludGVyYWN0aW9uKSBwcmVzZW50cyB0aGUgY2FuZGlkYXRlIHdpdGggYSBjb250cm9sIGZvciBzZWxlY3RpbmcgYSBudW1lcmljYWwgdmFsdWUgYmV0d2VlbiBhIGxvd2VyIGFuZCB1cHBlciBib3VuZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guczYxeGNyajRxY3lqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDYuMFxuICpcbiAqIEBldmVudCBxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24gLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIHdhbnRzIHRvIHJlZ2lzdGVyIGl0c2VsZlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1yZXNwb25zZSAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gY2hhbmdlc1xuICpcbiAqIEBjc3Nwcm9wIC0tc2hvdy12YWx1ZSAtIHNob3dzIHRoZSBjdXJyZW50IHZhbHVlIHdoaWxlIHNsaWRpbmdcbiAqIEBjc3Nwcm9wIC0tc2hvdy10aWNrcyAtIHNob3dzIHRoZSB0aWNrcyBhY2NvcmRpbmcgdG8gc3RlcHNcbiAqIEBjc3Nwcm9wIC0tc2hvdy1ib3VuZHMgLSBzaG93cyB2YWx1ZSBmb3IgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG4gKlxuICogQGNzc3BhcnQgc2xpZGVyIC0tIHNsaWRlciBpbmx1ZGluZywgYm91bmRzIGFuZCB0aWNrcyBhbmQgdmFsdWUsIHVzZSBpdCBmb3IgcGFkZGluZ3MgYW5kIG1hcmdpbnNcbiAqIEBjc3NwYXJ0IGJvdW5kcyAtLSBkaXYgZm9yIGJvdW5kcywgY29udGFpbmluZyB0d28gZGl2cyBmb3Igd2l0aCBtaW4sIGFuZCBtYXggYm91bmRzIHZhbHVlXG4gKiBAY3NzcGFydCB0aWNrcyAtLSBkaXYgZm9yIHRpY2tzLCB1c2UgbGluZWFpciBncmFkaWVudCBhbmQgZXhwb3NlZCBjc3MgdmFyaWFibGVzIGZvciBzdHlsaW5nXG4gKiBAY3NzcGFydCByYWlsIC0tIGRpdiBmb3IgcmFpbCwgc3R5bGUgYWNjb3JkaW5nIHRvIG5lZWRzXG4gKiBAY3NzcGFydCBrbm9iIC0tIGRpdiwgc2hvdWxkIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlXG4gKiBAY3NzcGFydCB2YWx1ZSAtLSBkaXYsIGNvbnRhaW5pbmcgdmFsdWVcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgPHF0aS1zaW1wbGUtY2hvaWNlPiBtdXN0IGJlIHBsYWNlZC5cbiAqIEBzbG90IHByb21wdCAtIHNsb3Qgd2hlcmUgdGhlIHByb21wdCBpcyBwbGFjZWQuXG4gKi9cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVNsaWRlckludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIGNzTGl2ZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcblxuICBAcXVlcnkoJyNrbm9iJylcbiAgcHJpdmF0ZSBfa25vYjogSFRNTEVsZW1lbnQ7XG5cbiAgQHF1ZXJ5KCcjcmFpbCcpXG4gIHByaXZhdGUgX3JhaWw6IEhUTUxFbGVtZW50O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3N0ZXAtbGFiZWwnIH0pIHN0ZXBMYWJlbCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJyB9KSBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWluJywgYCR7dGhpcy5fbWlufWApO1xuICB9XG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAndXBwZXItYm91bmQnIH0pIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4JywgYCR7dGhpcy5fbWF4fWApO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3N0ZXAnIH0pIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zdGVwJywgYCR7dGhpcy5fc3RlcH1gKTtcbiAgfVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG5cbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKG9sZCwgZGlzYWJsZWQpID0+IHt9O1xuXG4gIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChvbGQsIHJlYWRvbmx5KSA9PiB7fTtcblxuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7IC4uLkxpdEVsZW1lbnQuc2hhZG93Um9vdE9wdGlvbnMsIGRlbGVnYXRlc0ZvY3VzOiB0cnVlLCBtb2RlOiAnb3BlbicgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBhIGxpdmUgcHJvcGVydHksIHdlIHVzZSB0aGlzIHRvIGdldCBjc3MgdmFyaWFibGVzXG4gICAgc2VlIHJlbmRlciB0ZW1wbGF0ZSAqL1xuICAgIHRoaXMuY3NMaXZlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtcbiAgfVxuXG4gIHNldCByZXNwb25zZShteVJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG15UmVzcG9uc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgYSBzaW5nbGUgdmFsdWUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChteVJlc3BvbnNlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIC8vIGNvbnZlcnQgdGhlIHZhbHVlLCB3aGljaCBpcyB0aGUgcmVhbCBzbGlkZXIgdmFsdWUgdG8gYSBwZXJjZW50YWdlIGZvciB0aGUgZG9tLlxuICAgIGlmICh0aGlzLl92YWx1ZSA8IHRoaXMubWluKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgPiB0aGlzLm1heCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1heDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVQZXJjZW50YWdlID0gKCh0aGlzLl92YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12YWx1ZS1wZXJjZW50YWdlJywgYCR7dmFsdWVQZXJjZW50YWdlfSVgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGRpdiBpZD1cInNsaWRlclwiIHBhcnQ9XCJzbGlkZXJcIj5cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctYm91bmRzJykgPT0gJ3RydWUnXG4gICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJib3VuZHNcIiBwYXJ0PVwiYm91bmRzXCI+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9taW59PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9tYXh9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy10aWNrcycpID09ICd0cnVlJyA/IGh0bWxgPGRpdiBpZD1cInRpY2tzXCIgcGFydD1cInRpY2tzXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgaWQ9XCJyYWlsXCIgcGFydD1cInJhaWxcIiBAbW91c2Vkb3duPSR7dGhpcy5fb25Nb3VzZURvd259IEB0b3VjaHN0YXJ0PSR7dGhpcy5fb25Ub3VjaE1vdmV9PlxuICAgICAgICAgIDxkaXYgaWQ9XCJrbm9iXCIgcGFydD1cImtub2JcIj5cbiAgICAgICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXZhbHVlJykgPT0gJ3RydWUnXG4gICAgICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwidmFsdWVcIiBwYXJ0PVwidmFsdWVcIj4ke3RoaXMudmFsdWV9PC9kaXY+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdGVwID0gMTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaEVuZCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1vdXNlRG93bihldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiogY2FsY3VsYXRlVmFsdWUgZ2V0cyB4IHBvc2l0aW9uIGFuZCBjb21wYXJlcyB0aGlzIHdpdGggdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVZhbHVlKGRpZmZYOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZU5vdyA9IHRoaXMubWluICsgKCh0aGlzLm1heCAtIHRoaXMubWluKSAqIGRpZmZYKSAvIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3Qgcm91bmRlZFN0ZXBWYWx1ZSA9IHRoaXMubWluICsgTWF0aC5yb3VuZCgodmFsdWVOb3cgLSB0aGlzLm1pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXA7XG4gICAgdGhpcy5fdmFsdWUgPSByb3VuZGVkU3RlcFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbkZyb21FdmVudChlOiBhbnkpOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IF90b3VjaE1vdmU7XG4gICAgaWYgKGUudHlwZSA9PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09ICd0b3VjaG1vdmUnIHx8IGUudHlwZSA9PSAndG91Y2hlbmQnIHx8IGUudHlwZSA9PSAndG91Y2hjYW5jZWwnKSB7XG4gICAgICBjb25zdCBldnQgPSB0eXBlb2YgZS5vcmlnaW5hbEV2ZW50ID09PSAndW5kZWZpbmVkJyA/IGUgOiBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2dC50b3VjaGVzWzBdIHx8IGV2dC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxuICAgICAgICB5OiB0b3VjaC5wYWdlWVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS50eXBlID09ICdtb3VzZWRvd24nIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNldXAnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbW92ZScgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdmVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW91dCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VlbnRlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VsZWF2ZSdcbiAgICApIHtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IGUuY2xpZW50WCxcbiAgICAgICAgeTogZS5jbGllbnRZXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX3RvdWNoTW92ZTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2xpZGVyLWludGVyYWN0aW9uJzogUXRpU2xpZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDYWxjdWxhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHByaXZhdGUgb3BlcmF0b3JGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLmhhbmRsZVNsb3RDaGFuZ2V9Pjwvc2xvdD5gO1xuICB9XG5cbiAgaGFuZGxlU2xvdENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvLyBleHBlY3RpbmcgPFshQ0RBVEFbIC4uLiBdXT4gaXMgY29udmVydGVkIGludG8gPCEtLSAuLi4gLS0+IHdpdGggcXRpLXRyYW5zZm9ybTogY0RhdGFUb0NvbW1lbnRcbiAgICBjb25zdCBjb21tZW50Tm9kZSA9IEFycmF5LmZyb20odGhpcy5maXJzdEVsZW1lbnRDaGlsZD8uY2hpbGROb2RlcyA/PyBbXSkuZmluZChcbiAgICAgIG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9wZXJhdG9yRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAnZm4nLCAnaXRlbScsIGNvbW1lbnROb2RlLnRleHRDb250ZW50ID8/ICcnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdjdXN0b20tb3BlcmF0b3IgY29udGFpbnMgaW52YWxpZCBqYXZhc2NyaXB0IGNvZGUnLCBlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGZuID0ge1xuICAgICAgdmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcik/LnZhbHVlID8/ICcnLFxuICAgICAgY29ycmVjdDogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICAodGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZSlcbiAgICAgICAgICA/LmNvcnJlY3RSZXNwb25zZSA/PyAnJ1xuICAgIH07XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIGdldFZhcmlhYmxlOiAodmFyaWFibGVJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZUlkZW50aWZpZXIpLFxuICAgICAgdXBkYXRlT3V0Y29tZVZhcmlhYmxlOiAob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZzsgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYWJsZS1ob3RzcG90JzogUXRpQXNzb2NpYWJsZUhvdHNwb3Q7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwJylcbmV4cG9ydCBjbGFzcyBRdGlHYXAgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwJzogUXRpR2FwO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1pbWcnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcEltZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtaW1nJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1pbWcnOiBRdGlHYXBJbWc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtdGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwVGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWdhcC10ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhcmlhLW9yZGVydmFsdWUnLCB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgb3JkZXI6IG51bWJlcjtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtY2hvaWNlJzogUXRpSG90c3BvdENob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHRleHQnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj48ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj48L2Rpdj5cbiAgICAgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dCc6IFF0aUhvdHRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2UtcmVnaXN0ZXInLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3RJbmxpbmVDaG9pY2UoKSB7XG4gICAgLy8gaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW5saW5lLWNob2ljZS1zZWxlY3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UnOiBRdGlJbmxpbmVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyoqXG4gKiBxdGktb3JkZXItaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtY2hvaWNlJykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gICAgW3BhcnQ9J2NoJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgYDtcblxuICAvLyBwcm9wZXJ0eSBsYWJlbFxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIG1hcmtlcjogc3RyaW5nO1xuXG5cbiAgZ2V0IGNoZWNrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXNbJ2ludGVybmFscyddLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+XG4gICAgICAgIDxkaXYgcGFydD1cImNoYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke3RoaXMubWFya2VyID8gaHRtbGA8ZGl2IGlkPVwibGFiZWxcIj4ke3RoaXMubWFya2VyfTwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgPHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnOiBRdGlTaW1wbGVDaG9pY2U7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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QUFBLE1BRE4sOEJBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFBQSxHQXJCakMsZ0JBc0JKO0FBdEJJLGtCQUFOO0FBQUEsTUFETixtQ0FBYyxtQkFBbUI7QUFBQSxHQUNyQjs7O0F6RytEYixRQUFRO0FBQUEsRUFDTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfY29udGV4dCIsICJwcm9wZXJ0eSIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgInhtbCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2NvbnRleHQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9jb250ZXh0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfY29udGV4dCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfaWZfZGVmaW5lZCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2NvbnRleHQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2NvbnRleHQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgInByb3BlcnR5IiwgInJlcXVpcmUiLCAibW9kdWxlIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaWZyYW1lIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9pZl9kZWZpbmVkIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJob3RzcG90IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfdW5zYWZlX2h0bWwiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfdW5zYWZlX2h0bWwiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X3JlcGVhdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImV2ZW50IiwgIngiLCAiZGlmZlgiLCAiaW1wb3J0X2NvbnRleHQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiXQp9Cg==
|
|
6509
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS50cyIsICIuLi8uLi9zcmMvbGliL2RlY29yYXRvcnMvd2F0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm1lcnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0taXRlbS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pdGVtLWJvZHkvcXRpLWl0ZW0tYm9keS5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcHJvbXB0L3F0aS1wcm9tcHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbi9xdGktb3V0Y29tZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLWNvbnRlbnQtYm9keS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1ydWJyaWMtYmxvY2svcXRpLXJ1YnJpYy1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC92b2NhYnVsYXJ5L3ZvY2FidWxhcnktbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdGVtcGxhdGUtc3RyaW5ncy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcnVsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1yZXNwb25zZS1jb25kaXRpb24vcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS9xdGktc2V0LW91dGNvbWUtdmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtZWxzZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi9xdGktcmVzcG9uc2UtZWxzZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1pZi9xdGktcmVzcG9uc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1hbmQvcXRpLWFuZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1hbmQvaW5kZXgudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYmFzZXZhbHVlL3F0aS1iYXNldmFsdWUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29udGFpbnMvcXRpLWNvbnRhaW5zLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvcnJlY3QvcXRpLWNvcnJlY3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwtcm91bmRlZC9xdGktZXF1YWwtcm91bmRlZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC9xdGktZXF1YWwudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3QvcXRpLWd0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0ZS9xdGktZ3RlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWlzLW51bGwvcXRpLWlzLW51bGwudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHQvcXRpLWx0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0ZS9xdGktbHRlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcC1yZXNwb25zZS9xdGktbWFwLXJlc3BvbnNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hcHBpbmcvcXRpLW1hcHBpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWF0Y2gvcXRpLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1lbWJlci9xdGktbWVtYmVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW11bHRpcGxlL3F0aS1tdWx0aXBsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ub3QvcXRpLW5vdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vci9xdGktb3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3JkZXJlZC9xdGktb3JkZXJlZC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcmludGVkLXZhcmlhYmxlL3F0aS1wcmludGVkLXZhcmlhYmxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByb2R1Y3QvcXRpLXByb2R1Y3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktc3RyaW5nLW1hdGNoL3F0aS1zdHJpbmctbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktc3VtL3F0aS1zdW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktdmFyaWFibGUvcXRpLXZhcmlhYmxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1hcGkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2Ryb3BwYWJsZXMtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2ZsaXBwYWJsZXMtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL2RlY29yYXRvcnMvbGl2ZS1xdWVyeS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiIsICJpbXBvcnQgeyBwcm92aWRlIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzLCBPdXRjb21lQ2hhbmdlZERldGFpbHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgdHlwZSB7IFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlVmFsdWUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlLCBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB0eXBlIHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0VmFyaWFibGVzIH0gZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IFF0aVJlZ2lzdGVyVmFyaWFibGUgZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnRzL3F0aS1yZWdpc3Rlci12YXJpYWJsZSc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1hc3Nlc3NtZW50LWl0ZW0gZWxlbWVudCBjb250YWlucyBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcy5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guZGx0bm5qODdsMHlqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBkZXBlbmRlbmN5IHF0aS1mZWVkYmFja1xuICogQGRlcGVuZGVuY3kgcXRpLXJlc3BvbnNlcHJvY2Vzc2luZ1xuICpcbiAqIEBzbG90IC0gVGhlIGRlZmF1bHQgc2xvdCB3aGVyZSBhbGwgdGhlIG90aGVyIFFUSSAzIGl0ZW0gc3RydWN0dXJlcyBnby5cbiAqXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLWNoYW5nZWQgLSBFbWl0dGVkIHdoZW4gYW4gaW50ZXJhY3Rpb24gaXMgY2hhbmdlZC5cbiAqIEBldmVudCBxdGktb3V0Y29tZS1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIG91dGNvbWUgaGFzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcgLSBFbWl0dGVkIHdoZW4gcmVzcG9uc2UtcHJvY2Vzc2luZyBpcyBjYWxsZWQuXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtaXRlbScpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudEl0ZW0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpdGxlOiBzdHJpbmc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGFkYXB0aXZlOiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHRpbWVEZXBlbmRlbnQ6ICd0cnVlJyB8ICdmYWxzZScgfCBudWxsID0gbnVsbDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICBwcml2YXRlIF9jb250ZXh0OiBJdGVtQ29udGV4dCA9IHtcbiAgICBpZGVudGlmaWVyOiB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgIHZhcmlhYmxlczogaXRlbUNvbnRleHRWYXJpYWJsZXNcbiAgfTtcblxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh7XG4gICAgICBpZGVudGlmaWVyOiB2LmlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgIHR5cGU6IHYudHlwZSxcbiAgICAgIC8vIGFkZCBleHRlcm5hbHNjb3JlZCwgYSBmaXhlZCBwcm9wIHRvIHRoZSB0ZXN0LCBzbyB0aGUgdGVzdGNvbnRleHQgY2FuIHJlYWQgYW5kIGRlY2lkZSBob3cgdG8gc2NvcmUgdGhpcyBpdGVtXG4gICAgICAuLi4odi50eXBlID09PSAnb3V0Y29tZScgJiYgdi5pZGVudGlmaWVyID09PSAnU0NPUkUnXG4gICAgICAgID8geyBleHRlcm5hbFNjb3JlZDogKHYgYXMgT3V0Y29tZVZhcmlhYmxlKS5leHRlcm5hbFNjb3JlZCB9XG4gICAgICAgIDoge30pXG4gICAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YXJpYWJsZXModmFsdWU6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5zb21lKHYgPT4gISgnaWRlbnRpZmllcicgaW4gdikpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhcmlhYmxlcyBwcm9wZXJ0eSBzaG91bGQgYmUgYW4gYXJyYXkgb2YgVmFyaWFibGVEZWNsYXJhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQudmFsdWUgPSB2YXJpYWJsZS52YWx1ZSBhcyBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnZhbHVlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgKGU6IFF0aVJlZ2lzdGVyVmFyaWFibGUpID0+IHtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSB7IC4uLnRoaXMuX2NvbnRleHQsIHZhcmlhYmxlczogWy4uLnRoaXMuX2NvbnRleHQudmFyaWFibGVzLCBlLmRldGFpbC52YXJpYWJsZV0gfTtcbiAgICAgIHRoaXMuX2luaXRpYWxDb250ZXh0ID0gdGhpcy5fY29udGV4dDtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCAoZTogQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgZmVlZGJhY2tFbGVtZW50ID0gZS5kZXRhaWw7XG4gICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLnB1c2goZmVlZGJhY2tFbGVtZW50KTtcbiAgICAgIGZlZWRiYWNrRWxlbWVudC5jaGVja1Nob3dGZWVkYmFjayhmZWVkYmFja0VsZW1lbnQub3V0Y29tZUlkZW50aWZpZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywgKGU6IEN1c3RvbUV2ZW50PG51bGw+KSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5wdXNoKGUudGFyZ2V0IGFzIEludGVyYWN0aW9uKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZC1hdHRlbXB0JywgKGU6IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IGNvdW50QXR0ZW1wdDogYm9vbGVhbiB9PikgPT4ge1xuICAgICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdCB9ID0gZS5kZXRhaWw7XG4gICAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2VJZGVudGlmaWVyLCAndHJ1ZScpO1xuICAgICAgdGhpcy5wcm9jZXNzUmVzcG9uc2UoY291bnRBdHRlbXB0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIC8vIHdvcmR0IGFhbmdlcm9lcGVuIHZhbnVpdCBkZSBwcm9jZXNzaW5ndGVtcGxhdGVcbiAgICAgICdxdGktc2V0LW91dGNvbWUtdmFsdWUnLFxuICAgICAgKGU6IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3V0Y29tZUlkZW50aWZpZXIsIHZhbHVlIH0gPSBlLmRldGFpbDtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUob3V0Y29tZUlkZW50aWZpZXIsIHZhbHVlKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB0aGlzLmhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUpO1xuICB9XG5cbiAgcHVibGljIHNob3dDb3JyZWN0UmVzcG9uc2Uoc2hvdzogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGVzID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmlsdGVyKFxuICAgICAgKHZhcmk6IFJlc3BvbnNlVmFyaWFibGUgfCBPdXRjb21lVmFyaWFibGUpID0+ICdjb3JyZWN0UmVzcG9uc2UnIGluIHZhcmkgJiYgdmFyaS5jb3JyZWN0UmVzcG9uc2VcbiAgICApIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCByZXNwb25zZXMgPSByZXNwb25zZVZhcmlhYmxlcy5tYXAoY3IgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiBjci5pZGVudGlmaWVyLFxuICAgICAgICByZXNwb25zZTogY3IuY29ycmVjdFJlc3BvbnNlXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb24gfCB1bmRlZmluZWQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICApO1xuICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGludGVyYWN0aW9uLmNvcnJlY3RSZXNwb25zZSA9IHNob3cgPyByZXNwb25zZS5yZXNwb25zZSA6ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzUmVzcG9uc2UoY291bnROdW1BdHRlbXB0czogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCByZXNwb25zZVByb2Nlc3NvciA9IHRoaXMucXVlcnlTZWxlY3RvcjxRdGlSZXNwb25zZVByb2Nlc3Npbmc+KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpO1xuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2UgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHdlYmNvbXBvbmVudHMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG5cbiAgICBpZiAoY291bnROdW1BdHRlbXB0cykge1xuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoXG4gICAgICAgICdudW1BdHRlbXB0cycsXG4gICAgICAgICgrdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gJ251bUF0dGVtcHRzJyk/LnZhbHVlICsgMSkudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lbWl0KCdxdGktcmVzcG9uc2UtcHJvY2Vzc2VkJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRSZXNwb25zZXMoKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHRoaXMuX2luaXRpYWxDb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3BvbnNlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFJlc3BvbnNlVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldE91dGNvbWUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8T3V0Y29tZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICB9XG5cbiAgcHVibGljIGdldFZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPj4ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICB9XG5cbiAgLy8gc2F2aW5nIHByaXZhdGVzIGhlcmU6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaGFuZGxlVXBkYXRlUmVzcG9uc2VWYXJpYWJsZShldmVudDogQ3VzdG9tRXZlbnQ8UmVzcG9uc2VJbnRlcmFjdGlvbj4pIHtcbiAgICBjb25zdCB7IHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UgfSA9IGV2ZW50LmRldGFpbDtcbiAgICB0aGlzLnVwZGF0ZVJlc3BvbnNlVmFyaWFibGUocmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUmVzcG9uc2VWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyID8gdiA6IHsgLi4udiwgdmFsdWU6IHZhbHVlIH0pKVxuICAgIH07XG5cbiAgICB0aGlzLl9lbWl0PEludGVyYWN0aW9uQ2hhbmdlZERldGFpbHM+KCdxdGktaW50ZXJhY3Rpb24tY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuYWRhcHRpdmUgPT09ICdmYWxzZScpIHtcbiAgICAgIC8vIGlmIGFkYXBhdGl2ZSwgY29tcGxldGlvblN0YXR1cyBpcyBzZXQgYnkgdGhlIHByb2Nlc3NpbmcgdGVtcGxhdGVcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKCdjb21wbGV0aW9uU3RhdHVzJywgdGhpcy5fZ2V0Q29tcGxldGlvblN0YXR1cygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlT3V0Y29tZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5nZXRPdXRjb21lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFvdXRjb21lVmFyaWFibGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuIG5vdCBzZXQgcXRpLW91dGNvbWUtaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfSwgaXQgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiB7XG4gICAgICAgIGlmICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IG91dGNvbWVWYXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgPyB2YWx1ZSA6IFsuLi52LnZhbHVlLCB2YWx1ZSBhcyBzdHJpbmddXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG4gICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5mb3JFYWNoKGZlID0+IGZlLmNoZWNrU2hvd0ZlZWRiYWNrKGlkZW50aWZpZXIpKTtcblxuICAgIHRoaXMuX2VtaXQ8T3V0Y29tZUNoYW5nZWREZXRhaWxzPigncXRpLW91dGNvbWUtY2hhbmdlZCcsIHtcbiAgICAgIGl0ZW06IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIG91dGNvbWVJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpPy52YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29tcGxldGlvblN0YXR1cygpOiAnY29tcGxldGVkJyB8ICdpbmNvbXBsZXRlJyB8ICdub3RfYXR0ZW1wdGVkJyB8ICd1bmtub3duJyB7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZXZlcnkoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdjb21wbGV0ZWQnO1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLnNvbWUoaW50ZXJhY3Rpb25FbGVtZW50ID0+IGludGVyYWN0aW9uRWxlbWVudC52YWxpZGF0ZSgpKSkgcmV0dXJuICdpbmNvbXBsZXRlJztcbiAgICByZXR1cm4gJ25vdF9hdHRlbXB0ZWQnO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdDxUPihuYW1lLCBkZXRhaWwgPSBudWxsKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFQ+KG5hbWUsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nOiBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgVXBkYXRlSGFuZGxlciA9IChwcmV2PzogdW5rbm93biwgbmV4dD86IHVua25vd24pID0+IHZvaWQ7XG5cbnR5cGUgTm9uVW5kZWZpbmVkPEE+ID0gQSBleHRlbmRzIHVuZGVmaW5lZCA/IG5ldmVyIDogQTtcblxuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KFxuICAgIHByb3RvOiBFbGVtQ2xhc3MsXG4gICAgZGVjb3JhdGVkRm5OYW1lOiBVcGRhdGVIYW5kbGVyRnVuY3Rpb25LZXlzPEVsZW1DbGFzcz4gfCBhbnlcbiAgKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KFN5bWJvbCgnaXRlbScpKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSB9IGZyb20gJy4uLy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjdXN0b20gZWxlbWVudCBmb3IgcmVmZXJlbmNpbmcgYW4gYXNzZXNzbWVudCBzdGltdWx1cy5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZicpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaHJlZiBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaHJlZiA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgaWYgdGhlICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJyBldmVudCBpcyBub3QgcHJldmVudGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBpc1ByZXZlbnRlZCA9IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcblxuICAgICAgY29uc3Qgc3RpbXVsdXNSZWYgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0aW11bHVzLWlkcmVmPSR7dGhpcy5pZGVudGlmaWVyfV1gKTtcbiAgICAgIGlmIChzdGltdWx1c1JlZikge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkuaHRtbERvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5pbm5lckhUTUwgPSAnJztcbiAgICAgIHN0aW11bHVzUmVmLmFwcGVuZCguLi5lbGVtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZic6IFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZjtcbiAgfVxufVxuIiwgImNvbnN0IHhtbCA9IFN0cmluZy5yYXc7XG5cbi8qICAgPCEtLSBjb252ZXJ0IENEQVRBIHRvIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwidGV4dCgpW2NvbnRhaW5zKC4sICdDREFUQScpXVwiPlxuICA8eHNsOmNvbW1lbnQ+XG4gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICA8L3hzbDpjb21tZW50PlxuPC94c2w6dGVtcGxhdGU+XG4qL1xuXG4vKlxuICA8IS0tIHJlbW92ZSB4bWwgY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJjb21tZW50KClcIiAvPlxuICAqL1xuXG5jb25zdCB4bWxUb0hUTUwgPSB4bWxgPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249XCIxLjBcIiB4bWxuczp4c2w9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm1cIj5cbjx4c2w6b3V0cHV0IG1ldGhvZD1cImh0bWxcIiB2ZXJzaW9uPVwiNS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIGluZGVudD1cInllc1wiIC8+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJAKnxub2RlKClcIj5cbiAgICA8eHNsOmNvcHk+XG4gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJAKnxub2RlKClcIi8+XG4gICAgPC94c2w6Y29weT5cbiAgPC94c2w6dGVtcGxhdGU+XG5cbiAgPCEtLSByZW1vdmUgZXhpc3RpbmcgbmFtZXNwYWNlcyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIipcIj5cbiAgICA8IS0tIHJlbW92ZSBlbGVtZW50IHByZWZpeCAtLT5cbiAgICA8eHNsOmVsZW1lbnQgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICA8IS0tIHByb2Nlc3MgYXR0cmlidXRlcyAtLT5cbiAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PVwiQCpcIj5cbiAgICAgICAgPCEtLSByZW1vdmUgYXR0cmlidXRlIHByZWZpeCAtLT5cbiAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICAgICAgICA8L3hzbDphdHRyaWJ1dGU+XG4gICAgICA8L3hzbDpmb3ItZWFjaD5cbiAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+XG4gIDwveHNsOmVsZW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbjwveHNsOnN0eWxlc2hlZXQ+YDtcblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGVsZW1lbnRzIHdpdGggYSBzcGVjaWZpYyB0YWcgbmFtZSBieSBhZGRpbmcgYW4gZXh0ZW5zaW9uIHN1ZmZpeFxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgdGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke3RhZ05hbWV9LSR7ZXh0ZW5zaW9ufWA7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICB9KTtcbn1cblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGFueSBlbGVtZW50IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBwYXR0ZXJuIChlLmcuLCBcImV4dGVuZDpzdWZmaXhcIilcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIGNsYXNzTmFtZVBhdHRlcm46IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICBpZiAoY2xhc3NMaXN0KSB7XG4gICAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoYCR7Y2xhc3NOYW1lUGF0dGVybn06YCkpIHtcbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBjbGFzc05hbWUuc2xpY2UoYCR7Y2xhc3NOYW1lUGF0dGVybn06YC5sZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHtlbGVtZW50Lm5vZGVOYW1lfS0ke3N1ZmZpeH1gO1xuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgICAgICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbGVtZW50IHdpdGggYSBuZXcgdGFnIG5hbWUgYW5kIGNvcHkgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKSB7XG4gIGNvbnN0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld1RhZ05hbWUpO1xuICAvLyBDb3B5IGF0dHJpYnV0ZXNcbiAgZm9yIChjb25zdCBhdHRyIG9mIGVsZW1lbnQuYXR0cmlidXRlcykge1xuICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gIH1cbiAgLy8gQ29weSBjaGlsZCBub2Rlc1xuICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlbXNGcm9tVGVzdCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBpdGVtczogeyBpZGVudGlmaWVyOiBzdHJpbmc7IGhyZWY6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZyB9W10gPSBbXTtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWFzc2Vzc21lbnQtaXRlbS1yZWYnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgaHJlZiA9IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gZWwuZ2V0QXR0cmlidXRlKCdjYXRlZ29yeScpO1xuICAgIGl0ZW1zLnB1c2goeyBpZGVudGlmaWVyLCBocmVmLCBjYXRlZ29yeSB9KTtcbiAgfSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxubGV0IGN1cnJlbnRSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFhNTCh1cmwsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKSB7XG4gIGlmIChjYW5jZWxQcmV2aW91c1JlcXVlc3QgJiYgY3VycmVudFJlcXVlc3QgIT09IG51bGwpIHtcbiAgICBjdXJyZW50UmVxdWVzdC5hYm9ydCgpOyAvLyBBYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0IGlmIHRoZXJlIGlzIG9uZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFhNTERvY3VtZW50IHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGN1cnJlbnRSZXF1ZXN0ID0geGhyOyAvLyBTdG9yZSB0aGUgY3VycmVudCByZXF1ZXN0XG5cbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcblxuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICByZXNvbHZlKHhoci5yZXNwb25zZVhNTCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgfTtcblxuICAgIHhoci5zZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUwoeG1sRG9jdW1lbnQ6IHN0cmluZykge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IHhtbEZyYWdtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxEb2N1bWVudCwgJ3RleHQveG1sJyk7XG4gIHJldHVybiB4bWxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSFRNTCh4bWxGcmFnbWVudDogRG9jdW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFhTTFRQcm9jZXNzb3IoKTtcbiAgY29uc3QgeHNsdERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxUb0hUTUwsICd0ZXh0L3htbCcpO1xuICBwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2x0RG9jdW1lbnQpO1xuICBjb25zdCBpdGVtSFRNTEZyYWdtZW50ID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQoeG1sRnJhZ21lbnQsIGRvY3VtZW50KTtcbiAgcmV0dXJuIGl0ZW1IVE1MRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhdGlvbih4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCwgbG9jYXRpb246IHN0cmluZykge1xuICBpZiAoIWxvY2F0aW9uLmVuZHNXaXRoKCcvJykpIHtcbiAgICBsb2NhdGlvbiArPSAnLyc7XG4gIH1cblxuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3JjXSxbaHJlZl0sW3ByaW1hcnktcGF0aF0nKS5mb3JFYWNoKGVsV2l0aFNyYyA9PiB7XG4gICAgbGV0IGF0dHI6ICdzcmMnIHwgJ2hyZWYnIHwgJ3ByaW1hcnktcGF0aCcgfCAnJyA9ICcnO1xuXG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgICBhdHRyID0gJ3NyYyc7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgIGF0dHIgPSAnaHJlZic7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKSkge1xuICAgICAgYXR0ciA9ICdwcmltYXJ5LXBhdGgnO1xuICAgIH1cbiAgICBjb25zdCBhdHRyVmFsdWUgPSBlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKGF0dHIpPy50cmltKCk7XG5cbiAgICBpZiAoIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICBjb25zdCBuZXdTcmNWYWx1ZSA9IGxvY2F0aW9uICsgZW5jb2RlVVJJKGF0dHJWYWx1ZSk7XG4gICAgICBlbFdpdGhTcmMuc2V0QXR0cmlidXRlKGF0dHIsIG5ld1NyY1ZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGNkYXRhRWxlbWVudHMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktY3VzdG9tLW9wZXJhdG9yW2NsYXNzPVwianMub3JnXCJdID4gcXRpLWJhc2UtdmFsdWUnKTtcbiAgY2RhdGFFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNvbW1lbnRUZXh0ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlbGVtZW50LnRleHRDb250ZW50KTtcbiAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChjb21tZW50VGV4dCwgZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIC8vIHJlbW92ZSBxdGktc3R5bGVzaGVldCB0YWdcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0eWxlc2hlZXQnKS5mb3JFYWNoKHN0eWxlc2hlZXQgPT4gc3R5bGVzaGVldC5yZW1vdmUoKSk7XG59XG4iLCAiLyoqXG4gKiBCcm93c2VyIGJhc2VkIFFUSS1YTUwgdG8gSFRNTCB0cmFuc2Zvcm1lci5cbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1JdGVtKCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdwYXRoL3RvL3htbC9maWxlLnhtbCcpO1xuICogcXRpVHJhbnNmb3JtZXIucGF0aCgnL2Fzc2Vzc21lbnRJdGVtL2l0ZW1Cb2R5Jyk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKiBjb25zdCBodG1sZG9jID0gcXRpVHJhbnNmb3JtZXIuaHRtbGRvYygpO1xuICogY29uc3QgeG1sZG9jID0gcXRpVHJhbnNmb3JtZXIueG1sZG9jKCk7XG4gKlxuICogcXRpVHJhbnNmb3JtSXRlbSgpLnBhcnNlKHN0b3J5WE1MKS5odG1sKClcbiAqL1xuXG5pbXBvcnQge1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQsXG4gIGV4dGVuZEVsZW1lbnROYW1lLFxuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyxcbiAgbG9hZFhNTCxcbiAgcGFyc2VYTUwsXG4gIHNldExvY2F0aW9uLFxuICBzdHJpcFN0eWxlU2hlZXRzLFxuICB0b0hUTUxcbn0gZnJvbSAnLi9xdGktdHJhbnNmb3JtZXJzJztcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgbG9hZDogKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3Q/OiBib29sZWFuKSA9PiBQcm9taXNlPHRyYW5zZm9ybUl0ZW1BcGk+O1xuICBwYXJzZTogKHhtbFN0cmluZzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwYXRoOiAobG9jYXRpb246IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZm46IChmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGNpSG9va3M6ICh1cmk6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudE5hbWU6IChlbGVtZW50TmFtZTogc3RyaW5nLCBleHRlbmQ6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbT86IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY3VzdG9tSW50ZXJhY3Rpb246IChiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudDogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgc3RyaXBTdHlsZVNoZWV0czogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgaHRtbDogKCkgPT4gc3RyaW5nO1xuICB4bWw6ICgpID0+IHN0cmluZztcbiAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgeG1sRG9jOiAoKSA9PiBYTUxEb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1JdGVtID0gKCkgPT4ge1xuICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuXG4gIGNvbnN0IGFwaTogdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgICBhc3luYyBsb2FkKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSk6IFByb21pc2U8dHlwZW9mIGFwaT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHR5cGVvZiBhcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbG9hZFhNTCh1cmksIGNhbmNlbFByZXZpb3VzUmVxdWVzdCkudGhlbih4bWwgPT4ge1xuICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgIC8vIHNldCB0aGUgYmFzZSBwYXRoIGZvciBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyxcbiAgICAgICAgICAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBzZXQgdGhlIGJhc2UgcGF0aCB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbHNlIHlvdSBjYW4gdXNlIHRoZSBwYXRoIG1ldGhvZCB0byBzZXQgaXRcbiAgICAgICAgICBhcGkucGF0aCh1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhcnNlKHhtbFN0cmluZzogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIHNldExvY2F0aW9uKHhtbEZyYWdtZW50LCBsb2NhdGlvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZm4oZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwY2lIb29rcyh1cmk6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFsnaG9vaycsICdtb2R1bGUnXTtcbiAgICAgIGNvbnN0IGRvY3VtZW50UGF0aCA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBzcmNBdHRyaWJ1dGVzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBhdHRyaWJ1dGUgKyAnXScpO1xuICAgICAgICBzcmNBdHRyaWJ1dGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpITtcbiAgICAgICAgICBpZiAoIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgLy8gSnVzdCBwYXN0ZSB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgc3JjIGxvY2F0aW9uIGFmdGVyIHRoZSBkb2N1bWVudHJvb3RQYXRoXG4gICAgICAgICAgICAvLyBvbGQgcGNpcyBjYW4gaGF2ZSBhIC5qcywgbmV3IHBjaSdzIGRvbid0XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYmFzZS11cmwnLCB1cmkpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdtb2R1bGUnLFxuICAgICAgICAgICAgICBkb2N1bWVudFBhdGggKyAnLycgKyBlbmNvZGVVUkkoc3JjVmFsdWUgKyAoc3JjVmFsdWUuZW5kc1dpdGgoJy5qcycpID8gJycgOiAnLmpzJykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudE5hbWU6ICh0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudCwgdGFnTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtOiBzdHJpbmcgPSAnZXh0ZW5kJyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQsIHBhcmFtKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjdXN0b21JbnRlcmFjdGlvbihiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvcigncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpO1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QgPSBxdGlDdXN0b21JbnRlcmFjdGlvbi5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtcmVmJywgYmFzZVJlZik7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1pdGVtJywgYmFzZVJlZiArIGJhc2VJdGVtKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YScsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucmVtb3ZlQ2hpbGQocXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCgpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgc3RyaXBTdHlsZVNoZWV0cygpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGh0bWwoKSB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0b0hUTUwoeG1sRnJhZ21lbnQpKTtcbiAgICB9LFxuICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgaHRtbERvYygpIHtcbiAgICAgIHJldHVybiB0b0hUTUwoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgIHJldHVybiB4bWxGcmFnbWVudDsgLy8gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBpO1xufTtcbiIsICJpbXBvcnQgeyBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VJbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0ZXIgdG8gaGFuZGxlIGJvb2xlYW4gYXR0cmlidXRlcyBmb3IgQVJJQSBwcm9wZXJ0aWVzLFxuICogZW5zdXJpbmcgdGhleSBhcmUgc2V0IGFzICd0cnVlJyBvciAnZmFsc2UnIHN0cmluZ3MuXG4gKi9cbmNvbnN0IGFyaWFCb29sZWFuQ29udmVydGVyOiBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyPGJvb2xlYW4sIGJvb2xlYW4+ID0ge1xuICB0b0F0dHJpYnV0ZTogKHZhbHVlOiBib29sZWFuKSA9PiAodmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKSxcbiAgZnJvbUF0dHJpYnV0ZTogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2YWx1ZSA9PT0gJ3RydWUnXG59O1xuXG4vKipcbiAqIEEgbWl4aW4gdGhhdCBhZGRzIGNob2ljZSBmdW5jdGlvbmFsaXR5IHRvIGEgTGl0RWxlbWVudC1iYXNlZCBjbGFzcy5cbiAqIEl0IGRpc3BhdGNoZXMgZXZlbnRzIHdpdGggYSBjdXN0b20gYHR5cGVgIGFuZCBoYW5kbGVzIHNlbGVjdGlvbiBsb2dpYy5cbiAqXG4gKiBAcGFyYW0gQmFzZSAtIFRoZSBiYXNlIGNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGNob2ljZSwgdXNlZCBpbiBldmVudCBuYW1lcy5cbiAqIEByZXR1cm5zIEEgbmV3IGNsYXNzIGV4dGVuZGluZyB0aGUgYmFzZSBjbGFzcyB3aXRoIGNob2ljZSBmdW5jdGlvbmFsaXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUVsZW1lbnRNaXhpbkludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgdGFiSW5kZXg6IG51bWJlcjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xuICBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEFjdGl2ZUVsZW1lbnRNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I8TGl0RWxlbWVudD4+KEJhc2U6IFQsIHR5cGU6IHN0cmluZykge1xuICBhYnN0cmFjdCBjbGFzcyBRdGlDaG9pY2UgZXh0ZW5kcyBCYXNlIHtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgICBwdWJsaWMgaWRlbnRpZmllciA9ICcnO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICd0YWJpbmRleCcgfSlcbiAgICBwdWJsaWMgdGFiSW5kZXggPSAwO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1kaXNhYmxlZCcsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBoYW5kbGVEaXNhYmxlZENoYW5nZShfb2xkVmFsdWU6IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICB0aGlzLnRhYkluZGV4ID0gZGlzYWJsZWQgPyAtMSA6IDA7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuICAgICAgdGhpcy5pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgcmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGB1bnJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuYWx0S2V5KSByZXR1cm47XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSAnU3BhY2UnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25DbGljaygpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIHRoaXMuX2FjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWN0aXZhdGUoKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KGBhY3RpdmF0ZS0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gUXRpQ2hvaWNlIGFzIENvbnN0cnVjdG9yPEFjdGl2ZUVsZW1lbnRNaXhpbkludGVyZmFjZT4gJiBUO1xufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktaXRlbS1ib2R5LnN0eWxlcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgcXRpLWl0ZW0tYm9keSBub2RlIGNvbnRhaW5zIHRoZSB0ZXh0LCBncmFwaGljcywgbWVkaWEgb2JqZWN0cyBhbmQgaW50ZXJhY3Rpb25zIHRoYXQgZGVzY3JpYmUgdGhlIGl0ZW0ncyBjb250ZW50IGFuZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgaXQgaXMgc3RydWN0dXJlZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guc3BocG82bHU2enFpXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDQuMFxuICpcbiAqIEBzbG90IC0gaXRlbSBib2R5IGNvbnRlbnQuXG4gKiBAc2xvdCBxdGktcnVicmljLWJsb2NrIC0gdGhlIHF0aSBydWJyaWMgYmxvY2sgaXMgcGxhY2VkIGFib3ZlIHRoZSBpdGVtXG4gKlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWl0ZW0tYm9keScpXG5leHBvcnQgY2xhc3MgUXRpSXRlbUJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJxdGktcnVicmljLWJsb2NrXCI+PC9zbG90PjxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pdGVtLWJvZHknOiBRdGlJdGVtQm9keTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbkBjdXN0b21FbGVtZW50KCdxdGktcHJvbXB0JylcbmV4cG9ydCBjbGFzcyBRdGlQcm9tcHQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gaWYgcHJvbXB0cyBhcmUgaW4gaW50ZXJhY3Rpb25zIHRoZXkgc2hvdWxkIGhhdmUgYSBzbG90LCBzbyB0aGUgcHJvbXB0IGhhcyB0byBnbyB0aGVyZVxuICAgIC8vIGlmIHByb21wdCBpcyBpbiB0aGUgYm9keSwgdGhlbiBqdXN0IGRpc3BsYXkgdGhlIHByb21wdCB0aGVyZS5cbiAgICAvLyBBIGJldHRlciBjaGVjayB3b3VsZCBiZSB0aGUgbGF0dGVyLCBidXQgbm90IGNhbid0IGdldCB0aHJvdWdoIHRoZSBzaGFkb3dyb290IHRvIGZpbmQgdGhlIHNsb3RcbiAgICBjb25zdCBpbkludGVyYWN0aW9uID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUuZW5kc1dpdGgoJ0lOVEVSQUNUSU9OJyk7XG4gICAgaWYgKGluSW50ZXJhY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3Byb21wdCcpO1xuICAgIH1cbiAgICAvLyBjb25zdCBwcm9tcHRTbG90ID0gdGhpcy5wYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIltuYW1lPSdwcm9tcHQnXVwiKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcHJvbXB0JzogUXRpUHJvbXB0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXN0eWxlc2hlZXQnKVxuZXhwb3J0IGNsYXNzIFF0aVN0eWxlc2hlZXQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdHlsZUVsZW1lbnQ6IEhUTUxTdHlsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICBpZiAobGluayAhPT0gbnVsbCkge1xuICAgICAgLy8gRmV0Y2ggdGhlIHN0eWxlc2hlZXQgY29udGVudFxuICAgICAgZmV0Y2gobGluaylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UudGV4dCgpKVxuICAgICAgICAudGhlbihjc3NDb250ZW50ID0+IHtcbiAgICAgICAgICAvLyBNaW5pZnkgdGhlIENTUyBjb250ZW50IGJ5IHJlbW92aW5nIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzXG4gICAgICAgICAgY29uc3QgbWluaWZpZWRDc3MgPSB0aGlzLm1pbmlmeUNzcyhjc3NDb250ZW50KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIEBzY29wZSBzdXJyb3VuZGluZyB0aGUgbWluaWZpZWQgQ1NTXG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBgQHNjb3BlIHske21pbmlmaWVkQ3NzfX1gO1xuXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2V4dGVybmFsLXNjb3JlZCcgfSkgZXh0ZXJuYWxTY29yZWQ6ICdodW1hbicgfCAnZXh0ZXJuYWxNYWNoaW5lJyB8IG51bGwgPSBudWxsO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGU6IE91dGNvbWVWYXJpYWJsZSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5LFxuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICB0eXBlOiAnb3V0Y29tZScsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGludGVycG9sYXRpb25UYWJsZTogdGhpcy5pbnRlcnBvbGF0aW9uVGFibGUsXG4gICAgICBleHRlcm5hbFNjb3JlZDogdGhpcy5leHRlcm5hbFNjb3JlZFxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IG91dGNvbWVWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nOiBRdGlPdXRjb21lRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmFsdWVzKHZhcmlhYmxlOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4pIHtcbiAgICBjb25zdCBodG1sVmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1kZWZhdWx0LXZhbHVlID4gcXRpLXZhbHVlJykpO1xuXG4gICAgaWYgKGh0bWxWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gaHRtbFZhbHVlcy5tYXAobiA9PiBuLmlubmVySFRNTC50cmltKCkpO1xuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzWzBdO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJzogUXRpVmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBpdGVtQ29udGV4dCwgSXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlGZWVkYmFjayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Nob3ctaGlkZScgfSlcbiAgcHJvdGVjdGVkIHNob3dIaWRlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdvdXRjb21lLWlkZW50aWZpZXInIH0pXG4gIHB1YmxpYyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwcm90ZWN0ZWQgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2hvd1N0YXR1czogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tTaG93RmVlZGJhY2sob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZykgeyAgICBcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBvdXRjb21lSWRlbnRpZmllcikgfHwgbnVsbDs7XG5cbiAgICBpZiAodGhpcy5vdXRjb21lSWRlbnRpZmllciAhPT0gb3V0Y29tZUlkZW50aWZpZXIgfHwgIW91dGNvbWVWYXJpYWJsZSkgcmV0dXJuO1xuICAgIGxldCBpc0ZvdW5kID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0Y29tZVZhcmlhYmxlLnZhbHVlKSkge1xuICAgICAgaXNGb3VuZCA9IG91dGNvbWVWYXJpYWJsZS52YWx1ZS5pbmNsdWRlcyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0ZvdW5kID1cbiAgICAgICAgKCFJc051bGxPclVuZGVmaW5lZCh0aGlzLmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgIUlzTnVsbE9yVW5kZWZpbmVkKG91dGNvbWVWYXJpYWJsZT8udmFsdWUpICYmXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyID09PSBvdXRjb21lVmFyaWFibGUudmFsdWUpIHx8XG4gICAgICAgIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrKGlzRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RmVlZGJhY2sodmFsdWU6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy5zaG93U3RhdHVzID0gKHZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdzaG93JykgfHwgKCF2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnaGlkZScpID8gJ29uJyA6ICdvZmYnOyAgICBcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWNpbWFsU2VwYXJhdG9yID0gKCkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KDAuMSkucmVwbGFjZSgvXFxkL2csICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCA9IChudW1iZXI6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAvLyBjaGVjayBpZiB0eXBlIGlzIHN0cmluZ1xuICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIGNvbnN0IGRTZXAgPSBkZWNpbWFsU2VwYXJhdG9yKCk7XG4gIGlmIChkU2VwID09PSAnLicpIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZShkU2VwLCAnLicpO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3Jvd3MgPSA1O1xuXG4gIC8qKiBleHBlY3RlZCBsZW5ndGggaXMgbWFwcGVkIHRvIHRoZSBwcm9wZXJ0eSBtYXhsZW5ndGggb24gdGhlIHRleHRhcmVhICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIC8qKiB0ZXh0IGFwcGVhcmluZyBpbiB0aGUgZXh0ZW5kZWQtdGV4dC1udGVyYWN0aW9uIGlmIGl0IGlzIGVtcHR5ICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycpXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBjbGFzc2VzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgIGxldCByb3dzU2V0ID0gZmFsc2U7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdxdGktaGVpZ2h0LWxpbmVzLScpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaGVpZ2h0LWxpbmVzLScsICcnKTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHBhcnNlSW50KG5yUm93cyk7XG4gICAgICAgIHJvd3NTZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIElmIG5vIHF0aS1oZWlnaHQtbGluZXMgY2xhc3MgaXMgc2V0LCBjYWxjdWxhdGUgcm93cyBiYXNlZCBvbiBleHBlY3RlZExlbmd0aFxuICAgIGlmICghcm93c1NldCAmJiB0aGlzLmV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRSb3dzID0gTWF0aC5jZWlsKHRoaXMuZXhwZWN0ZWRMZW5ndGggLyA1MCk7IC8vICAnNTAnIGJhc2VkIG9uIGFuIGVzdGltYXRlIGZvciBjaGFyYWN0ZXJzIHBlciByb3dcbiAgICAgIHRoaXMuX3Jvd3MgPSBlc3RpbWF0ZWRSb3dzO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGluaXRpYWxseVxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KCcnKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5Tb3VyY2UgPVxuICAgICAgICB0aGlzLnBhdHRlcm5NYXNrLnN0YXJ0c1dpdGgoJ14nKSAmJiB0aGlzLnBhdHRlcm5NYXNrLmVuZHNXaXRoKCckJykgPyB0aGlzLnBhdHRlcm5NYXNrIDogYF4ke3RoaXMucGF0dGVybk1hc2t9JGA7XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm5Tb3VyY2UpO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKSAmJiBwYXR0ZXJuLnRlc3QodGV4dGFyZWEudmFsdWUpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0ZXh0YXJlYS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIC8qIFBLOiBkaXNwbGF5IGhvc3QgYXMgYmxvY2ssIGVsc2UgZGVzaWduIHdpbGwgYmUgY29sbGFwc2VkICovXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0YXJlYSB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90XG4gICAgICA+PHRleHRhcmVhXG4gICAgICAgIHBhcnQ9XCJ0ZXh0YXJlYVwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7NTAwMH1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIHJvd3M9XCIke3RoaXMuX3Jvd3N9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgICAudmFsdWU9JHt0aGlzLl92YWx1ZX1cbiAgICAgID48L3RleHRhcmVhPmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nOiBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW50ZXJhY3Rpb24gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgSUludGVyYWN0aW9uIHtcbiAgc3RhdGljIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTsgLy8gRW5hYmxlIGZvcm0gYXNzb2NpYXRpb25cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXIgPSAnJztcbiAgLyoqIGRpc2FibGVkIHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogcmVhZG9ubHkgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBfY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICBwcm90ZWN0ZWQgX2ludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gIH1cblxuICBhYnN0cmFjdCB2YWxpZGF0ZSgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk7XG5cbiAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gIH1cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzJztcbkBjdXN0b21FbGVtZW50KCdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIGlucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGlmIHRoZSBpbnB1dCBpcyB2YWxpZFxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KCcnKTsgLy8gQ2xlYXIgdGhlIGN1c3RvbSBtZXNzYWdlXG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpOyAvLyBTZXQgY3VzdG9tIG1lc3NhZ2Ugb25seSBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGlucHV0XG4gICAgICAgIHBhcnQ9XCJpbnB1dFwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIHR5cGU9XCIke3RoaXMucGF0dGVybk1hc2sgPT0gJ1swLTldKicgPyAnbnVtYmVyJyA6ICd0ZXh0J31cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fdmFsdWV9XCJcbiAgICAgICAgcGF0dGVybj1cIiR7aWZEZWZpbmVkKHRoaXMucGF0dGVybk1hc2sgPyB0aGlzLnBhdHRlcm5NYXNrIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBtYXhsZW5ndGg9JHsxMDAwfVxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBwYXJ0PVwiY29ycmVjdFwiPiR7dGhpcy5fY29ycmVjdFJlc3BvbnNlfTwvZGl2PlxuICAgIGA7XG4gIH1cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJzogUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgW3BhcnQ9J2NvcnJlY3QnXSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxLjFyZW07XG4gICAgbWluLXdpZHRoOiAxLjFyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMi4zcmVtO1xuICAgIG1pbi13aWR0aDogMi4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMuM3JlbTtcbiAgICBtaW4td2lkdGg6IDMuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0LjJyZW07XG4gICAgbWluLXdpZHRoOiA0LjJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTYpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNi42cmVtO1xuICAgIG1pbi13aWR0aDogNi42cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA4cmVtO1xuICAgIG1pbi13aWR0aDogOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTJyZW07XG4gICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTdyZW07XG4gICAgbWluLXdpZHRoOiAxN3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgbWluLXdpZHRoOiAyMHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjRyZW07XG4gICAgbWluLXdpZHRoOiAyNHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjhyZW07XG4gICAgbWluLXdpZHRoOiAyOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzJyZW07XG4gICAgbWluLXdpZHRoOiAzMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzZyZW07XG4gICAgbWluLXdpZHRoOiAzNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNDByZW07XG4gICAgbWluLXdpZHRoOiA0MHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNzIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNTdyZW07XG4gICAgbWluLXdpZHRoOiA1N3JlbTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5pbXBvcnQgeyBDaG9pY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCB0eXBlIENob2ljZSA9IEhUTUxFbGVtZW50ICYgQ2hvaWNlSW50ZXJmYWNlICYgeyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHMgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VzSW50ZXJmYWNlIGV4dGVuZHMgSUludGVyYWN0aW9uIHtcbiAgY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IENob2ljZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIENob2ljZXNNaXhpbkVsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZSB7XG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50czogQ2hvaWNlW10gPSBbXTtcblxuICAgIEBxdWVyeSgnI3ZhbGlkYXRpb25NZXNzYWdlJylcbiAgICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQhOiBIVE1MRWxlbWVudDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWluLWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1pbkNob2ljZXMgPSAwO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWF4Q2hvaWNlcyA9IDE7XG5cbiAgICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlKF9vbGRWYWx1ZTogbnVtYmVyLCBfbmV3VmFsdWU6IG51bWJlcikge1xuICAgICAgdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG4gICAgfVxuXG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gICAgfTtcblxuICAgIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChfOiBib29sZWFuLCByZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4gKGNob2ljZS5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlLmpvaW4oJywnKSA6IHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID4gMSAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbC5zcGxpdCgnLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWluZyB0aGlzLnZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB0aGlzLl92YWx1ZS5mb3JFYWNoKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoaXMudmFsdWUgaXMgbm90IGFuIGFycmF5XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvcnJlY3RSZXNwb25zZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX2NvcnJlY3RSZXNwb25zZSA9IHZhbHVlO1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChyZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fcmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgdW5yZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgYWN0aXZhdGUtJHtzZWxlY3Rvcn1gLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aDtcbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIGxldCB2YWxpZGl0eU1lc3NhZ2UgPSAnJztcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgIT09IDAgJiYgc2VsZWN0ZWRDb3VudCA+IHRoaXMubWF4Q2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5tYXhTZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IGNhbiBzZWxlY3QgYXQgbW9zdCAke3RoaXMubWF4Q2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZENvdW50IDwgdGhpcy5taW5DaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1pblNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgbXVzdCBzZWxlY3QgYXQgbGVhc3QgJHt0aGlzLm1pbkNob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eShcbiAgICAgICAgICBpc1ZhbGlkID8ge30gOiB7IGN1c3RvbUVycm9yOiB0cnVlIH0sXG4gICAgICAgICAgdmFsaWRpdHlNZXNzYWdlLFxuICAgICAgICAgIHNlbGVjdGVkQ2hvaWNlc1tzZWxlY3RlZENvdW50IC0gMV0gfHwgdGhpcy5fY2hvaWNlRWxlbWVudHNbMF0gfHwgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgICBpZiAodGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5faW50ZXJuYWxzLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgY2hvaWNlRWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IGNob2ljZSAhPT0gY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50OiBDaG9pY2UpIHtcbiAgICAgIHRoaXMuX2ludGVybmFscy5hcmlhTGFiZWwgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8tZ3JvdXAnIDogJ2NoZWNrYm94LWdyb3VwJztcblxuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnO1xuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMuc3RhdGVzLmFkZChjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIoZXZlbnQ6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nIH0+KSB7XG4gICAgICB0aGlzLl90b2dnbGVDaG9pY2VDaGVja2VkKGV2ZW50LnRhcmdldCBhcyBDaG9pY2UpO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgICAgaWYgKGNob2ljZS5pZGVudGlmaWVyICE9PSBldmVudC5kZXRhaWwuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5faGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSwgY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgaWYgKGNob2ljZS5pbnRlcm5hbHM/LnN0YXRlcykge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICd0cnVlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmhhcygnLS1jaGVja2VkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdG9nZ2xlQ2hvaWNlQ2hlY2tlZChjaG9pY2U6IENob2ljZSkge1xuICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKTtcbiAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCAhY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJZGVudGlmaWVycyA9IHNlbGVjdGVkQ2hvaWNlcy5tYXAoY2hvaWNlID0+IGNob2ljZS5pZGVudGlmaWVyKTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/IHNlbGVjdGVkSWRlbnRpZmllcnNbMF0gfHwgJycgOiBzZWxlY3RlZElkZW50aWZpZXJzO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBlYWNoIGNob2ljZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSA/IHRoaXMuX3ZhbHVlIDogW3RoaXMuX3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpO1xuICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgaXNTZWxlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIENob2ljZXNNaXhpbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Q2hvaWNlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3Vuc2FmZS1odG1sLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgT3B0aW9uVHlwZSB7XG4gIHRleHRDb250ZW50OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xufVxuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHNsb3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgfVxuICAgICAgICBbcm9sZT0nbWVudSddIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgei1pbmRleDogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAuYW5jaG9yIHtcbiAgICAgICAgICAvKiBhbmNob3ItbmFtZTogLS1pbmZvYm94OyAqL1xuICAgICAgICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wb3NpdGlvbmVkRWxlbWVudCB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIC8qIHBvc2l0aW9uLWFuY2hvcjogLS1pbmZvYm94OyAqL1xuICAgICAgICAgIC8qIHRvcDogYW5jaG9yKGJvdHRvbSk7ICovXG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbnB1dFdpZHRoQ2xhc3MgPSBbXG4gICAgJycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC00JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTYnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTUnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMjAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNzInXG4gIF07XG5cbiAgQHN0YXRlKCkgb3B0aW9uczogT3B0aW9uVHlwZVtdID0gW107XG5cbiAgQHN0YXRlKCkgY29ycmVjdE9wdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0YS1wcm9tcHQnLCB0eXBlOiBTdHJpbmcgfSlcbiAgZGF0YVByb21wdDogc3RyaW5nID0gJ3NlbGVjdCc7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNlbGVjdCBwYXJ0PVwic2VsZWN0XCIgQGNoYW5nZT1cIiR7dGhpcy5jaG9pY2VTZWxlY3RlZH1cIiA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCIgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiPlxuICAgICAgICAke3RoaXMub3B0aW9ucy5tYXAoXG4gICAgICAgICAgb3B0aW9uID0+IGh0bWxgXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiJHtvcHRpb24udmFsdWV9XCIgP3NlbGVjdGVkPVwiJHtvcHRpb24uc2VsZWN0ZWR9XCI+JHt1bnNhZmVIVE1MKG9wdGlvbi50ZXh0Q29udGVudCl9PC9vcHRpb24+XG4gICAgICAgICAgYFxuICAgICAgICApfVxuICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICR7dW5zYWZlSFRNTCh0aGlzLmNvcnJlY3RPcHRpb24pfVxuICAgIGA7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignb24tZHJvcGRvd24tc2VsZWN0ZWQnLCB0aGlzLmNob2ljZVNlbGVjdGVkKTtcbiAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbmxpbmUtY2hvaWNlJykpO1xuICAgIHRoaXMub3B0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IHRoaXMuZGF0YVByb21wdCxcbiAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0sXG4gICAgICAuLi5jaG9pY2VzLm1hcChjaG9pY2UgPT4gKHtcbiAgICAgICAgdGV4dENvbnRlbnQ6IGNob2ljZS5pbm5lckhUTUwsXG4gICAgICAgIHZhbHVlOiBjaG9pY2UuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyksXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSkpXG4gICAgXTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignb24tZHJvcGRvd24tc2VsZWN0ZWQnLCB0aGlzLmNob2ljZVNlbGVjdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpO1xuICAgIHJldHVybiBzZWxlY3RlZE9wdGlvbiA/IHNlbGVjdGVkT3B0aW9uLnZhbHVlICE9PSAnJyA6IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAoKG9wdGlvbiwgaSkgPT4gKHsgLi4ub3B0aW9uLCBzZWxlY3RlZDogaSA9PT0gMCB9KSk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IG9wdGlvbi52YWx1ZSkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9KTtcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCkudmFsdWU7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSBgPHNwYW4gcGFydD1cImNvcnJlY3Qtb3B0aW9uXCI+JHtcbiAgICAgIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiB2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKS50ZXh0Q29udGVudFxuICAgIH08L3NwYW4+YDtcbiAgfVxuXG4gIHB1YmxpYyBjaG9pY2VTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvblZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4gKHsgLi4ub3B0aW9uLCBzZWxlY3RlZDogb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZE9wdGlvblZhbHVlIH0pKTtcbiAgICB0aGlzLnNhdmVSZXNwb25zZShzZWxlY3RlZE9wdGlvblZhbHVlKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc0ludGVyZmFjZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IFNodWZmbGVNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbic7XG5pbXBvcnQgeyBWb2NhYnVsYXJ5TWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC92b2NhYnVsYXJ5L3ZvY2FidWxhcnktbWl4aW4nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5leHBvcnQgdHlwZSBPcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgfCB1bmRlZmluZWQ7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2ludGVybmFscy5yb2xlID0gJ2dyb3VwJztcbiAgfVxuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246IE9yaWVudGF0aW9uO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgU2h1ZmZsZUludGVyZmFjZSB7fVxuZXhwb3J0IGNvbnN0IFNodWZmbGVNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNodWZmbGVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfc2h1ZmZsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBjb252ZXJ0ZXI6IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgc2V0IHNodWZmbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2h1ZmZsZTtcbiAgICAgIHRoaXMuX3NodWZmbGUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCdzaHVmZmxlJywgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBzaHVmZmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3NodWZmbGU7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgLy8gQ2FsbCBfcmVzZXRTaHVmZmxlQ2hvaWNlcyBpbml0aWFsbHkgdG8gc2V0IHRoZSBDU1Mgb3JkZXIgdG8gaW5pdGlhbC5cbiAgICAgIC8vIElmIHNodWZmbGUgaXMgdHJ1ZSwgX3NodWZmbGVDaG9pY2VzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBzZXR0ZXIuXG4gICAgICBpZiAodGhpcy5zaHVmZmxlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKSk7XG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTaHVmZmxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDsgLy8gTWF4IGF0dGVtcHRzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgb3JkZXIgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbLi4ubm9uRml4ZWRFbGVtZW50c107XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gIW5vbkZpeGVkRWxlbWVudHMuZXZlcnkoKGNob2ljZSwgaW5kZXgpID0+IGNob2ljZSA9PT0gb3JpZ2luYWxPcmRlcltpbmRleF0pO1xuXG4gICAgICAgIGlmIChpc1NodWZmbGVkKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NodWZmbGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNodWZmbGUgdGhlIGNob2ljZXMgYWZ0ZXIgbXVsdGlwbGUgYXR0ZW1wdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBvcmRlciB0byBlYWNoIGVsZW1lbnRcbiAgICAgIGxldCBvcmRlciA9IDE7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9uRml4ZWRDaG9pY2UgPSBub25GaXhlZEVsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgbm9uRml4ZWRDaG9pY2UhLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBMYWJlbFR5cGUgPSAncXRpLWxhYmVscy1kZWNpbWFsJyB8ICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJyB8ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbnR5cGUgTGFiZWxTdWZmaXhUeXBlID0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcgfCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnO1xuXG5kZWNsYXJlIGNsYXNzIFZvY2FidWxhcnlJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IFZvY2FidWxhcnlNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXSBhcyBMYWJlbFN1ZmZpeFR5cGVbXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzIGFzIExhYmVsU3VmZml4VHlwZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBpc051bWJlciA9IHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuICFpc05hTigrdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGlmIChjbGFzc0NvbnRhaW5zTGFiZWwpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSkubWFwKGMgPT4gYyBhcyBRdGlTaW1wbGVDaG9pY2UpO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gY2hvaWNlRWxlbWVudHNcbiAgICAgICAgICAubWFwKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgZWw6IGNob2ljZSwgb3JkZXI6IGlzTnVtYmVyKGNob2ljZS5zdHlsZS5vcmRlcikgPyArY2hvaWNlLnN0eWxlLm9yZGVyIDogaW5kZXggKyAxIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpXG4gICAgICAgICAgLm1hcChjaG9pY2UgPT4gY2hvaWNlLmVsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgKGNob2ljZXNbaV0gYXMgUXRpU2ltcGxlQ2hvaWNlKS5tYXJrZXIgPSB0aGlzLl9nZXRMYWJlbChpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWwoaW5kZXg6IG51bWJlcikge1xuICAgICAgbGV0IGxhc3RMYWJlbCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGMpKS5wb3AoKSBhcyBMYWJlbFR5cGU7XG4gICAgICBjb25zdCBsYXN0TGFiZWxTdWZmaXggPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoYyBhcyBMYWJlbFN1ZmZpeFR5cGUpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIFtwYXJ0PSdzbG90J10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLXF0aS1nYXAtc2l6ZSk7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG5cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtY2hvaWNlKSB7XG4gICAgZmxleDogMCAwXG4gICAgICBjYWxjKCgxMDAlIC0gKHZhcigtLXF0aS1nYXAtc2l6ZSkgKiB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkpIC8gdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpICFpbXBvcnRhbnQ7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTEpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAxO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTIpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAyO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0zKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNCkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDQ7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTUpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA1O1xuICB9XG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0b2xlcmFuY2VNb2RlOiAnZXhhY3QnIHwgJ3JlbGF0aXZlJyB8ICdhYnNvbHV0ZScgPSAnZXhhY3QnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnRvbGVyYW5jZU1vZGUgIT09ICdleGFjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndG9sZXJhbmNlTW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbCcsIFF0aUVxdWFsKTtcbiIsICJpbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNsYXNzIFNjb3JpbmdIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIGNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxOiBSZWFkb25seTxzdHJpbmc+LCB2YWx1ZTI6IFJlYWRvbmx5PHN0cmluZz4sIGJhc2VUeXBlOiBCYXNlVHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoYmFzZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyO1xuICAgICAgY2FzZSAnaW50ZWdlcic6IHtcbiAgICAgICAgY29uc3QgaW50MSA9IHBhcnNlSW50KHZhbHVlMSwgMTApO1xuICAgICAgICBjb25zdCBpbnQyID0gcGFyc2VJbnQodmFsdWUyLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oaW50MSkgJiYgIWlzTmFOKGludDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGludDEgPT09IGludDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gaW50LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxKTtcbiAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIpO1xuICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICByZXR1cm4gZmxvYXQxID09PSBmbG9hdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY291bGRuJ3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBmbG9hdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhaXInOlxuICAgICAgY2FzZSAnZGlyZWN0ZWRQYWlyJzoge1xuICAgICAgICBjb25zdCBwYWlyMSA9IHZhbHVlMS5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGFpcjIgPSB2YWx1ZTIuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGlmIChwYWlyMS5sZW5ndGggPT09IDIgJiYgcGFpcjIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKGJhc2VUeXBlID09PSAncGFpcicpIHtcbiAgICAgICAgICAgIHBhaXIxLnNvcnQoKTtcbiAgICAgICAgICAgIHBhaXIyLnNvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhaXIxLmpvaW4oJyAnKSA9PT0gcGFpcjIuam9pbignICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvbXBhcmVkIHR3byBwYWlyIGJ1dCBvbmUgb2YgdGhlIHZhbHVlcyBkb2VzIG5vdCBoYXZlIDIgdmFsdWVzOiAxOiAke3ZhbHVlMX0gMjogJHt2YWx1ZTJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvaW50ID0gbnVsbDsgLy8gUG9pbnQgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgbGFzdENsaWNrVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgcHJldmlvdXMgY2xpY2tcbiAgcHJpdmF0ZSBpc0RyYWdnYWJsZSA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZ2dhYmxlIGVsZW1lbnQgaXMgYWN0aXZlXG4gIHByaXZhdGUgZHJhZ1NvdXJjZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUaGUgc291cmNlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICBwcml2YXRlIGRyYWdDbG9uZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBDbG9uZSBvZiBkcmFnIHNvdXJjZSBmb3IgdmlzdWFsIGZlZWRiYWNrXG4gIHByaXZhdGUgdG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gRmxhZyBmb3IgdG91Y2hFbmQgZXZlbnRcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnIG9wZXJhdGlvbiBpcyBvbmdvaW5nXG4gIHByaXZhdGUgaW5pdGlhbFRyYW5zZm9ybSA9ICcnOyAvLyBPcmlnaW5hbCB0cmFuc2Zvcm0gc3R5bGVcbiAgcHJpdmF0ZSBoYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7IC8vIEZsYWcgdG8gZW5zdXJlIGRyYWdzdGFydCBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2VcbiAgcHJpdmF0ZSByb290Tm9kZTogTm9kZSA9IG51bGw7IC8vIFJvb3Qgbm9kZSBmb3IgYm91bmRhcnkgY2FsY3VsYXRpb25zXG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUbyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBkcmFnZ2FibGUgZWxlbWVudFxuICBwcml2YXRlIGZvY3VzYWJsZURyb3Bab25lczogSFRNTEVsZW1lbnRbXSA9IFtdOyAvLyBBbGwgZHJvcHpvbmVzIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gSW5kZXggZm9yIHRhYmJpbmcgdGhyb3VnaCBkcm9wIHpvbmVzXG5cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIGNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY2xvbmVcblxuICBwcml2YXRlIGxhc3RUYXJnZXQgPSBudWxsOyAvLyBMYXN0IHRvdWNoIHRhcmdldFxuICBwcml2YXRlIGN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsgLy8gQ3VycmVudCBkcm9wcGFibGUgZWxlbWVudFxuICBwcml2YXRlIGFsbG93Q2xpY2sgPSB0cnVlOyAvLyBGbGFnIHRvIGFsbG93IG9yIHByZXZlbnQgY2xpY2tcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0ZvckRyYWdDbG9uZSA9IHRydWU7XG4gIGRyYWdPbkNsaWNrRW5hYmxlZCA9IGZhbHNlO1xuICB1c2VEcmFnQ2xvbmUgPSBmYWxzZTsgLy8gU2V0IHRvIHRydWUgdG8gZHJhZyB3aXRoIGEgY2xvbmU7IHNldCB0byBmYWxzZSB0byBkcmFnIHRoZSBvcmlnaW5hbCBlbGVtZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRFJBR19ESVNUQU5DRSA9IDU7IC8vIE1pbmltdW0gcGl4ZWwgbW92ZW1lbnQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0NMT05FX09QQUNJVFkgPSAxOyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNsb25lIGVsZW1lbnRcbiAgaW5pdGlhbFRyYW5zaXRpb246IHN0cmluZztcbiAgLy8gZHJvcHBhYmxlczogRWxlbWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGREcm9wcGFibGVFbGVtZW50cyhkcm9wcGFibGVzOiBFbGVtZW50W10pIHtcbiAgLy8gICAvLyB0aGlzLmRyb3BwYWJsZXMgPSBkcm9wcGFibGVzO1xuICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gIC8vICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0geyB4LCB5IH07XG4gICAgdGhpcy5kcmFnU291cmNlID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSByb290IG5vZGVcbiAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5kcmFnU291cmNlLmdldFJvb3ROb2RlKCk7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGlja0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gU2F2ZSBpbml0aWFsIHRyYW5zZm9ybVxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybTtcblxuICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9IGNvbXB1dGVkU3R5bGUudHJhbnNpdGlvbiB8fCAnJztcblxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9uc1xuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9uZSBvZmZzZXRcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC55ID0geSAtIHJlY3QudG9wO1xuXG4gICAgICAvLyBTZXQgaGlnaGVyIHotaW5kZXggdG8gYnJpbmcgaXQgb24gdG9wXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJzk5OTknO1xuICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICB0aGlzLmRyYWdTb3VyY2UuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5kcmFnU291cmNlKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb3VjaCA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UoY3VycmVudFRvdWNoKSA+PSB0aGlzLk1JTl9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2gpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gRXhpc3RpbmcgY29kZSBmb3IgY3JlYXRpbmcgYW5kIGhhbmRsaW5nIHRoZSBkcmFnIGNsb25lXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5EUkFHX0NMT05FX09QQUNJVFkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRyYWdTb3VyY2UuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBjb21wdXRlZFN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGVbc3R5bGVdID0gY29tcHV0ZWRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgZHJhZyBjbG9uZSB0byB0aGUgcm9vdCBub2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IHJvb3RcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ0Nsb25lU3R5bGVzKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgZHJhZ2dpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgQ1NTIHRyYW5zZm9ybXNcbiAgICAgIGlmICh0aGlzLnRvdWNoU3RhcnRQb2ludCkge1xuICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50VG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50Lng7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueTtcblxuICAgICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICAgIC8vIGNvbnN0IHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9ID0gdGhpcy5hcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtib3VuZGVkRGVsdGFYfXB4LCAke2JvdW5kZWREZWx0YVl9cHgpYDtcblxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRyb3BUYXJnZXQgPSB0aGlzLmZpbmREcm9wVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGRyb3BUYXJnZXQgIT09IHRoaXMubGFzdFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmxhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgIHRoaXMubGFzdFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ292ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hFbmQoZSkge1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBsZXQgZHJvcEZvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZHJvcEZvdW5kJywgZHJvcEZvdW5kKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICBkcm9wRm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkcmFnRW5kRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdlbmQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICBkcmFnRW5kRXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZT8uZGlzcGF0Y2hFdmVudChkcmFnRW5kRXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZG9jdW1lbnQsIHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0QXRQb2ludChyb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlcHRoOiBudW1iZXIgPSAwKTogRWxlbWVudCB8IG51bGwge1xuICAgIC8vIExpbWl0IHRoZSByZWN1cnNpb24gZGVwdGhcbiAgICBjb25zdCBNQVhfREVQVEggPSAyO1xuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCBhbiBhbmNlc3RvciB3aXRoICdkcm9wem9uZScgYXR0cmlidXRlXG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgU2hhZG93IERPTSBhbmQgZGVwdGggbGltaXQgbm90IHJlYWNoZWQsIHRyYXZlcnNlIGl0XG4gICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCAmJiBkZXB0aCA8IE1BWF9ERVBUSCkge1xuICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZWxlbWVudC5zaGFkb3dSb290LCB4LCB5LCBkZXB0aCArIDEpO1xuICAgICAgaWYgKHNoYWRvd0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvd0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZWxlbWVudCB3aXRoICdkcm9wem9uZScgZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJyAnICYmICF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCB0byBzdGFydCBkcmFnZ2luZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2UgPSB0aGlzLmZvY3VzZWRFbGVtZW50O1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBkcm9wIHpvbmVzIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuY29sbGVjdERyb3Bab25lcygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBUYWIga2V5IHRvIG5hdmlnYXRlIHRocm91Z2ggZHJvcCB6b25lc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVRvTmV4dERyb3Bab25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5ID09PSAnICcgJiYgdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgYWdhaW4gdG8gZHJvcCB0aGUgZWxlbWVudFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgdGhpcy5yZXNldERyYWdTdGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REcm9wWm9uZXMoKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkcm9wem9uZSBhdHRyaWJ1dGVcbiAgICB0aGlzLmZvY3VzYWJsZURyb3Bab25lcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Ryb3B6b25lXScpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyBBcnJheS5mcm9tKHRoaXMuZHJvcHBhYmxlcyk7XG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBSZXNldCBuYXZpZ2F0aW9uIGluZGV4XG4gIH1cblxuICBwcml2YXRlIG1vdmVUb05leHREcm9wWm9uZSgpIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgaW5kZXggZm9yIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAodGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCArIDEpICUgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoO1xuXG4gICAgLy8gRm9jdXMgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgY29uc3QgbmV4dERyb3Bab25lID0gdGhpcy5mb2N1c2FibGVEcm9wWm9uZXNbdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleF07XG4gICAgbmV4dERyb3Bab25lLmZvY3VzKCk7XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBkcm9wIHRhcmdldFxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBuZXh0RHJvcFpvbmU7XG5cbiAgICAvLyBEaXNwYXRjaCBkcmFnZW50ZXIgZXZlbnRcbiAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQobmV4dERyb3Bab25lLCAnZHJhZ2VudGVyJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQsIHBhZ2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IHRvdWNoLnBhZ2VYIDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyB0b3VjaC5wYWdlWSA6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RHJhZ0Nsb25lU3R5bGVzKHRvdWNoKSB7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke3RvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnl9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHt0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b3VjaEVuZFRyaWdnZXJlZCB8fCAhdGhpcy5kcmFnQ2xvbmUpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3TGVmdCA9IHRvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lng7XG4gICAgICBjb25zdCBuZXdUb3AgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55O1xuXG4gICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfSA9IHRoaXMuYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQsIG5ld1RvcCwgdGhpcy5kcmFnQ2xvbmUpO1xuXG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym91bmRlZExlZnR9cHhgO1xuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7Ym91bmRlZFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG90ZW50aWFsIG5ldyBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0xlZnQgPSBlbGVtZW50UmVjdC5sZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IGVsZW1lbnRSZWN0LnRvcCArIGRlbHRhWTtcblxuICAgIC8vIExpbWl0IHRoZSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRlZCBkZWx0YSB2YWx1ZXNcbiAgICBjb25zdCBib3VuZGVkRGVsdGFYID0gYm91bmRlZExlZnQgLSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVkgPSBib3VuZGVkVG9wIC0gZWxlbWVudFJlY3QudG9wO1xuXG4gICAgcmV0dXJuIHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUJvdW5kYXJpZXMobmV3TGVmdDogbnVtYmVyLCBuZXdUb3A6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3TGVmdCBhbmQgbmV3VG9wIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4geyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0b3VjaCk6IG51bWJlciB7XG4gICAgY29uc3QgeERpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueCk7XG4gICAgY29uc3QgeURpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueSk7XG4gICAgcmV0dXJuIHhEaXN0ICsgeURpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoQ3VzdG9tRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLmRhdGFUcmFuc2ZlcjtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERyYWdTdGF0ZShkcm9wRm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZT8ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICBpZiAoIWRyb3BGb3VuZCkgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmluaXRpYWxUcmFuc2l0aW9uO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHByb3BlcnR5XG4gICAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZHJhZ0Nsb25lID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSBudWxsO1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGEodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5jbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMubGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdE5vZGUgPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgdXNlU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IHRoaXMuZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkcm9wcGFibGUgPT4ge1xuICAgICAgICB0aGlzLnByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERyb3BwYWJsZUVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdCA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG4gICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhdHRyaWJ1dGVOYW1lIH0pID0+IHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuXG4gICAgICAgIC8vIGNoZWNrTWF4QXNzb2NpYXRpb25zIGFuZCBzYXZlUmVzcG9uc2UgYXJlIGRlZmluZWQvb3ZlcnJpZGRlbiBpbiBhIG1peGluXG4gICAgICAgIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10obnVsbCk7IC8vXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuXG4gICAgICAvLyB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXM6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzLCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCB7IHBhcmVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSwgdHlwZTogT2JqZWN0IH0pIGNvbmZpZ3VyYXRpb246IEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IHRydWUsXG4gICAgICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiB0cnVlLFxuICAgICAgZHJhZ09uQ2xpY2s6IGZhbHNlXG4gICAgfTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBpZiAoZGlzYWJsZURyb3BwYWJsZSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIHZhbHVlPy5mb3JFYWNoKGVudHJ5ID0+IHRoaXMucGxhY2VSZXNwb25zZShlbnRyeSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gdGhpcy5maW5kRHJvcHBhYmxlQnlJZChkcm9wSWQpO1xuICAgICAgZHJhZ0lkcy5mb3JFYWNoKGRyYWdJZCA9PiB0aGlzLnBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkLCBkcm9wcGFibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcm9wcGFibGVCeUlkKGlkZW50aWZpZXI6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZDogc3RyaW5nLCBkcm9wcGFibGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgIGlmICghZHJvcHBhYmxlIHx8ICFkcmFnZ2FibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGZpbmQgZHJhZ2dhYmxlIG9yIGRyb3BwYWJsZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOiAke2RyYWdJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdmFsaWRBc3NvY2lhdGlvbnMgPSB0aGlzLmdldFZhbGlkQXNzb2NpYXRpb25zKCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSB2YWxpZEFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkQXNzb2NpYXRpb25zKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVSZXNwb25zZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlc3BvbnNlRGF0YSgpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZHJvcHBhYmxlc1xuICAgICAgICAubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgICAgY29uc3QgZHJhZ2dhYmxlc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnZ2FibGVzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzLm1hcChpZCA9PiBgJHtpZH0gJHtkcm9wcGFibGVJZGVudGlmaWVyfWApO1xuICAgICAgICB9KVxuICAgICAgICAuZmxhdCgpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgaWYgKHNhdmUpIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldERyb3BwYWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgfVxuICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiAwLjVyZW07XG4gIH1cblxuICA6aG9zdDo6cGFydChhc3NvY2lhYmxlcy1jb250YWluZXIpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAxODBkZWcsXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgLSAxcHgpLFxuICAgICAgdmFyKC0tcXRpLWJvcmRlci1jb2xvci1ncmF5KSBjYWxjKDUwJSksXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgKyAxcHgpXG4gICAgKTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIb3RzcG90T3JkZXIoZTogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkZW50aWZpZXIgfSA9IGUuZGV0YWlsO1xuXG4gICAgY29uc3QgaG90c3BvdCA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbmQoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpIGFzIEhvdHNwb3RDaG9pY2U7XG5cbiAgICBjb25zdCBtYXhTZWxlY3Rpb24gPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKCF0aGlzLmNob2ljZU9yZGVyaW5nKSB7XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChob3RzcG90Lm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZpbHRlcihpID0+IGkub3JkZXIgPiAwKS5sZW5ndGggPj0gbWF4U2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdXNlciBhbHJlYWR5IHNlbGVjdGVkIDUgaW1hZ2VzLlxuICAgICAgICB9XG4gICAgICAgIGhvdHNwb3Qub3JkZXIgPSAodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiAhIWkub3JkZXIpLmxlbmd0aCArIDE7XG4gICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZm9yRWFjaChob3RzcG90ID0+IHtcbiAgICAgICAgICBpZiAoaG90c3BvdC5vcmRlciA+IGhvdHNwb3Qub3JkZXIpIHtcbiAgICAgICAgICAgIGhvdHNwb3Qub3JkZXItLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhvdHNwb3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBob3RzcG90Lm9yZGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FjdGl2YXRlLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMuc2V0SG90c3BvdE9yZGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IHBvc2l0aW9uSG90c3BvdHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90JztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90c3BvdEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICAvLyBkbyBub3Qgc2VsZWN0ICggaGlnaGxpZ2h0IGJsdWUsIHRoZSBpbWFnZSlcbiAgLy8gdGFyZ2V0IHRoZSBtYWluIHNsb3QgbWFrZSBpdCByZWxhdGl2ZSBhbmQgZml0IHdpdGggdGhlIGNvbnRlblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIHNsb3Q6bm90KFtuYW1lPSdwcm9tcHQnXSkge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHF0aS1ob3RzcG90LWNob2ljZSByZWxhdGl2ZSB0byB0aGUgc2xvdCAqL1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50OyAvKiBob3RzcG90cyBub3Qgc3RyZXRjaGluZyBmdXJ0aGVyIGlmIGltYWdlIGlzIGF0IG1heCBzaXplICovXG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIC8qIGltYWdlIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgKi9cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAvKiB3aWR0aDoxMDAlOyAqL1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIHByb21wdCAtLT5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwhLS0gc2xvdCBmb3IgdGhlIGltYWdlIGFuZCBob3RzcG90cyAtLT5cbiAgICBgO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd1bnJlZ2lzdGVyLXF0aS1ob3RzcG90LWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nOiBRdGlIb3RzcG90SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuLy8gaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5pbXBvcnQgJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICBmYWxzZSxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ1xuKSB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgX3Jlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IFtdO1xuICAvLyBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm4gc3VwZXIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgZWxzZSByZXR1cm4gdGhpcy5fcmVzcG9uc2UgYXMgc3RyaW5nW107XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSBzdXBlci52YWx1ZSA9IHZhbDtcbiAgICBlbHNlIHRoaXMuX3Jlc3BvbnNlID0gdmFsO1xuICB9XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgIC8vIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoXG4gICAgLy8gICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyb3BwYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4gICAgLy8gKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnZhbHVlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gWy4uLnRoaXMudmFsdWVdIDogdGhpcy52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyogXG5xdGktbWF0Y2gtaW50ZXJhY3Rpb25cbnF0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb25cbiovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4vLyB0c2xpbnQ6ZGlzYWJsZTogaW5kZW50XG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICBgO1xuXG4gIC8qKiB0aGUgbWluaW1hbCBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWluJ1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNaW46IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWF4J1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNYXg6IG51bWJlciA9IDE7XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2ZpeGVkJ1xuICB9KVxuICBwdWJsaWMgZml4ZWQgPSBmYWxzZTtcblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHRoZSBhc3NvY2lhdGUgaW50ZXJhY3Rpb24gdGhlcmUgaXMgYSBzcGVjaWFsIHNsb3QgZm9yIHRoZXNlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VzXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgfVxuXG4gIC8vIHBrOiBUaGlzIG5lZWRzIHNvbWUgZXhwbGFuYXRpb25cbiAgLy8gaW4gcXRpLW1hdGNoLWludGVyYWN0aW9uLCBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIHVzZWQgdG8gZGVub3RlIHRoZVxuICAvLyBkcmFnZ2FibGUsIGJ1dCBhbHNvIHRoZSBkcm9wcGFibGUuIFdFSVJELi4gYnV0IGxldHMgZGVhbCB3aXRoIGl0LlxuICAvLyBTbyB3ZSBoYXZlIGEgc2xvdCBmb3Igd2hlbmV2ZXIgYW5vdGhlciBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIGRyb3BwZWQgaW4gaGVyZS5cbiAgLy8gQW5kIHdlIGhhdmUgc2xvdCBmb3IgY29udGVudCBsaWtlIGluIHRoaXMgYXNzb2NpYXRlIGludGVyYWN0aW9uXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPHNsb3QgcGFydD1cImRyb3BzbG90XCIgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJzogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG4vLyBpbXBvcnQgY29tcG9uZW50U3R5bGVzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9zdHlsZXMvY29tcG9uZW50LnN0eWxlcyc7XG5cbi8qICR7Y29tcG9uZW50U3R5bGVzfSAqL1xuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBzbG90IHtcbiAgICAvKiBzbG90IHdoZXJlIHRoZSAqL1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDAuNXJlbTtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgLyogcHJldmVudHMgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmluZyB0aGUgc2FtZSBoZWlnaHQgKi9cbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgfVxuICBzbG90W25hbWU9J3Byb21wdCddIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuICA6OnNsb3R0ZWQocXRpLXNpbXBsZS1tYXRjaC1zZXQpIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhlIGRyYWcgYW5kIGRyb3AgY29udGFpbmVyIHNsb3RzIGhhdmUgdGhlIHNhbWUgd2lkdGggKi9cbiAgICBmbGV4OiAxO1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWVkaWEtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1lZGlhSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgX3ZhbHVlID0gMDtcbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICAgIC8vIG1heWJlIGNoZWNrIGlmIHRoZSBtZWRpYSBoYXMgYmVlbiBwbGF5ZWQ/XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uSW50ZXJhY3Rpb24ucHJvcGVydGllcyxcbiAgICAgIC4uLntcbiAgICAgICAgc3RlcDoge1xuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdzdGVwJyxcbiAgICAgICAgICBkZWZhdWx0OiAxMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gZ2V0IGF1ZGlvLCB2aWRlbyBvZiBvYmplY3QgdGFnLlxuICAgIGNvbnN0IG1lZGlhT2JqZWN0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndmlkZW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuICAgIGlmIChtZWRpYU9iamVjdCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGVuZGVkIGV2ZW50XG4gICAgICBtZWRpYU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDBcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcy52YWx1ZSBpcyBhIG51bWJlclxuICAgICAgICB0aGlzLl92YWx1ZSsrO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWVkaWEtaW50ZXJhY3Rpb24nOiBRdGlNZWRpYUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFNodWZmbGVNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3NodWZmbGUvc2h1ZmZsZS1taXhpbic7IC8vIEltcG9ydCB0aGUgbWl4aW5cbmltcG9ydCB7IFF0aVNpbXBsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW9yZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgU2h1ZmZsZU1peGluKFxuICBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sIGBxdGktc2ltcGxlLWNob2ljZWAsIHRydWUsICdkcm9wLWxpc3QnKSxcbiAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuKSB7XG4gIGNoaWxkcmVuTWFwOiBFbGVtZW50W107XG5cbiAgQHN0YXRlKCkgbnJDaG9pY2VzOiBudW1iZXIgPSAwO1xuICBAc3RhdGUoKSBjb3JyZWN0UmVzcG9uc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBAc3RhdGUoKSBzaG93Q29ycmVjdFJlc3BvbnNlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGdyaWQtYXV0by1jb2x1bW5zOiAxZnI7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3AtbGlzdCddIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIGlmICh0aGlzLm5yQ2hvaWNlcyA8IGNob2ljZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm5yQ2hvaWNlcyA9IGNob2ljZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD5cbiAgICAgIDxkaXYgcGFydD1cImNvbnRhaW5lclwiPlxuICAgICAgICA8c2xvdCBwYXJ0PVwiZHJhZ3NcIj4gPC9zbG90PlxuICAgICAgICA8ZGl2IHBhcnQ9XCJkcm9wc1wiPlxuICAgICAgICAgICR7QXJyYXkuZnJvbShBcnJheSh0aGlzLm5yQ2hvaWNlcykpLm1hcChcbiAgICAgICAgICAgIChfLCBpKSA9PlxuICAgICAgICAgICAgICBodG1sYDxkcm9wLWxpc3QgcGFydD1cImRyb3AtbGlzdFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aX1cIj48L2Ryb3AtbGlzdD4ke3RoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID4gaVxuICAgICAgICAgICAgICAgICAgPyB1bnNhZmVIVE1MKGA8c3BhbiBwYXJ0PSdjb3JyZWN0LXJlc3BvbnNlJz4ke3RoaXMuY29ycmVjdFJlc3BvbnNlc1tpXX08L3NwYW4+YClcbiAgICAgICAgICAgICAgICAgIDogJyd9YFxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgICAgcmVzcG9uc2VzLmZvckVhY2goKHJlc3BvbnNlLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2ltcGxlQ2hvaWNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgaWYgKCFzaW1wbGVDaG9pY2UpIHtcbiAgICAgICAgICBzaW1wbGVDaG9pY2UgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gc2ltcGxlQ2hvaWNlPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIHRoaXMuY29ycmVjdFJlc3BvbnNlcyA9IFsuLi50aGlzLmNvcnJlY3RSZXNwb25zZXMsIHRleHRdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyA9IHRydWU7XG4gIH1cblxuICAvLyBzb21lIGludGVyYWN0aW9ucyBoYXZlIGEgZGlmZmVyZW50IHdheSBvZiBnZXR0aW5nIHRoZSByZXNwb25zZVxuICAvLyB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBkcmFnIGFuZCBkcm9wIG1peGluIGNsYXNzXG4gIC8vIHlvdSBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBnZXRSZXNwb25zZSBtZXRob2QgaW4gdGhlIHN1cGVyY2xhc3NcbiAgLy8gY2F1c2UgdGhleSBhcmUgZGlmZmVyZW50IGZvciBzb21lIGludGVyYWN0aW9ucy5cbiAgLy8gTUg6IGlzIHRoaXMgZnVuY3Rpb24gY2FsbGVkPyBTaG91bGRuJ3Qgd2UgdXNlIGdldFZhbHVlP1xuICBwcm90ZWN0ZWQgZ2V0UmVzcG9uc2UoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUNob2ljZT4odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Ryb3AtbGlzdCcpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gZHJvcHBhYmxlcy5tYXAoZHJvcHBhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJyk7XG4gICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ3NJbkRyb3BwYWJsZSkubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSk7XG4gICAgICByZXR1cm4gWy4uLmlkZW50aWZpZXJzXS5qb2luKCcgJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5jaGlsZHJlbk1hcC5mb3JFYWNoKGVsID0+IGVsLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlPcmRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGNsYXNzIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjdXJzb3I6IG1vdmU7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbicsIFF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnKVxuZXhwb3J0IGNsYXNzIFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgY2hvaWNlT3JkZXJpbmc6IGJvb2xlYW47XG4gIHN0YXJ0WDogYW55O1xuICBzdGFydFk6IGFueTtcbiAgZHJhZ0VsZW1lbnQ6IGFueTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyID0gdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8vIERlZmluZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbW91c2Vtb3ZlIGV2ZW50IG9uIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICBkcmFnRWxlbWVudEhhbmRsZXIoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSB0aGUgbW91c2UgaGFzIG1vdmVkIHNpbmNlIHRoZSBsYXN0IGV2ZW50XG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5sZWZ0ID0gdGhpcy5kcmFnRWxlbWVudC5vZmZzZXRMZWZ0ICsgZGVsdGFYICsgJ3B4JztcbiAgICB0aGlzLmRyYWdFbGVtZW50LnN0eWxlLnRvcCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0VG9wICsgZGVsdGFZICsgJ3B4JztcblxuICAgIC8vIFVwZGF0ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChhKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGEpO1xuXG4gICAgLy8gR2V0IHRoZSBkcmFnZ2FibGUgYW5kIGRyb3Agem9uZSBlbGVtZW50c1xuICAgIHRoaXMuZHJhZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24+aW1nJyk7XG4gICAgLy8gY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW52YXMnKTtcblxuICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5zdGFydFggPSAwO1xuICAgIHRoaXMuc3RhcnRZID0gMDtcblxuICAgIC8vIEFkZCBhIG1vdXNlZG93biBldmVudCBsaXN0ZW5lciB0byB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICB0aGlzLmRyYWdFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gU2F2ZSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlXG4gICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICAgIC8vIEFkZCBhIG1vdXNlbW92ZSBldmVudCBsaXN0ZW5lciB0byB0aGUgZG9jdW1lbnRcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIpO1xuICB9XG5cbiAgcmVtb3ZlTW92ZUxpc3RlbmVyKGV2ZW50KSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIsIHRydWUpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJzogUXRpUG9zaXRpb25PYmplY3RTdGFnZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgc3R5bGVNYXAgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9zdHlsZS1tYXAuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICBwb2ludC1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtYXgtY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1heENob2ljZXM6IG51bWJlciA9IEluZmluaXR5O1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBpbWFnZSBlbGVtZW50XG4gIHByaXZhdGUgX2ltZ0VsZW1lbnQ6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyBFeHRyYWN0ZWQgY2xpY2sgaGFuZGxlciBtZXRob2RcbiAgcHJpdmF0ZSBfb25JbWFnZUNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuX3BvaW50cy5sZW5ndGggPCB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIGAke3h9ICR7eX1gXTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxwb2ludC1jb250YWluZXI+XG4gICAgICAgICR7cmVwZWF0KFxuICAgICAgICAgIHRoaXMuX3BvaW50cyxcbiAgICAgICAgICBwb2ludCA9PiBwb2ludCxcbiAgICAgICAgICAocG9pbnQsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgICBzdHlsZT0ke3N0eWxlTWFwKHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGAke3BvaW50LnNwbGl0KCcgJylbMF19cHhgLFxuICAgICAgICAgICAgICAgIHRvcDogYCR7cG9pbnQuc3BsaXQoJyAnKVsxXX1weGBcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgcG9pbnQgYXQgJHtwb2ludH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9JHsoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50cyA9IHRoaXMuX3BvaW50cy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9wb2ludC1jb250YWluZXI+YDtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3BvaW50cyA9IFtdO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvaW50cy5sZW5ndGggPj0gdGhpcy5taW5DaG9pY2VzICYmIHRoaXMuX3BvaW50cy5sZW5ndGggPD0gdGhpcy5tYXhDaG9pY2VzO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9wb2ludHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXTtcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHM7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5faW1nRWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICBpZiAodGhpcy5faW1nRWxlbWVudCkge1xuICAgICAgLy8gQXR0YWNoIHRoZSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gPGltZz4gZWxlbWVudCBmb3VuZCBpbiA8cXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbj4nKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgaW1hZ2UgZWxlbWVudFxuICAgICAgdGhpcy5faW1nRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uSW1hZ2VDbGljayk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24nOiBRdGlTZWxlY3RQb2ludEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBxdWVyeSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBTbGlkZXJJbnRlcmFjdGlvbi5UeXBlIChxdGktc2xpZGVyLWludGVyYWN0aW9uKSBwcmVzZW50cyB0aGUgY2FuZGlkYXRlIHdpdGggYSBjb250cm9sIGZvciBzZWxlY3RpbmcgYSBudW1lcmljYWwgdmFsdWUgYmV0d2VlbiBhIGxvd2VyIGFuZCB1cHBlciBib3VuZC5cbiAqIEBkb2N1bWVudGF0aW9uIGh0dHBzOi8vd3d3Lmltc2dsb2JhbC5vcmcvc3BlYy9xdGkvdjNwMC9pbXBsI2guczYxeGNyajRxY3lqXG4gKiBAc3RhdHVzIHN0YWJsZVxuICogQHNpbmNlIDYuMFxuICpcbiAqIEBldmVudCBxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24gLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIHdhbnRzIHRvIHJlZ2lzdGVyIGl0c2VsZlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1yZXNwb25zZSAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gY2hhbmdlc1xuICpcbiAqIEBjc3Nwcm9wIC0tc2hvdy12YWx1ZSAtIHNob3dzIHRoZSBjdXJyZW50IHZhbHVlIHdoaWxlIHNsaWRpbmdcbiAqIEBjc3Nwcm9wIC0tc2hvdy10aWNrcyAtIHNob3dzIHRoZSB0aWNrcyBhY2NvcmRpbmcgdG8gc3RlcHNcbiAqIEBjc3Nwcm9wIC0tc2hvdy1ib3VuZHMgLSBzaG93cyB2YWx1ZSBmb3IgbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG4gKlxuICogQGNzc3BhcnQgc2xpZGVyIC0tIHNsaWRlciBpbmx1ZGluZywgYm91bmRzIGFuZCB0aWNrcyBhbmQgdmFsdWUsIHVzZSBpdCBmb3IgcGFkZGluZ3MgYW5kIG1hcmdpbnNcbiAqIEBjc3NwYXJ0IGJvdW5kcyAtLSBkaXYgZm9yIGJvdW5kcywgY29udGFpbmluZyB0d28gZGl2cyBmb3Igd2l0aCBtaW4sIGFuZCBtYXggYm91bmRzIHZhbHVlXG4gKiBAY3NzcGFydCB0aWNrcyAtLSBkaXYgZm9yIHRpY2tzLCB1c2UgbGluZWFpciBncmFkaWVudCBhbmQgZXhwb3NlZCBjc3MgdmFyaWFibGVzIGZvciBzdHlsaW5nXG4gKiBAY3NzcGFydCByYWlsIC0tIGRpdiBmb3IgcmFpbCwgc3R5bGUgYWNjb3JkaW5nIHRvIG5lZWRzXG4gKiBAY3NzcGFydCBrbm9iIC0tIGRpdiwgc2hvdWxkIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlXG4gKiBAY3NzcGFydCB2YWx1ZSAtLSBkaXYsIGNvbnRhaW5pbmcgdmFsdWVcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgPHF0aS1zaW1wbGUtY2hvaWNlPiBtdXN0IGJlIHBsYWNlZC5cbiAqIEBzbG90IHByb21wdCAtIHNsb3Qgd2hlcmUgdGhlIHByb21wdCBpcyBwbGFjZWQuXG4gKi9cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVNsaWRlckludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIGNzTGl2ZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcblxuICBAcXVlcnkoJyNrbm9iJylcbiAgcHJpdmF0ZSBfa25vYjogSFRNTEVsZW1lbnQ7XG5cbiAgQHF1ZXJ5KCcjcmFpbCcpXG4gIHByaXZhdGUgX3JhaWw6IEhUTUxFbGVtZW50O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3N0ZXAtbGFiZWwnIH0pIHN0ZXBMYWJlbCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSkgcmV2ZXJzZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2xvd2VyLWJvdW5kJyB9KSBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWluJywgYCR7dGhpcy5fbWlufWApO1xuICB9XG4gIGdldCBtaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAndXBwZXItYm91bmQnIH0pIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4JywgYCR7dGhpcy5fbWF4fWApO1xuICB9XG4gIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RlcDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3N0ZXAnIH0pIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zdGVwID0gdmFsdWU7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zdGVwJywgYCR7dGhpcy5fc3RlcH1gKTtcbiAgfVxuICBnZXQgc3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGVwO1xuICB9XG5cbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKG9sZCwgZGlzYWJsZWQpID0+IHt9O1xuXG4gIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVSZWFkb25seUNoYW5nZSA9IChvbGQsIHJlYWRvbmx5KSA9PiB7fTtcblxuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS50b1N0cmluZygpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBpc051bWJlciA9ICFpc05hTihwYXJzZUludCh2YWwudG9TdHJpbmcoKSkpO1xuICAgIGlmIChpc051bWJlcikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUludCh2YWwudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7IC4uLkxpdEVsZW1lbnQuc2hhZG93Um9vdE9wdGlvbnMsIGRlbGVnYXRlc0ZvY3VzOiB0cnVlLCBtb2RlOiAnb3BlbicgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBhIGxpdmUgcHJvcGVydHksIHdlIHVzZSB0aGlzIHRvIGdldCBjc3MgdmFyaWFibGVzXG4gICAgc2VlIHJlbmRlciB0ZW1wbGF0ZSAqL1xuICAgIHRoaXMuY3NMaXZlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTtcbiAgfVxuXG4gIHNldCByZXNwb25zZShteVJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG15UmVzcG9uc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgYSBzaW5nbGUgdmFsdWUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChteVJlc3BvbnNlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIC8vIGNvbnZlcnQgdGhlIHZhbHVlLCB3aGljaCBpcyB0aGUgcmVhbCBzbGlkZXIgdmFsdWUgdG8gYSBwZXJjZW50YWdlIGZvciB0aGUgZG9tLlxuICAgIGlmICh0aGlzLl92YWx1ZSA8IHRoaXMubWluKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgPiB0aGlzLm1heCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1heDtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVQZXJjZW50YWdlID0gKCh0aGlzLl92YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12YWx1ZS1wZXJjZW50YWdlJywgYCR7dmFsdWVQZXJjZW50YWdlfSVgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGRpdiBpZD1cInNsaWRlclwiIHBhcnQ9XCJzbGlkZXJcIj5cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctYm91bmRzJykgPT0gJ3RydWUnXG4gICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJib3VuZHNcIiBwYXJ0PVwiYm91bmRzXCI+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9taW59PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9tYXh9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy10aWNrcycpID09ICd0cnVlJyA/IGh0bWxgPGRpdiBpZD1cInRpY2tzXCIgcGFydD1cInRpY2tzXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgaWQ9XCJyYWlsXCIgcGFydD1cInJhaWxcIiBAbW91c2Vkb3duPSR7dGhpcy5fb25Nb3VzZURvd259IEB0b3VjaHN0YXJ0PSR7dGhpcy5fb25Ub3VjaE1vdmV9PlxuICAgICAgICAgIDxkaXYgaWQ9XCJrbm9iXCIgcGFydD1cImtub2JcIj5cbiAgICAgICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXZhbHVlJykgPT0gJ3RydWUnXG4gICAgICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwidmFsdWVcIiBwYXJ0PVwidmFsdWVcIj4ke3RoaXMudmFsdWV9PC9kaXY+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdGVwID0gMTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaEVuZCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1vdXNlRG93bihldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiogY2FsY3VsYXRlVmFsdWUgZ2V0cyB4IHBvc2l0aW9uIGFuZCBjb21wYXJlcyB0aGlzIHdpdGggdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVZhbHVlKGRpZmZYOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZU5vdyA9IHRoaXMubWluICsgKCh0aGlzLm1heCAtIHRoaXMubWluKSAqIGRpZmZYKSAvIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3Qgcm91bmRlZFN0ZXBWYWx1ZSA9IHRoaXMubWluICsgTWF0aC5yb3VuZCgodmFsdWVOb3cgLSB0aGlzLm1pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXA7XG4gICAgdGhpcy5fdmFsdWUgPSByb3VuZGVkU3RlcFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbkZyb21FdmVudChlOiBhbnkpOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IF90b3VjaE1vdmU7XG4gICAgaWYgKGUudHlwZSA9PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09ICd0b3VjaG1vdmUnIHx8IGUudHlwZSA9PSAndG91Y2hlbmQnIHx8IGUudHlwZSA9PSAndG91Y2hjYW5jZWwnKSB7XG4gICAgICBjb25zdCBldnQgPSB0eXBlb2YgZS5vcmlnaW5hbEV2ZW50ID09PSAndW5kZWZpbmVkJyA/IGUgOiBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBjb25zdCB0b3VjaCA9IGV2dC50b3VjaGVzWzBdIHx8IGV2dC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxuICAgICAgICB5OiB0b3VjaC5wYWdlWVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZS50eXBlID09ICdtb3VzZWRvd24nIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNldXAnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbW92ZScgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdmVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW91dCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VlbnRlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VsZWF2ZSdcbiAgICApIHtcbiAgICAgIF90b3VjaE1vdmUgPSB7XG4gICAgICAgIHg6IGUuY2xpZW50WCxcbiAgICAgICAgeTogZS5jbGllbnRZXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gX3RvdWNoTW92ZTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2xpZGVyLWludGVyYWN0aW9uJzogUXRpU2xpZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDYWxjdWxhdGUgfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHByaXZhdGUgb3BlcmF0b3JGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgQHNsb3RjaGFuZ2U9JHt0aGlzLmhhbmRsZVNsb3RDaGFuZ2V9Pjwvc2xvdD5gO1xuICB9XG5cbiAgaGFuZGxlU2xvdENoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICAvLyBleHBlY3RpbmcgPFshQ0RBVEFbIC4uLiBdXT4gaXMgY29udmVydGVkIGludG8gPCEtLSAuLi4gLS0+IHdpdGggcXRpLXRyYW5zZm9ybTogY0RhdGFUb0NvbW1lbnRcbiAgICBjb25zdCBjb21tZW50Tm9kZSA9IEFycmF5LmZyb20odGhpcy5maXJzdEVsZW1lbnRDaGlsZD8uY2hpbGROb2RlcyA/PyBbXSkuZmluZChcbiAgICAgIG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREVcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9wZXJhdG9yRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAnZm4nLCAnaXRlbScsIGNvbW1lbnROb2RlLnRleHRDb250ZW50ID8/ICcnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdjdXN0b20tb3BlcmF0b3IgY29udGFpbnMgaW52YWxpZCBqYXZhc2NyaXB0IGNvZGUnLCBlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGZuID0ge1xuICAgICAgdmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgdGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcik/LnZhbHVlID8/ICcnLFxuICAgICAgY29ycmVjdDogKHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICAodGhpcy5fY29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHJlc3BvbnNlSWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZSlcbiAgICAgICAgICA/LmNvcnJlY3RSZXNwb25zZSA/PyAnJ1xuICAgIH07XG4gICAgY29uc3QgaXRlbSA9IHtcbiAgICAgIGdldFZhcmlhYmxlOiAodmFyaWFibGVJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZUlkZW50aWZpZXIpLFxuICAgICAgdXBkYXRlT3V0Y29tZVZhcmlhYmxlOiAob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGU6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZzsgcmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYWJsZS1ob3RzcG90JzogUXRpQXNzb2NpYWJsZUhvdHNwb3Q7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwJylcbmV4cG9ydCBjbGFzcyBRdGlHYXAgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwJzogUXRpR2FwO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC1pbWcnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcEltZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtaW1nJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1pbWcnOiBRdGlHYXBJbWc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtdGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwVGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWdhcC10ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICBgO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhcmlhLW9yZGVydmFsdWUnLCB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgb3JkZXI6IG51bWJlcjtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHNwb3QtY2hvaWNlJzogUXRpSG90c3BvdENob2ljZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dCcpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dCBleHRlbmRzIEFjdGl2ZUVsZW1lbnRNaXhpbihMaXRFbGVtZW50LCAncXRpLWhvdHRleHQnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj48ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj48L2Rpdj5cbiAgICAgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaG90dGV4dCc6IFF0aUhvdHRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2UtcmVnaXN0ZXInLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uU2VsZWN0SW5saW5lQ2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25TZWxlY3RJbmxpbmVDaG9pY2UoKSB7XG4gICAgLy8gaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW5saW5lLWNob2ljZS1zZWxlY3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UnOiBRdGlJbmxpbmVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIG5vdGhpbmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBBY3RpdmVFbGVtZW50TWl4aW4gfSBmcm9tICcuL2ludGVybmFsL2FjdGl2ZS1lbGVtZW50L2FjdGl2ZS1lbGVtZW50Lm1peGluJztcblxuLyoqXG4gKiBxdGktb3JkZXItaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtY2hvaWNlJykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICAgIHNsb3Qge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gICAgW3BhcnQ9J2NoJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgYDtcblxuICAvLyBwcm9wZXJ0eSBsYWJlbFxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIG1hcmtlcjogc3RyaW5nO1xuXG5cbiAgZ2V0IGNoZWNrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXNbJ2ludGVybmFscyddLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+XG4gICAgICAgIDxkaXYgcGFydD1cImNoYVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke3RoaXMubWFya2VyID8gaHRtbGA8ZGl2IGlkPVwibGFiZWxcIj4ke3RoaXMubWFya2VyfTwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgPHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1jaG9pY2UnOiBRdGlTaW1wbGVDaG9pY2U7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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RUFFUyxTQUFTO0FBQ2hCLFdBQU87QUFBQTtBQUFBO0FBQUEsUUFHSCxLQUFLLFNBQVMsb0NBQXVCLEtBQUssTUFBTSxXQUFXLG9CQUFPO0FBQUE7QUFBQSxFQUV4RTtBQUNGO0FBcENhLGdCQUNKLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJUO0FBQUEsTUFETiw4QkFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLE1BQU0sQ0FBQztBQUFBLEdBckJqQyxnQkFzQko7QUF0Qkksa0JBQU47QUFBQSxNQUROLG1DQUFjLG1CQUFtQjtBQUFBLEdBQ3JCOzs7QXpHK0RiLFFBQVE7QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9jb250ZXh0IiwgInByb3BlcnR5IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAieG1sIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfY29udGV4dCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2NvbnRleHQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9jb250ZXh0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9pZl9kZWZpbmVkIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfY29udGV4dCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfY29udGV4dCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAicHJvcGVydHkiLCAicmVxdWlyZSIsICJtb2R1bGUiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJkcmFnZ2FibGUiLCAicGFyZW50IiwgImluZGV4IiwgInRhcmdldEluZGV4IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpZnJhbWUiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2lmX2RlZmluZWQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImhvdHNwb3QiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF91bnNhZmVfaHRtbCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF91bnNhZmVfaHRtbCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfcmVwZWF0IiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiZXZlbnQiLCAieCIsICJkaWZmWCIsICJpbXBvcnRfY29udGV4dCIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyIsICJpbXBvcnRfbGl0IiwgImltcG9ydF9kZWNvcmF0b3JzIiwgImltcG9ydF9saXQiLCAiaW1wb3J0X2RlY29yYXRvcnMiLCAiaW1wb3J0X2xpdCIsICJpbXBvcnRfZGVjb3JhdG9ycyJdCn0K
|