@citolab/qti-components 6.9.1-beta.81 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/cdn/index.global.js +277 -0
  2. package/cdn/index.min.cjs +4489 -0
  3. package/cdn/index.min.js +4489 -0
  4. package/dist/custom-element-eslint-rules.js +25 -19
  5. package/dist/item.css +172 -5
  6. package/dist/qti-components/index.cjs +660 -465
  7. package/dist/qti-components/index.cjs.map +1 -0
  8. package/dist/qti-components/index.d.cts +4 -4
  9. package/dist/qti-components/index.d.ts +4 -4
  10. package/dist/qti-components/index.js +615 -423
  11. package/dist/qti-components/index.js.map +1 -0
  12. package/dist/qti-components-jsx.d.ts +398 -64
  13. package/dist/qti-item/index.cjs +2 -3
  14. package/dist/qti-item/index.cjs.map +1 -0
  15. package/dist/qti-item/index.d.cts +1 -1
  16. package/dist/qti-item/index.d.ts +1 -1
  17. package/dist/qti-item/index.js +2 -3
  18. package/dist/qti-item/index.js.map +1 -0
  19. package/dist/qti-loader/index.cjs +5 -6
  20. package/dist/qti-loader/index.cjs.map +1 -0
  21. package/dist/qti-loader/index.d.cts +1 -1
  22. package/dist/qti-loader/index.d.ts +1 -1
  23. package/dist/qti-loader/index.js +5 -6
  24. package/dist/qti-loader/index.js.map +1 -0
  25. package/dist/{qti-simple-choice-DC5DJota.d.cts → qti-simple-choice-CynLWb8d.d.cts} +74 -26
  26. package/dist/{qti-simple-choice-DC5DJota.d.ts → qti-simple-choice-CynLWb8d.d.ts} +74 -26
  27. package/dist/qti-test/index.cjs +4632 -0
  28. package/dist/qti-test/index.cjs.map +1 -0
  29. package/dist/qti-test/index.d.cts +304 -0
  30. package/dist/qti-test/index.d.ts +304 -0
  31. package/dist/qti-test/index.js +4599 -0
  32. package/dist/qti-test/index.js.map +1 -0
  33. package/dist/qti-transformers/index.cjs +5 -6
  34. package/dist/qti-transformers/index.cjs.map +1 -0
  35. package/dist/qti-transformers/index.js +5 -6
  36. package/dist/qti-transformers/index.js.map +1 -0
  37. package/dist/vscode.css-custom-data.json +28 -0
  38. package/dist/vscode.html-custom-data.json +179 -230
  39. package/package.json +96 -67
  40. package/dist/custom-elements.json +0 -24168
  41. package/dist/index.global.js +0 -226
  42. package/dist/index.js +0 -7860
  43. package/dist/index.min.js +0 -952
  44. /package/{LICENSE → LICENSE.md} +0 -0
  45. /package/{readme.md → README.md} +0 -0
@@ -1,23 +1,5 @@
1
1
  var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
- var __spreadValues = (a, b) => {
10
- for (var prop in b || (b = {}))
11
- if (__hasOwnProp.call(b, prop))
12
- __defNormalProp(a, prop, b[prop]);
13
- if (__getOwnPropSymbols)
14
- for (var prop of __getOwnPropSymbols(b)) {
15
- if (__propIsEnum.call(b, prop))
16
- __defNormalProp(a, prop, b[prop]);
17
- }
18
- return a;
19
- };
20
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
3
  var __decorateClass = (decorators, target, key, kind) => {
22
4
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
23
5
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
@@ -34,9 +16,10 @@ import { customElement, property } from "lit/decorators.js";
34
16
 
35
17
  // src/lib/decorators/watch.ts
36
18
  function watch(propertyName, options) {
37
- const resolvedOptions = __spreadValues({
38
- waitUntilFirstUpdate: false
39
- }, options);
19
+ const resolvedOptions = {
20
+ waitUntilFirstUpdate: false,
21
+ ...options
22
+ };
40
23
  return (proto, decoratedFnName) => {
41
24
  const { update } = proto;
42
25
  const watchedProperties = Array.isArray(propertyName) ? propertyName : [propertyName];
@@ -93,11 +76,11 @@ var QtiAssessmentItem = class extends LitElement {
93
76
  identifier: this.getAttribute("identifier"),
94
77
  variables: itemContextVariables
95
78
  };
96
- this._initialContext = __spreadProps(__spreadValues({}, this._context), { variables: this._context.variables });
79
+ this._initialContext = { ...this._context, variables: this._context.variables };
97
80
  this._feedbackElements = [];
98
81
  this._interactionElements = [];
99
82
  this.addEventListener("qti-register-variable", (e) => {
100
- this._context = __spreadProps(__spreadValues({}, this._context), { variables: [...this._context.variables, e.detail.variable] });
83
+ this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };
101
84
  this._initialContext = this._context;
102
85
  e.stopPropagation();
103
86
  });
@@ -113,6 +96,7 @@ var QtiAssessmentItem = class extends LitElement {
113
96
  });
114
97
  this.addEventListener("end-attempt", (e) => {
115
98
  const { responseIdentifier, countAttempt } = e.detail;
99
+ this.validate();
116
100
  this.updateResponseVariable(responseIdentifier, "true");
117
101
  this.processResponse(countAttempt);
118
102
  });
@@ -128,26 +112,29 @@ var QtiAssessmentItem = class extends LitElement {
128
112
  this.addEventListener("qti-interaction-response", this.handleUpdateResponseVariable);
129
113
  }
130
114
  get variables() {
131
- return this._context.variables.map((v) => __spreadValues({
115
+ return this._context.variables.map((v) => ({
132
116
  identifier: v.identifier,
133
117
  value: v.value,
134
- type: v.type
135
- }, v.type === "outcome" && v.identifier === "SCORE" ? { externalScored: v.externalScored } : {}));
118
+ type: v.type,
119
+ // add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item
120
+ ...v.type === "outcome" && v.identifier === "SCORE" ? { externalScored: v.externalScored } : {}
121
+ }));
136
122
  }
137
123
  set variables(value) {
138
124
  if (!Array.isArray(value) || value.some((v) => !("identifier" in v))) {
139
125
  console.warn("variables property should be an array of VariableDeclaration");
140
126
  return;
141
127
  }
142
- this._context = __spreadProps(__spreadValues({}, this._context), {
128
+ this._context = {
129
+ ...this._context,
143
130
  variables: this._context.variables.map((variable) => {
144
131
  const matchingValue = value.find((v) => v.identifier === variable.identifier);
145
132
  if (matchingValue) {
146
- return __spreadValues(__spreadValues({}, variable), matchingValue);
133
+ return { ...variable, ...matchingValue };
147
134
  }
148
135
  return variable;
149
136
  })
150
- });
137
+ };
151
138
  this._context.variables.forEach((variable) => {
152
139
  if (variable.type === "response") {
153
140
  const interactionElement = this._interactionElements.find(
@@ -207,7 +194,7 @@ var QtiAssessmentItem = class extends LitElement {
207
194
  }
208
195
  }
209
196
  processResponse(countNumAttempts = true) {
210
- var _a;
197
+ this.validate();
211
198
  const responseProcessor = this.querySelector("qti-response-processing");
212
199
  if (!responseProcessor) {
213
200
  return false;
@@ -222,7 +209,7 @@ var QtiAssessmentItem = class extends LitElement {
222
209
  if (countNumAttempts) {
223
210
  this.updateOutcomeVariable(
224
211
  "numAttempts",
225
- (+((_a = this._context.variables.find((v) => v.identifier === "numAttempts")) == null ? void 0 : _a.value) + 1).toString()
212
+ (+this._context.variables.find((v) => v.identifier === "numAttempts")?.value + 1).toString()
226
213
  );
227
214
  }
228
215
  this._emit("qti-response-processed");
@@ -246,9 +233,10 @@ var QtiAssessmentItem = class extends LitElement {
246
233
  this.updateResponseVariable(responseIdentifier, response);
247
234
  }
248
235
  updateResponseVariable(identifier, value) {
249
- this._context = __spreadProps(__spreadValues({}, this._context), {
250
- variables: this._context.variables.map((v) => v.identifier !== identifier ? v : __spreadProps(__spreadValues({}, v), { value }))
251
- });
236
+ this._context = {
237
+ ...this._context,
238
+ variables: this._context.variables.map((v) => v.identifier !== identifier ? v : { ...v, value })
239
+ };
252
240
  this._emit("qti-interaction-changed", {
253
241
  item: this.identifier,
254
242
  responseIdentifier: identifier,
@@ -259,32 +247,39 @@ var QtiAssessmentItem = class extends LitElement {
259
247
  }
260
248
  }
261
249
  updateOutcomeVariable(identifier, value) {
262
- var _a;
263
250
  const outcomeVariable = this.getOutcome(identifier);
264
251
  if (!outcomeVariable) {
265
252
  console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);
266
253
  return;
267
254
  }
268
- this._context = __spreadProps(__spreadValues({}, this._context), {
255
+ this._context = {
256
+ ...this._context,
269
257
  variables: this._context.variables.map((v) => {
270
258
  if (v.identifier !== identifier) {
271
259
  return v;
272
260
  }
273
- return __spreadProps(__spreadValues({}, v), {
261
+ return {
262
+ ...v,
274
263
  value: outcomeVariable.cardinality === "single" ? value : [...v.value, value]
275
- });
264
+ };
276
265
  })
277
- });
266
+ };
278
267
  this._feedbackElements.forEach((fe) => fe.checkShowFeedback(identifier));
279
268
  this._emit("qti-outcome-changed", {
280
269
  item: this.identifier,
281
270
  outcomeIdentifier: identifier,
282
- value: (_a = this._context.variables.find((v) => v.identifier === identifier)) == null ? void 0 : _a.value
271
+ value: this._context.variables.find((v) => v.identifier === identifier)?.value
283
272
  });
284
273
  }
274
+ validate() {
275
+ if (this._interactionElements.every((interactionElement) => interactionElement.validate())) return true;
276
+ if (this._interactionElements.some((interactionElement) => interactionElement.validate())) return false;
277
+ return null;
278
+ }
285
279
  _getCompletionStatus() {
286
- if (this._interactionElements.every((interactionElement) => interactionElement.validate())) return "completed";
287
- if (this._interactionElements.some((interactionElement) => interactionElement.validate())) return "incomplete";
280
+ const valid = this.validate();
281
+ if (valid === true) return "completed";
282
+ if (valid === false) return "incomplete";
288
283
  return "not_attempted";
289
284
  }
290
285
  _emit(name, detail = null) {
@@ -429,7 +424,6 @@ function setLocation(xmlFragment, location) {
429
424
  location += "/";
430
425
  }
431
426
  xmlFragment.querySelectorAll("[src],[href],[primary-path]").forEach((elWithSrc) => {
432
- var _a;
433
427
  let attr = "";
434
428
  if (elWithSrc.getAttribute("src")) {
435
429
  attr = "src";
@@ -440,7 +434,7 @@ function setLocation(xmlFragment, location) {
440
434
  if (elWithSrc.getAttribute("primary-path")) {
441
435
  attr = "primary-path";
442
436
  }
443
- const attrValue = (_a = elWithSrc.getAttribute(attr)) == null ? void 0 : _a.trim();
437
+ const attrValue = elWithSrc.getAttribute(attr)?.trim();
444
438
  if (!attrValue.startsWith("data:") && !attrValue.startsWith("http")) {
445
439
  const newSrcValue = location + encodeURI(attrValue);
446
440
  elWithSrc.setAttribute(attr, newSrcValue);
@@ -463,7 +457,7 @@ var qtiTransformItem = () => {
463
457
  let xmlFragment;
464
458
  const api = {
465
459
  async load(uri, cancelPreviousRequest = false) {
466
- return new Promise((resolve, reject) => {
460
+ return new Promise((resolve) => {
467
461
  loadXML(uri, cancelPreviousRequest).then((xml2) => {
468
462
  xmlFragment = xml2;
469
463
  api.path(uri.substring(0, uri.lastIndexOf("/")));
@@ -574,7 +568,6 @@ var QtiAssessmentStimulusRef = class extends LitElement2 {
574
568
  * @param stimulusRef - The element to which the stimulus will be appended.
575
569
  */
576
570
  async updateStimulusRef(stimulusRef) {
577
- const path = this.href.substring(0, this.href.lastIndexOf("/"));
578
571
  const stimulus = await qtiTransformItem().load(this.href).then((api) => api.htmlDoc());
579
572
  if (stimulus) {
580
573
  const elements = stimulus.querySelectorAll("qti-stimulus-body, qti-stylesheet");
@@ -824,8 +817,7 @@ var QtiOutcomeDeclaration = class extends QtiVariableDeclaration {
824
817
  this.externalScored = null;
825
818
  }
826
819
  render() {
827
- var _a, _b;
828
- const value = (_b = (_a = this.itemContext) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
820
+ const value = this.itemContext?.variables.find((v) => v.identifier === this.identifier)?.value;
829
821
  return html6`${JSON.stringify(value, null, 2)}`;
830
822
  }
831
823
  get interpolationTable() {
@@ -901,8 +893,7 @@ import { css as css3, html as html7 } from "lit";
901
893
  import { customElement as customElement8, property as property5, state as state2 } from "lit/decorators.js";
902
894
  var QtiResponseDeclaration = class extends QtiVariableDeclaration {
903
895
  render() {
904
- var _a, _b;
905
- const value = (_b = (_a = this.itemContext) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
896
+ const value = this.itemContext?.variables.find((v) => v.identifier === this.identifier)?.value;
906
897
  return html7`${JSON.stringify(value, null, 2)}`;
907
898
  }
908
899
  connectedCallback() {
@@ -1005,7 +996,7 @@ QtiContentBody = __decorateClass([
1005
996
  import { LitElement as LitElement10, css as css4, html as html9 } from "lit";
1006
997
  import { customElement as customElement11, property as property6 } from "lit/decorators.js";
1007
998
  var QtiRubricBlock = class extends LitElement10 {
1008
- handleclassNamesChange(old, disabled) {
999
+ handleclassNamesChange() {
1009
1000
  const classNames = this.classNames.split(" ");
1010
1001
  classNames.forEach((className) => {
1011
1002
  switch (className) {
@@ -1104,7 +1095,7 @@ var QtiFeedback = class extends LitElement11 {
1104
1095
  if (Array.isArray(outcomeVariable.value)) {
1105
1096
  isFound = outcomeVariable.value.includes(this.identifier);
1106
1097
  } else {
1107
- isFound = !IsNullOrUndefined(this.identifier) && !IsNullOrUndefined(outcomeVariable == null ? void 0 : outcomeVariable.value) && this.identifier === outcomeVariable.value || false;
1098
+ isFound = !IsNullOrUndefined(this.identifier) && !IsNullOrUndefined(outcomeVariable?.value) && this.identifier === outcomeVariable.value || false;
1108
1099
  }
1109
1100
  this.showFeedback(isFound);
1110
1101
  }
@@ -1205,10 +1196,8 @@ import { LitElement as LitElement12 } from "lit";
1205
1196
  var Interaction = class extends LitElement12 {
1206
1197
  constructor() {
1207
1198
  super();
1208
- this.responseIdentifier = "";
1209
1199
  this.disabled = false;
1210
1200
  this.readonly = false;
1211
- this._correctResponse = "";
1212
1201
  this._internals = this.attachInternals();
1213
1202
  }
1214
1203
  reportValidity() {
@@ -1269,7 +1258,7 @@ var QtiExtendedTextInteraction = class extends Interaction {
1269
1258
  this._rows = 5;
1270
1259
  this._value = "";
1271
1260
  }
1272
- handleclassNamesChange(old, classes) {
1261
+ handleclassNamesChange(_, classes) {
1273
1262
  const classNames = classes.split(" ");
1274
1263
  let rowsSet = false;
1275
1264
  classNames.forEach((className) => {
@@ -1353,7 +1342,7 @@ var QtiExtendedTextInteraction = class extends Interaction {
1353
1342
  @keydown="${(event) => event.stopImmediatePropagation()}"
1354
1343
  @keyup="${this.textChanged}"
1355
1344
  @change="${this.textChanged}"
1356
- @blur="${(event) => {
1345
+ @blur="${(_) => {
1357
1346
  this.reportValidity();
1358
1347
  }}"
1359
1348
  placeholder="${ifDefined(this.placeholderText ? this.placeholderText : void 0)}"
@@ -1369,7 +1358,6 @@ var QtiExtendedTextInteraction = class extends Interaction {
1369
1358
  this.setEmptyAttribute(input.value);
1370
1359
  if (this._value !== input.value) {
1371
1360
  this.value = input.value;
1372
- const isValid = this.validate();
1373
1361
  this.saveResponse(input.value);
1374
1362
  }
1375
1363
  }
@@ -1542,7 +1530,7 @@ var QtiTextEntryInteraction = class extends Interaction {
1542
1530
  name="${this.responseIdentifier}"
1543
1531
  spellcheck="false"
1544
1532
  autocomplete="off"
1545
- @blur="${(event) => {
1533
+ @blur="${(_) => {
1546
1534
  this.reportValidity();
1547
1535
  }}"
1548
1536
  @keydown="${(event) => event.stopImmediatePropagation()}"
@@ -1565,7 +1553,6 @@ var QtiTextEntryInteraction = class extends Interaction {
1565
1553
  this.setEmptyAttribute(input.value);
1566
1554
  if (this._value !== input.value) {
1567
1555
  this.value = input.value;
1568
- const isValid = this.validate();
1569
1556
  this.saveResponse(input.value);
1570
1557
  }
1571
1558
  }
@@ -1732,8 +1719,10 @@ var ChoicesMixin = (superClass, selector) => {
1732
1719
  }
1733
1720
  _setInputType(choiceElement) {
1734
1721
  this._internals.ariaLabel = this.maxChoices === 1 ? "radio-group" : "checkbox-group";
1735
- choiceElement.internals.role = this.maxChoices === 1 ? "radio" : "checkbox";
1736
- choiceElement.internals.states.add(choiceElement.internals.role);
1722
+ const role = this.maxChoices === 1 ? "radio" : "checkbox";
1723
+ choiceElement.internals.role = role;
1724
+ choiceElement.internals.states.delete(role === "radio" ? "checkbox" : "radio");
1725
+ choiceElement.internals.states.add(role);
1737
1726
  }
1738
1727
  _choiceElementSelectedHandler(event) {
1739
1728
  this._toggleChoiceChecked(event.target);
@@ -1747,8 +1736,7 @@ var ChoicesMixin = (superClass, selector) => {
1747
1736
  this._handleChoiceSelection();
1748
1737
  }
1749
1738
  _setChoiceChecked(choice, checked) {
1750
- var _a;
1751
- if ((_a = choice.internals) == null ? void 0 : _a.states) {
1739
+ if (choice.internals?.states) {
1752
1740
  if (checked) {
1753
1741
  choice.internals.states.add("--checked");
1754
1742
  choice.internals.ariaChecked = "true";
@@ -1895,7 +1883,7 @@ var QtiInlineChoiceInteraction = class extends Interaction {
1895
1883
  return selectedOption ? selectedOption.value !== "" : false;
1896
1884
  }
1897
1885
  reset() {
1898
- this.options = this.options.map((option, i) => __spreadProps(__spreadValues({}, option), { selected: i === 0 }));
1886
+ this.options = this.options.map((option, i) => ({ ...option, selected: i === 0 }));
1899
1887
  }
1900
1888
  set value(value) {
1901
1889
  this.options = this.options.map((option) => {
@@ -1917,7 +1905,7 @@ var QtiInlineChoiceInteraction = class extends Interaction {
1917
1905
  }
1918
1906
  choiceSelected(event) {
1919
1907
  const selectedOptionValue = event.target.value;
1920
- this.options = this.options.map((option) => __spreadProps(__spreadValues({}, option), { selected: option.value === selectedOptionValue }));
1908
+ this.options = this.options.map((option) => ({ ...option, selected: option.value === selectedOptionValue }));
1921
1909
  this.saveResponse(selectedOptionValue);
1922
1910
  }
1923
1911
  };
@@ -1956,24 +1944,20 @@ var ShuffleMixin = (superClass, selector) => {
1956
1944
  class ShuffleElement extends superClass {
1957
1945
  constructor() {
1958
1946
  super(...arguments);
1959
- this._shuffle = false;
1960
- }
1961
- set shuffle(value) {
1962
- const oldValue = this._shuffle;
1963
- this._shuffle = value;
1964
- if (value) {
1965
- this._shuffleChoices();
1966
- } else {
1967
- this._resetShuffleChoices();
1968
- }
1969
- this.requestUpdate("shuffle", oldValue);
1970
- }
1971
- get shuffle() {
1972
- return this._shuffle;
1947
+ this.shuffle = "false";
1973
1948
  }
1949
+ // Defaults to 'false'
1974
1950
  connectedCallback() {
1975
1951
  super.connectedCallback();
1976
- if (this.shuffle) {
1952
+ this._applyShuffle();
1953
+ }
1954
+ updated(changedProperties) {
1955
+ if (changedProperties.has("shuffle")) {
1956
+ this._applyShuffle();
1957
+ }
1958
+ }
1959
+ _applyShuffle() {
1960
+ if (this.shuffle === "true") {
1977
1961
  this._shuffleChoices();
1978
1962
  } else {
1979
1963
  this._resetShuffleChoices();
@@ -1981,69 +1965,42 @@ var ShuffleMixin = (superClass, selector) => {
1981
1965
  }
1982
1966
  _shuffleChoices() {
1983
1967
  const choices = Array.from(this.querySelectorAll(selector));
1984
- const fixedElements = [];
1985
- const nonFixedElements = [];
1986
- choices.forEach((choice, index) => {
1987
- if (choice.hasAttribute("fixed")) {
1988
- fixedElements.push({ element: choice, index });
1989
- } else {
1990
- nonFixedElements.push(choice);
1991
- }
1992
- });
1993
- if (nonFixedElements.length <= 1) {
1968
+ const fixedChoices = choices.filter((choice) => choice.hasAttribute("fixed"));
1969
+ const nonFixedChoices = choices.filter((choice) => !choice.hasAttribute("fixed"));
1970
+ if (nonFixedChoices.length <= 1) {
1994
1971
  console.warn("Shuffling is not possible with fewer than 2 non-fixed elements.");
1995
1972
  return;
1996
1973
  }
1997
- let isShuffled = false;
1998
- const maxAttempts = 10;
1999
- let attempt = 0;
2000
- const originalOrder = [...nonFixedElements];
2001
- while (!isShuffled && attempt < maxAttempts) {
2002
- attempt++;
2003
- for (let i = nonFixedElements.length - 1; i > 0; i--) {
1974
+ const originalOrder = [...nonFixedChoices];
1975
+ let shuffled = false;
1976
+ let attempts = 0;
1977
+ while (!shuffled && attempts < 10) {
1978
+ attempts++;
1979
+ for (let i = nonFixedChoices.length - 1; i > 0; i--) {
2004
1980
  const j = Math.floor(Math.random() * (i + 1));
2005
- [nonFixedElements[i], nonFixedElements[j]] = [nonFixedElements[j], nonFixedElements[i]];
1981
+ [nonFixedChoices[i], nonFixedChoices[j]] = [nonFixedChoices[j], nonFixedChoices[i]];
2006
1982
  }
2007
- isShuffled = !nonFixedElements.every((choice, index) => choice === originalOrder[index]);
2008
- if (isShuffled) break;
1983
+ shuffled = !nonFixedChoices.every((choice, index) => choice === originalOrder[index]);
2009
1984
  }
2010
- if (!isShuffled) {
1985
+ if (!shuffled) {
2011
1986
  console.warn("Failed to shuffle the choices after multiple attempts.");
2012
1987
  }
2013
1988
  let order = 1;
2014
- choices.forEach((choice, index) => {
2015
- if (choice.hasAttribute("fixed")) {
2016
- choice.style.setProperty("order", String(order++));
2017
- } else {
2018
- const nonFixedChoice = nonFixedElements.shift();
2019
- nonFixedChoice.style.setProperty("order", String(order++));
2020
- }
1989
+ [...fixedChoices, ...nonFixedChoices].forEach((choice) => {
1990
+ choice.style.setProperty("order", String(order++));
2021
1991
  });
2022
1992
  }
2023
1993
  _resetShuffleChoices() {
2024
- const choices = Array.from(this.querySelectorAll("qti-simple-choice"));
2025
- choices.forEach((choice, index) => {
1994
+ this.querySelectorAll(selector).forEach((choice) => {
2026
1995
  choice.style.setProperty("order", "initial");
2027
1996
  });
2028
1997
  }
2029
1998
  }
2030
1999
  __decorateClass([
2031
- property13({
2032
- type: String,
2033
- reflect: true,
2034
- converter: stringToBooleanConverter
2035
- })
2036
- ], ShuffleElement.prototype, "shuffle", 1);
2000
+ property13({ type: String, reflect: true })
2001
+ ], ShuffleElement.prototype, "shuffle", 2);
2037
2002
  return ShuffleElement;
2038
2003
  };
2039
- var stringToBooleanConverter = {
2040
- fromAttribute(value) {
2041
- return value === "true";
2042
- },
2043
- toAttribute(value) {
2044
- return value ? "true" : "false";
2045
- }
2046
- };
2047
2004
 
2048
2005
  // src/lib/qti-components/qti-interaction/internal/vocabulary/vocabulary-mixin.ts
2049
2006
  import { property as property14 } from "lit/decorators.js";
@@ -2063,8 +2020,7 @@ var VocabularyMixin = (superClass, selector) => {
2063
2020
  this._addLabels();
2064
2021
  }
2065
2022
  get class() {
2066
- var _a;
2067
- return ((_a = this._classes) == null ? void 0 : _a.join(" ")) || "";
2023
+ return this._classes?.join(" ") || "";
2068
2024
  }
2069
2025
  updated(_changedProperties) {
2070
2026
  super.updated(_changedProperties);
@@ -2177,8 +2133,8 @@ var QtiChoiceInteraction = class extends VocabularyMixin(
2177
2133
  }
2178
2134
  render() {
2179
2135
  return html17`
2180
- <slot name="prompt"></slot><slot part="slot"></slot>
2181
- <div role="alert" id="validationMessage"></div>
2136
+ <slot part="prompt" name="prompt"></slot><slot part="slot"></slot>
2137
+ <div part="message" role="alert" id="validationMessage"></div>
2182
2138
  `;
2183
2139
  }
2184
2140
  };
@@ -2191,9 +2147,9 @@ QtiChoiceInteraction = __decorateClass([
2191
2147
  ], QtiChoiceInteraction);
2192
2148
 
2193
2149
  // src/lib/qti-components/qti-outcome-processing/qti-outcome-processing.ts
2194
- import { css as css12, html as html18, LitElement as LitElement15 } from "lit";
2150
+ import { css as css12, html as html18, LitElement as LitElement13 } from "lit";
2195
2151
  import { customElement as customElement20 } from "lit/decorators.js";
2196
- var QtiOutcomeProcessing = class extends LitElement15 {
2152
+ var QtiOutcomeProcessing = class extends LitElement13 {
2197
2153
  render() {
2198
2154
  return html18`<slot></slot>`;
2199
2155
  }
@@ -2222,7 +2178,7 @@ var QtiOutcomeProcessingProcessor = class {
2222
2178
  };
2223
2179
 
2224
2180
  // src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts
2225
- import { css as css13, html as html19, LitElement as LitElement16 } from "lit";
2181
+ import { css as css13, html as html19, LitElement as LitElement14 } from "lit";
2226
2182
  import { customElement as customElement21 } from "lit/decorators.js";
2227
2183
 
2228
2184
  // src/lib/qti-components/internal/template-strings.ts
@@ -2280,11 +2236,13 @@ var mapResponsePoint = `<qti-response-processing>
2280
2236
  </qti-response-processing>`;
2281
2237
 
2282
2238
  // src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts
2283
- var QtiResponseProcessing = class extends LitElement16 {
2239
+ var QtiResponseProcessing = class extends LitElement14 {
2284
2240
  render() {
2285
2241
  return html19`<slot></slot>`;
2286
2242
  }
2287
2243
  process() {
2244
+ const assessmentItem = this.closest("qti-assessment-item");
2245
+ if (!assessmentItem) return;
2288
2246
  const rules = [...this.children];
2289
2247
  for (const rule of rules) {
2290
2248
  rule.process();
@@ -2330,8 +2288,8 @@ import { property as property16 } from "lit/decorators.js";
2330
2288
 
2331
2289
  // src/lib/qti-components/qti-response-processing/qti-rule/qti-rule.ts
2332
2290
  import { customElement as customElement22 } from "lit/decorators.js";
2333
- import { html as html20, LitElement as LitElement17 } from "lit";
2334
- var QtiRule = class extends LitElement17 {
2291
+ import { html as html20, LitElement as LitElement15 } from "lit";
2292
+ var QtiRule = class extends LitElement15 {
2335
2293
  render() {
2336
2294
  return html20`<slot></slot>`;
2337
2295
  }
@@ -2431,13 +2389,12 @@ var QtiSetOutcomeValueRule = class {
2431
2389
  customElements.define("qti-set-outcome-value", QtiSetOutcomeValue);
2432
2390
 
2433
2391
  // src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-else.ts
2434
- import { LitElement as LitElement18, html as html22 } from "lit";
2435
- var QtiResponseElse = class extends LitElement18 {
2392
+ import { LitElement as LitElement16, html as html22 } from "lit";
2393
+ var QtiResponseElse = class extends LitElement16 {
2436
2394
  render() {
2437
2395
  return html22`<slot></slot>`;
2438
2396
  }
2439
2397
  calculate() {
2440
- const result = true;
2441
2398
  return true;
2442
2399
  }
2443
2400
  getSubRules() {
@@ -2483,9 +2440,9 @@ customElements.define("qti-response-else-if", QtiResponseElseIf);
2483
2440
 
2484
2441
  // src/lib/qti-components/qti-response-processing/qti-expression/qti-expression.ts
2485
2442
  import { consume as consume4 } from "@lit/context";
2486
- import { css as css14, html as html24, LitElement as LitElement19 } from "lit";
2443
+ import { css as css14, html as html24, LitElement as LitElement17 } from "lit";
2487
2444
  import { state as state8 } from "lit/decorators.js";
2488
- var QtiExpression = class extends LitElement19 {
2445
+ var QtiExpression = class extends LitElement17 {
2489
2446
  constructor() {
2490
2447
  super(...arguments);
2491
2448
  this.getVariables = () => (
@@ -2849,7 +2806,7 @@ var QtiGt = class extends QtiExpression {
2849
2806
  const values = this.getVariables();
2850
2807
  const value1 = values[0];
2851
2808
  const value2 = values[1];
2852
- if (value1.baseType === value2.baseType && (value1.baseType === "integer" || value1.baseType === "float")) {
2809
+ if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
2853
2810
  return +value1.value > +value2.value;
2854
2811
  } else {
2855
2812
  console.error("unexpected baseType or cardinality in qti gt");
@@ -2868,7 +2825,7 @@ var QtiGte = class extends QtiConditionExpression {
2868
2825
  const values = this.getVariables();
2869
2826
  const value1 = values[0];
2870
2827
  const value2 = values[1];
2871
- if (value1.baseType === value2.baseType && (value1.baseType === "integer" || value1.baseType === "float")) {
2828
+ if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
2872
2829
  return +value1.value >= +value2.value;
2873
2830
  } else {
2874
2831
  console.error("unexpected baseType or cardinality in qti gte");
@@ -2905,7 +2862,7 @@ var QtiLt = class extends QtiExpression {
2905
2862
  const values = this.getVariables();
2906
2863
  const value1 = values[0];
2907
2864
  const value2 = values[1];
2908
- if (value1.baseType === value2.baseType && (value1.baseType === "integer" || value1.baseType === "float")) {
2865
+ if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
2909
2866
  return +value1.value < +value2.value;
2910
2867
  } else {
2911
2868
  console.error("unexpected baseType or cardinality in qti lt");
@@ -2924,7 +2881,7 @@ var QtiLte = class extends QtiConditionExpression {
2924
2881
  const values = this.getVariables();
2925
2882
  const value1 = values[0];
2926
2883
  const value2 = values[1];
2927
- if (value1.baseType === value2.baseType && (value1.baseType === "integer" || value1.baseType === "float")) {
2884
+ if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
2928
2885
  return +value1.value <= +value2.value;
2929
2886
  } else {
2930
2887
  console.error("unexpected baseType or cardinality in qti lte");
@@ -2975,8 +2932,8 @@ customElements.define("qti-map-response", QtiMapResponse);
2975
2932
 
2976
2933
  // src/lib/qti-components/qti-response-processing/qti-expression/qti-mapping/qti-mapping.ts
2977
2934
  import { property as property21 } from "lit/decorators.js";
2978
- import { LitElement as LitElement20 } from "lit";
2979
- var QtiMapping = class extends LitElement20 {
2935
+ import { LitElement as LitElement18 } from "lit";
2936
+ var QtiMapping = class extends LitElement18 {
2980
2937
  constructor() {
2981
2938
  super(...arguments);
2982
2939
  this.defaultValue = 0;
@@ -3021,7 +2978,6 @@ var QtiMatch = class _QtiMatch extends QtiExpression {
3021
2978
  return null;
3022
2979
  }
3023
2980
  static match(valueToMap, correctValueInfo) {
3024
- var _a;
3025
2981
  switch (correctValueInfo.cardinality) {
3026
2982
  case "single": {
3027
2983
  if (valueToMap.value === null) return false;
@@ -3030,7 +2986,7 @@ var QtiMatch = class _QtiMatch extends QtiExpression {
3030
2986
  return false;
3031
2987
  }
3032
2988
  return ScoringHelper.compareSingleValues(
3033
- (_a = valueToMap.value) == null ? void 0 : _a.toString(),
2989
+ valueToMap.value?.toString(),
3034
2990
  correctValueInfo.value.toString(),
3035
2991
  correctValueInfo.baseType
3036
2992
  );
@@ -3099,7 +3055,7 @@ var QtiMember = class extends QtiExpression {
3099
3055
  console.warn("The member operator takes two sub-expressions");
3100
3056
  }
3101
3057
  const [value1, value2] = values;
3102
- if (!(value1.baseType === value2.baseType)) {
3058
+ if (!(value1.baseType === value2.baseType || value1.baseType === "integer" && value2.baseType === "float" || value1.baseType === "float" && value2.baseType === "integer")) {
3103
3059
  console.warn("Which must both have the same base-type");
3104
3060
  }
3105
3061
  if (!(value2.cardinality === "multiple" || value2.cardinality === "ordered")) {
@@ -3209,12 +3165,11 @@ customElements.define("qti-ordered", QtiOrdered);
3209
3165
 
3210
3166
  // src/lib/qti-components/qti-response-processing/qti-expression/qti-printed-variable/qti-printed-variable.ts
3211
3167
  import { consume as consume5 } from "@lit/context";
3212
- import { LitElement as LitElement21, html as html26 } from "lit";
3168
+ import { LitElement as LitElement19, html as html26 } from "lit";
3213
3169
  import { property as property22, state as state9 } from "lit/decorators.js";
3214
- var QtiPrintedVariable = class extends LitElement21 {
3170
+ var QtiPrintedVariable = class extends LitElement19 {
3215
3171
  render() {
3216
- var _a, _b;
3217
- const value = (_b = (_a = this.context) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
3172
+ const value = this.context?.variables.find((v) => v.identifier === this.identifier)?.value;
3218
3173
  return html26`${JSON.stringify(value, null, 2)}`;
3219
3174
  }
3220
3175
  calculate() {
@@ -3252,6 +3207,40 @@ var QtiProduct = class extends QtiExpression {
3252
3207
  };
3253
3208
  customElements.define("qti-product", QtiProduct);
3254
3209
 
3210
+ // src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/qti-subtract.ts
3211
+ var QtiSubtract = class extends qtiSubtractMixin(QtiExpression) {
3212
+ getResult() {
3213
+ const value = this.calculateChildren(Array.from(this.children));
3214
+ return value;
3215
+ }
3216
+ };
3217
+ function qtiSubtractMixin(Base) {
3218
+ return class MockQtiSubtract extends Base {
3219
+ calculateChildren(children) {
3220
+ const values = children.map((expression) => {
3221
+ if (!expression.calculate) {
3222
+ console.error("Element doesn't implement QtiConditionExpression");
3223
+ return null;
3224
+ }
3225
+ const value = expression.calculate();
3226
+ if (Number.isNaN(value)) {
3227
+ console.error("Unexpected value in qti-subtract, expected number");
3228
+ return null;
3229
+ }
3230
+ return Number(value);
3231
+ });
3232
+ if (values.some((value) => value === null)) {
3233
+ console.error("One or more child expressions returned invalid values");
3234
+ return 0;
3235
+ }
3236
+ return values[0] - values[1];
3237
+ }
3238
+ };
3239
+ }
3240
+
3241
+ // src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/index.ts
3242
+ customElements.define("qti-subtract", QtiSubtract);
3243
+
3255
3244
  // src/lib/qti-components/qti-response-processing/qti-expression/qti-string-match/qti-string-match.ts
3256
3245
  import { property as property23 } from "lit/decorators.js";
3257
3246
  var QtiStringMatch = class extends QtiExpression {
@@ -3351,7 +3340,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
3351
3340
  };
3352
3341
  this.getResolvablePathString = (path, basePath) => {
3353
3342
  path = path.replace(/\.js$/, "");
3354
- return (path == null ? void 0 : path.toLocaleLowerCase().startsWith("http")) || !basePath ? path : this.removeDoubleSlashes(`${basePath}/${path}`);
3343
+ return path?.toLocaleLowerCase().startsWith("http") || !basePath ? path : this.removeDoubleSlashes(`${basePath}/${path}`);
3355
3344
  };
3356
3345
  this.getResolvablePath = (path, basePath) => {
3357
3346
  return Array.isArray(path) ? path.map((p) => this.getResolvablePathString(p, basePath)) : this.getResolvablePathString(path, basePath);
@@ -3398,7 +3387,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
3398
3387
  validate() {
3399
3388
  return true;
3400
3389
  }
3401
- set value(val) {
3390
+ set value(_) {
3402
3391
  }
3403
3392
  get value() {
3404
3393
  return this.rawResponse;
@@ -3425,7 +3414,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
3425
3414
  if (el) {
3426
3415
  let properties = {};
3427
3416
  for (const child of el.children) {
3428
- properties = __spreadValues(__spreadValues({}, properties), getPropertyValue(child));
3417
+ properties = { ...properties, ...getPropertyValue(child) };
3429
3418
  }
3430
3419
  return properties;
3431
3420
  }
@@ -3433,7 +3422,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
3433
3422
  for (const properties of a) {
3434
3423
  const key = properties.getAttribute("key");
3435
3424
  if (!key) {
3436
- config = __spreadValues(__spreadValues({}, config), getChildProperties(properties));
3425
+ config = { ...config, ...getChildProperties(properties) };
3437
3426
  }
3438
3427
  return config;
3439
3428
  }
@@ -3586,12 +3575,8 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3586
3575
  // Flag to ensure dragstart event is dispatched once
3587
3576
  this.rootNode = null;
3588
3577
  // Root node for boundary calculations
3589
- this.focusedElement = null;
3590
- // To keep track of the currently focused draggable element
3591
- this.focusableDropZones = [];
3578
+ this.allDropzones = [];
3592
3579
  // All dropzones for keyboard navigation
3593
- this.currentDropZoneIndex = -1;
3594
- // Index for tabbing through drop zones
3595
3580
  this.dataTransfer = {
3596
3581
  data: {},
3597
3582
  setData(type, val) {
@@ -3625,28 +3610,21 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3625
3610
  document.addEventListener("touchend", this.handleTouchEnd.bind(this), { passive: false });
3626
3611
  document.addEventListener("mouseup", this.handleTouchEnd.bind(this), { passive: false });
3627
3612
  document.addEventListener("touchcancel", this.handleTouchCancel.bind(this), { passive: false });
3628
- document.addEventListener("keydown", this.handleKeyDown.bind(this));
3629
- document.addEventListener("keyup", this.handleKeyUp.bind(this));
3630
3613
  }
3631
3614
  addDraggableElements(draggables) {
3632
3615
  draggables.forEach((el) => {
3633
3616
  el.setAttribute("tabindex", "0");
3634
- el.addEventListener("focus", () => this.focusedElement = el);
3635
- el.addEventListener("blur", () => this.focusedElement = null);
3636
3617
  el.addEventListener("touchstart", this.handleTouchStart.bind(this), { passive: false });
3637
3618
  el.addEventListener("mousedown", this.handleTouchStart.bind(this), { passive: false });
3638
3619
  });
3639
3620
  }
3640
- // addDroppableElements(droppables: Element[]) {
3641
- // // this.droppables = droppables;
3642
- // droppables.forEach(el => {
3643
- // el.setAttribute('tabindex', '0'); // Make draggable elements focusable
3644
- // el.addEventListener('focus', () => (this.focusedElement = el as HTMLElement));
3645
- // el.addEventListener('blur', () => (this.focusedElement = null));
3646
- // // el.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: false });
3647
- // // el.addEventListener('mousedown', this.handleTouchStart.bind(this), { passive: false });
3648
- // });
3649
- // }
3621
+ getInteraction(el) {
3622
+ let parent = el;
3623
+ while (parent && !parent.tagName.toLocaleLowerCase().endsWith("-interaction")) {
3624
+ parent = parent.parentElement;
3625
+ }
3626
+ return parent;
3627
+ }
3650
3628
  handleTouchStart(e) {
3651
3629
  this.touchStartTime = Date.now();
3652
3630
  const { x, y } = this.getEventCoordinates(e);
@@ -3673,6 +3651,11 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3673
3651
  }
3674
3652
  handleTouchMove(e) {
3675
3653
  if (this.isDraggable && this.dragSource) {
3654
+ const interaction = this.getInteraction(this.dragSource);
3655
+ this.allDropzones = [
3656
+ ...Array.from(interaction.querySelectorAll("[dropzone]")),
3657
+ ...Array.from(interaction.shadowRoot?.querySelectorAll("[dropzone]"))
3658
+ ];
3676
3659
  const { x, y } = this.getEventCoordinates(e);
3677
3660
  const currentTouch = { clientX: x, clientY: y };
3678
3661
  if (this.calculateDragDistance(currentTouch) >= this.MIN_DRAG_DISTANCE) {
@@ -3681,6 +3664,20 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3681
3664
  }
3682
3665
  this.createDragClone(e, currentTouch);
3683
3666
  e.preventDefault();
3667
+ const closestDropzone = this.findClosestDropzone();
3668
+ this.currentDropTarget = closestDropzone;
3669
+ if (closestDropzone !== this.lastTarget) {
3670
+ if (this.lastTarget) {
3671
+ this.dispatchCustomEvent(this.lastTarget, "dragleave");
3672
+ }
3673
+ if (closestDropzone) {
3674
+ this.dispatchCustomEvent(closestDropzone, "dragenter");
3675
+ }
3676
+ this.lastTarget = closestDropzone;
3677
+ }
3678
+ if (this.lastTarget) {
3679
+ this.dispatchCustomEvent(this.lastTarget, "dragover");
3680
+ }
3684
3681
  }
3685
3682
  }
3686
3683
  createDragClone(e, currentTouch) {
@@ -3716,7 +3713,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3716
3713
  }
3717
3714
  }
3718
3715
  }
3719
- const dropTarget = this.findDropTarget(e);
3716
+ const dropTarget = this.currentDropTarget;
3720
3717
  if (dropTarget !== this.lastTarget) {
3721
3718
  this.dispatchCustomEvent(dropTarget, "dragenter");
3722
3719
  this.dispatchCustomEvent(this.lastTarget, "dragleave");
@@ -3726,7 +3723,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3726
3723
  if (this.currentDropTarget) this.dispatchCustomEvent(dropTarget, "dragover");
3727
3724
  }
3728
3725
  handleTouchEnd(e) {
3729
- var _a;
3726
+ this.allDropzones = [];
3730
3727
  this.touchEndTriggered = true;
3731
3728
  this.isDraggable = false;
3732
3729
  let dropFound = false;
@@ -3737,13 +3734,59 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3737
3734
  } else if (this.isDragging) {
3738
3735
  const dragEndEvent = new CustomEvent("dragend", { bubbles: true, cancelable: true });
3739
3736
  dragEndEvent["dataTransfer"] = { dropEffect: "none" };
3740
- (_a = this.dragSource) == null ? void 0 : _a.dispatchEvent(dragEndEvent);
3737
+ this.dragSource?.dispatchEvent(dragEndEvent);
3741
3738
  }
3742
3739
  this.resetDragState(dropFound);
3743
3740
  }
3744
3741
  handleTouchCancel(e) {
3745
3742
  this.resetDragState();
3746
3743
  }
3744
+ findClosestDropzone() {
3745
+ if (!this.dragSource || this.allDropzones.length === 0) return null;
3746
+ const dragRect = this.dragSource.getBoundingClientRect();
3747
+ const dragCorners = this.getCorners(dragRect);
3748
+ const dragCenter = this.getCenter(dragRect);
3749
+ let closestDropzone = null;
3750
+ let minDistance = Infinity;
3751
+ for (const dropzone of this.allDropzones) {
3752
+ const dropRect = dropzone.getBoundingClientRect();
3753
+ const dropCorners = this.getCorners(dropRect);
3754
+ const dropCenter = this.getCenter(dropRect);
3755
+ const cornerDistance = this.calculateTotalCornerDistance(dragCorners, dropCorners) / this.getRectDiagonal(dropRect);
3756
+ const centerDistance = this.calculateDistance(dragCenter, dropCenter);
3757
+ const totalDistance = cornerDistance * 0.5 + centerDistance * 0.5;
3758
+ if (totalDistance < minDistance) {
3759
+ minDistance = totalDistance;
3760
+ closestDropzone = dropzone;
3761
+ }
3762
+ }
3763
+ return closestDropzone;
3764
+ }
3765
+ getCenter(rect) {
3766
+ return {
3767
+ x: rect.left + rect.width / 2,
3768
+ y: rect.top + rect.height / 2
3769
+ };
3770
+ }
3771
+ getRectDiagonal(rect) {
3772
+ return Math.sqrt(rect.width ** 2 + rect.height ** 2);
3773
+ }
3774
+ getCorners(rect) {
3775
+ return {
3776
+ topLeft: { x: rect.left, y: rect.top },
3777
+ topRight: { x: rect.right, y: rect.top },
3778
+ bottomLeft: { x: rect.left, y: rect.bottom },
3779
+ bottomRight: { x: rect.right, y: rect.bottom }
3780
+ };
3781
+ }
3782
+ calculateTotalCornerDistance(cornersA, cornersB) {
3783
+ return this.calculateDistance(cornersA.topLeft, cornersB.topLeft) + this.calculateDistance(cornersA.topRight, cornersB.topRight) + this.calculateDistance(cornersA.bottomLeft, cornersB.bottomLeft) + this.calculateDistance(cornersA.bottomRight, cornersB.bottomRight);
3784
+ }
3785
+ calculateDistance(pointA, pointB) {
3786
+ const dx = pointA.x - pointB.x;
3787
+ const dy = pointA.y - pointB.y;
3788
+ return Math.sqrt(dx * dx + dy * dy);
3789
+ }
3747
3790
  findDropTarget(event) {
3748
3791
  const { x, y } = this.getEventCoordinates(event);
3749
3792
  return this.getDropTargetAtPoint(document, x, y);
@@ -3775,41 +3818,6 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3775
3818
  }
3776
3819
  return null;
3777
3820
  }
3778
- handleKeyDown(e) {
3779
- if (this.focusedElement) {
3780
- if (e.key === " " && !this.isDragging) {
3781
- e.preventDefault();
3782
- this.isDraggable = true;
3783
- this.dragSource = this.focusedElement;
3784
- this.isDragging = true;
3785
- this.collectDropZones();
3786
- this.dispatchCustomEvent(this.dragSource, "dragstart");
3787
- } else if (e.key === "Tab" && this.isDragging) {
3788
- e.preventDefault();
3789
- this.moveToNextDropZone();
3790
- }
3791
- }
3792
- }
3793
- handleKeyUp(e) {
3794
- if (e.key === " " && this.isDragging && this.currentDropTarget) {
3795
- e.preventDefault();
3796
- this.dispatchCustomEvent(this.currentDropTarget, "drop");
3797
- this.dispatchCustomEvent(this.dragSource, "dragend");
3798
- this.resetDragState(true);
3799
- }
3800
- }
3801
- collectDropZones() {
3802
- this.focusableDropZones = Array.from(document.querySelectorAll("[dropzone]"));
3803
- this.currentDropZoneIndex = -1;
3804
- }
3805
- moveToNextDropZone() {
3806
- if (this.focusableDropZones.length === 0) return;
3807
- this.currentDropZoneIndex = (this.currentDropZoneIndex + 1) % this.focusableDropZones.length;
3808
- const nextDropZone = this.focusableDropZones[this.currentDropZoneIndex];
3809
- nextDropZone.focus();
3810
- this.currentDropTarget = nextDropZone;
3811
- this.dispatchCustomEvent(nextDropZone, "dragenter");
3812
- }
3813
3821
  getEventCoordinates(event, page = false) {
3814
3822
  const touch = event.touches ? event.touches[0] : event;
3815
3823
  return {
@@ -3839,26 +3847,6 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3839
3847
  this.dragClone.style.top = `${boundedTop}px`;
3840
3848
  });
3841
3849
  }
3842
- applyTransformBoundaries(deltaX, deltaY) {
3843
- let boundaryRect;
3844
- if (this.rootNode instanceof ShadowRoot) {
3845
- boundaryRect = this.rootNode.host.getBoundingClientRect();
3846
- } else if (this.rootNode instanceof Document) {
3847
- boundaryRect = document.documentElement.getBoundingClientRect();
3848
- } else {
3849
- boundaryRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);
3850
- }
3851
- const elementRect = this.dragSource.getBoundingClientRect();
3852
- const elementWidth = elementRect.width;
3853
- const elementHeight = elementRect.height;
3854
- const newLeft = elementRect.left + deltaX;
3855
- const newTop = elementRect.top + deltaY;
3856
- const boundedLeft = Math.max(boundaryRect.left, Math.min(newLeft, boundaryRect.right - elementWidth));
3857
- const boundedTop = Math.max(boundaryRect.top, Math.min(newTop, boundaryRect.bottom - elementHeight));
3858
- const boundedDeltaX = boundedLeft - elementRect.left;
3859
- const boundedDeltaY = boundedTop - elementRect.top;
3860
- return { boundedDeltaX, boundedDeltaY };
3861
- }
3862
3850
  applyBoundaries(newLeft, newTop, element) {
3863
3851
  let boundaryRect;
3864
3852
  if (this.rootNode instanceof ShadowRoot) {
@@ -3887,11 +3875,10 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3887
3875
  element.dispatchEvent(event);
3888
3876
  }
3889
3877
  resetDragState(dropFound = false) {
3890
- var _a;
3891
3878
  if (this.isDragging) {
3892
3879
  if (this.useDragClone) {
3893
3880
  this.dragSource.style.opacity = "1.0";
3894
- (_a = this.dragClone) == null ? void 0 : _a.parentElement.removeChild(this.dragClone);
3881
+ this.dragClone?.parentElement.removeChild(this.dragClone);
3895
3882
  } else {
3896
3883
  if (!dropFound) this.dragSource.style.transform = "translate(0, 0)";
3897
3884
  this.dragSource.style.zIndex = "";
@@ -3907,6 +3894,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
3907
3894
  this.touchStartTime = 0;
3908
3895
  this.touchStartPoint = null;
3909
3896
  this.touchEndTriggered = false;
3897
+ this.allDropzones = [];
3910
3898
  this.dataTransfer = {
3911
3899
  data: {},
3912
3900
  setData(type, val) {
@@ -3993,43 +3981,53 @@ var DroppablesMixin = (superClass, useShadowRoot, droppablesSelector) => {
3993
3981
  droppable.removeEventListener("drop", this.dropHandler);
3994
3982
  }
3995
3983
  disconnectedCallback() {
3996
- var _a;
3997
3984
  if (this.isMatchTabular()) return;
3998
3985
  super.disconnectedCallback();
3999
- (_a = this.observer) == null ? void 0 : _a.disconnect();
3986
+ this.observer?.disconnect();
4000
3987
  }
4001
3988
  dragenterHandler(ev) {
4002
3989
  ev.preventDefault();
4003
3990
  }
4004
3991
  dragoverHandler(ev) {
3992
+ const responseIdentifierDraggable = ev.dataTransfer.getData("responseIdentifier");
4005
3993
  ev.preventDefault();
4006
- this.activateDroppable(ev.currentTarget);
4007
- ev.dataTransfer.dropEffect = "move";
3994
+ if (responseIdentifierDraggable === this.responseIdentifier) {
3995
+ this.activateDroppable(ev.currentTarget);
3996
+ ev.dataTransfer.dropEffect = "move";
3997
+ }
4008
3998
  return false;
4009
3999
  }
4010
4000
  activateDroppable(droppable) {
4001
+ this._internals.states.delete("--dragzone-active");
4011
4002
  droppable.setAttribute("active", "");
4012
4003
  }
4013
4004
  async dropHandler(ev) {
4014
4005
  ev.preventDefault();
4015
4006
  const droppable = ev.currentTarget;
4016
4007
  const identifier = ev.dataTransfer.getData("text");
4017
- const draggable = this.findDraggable(identifier);
4008
+ const responseIdentifierDraggable = ev.dataTransfer.getData("responseIdentifier");
4009
+ const draggable = this.findDraggable(responseIdentifierDraggable, identifier);
4018
4010
  if (!draggable) return false;
4019
- if (draggable && !this.isValidDrop(droppable, draggable)) {
4011
+ if (draggable && !this.isValidDrop(droppable, draggable, responseIdentifierDraggable)) {
4020
4012
  draggable.style.transform = "translate(0, 0)";
4021
4013
  return false;
4022
4014
  }
4023
4015
  await this.moveDraggableToDroppable(draggable, droppable);
4024
- this.deactivateDroppable(droppable);
4016
+ this.deactivateDroppable(droppable, false);
4025
4017
  return false;
4026
4018
  }
4027
- findDraggable(identifier) {
4019
+ findDraggable(responseIdentifier, identifier) {
4028
4020
  if (!identifier) return null;
4029
- return this.querySelector(`[identifier=${identifier}]`) || this.shadowRoot.querySelector(`[identifier=${identifier}]`);
4021
+ if (responseIdentifier === this.responseIdentifier) {
4022
+ return this.querySelector(`[identifier=${identifier}]`) || this.shadowRoot.querySelector(`[identifier=${identifier}]`);
4023
+ } else {
4024
+ const assessmentItem = this.closest("qti-assessment-item");
4025
+ const interaction = assessmentItem.querySelector(`[response-identifier=${responseIdentifier}]`);
4026
+ return interaction.querySelector(`[identifier=${identifier}]`);
4027
+ }
4030
4028
  }
4031
- isValidDrop(droppable, draggable) {
4032
- return draggable.parentElement.getAttribute("identifier") !== droppable.getAttribute("identifier");
4029
+ isValidDrop(droppable, draggable, responseIdentifierDraggable) {
4030
+ return this.responseIdentifier === responseIdentifierDraggable;
4033
4031
  }
4034
4032
  async moveDraggableToDroppable(draggable, droppable) {
4035
4033
  const moveElement = () => {
@@ -4045,7 +4043,10 @@ var DroppablesMixin = (superClass, useShadowRoot, droppablesSelector) => {
4045
4043
  const transition = document.startViewTransition(moveElement);
4046
4044
  await transition.finished;
4047
4045
  }
4048
- deactivateDroppable(droppable) {
4046
+ deactivateDroppable(droppable, makeDragzoneActive = true) {
4047
+ if (makeDragzoneActive) {
4048
+ this._internals.states.add("--dragzone-active");
4049
+ }
4049
4050
  droppable.removeAttribute("active");
4050
4051
  }
4051
4052
  dragleaveHandler(ev) {
@@ -4133,11 +4134,12 @@ import { property as property26 } from "lit/decorators.js";
4133
4134
  // src/lib/decorators/live-query.ts
4134
4135
  function liveQuery(querySelector, options) {
4135
4136
  let observer;
4136
- const resolvedOptions = __spreadValues({}, options);
4137
+ const resolvedOptions = {
4138
+ ...options
4139
+ };
4137
4140
  return (proto, decoratedFnName) => {
4138
4141
  const { connectedCallback, disconnectedCallback } = proto;
4139
4142
  proto.connectedCallback = function() {
4140
- var _a;
4141
4143
  connectedCallback.call(this);
4142
4144
  const callback = (mutationList) => {
4143
4145
  const elementsToWatch = Array.from(this.querySelectorAll(querySelector));
@@ -4151,7 +4153,7 @@ function liveQuery(querySelector, options) {
4151
4153
  };
4152
4154
  observer = new MutationObserver(callback);
4153
4155
  observer.observe(this, { childList: true, subtree: true });
4154
- const elementsAdded = (_a = this.querySelectorAll(querySelector)) != null ? _a : [];
4156
+ const elementsAdded = this.querySelectorAll(querySelector) ?? [];
4155
4157
  this[decoratedFnName](Array.from(elementsAdded), []);
4156
4158
  };
4157
4159
  proto.disconnectedCallback = function() {
@@ -4182,11 +4184,19 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4182
4184
  this.handleDragStart = (ev) => {
4183
4185
  const target = ev.currentTarget;
4184
4186
  ev.dataTransfer.setData("text", target.getAttribute("identifier"));
4187
+ if (this.responseIdentifier) {
4188
+ ev.dataTransfer.setData("responseIdentifier", this.responseIdentifier);
4189
+ }
4190
+ this._internals.states.add("--dragzone-enabled");
4185
4191
  target.setAttribute("dragging", "");
4186
- this.activateDroppables();
4192
+ this.activateDragLocation();
4193
+ this.activateDroppables(target);
4187
4194
  };
4188
4195
  this.handleDragEnd = async (ev) => {
4189
4196
  ev.preventDefault();
4197
+ this._internals.states.delete("--dragzone-enabled");
4198
+ this._internals.states.delete("--dragzone-active");
4199
+ this.deactivateDragLocation();
4190
4200
  this.deactivateDroppables();
4191
4201
  const draggable = ev.currentTarget;
4192
4202
  draggable.removeAttribute("dragging");
@@ -4197,38 +4207,6 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4197
4207
  }
4198
4208
  }
4199
4209
  };
4200
- // MH: This method is just to make sure this can be tested.
4201
- // because I can't get the dropEffect to be 'move' in the test
4202
- this.checkForMoveTestItem = (ev) => {
4203
- if (!ev.dataTransfer.items) {
4204
- return Promise.resolve(false);
4205
- }
4206
- return new Promise((resolve) => {
4207
- let hasMoveTestItem = false;
4208
- const items = Array.from(ev.dataTransfer.items);
4209
- const pending = items.length;
4210
- if (pending === 0) {
4211
- resolve(false);
4212
- return;
4213
- }
4214
- items.forEach((item) => {
4215
- if (item.kind === "string" && item.type === "text") {
4216
- item.getAsString((data) => {
4217
- if (data === "move-test") {
4218
- hasMoveTestItem = true;
4219
- }
4220
- if (pending === 0) {
4221
- resolve(hasMoveTestItem);
4222
- }
4223
- });
4224
- } else {
4225
- if (pending === 0) {
4226
- resolve(hasMoveTestItem);
4227
- }
4228
- }
4229
- });
4230
- });
4231
- };
4232
4210
  }
4233
4211
  handleDraggablesChange(dragsAdded, dragsRemoved) {
4234
4212
  if (this.isMatchTabular()) return;
@@ -4280,16 +4258,56 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4280
4258
  this.droppables = Array.from(
4281
4259
  useShadowRootForDroppables ? this.shadowRoot.querySelectorAll(droppablesSelector) : this.querySelectorAll(droppablesSelector)
4282
4260
  );
4261
+ const choicesContainerWidth = this.dataset.choicesContainerWidth;
4262
+ if (choicesContainerWidth) {
4263
+ this.droppables.forEach((d) => {
4264
+ d.style.width = `${choicesContainerWidth}px`;
4265
+ d.style.boxSizing = `border-box`;
4266
+ });
4267
+ }
4268
+ }
4269
+ getDragContainers() {
4270
+ const draggleble = Array.from(this.querySelectorAll(`[part='drags']`) || []);
4271
+ const dragglebleShadow = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(`[part='drags']`) || []) : [];
4272
+ return draggleble.concat(dragglebleShadow);
4273
+ }
4274
+ activateDroppables(target) {
4275
+ const dragContainers = this.getDragContainers();
4276
+ dragContainers.forEach((d) => {
4277
+ d.setAttribute("enabled", "");
4278
+ d.setAttribute("dropzone", "move");
4279
+ if (d.hasAttribute("disabled")) {
4280
+ if (d.contains(target) || d.shadowRoot && d.shadowRoot.contains(target)) {
4281
+ d.removeAttribute("disabled");
4282
+ d.setAttribute("dropzone", "move");
4283
+ }
4284
+ }
4285
+ });
4286
+ this.droppables.forEach((d) => {
4287
+ d.setAttribute("enabled", "");
4288
+ if (d.hasAttribute("disabled")) {
4289
+ if (d.contains(target) || d.shadowRoot && d.shadowRoot.contains(target)) {
4290
+ d.removeAttribute("disabled");
4291
+ d.setAttribute("dropzone", "move");
4292
+ }
4293
+ }
4294
+ });
4283
4295
  }
4284
- activateDroppables() {
4285
- this.droppables.forEach((d) => d.setAttribute("enabled", ""));
4296
+ activateDragLocation() {
4297
+ this._internals.states.add("--dragzone-enabled");
4298
+ }
4299
+ deactivateDragLocation() {
4300
+ this._internals.states.delete("--dragzone-enabled");
4286
4301
  }
4287
4302
  deactivateDroppables() {
4303
+ const dragContainers = this.getDragContainers();
4304
+ dragContainers.forEach((d) => {
4305
+ d.removeAttribute("enabled");
4306
+ });
4288
4307
  this.droppables.forEach((d) => d.removeAttribute("enabled"));
4289
4308
  }
4290
4309
  async wasDropped(ev) {
4291
- const hasMoveTestItem = await this.checkForMoveTestItem(ev);
4292
- return ev.dataTransfer.dropEffect !== "none" || hasMoveTestItem;
4310
+ return ev.dataTransfer.dropEffect !== "none";
4293
4311
  }
4294
4312
  wasMoved(ev) {
4295
4313
  return ev.dataTransfer.dropEffect === "move";
@@ -4312,6 +4330,35 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4312
4330
  moveDraggable(draggable, parent, index);
4313
4331
  });
4314
4332
  }
4333
+ validate() {
4334
+ const validAssociations = this.getValidAssociations();
4335
+ let isValid = true;
4336
+ let validityMessage = "";
4337
+ if (this.maxAssociations > 0 && validAssociations > this.maxAssociations) {
4338
+ isValid = false;
4339
+ validityMessage = this.dataset.maxSelectionsMessage || `You've selected too many associations. Maximum allowed is ${this.maxAssociations}.`;
4340
+ } else if (this.minAssociations > 0 && validAssociations < this.minAssociations) {
4341
+ isValid = false;
4342
+ validityMessage = this.dataset.minSelectionsMessage || `You haven't selected enough associations. Minimum required is ${this.minAssociations}.`;
4343
+ }
4344
+ const lastElementChild = this.lastElementChild;
4345
+ this._internals.setValidity(isValid ? {} : { customError: true }, validityMessage, lastElementChild);
4346
+ this.reportValidity();
4347
+ return isValid;
4348
+ }
4349
+ reportValidity() {
4350
+ const validationMessageElement = this.shadowRoot.querySelector("#validationMessage");
4351
+ if (validationMessageElement) {
4352
+ if (!this._internals.validity.valid) {
4353
+ validationMessageElement.textContent = this._internals.validationMessage;
4354
+ validationMessageElement.style.display = "block";
4355
+ } else {
4356
+ validationMessageElement.textContent = "";
4357
+ validationMessageElement.style.display = "none";
4358
+ }
4359
+ }
4360
+ return this._internals.validity.valid;
4361
+ }
4315
4362
  checkMaxAssociations() {
4316
4363
  this.droppables.forEach((d, index) => {
4317
4364
  const maxMatch = +(d.getAttribute("match-max") || 1);
@@ -4338,7 +4385,16 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4338
4385
  set value(value) {
4339
4386
  if (this.isMatchTabular()) return;
4340
4387
  this.resetDroppables();
4341
- value == null ? void 0 : value.forEach((entry) => this.placeResponse(entry));
4388
+ value?.forEach((entry) => this.placeResponse(entry));
4389
+ if (Array.isArray(value)) {
4390
+ const formData = new FormData();
4391
+ value.forEach((response) => {
4392
+ formData.append(this.responseIdentifier, response);
4393
+ });
4394
+ this._internals.setFormValue(formData);
4395
+ } else {
4396
+ this._internals.setFormValue(value);
4397
+ }
4342
4398
  }
4343
4399
  placeResponse(response) {
4344
4400
  const [dropId, ...dragIds] = response.split(" ").reverse();
@@ -4366,14 +4422,11 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
4366
4422
  await transition.finished;
4367
4423
  }
4368
4424
  }
4369
- validate() {
4370
- const validAssociations = this.getValidAssociations();
4371
- return this.minAssociations <= 0 || this.minAssociations <= validAssociations;
4372
- }
4373
4425
  getValidAssociations() {
4374
4426
  return this.droppables.filter((d) => d.childElementCount > 0).length;
4375
4427
  }
4376
4428
  saveResponse() {
4429
+ this.validate();
4377
4430
  const response = this.collectResponseData();
4378
4431
  this.dispatchEvent(
4379
4432
  new CustomEvent("qti-interaction-response", {
@@ -4481,9 +4534,10 @@ var QtiAssociateInteraction = class extends DragDropInteractionMixin(
4481
4534
  <div part="drop-container">
4482
4535
  ${this._childrenMap.length > 0 && Array.from(Array(Math.ceil(this._childrenMap.length / 2)).keys()).map(
4483
4536
  (_, index) => html28`<div part="associables-container">
4484
- <div name="left${index}" part="drop-list" class="dl" identifier="droplist${index}_left"></div>
4485
- <div name="right${index}" part="drop-list" class="dl" identifier="droplist${index}_right"></div>
4486
- </div>`
4537
+ <div name="left${index}" part="drop-list" class="dl" identifier="droplist${index}_left"></div>
4538
+ <div name="right${index}" part="drop-list" class="dl" identifier="droplist${index}_right"></div>
4539
+ </div>
4540
+ <div role="alert" id="validationMessage"></div>`
4487
4541
  )}
4488
4542
  </div>`;
4489
4543
  }
@@ -4524,7 +4578,7 @@ var QtiCustomInteraction = class extends Interaction {
4524
4578
  // is embedded in an iframe and coming from another domain
4525
4579
  // Therefor we need to use the new CES API to communicates via the broadcast API
4526
4580
  setupCES() {
4527
- const iframe = this.shadowRoot.querySelector("#pciContainer"), iframeWin = iframe.contentWindow || iframe, iframeDoc = iframe.contentDocument;
4581
+ const iframe = this.shadowRoot.querySelector("#pciContainer"), iframeDoc = iframe.contentDocument;
4528
4582
  window.addEventListener("message", this.handlePostMessage);
4529
4583
  iframeDoc.open();
4530
4584
  iframeDoc.write(`
@@ -4681,12 +4735,12 @@ var QtiEndAttemptInteraction = class extends Interaction {
4681
4735
  get value() {
4682
4736
  return "";
4683
4737
  }
4684
- set value(val) {
4738
+ set value(_) {
4685
4739
  }
4686
4740
  render() {
4687
4741
  return html30`<button ?disabled=${this.disabled} part="button" @click=${this.endAttempt}>${this.title}</button>`;
4688
4742
  }
4689
- endAttempt(e) {
4743
+ endAttempt(_) {
4690
4744
  this.dispatchEvent(
4691
4745
  new CustomEvent("end-attempt", {
4692
4746
  bubbles: true,
@@ -4707,11 +4761,99 @@ QtiEndAttemptInteraction = __decorateClass([
4707
4761
  ], QtiEndAttemptInteraction);
4708
4762
 
4709
4763
  // src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts
4710
- import { css as css16, html as html31 } from "lit";
4764
+ import { html as html31 } from "lit";
4711
4765
  import { customElement as customElement27 } from "lit/decorators.js";
4766
+
4767
+ // src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.styles.ts
4768
+ import { css as css16 } from "lit";
4769
+ var qti_gap_match_interaction_styles_default = css16`
4770
+ :host {
4771
+ display: flex;
4772
+ align-items: flex-start;
4773
+ flex-direction: column;
4774
+ flex-wrap: wrap;
4775
+ gap: 0.5rem;
4776
+ }
4777
+
4778
+ :host(.qti-choices-top) {
4779
+ flex-direction: column;
4780
+ }
4781
+ :host(.qti-choices-bottom) {
4782
+ flex-direction: column-reverse;
4783
+ }
4784
+ :host(.qti-choices-left) {
4785
+ flex-direction: row;
4786
+ }
4787
+ :host(.qti-choices-right) {
4788
+ flex-direction: row-reverse;
4789
+ }
4790
+ /* [part='drops'] , */
4791
+ [name='prompt'] {
4792
+ width: 100%;
4793
+ }
4794
+ [name='drags'] {
4795
+ display: flex;
4796
+ align-items: flex-start;
4797
+ flex: 1;
4798
+ border: 2px solid transparent;
4799
+ padding: 0.3rem;
4800
+ border-radius: 0.3rem;
4801
+ gap: 0.5rem;
4802
+ }
4803
+ `;
4804
+
4805
+ // src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts
4712
4806
  var QtiGapMatchInteraction = class extends DragDropInteractionMixin(Interaction, "qti-gap-text", false, "qti-gap") {
4807
+ constructor() {
4808
+ super(...arguments);
4809
+ this.observer = null;
4810
+ this.resizeObserver = null;
4811
+ }
4713
4812
  render() {
4714
- return html31`<slot name="prompt"> </slot><slot part="drags" name="qti-gap-text"></slot> <slot part="drops"></slot>`;
4813
+ return html31`<slot name="prompt"> </slot>
4814
+ <slot part="drags" name="drags"></slot>
4815
+ <slot part="drops"></slot>
4816
+ <div role="alert" id="validationMessage"></div>`;
4817
+ }
4818
+ firstUpdated(_changedProperties) {
4819
+ super.firstUpdated(_changedProperties);
4820
+ this.updateMinDimensionsForDrowZones();
4821
+ this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());
4822
+ this.observer.observe(this, { childList: true, subtree: true });
4823
+ this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());
4824
+ const gapTexts = this.querySelectorAll("qti-gap-text");
4825
+ gapTexts.forEach((gapText) => this.resizeObserver?.observe(gapText));
4826
+ }
4827
+ disconnectedCallback() {
4828
+ super.disconnectedCallback();
4829
+ if (this.observer) {
4830
+ this.observer.disconnect();
4831
+ this.observer = null;
4832
+ }
4833
+ if (this.resizeObserver) {
4834
+ this.resizeObserver.disconnect();
4835
+ this.resizeObserver = null;
4836
+ }
4837
+ }
4838
+ updateMinDimensionsForDrowZones() {
4839
+ const gapTexts = this.querySelectorAll("qti-gap-text");
4840
+ const gaps = this.querySelectorAll("qti-gap");
4841
+ let maxHeight = 0;
4842
+ let maxWidth = 0;
4843
+ gapTexts.forEach((gapText) => {
4844
+ const rect = gapText.getBoundingClientRect();
4845
+ maxHeight = Math.max(maxHeight, rect.height);
4846
+ maxWidth = Math.max(maxWidth, rect.width);
4847
+ });
4848
+ const dragSlot = this.shadowRoot?.querySelector('[part="drags"]');
4849
+ if (dragSlot) {
4850
+ dragSlot.style.minHeight = `${maxHeight}px`;
4851
+ dragSlot.style.minWidth = `${maxWidth}px`;
4852
+ }
4853
+ for (const gap of gaps) {
4854
+ gap.style.minHeight = `${maxHeight}px`;
4855
+ gap.style.minWidth = `${maxWidth}px`;
4856
+ }
4715
4857
  }
4716
4858
  set correctResponse(value) {
4717
4859
  let matches = [];
@@ -4723,54 +4865,24 @@ var QtiGapMatchInteraction = class extends DragDropInteractionMixin(Interaction,
4723
4865
  });
4724
4866
  }
4725
4867
  const gaps = this.querySelectorAll("qti-gap");
4726
- gaps.forEach((gap, index) => {
4727
- var _a, _b, _c, _d;
4868
+ gaps.forEach((gap) => {
4728
4869
  const identifier = gap.getAttribute("identifier");
4729
- const textIdentifier = (_a = matches.find((x) => x.gap === identifier)) == null ? void 0 : _a.text;
4730
- const text = (_b = this.querySelector(`qti-gap-text[identifier="${textIdentifier}"]`)) == null ? void 0 : _b.textContent.trim();
4870
+ const textIdentifier = matches.find((x) => x.gap === identifier)?.text;
4871
+ const text = this.querySelector(`qti-gap-text[identifier="${textIdentifier}"]`)?.textContent.trim();
4731
4872
  if (textIdentifier && text) {
4732
- if (!((_c = gap.nextElementSibling) == null ? void 0 : _c.classList.contains("correct-option"))) {
4873
+ if (!gap.nextElementSibling?.classList.contains("correct-option")) {
4733
4874
  const textSpan = document.createElement("span");
4734
4875
  textSpan.classList.add("correct-option");
4735
4876
  textSpan.textContent = text;
4736
4877
  gap.insertAdjacentElement("afterend", textSpan);
4737
4878
  }
4738
- } else if ((_d = gap.nextElementSibling) == null ? void 0 : _d.classList.contains("correct-option")) {
4879
+ } else if (gap.nextElementSibling?.classList.contains("correct-option")) {
4739
4880
  gap.nextElementSibling.remove();
4740
4881
  }
4741
4882
  });
4742
4883
  }
4743
4884
  };
4744
- QtiGapMatchInteraction.styles = [
4745
- css16`
4746
- :host {
4747
- display: flex;
4748
- align-items: flex-start;
4749
- flex-direction: column;
4750
- gap: 0.5rem;
4751
- }
4752
-
4753
- :host(.qti-choices-top) {
4754
- flex-direction: column;
4755
- }
4756
- :host(.qti-choices-bottom) {
4757
- flex-direction: column-reverse;
4758
- }
4759
- :host(.qti-choices-left) {
4760
- flex-direction: row;
4761
- }
4762
- :host(.qti-choices-right) {
4763
- flex-direction: row-reverse;
4764
- }
4765
- /* [part='drops'] , */
4766
- [part='drags'] {
4767
- display: flex;
4768
- align-items: flex-start;
4769
- flex: 1;
4770
- gap: 0.5rem;
4771
- }
4772
- `
4773
- ];
4885
+ QtiGapMatchInteraction.styles = qti_gap_match_interaction_styles_default;
4774
4886
  QtiGapMatchInteraction = __decorateClass([
4775
4887
  customElement27("qti-gap-match-interaction")
4776
4888
  ], QtiGapMatchInteraction);
@@ -4869,13 +4981,12 @@ var QtiGraphicAssociateInteraction = class extends Interaction {
4869
4981
  return this._lines;
4870
4982
  }
4871
4983
  render() {
4872
- var _a, _b, _c, _d;
4873
4984
  return html32`<slot name="prompt"></slot>
4874
4985
  <line-container>
4875
4986
  <svg
4876
- width=${ifDefined3((_a = this.grImage[0]) == null ? void 0 : _a.width)}
4877
- height=${ifDefined3((_b = this.grImage[0]) == null ? void 0 : _b.height)}
4878
- viewbox="0 0 ${(_c = this.grImage[0]) == null ? void 0 : _c.width} ${(_d = this.grImage[0]) == null ? void 0 : _d.height}"
4987
+ width=${ifDefined3(this.grImage[0]?.width)}
4988
+ height=${ifDefined3(this.grImage[0]?.height)}
4989
+ viewbox="0 0 ${this.grImage[0]?.width} ${this.grImage[0]?.height}"
4879
4990
  >
4880
4991
  ${repeat(
4881
4992
  this._lines,
@@ -4908,7 +5019,8 @@ var QtiGraphicAssociateInteraction = class extends Interaction {
4908
5019
  />`}
4909
5020
  </svg>
4910
5021
  <slot></slot>
4911
- </line-container>`;
5022
+ </line-container>
5023
+ <div role="alert" id="validationMessage"></div>`;
4912
5024
  }
4913
5025
  positionHotspotOnRegister(e) {
4914
5026
  const img = this.querySelector("img");
@@ -5002,21 +5114,116 @@ QtiGraphicAssociateInteraction = __decorateClass([
5002
5114
  ], QtiGraphicAssociateInteraction);
5003
5115
 
5004
5116
  // src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts
5005
- import { css as css18, html as html33 } from "lit";
5117
+ import { html as html33 } from "lit";
5006
5118
  import { customElement as customElement29 } from "lit/decorators.js";
5119
+
5120
+ // src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.styles.ts
5121
+ import { css as css18 } from "lit";
5122
+ var qti_graphic_gap_match_interaction_styles_default = css18`
5123
+ :host {
5124
+ display: flex;
5125
+ align-items: flex-start;
5126
+ flex-direction: column;
5127
+ flex-wrap: wrap;
5128
+ gap: 0.5rem;
5129
+ }
5130
+
5131
+ :host(.qti-choices-top) {
5132
+ flex-direction: column-reverse;
5133
+ }
5134
+ :host(.qti-choices-bottom) {
5135
+ flex-direction: column;
5136
+ }
5137
+ :host(.qti-choices-left) {
5138
+ flex-direction: row-reverse;
5139
+ & [name='drags'] {
5140
+ width: 25%;
5141
+ }
5142
+ & [part='image'] {
5143
+ width: 75%;
5144
+ }
5145
+ }
5146
+ :host(.qti-choices-right) {
5147
+ flex-direction: row;
5148
+ & [name='drags'] {
5149
+ width: 25%;
5150
+ }
5151
+ & [part='image'] {
5152
+ width: 75%;
5153
+ }
5154
+ }
5155
+ [part='image'] {
5156
+ display: block;
5157
+ position: relative;
5158
+ }
5159
+ /* [part='drops'] , */
5160
+
5161
+ [name='drags'] {
5162
+ display: flex;
5163
+ align-items: flex-start;
5164
+ flex-wrap: wrap;
5165
+ flex: 1;
5166
+ border: 2px solid transparent;
5167
+ padding: 0.3rem;
5168
+ border-radius: 0.3rem;
5169
+ gap: 0.5rem;
5170
+ }
5171
+ ::slotted(img) {
5172
+ display: inline-block;
5173
+ user-select: none;
5174
+ pointer-events: none;
5175
+ }
5176
+ `;
5177
+
5178
+ // src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts
5007
5179
  var QtiGraphicGapMatchInteraction = class extends DragDropInteractionMixin(
5008
5180
  Interaction,
5009
- "qti-gap-img",
5181
+ "qti-gap-img, qti-gap-text",
5010
5182
  false,
5011
5183
  "qti-associable-hotspot"
5012
5184
  ) {
5185
+ constructor() {
5186
+ super(...arguments);
5187
+ this.observer = null;
5188
+ this.resizeObserver = null;
5189
+ }
5013
5190
  render() {
5014
5191
  return html33` <slot name="prompt"></slot>
5015
- <slot></slot>
5016
- <slot name="qti-gap-img"></slot>`;
5192
+ <slot part="image"></slot>
5193
+ <slot part="drags" name="drags"></slot>
5194
+ <div role="alert" id="validationMessage"></div>`;
5195
+ }
5196
+ firstUpdated(_changedProperties) {
5197
+ super.firstUpdated(_changedProperties);
5198
+ this.updateMinDimensionsForDrowZones();
5199
+ this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());
5200
+ this.observer.observe(this, { childList: true, subtree: true });
5201
+ this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());
5202
+ const draggableGaps = this.querySelectorAll("qti-gap-img, qti-gap-text");
5203
+ draggableGaps.forEach((gapText) => this.resizeObserver?.observe(gapText));
5204
+ }
5205
+ updateMinDimensionsForDrowZones() {
5206
+ const draggableGaps = this.querySelectorAll("qti-gap-img, qti-gap-text");
5207
+ const gaps = this.querySelectorAll("qti-associable-hotspot");
5208
+ let maxHeight = 0;
5209
+ let maxWidth = 0;
5210
+ draggableGaps.forEach((gapText) => {
5211
+ const rect = gapText.getBoundingClientRect();
5212
+ maxHeight = Math.max(maxHeight, rect.height);
5213
+ maxWidth = Math.max(maxWidth, rect.width);
5214
+ });
5215
+ const slots = this.shadowRoot.querySelectorAll("slot");
5216
+ const dragSlot = Array.from(slots).find((slot) => slot.name === "drags");
5217
+ if (dragSlot) {
5218
+ dragSlot.style.minHeight = `${maxHeight}px`;
5219
+ dragSlot.style.minWidth = `${maxWidth}px`;
5220
+ }
5221
+ for (const gap of gaps) {
5222
+ gap.style.minHeight = `${maxHeight}px`;
5223
+ gap.style.minWidth = `${maxWidth}px`;
5224
+ }
5017
5225
  }
5018
5226
  positionHotspotOnRegister(e) {
5019
- const img = this.querySelector("img");
5020
5227
  const hotspot = e.target;
5021
5228
  const coords = hotspot.getAttribute("coords");
5022
5229
  const shape = hotspot.getAttribute("shape");
@@ -5052,16 +5259,7 @@ var QtiGraphicGapMatchInteraction = class extends DragDropInteractionMixin(
5052
5259
  this.removeEventListener("qti-register-hotspot", this.positionHotspotOnRegister);
5053
5260
  }
5054
5261
  };
5055
- QtiGraphicGapMatchInteraction.styles = css18`
5056
- :host {
5057
- display: inline-block;
5058
- position: relative;
5059
- }
5060
- slot[name='qti-gap-img'] {
5061
- display: flex;
5062
- gap: 1rem;
5063
- }
5064
- `;
5262
+ QtiGraphicGapMatchInteraction.styles = qti_graphic_gap_match_interaction_styles_default;
5065
5263
  QtiGraphicGapMatchInteraction = __decorateClass([
5066
5264
  customElement29("qti-graphic-gap-match-interaction")
5067
5265
  ], QtiGraphicGapMatchInteraction);
@@ -5080,6 +5278,7 @@ var QtiGraphicOrderInteraction = class extends ChoicesMixin(Interaction, "qti-ho
5080
5278
  <!-- slot for the prompt -->
5081
5279
  <slot></slot>
5082
5280
  <!-- slot for the image and hotspots -->
5281
+ <div role="alert" id="validationMessage"></div>
5083
5282
  `;
5084
5283
  }
5085
5284
  setHotspotOrder(e) {
@@ -5203,9 +5402,9 @@ import { customElement as customElement33, property as property30, state as stat
5203
5402
  import { unsafeHTML as unsafeHTML2 } from "lit/directives/unsafe-html.js";
5204
5403
 
5205
5404
  // src/lib/qti-components/qti-interaction/qti-simple-associable-choice.ts
5206
- import { css as css21, html as html36, LitElement as LitElement26 } from "lit";
5405
+ import { css as css21, html as html36, LitElement as LitElement20 } from "lit";
5207
5406
  import { customElement as customElement32, property as property29 } from "lit/decorators.js";
5208
- var QtiSimpleAssociableChoice = class extends ActiveElementMixin(LitElement26, "qti-simple-associable-choice") {
5407
+ var QtiSimpleAssociableChoice = class extends ActiveElementMixin(LitElement20, "qti-simple-associable-choice") {
5209
5408
  constructor() {
5210
5409
  super(...arguments);
5211
5410
  this.matchMin = 0;
@@ -5381,20 +5580,21 @@ var QtiMatchInteraction = class extends DragDropInteractionMixin(
5381
5580
  }
5382
5581
  render() {
5383
5582
  if (!this.classList.contains("qti-match-tabular")) {
5384
- return html37`<slot name="prompt"></slot> <slot></slot>`;
5583
+ return html37`<slot name="prompt"></slot> <slot></slot>
5584
+ <div role="alert" id="validationMessage"></div>`;
5385
5585
  }
5386
5586
  return html37`
5387
5587
  <slot name="prompt"></slot>
5388
5588
  <table>
5389
5589
  <tr>
5390
5590
  <td></td>
5391
- ${this.cols.map((col, i) => html37`<th part="r-header">${unsafeHTML2(col.innerHTML)}</th>`)}
5591
+ ${this.cols.map((col) => html37`<th part="r-header">${unsafeHTML2(col.innerHTML)}</th>`)}
5392
5592
  </tr>
5393
5593
 
5394
5594
  ${this.rows.map(
5395
- (row, rIndex) => html37`<tr>
5595
+ (row) => html37`<tr>
5396
5596
  <td part="c-header">${unsafeHTML2(row.innerHTML)}</td>
5397
- ${this.cols.map((col, cIndex) => {
5597
+ ${this.cols.map((col) => {
5398
5598
  const rowId = row.getAttribute("identifier");
5399
5599
  const colId = col.getAttribute("identifier");
5400
5600
  const value = `${rowId} ${colId}`;
@@ -5459,13 +5659,16 @@ var QtiMediaInteraction = class extends Interaction {
5459
5659
  }
5460
5660
  }
5461
5661
  static get properties() {
5462
- return __spreadValues(__spreadValues({}, Interaction.properties), {
5463
- step: {
5464
- type: Number,
5465
- attribute: "step",
5466
- default: 10
5662
+ return {
5663
+ ...Interaction.properties,
5664
+ ...{
5665
+ step: {
5666
+ type: Number,
5667
+ attribute: "step",
5668
+ default: 10
5669
+ }
5467
5670
  }
5468
- });
5671
+ };
5469
5672
  }
5470
5673
  render() {
5471
5674
  return html38` <slot name="prompt"></slot>
@@ -5523,12 +5726,12 @@ var QtiOrderInteraction = class extends ShuffleMixin(
5523
5726
  }
5524
5727
  if (this.correctResponses.length === 0) {
5525
5728
  const responses = Array.isArray(value) ? value : [value];
5526
- responses.forEach((response, index) => {
5729
+ responses.forEach((response) => {
5527
5730
  let simpleChoice = this.querySelector(`qti-simple-choice[identifier="${response}"]`);
5528
5731
  if (!simpleChoice) {
5529
5732
  simpleChoice = this.shadowRoot.querySelector(`qti-simple-choice[identifier="${response}"]`);
5530
5733
  }
5531
- const text = simpleChoice == null ? void 0 : simpleChoice.textContent.trim();
5734
+ const text = simpleChoice?.textContent.trim();
5532
5735
  this.correctResponses = [...this.correctResponses, text];
5533
5736
  });
5534
5737
  }
@@ -5622,13 +5825,13 @@ QtiOrderInteraction = __decorateClass([
5622
5825
  ], QtiOrderInteraction);
5623
5826
 
5624
5827
  // src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-interaction.ts
5625
- import { LitElement as LitElement29, css as css25, html as html40 } from "lit";
5626
- var QtiSPositionObjectInteraction = class extends LitElement29 {
5828
+ import { LitElement as LitElement21, css as css25, html as html40 } from "lit";
5829
+ var QtiPositionObjectInteraction = class extends LitElement21 {
5627
5830
  render() {
5628
5831
  return html40`<slot></slot>`;
5629
5832
  }
5630
5833
  };
5631
- QtiSPositionObjectInteraction.styles = [
5834
+ QtiPositionObjectInteraction.styles = [
5632
5835
  css25`
5633
5836
  :host {
5634
5837
  display: block;
@@ -5642,12 +5845,12 @@ QtiSPositionObjectInteraction.styles = [
5642
5845
  }
5643
5846
  `
5644
5847
  ];
5645
- customElements.define("qti-position-object-interaction", QtiSPositionObjectInteraction);
5848
+ customElements.define("qti-position-object-interaction", QtiPositionObjectInteraction);
5646
5849
 
5647
5850
  // src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-stage.ts
5648
- import { LitElement as LitElement30, css as css26, html as html41 } from "lit";
5851
+ import { LitElement as LitElement22, css as css26, html as html41 } from "lit";
5649
5852
  import { customElement as customElement36 } from "lit/decorators.js";
5650
- var QtiPositionObjectStage = class extends LitElement30 {
5853
+ var QtiPositionObjectStage = class extends LitElement22 {
5651
5854
  render() {
5652
5855
  return html41`<slot></slot>`;
5653
5856
  }
@@ -5678,7 +5881,7 @@ var QtiPositionObjectStage = class extends LitElement30 {
5678
5881
  });
5679
5882
  document.addEventListener("mouseup", this.removeMoveListener);
5680
5883
  }
5681
- removeMoveListener(event) {
5884
+ removeMoveListener() {
5682
5885
  document.removeEventListener("mousemove", this.dragElementHandler, true);
5683
5886
  }
5684
5887
  disconnectedCallback() {
@@ -5816,9 +6019,9 @@ var QtiSliderInteraction = class extends Interaction {
5816
6019
  this._value = 0;
5817
6020
  this.stepLabel = false;
5818
6021
  this.reverse = false;
5819
- this._handleDisabledChange = (old, disabled) => {
6022
+ this._handleDisabledChange = () => {
5820
6023
  };
5821
- this._handleReadonlyChange = (old, readonly) => {
6024
+ this._handleReadonlyChange = () => {
5822
6025
  };
5823
6026
  this.csLive = getComputedStyle(this);
5824
6027
  }
@@ -5965,9 +6168,6 @@ var QtiSliderInteraction = class extends Interaction {
5965
6168
  }
5966
6169
  };
5967
6170
  QtiSliderInteraction.styles = [css28``];
5968
- __decorateClass([
5969
- query3("#knob")
5970
- ], QtiSliderInteraction.prototype, "_knob", 2);
5971
6171
  __decorateClass([
5972
6172
  query3("#rail")
5973
6173
  ], QtiSliderInteraction.prototype, "_rail", 2);
@@ -5998,39 +6198,29 @@ QtiSliderInteraction = __decorateClass([
5998
6198
 
5999
6199
  // src/lib/qti-components/qti-custom-operator/qti-custom-operator.ts
6000
6200
  import { consume as consume6 } from "@lit/context";
6001
- import { LitElement as LitElement31, html as html44 } from "lit";
6201
+ import { LitElement as LitElement23, html as html44 } from "lit";
6002
6202
  import { customElement as customElement39, state as state17 } from "lit/decorators.js";
6003
- var QtiCustomOperator = class extends LitElement31 {
6203
+ var QtiCustomOperator = class extends LitElement23 {
6004
6204
  render() {
6005
6205
  return html44`<slot @slotchange=${this.handleSlotChange}></slot>`;
6006
6206
  }
6007
- handleSlotChange(event) {
6008
- var _a, _b, _c;
6009
- const commentNode = Array.from((_b = (_a = this.firstElementChild) == null ? void 0 : _a.childNodes) != null ? _b : []).find(
6207
+ handleSlotChange() {
6208
+ const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(
6010
6209
  (node) => node.nodeType === Node.COMMENT_NODE
6011
6210
  );
6012
6211
  try {
6013
- this.operatorFunction = new Function("context", "fn", "item", (_c = commentNode.textContent) != null ? _c : "");
6212
+ this.operatorFunction = new Function("context", "fn", "item", commentNode.textContent ?? "");
6014
6213
  } catch (e) {
6015
6214
  console.error("custom-operator contains invalid javascript code", e);
6016
6215
  }
6017
6216
  }
6018
6217
  calculate() {
6019
6218
  const fn = {
6020
- variable: (responseIdentifier) => {
6021
- var _a, _b, _c;
6022
- return (_c = (_b = (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === responseIdentifier)) == null ? void 0 : _b.value) != null ? _c : "";
6023
- },
6024
- correct: (responseIdentifier) => {
6025
- var _a, _b, _c;
6026
- return (_c = (_b = (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === responseIdentifier)) == null ? void 0 : _b.correctResponse) != null ? _c : "";
6027
- }
6219
+ variable: (responseIdentifier) => this._context?.variables.find((v) => v.identifier === responseIdentifier)?.value ?? "",
6220
+ correct: (responseIdentifier) => this._context?.variables.find((v) => v.identifier === responseIdentifier)?.correctResponse ?? ""
6028
6221
  };
6029
6222
  const item = {
6030
- getVariable: (variableIdentifier) => {
6031
- var _a;
6032
- return (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === variableIdentifier);
6033
- },
6223
+ getVariable: (variableIdentifier) => this._context?.variables.find((v) => v.identifier === variableIdentifier),
6034
6224
  updateOutcomeVariable: (outcomeIdentifier, value) => {
6035
6225
  this.dispatchEvent(
6036
6226
  new CustomEvent("qti-set-outcome-value", {
@@ -6068,9 +6258,9 @@ QtiCustomOperator = __decorateClass([
6068
6258
  ], QtiCustomOperator);
6069
6259
 
6070
6260
  // src/lib/qti-components/qti-interaction/qti-associable-hotspot.ts
6071
- import { LitElement as LitElement32, css as css29, html as html45 } from "lit";
6261
+ import { LitElement as LitElement24, css as css29, html as html45 } from "lit";
6072
6262
  import { customElement as customElement40 } from "lit/decorators.js";
6073
- var QtiAssociableHotspot = class extends LitElement32 {
6263
+ var QtiAssociableHotspot = class extends LitElement24 {
6074
6264
  connectedCallback() {
6075
6265
  super.connectedCallback();
6076
6266
  this.dispatchEvent(
@@ -6082,7 +6272,7 @@ var QtiAssociableHotspot = class extends LitElement32 {
6082
6272
  );
6083
6273
  }
6084
6274
  render() {
6085
- return html45` <slot name="qti-gap-img"></slot> `;
6275
+ return html45` <slot name="drags"></slot> `;
6086
6276
  }
6087
6277
  };
6088
6278
  QtiAssociableHotspot.styles = css29`
@@ -6097,15 +6287,15 @@ QtiAssociableHotspot = __decorateClass([
6097
6287
  ], QtiAssociableHotspot);
6098
6288
 
6099
6289
  // src/lib/qti-components/qti-interaction/qti-gap.ts
6100
- import { css as css30, html as html46, LitElement as LitElement33 } from "lit";
6290
+ import { css as css30, html as html46, LitElement as LitElement25 } from "lit";
6101
6291
  import { customElement as customElement41, property as property34 } from "lit/decorators.js";
6102
- var QtiGap = class extends LitElement33 {
6292
+ var QtiGap = class extends LitElement25 {
6103
6293
  constructor() {
6104
6294
  super(...arguments);
6105
6295
  this.tabindex = 0;
6106
6296
  }
6107
6297
  render() {
6108
- return html46` <slot name="qti-gap-text"></slot>`;
6298
+ return html46` <slot name="drags"></slot>`;
6109
6299
  }
6110
6300
  };
6111
6301
  QtiGap.styles = css30`
@@ -6122,15 +6312,15 @@ QtiGap = __decorateClass([
6122
6312
  ], QtiGap);
6123
6313
 
6124
6314
  // src/lib/qti-components/qti-interaction/qti-gap-img.ts
6125
- import { css as css31, LitElement as LitElement34 } from "lit";
6315
+ import { css as css31, LitElement as LitElement26 } from "lit";
6126
6316
  import { customElement as customElement42, property as property35 } from "lit/decorators.js";
6127
- var QtiGapImg = class extends LitElement34 {
6317
+ var QtiGapImg = class extends LitElement26 {
6128
6318
  constructor() {
6129
6319
  super(...arguments);
6130
6320
  this.tabindex = 0;
6131
6321
  }
6132
6322
  connectedCallback() {
6133
- this.setAttribute("slot", "qti-gap-img");
6323
+ this.setAttribute("slot", "drags");
6134
6324
  }
6135
6325
  };
6136
6326
  QtiGapImg.styles = css31`
@@ -6147,16 +6337,16 @@ QtiGapImg = __decorateClass([
6147
6337
  ], QtiGapImg);
6148
6338
 
6149
6339
  // src/lib/qti-components/qti-interaction/qti-gap-text.ts
6150
- import { css as css32, html as html47, LitElement as LitElement35 } from "lit";
6340
+ import { css as css32, html as html47, LitElement as LitElement27 } from "lit";
6151
6341
  import { customElement as customElement43, property as property36 } from "lit/decorators.js";
6152
- var QtiGapText = class extends ActiveElementMixin(LitElement35, "qti-gap-text") {
6342
+ var QtiGapText = class extends ActiveElementMixin(LitElement27, "qti-gap-text") {
6153
6343
  constructor() {
6154
6344
  super(...arguments);
6155
6345
  this.tabindex = 0;
6156
6346
  }
6157
6347
  connectedCallback() {
6158
6348
  super.connectedCallback();
6159
- this.setAttribute("slot", "qti-gap-text");
6349
+ this.setAttribute("slot", "drags");
6160
6350
  }
6161
6351
  render() {
6162
6352
  return html47`<slot></slot>`;
@@ -6176,9 +6366,9 @@ QtiGapText = __decorateClass([
6176
6366
  ], QtiGapText);
6177
6367
 
6178
6368
  // src/lib/qti-components/qti-interaction/qti-hotspot-choice.ts
6179
- import { css as css33, LitElement as LitElement36 } from "lit";
6369
+ import { css as css33, LitElement as LitElement28 } from "lit";
6180
6370
  import { customElement as customElement44, property as property37 } from "lit/decorators.js";
6181
- var QtiHotspotChoice = class extends ActiveElementMixin(LitElement36, "qti-hotspot-choice") {
6371
+ var QtiHotspotChoice = class extends ActiveElementMixin(LitElement28, "qti-hotspot-choice") {
6182
6372
  };
6183
6373
  QtiHotspotChoice.styles = css33`
6184
6374
  :host {
@@ -6195,9 +6385,9 @@ QtiHotspotChoice = __decorateClass([
6195
6385
  ], QtiHotspotChoice);
6196
6386
 
6197
6387
  // src/lib/qti-components/qti-interaction/qti-hottext.ts
6198
- import { css as css34, html as html48, LitElement as LitElement37 } from "lit";
6388
+ import { css as css34, html as html48, LitElement as LitElement29 } from "lit";
6199
6389
  import { customElement as customElement45 } from "lit/decorators.js";
6200
- var QtiHottext = class extends ActiveElementMixin(LitElement37, "qti-hottext") {
6390
+ var QtiHottext = class extends ActiveElementMixin(LitElement29, "qti-hottext") {
6201
6391
  render() {
6202
6392
  return html48`<div part="ch"><div part="cha"></div></div>
6203
6393
  <slot></slot> `;
@@ -6214,9 +6404,9 @@ QtiHottext = __decorateClass([
6214
6404
  ], QtiHottext);
6215
6405
 
6216
6406
  // src/lib/qti-components/qti-interaction/qti-inline-choice.ts
6217
- import { css as css35, html as html49, LitElement as LitElement38 } from "lit";
6407
+ import { css as css35, html as html49, LitElement as LitElement30 } from "lit";
6218
6408
  import { customElement as customElement46, property as property38 } from "lit/decorators.js";
6219
- var QtiInlineChoice = class extends LitElement38 {
6409
+ var QtiInlineChoice = class extends LitElement30 {
6220
6410
  static get styles() {
6221
6411
  return [
6222
6412
  css35`
@@ -6263,9 +6453,9 @@ QtiInlineChoice = __decorateClass([
6263
6453
  ], QtiInlineChoice);
6264
6454
 
6265
6455
  // src/lib/qti-components/qti-interaction/qti-simple-choice.ts
6266
- import { css as css36, html as html50, LitElement as LitElement39, nothing as nothing2 } from "lit";
6456
+ import { css as css36, html as html50, LitElement as LitElement31, nothing as nothing2 } from "lit";
6267
6457
  import { customElement as customElement47, property as property39 } from "lit/decorators.js";
6268
- var QtiSimpleChoice = class extends ActiveElementMixin(LitElement39, "qti-simple-choice") {
6458
+ var QtiSimpleChoice = class extends ActiveElementMixin(LitElement31, "qti-simple-choice") {
6269
6459
  get checked() {
6270
6460
  return this["internals"].states.has("--checked");
6271
6461
  }
@@ -6369,6 +6559,7 @@ export {
6369
6559
  QtiOutcomeProcessing,
6370
6560
  QtiOutcomeProcessingProcessor,
6371
6561
  QtiPortableCustomInteraction,
6562
+ QtiPositionObjectInteraction,
6372
6563
  QtiPositionObjectStage,
6373
6564
  QtiPrintedVariable,
6374
6565
  QtiProduct,
@@ -6381,7 +6572,6 @@ export {
6381
6572
  QtiResponseProcessing,
6382
6573
  QtiRubricBlock,
6383
6574
  QtiRule,
6384
- QtiSPositionObjectInteraction,
6385
6575
  QtiSelectPointInteraction,
6386
6576
  QtiSetOutcomeValue,
6387
6577
  QtiSetOutcomeValueRule,
@@ -6390,12 +6580,14 @@ export {
6390
6580
  QtiSliderInteraction,
6391
6581
  QtiStringMatch,
6392
6582
  QtiStylesheet,
6583
+ QtiSubtract,
6393
6584
  QtiSum,
6394
6585
  QtiSumExpression,
6395
6586
  QtiTextEntryInteraction,
6396
6587
  QtiVariable,
6397
6588
  itemContext,
6398
6589
  itemContextVariables,
6399
- qtiAndMixin
6590
+ qtiAndMixin,
6591
+ qtiSubtractMixin
6400
6592
  };
6401
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkuc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXByb21wdC9xdGktcHJvbXB0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1jb250ZW50LWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1ydWJyaWMtYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC91dGlscy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcmVzcG9uc2UtY29uZGl0aW9uL3F0aS1yZXNwb25zZS1jb25kaXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktc2V0LW91dGNvbWUtdmFsdWUvcXRpLXNldC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWVsc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL3F0aS1hbmQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWJhc2V2YWx1ZS9xdGktYmFzZXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbnRhaW5zL3F0aS1jb250YWlucy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb3JyZWN0L3F0aS1jb3JyZWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsLXJvdW5kZWQvcXRpLWVxdWFsLXJvdW5kZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwvcXRpLWVxdWFsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0L3F0aS1ndC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndGUvcXRpLWd0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1pcy1udWxsL3F0aS1pcy1udWxsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0L3F0aS1sdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdGUvcXRpLWx0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXAtcmVzcG9uc2UvcXRpLW1hcC1yZXNwb25zZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hdGNoL3F0aS1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tZW1iZXIvcXRpLW1lbWJlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbm90L3F0aS1ub3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3IvcXRpLW9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yZGVyZWQvcXRpLW9yZGVyZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJpbnRlZC12YXJpYWJsZS9xdGktcHJpbnRlZC12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcm9kdWN0L3F0aS1wcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN0cmluZy1tYXRjaC9xdGktc3RyaW5nLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN1bS9xdGktc3VtLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXZhcmlhYmxlL3F0aS12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY3VzdG9tLW9wZXJhdG9yL3F0aS1jdXN0b20tb3BlcmF0b3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWFibGUtaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtaW1nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtdGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+IHwgYW55XG4gICkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PihTeW1ib2woJ2l0ZW0nKSk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG4gICAgaWYgKHN0aW11bHVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHN0aW11bHVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdGltdWx1cy1ib2R5LCBxdGktc3R5bGVzaGVldCcpO1xuICAgICAgc3RpbXVsdXNSZWYuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzdGltdWx1c1JlZi5hcHBlbmQoLi4uZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlciwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydGVyIHRvIGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMgZm9yIEFSSUEgcHJvcGVydGllcyxcbiAqIGVuc3VyaW5nIHRoZXkgYXJlIHNldCBhcyAndHJ1ZScgb3IgJ2ZhbHNlJyBzdHJpbmdzLlxuICovXG5jb25zdCBhcmlhQm9vbGVhbkNvbnZlcnRlcjogQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxib29sZWFuLCBib29sZWFuPiA9IHtcbiAgdG9BdHRyaWJ1dGU6ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJyksXG4gIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdmFsdWUgPT09ICd0cnVlJ1xufTtcblxuLyoqXG4gKiBBIG1peGluIHRoYXQgYWRkcyBjaG9pY2UgZnVuY3Rpb25hbGl0eSB0byBhIExpdEVsZW1lbnQtYmFzZWQgY2xhc3MuXG4gKiBJdCBkaXNwYXRjaGVzIGV2ZW50cyB3aXRoIGEgY3VzdG9tIGB0eXBlYCBhbmQgaGFuZGxlcyBzZWxlY3Rpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIEJhc2UgLSBUaGUgYmFzZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjaG9pY2UsIHVzZWQgaW4gZXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIG5ldyBjbGFzcyBleHRlbmRpbmcgdGhlIGJhc2UgY2xhc3Mgd2l0aCBjaG9pY2UgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHRhYkluZGV4OiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbiAgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBBY3RpdmVFbGVtZW50TWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihCYXNlOiBULCB0eXBlOiBzdHJpbmcpIHtcbiAgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGlkZW50aWZpZXIgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAndGFiaW5kZXgnIH0pXG4gICAgcHVibGljIHRhYkluZGV4ID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLXJlYWRvbmx5JyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyByZWFkb25seSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgaGFuZGxlRGlzYWJsZWRDaGFuZ2UoX29sZFZhbHVlOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgdGhpcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgdW5yZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX29uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FjdGl2YXRlKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9PihgYWN0aXZhdGUtJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUNob2ljZSBhcyBDb25zdHJ1Y3RvcjxBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2U+ICYgVDtcbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWl0ZW0tYm9keS5zdHlsZXMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1pdGVtLWJvZHkgbm9kZSBjb250YWlucyB0aGUgdGV4dCwgZ3JhcGhpY3MsIG1lZGlhIG9iamVjdHMgYW5kIGludGVyYWN0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBpdGVtJ3MgY29udGVudCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IGlzIHN0cnVjdHVyZWQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnNwaHBvNmx1NnpxaVxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAc2xvdCAtIGl0ZW0gYm9keSBjb250ZW50LlxuICogQHNsb3QgcXRpLXJ1YnJpYy1ibG9jayAtIHRoZSBxdGkgcnVicmljIGJsb2NrIGlzIHBsYWNlZCBhYm92ZSB0aGUgaXRlbVxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pdGVtLWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGlmIChpbkludGVyYWN0aW9uKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcm9tcHQnKTtcbiAgICB9XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgaWYgKGxpbmsgIT09IG51bGwpIHtcbiAgICAgIC8vIEZldGNoIHRoZSBzdHlsZXNoZWV0IGNvbnRlbnRcbiAgICAgIGZldGNoKGxpbmspXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oY3NzQ29udGVudCA9PiB7XG4gICAgICAgICAgLy8gTWluaWZ5IHRoZSBDU1MgY29udGVudCBieSByZW1vdmluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50c1xuICAgICAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIENTU1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcblxuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCAhPT0gbnVsbCAmJiB0aGlzLnRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIC8vIE1pbmlmeSB0aGUgaW5saW5lIENTUyBjb250ZW50XG4gICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKHRoaXMudGV4dENvbnRlbnQpO1xuXG4gICAgICAvLyBEaXJlY3RseSBjcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCB0aGUgQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBpbmxpbmUgc3R5bGVzXG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBgQHNjb3BlIHske21pbmlmaWVkQ3NzfX1gO1xuXG4gICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtaW5pZnlDc3MoY3NzQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgY29tbWVudHMsIHdoaXRlc3BhY2UsIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnNcbiAgICByZXR1cm4gY3NzQ29udGVudFxuICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpIC8vIFJlbW92ZSBjb21tZW50c1xuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKSAvLyBDb2xsYXBzZSB3aGl0ZXNwYWNlXG4gICAgICAucmVwbGFjZSgvXFxzKihbe306O10pXFxzKi9nLCAnJDEnKSAvLyBSZW1vdmUgc3BhY2VzIGFyb3VuZCB7fSwgOiwgO1xuICAgICAgLnRyaW0oKTsgLy8gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcmVtb3ZlIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zdHlsZXNoZWV0JzogUXRpU3R5bGVzaGVldDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdleHRlcm5hbC1zY29yZWQnIH0pIGV4dGVybmFsU2NvcmVkOiAnaHVtYW4nIHwgJ2V4dGVybmFsTWFjaGluZScgfCBudWxsID0gbnVsbDtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgZ2V0IGludGVycG9sYXRpb25UYWJsZSgpOiBNYXA8bnVtYmVyLCBudW1iZXI+IHwgbnVsbCB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlJyk7XG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGFibGUucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKSkge1xuICAgICAgICBpZiAoIWVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbWlzc2luZyBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSk7XG4gICAgICAgIGlmIChpc05hTihzb3VyY2VWYWx1ZSkgfHwgaXNOYU4odGFyZ2V0VmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBub3QgYSBudW1iZXIgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyaWVzLnNldChzb3VyY2VWYWx1ZSwgdGFyZ2V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlOiBPdXRjb21lVmFyaWFibGUgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSxcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgdHlwZTogJ291dGNvbWUnLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBpbnRlcnBvbGF0aW9uVGFibGU6IHRoaXMuaW50ZXJwb2xhdGlvblRhYmxlLFxuICAgICAgZXh0ZXJuYWxTY29yZWQ6IHRoaXMuZXh0ZXJuYWxTY29yZWRcbiAgICB9O1xuICAgIG91dGNvbWVWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhvdXRjb21lVmFyaWFibGUpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiBvdXRjb21lVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJzogUXRpT3V0Y29tZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwudHJpbSgpKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU1hcHBpbmcgfSBmcm9tICcuLi8uLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZyc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0ge1xuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IHRoaXMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHkgfHwgJ3NpbmdsZScsXG4gICAgICBtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBjYW5kaWRhdGVSZXNwb25zZTogbnVsbFxuICAgIH07XG4gICAgcmVzcG9uc2VWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhyZXNwb25zZVZhcmlhYmxlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiByZXNwb25zZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktY29ycmVjdC1yZXNwb25zZScpO1xuICAgIGlmIChjb3JyZWN0UmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNvcnJlY3RSZXNwb25zZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktdmFsdWUnKTtcbiAgICAgIGlmICh0aGlzLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgICAgIHZhbHVlc1swXS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVzW2ldLnRleHRDb250ZW50KTtcbiAgICAgICAgICB2YWx1ZXNbaV0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigncXRpLW1hcHBpbmcnKSBhcyBRdGlNYXBwaW5nO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic6IFF0aVJlc3BvbnNlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJylcbmV4cG9ydCBjbGFzcyBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8vIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gIC8vICAgc2xvdCB7XG4gIC8vICAgICBkaXNwbGF5OiBoaWRkZW47XG4gIC8vICAgfVxuICAvLyBgO1xuICAvLyBvdmVycmlkZSByZW5kZXIoKSB7XG4gIC8vICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgLy8gfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJzogUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb250ZW50LWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUNvbnRlbnRCb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbnRlbnQtYm9keSc6IFF0aUNvbnRlbnRCb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWJyaWMtYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aVJ1YnJpY0Jsb2NrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBvdmVycmlkZSBpZDsgLy8gPVwicXRpQXNwZWN0SW5ob3VkUnVicmljQmxvY2tcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB1c2U6ICdpbnN0cnVjdGlvbnMnIHwgJ3Njb3JpbmcnIHwgJ25hdmlnYXRpb24nOyAvLyAgPSBcInNjb3JpbmdcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB2aWV3OiAnYXV0aG9yJyB8ICdjYW5kaWRhdGUnIHwgJ3Byb2N0b3InIHwgJ3Njb3JlcicgfCAndGVzdENvbnN0cnVjdG9yJyB8ICd0dXRvcic7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1kaXNjcmV0aW9uYXJ5LXBsYWNlbWVudCc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWlubGluZSc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGJ5IGRlZmF1bHQgcHV0IHRoaXMgaW4gYSBzbG90IGluIHRoZSBpdGVtLWJvZHlcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1YnJpYy1ibG9jayc6IFF0aVJ1YnJpY0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUHJvcGVydHlWYWx1ZU1hcCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2stYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrQmxvY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiZmVlZGJhY2sgJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2hvd0ZlZWRiYWNrKHRoaXMub3V0Y29tZUlkZW50aWZpZXIpO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2stYmxvY2snOiBRdGlGZWVkYmFja0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gb3V0Y29tZUlkZW50aWZpZXIpIHx8IG51bGw7O1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2staW5saW5lJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0lubGluZSBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2staW5saW5lJzogUXRpRmVlZGJhY2tJbmxpbmU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tb2RhbC1mZWVkYmFjaycpXG5leHBvcnQgY2xhc3MgUXRpTW9kYWxGZWVkYmFjayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbW9kYWwtZmVlZGJhY2snOiBRdGlNb2RhbEZlZWRiYWNrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBsZXQgcm93c1NldCA9IGZhbHNlO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcy0nKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICByb3dzU2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJZiBubyBxdGktaGVpZ2h0LWxpbmVzIGNsYXNzIGlzIHNldCwgY2FsY3VsYXRlIHJvd3MgYmFzZWQgb24gZXhwZWN0ZWRMZW5ndGhcbiAgICBpZiAoIXJvd3NTZXQgJiYgdGhpcy5leHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgZXN0aW1hdGVkUm93cyA9IE1hdGguY2VpbCh0aGlzLmV4cGVjdGVkTGVuZ3RoIC8gNTApOyAvLyAgJzUwJyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSBmb3IgY2hhcmFjdGVycyBwZXIgcm93XG4gICAgICB0aGlzLl9yb3dzID0gZXN0aW1hdGVkUm93cztcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpbml0aWFsbHlcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICBjb25zdCBwYXR0ZXJuU291cmNlID1cbiAgICAgICAgdGhpcy5wYXR0ZXJuTWFzay5zdGFydHNXaXRoKCdeJykgJiYgdGhpcy5wYXR0ZXJuTWFzay5lbmRzV2l0aCgnJCcpID8gdGhpcy5wYXR0ZXJuTWFzayA6IGBeJHt0aGlzLnBhdHRlcm5NYXNrfSRgO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuU291cmNlKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCkgJiYgcGF0dGVybi50ZXN0KHRleHRhcmVhLnZhbHVlKTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGV4dGFyZWEucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIkezUwMDB9XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICByb3dzPVwiJHt0aGlzLl9yb3dzfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIElJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7IC8vIEVuYWJsZSBmb3JtIGFzc29jaWF0aW9uXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgX2NvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICB9XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIGFic3RyYWN0IGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgYWJzdHJhY3Qgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICB9XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBpbnB1dFJlZiA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpZiB0aGUgaW5wdXQgaXMgdmFsaWRcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gbWVzc2FnZVxuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTsgLy8gU2V0IGN1c3RvbSBtZXNzYWdlIG9ubHkgaWYgaW52YWxpZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICB0eXBlPVwiJHt0aGlzLnBhdHRlcm5NYXNrID09ICdbMC05XSonID8gJ251bWJlcicgOiAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICAudmFsdWU9XCIke3RoaXMuX3ZhbHVlfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgbWF4bGVuZ3RoPSR7MTAwMH1cbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RSZXNwb25zZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic6IFF0aVRleHRFbnRyeUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMS4xcmVtO1xuICAgIG1pbi13aWR0aDogMS4xcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIuM3JlbTtcbiAgICBtaW4td2lkdGg6IDIuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMykgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzLjNyZW07XG4gICAgbWluLXdpZHRoOiAzLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNC4ycmVtO1xuICAgIG1pbi13aWR0aDogNC4ycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC02KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDYuNnJlbTtcbiAgICBtaW4td2lkdGg6IDYuNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogOHJlbTtcbiAgICBtaW4td2lkdGg6IDhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTE1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEycmVtO1xuICAgIG1pbi13aWR0aDogMTJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDE3cmVtO1xuICAgIG1pbi13aWR0aDogMTdyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTI1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIG1pbi13aWR0aDogMjByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI0cmVtO1xuICAgIG1pbi13aWR0aDogMjRyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTM1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI4cmVtO1xuICAgIG1pbi13aWR0aDogMjhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMycmVtO1xuICAgIG1pbi13aWR0aDogMzJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQ1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDM2cmVtO1xuICAgIG1pbi13aWR0aDogMzZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTUwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQwcmVtO1xuICAgIG1pbi13aWR0aDogNDByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTcyKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDU3cmVtO1xuICAgIG1pbi13aWR0aDogNTdyZW07XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHRJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3R0ZXh0Jykge1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicsICcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgPHNsb3Q+PC9zbG90PmA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJzogUXRpSG90dGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZSAmIHsgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlc0ludGVyZmFjZSBleHRlbmRzIElJbnRlcmFjdGlvbiB7XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcXVlcnkoJyN2YWxpZGF0aW9uTWVzc2FnZScpXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtaW5DaG9pY2VzID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1heENob2ljZXMgPSAxO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfaGFuZGxlTWF4Q2hvaWNlc0NoYW5nZShfb2xkVmFsdWU6IG51bWJlciwgX25ld1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2RldGVybWluZUlucHV0VHlwZSgpO1xuICAgIH1cblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICAgIH07XG5cbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IChjaG9pY2UucmVhZG9ubHkgPSByZWFkb25seSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZS5qb2luKCcsJykgOiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1pbmcgdGhpcy52YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdGhpcy5fdmFsdWUuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGlzLnZhbHVlIGlzIG5vdCBhbiBhcnJheVxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGlmIChyZXNwb25zZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGg7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgdmFsaWRpdHlNZXNzYWdlID0gJyc7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzICE9PSAwICYmIHNlbGVjdGVkQ291bnQgPiB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWF4U2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBjYW4gc2VsZWN0IGF0IG1vc3QgJHt0aGlzLm1heENob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA8IHRoaXMubWluQ2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5taW5TZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0ICR7dGhpcy5taW5DaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoXG4gICAgICAgICAgaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogdHJ1ZSB9LFxuICAgICAgICAgIHZhbGlkaXR5TWVzc2FnZSxcbiAgICAgICAgICBzZWxlY3RlZENob2ljZXNbc2VsZWN0ZWRDb3VudCAtIDFdIHx8IHRoaXMuX2Nob2ljZUVsZW1lbnRzWzBdIHx8IHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX2ludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIGNob2ljZUVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5wdXNoKGNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiBjaG9pY2UgIT09IGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZUlucHV0VHlwZSgpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogQ2hvaWNlKSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuYXJpYUxhYmVsID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvLWdyb3VwJyA6ICdjaGVja2JveC1ncm91cCc7XG5cbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94JztcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnN0YXRlcy5hZGQoY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9Pikge1xuICAgICAgdGhpcy5fdG9nZ2xlQ2hvaWNlQ2hlY2tlZChldmVudC50YXJnZXQgYXMgQ2hvaWNlKTtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICAgIGlmIChjaG9pY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UsIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChjaG9pY2UuaW50ZXJuYWxzPy5zdGF0ZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAndHJ1ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8ICcnIDogc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBjaG9pY2UgZWxlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZSA6IFt0aGlzLl92YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGlzU2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuZXhwb3J0IHR5cGUgT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgdW5kZWZpbmVkO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ2hvaWNlSW50ZXJhY3Rpb25cbiAgZXh0ZW5kcyBWb2NhYnVsYXJ5TWl4aW4oXG4gICAgU2h1ZmZsZU1peGluKENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksICdxdGktc2ltcGxlLWNob2ljZScpLFxuICAgICdxdGktc2ltcGxlLWNob2ljZSdcbiAgKVxuICBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2VcbntcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMucm9sZSA9ICdncm91cCc7XG4gIH1cblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbjtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PjxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBpZD1cInZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlLWludGVyYWN0aW9uJzogUXRpQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgY29uc3QgZml4ZWRFbGVtZW50czogQXJyYXk8eyBlbGVtZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgY29uc3Qgbm9uRml4ZWRFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICAgIC8vIFNlcGFyYXRlIGZpeGVkIGFuZCBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGZpeGVkRWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGNob2ljZSwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vbkZpeGVkRWxlbWVudHMucHVzaChjaG9pY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIDEgb3IgZmV3ZXIgbm9uLWZpeGVkIGVsZW1lbnRzLCB0aHJvdyBhbiBlcnJvciAobm8gc2h1ZmZsZSBwb3NzaWJsZSlcbiAgICAgIGlmIChub25GaXhlZEVsZW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2h1ZmZsaW5nIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGZld2VyIHRoYW4gMiBub24tZml4ZWQgZWxlbWVudHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9yZGVyIGZvciBjb21wYXJpc29uXG4gICAgICBjb25zdCBvcmlnaW5hbE9yZGVyID0gWy4uLm5vbkZpeGVkRWxlbWVudHNdO1xuXG4gICAgICAvLyBTaHVmZmxlIHVudGlsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IG9yIG1heEF0dGVtcHRzIGlzIHJlYWNoZWRcbiAgICAgIHdoaWxlICghaXNTaHVmZmxlZCAmJiBhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIC8vIFNodWZmbGUgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSBub25GaXhlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgW25vbkZpeGVkRWxlbWVudHNbaV0sIG5vbkZpeGVkRWxlbWVudHNbal1dID0gW25vbkZpeGVkRWxlbWVudHNbal0sIG5vbkZpeGVkRWxlbWVudHNbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNodWZmbGVkIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgaXNTaHVmZmxlZCA9ICFub25GaXhlZEVsZW1lbnRzLmV2ZXJ5KChjaG9pY2UsIGluZGV4KSA9PiBjaG9pY2UgPT09IG9yaWdpbmFsT3JkZXJbaW5kZXhdKTtcblxuICAgICAgICBpZiAoaXNTaHVmZmxlZCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTaHVmZmxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzaHVmZmxlIHRoZSBjaG9pY2VzIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gb3JkZXIgdG8gZWFjaCBlbGVtZW50XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldFNodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgJ2luaXRpYWwnKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gJ2luaXRpYWwnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTaHVmZmxlRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFQ7XG59O1xuXG5jb25zdCBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gIGZyb21BdHRyaWJ1dGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSxcbiAgdG9BdHRyaWJ1dGUodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBWb2NhYnVsYXJ5RWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX2NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxzID0gWydxdGktbGFiZWxzLWRlY2ltYWwnLCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScsICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJ107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxTdWZmaXhlcyA9IFsncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJywgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJ10gYXMgTGFiZWxTdWZmaXhUeXBlW107XG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWVcbiAgICB9KVxuICAgIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICB0aGlzLl9jbGFzc2VzID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICAvLyB0aGlzLnJlcXVlc3RVcGRhdGUoJ2NsYXNzJywgb2xkVmFsdWUpO1xuICAgIH1cbiAgICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzPy5qb2luKCcgJykgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKF9jaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NodWZmbGUnKSkge1xuICAgICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRMYWJlbHMoKSB7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5zTGFiZWwgPSB0aGlzLl9jbGFzc2VzLnNvbWUoXG4gICAgICAgIGNscyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoY2xzKSB8fCB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGNscyBhcyBMYWJlbFN1ZmZpeFR5cGUpXG4gICAgICApO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4oK3ZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAoY2xhc3NDb250YWluc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpLm1hcChjID0+IGMgYXMgUXRpU2ltcGxlQ2hvaWNlKTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IGNob2ljZUVsZW1lbnRzXG4gICAgICAgICAgLm1hcCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGVsOiBjaG9pY2UsIG9yZGVyOiBpc051bWJlcihjaG9pY2Uuc3R5bGUub3JkZXIpID8gK2Nob2ljZS5zdHlsZS5vcmRlciA6IGluZGV4ICsgMSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgICAgIC5tYXAoY2hvaWNlID0+IGNob2ljZS5lbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIChjaG9pY2VzW2ldIGFzIFF0aVNpbXBsZUNob2ljZSkubWFya2VyID0gdGhpcy5fZ2V0TGFiZWwoaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldExhYmVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxldCBsYXN0TGFiZWwgPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjKSkucG9wKCkgYXMgTGFiZWxUeXBlO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMgYXMgTGFiZWxTdWZmaXhUeXBlKSkucG9wKCk7XG5cbiAgICAgIGlmICghbGFzdExhYmVsICYmIGxhc3RMYWJlbFN1ZmZpeCkge1xuICAgICAgICAvLyBhIHN1ZmZpeCB3aXRob3V0IGEgbGFiZWwgaXMgc3RyYW5nZSBzbyBhZGQgcXRpLWxhYmVscy11cHBlci1hbHBoYVxuICAgICAgICBsYXN0TGFiZWwgPSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG4gICAgICB9XG4gICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgIHN3aXRjaCAobGFzdExhYmVsKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtZGVjaW1hbCc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtpbmRleH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnKSB7XG4gICAgICAgIGxhYmVsICs9ICcuJztcbiAgICAgIH0gZWxzZSBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnKSB7XG4gICAgICAgIGxhYmVsICs9IGApYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFZvY2FidWxhcnlFbGVtZW50IGFzIENvbnN0cnVjdG9yPFZvY2FidWxhcnlJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBbcGFydD0nc2xvdCddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1xdGktZ2FwLXNpemUpO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuXG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLWNob2ljZSkge1xuICAgIGZsZXg6IDAgMFxuICAgICAgY2FsYygoMTAwJSAtICh2YXIoLS1xdGktZ2FwLXNpemUpICogdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpKSAvIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0xKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMTtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0yKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMykgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDM7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTQpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA0O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy01KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNTtcbiAgfVxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtcHJvY2Vzc2luZycpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGxvZ2ljID0gbmV3IFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yKCk7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICAgIGxvZ2ljLnByb2Nlc3MocnVsZXMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnOiBRdGlPdXRjb21lUHJvY2Vzc2luZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3Ige1xuICBwdWJsaWMgcHJvY2VzcyhydWxlczogUXRpUnVsZUJhc2VbXSkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnQGNpdG9sYWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG4vKipcbiAqIFRoZSBsb29rdXBPdXRjb21lVmFsdWUgcnVsZSBzZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRjb21lIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvYnRhaW5lZFxuICogYnkgbG9va2luZyB1cCB0aGUgdmFsdWUgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbiBpbiB0aGUgbG9va3VwVGFibGUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGUgb3V0Y29tZSdzIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXRpTG9va3VwT3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgZ2V0IGNoaWxkRXhwcmVzc2lvbigpOiBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAob3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZSkge1xuICAgICAgdmFsdWUgPSBvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlLmdldChwYXJzZUludCh0aGlzLmNoaWxkRXhwcmVzc2lvbi5jYWxjdWxhdGUoKSkpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdsb29rdXBPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnLCBRdGlMb29rdXBPdXRjb21lVmFsdWUpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnOiBRdGlMb29rdXBPdXRjb21lVmFsdWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VDb25kaXRpb24gZXh0ZW5kcyBRdGlSdWxlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5jYWxjdWxhdGUoKSkge1xuICAgICAgICAoYnJhbmNoIGFzIHVua25vd24gYXMgUXRpUnVsZSkucHJvY2VzcygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtY29uZGl0aW9uJywgUXRpUmVzcG9uc2VDb25kaXRpb24pO1xuIiwgImltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBvdXRjb21lSWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG5cbiAgICBjb25zdCBydWxlID0gbmV3IFF0aVNldE91dGNvbWVWYWx1ZVJ1bGUoZXhwcmVzc2lvbik7XG4gICAgY29uc3QgdmFsdWUgPSBydWxlLnByb2Nlc3MoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAoKHY6IHN0cmluZykgPT4gY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodikpXG4gICAgICAgICAgICA6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZVJ1bGU8VD4gaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogUXRpRXhwcmVzc2lvbkJhc2U8VD4pIHt9XG5cbiAgcHJvY2VzcygpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uID8gdGhpcy5leHByZXNzaW9uLmNhbGN1bGF0ZSgpIDogbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NldE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXNldC1vdXRjb21lLXZhbHVlJywgUXRpU2V0T3V0Y29tZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBzdWJSdWxlcyA9IHRoaXMuZ2V0U3ViUnVsZXMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJSdWxlID0gc3ViUnVsZXNbaV07XG4gICAgICBzdWJSdWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZScsIFF0aVJlc3BvbnNlRWxzZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBnZXRWYXJpYWJsZXMgPSAoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXSA9PlxuICAgIC8vIEZJWE1FOiBpZiB0aGlzIGl0c2VsZiBpcyBtdWx0aXBsZSwgdGhpcyB3aWxsIG5ldmVyIGVudGVyIHRoZSBxdGktbXVsdGlwbGUgc3dpdGNoXG4gICAgLy8gU2VlIHRoaXMgZXhhbXBsZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vMUVkVGVjaC9xdGktZXhhbXBsZXMvYmxvYi9tYXN0ZXIvcXRpdjMtZXhhbXBsZXMvcGFja2FnaW5nL2l0ZW1zL0V4YW1wbGUwNS1mZWVkYmFja0Jsb2NrLWFkYXB0aXZlLnhtbFxuXG4gICAgQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKVxuICAgICAgLm1hcCgoZTogRWxlbWVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAncXRpLWJhc2UtdmFsdWUnOiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogZS5nZXRBdHRyaWJ1dGUoJ2Jhc2UtdHlwZScpLFxuICAgICAgICAgICAgICB2YWx1ZTogZS50ZXh0Q29udGVudC50cmltKCksXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktdmFyaWFibGUnOiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktbXVsdGlwbGUnOiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IGUgYXMgUXRpTXVsdGlwbGU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtdWx0aXBsZS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiB2YWx1ZXNbMF0uYmFzZVR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlcy5tYXAodiA9PiB2LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ211bHRpcGxlJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktY29ycmVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoZSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgUXRpQW5kIH0gZnJvbSAnLi9xdGktYW5kJztcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWFuZCcsIFF0aUFuZCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFuZCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hbmQnOiBRdGlBbmQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlCYXNlVmFsdWUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlID0gJ3N0cmluZyc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlDb3JyZWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBnZXQgaW50ZXJwcmV0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdpbnRlcnByZXRhdGlvbicpIHx8ICcnO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBSZXNwb25zZSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHIgPT4gci5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpO1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUmVzcG9uc2UgJHt0aGlzLmlkZW50aWZpZXJ9IGNhbiBub3QgYmUgZm91bmRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nID0gcmVzcG9uc2UubWFwcGluZztcbiAgICBjb25zdCBjYW5kaWRhdGVSZXNwb25zZXMgPSAhQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZSkgPyBbcmVzcG9uc2UudmFsdWVdIDogcmVzcG9uc2UudmFsdWU7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVSZXNwb25zZSBvZiBjYW5kaWRhdGVSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gbWFwcGluZy5tYXBFbnRyaWVzLmZpbmQoZW50cnkgPT4ge1xuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGVudHJ5Lm1hcEtleSwgY2FuZGlkYXRlUmVzcG9uc2UsIHJlc3BvbnNlLmJhc2VUeXBlKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEobWFwcGVkVmFsdWUgPT0gbnVsbCB8fCBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZSA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwaW5nLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hcHBpbmcubG93ZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1heChtYXBwaW5nLmxvd2VyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLnVwcGVyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5taW4obWFwcGluZy51cHBlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcC1yZXNwb25zZScsIFF0aU1hcFJlc3BvbnNlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkZWZhdWx0LXZhbHVlJywgdHlwZTogTnVtYmVyIH0pIGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgbG93ZXJCb3VuZDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgcHVibGljIGdldCBtYXBFbnRyaWVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLW1hcC1lbnRyeScpKS5tYXAoZWwgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWFwS2V5OiBlbC5nZXRBdHRyaWJ1dGUoJ21hcC1rZXknKSxcbiAgICAgICAgbWFwcGVkVmFsdWU6ICtlbC5nZXRBdHRyaWJ1dGUoJ21hcHBlZC12YWx1ZScpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcHBpbmcnLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgc3dpdGNoIChjb3JyZWN0VmFsdWVJbmZvLmNhcmRpbmFsaXR5KSB7XG4gICAgICBjYXNlICdzaW5nbGUnOiB7XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8IEFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWU/LnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb3JkZXJlZCc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlW2ldLFxuICAgICAgICAgICAgdmFsdWVUb01hcC52YWx1ZVtpXSxcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdtdWx0aXBsZSc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5zd2VySW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBhcnIgPSBbLi4udmFsdWVUb01hcC52YWx1ZV07XG4gICAgICAgICAgZm9yIChjb25zdCBtdiBvZiBhcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAoYXJyIGFzIHN0cmluZ1tdKS5zcGxpY2UoYXJyLmluZGV4T2YobWF0Y2hpbmdWYWx1ZSksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuc3dlckluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWF0Y2gnLCBRdGlNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWVtYmVyIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuIHwgbnVsbD4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuXG4gICAgaWYgKCEodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3IgdGFrZXMgdHdvIHN1Yi1leHByZXNzaW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IFt2YWx1ZTEsIHZhbHVlMl0gPSB2YWx1ZXM7XG5cbiAgICBpZiAoISh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2hpY2ggbXVzdCBib3RoIGhhdmUgdGhlIHNhbWUgYmFzZS10eXBlJyk7XG4gICAgfVxuICAgIGlmICghKHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykpIHtcbiAgICAgIGNvbnNvbGUud2FybignYW5kIHRoZSBzZWNvbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9yIG9yZGVyZWQgY29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZmxvYXQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3Igc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGZsb2F0Jyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZHVyYXRpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0l0IG11c3Qgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZHVyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBlaXRoZXIgc3ViLWV4cHJlc3Npb24gaXMgTlVMTCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdG9yIGlzIE5VTExcbiAgICBpZiAodmFsdWUxLnZhbHVlID09PSBudWxsIHx8IHZhbHVlMi52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBib29sZWFuIHdpdGggYSB2YWx1ZSBvZiAndHJ1ZScgaWYgdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSBmaXJzdCBzdWItZXhwcmVzc2lvbiBpcyBpbiB0aGUgY29udGFpbmVyIGRlZmluZWQgYnkgdGhlIHNlY29uZCBzdWItZXhwcmVzc2lvbi5cbiAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tZW1iZXInLCBRdGlNZW1iZXIpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlNdWx0aXBsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdtdWx0aXBsZScgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB2YWx1ZXMgPSB2YXJpYWJsZXMubWFwKHYgPT4gdi52YWx1ZSk7XG4gICAgLy8gY29uc29sZS5sb2codmFyaWFibGVzKTtcbiAgICAvLyBjb25zdCBmbGF0dGVuZWRBcnJheSA9IHZhbHVlcy5yZWR1Y2UoKGFjYzogc3RyaW5nW10sIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgIC8vICAgcmV0dXJuIGFjYy5jb25jYXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWUpO1xuICAgIC8vIH0sIFtdKTtcbiAgICAvLyByZXR1cm4gZmxhdHRlbmVkQXJyYXk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW11bHRpcGxlJywgUXRpTXVsdGlwbGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU5vdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ub3QnLCBRdGlOb3QpO1xuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU9yIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICBsZXQgdmFsID0gZmFsc2U7XG4gICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUoZSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yJywgUXRpT3IpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlPcmRlcmVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxSZXNwb25zZVZhcmlhYmxlW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnb3JkZXJlZCcgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG9yZGVyZWQnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yZGVyZWQnLCBRdGlPcmRlcmVkKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJpbnRlZFZhcmlhYmxlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBjb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKSB8fCBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJpbnRlZC12YXJpYWJsZScsIFF0aVByaW50ZWRWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJvZHVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcHJvZHVjdCA9IHZhbHVlcy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2Zsb2F0JyB8fCBjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICogcGFyc2VJbnQoY3VycmVudFZhbHVlLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgY2FuIG5vdCBjb252ZXJ0IHRvIG51bWJlcmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYGhhcyBhbm90aGVyIGJhc2VUeXBlICR7Y3VycmVudFZhbHVlLmJhc2VUeXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIDEpO1xuICAgIHJldHVybiBwcm9kdWN0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByb2R1Y3QnLCBRdGlQcm9kdWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3RyaW5nTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjYXNlLXNlbnNpdGl2ZScgfSkgY2FzZVNlbnNpdGl2ZSA9ICd0cnVlJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgc3RyaW5nLW1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYxID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTEudmFsdWUgOiAodmFsdWUxLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHYyID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTIudmFsdWUgOiAodmFsdWUyLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModjEgYXMgc3RyaW5nLCB2MiBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1zdHJpbmctbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdHJpbmctbWF0Y2gnLCBRdGlTdHJpbmdNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW0gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwcml2YXRlIF9leHByZXNzaW9uOiBRdGlTdW1FeHByZXNzaW9uO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBuZXcgUXRpU3VtRXhwcmVzc2lvbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2V4cHJlc3Npb24uY2FsY3VsYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW1FeHByZXNzaW9uIGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbnM6IFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkge31cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZXhwcmVzc2lvbnMubWFwKGMgPT4ge1xuICAgICAgaWYgKCFjLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gYy5jYWxjdWxhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLXN1bSwgZXhwZWN0ZWQgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN1bScsIFF0aVN1bSk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikudmFsdWVcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXZhcmlhYmxlJywgUXRpVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJTVNwY2ksIE1vZHVsZVJlc29sdXRpb25Db25maWcsIFF0aVZhcmlhYmxlSlNPTiB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZGVjbGFyZSBjb25zdCByZXF1aXJlanM6IGFueTtcbmRlY2xhcmUgY29uc3QgZGVmaW5lOiBhbnk7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIGludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGNpOiBJTVNwY2k8dW5rbm93bj47XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdtb2R1bGUnIH0pXG4gIG1vZHVsZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY3VzdG9tLWludGVyYWN0aW9uLXR5cGUtaWRlbnRpZmllcicgfSlcbiAgY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnZlcnRRdGlWYXJpYWJsZUpTT04oaW5wdXQ6IFF0aVZhcmlhYmxlSlNPTik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBmb3IgKGNvbnN0IHRvcExldmVsS2V5IGluIGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkodG9wTGV2ZWxLZXkpKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE9iamVjdCA9IGlucHV0W3RvcExldmVsS2V5IGFzICdsaXN0JyB8ICdiYXNlJ107XG4gICAgICAgIGlmIChuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZEtleSBpbiBuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QuaGFzT3duUHJvcGVydHkobmVzdGVkS2V5KSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5lc3RlZE9iamVjdFtuZXN0ZWRLZXkgYXMga2V5b2YgdHlwZW9mIG5lc3RlZE9iamVjdF07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoU3RyaW5nKTsgLy8gQ29udmVydCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsgLy8gQ29udmVydCB0aGUgc2luZ2xlIHZhbHVlIHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENoZWNraW5nKCk6IHZvaWQge1xuICAgIC8vIGJlY2F1c2UgdGhlIHBjaSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgdG8gY2hlY2sgZm9yIGNoYW5nZXMgd2UnbGwgdXNlIGFuIGludGVydmFsXG4gICAgLy8gdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBjaGFuZ2VkLiBJZiBjaGFuZ2VkIHdlJ2xsIHNhdmUgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQgIT09IHRoaXMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHN0cmluZ2lmaWVkO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydFF0aVZhcmlhYmxlSlNPTihuZXdSZXNwb25zZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDaGVja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRk9SIE5PV1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gT25seSBzZXQgc3RhdGUgaXMgc3VwcG9ydGVkIGluIGEgUENJXG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuICAgIGlmICh0eXBlID09ICdJTVMnKSB7XG4gICAgICBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwY2kgYXMgYW55KS5pbml0aWFsaXplKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllciwgZG9tLmZpcnN0RWxlbWVudENoaWxkLCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgZGVmaW5lKCdxdGlDdXN0b21JbnRlcmFjdGlvbkNvbnRleHQnLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gdGhlIFRBTyB2ZXJzaW9uICovXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJ1aWxkUmVxdWlyZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKGNvbmZpZyk7XG4gICAgcmVxdWlyZVBDSShbJ3JlcXVpcmUnXSwgcmVxdWlyZSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWR5bmFtaWMtcmVxdWlyZVxuICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgcmVxdWlyZWpzLnVuZGVmKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcik7XG4gICAgLy8gQ2xlYXIgdGhlIG1vZHVsZXMgaW4gdGhlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxdWlyZWpzLnMuY29udGV4dHM7XG4gICAgZGVsZXRlIGNvbnRleHRbdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyXTtcbiAgICB0aGlzLnN0b3BDaGVja2luZygpO1xuICB9XG5cbiAgYnVpbGRSZXF1aXJlQ29uZmlnKCkge1xuICAgIC8vIFNldCBSZXF1aXJlSlMgcGF0aHMgYW5kIHNoaW0gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHdpbmRvd1sncmVxdWlyZVBhdGhzJ10gfHwge30sXG4gICAgICBzaGltOiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10gfHwge31cbiAgICB9O1xuICAgIC8vIENoZWNrIGlmIFJlcXVpcmVKUyBpcyBhdmFpbGFibGUsIGlmIG5vdCwgc2V0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYFJlcXVpcmVKUyBub3QgZm91bmQuIFBsZWFzZSBsb2FkIGl0IHZpYSBDRE46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG5cbiAgICBpZiAoaW50ZXJhY3Rpb25Nb2R1bGVzKSB7XG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG5cbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlQYXRoKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwYXRocyB1c2luZyBSZXF1aXJlSlMncyBmYWxsYmFjayBhcnJheVxuICAgICAgICAgIGNvbnN0IHBhdGhzID0gZmFsbGJhY2tQYXRoXG4gICAgICAgICAgICA/IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gY29uZmlnLnBhdGhzW21vZHVsZUlkXSB8fCBbXTtcbiAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhleGlzdGluZ1BhdGgsIHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhwYXRoMTogc3RyaW5nIHwgc3RyaW5nW10sIHBhdGgyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhdGgxQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgxKSA/IHBhdGgxIDogW3BhdGgxXTtcbiAgICBjb25zdCBwYXRoMkFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMikgPyBwYXRoMiA6IFtwYXRoMl07XG4gICAgcmV0dXJuIHBhdGgxQXJyYXkuY29uY2F0KHBhdGgyQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICAgIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbiAgfVxuXG4gIGxvYWRDb25maWcgPSBhc3luYyAodXJsOiBzdHJpbmcsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZHVsZVJlc29sdXRpb25Db25maWc+ID0+IHtcbiAgICB1cmwgPSB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXModXJsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWlyZUNvbmZpZyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAocmVxdWlyZUNvbmZpZy5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXF1aXJlQ29uZmlnLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlQ29uZyA9IGNvbmZpZyBhcyBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIGluIG1vZHVsZUNvbmcucGF0aHMpIHtcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmdldFJlc29sdmFibGVQYXRoKG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdLCBiYXNlVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aFN0cmluZyA9IChwYXRoOiBzdHJpbmcsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aCA9IChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgPyBwYXRoLm1hcChwID0+IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocCwgYmFzZVBhdGgpKVxuICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHBhdGgsIGJhc2VQYXRoKTtcbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdID0gW107XG5cbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG4gIC8vIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcjogKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlciA9IHRoaXMuX3JlZ2lzdGVyQ2hvaWNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGNvbnN0IGNob2ljZSA9IGV2ZW50LnRhcmdldCBhcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICAgIHRoaXMuX2NoaWxkcmVuTWFwLnB1c2goY2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiZHJvcC1jb250YWluZXJcIj5cbiAgICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIHRvdWNoU3RhcnRQb2ludCA9IG51bGw7IC8vIFBvaW50IG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIGxhc3RDbGlja1RpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIGNsaWNrXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWdnYWJsZSBlbGVtZW50IGlzIGFjdGl2ZVxuICBwcml2YXRlIGRyYWdTb3VyY2U6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVGhlIHNvdXJjZSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcbiAgcHJpdmF0ZSBkcmFnQ2xvbmU6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gQ2xvbmUgb2YgZHJhZyBzb3VyY2UgZm9yIHZpc3VhbCBmZWVkYmFja1xuICBwcml2YXRlIHRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7IC8vIEZsYWcgZm9yIHRvdWNoRW5kIGV2ZW50XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZyBvcGVyYXRpb24gaXMgb25nb2luZ1xuICBwcml2YXRlIGluaXRpYWxUcmFuc2Zvcm0gPSAnJzsgLy8gT3JpZ2luYWwgdHJhbnNmb3JtIHN0eWxlXG4gIHByaXZhdGUgaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlOyAvLyBGbGFnIHRvIGVuc3VyZSBkcmFnc3RhcnQgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbmNlXG4gIHByaXZhdGUgcm9vdE5vZGU6IE5vZGUgPSBudWxsOyAvLyBSb290IG5vZGUgZm9yIGJvdW5kYXJ5IGNhbGN1bGF0aW9uc1xuXG4gIHByaXZhdGUgZm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBmb2N1c2FibGVEcm9wWm9uZXM6IEhUTUxFbGVtZW50W10gPSBbXTsgLy8gQWxsIGRyb3B6b25lcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICBwcml2YXRlIGN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIEluZGV4IGZvciB0YWJiaW5nIHRocm91Z2ggZHJvcCB6b25lc1xuXG4gIHByaXZhdGUgZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBjbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNsb25lXG5cbiAgcHJpdmF0ZSBsYXN0VGFyZ2V0ID0gbnVsbDsgLy8gTGFzdCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFRhcmdldCA9IG51bGw7IC8vIEN1cnJlbnQgZHJvcHBhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBhbGxvd0NsaWNrID0gdHJ1ZTsgLy8gRmxhZyB0byBhbGxvdyBvciBwcmV2ZW50IGNsaWNrXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUgPSB0cnVlO1xuICBkcmFnT25DbGlja0VuYWJsZWQgPSBmYWxzZTtcbiAgdXNlRHJhZ0Nsb25lID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHRvIGRyYWcgd2l0aCBhIGNsb25lOyBzZXQgdG8gZmFsc2UgdG8gZHJhZyB0aGUgb3JpZ2luYWwgZWxlbWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0RSQUdfRElTVEFOQ0UgPSA1OyAvLyBNaW5pbXVtIHBpeGVsIG1vdmVtZW50IHRvIHN0YXJ0IGRyYWdnaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19DTE9ORV9PUEFDSVRZID0gMTsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjbG9uZSBlbGVtZW50XG4gIGluaXRpYWxUcmFuc2l0aW9uOiBzdHJpbmc7XG4gIC8vIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5VXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYWRkRHJvcHBhYmxlRWxlbWVudHMoZHJvcHBhYmxlczogRWxlbWVudFtdKSB7XG4gIC8vICAgLy8gdGhpcy5kcm9wcGFibGVzID0gZHJvcHBhYmxlcztcbiAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goZWwgPT4ge1xuICAvLyAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IHsgeCwgeSB9O1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgcm9vdCBub2RlXG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2tFbmFibGVkKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIFNhdmUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm07XG5cbiAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSBjb21wdXRlZFN0eWxlLnRyYW5zaXRpb24gfHwgJyc7XG5cbiAgICAgIC8vIERpc2FibGUgdHJhbnNpdGlvbnNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY2xvbmUgb2Zmc2V0XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC54ID0geCAtIHJlY3QubGVmdDtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHkgLSByZWN0LnRvcDtcblxuICAgICAgLy8gU2V0IGhpZ2hlciB6LWluZGV4IHRvIGJyaW5nIGl0IG9uIHRvcFxuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICc5OTk5JztcbiAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgdGhpcy5kcmFnU291cmNlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlICYmIHRoaXMuZHJhZ1NvdXJjZSkge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgICBjb25zdCBjdXJyZW50VG91Y2ggPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKGN1cnJlbnRUb3VjaCkgPj0gdGhpcy5NSU5fRFJBR19ESVNUQU5DRSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2g6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNvZGUgZm9yIGNyZWF0aW5nIGFuZCBoYW5kbGluZyB0aGUgZHJhZyBjbG9uZVxuICAgICAgaWYgKCF0aGlzLmRyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9IHRoaXMuRFJBR19DTE9ORV9PUEFDSVRZLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lID0gdGhpcy5kcmFnU291cmNlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRm9yRHJhZ0Nsb25lKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgY29tcHV0ZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdGhlIGRyYWcgY2xvbmUgdG8gdGhlIHJvb3Qgbm9kZVxuICAgICAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGhvc3Qgb2YgdGhlIHNoYWRvdyByb290XG4gICAgICAgICAgdGhpcy5yb290Tm9kZS5ob3N0LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLnNldERyYWdDbG9uZVN0eWxlcyhjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGRyYWdnaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIENTUyB0cmFuc2Zvcm1zXG4gICAgICBpZiAodGhpcy50b3VjaFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50VG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50Lnk7XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgICAvLyBjb25zdCB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7Ym91bmRlZERlbHRhWH1weCwgJHtib3VuZGVkRGVsdGFZfXB4KWA7XG5cbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wVGFyZ2V0ID0gdGhpcy5maW5kRHJvcFRhcmdldChlKTtcblxuICAgIGlmIChkcm9wVGFyZ2V0ICE9PSB0aGlzLmxhc3RUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICB0aGlzLmxhc3RUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgbGV0IGRyb3BGb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2Ryb3BGb3VuZCcsIGRyb3BGb3VuZCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgZHJvcEZvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgZHJhZ0VuZEV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHsgZHJvcEVmZmVjdDogJ25vbmUnIH07XG4gICAgICB0aGlzLmRyYWdTb3VyY2U/LmRpc3BhdGNoRXZlbnQoZHJhZ0VuZEV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0KGV2ZW50KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGRvY3VtZW50LCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldEF0UG9pbnQocm9vdDogRG9jdW1lbnRPclNoYWRvd1Jvb3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXB0aDogbnVtYmVyID0gMCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBMaW1pdCB0aGUgcmVjdXJzaW9uIGRlcHRoXG4gICAgY29uc3QgTUFYX0RFUFRIID0gMjtcbiAgICBpZiAoZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3Igd2l0aCAnZHJvcHpvbmUnIGF0dHJpYnV0ZVxuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIFNoYWRvdyBET00gYW5kIGRlcHRoIGxpbWl0IG5vdCByZWFjaGVkLCB0cmF2ZXJzZSBpdFxuICAgIGlmIChlbGVtZW50LnNoYWRvd1Jvb3QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHtcbiAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGVsZW1lbnQuc2hhZG93Um9vdCwgeCwgeSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChzaGFkb3dFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBzaGFkb3dFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWRFbGVtZW50KSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiAhdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlID0gdGhpcy5mb2N1c2VkRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZHJvcCB6b25lcyBmb3IgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLmNvbGxlY3REcm9wWm9uZXMoKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gVGFiIGtleSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGRyb3Agem9uZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVUb05leHREcm9wWm9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJyAnICYmIHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIGFnYWluIHRvIGRyb3AgdGhlIGVsZW1lbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIHRoaXMucmVzZXREcmFnU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RHJvcFpvbmVzKCkge1xuICAgIC8vIENvbGxlY3QgYWxsIGVsZW1lbnRzIHdpdGggZHJvcHpvbmUgYXR0cmlidXRlXG4gICAgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcm9wem9uZV0nKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8gQXJyYXkuZnJvbSh0aGlzLmRyb3BwYWJsZXMpO1xuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gUmVzZXQgbmF2aWdhdGlvbiBpbmRleFxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9OZXh0RHJvcFpvbmUoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGluZGV4IGZvciB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gKHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggKyAxKSAlIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aDtcblxuICAgIC8vIEZvY3VzIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIGNvbnN0IG5leHREcm9wWm9uZSA9IHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzW3RoaXMuY3VycmVudERyb3Bab25lSW5kZXhdO1xuICAgIG5leHREcm9wWm9uZS5mb2N1cygpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZHJvcCB0YXJnZXRcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbmV4dERyb3Bab25lO1xuXG4gICAgLy8gRGlzcGF0Y2ggZHJhZ2VudGVyIGV2ZW50XG4gICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KG5leHREcm9wWm9uZSwgJ2RyYWdlbnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50LCBwYWdlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyB0b3VjaC5wYWdlWCA6IHRvdWNoLmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gdG91Y2gucGFnZVkgOiB0b3VjaC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5jbG9uZU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIH1cblxuICBwcml2YXRlIHNldERyYWdDbG9uZVN0eWxlcyh0b3VjaCkge1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHt0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7dG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueH1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgfHwgIXRoaXMuZHJhZ0Nsb25lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0xlZnQgPSB0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54O1xuICAgICAgY29uc3QgbmV3VG9wID0gdG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueTtcblxuICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgY29uc3QgeyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH0gPSB0aGlzLmFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0LCBuZXdUb3AsIHRoaXMuZHJhZ0Nsb25lKTtcblxuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke2JvdW5kZWRMZWZ0fXB4YDtcbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke2JvdW5kZWRUb3B9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvdGVudGlhbCBuZXcgcG9zaXRpb25cbiAgICBjb25zdCBuZXdMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBlbGVtZW50UmVjdC50b3AgKyBkZWx0YVk7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3IHBvc2l0aW9uIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kZWQgZGVsdGEgdmFsdWVzXG4gICAgY29uc3QgYm91bmRlZERlbHRhWCA9IGJvdW5kZWRMZWZ0IC0gZWxlbWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBib3VuZGVkRGVsdGFZID0gYm91bmRlZFRvcCAtIGVsZW1lbnRSZWN0LnRvcDtcblxuICAgIHJldHVybiB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQ6IG51bWJlciwgbmV3VG9wOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gTGltaXQgdGhlIG5ld0xlZnQgYW5kIG5ld1RvcCB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEcmFnRGlzdGFuY2UodG91Y2gpOiBudW1iZXIge1xuICAgIGNvbnN0IHhEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50LngpO1xuICAgIGNvbnN0IHlEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50LnkpO1xuICAgIHJldHVybiB4RGlzdCArIHlEaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEN1c3RvbUV2ZW50KGVsZW1lbnQsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5kYXRhVHJhbnNmZXI7XG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmU/LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdHlsZXNcbiAgICAgICAgaWYgKCFkcm9wRm91bmQpIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5pbml0aWFsVHJhbnNpdGlvbjtcblxuICAgICAgICAvLyBSZXNldCB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBwcm9wZXJ0eVxuICAgICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdDbG9uZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLmxhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuYWxsb3dDbGljayA9IHRydWU7XG4gICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gJyc7XG4gICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBEcm9wcGFibGVzSW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBEcm9wcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIHVzZVNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJvcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZXMgPSB0aGlzLmdldERyb3BwYWJsZUVsZW1lbnRzKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk7XG4gICAgICBkcm9wcGFibGVzLmZvckVhY2goZHJvcHBhYmxlID0+IHtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREcm9wcGFibGVFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3QgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ292ZXJIYW5kbGVyID0gdGhpcy5kcmFnb3ZlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2xlYXZlSGFuZGxlciA9IHRoaXMuZHJhZ2xlYXZlSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnZW50ZXJIYW5kbGVyID0gdGhpcy5kcmFnZW50ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyb3BIYW5kbGVyID0gdGhpcy5kcm9wSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYXR0cmlidXRlTmFtZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJvcHBhYmxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gZHJvcHBhYmxlLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdlbnRlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdvdmVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZHJvcEhhbmRsZXIoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMuZmluZERyYWdnYWJsZShpZGVudGlmaWVyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChkcmFnZ2FibGUgJiYgIXRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKSB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGUsIGRyb3BwYWJsZSk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcmFnZ2FibGUoaWRlbnRpZmllcjogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgIGlmICghaWRlbnRpZmllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYCkgfHwgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkRHJvcChkcm9wcGFibGU6IEhUTUxFbGVtZW50LCBkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgIT09IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcblxuICAgICAgICAvLyBjaGVja01heEFzc29jaWF0aW9ucyBhbmQgc2F2ZVJlc3BvbnNlIGFyZSBkZWZpbmVkL292ZXJyaWRkZW4gaW4gYSBtaXhpblxuICAgICAgICB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgICAgIHRoaXNbJ3NhdmVSZXNwb25zZSddKG51bGwpOyAvL1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcblxuICAgICAgLy8gdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdsZWF2ZUhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJvcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RHJvcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBUSElTIElTIEEgTUlYSU4sIFRISVMgSVMgQSBNSVhJTlxuLy8gVVNFIExJS0UgVEhJU1xuLy8gYGBgY2xhc3MgRHJvcExpc3QgZXh0ZW5kcyBGbGlwcGFibGVzKExpdEVsZW1lbnQpIHtgYGBcbi8vIG1peGluIHdoaWNoIGFuaW1hdGVzIGNoaWxkcmVuIHdpdGggRkxJUFxuLy8gYSBjb21iaW5hdGlvbiBiZXR3ZWVuIHRoaXMgZGlyZWN0aXZlOlxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbi8vIGFuZCBhIHR1dG9yaWFsIGhvdyB0byBtYWtlIGEgbWl4aW5cbi8vIGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvc2l0aW9uL21peGlucy9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc1NlbDogc3RyaW5nLFxuICBkcmFnZ2FibGVzU2VsOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBGbGlwcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8vIHByaXZhdGUgc3RhdGUgPSBuZXcgTWFwPEVsZW1lbnQsIGFueT4oKTtcbiAgICAvLyBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIC8vIGZsaXBwYWJsZXNTZWxlY3Rvcjogc3RyaW5nO1xuICAgIC8vIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7IC8vIHBrOiB0aGlzIGlzIHRoZSBrZXkgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcHJvcG9ydGlvbnNcbiAgICAvLyAgIGNvbnN0IGRyYWdnYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcmFnZ2FibGVzU2VsKSk7XG4gICAgLy8gICBkcmFnZ2FibGVzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hbmltYXRlTWUpO1xuICAgIC8vICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcmFnZ2FibGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAvLyB9XG4gICAgLy8gcHJpdmF0ZSBhbmltYXRlTWUgPSAoKSA9PiB7XG4gICAgLy8gICB0aGlzLnN0YXRlLmZvckVhY2goKHZhbHVlLCBlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICBpZiAodGhpcy5zdGF0ZS5nZXQoZWxlbSkgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zdGF0ZS5nZXQoZWxlbSk7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWCA9IGNhY2hlLmxlZnQgLSBsZWZ0O1xuICAgIC8vICAgICBjb25zdCBkZWx0YVkgPSBjYWNoZS50b3AgLSB0b3A7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhVyA9IGNhY2hlLndpZHRoIC8gd2lkdGg7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhSCA9IGNhY2hlLmhlaWdodCAvIGhlaWdodDtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIGNvbnN0IHsgZHVyYXRpb24sIGVhc2luZyB9ID0geyBkdXJhdGlvbjogMzUwLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoMC4yNiwgMC44NiwgMC40NCwgMC45ODUpJyB9O1xuICAgIC8vICAgICBlbGVtLmFuaW1hdGUoXG4gICAgLy8gICAgICAgW1xuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogYFxuICAgIC8vIHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpXG4gICAgLy8gc2NhbGUoJHtkZWx0YVd9LCAke2RlbHRhSH0pXG4gICAgLy8gYCxcbiAgICAvLyAgICAgICAgICAgLy8gd2lkdGg6IGNhY2hlLndpZHRoLFxuICAgIC8vICAgICAgICAgICAvLyBoZWlnaHQ6IGNhY2hlLmhlaWdodCsgJ3B4JyxcbiAgICAvLyAgICAgICAgICAgLy8gb3BhY2l0eTogY2FjaGUub3BhY2l0eSxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgZHVyYXRpb24sXG4gICAgLy8gICAgICAgICBlYXNpbmcsXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfTtcbiAgICAvLyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyB9XG4gIH1cbiAgcmV0dXJuIEZsaXBwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPEZsaXBwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcHBhYmxlc01peGluIH0gZnJvbSAnLi9kcm9wcGFibGVzLW1peGluJztcbmltcG9ydCB7IEZsaXBwYWJsZXNNaXhpbiB9IGZyb20gJy4vZmxpcHBhYmxlcy1taXhpbic7XG5cbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgbGl2ZVF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9saXZlLXF1ZXJ5JztcbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmludGVyZmFjZSBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuO1xuICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiBib29sZWFuO1xuICBkcmFnT25DbGljazogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzOiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlcywgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgeyBwYXJlbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIEBsaXZlUXVlcnkoZHJhZ2dhYmxlc1NlbGVjdG9yKVxuICAgIGhhbmRsZURyYWdnYWJsZXNDaGFuZ2UoZHJhZ3NBZGRlZDogSFRNTEVsZW1lbnRbXSwgZHJhZ3NSZW1vdmVkOiBFbGVtZW50W10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5ld0RyYWdnYWJsZXMgPSB0aGlzLmZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnc0FkZGVkKTtcblxuICAgICAgaWYgKG5ld0RyYWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmFkZE5ld0RyYWdnYWJsZXMobmV3RHJhZ2dhYmxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcm9wcGFibGVzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJhZ0Ryb3BBcGkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcmFnRHJvcEFwaSgpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQ+KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlcy5maWx0ZXIoZCA9PiAhdGhpcy5kcmFnZ2FibGVzLmhhcyhkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGROZXdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlcyk7XG4gICAgICBkcmFnZ2FibGVzLmZvckVhY2goZHJhZ2dhYmxlID0+IHRoaXMuc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9yZURyYWdnYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20oZHJhZ2dhYmxlLnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZHJhZ2dhYmxlKTtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5zZXQoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHBhcmVudDogZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQsXG4gICAgICAgIGluZGV4XG4gICAgICB9KTtcbiAgICAgIGRyYWdnYWJsZS5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBgZHJhZy0ke2luZGV4fS0ke3RoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgZHJhZ2dhYmxlLnNldEF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlc1xuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnU3RhcnQgPSAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnRW5kID0gYXN5bmMgKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIGNvbnN0IHdhc0Ryb3BwZWQgPSBhd2FpdCB0aGlzLndhc0Ryb3BwZWQoZXYpO1xuICAgICAgaWYgKCF3YXNEcm9wcGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uZHJhZ0NhbkJlUGxhY2VkQmFjaykge1xuICAgICAgICAgIHRoaXMucmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnNldEF0dHJpYnV0ZSgnZW5hYmxlZCcsICcnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5yZW1vdmVBdHRyaWJ1dGUoJ2VuYWJsZWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTUg6IFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoaXMgY2FuIGJlIHRlc3RlZC5cbiAgICAvLyBiZWNhdXNlIEkgY2FuJ3QgZ2V0IHRoZSBkcm9wRWZmZWN0IHRvIGJlICdtb3ZlJyBpbiB0aGUgdGVzdFxuICAgIHByaXZhdGUgY2hlY2tGb3JNb3ZlVGVzdEl0ZW0gPSAoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgaWYgKCFldi5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGxldCBoYXNNb3ZlVGVzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRhdGFUcmFuc2ZlciBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oZXYuZGF0YVRyYW5zZmVyLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IGl0ZW1zLmxlbmd0aDtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMsIHJlc29sdmUgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdzdHJpbmcnICYmIGl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpdGVtLmdldEFzU3RyaW5nKGRhdGEgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gJ21vdmUtdGVzdCcpIHtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlVGVzdEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBwcm9jZXNzaW5nIGFsbCBpdGVtc1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIG5vdCAnc3RyaW5nJywgc3RpbGwgY291bnQgZG93biBwZW5kaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGFzeW5jIHdhc0Ryb3BwZWQoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgaGFzTW92ZVRlc3RJdGVtID0gYXdhaXQgdGhpcy5jaGVja0Zvck1vdmVUZXN0SXRlbShldik7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgIT09ICdub25lJyB8fCBoYXNNb3ZlVGVzdEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXNNb3ZlZChldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09ICdtb3ZlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgeyBwYXJlbnQsIGluZGV4IH0gPSB0aGlzLmRyYWdnYWJsZXMuZ2V0KGRyYWdnYWJsZSk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRyYW5zaXRpb24uZmluaXNoZWQudGhlbigoKSA9PiB7XG4gICAgICAvLyAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4TWF0Y2ggPSArKGQuZ2V0QXR0cmlidXRlKCdtYXRjaC1tYXgnKSB8fCAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEFzc29jaWF0aW9ucyA9IGQucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJykubGVuZ3RoO1xuICAgICAgICBjb25zdCBkaXNhYmxlRHJvcHBhYmxlID0gY3VycmVudEFzc29jaWF0aW9ucyA+PSBtYXhNYXRjaDtcbiAgICAgICAgaWYgKGRpc2FibGVEcm9wcGFibGUpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICB2YWx1ZT8uZm9yRWFjaChlbnRyeSA9PiB0aGlzLnBsYWNlUmVzcG9uc2UoZW50cnkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYWNlUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IHRoaXMuZmluZERyb3BwYWJsZUJ5SWQoZHJvcElkKTtcbiAgICAgIGRyYWdJZHMuZm9yRWFjaChkcmFnSWQgPT4gdGhpcy5wbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZCwgZHJvcHBhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJvcHBhYmxlQnlJZChpZGVudGlmaWVyOiBzdHJpbmcpOiBFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQ6IHN0cmluZywgZHJvcHBhYmxlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICBpZiAoIWRyb3BwYWJsZSB8fCAhZHJhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBmaW5kIGRyYWdnYWJsZSBvciBkcm9wcGFibGUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjogJHtkcmFnSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHZhbGlkQXNzb2NpYXRpb25zID0gdGhpcy5nZXRWYWxpZEFzc29jaWF0aW9ucygpO1xuICAgICAgcmV0dXJuIHRoaXMubWluQXNzb2NpYXRpb25zIDw9IDAgfHwgdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gdmFsaWRBc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZEFzc29jaWF0aW9ucygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maWx0ZXIoZCA9PiBkLmNoaWxkRWxlbWVudENvdW50ID4gMCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZXNwb25zZURhdGEoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRyb3BwYWJsZXNcbiAgICAgICAgLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZXNJbkRyb3BwYWJsZSA9IGRyb3BwYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKTtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ2dhYmxlc0luRHJvcHBhYmxlKS5tYXAoZCA9PiBkLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgICAgICBjb25zdCBkcm9wcGFibGVJZGVudGlmaWVyID0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICAgIHJldHVybiBpZGVudGlmaWVycy5tYXAoaWQgPT4gYCR7aWR9ICR7ZHJvcHBhYmxlSWRlbnRpZmllcn1gKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXQoKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICByZXNldChzYXZlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIGlmIChzYXZlKSB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXREcm9wcGFibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICIvLyBAd2F0Y2ggZGVjb3JhdG9yXG4vL1xuLy8gUnVucyB3aGVuIGFuIG9ic2VydmVkIHByb3BlcnR5IGNoYW5nZXMsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuXG4vL1xuLy8gVG8gd2FpdCBmb3IgYW4gdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnRcbi8vIHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgQHdhdGNoKCdwcm9wTmFtZScpXG4vLyAgaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbi8vICAgIC4uLlxuLy8gIH1cblxuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpdmVRdWVyeShxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBMaXZlUXVlcnlPcHRpb25zKSB7XG4gIGxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxMaXZlUXVlcnlPcHRpb25zPiA9IHtcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3RlZENhbGxiYWNrLCBkaXNjb25uZWN0ZWRDYWxsYmFjayB9ID0gcHJvdG87XG5cbiAgICBwcm90by5jb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGNvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb1dhdGNoID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikpO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBhZGRlZE5vZGVzLmZpbmQobiA9PiBlbGVtZW50c1RvV2F0Y2guaW5jbHVkZXMobikpKSB7XG4gICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzQWRkZWQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikgPz8gW107XG4gICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoQXJyYXkuZnJvbShlbGVtZW50c0FkZGVkKSwgW10pO1xuICAgIH07XG5cbiAgICBwcm90by5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gIH1cbiAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogMC41cmVtO1xuICB9XG5cbiAgOmhvc3Q6OnBhcnQoYXNzb2NpYWJsZXMtY29udGFpbmVyKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMTgwZGVnLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlIC0gMXB4KSxcbiAgICAgIHZhcigtLXF0aS1ib3JkZXItY29sb3ItZ3JheSkgY2FsYyg1MCUpLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlICsgMXB4KVxuICAgICk7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZURvdWJsZVNsYXNoZXMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC91dGlscyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gVGhpcyBjdXN0b20taW50ZXJhY3Rpb24gc3VwcG9ydCB0aGUgQ0VTIEFQSSB3aGljaCBpcyB1c2UgaW4gRkFDRVRcbiAgLy9cbiAgLy8gSXQgd29ya3MgbGlrZSB0aGlzOlxuICAvLyAxLiBUaGUgQ0kgbWFuaWZlc3QgaXMgZmV0Y2hlZFxuICAvLyAyLiBBbiBpZnJhbWUgaXMgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IHN0eWxlIGFuZCBmaXJzdCBzY3JpcHQgZnJvbSB0aGUgbWFuaWZlc3QgYXJlIGxvYWRlZFxuICAvLyAzLiBUaGUgZmlyc3Qgc2NyaXB0IGlzIGJvb3RzdHJhcC5qcyB3aGljaCBhbHNvIGNyZWF0ZXMgYW4gaWZyYW1lIGFuZCBsb2FkcyB0aGUgZmlyc3QgbWVkaWEgZnJvbSB0aGUgbWFuaWZlc3RcbiAgLy8gNC4gQ29tbXVuaWNhdGlvbiBpcyBkb25lIHZpYSB0aGUgQ0VTIEFQSSBidXQgYmVjYXVzZSB0aGUgaWZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIENFUyBvYmplY3Qgd2UgbmVlZCB0byB1c2Ugd2luZG93LnBvc3RNZXNzYWdlXG5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGNoYW5nZSB0aGUgcGFja2FnZSBieSByZXBsYWNpbmcgdGhlIGJvb3RzdHJhcC5qcyB3aXRoIG91ciBvd24gYW5kIGluamVjdCBhIHByb3h5IENFUyBBUEkgdGhhdCBjb21tdW5pY2F0ZXMgdmlhIHBvc3RNZXNzYWdlXG4gIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIHJ1biB0aGlzIGluIHN0b3J5Ym9vaywgd2UgY2Fubm90IHVzZSB3aW5kb3cudG9wIGJlY2F1c2UgdG8gc2VuZCBtZXNzYWdlcyB0aGVyZSwgYmVjYXVzZSBpbiBjYXNlIG9mIHN0b3J5Ym9vayB0aGF0IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgLy8gU28gd2Ugc2VuZCBtZXNzYWdlcyB0byBhbGwgcGFyZW50IHdpbmRvd3NcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSA9IHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YScgfSlcbiAgZGF0YTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLWl0ZW0nIH0pXG4gIGJhc2VJdGVtVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtcmVmJyB9KVxuICBiYXNlUmVmVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdpZCcgfSlcbiAgaWQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgaWZyYW1lRG9jLm9wZW4oKTtcbiAgICBpZnJhbWVEb2Mud3JpdGUoYFxuICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgIDxsaW5rIGhyZWY9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zdHlsZVswXX1gKX0nIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuICAgICAgICAgIDxzY3JpcHQgc3JjPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc2NyaXB0WzBdfWApfSc+PC9zY3JpcHQ+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHk+PC9ib2R5PlxuICAgICAgPC9odG1sPlxuICAgICAgYCk7XG5cbiAgICBpZnJhbWVEb2MuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SUZyYW1lcygpIHtcbiAgICBjb25zdCBpZnJhbWVzSW5TaGFkb3dSb290ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjb25zdCBvdXRlcklGcmFtZXMgPSBbLi4uaWZyYW1lc0luU2hhZG93Um9vdCwgLi4uaWZyYW1lXTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBvdXRlcklGcmFtZXMpIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRlckRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKG91dGVyRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhvdXRlckRvYywgb3V0ZXJJRnJhbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBnZXQgb25seSB1bmlxdWUgaWZyYW1lc1xuICAgIG91dGVySUZyYW1lcy5mb3JFYWNoKChpZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAob3V0ZXJJRnJhbWVzLmluZGV4T2YoaWZyYW1lKSAhPT0gaW5kZXgpIHtcbiAgICAgICAgb3V0ZXJJRnJhbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dGVySUZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5uZXJJRnJhbWVzKGlmcmFtZURvY3VtZW50OiBEb2N1bWVudCwgaWZyYW1lcyA9IFtdKSB7XG4gICAgLy8gR2V0IGFsbCBpZnJhbWVzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgY29uc3QgY3VycmVudElmcmFtZXMgPSBpZnJhbWVEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGN1cnJlbnRJZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBpZnJhbWUgdG8gdGhlIGxpc3RcbiAgICAgIGlmcmFtZXMucHVzaChpZnJhbWUpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBnZXQgaWZyYW1lcyB3aXRoaW4gdGhlIGN1cnJlbnQgaWZyYW1lXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWZyYW1lIHNyYyBpcyBmcm9tIHRoZSBzYW1lIG9yaWdpblxuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuXG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhuZXN0ZWREb2MsIGlmcmFtZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBjcm9zcy1vcmlnaW4gaWZyYW1lOicsIGlmcmFtZVNyYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRvV2luZG93QW5kSWZyYW1lcyh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICBjb25zdCBpZnJhbWVzID0gdGhpcy5nZXRJRnJhbWVzKCk7XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2YgaWZyYW1lcykge1xuICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBvc3RNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzZXRSZXNwb25zZSc6XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnZXRSZXNwb25zZSc6IHtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdyZXNwb25zZURhdGEnLCB0aGlzLnJhd1Jlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgY29uc3QgbWVkaWFEYXRhID0gdGhpcy5tYW5pZmVzdC5tZWRpYS5tYXAobWVkaWEgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IG1lZGlhIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VSZWZVcmwgKyAnLycgKyBtZWRpYSk7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygnbWVkaWFEYXRhJywgbWVkaWFEYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzZXRTdGFnZUhlaWdodCc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRTdGFnZUhlaWdodCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2UgIT09ICcnO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxpZnJhbWVcbiAgICAgICAgd2lkdGg9JHt0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKX1cbiAgICAgICAgaGVpZ2h0PSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpfVxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICB0aXRsZT1cInBjaUNvbnRhaW5lclwiXG4gICAgICAgIGlkPVwicGNpQ29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgIDwvaWZyYW1lPlxuICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLWludGVyYWN0aW9uJzogUXRpQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY291bnQtYXR0ZW1wdCcgfSlcbiAgcHVibGljIGNvdW50QXR0ZW1wdDogc3RyaW5nID0gJ3RydWUnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgdGl0bGU6ICdlbmQgYXR0ZW1wdCc7XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGJ1dHRvbiA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfSBwYXJ0PVwiYnV0dG9uXCIgQGNsaWNrPSR7dGhpcy5lbmRBdHRlbXB0fT4ke3RoaXMudGl0bGV9PC9idXR0b24+YDtcbiAgfVxuICBwdWJsaWMgZW5kQXR0ZW1wdChlOiBFdmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZW5kLWF0dGVtcHQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0OiB0aGlzLmNvdW50QXR0ZW1wdCA9PT0gJ3RydWUnIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nOiBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCAncXRpLWdhcC10ZXh0JywgZmFsc2UsICdxdGktZ2FwJykge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgLyogW3BhcnQ9J2Ryb3BzJ10gLCAqL1xuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD48c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PiA8c2xvdCBwYXJ0PVwiZHJvcHNcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgbGV0IG1hdGNoZXM6IHsgdGV4dDogc3RyaW5nOyBnYXA6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCByZXNwb25zZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtYXRjaGVzID0gcmVzcG9uc2UubWFwKHggPT4ge1xuICAgICAgICBjb25zdCBzcGxpdCA9IHguc3BsaXQoJyAnKTtcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogc3BsaXRbMF0sIGdhcDogc3BsaXRbMV0gfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdhcHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1nYXAnKTtcbiAgICBnYXBzLmZvckVhY2goKGdhcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBnYXAuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICBjb25zdCB0ZXh0SWRlbnRpZmllciA9IG1hdGNoZXMuZmluZCh4ID0+IHguZ2FwID09PSBpZGVudGlmaWVyKT8udGV4dDtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1nYXAtdGV4dFtpZGVudGlmaWVyPVwiJHt0ZXh0SWRlbnRpZmllcn1cIl1gKT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgaWYgKHRleHRJZGVudGlmaWVyICYmIHRleHQpIHtcbiAgICAgICAgaWYgKCFnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdGlvbicpO1xuICAgICAgICAgIHRleHRTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICBnYXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRleHRTcGFuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgZ2FwLm5leHRFbGVtZW50U2libGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgc3ZnIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHF1ZXJ5LCBxdWVyeUFzc2lnbmVkRWxlbWVudHMsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcbiAgaG90c3BvdHM7XG4gIHN0YXJ0UG9pbnQgPSBudWxsO1xuICBlbmRQb2ludCA9IG51bGw7XG4gIEBzdGF0ZSgpIF9saW5lcyA9IFtdO1xuICBAc3RhdGUoKSBzdGFydENvb3JkOiB7IHg6IGFueTsgeTogYW55IH07XG4gIEBzdGF0ZSgpIG1vdXNlQ29vcmQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgQHF1ZXJ5KCdzdmcnKSBzdmdDb250YWluZXI7XG4gIEBxdWVyeUFzc2lnbmVkRWxlbWVudHMoeyBzZWxlY3RvcjogJ2ltZycgfSkgZ3JJbWFnZTtcblxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIC8vIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQocXRpLWFzc29jaWFibGUtaG90c3BvdCkge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgIH1cbiAgICAgIGxpbmUtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIHN2ZyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIGxlZnQ6IDBweDtcbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIHN2ZzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbGluZXMgPSBbXTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXMubGVuZ3RoID4gMDtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHRoaXMuX2xpbmVzID0gdmFsO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcztcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGxpbmUtY29udGFpbmVyPlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgd2lkdGg9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy53aWR0aCl9XG4gICAgICAgICAgaGVpZ2h0PSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0KX1cbiAgICAgICAgICB2aWV3Ym94PVwiMCAwICR7dGhpcy5nckltYWdlWzBdPy53aWR0aH0gJHt0aGlzLmdySW1hZ2VbMF0/LmhlaWdodH1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHtyZXBlYXQoXG4gICAgICAgICAgICB0aGlzLl9saW5lcyxcbiAgICAgICAgICAgIGxpbmUgPT4gbGluZSxcbiAgICAgICAgICAgIChsaW5lLCBpbmRleCkgPT4gc3ZnYFxuICAgICAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgICAgIHBhcnQ9XCJsaW5lXCJcbiAgICAgICAgICAgICAgICB4MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLmxlZnQpfVxuICAgICAgICAgICAgICAgIHkxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUudG9wKX1cbiAgICAgICAgICAgICAgICB4Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLmxlZnQpfVxuICAgICAgICAgICAgICAgIHkyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUudG9wKX1cbiAgICAgICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgICAgICAgIEBjbGljaz0keyhlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVzID0gdGhpcy5fbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9saW5lcyk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICApfVxuICAgICAgICAgICR7dGhpcy5zdGFydFBvaW50ICYmXG4gICAgICAgICAgc3ZnYDxsaW5lXG4gICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgeDE9JHt0aGlzLnN0YXJ0Q29vcmQueH1cbiAgICAgICAgICAgIHkxPSR7dGhpcy5zdGFydENvb3JkLnl9XG4gICAgICAgICAgICB4Mj0ke3RoaXMubW91c2VDb29yZC54fVxuICAgICAgICAgICAgeTI9JHt0aGlzLm1vdXNlQ29vcmQueX1cbiAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAvPmB9XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8L2xpbmUtY29udGFpbmVyPmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChlKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGUpO1xuXG4gICAgdGhpcy5ob3RzcG90cyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5tb3VzZUNvb3JkID0ge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5ob3RzcG90cy5mb3JFYWNoKGhvdHNwb3QgPT4ge1xuICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0gKyAncHgnO1xuICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXSArICdweCc7XG5cbiAgICAgIGhvdHNwb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydFBvaW50KSB7XG4gICAgICAgICAgdGhpcy5zdGFydFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5zdGFydENvb3JkID0ge1xuICAgICAgICAgICAgeDogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSxcbiAgICAgICAgICAgIHk6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmVuZFBvaW50KSB7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuX2xpbmVzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fbGluZXMsXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgKyAnICcgKyB0aGlzLmVuZFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpXG4gICAgICAgICAgXTtcbiAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9saW5lcyk7XG4gICAgICAgICAgdGhpcy5zdGFydFBvaW50ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uSG90c3BvdHMoXG4gIHNoYXBlOiBzdHJpbmcsXG4gIGNvb3Jkc051bWJlcjogbnVtYmVyW10sXG4gIGltZzogSFRNTEltYWdlRWxlbWVudCxcbiAgaG90c3BvdDogUXRpSG90c3BvdENob2ljZVxuKSB7XG4gIHN3aXRjaCAoc2hhcGUpIHtcbiAgICBjYXNlICdjaXJjbGUnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgY2VudGVyWFBlciA9IChjZW50ZXJYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgY2VudGVyWVBlciA9IChjZW50ZXJZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJhZGl1c1BlciA9IChyYWRpdXMgLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlcllQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDQgKiByYWRpdXNQZXIgKyAncHgnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmJvcmRlclJhZGl1cyA9IGA5OTk5cHhgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFlQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9seSc6XG4gICAgICB7XG4gICAgICAgIC8vIGZyb20gYSxiLGMsZCxlLGYgPT4gW3t4OmEsIHk6Yn0se3g6YywgeTpkfSx7eDplLCB5OmZ9XVxuICAgICAgICBjb25zdCBwb2x5Y29vcmRzID0gY29vcmRzTnVtYmVyLnJlZHVjZSgoYWNjLCBjdXJyZW50VmFsdWUsIGN1cnJlbnRJbmRleCwgcG9seUMpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgbGFzdFZhbCA9IGFjYy5wb3AoKTtcbiAgICAgICAgICAgIGFjY1thY2MubGVuZ3RoXSA9IHsgeDogbGFzdFZhbCwgeTogcG9seUNbY3VycmVudEluZGV4XSB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGJvdW5kaW5nIGJveCBieSBmaW5kaW5nIHRoZSBtYXggYXggbWluIGNvb3JkaW5hdGVzIG9mIHggYW5kIHlcbiAgICAgICAgY29uc3QgbGVmdFggPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHJpZ2h0WCA9IE1hdGgubWF4KC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgdG9wWSA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LnkpKTtcbiAgICAgICAgY29uc3QgYm90dG9tWSA9IE1hdGgubWF4KC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LnkpKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHJlbGF0aXZlIGRpc3RhbmNlIGNhdXNlIHdlIHdhbnQgdG8gdXNlIHBlcmNlbnRhZ2VzXG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcblxuICAgICAgICAvLyBzZXQgdGhlIGhvdHNwb3Qgb24geCx5IGFuZCBzZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG5cbiAgICAgICAgLy8gYWxsIHRoZSBwb2x5Z29uIHBvaW50cyBzaG91bGQgYmUgY29ycmVjdGVkIGNhdXNlZCB0aGV5IGFyZSBmcm9tXG4gICAgICAgIC8vIGltYWdlIDAsMCBwb2ludCwgYW5kIHNob3VsZCBiZSBmcm9tIHRoZSBob3RzcG90IHBvaW50IHdoaWNoIGFscmVhZHlcbiAgICAgICAgLy8gaGFzIGJlZW4gb2Zmc2V0dGVkIGZyb20gdGhlIGltYWdlIGluIHRoZSBwcmV2aW91cyBmZXcgbGluZXMgb2YgY29kZVxuICAgICAgICAvLyBhbHNvIHRoZSBwb2ludHMgaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIHRvIHRoZSBpbWFnZSwgYnV0IG5vdyBoYXZlXG4gICAgICAgIC8vIHRvIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSBmcm9tIHRoZSB3aWR0aCBvZiB0aGUgaG90c3BvdFxuICAgICAgICBjb25zdCBwb2x5Z29uRGF0YSA9IHBvbHljb29yZHMubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgeDogKChwb2ludC54IC0gbGVmdFgpIC8gKHJpZ2h0WCAtIGxlZnRYKSkgKiAxMDAsXG4gICAgICAgICAgeTogKChwb2ludC55IC0gdG9wWSkgLyAoYm90dG9tWSAtIHRvcFkpKSAqIDEwMFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgLy8gY3JlYXRlIGNsaXAgcGF0aCBjb29yZGluYXRlIHN0eWxlIGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGNvbnN0IHBvbHlEID0gcG9seWdvbkRhdGEubWFwKHAgPT4gTWF0aC5yb3VuZChwLngpICsgJyUgJyArIE1hdGgucm91bmQocC55KSArICclJykuam9pbignLCcpO1xuXG4gICAgICAgIC8vIDUwJSAwJSwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwJSA1MCVcbiAgICAgICAgaG90c3BvdC5zdHlsZS5jbGlwUGF0aCA9IGBwb2x5Z29uKCR7cG9seUR9KWA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktZ2FwLWltZycsXG4gIGZhbHNlLFxuICAncXRpLWFzc29jaWFibGUtaG90c3BvdCdcbikge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktZ2FwLWltZyddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDFyZW07XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PG51bGw+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIC8vIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWCAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSAyICogcmFkaXVzICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWSArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WCAtIGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVkgLSB0b3BZICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgSG90c3BvdENob2ljZSA9IENob2ljZSAmIHsgb3JkZXI6IG51bWJlciB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsZUFBZTtBQUN4QixTQUFTLFlBQVksWUFBWTtBQUNqQyxTQUFTLGVBQWUsZ0JBQWdCOzs7QUMyQmpDLFNBQVMsTUFBTSxjQUFpQyxTQUF3QjtBQUM3RSxRQUFNLGtCQUEwQztBQUFBLElBQzlDLHNCQUFzQjtBQUFBLEtBQ25CO0FBRUwsU0FBTyxDQUNMLE9BQ0Esb0JBQ0c7QUFFSCxVQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ25CLFVBQU0sb0JBQW9CLE1BQU0sUUFBUSxZQUFZLElBQUksZUFBZSxDQUFDLFlBQVk7QUFHcEYsVUFBTSxTQUFTLFNBQTJCLGNBQWdFO0FBQ3hHLHdCQUFrQixRQUFRLENBQUFBLGVBQVk7QUFDcEMsY0FBTSxNQUFNQTtBQUNaLFlBQUksYUFBYSxJQUFJLEdBQUcsR0FBRztBQUN6QixnQkFBTSxXQUFXLGFBQWEsSUFBSSxHQUFHO0FBQ3JDLGdCQUFNLFdBQVcsS0FBSyxHQUFHO0FBRXpCLGNBQUksYUFBYSxVQUFVO0FBQ3pCLGdCQUFJLENBQUMsZ0JBQWdCLHdCQUF3QixLQUFLLFlBQVk7QUFDNUQsY0FBQyxLQUFLLGVBQWUsRUFBK0IsVUFBVSxRQUFRO0FBQUEsWUFDeEU7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUVELGFBQU8sS0FBSyxNQUFNLFlBQVk7QUFBQSxJQUNoQztBQUFBLEVBQ0Y7QUFDRjs7O0FDN0RBLFNBQVMscUJBQXFCO0FBU3ZCLElBQU0sdUJBQXVCO0FBQUEsRUFDbEM7QUFBQSxJQUNFLFlBQVk7QUFBQSxJQUNaLGFBQWE7QUFBQSxJQUNiLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxFQUNSO0FBQUEsRUFDQTtBQUFBLElBQ0UsWUFBWTtBQUFBLElBQ1osYUFBYTtBQUFBLElBQ2IsVUFBVTtBQUFBLElBQ1YsT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBLEVBQ1I7QUFDRjtBQUVPLElBQU0sY0FBYyxjQUEyQixPQUFPLE1BQU0sQ0FBQzs7O0FGSzdELElBQU0sb0JBQU4sY0FBZ0MsV0FBVztBQUFBLEVBb0doRCxjQUFjO0FBQ1osVUFBTTtBQW5Hb0Isc0JBQXFCO0FBQ3JCLG9CQUE2QjtBQUM3Qix5QkFBeUM7QUFJckUsaUNBQXdCLENBQUMsR0FBWSxhQUFzQjtBQUN6RCxXQUFLLHFCQUFxQixRQUFRLFFBQU8sR0FBRyxXQUFXLFFBQVM7QUFBQSxJQUNsRTtBQUlBLGlDQUF3QixDQUFDLEdBQVksYUFDbkMsS0FBSyxxQkFBcUIsUUFBUSxRQUFPLEdBQUcsV0FBVyxRQUFTO0FBR2xFLFNBQVEsV0FBd0I7QUFBQSxNQUM5QixZQUFZLEtBQUssYUFBYSxZQUFZO0FBQUEsTUFDMUMsV0FBVztBQUFBLElBQ2I7QUE4Q0EsU0FBUSxrQkFBeUMsaUNBQUssS0FBSyxXQUFWLEVBQW9CLFdBQVcsS0FBSyxTQUFTLFVBQVU7QUFDeEcsU0FBUSxvQkFBbUMsQ0FBQztBQUM1QyxTQUFRLHVCQUFzQyxDQUFDO0FBaUM3QyxTQUFLLGlCQUFpQix5QkFBeUIsQ0FBQyxNQUEyQjtBQUN6RSxXQUFLLFdBQVcsaUNBQUssS0FBSyxXQUFWLEVBQW9CLFdBQVcsQ0FBQyxHQUFHLEtBQUssU0FBUyxXQUFXLEVBQUUsT0FBTyxRQUFRLEVBQUU7QUFDL0YsV0FBSyxrQkFBa0IsS0FBSztBQUM1QixRQUFFLGdCQUFnQjtBQUFBLElBQ3BCLENBQUM7QUFDRCxTQUFLLGlCQUFpQix5QkFBeUIsQ0FBQyxNQUFnQztBQUM5RSxRQUFFLGdCQUFnQjtBQUNsQixZQUFNLGtCQUFrQixFQUFFO0FBQzFCLFdBQUssa0JBQWtCLEtBQUssZUFBZTtBQUMzQyxzQkFBZ0Isa0JBQWtCLGdCQUFnQixpQkFBaUI7QUFBQSxJQUNyRSxDQUFDO0FBQ0QsU0FBSyxpQkFBaUIsNEJBQTRCLENBQUMsTUFBeUI7QUFDMUUsUUFBRSxnQkFBZ0I7QUFDbEIsV0FBSyxxQkFBcUIsS0FBSyxFQUFFLE1BQXFCO0FBQUEsSUFDeEQsQ0FBQztBQUNELFNBQUssaUJBQWlCLGVBQWUsQ0FBQyxNQUEwRTtBQUM5RyxZQUFNLEVBQUUsb0JBQW9CLGFBQWEsSUFBSSxFQUFFO0FBQy9DLFdBQUssdUJBQXVCLG9CQUFvQixNQUFNO0FBQ3RELFdBQUssZ0JBQWdCLFlBQVk7QUFBQSxJQUNuQyxDQUFDO0FBRUQsU0FBSztBQUFBO0FBQUEsTUFFSDtBQUFBLE1BQ0EsQ0FBQyxNQUE0RTtBQUMzRSxjQUFNLEVBQUUsbUJBQW1CLE1BQU0sSUFBSSxFQUFFO0FBQ3ZDLGFBQUssc0JBQXNCLG1CQUFtQixLQUFLO0FBQ25ELFVBQUUsZ0JBQWdCO0FBQUEsTUFDcEI7QUFBQSxJQUNGO0FBRUEsU0FBSyxpQkFBaUIsNEJBQTRCLEtBQUssNEJBQTRCO0FBQUEsRUFDckY7QUFBQSxFQS9HQSxJQUFXLFlBQXVEO0FBQ2hFLFdBQU8sS0FBSyxTQUFTLFVBQVUsSUFBSSxPQUFNO0FBQUEsTUFDdkMsWUFBWSxFQUFFO0FBQUEsTUFDZCxPQUFPLEVBQUU7QUFBQSxNQUNULE1BQU0sRUFBRTtBQUFBLE9BRUosRUFBRSxTQUFTLGFBQWEsRUFBRSxlQUFlLFVBQ3pDLEVBQUUsZ0JBQWlCLEVBQXNCLGVBQWUsSUFDeEQsQ0FBQyxFQUNMO0FBQUEsRUFDSjtBQUFBLEVBRUEsSUFBVyxVQUFVLE9BQWtEO0FBQ3JFLFFBQUksQ0FBQyxNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFLLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRztBQUNsRSxjQUFRLEtBQUssOERBQThEO0FBQzNFO0FBQUEsSUFDRjtBQUNBLFNBQUssV0FBVyxpQ0FDWCxLQUFLLFdBRE07QUFBQSxNQUVkLFdBQVcsS0FBSyxTQUFTLFVBQVUsSUFBSSxjQUFZO0FBQ2pELGNBQU0sZ0JBQWdCLE1BQU0sS0FBSyxPQUFLLEVBQUUsZUFBZSxTQUFTLFVBQVU7QUFDMUUsWUFBSSxlQUFlO0FBQ2pCLGlCQUFPLGtDQUFLLFdBQWE7QUFBQSxRQUMzQjtBQUNBLGVBQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNIO0FBRUEsU0FBSyxTQUFTLFVBQVUsUUFBUSxjQUFZO0FBQzFDLFVBQUksU0FBUyxTQUFTLFlBQVk7QUFDaEMsY0FBTSxxQkFBcUIsS0FBSyxxQkFBcUI7QUFBQSxVQUNuRCxDQUFDLE9BQW9CLEdBQUcsdUJBQXVCLFNBQVM7QUFBQSxRQUMxRDtBQUNBLFlBQUksb0JBQW9CO0FBQ3RCLDZCQUFtQixRQUFRLFNBQVM7QUFBQSxRQUN0QztBQUFBLE1BQ0Y7QUFFQSxVQUFJLFNBQVMsU0FBUyxXQUFXO0FBQy9CLGFBQUssa0JBQWtCLFFBQVEsUUFBTSxHQUFHLGtCQUFrQixTQUFTLFVBQVUsQ0FBQztBQUFBLE1BQ2hGO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBTUEsTUFBTSxvQkFBbUM7QUFDdkMsVUFBTSxrQkFBa0I7QUFDeEIsVUFBTSxLQUFLO0FBQ1gsU0FBSyxNQUFxQyxpQ0FBaUMsSUFBSTtBQUFBLEVBQ2pGO0FBQUE7QUFBQSxFQUdBLElBQUksVUFBVSxhQUFvQztBQUNoRCxRQUFJLGFBQWE7QUFDZixpQkFBVyxZQUFZLGFBQWE7QUFDbEMsY0FBTSxtQkFBbUIsS0FBSyxZQUFZLFNBQVMsa0JBQWtCO0FBQ3JFLFlBQUksa0JBQWtCO0FBQ3BCLGVBQUssdUJBQXVCLFNBQVMsb0JBQW9CLFNBQVMsUUFBUTtBQUFBLFFBQzVFO0FBRUEsY0FBTSxjQUF1QyxLQUFLLHFCQUFxQjtBQUFBLFVBQ3JFLE9BQUssRUFBRSxhQUFhLHFCQUFxQixNQUFNLFNBQVM7QUFBQSxRQUMxRDtBQUNBLFlBQUksYUFBYTtBQUNmLHNCQUFZLFFBQVEsU0FBUztBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFzQ08sb0JBQW9CLE1BQWU7QUFDeEMsVUFBTSxvQkFBb0IsS0FBSyxTQUFTLFVBQVU7QUFBQSxNQUNoRCxDQUFDLFNBQTZDLHFCQUFxQixRQUFRLEtBQUs7QUFBQSxJQUNsRjtBQUNBLFVBQU0sWUFBWSxrQkFBa0IsSUFBSSxRQUFNO0FBQzVDLGFBQU87QUFBQSxRQUNMLG9CQUFvQixHQUFHO0FBQUEsUUFDdkIsVUFBVSxHQUFHO0FBQUEsTUFDZjtBQUFBLElBQ0YsQ0FBQztBQUNELGVBQVcsWUFBWSxXQUFXO0FBQ2hDLFlBQU0sY0FBdUMsS0FBSyxxQkFBcUI7QUFBQSxRQUNyRSxPQUFLLEVBQUUsYUFBYSxxQkFBcUIsTUFBTSxTQUFTO0FBQUEsTUFDMUQ7QUFDQSxVQUFJLGFBQWE7QUFDZixvQkFBWSxrQkFBa0IsT0FBTyxTQUFTLFdBQVc7QUFBQSxNQUMzRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFTyxnQkFBZ0IsbUJBQTRCLE1BQWU7QUEzTHBFO0FBNExJLFVBQU0sb0JBQW9CLEtBQUssY0FBcUMseUJBQXlCO0FBQzdGLFFBQUksQ0FBQyxtQkFBbUI7QUFFdEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLENBQUMsa0JBQWtCLFNBQVM7QUFFOUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxzQkFBa0IsUUFBUTtBQUUxQixRQUFJLEtBQUssYUFBYSxTQUFTO0FBRTdCLFdBQUssc0JBQXNCLG9CQUFvQixLQUFLLHFCQUFxQixDQUFDO0FBQUEsSUFDNUU7QUFFQSxRQUFJLGtCQUFrQjtBQUNwQixXQUFLO0FBQUEsUUFDSDtBQUFBLFNBQ0MsR0FBQyxVQUFLLFNBQVMsVUFBVSxLQUFLLE9BQUssRUFBRSxlQUFlLGFBQWEsTUFBaEUsbUJBQW1FLFNBQVEsR0FBRyxTQUFTO0FBQUEsTUFDM0Y7QUFBQSxJQUNGO0FBRUEsU0FBSyxNQUFNLHdCQUF3QjtBQUNuQyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRU8saUJBQWlCO0FBQ3RCLFNBQUssV0FBVyxLQUFLO0FBQUEsRUFDdkI7QUFBQSxFQUVPLFlBQVksWUFBZ0Q7QUFDakUsV0FBTyxLQUFLLFlBQVksVUFBVTtBQUFBLEVBQ3BDO0FBQUEsRUFFTyxXQUFXLFlBQStDO0FBQy9ELFdBQU8sS0FBSyxZQUFZLFVBQVU7QUFBQSxFQUNwQztBQUFBLEVBRU8sWUFBWSxZQUE2RTtBQUM5RixXQUFPLEtBQUssU0FBUyxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsVUFBVSxLQUFLO0FBQUEsRUFDM0U7QUFBQTtBQUFBLEVBSVEsNkJBQTZCLE9BQXlDO0FBQzVFLFVBQU0sRUFBRSxvQkFBb0IsU0FBUyxJQUFJLE1BQU07QUFDL0MsU0FBSyx1QkFBdUIsb0JBQW9CLFFBQVE7QUFBQSxFQUMxRDtBQUFBLEVBRU8sdUJBQXVCLFlBQW9CLE9BQXNDO0FBQ3RGLFNBQUssV0FBVyxpQ0FDWCxLQUFLLFdBRE07QUFBQSxNQUVkLFdBQVcsS0FBSyxTQUFTLFVBQVUsSUFBSSxPQUFNLEVBQUUsZUFBZSxhQUFhLElBQUksaUNBQUssSUFBTCxFQUFRLE1BQWEsRUFBRTtBQUFBLElBQ3hHO0FBRUEsU0FBSyxNQUFpQywyQkFBMkI7QUFBQSxNQUMvRCxNQUFNLEtBQUs7QUFBQSxNQUNYLG9CQUFvQjtBQUFBLE1BQ3BCLFVBQVUsTUFBTSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJO0FBQUEsSUFDaEQsQ0FBQztBQUVELFFBQUksS0FBSyxhQUFhLFNBQVM7QUFFN0IsV0FBSyxzQkFBc0Isb0JBQW9CLEtBQUsscUJBQXFCLENBQUM7QUFBQSxJQUM1RTtBQUFBLEVBQ0Y7QUFBQSxFQUVPLHNCQUFzQixZQUFvQixPQUFzQztBQWxRekY7QUFtUUksVUFBTSxrQkFBa0IsS0FBSyxXQUFXLFVBQVU7QUFFbEQsUUFBSSxDQUFDLGlCQUFpQjtBQUNwQixjQUFRLEtBQUssdUNBQXVDLFVBQVUsdUJBQXVCO0FBQ3JGO0FBQUEsSUFDRjtBQUVBLFNBQUssV0FBVyxpQ0FDWCxLQUFLLFdBRE07QUFBQSxNQUVkLFdBQVcsS0FBSyxTQUFTLFVBQVUsSUFBSSxPQUFLO0FBQzFDLFlBQUksRUFBRSxlQUFlLFlBQVk7QUFDL0IsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTyxpQ0FDRixJQURFO0FBQUEsVUFFTCxPQUFPLGdCQUFnQixnQkFBZ0IsV0FBVyxRQUFRLENBQUMsR0FBRyxFQUFFLE9BQU8sS0FBZTtBQUFBLFFBQ3hGO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUNBLFNBQUssa0JBQWtCLFFBQVEsUUFBTSxHQUFHLGtCQUFrQixVQUFVLENBQUM7QUFFckUsU0FBSyxNQUE2Qix1QkFBdUI7QUFBQSxNQUN2RCxNQUFNLEtBQUs7QUFBQSxNQUNYLG1CQUFtQjtBQUFBLE1BQ25CLFFBQU8sVUFBSyxTQUFTLFVBQVUsS0FBSyxPQUFLLEVBQUUsZUFBZSxVQUFVLE1BQTdELG1CQUFnRTtBQUFBLElBQ3pFLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSx1QkFBaUY7QUFDdkYsUUFBSSxLQUFLLHFCQUFxQixNQUFNLHdCQUFzQixtQkFBbUIsU0FBUyxDQUFDLEVBQUcsUUFBTztBQUNqRyxRQUFJLEtBQUsscUJBQXFCLEtBQUssd0JBQXNCLG1CQUFtQixTQUFTLENBQUMsRUFBRyxRQUFPO0FBQ2hHLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxNQUFTLE1BQU0sU0FBUyxNQUFNO0FBQ3BDLFNBQUs7QUFBQSxNQUNILElBQUksWUFBZSxNQUFNO0FBQUEsUUFDdkIsU0FBUztBQUFBLFFBQ1QsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGO0FBOVE4QjtBQUFBLEVBQTNCLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBRGYsa0JBQ2lCO0FBQ0E7QUFBQSxFQUEzQixTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQUZmLGtCQUVpQjtBQUNBO0FBQUEsRUFBM0IsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FIZixrQkFHaUI7QUFDQTtBQUFBLEVBQTNCLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBSmYsa0JBSWlCO0FBRUM7QUFBQSxFQUE1QixTQUFTLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFBQSxHQU5oQixrQkFNa0I7QUFFN0I7QUFBQSxFQURDLE1BQU0sWUFBWSxFQUFFLHNCQUFzQixLQUFLLENBQUM7QUFBQSxHQVB0QyxrQkFRWDtBQUk2QjtBQUFBLEVBQTVCLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLEdBWmhCLGtCQVlrQjtBQUU3QjtBQUFBLEVBREMsTUFBTSxZQUFZLEVBQUUsc0JBQXNCLEtBQUssQ0FBQztBQUFBLEdBYnRDLGtCQWNYO0FBSVE7QUFBQSxFQURQLFFBQVEsRUFBRSxTQUFTLFlBQVksQ0FBQztBQUFBLEdBakJ0QixrQkFrQkg7QUFsQkcsb0JBQU47QUFBQSxFQUROLGNBQWMscUJBQXFCO0FBQUEsR0FDdkI7OztBRy9CYixTQUFTLGNBQUFDLG1CQUFrQjtBQUMzQixTQUFTLGlCQUFBQyxnQkFBZSxZQUFBQyxpQkFBZ0I7OztBQ0R4QyxJQUFNLE1BQU0sT0FBTztBQWVuQixJQUFNLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCWCxTQUFTLGtCQUFrQixhQUEwQixTQUFpQixXQUFtQjtBQUM5RixjQUFZLGlCQUFpQixPQUFPLEVBQUUsUUFBUSxhQUFXO0FBQ3ZELFVBQU0sYUFBYSxHQUFHLE9BQU8sSUFBSSxTQUFTO0FBQzFDLFVBQU0sYUFBYSw0QkFBNEIsU0FBUyxVQUFVO0FBQ2xFLFlBQVEsWUFBWSxVQUFVO0FBQUEsRUFDaEMsQ0FBQztBQUNIO0FBR08sU0FBUyx3QkFBd0IsYUFBMEIsa0JBQTBCO0FBQzFGLGNBQVksaUJBQWlCLEdBQUcsRUFBRSxRQUFRLGFBQVc7QUFDbkQsVUFBTSxZQUFZLFFBQVE7QUFDMUIsUUFBSSxXQUFXO0FBQ2IsZ0JBQVUsUUFBUSxlQUFhO0FBQzdCLFlBQUksVUFBVSxXQUFXLEdBQUcsZ0JBQWdCLEdBQUcsR0FBRztBQUNoRCxnQkFBTSxTQUFTLFVBQVUsTUFBTSxHQUFHLGdCQUFnQixJQUFJLE1BQU07QUFDNUQsZ0JBQU0sYUFBYSxHQUFHLFFBQVEsUUFBUSxJQUFJLE1BQU07QUFDaEQsZ0JBQU0sYUFBYSw0QkFBNEIsU0FBUyxVQUFVO0FBQ2xFLGtCQUFRLFlBQVksVUFBVTtBQUFBLFFBQ2hDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBR0EsU0FBUyw0QkFBNEIsU0FBUyxZQUFZO0FBQ3hELFFBQU0sYUFBYSxTQUFTLGNBQWMsVUFBVTtBQUVwRCxhQUFXLFFBQVEsUUFBUSxZQUFZO0FBQ3JDLGVBQVcsYUFBYSxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUEsRUFDL0M7QUFFQSxTQUFPLFFBQVEsWUFBWTtBQUN6QixlQUFXLFlBQVksUUFBUSxVQUFVO0FBQUEsRUFDM0M7QUFDQSxTQUFPO0FBQ1Q7QUFhQSxJQUFJLGlCQUF3QztBQUVyQyxTQUFTLFFBQVEsS0FBSyx3QkFBd0IsT0FBTztBQUMxRCxNQUFJLHlCQUF5QixtQkFBbUIsTUFBTTtBQUNwRCxtQkFBZSxNQUFNO0FBQUEsRUFDdkI7QUFFQSxTQUFPLElBQUksUUFBNEIsQ0FBQyxTQUFTLFdBQVc7QUFDMUQsVUFBTSxNQUFNLElBQUksZUFBZTtBQUMvQixxQkFBaUI7QUFFakIsUUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJO0FBQ3pCLFFBQUksZUFBZTtBQUVuQixRQUFJLFNBQVMsTUFBTTtBQUNqQixVQUFJLElBQUksVUFBVSxPQUFPLElBQUksU0FBUyxLQUFLO0FBQ3pDLGdCQUFRLElBQUksV0FBVztBQUFBLE1BQ3pCLE9BQU87QUFDTCxlQUFPLElBQUksVUFBVTtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUVBLFFBQUksVUFBVSxNQUFNO0FBQ2xCLGFBQU8sSUFBSSxVQUFVO0FBQUEsSUFDdkI7QUFFQSxRQUFJLEtBQUs7QUFBQSxFQUNYLENBQUM7QUFDSDtBQUVPLFNBQVMsU0FBUyxhQUFxQjtBQUM1QyxRQUFNLFNBQVMsSUFBSSxVQUFVO0FBQzdCLFFBQU0sY0FBYyxPQUFPLGdCQUFnQixhQUFhLFVBQVU7QUFDbEUsU0FBTztBQUNUO0FBRU8sU0FBUyxPQUFPLGFBQXlDO0FBQzlELFFBQU0sWUFBWSxJQUFJLGNBQWM7QUFDcEMsUUFBTSxlQUFlLElBQUksVUFBVSxFQUFFLGdCQUFnQixXQUFXLFVBQVU7QUFDMUUsWUFBVSxpQkFBaUIsWUFBWTtBQUN2QyxRQUFNLG1CQUFtQixVQUFVLG9CQUFvQixhQUFhLFFBQVE7QUFDNUUsU0FBTztBQUNUO0FBRU8sU0FBUyxZQUFZLGFBQStCLFVBQWtCO0FBQzNFLE1BQUksQ0FBQyxTQUFTLFNBQVMsR0FBRyxHQUFHO0FBQzNCLGdCQUFZO0FBQUEsRUFDZDtBQUVBLGNBQVksaUJBQWlCLDZCQUE2QixFQUFFLFFBQVEsZUFBYTtBQTNJbkY7QUE0SUksUUFBSSxPQUE2QztBQUVqRCxRQUFJLFVBQVUsYUFBYSxLQUFLLEdBQUc7QUFDakMsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLFVBQVUsYUFBYSxNQUFNLEdBQUc7QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLFVBQVUsYUFBYSxjQUFjLEdBQUc7QUFDMUMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLGFBQVksZUFBVSxhQUFhLElBQUksTUFBM0IsbUJBQThCO0FBRWhELFFBQUksQ0FBQyxVQUFVLFdBQVcsT0FBTyxLQUFLLENBQUMsVUFBVSxXQUFXLE1BQU0sR0FBRztBQUNuRSxZQUFNLGNBQWMsV0FBVyxVQUFVLFNBQVM7QUFDbEQsZ0JBQVUsYUFBYSxNQUFNLFdBQVc7QUFBQSxJQUMxQztBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBRU8sU0FBUyxzQkFBc0IsYUFBK0I7QUFDbkUsUUFBTSxnQkFBZ0IsWUFBWSxpQkFBaUIsc0RBQXNEO0FBQ3pHLGdCQUFjLFFBQVEsYUFBVztBQUMvQixVQUFNLGNBQWMsU0FBUyxjQUFjLFFBQVEsV0FBVztBQUM5RCxZQUFRLGFBQWEsYUFBYSxRQUFRLFVBQVU7QUFBQSxFQUN0RCxDQUFDO0FBQ0g7QUFFTyxTQUFTLGlCQUFpQixhQUErQjtBQUU5RCxjQUFZLGlCQUFpQixnQkFBZ0IsRUFBRSxRQUFRLGdCQUFjLFdBQVcsT0FBTyxDQUFDO0FBQzFGOzs7QUMvSE8sSUFBTSxtQkFBbUIsTUFBTTtBQUNwQyxNQUFJO0FBRUosUUFBTSxNQUF3QjtBQUFBLElBQzVCLE1BQU0sS0FBSyxLQUFhLHdCQUF3QixPQUE0QjtBQUMxRSxhQUFPLElBQUksUUFBb0IsQ0FBQyxTQUFTLFdBQVc7QUFDbEQsZ0JBQVEsS0FBSyxxQkFBcUIsRUFBRSxLQUFLLENBQUFDLFNBQU87QUFDOUMsd0JBQWNBO0FBR2QsY0FBSSxLQUFLLElBQUksVUFBVSxHQUFHLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUMvQyxpQkFBTyxRQUFRLEdBQUc7QUFBQSxRQUNwQixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsTUFBTSxXQUErQjtBQUNuQyxvQkFBYyxTQUFTLFNBQVM7QUFDaEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sQ0FBQyxhQUFpQztBQUN0QyxrQkFBWSxhQUFhLFFBQVE7QUFDakMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEdBQUcsSUFBb0Q7QUFDckQsU0FBRyxXQUFXO0FBQ2QsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVMsS0FBeUI7QUFDaEMsWUFBTSxhQUFhLENBQUMsUUFBUSxRQUFRO0FBQ3BDLFlBQU0sZUFBZSxJQUFJLFVBQVUsR0FBRyxJQUFJLFlBQVksR0FBRyxDQUFDO0FBQzFELGlCQUFXLGFBQWEsWUFBWTtBQUNsQyxjQUFNLGdCQUFnQixZQUFZLGlCQUFpQixNQUFNLFlBQVksR0FBRztBQUN4RSxzQkFBYyxRQUFRLFVBQVE7QUFDNUIsZ0JBQU0sV0FBVyxLQUFLLGFBQWEsU0FBUztBQUM1QyxjQUFJLENBQUMsU0FBUyxXQUFXLE9BQU8sS0FBSyxDQUFDLFNBQVMsV0FBVyxNQUFNLEdBQUc7QUFHakUsaUJBQUssYUFBYSxZQUFZLEdBQUc7QUFDakMsaUJBQUs7QUFBQSxjQUNIO0FBQUEsY0FDQSxlQUFlLE1BQU0sVUFBVSxZQUFZLFNBQVMsU0FBUyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsWUFDbkY7QUFBQSxVQUNGO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxtQkFBbUIsQ0FBQyxTQUFpQixjQUFrQztBQUNyRSx3QkFBa0IsYUFBYSxTQUFTLFNBQVM7QUFDakQsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLHlCQUF5QixDQUFDLFFBQWdCLGFBQXlCO0FBQ2pFLDhCQUF3QixhQUFhLEtBQUs7QUFDMUMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLGtCQUFrQixTQUFpQixVQUE4QjtBQUMvRCxZQUFNLHVCQUF1QixZQUFZLGNBQWMsd0JBQXdCO0FBQy9FLFlBQU0sNkJBQTZCLHFCQUFxQixjQUFjLFFBQVE7QUFFOUUsMkJBQXFCLGFBQWEsaUJBQWlCLE9BQU87QUFDMUQsMkJBQXFCLGFBQWEsa0JBQWtCLFVBQVUsUUFBUTtBQUN0RSwyQkFBcUIsYUFBYSxRQUFRLDJCQUEyQixhQUFhLE1BQU0sQ0FBQztBQUN6RiwyQkFBcUIsYUFBYSxTQUFTLDJCQUEyQixhQUFhLE9BQU8sQ0FBQztBQUMzRiwyQkFBcUIsYUFBYSxVQUFVLDJCQUEyQixhQUFhLFFBQVEsQ0FBQztBQUU3RiwyQkFBcUIsWUFBWSwwQkFBMEI7QUFDM0QsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLHdCQUFvQztBQUNsQyw0QkFBc0IsV0FBVztBQUNqQyxhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsbUJBQStCO0FBQzdCLHVCQUFpQixXQUFXO0FBQzVCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxPQUFPO0FBQ0wsYUFBTyxJQUFJLGNBQWMsRUFBRSxrQkFBa0IsT0FBTyxXQUFXLENBQUM7QUFBQSxJQUNsRTtBQUFBLElBQ0EsTUFBYztBQUNaLGFBQU8sSUFBSSxjQUFjLEVBQUUsa0JBQWtCLFdBQVc7QUFBQSxJQUMxRDtBQUFBLElBQ0EsVUFBVTtBQUNSLGFBQU8sT0FBTyxXQUFXO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQXNCO0FBQ3BCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDs7O0FGOUhPLElBQU0sMkJBQU4sY0FBdUNDLFlBQVc7QUFBQSxFQUFsRDtBQUFBO0FBSXVCLHNCQUFhO0FBS2IsZ0JBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNbkMsTUFBYSxvQkFBbUM7QUFDOUMsVUFBTSxrQkFBa0I7QUFFeEIsVUFBTSxRQUFRLElBQUksTUFBTSx5Q0FBeUMsRUFBRSxZQUFZLE1BQU0sU0FBUyxLQUFLLENBQUM7QUFDcEcsVUFBTSxjQUFjLEtBQUssY0FBYyxLQUFLO0FBRTVDLFFBQUksYUFBYTtBQUNmLFlBQU0sT0FBTyxLQUFLLFFBQVEscUJBQXFCO0FBRS9DLFlBQU0sY0FBYyxLQUFLLGNBQWMsd0JBQXdCLEtBQUssVUFBVSxHQUFHO0FBQ2pGLFVBQUksYUFBYTtBQUNmLGNBQU0sS0FBSyxrQkFBa0IsV0FBVztBQUFBLE1BQzFDLE9BQU87QUFDTCxnQkFBUSxLQUFLLHFDQUFxQyxLQUFLLFVBQVUsWUFBWTtBQUFBLE1BQy9FO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxrQkFBa0IsYUFBc0I7QUFDbkQsVUFBTSxPQUFPLEtBQUssS0FBSyxVQUFVLEdBQUcsS0FBSyxLQUFLLFlBQVksR0FBRyxDQUFDO0FBQzlELFVBQU0sV0FBVyxNQUFNLGlCQUFpQixFQUNyQyxLQUFLLEtBQUssSUFBSSxFQUNkLEtBQUssU0FBTyxJQUFJLFFBQVEsQ0FBQztBQUM1QixRQUFJLFVBQVU7QUFDWixZQUFNLFdBQVcsU0FBUyxpQkFBaUIsbUNBQW1DO0FBQzlFLGtCQUFZLFlBQVk7QUFDeEIsa0JBQVksT0FBTyxHQUFHLFFBQVE7QUFBQSxJQUNoQztBQUFBLEVBQ0Y7QUFDRjtBQTVDOEI7QUFBQSxFQUEzQkMsVUFBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FKZix5QkFJaUI7QUFLQTtBQUFBLEVBQTNCQSxVQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQVRmLHlCQVNpQjtBQVRqQiwyQkFBTjtBQUFBLEVBRE5DLGVBQWMsNkJBQTZCO0FBQUEsR0FDL0I7OztBR1JiLFNBQWdELFFBQUFDLGFBQVk7QUFDNUQsU0FBUyxZQUFBQyxpQkFBZ0I7QUFlekIsSUFBTSx1QkFBb0U7QUFBQSxFQUN4RSxhQUFhLENBQUMsVUFBb0IsUUFBUSxTQUFTO0FBQUEsRUFDbkQsZUFBZSxDQUFDLFVBQXlCLFVBQVU7QUFDckQ7QUFtQk8sU0FBUyxtQkFBc0QsTUFBUyxNQUFjO0FBQUEsRUFDM0YsTUFBZSxrQkFBa0IsS0FBSztBQUFBLElBaUNwQyxlQUFlLE1BQWE7QUFDMUIsWUFBTSxHQUFHLElBQUk7QUFoQ2YsV0FBTyxhQUFhO0FBR3BCLFdBQU8sV0FBVztBQVFsQixXQUFPLFdBQVc7QUFRbEIsV0FBTyxXQUFXO0FBY2hCLFdBQUssWUFBWSxLQUFLLGdCQUFnQjtBQUFBLElBQ3hDO0FBQUEsSUFWQSxxQkFBcUIsV0FBb0IsVUFBbUI7QUFDMUQsV0FBSyxXQUFXLFdBQVcsS0FBSztBQUNoQyxVQUFJLFVBQVU7QUFDWixhQUFLLEtBQUs7QUFBQSxNQUNaO0FBQUEsSUFDRjtBQUFBLElBT1Msb0JBQW9CO0FBQzNCLFlBQU0sa0JBQWtCO0FBRXhCLFdBQUssaUJBQWlCLFNBQVMsS0FBSyxRQUFRO0FBQzVDLFdBQUssaUJBQWlCLFNBQVMsS0FBSyxRQUFRO0FBRTVDLFdBQUs7QUFBQSxRQUNILElBQUksWUFBWSxZQUFZLElBQUksSUFBSTtBQUFBLFVBQ2xDLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxRQUNaLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBRVMsdUJBQXVCO0FBQzlCLFlBQU0scUJBQXFCO0FBQzNCLFdBQUssb0JBQW9CLFNBQVMsS0FBSyxRQUFRO0FBQy9DLFdBQUssb0JBQW9CLFNBQVMsS0FBSyxRQUFRO0FBQy9DLFdBQUs7QUFBQSxRQUNILElBQUksWUFBWSxjQUFjLElBQUksSUFBSTtBQUFBLFVBQ3BDLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxRQUNaLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBRVEsU0FBUyxPQUFzQjtBQUNyQyxVQUFJLE1BQU0sT0FBUTtBQUVsQixVQUFJLE1BQU0sU0FBUyxTQUFTO0FBQzFCLGNBQU0sZUFBZTtBQUNyQixhQUFLLFVBQVU7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFBQSxJQUVRLFdBQVc7QUFDakIsVUFBSSxLQUFLLFlBQVksS0FBSyxTQUFVO0FBQ3BDLFdBQUssTUFBTTtBQUNYLFdBQUssVUFBVTtBQUFBLElBQ2pCO0FBQUEsSUFFUSxZQUFZO0FBQ2xCLFVBQUksS0FBSyxZQUFZLEtBQUssU0FBVTtBQUVwQyxXQUFLO0FBQUEsUUFDSCxJQUFJLFlBQW9DLFlBQVksSUFBSSxJQUFJO0FBQUEsVUFDMUQsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsUUFBUSxFQUFFLFlBQVksS0FBSyxXQUFXO0FBQUEsUUFDeEMsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsSUFFUyxTQUFTO0FBQ2hCLGFBQU9DO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUE1RlM7QUFBQSxJQUROQyxVQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxLQURiLFVBRU47QUFHQTtBQUFBLElBRE5BLFVBQVMsRUFBRSxNQUFNLFFBQVEsU0FBUyxNQUFNLFdBQVcsV0FBVyxDQUFDO0FBQUEsS0FKbkQsVUFLTjtBQVFBO0FBQUEsSUFOTkEsVUFBUztBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLElBQ2IsQ0FBQztBQUFBLEtBWlksVUFhTjtBQVFBO0FBQUEsSUFOTkEsVUFBUztBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLElBQ2IsQ0FBQztBQUFBLEtBcEJZLFVBcUJOO0FBS1A7QUFBQSxJQURDLE1BQU0sWUFBWSxFQUFFLHNCQUFzQixLQUFLLENBQUM7QUFBQSxLQXpCcEMsVUEwQmI7QUFxRUYsU0FBTztBQUNUOzs7QUN2SUEsU0FBUyxpQkFBQUMsc0JBQXFCO0FBQzlCLFNBQVMsUUFBQUMsT0FBTSxjQUFBQyxtQkFBa0I7OztBQ0RqQyxTQUFTLFdBQVc7QUFFcEIsSUFBTywrQkFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QURjUixJQUFNLGNBQU4sY0FBMEJDLFlBQVc7QUFBQSxFQUdqQyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUNGO0FBTmEsWUFDSixTQUF5QjtBQURyQixjQUFOO0FBQUEsRUFETkMsZUFBYyxlQUFlO0FBQUEsR0FDakI7OztBRWhCYixTQUFTLFFBQUFDLE9BQU0sY0FBQUMsbUJBQWtCO0FBQ2pDLFNBQVMsaUJBQUFDLHNCQUFxQjtBQUV2QixJQUFNLFlBQU4sY0FBd0JDLFlBQVc7QUFBQSxFQUMvQixTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUFBLEVBRVMsb0JBQTBCO0FBSWpDLFVBQU0sZ0JBQWdCLEtBQUssY0FBYyxRQUFRLFNBQVMsYUFBYTtBQUN2RSxRQUFJLGVBQWU7QUFDakIsV0FBSyxhQUFhLFFBQVEsUUFBUTtBQUFBLElBQ3BDO0FBQUEsRUFFRjtBQUNGO0FBZmEsWUFBTjtBQUFBLEVBRE5DLGVBQWMsWUFBWTtBQUFBLEdBQ2Q7OztBQ0hiLFNBQVMsY0FBQUMsbUJBQW9DO0FBQzdDLFNBQVMsaUJBQUFDLHNCQUFxQjtBQUd2QixJQUFNLGdCQUFOLGNBQTRCQyxZQUFXO0FBQUEsRUFBdkM7QUFBQTtBQUNMLFNBQVEsZUFBd0M7QUFBQTtBQUFBLEVBRXRDLGFBQWEsb0JBQTZFO0FBQ2xHLFVBQU0sYUFBYSxrQkFBa0I7QUFFckMsVUFBTSxPQUFPLEtBQUssYUFBYSxNQUFNO0FBRXJDLFFBQUksU0FBUyxNQUFNO0FBRWpCLFlBQU0sSUFBSSxFQUNQLEtBQUssY0FBWSxTQUFTLEtBQUssQ0FBQyxFQUNoQyxLQUFLLGdCQUFjO0FBRWxCLGNBQU0sY0FBYyxLQUFLLFVBQVUsVUFBVTtBQUc3QyxhQUFLLGVBQWUsU0FBUyxjQUFjLE9BQU87QUFDbEQsYUFBSyxhQUFhLFFBQVE7QUFDMUIsYUFBSyxhQUFhLGNBQWMsV0FBVyxXQUFXO0FBR3RELFlBQUksS0FBSyxlQUFlO0FBQ3RCLGVBQUssY0FBYyxZQUFZLEtBQUssWUFBWTtBQUFBLFFBQ2xELE9BQU87QUFDTCxrQkFBUSxLQUFLLHVEQUF1RDtBQUFBLFFBQ3RFO0FBQUEsTUFDRixDQUFDLEVBQ0EsTUFBTSxXQUFTO0FBQ2QsZ0JBQVEsTUFBTSw4QkFBOEIsS0FBSztBQUFBLE1BQ25ELENBQUM7QUFBQSxJQUNMO0FBRUEsUUFBSSxLQUFLLGdCQUFnQixRQUFRLEtBQUssWUFBWSxLQUFLLE1BQU0sSUFBSTtBQUUvRCxZQUFNLGNBQWMsS0FBSyxVQUFVLEtBQUssV0FBVztBQUduRCxXQUFLLGVBQWUsU0FBUyxjQUFjLE9BQU87QUFDbEQsV0FBSyxhQUFhLFFBQVE7QUFDMUIsV0FBSyxhQUFhLGNBQWMsV0FBVyxXQUFXO0FBR3RELFVBQUksS0FBSyxlQUFlO0FBQ3RCLGFBQUssY0FBYyxZQUFZLEtBQUssWUFBWTtBQUFBLE1BQ2xELE9BQU87QUFDTCxnQkFBUSxLQUFLLHVEQUF1RDtBQUFBLE1BQ3RFO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLFVBQVUsWUFBNEI7QUFFNUMsV0FBTyxXQUNKLFFBQVEscUJBQXFCLEVBQUUsRUFDL0IsUUFBUSxRQUFRLEdBQUcsRUFDbkIsUUFBUSxtQkFBbUIsSUFBSSxFQUMvQixLQUFLO0FBQUEsRUFDVjtBQUFBLEVBRVMsdUJBQXVCO0FBQzlCLFFBQUksS0FBSyxjQUFjO0FBQ3JCLFVBQUk7QUFDRixhQUFLLGFBQWEsT0FBTztBQUFBLE1BQzNCLFNBQVMsT0FBTztBQUNkLGdCQUFRLE1BQU0sZ0NBQWdDLEtBQUs7QUFBQSxNQUNyRDtBQUFBLElBQ0Y7QUFDQSxVQUFNLHFCQUFxQjtBQUFBLEVBQzdCO0FBQ0Y7QUF0RWEsZ0JBQU47QUFBQSxFQUROQyxlQUFjLGdCQUFnQjtBQUFBLEdBQ2xCOzs7QUNKYixTQUFTLGVBQWU7QUFDeEIsU0FBUyxPQUFBQyxNQUFLLFFBQUFDLGFBQVk7QUFDMUIsU0FBUyxpQkFBQUMsZ0JBQWUsWUFBQUMsV0FBVSxhQUFhOzs7QUNGL0MsU0FBUyxRQUFBQyxPQUFNLGNBQUFDLG1CQUFrQjtBQUNqQyxTQUFTLGlCQUFBQyxzQkFBcUI7QUFJdkIsSUFBTSx5QkFBTixjQUFxQ0MsWUFBVztBQUFBLEVBQzVDLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxFQUNUO0FBQUEsRUFFVSxjQUFjLFVBQXlEO0FBQy9FLFVBQU0sYUFBYSxNQUFNLEtBQUssS0FBSyxpQkFBaUIsK0JBQStCLENBQUM7QUFFcEYsUUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sZ0JBQWdCLFdBQVcsSUFBSSxPQUFLLEVBQUUsVUFBVSxLQUFLLENBQUM7QUFDNUQsUUFBSSxjQUFjLFNBQVMsS0FBSyxTQUFTLGdCQUFnQixjQUFjLFNBQVMsZ0JBQWdCLFdBQVc7QUFDekcsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPLGNBQWMsQ0FBQztBQUFBLEVBQ3hCO0FBQ0Y7QUFsQmEseUJBQU47QUFBQSxFQUROQyxlQUFjLHlCQUF5QjtBQUFBLEdBQzNCOzs7QURJTixJQUFNLHdCQUFOLGNBQW9DLHVCQUF1QjtBQUFBLEVBQTNEO0FBQUE7QUFFcUQsMEJBQXFEO0FBQUE7QUFBQSxFQWdCdEcsU0FBUztBQTNCcEI7QUE0QkksVUFBTSxTQUFRLGdCQUFLLGdCQUFMLG1CQUFrQixVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsS0FBSyxnQkFBNUQsbUJBQXlFO0FBQ3ZGLFdBQU9DLFFBQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM5QztBQUFBLEVBRUEsSUFBSSxxQkFBaUQ7QUFDbkQsVUFBTSxRQUFRLEtBQUssY0FBYyx5QkFBeUI7QUFDMUQsUUFBSSxPQUFPO0FBQ1QsWUFBTSxVQUFVLG9CQUFJLElBQW9CO0FBQ3hDLGlCQUFXLFNBQVMsTUFBTSxpQkFBaUIsK0JBQStCLEdBQUc7QUFDM0UsWUFBSSxDQUFDLE1BQU0sYUFBYSxjQUFjLEtBQUssTUFBTSxhQUFhLGNBQWMsR0FBRztBQUM3RSxrQkFBUSxNQUFNLDBFQUEwRTtBQUFBLFFBQzFGO0FBQ0EsY0FBTSxjQUFjLFNBQVMsTUFBTSxhQUFhLGNBQWMsQ0FBQztBQUMvRCxjQUFNLGNBQWMsU0FBUyxNQUFNLGFBQWEsY0FBYyxDQUFDO0FBQy9ELFlBQUksTUFBTSxXQUFXLEtBQUssTUFBTSxXQUFXLEdBQUc7QUFDNUMsa0JBQVEsTUFBTSwrRUFBK0U7QUFBQSxRQUMvRjtBQUNBLGdCQUFRLElBQUksYUFBYSxXQUFXO0FBQUEsTUFDdEM7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFZ0Isb0JBQW9CO0FBQ2xDLFVBQU0sa0JBQWtCO0FBQ3hCLFVBQU0sa0JBQW1DO0FBQUEsTUFDdkMsWUFBWSxLQUFLO0FBQUEsTUFDakIsYUFBYSxLQUFLO0FBQUEsTUFDbEIsVUFBVSxLQUFLO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxvQkFBb0IsS0FBSztBQUFBLE1BQ3pCLGdCQUFnQixLQUFLO0FBQUEsSUFDdkI7QUFDQSxvQkFBZ0IsUUFBUSxLQUFLLGNBQWMsZUFBZTtBQUMxRCxTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQVkseUJBQXlCO0FBQUEsUUFDdkMsU0FBUztBQUFBLFFBQ1QsVUFBVTtBQUFBLFFBQ1YsUUFBUSxFQUFFLFVBQVUsZ0JBQWdCO0FBQUEsTUFDdEMsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUEvRGEsc0JBVUosU0FBUztBQUFBLEVBQ2RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLRjtBQWZvRDtBQUFBLEVBQW5EQyxVQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsWUFBWSxDQUFDO0FBQUEsR0FEdkMsc0JBQ3lDO0FBQ007QUFBQSxFQUF6REEsVUFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLGtCQUFrQixDQUFDO0FBQUEsR0FGN0Msc0JBRStDO0FBQzlCO0FBQUEsRUFBM0JBLFVBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBSGYsc0JBR2lCO0FBQ0E7QUFBQSxFQUEzQkEsVUFBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FKZixzQkFJaUI7QUFJckI7QUFBQSxFQUZOLFFBQVEsRUFBRSxTQUFTLGFBQWEsV0FBVyxLQUFLLENBQUM7QUFBQSxFQUNqRCxNQUFNO0FBQUEsR0FQSSxzQkFRSjtBQVJJLHdCQUFOO0FBQUEsRUFETkMsZUFBYyx5QkFBeUI7QUFBQSxHQUMzQjs7O0FFVGIsU0FBUyxXQUFBQyxnQkFBZTtBQUN4QixTQUFTLE9BQUFDLE1BQUssUUFBQUMsYUFBWTtBQUMxQixTQUFTLGlCQUFBQyxnQkFBZSxZQUFBQyxXQUFVLFNBQUFDLGNBQWE7QUFReEMsSUFBTSx5QkFBTixjQUFxQyx1QkFBdUI7QUFBQSxFQW1CeEQsU0FBUztBQTdCcEI7QUE4QkksVUFBTSxTQUFRLGdCQUFLLGdCQUFMLG1CQUFrQixVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsS0FBSyxnQkFBNUQsbUJBQXlFO0FBQ3ZGLFdBQU9DLFFBQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM5QztBQUFBLEVBRWdCLG9CQUFvQjtBQUNsQyxVQUFNLGtCQUFrQjtBQUV4QixVQUFNLG1CQUFxQztBQUFBLE1BQ3pDLFVBQVUsS0FBSztBQUFBLE1BQ2YsWUFBWSxLQUFLO0FBQUEsTUFDakIsaUJBQWlCLEtBQUs7QUFBQSxNQUN0QixhQUFhLEtBQUssZUFBZTtBQUFBLE1BQ2pDLFNBQVMsS0FBSztBQUFBLE1BQ2QsT0FBTztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsSUFDckI7QUFDQSxxQkFBaUIsUUFBUSxLQUFLLGNBQWMsZ0JBQWdCO0FBRTVELFNBQUs7QUFBQSxNQUNILElBQUksWUFBWSx5QkFBeUI7QUFBQSxRQUN2QyxTQUFTO0FBQUEsUUFDVCxVQUFVO0FBQUEsUUFDVixRQUFRLEVBQUUsVUFBVSxpQkFBaUI7QUFBQSxNQUN2QyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLElBQVksa0JBQXFDO0FBQy9DLFFBQUk7QUFDSixVQUFNLGtCQUFrQixLQUFLLGNBQWMsc0JBQXNCO0FBQ2pFLFFBQUksaUJBQWlCO0FBQ25CLFlBQU0sU0FBUyxnQkFBZ0IsaUJBQWlCLFdBQVc7QUFDM0QsVUFBSSxLQUFLLGdCQUFnQixZQUFZLE9BQU8sU0FBUyxHQUFHO0FBQ3RELGlCQUFTLE9BQU8sQ0FBQyxFQUFFO0FBQ25CLGVBQU8sQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUNuQixXQUFXLEtBQUssZ0JBQWdCLFVBQVU7QUFDeEMsaUJBQVMsQ0FBQztBQUNWLGlCQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3RDLGlCQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsV0FBVztBQUNqQyxpQkFBTyxDQUFDLEVBQUUsT0FBTztBQUFBLFFBQ25CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsSUFBWSxVQUFVO0FBQ3BCLFdBQU8sS0FBSyxjQUFjLGFBQWE7QUFBQSxFQUN6QztBQUNGO0FBdEVhLHVCQVdKLFNBQVM7QUFBQSxFQUNkQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0Y7QUFoQm9EO0FBQUEsRUFBbkRDLFVBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxZQUFZLENBQUM7QUFBQSxHQUR2Qyx1QkFDeUM7QUFFeEI7QUFBQSxFQUEzQkEsVUFBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FIZix1QkFHaUI7QUFFQTtBQUFBLEVBQTNCQSxVQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQUxmLHVCQUtpQjtBQUlyQjtBQUFBLEVBRk5DLFNBQVEsRUFBRSxTQUFTLGFBQWEsV0FBVyxLQUFLLENBQUM7QUFBQSxFQUNqREMsT0FBTTtBQUFBLEdBUkksdUJBU0o7QUFUSSx5QkFBTjtBQUFBLEVBRE5DLGVBQWMsMEJBQTBCO0FBQUEsR0FDNUI7OztBQ1ZiLFNBQVMsY0FBQUMsbUJBQWtCO0FBQzNCLFNBQVMsaUJBQUFDLHNCQUFxQjtBQUd2QixJQUFNLDRCQUFOLGNBQXdDQyxZQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVMxRDtBQVRhLDRCQUFOO0FBQUEsRUFETkMsZUFBYyw4QkFBOEI7QUFBQSxHQUNoQzs7O0FDSmIsU0FBUyxjQUFBQyxhQUFZLFFBQUFDLGFBQVk7QUFDakMsU0FBUyxpQkFBQUMsdUJBQXFCO0FBR3ZCLElBQU0saUJBQU4sY0FBNkJDLFlBQVc7QUFBQSxFQUNwQyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUNGO0FBSmEsaUJBQU47QUFBQSxFQUROQyxnQkFBYyxrQkFBa0I7QUFBQSxHQUNwQjs7O0FDSmIsU0FBUyxjQUFBQyxjQUFZLE9BQUFDLE1BQUssUUFBQUMsYUFBWTtBQUN0QyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxpQkFBZ0I7QUFJakMsSUFBTSxpQkFBTixjQUE2QkMsYUFBVztBQUFBLEVBUzdDLHVCQUF1QixLQUFLLFVBQW1CO0FBQzdDLFVBQU0sYUFBYSxLQUFLLFdBQVcsTUFBTSxHQUFHO0FBQzVDLGVBQVcsUUFBUSxDQUFDLGNBQXNCO0FBQ3hDLGNBQVEsV0FBVztBQUFBLFFBQ2pCLEtBQUs7QUFDSCxlQUFLLGFBQWEsUUFBUSxrQkFBa0I7QUFDNUM7QUFBQSxRQUNGLEtBQUs7QUFDSCxlQUFLLGFBQWEsUUFBUSxFQUFFO0FBQzVCO0FBQUEsUUFDRjtBQUNFO0FBQUEsTUFDSjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQVFTLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxFQUNUO0FBQUEsRUFFUyxvQkFBMEI7QUFDakMsVUFBTSxrQkFBa0I7QUFFeEIsU0FBSyxhQUFhLFFBQVEsa0JBQWtCO0FBQUEsRUFDOUM7QUFDRjtBQXhDYSxlQXlCSyxTQUFTQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBeEJZO0FBQUEsRUFBcENDLFVBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBRGYsZUFDMEI7QUFFVDtBQUFBLEVBQTNCQSxVQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQUhmLGVBR2lCO0FBRUE7QUFBQSxFQUEzQkEsVUFBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FMZixlQUtpQjtBQUVvQjtBQUFBLEVBQS9DQSxVQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsUUFBUSxDQUFDO0FBQUEsR0FQbkMsZUFPcUM7QUFFaEQ7QUFBQSxFQURDLE1BQU0sY0FBYyxFQUFFLHNCQUFzQixLQUFLLENBQUM7QUFBQSxHQVJ4QyxlQVNYO0FBVFcsaUJBQU47QUFBQSxFQUROQyxnQkFBYyxrQkFBa0I7QUFBQSxHQUNwQjs7O0FDTGIsU0FBMkIsT0FBQUMsTUFBSyxRQUFBQyxjQUFZO0FBQzVDLFNBQVMsaUJBQUFDLHVCQUFxQjs7O0FDRDlCLFNBQVMsV0FBQUMsZ0JBQWU7QUFDeEIsU0FBUyxjQUFBQyxvQkFBa0I7QUFDM0IsU0FBUyxZQUFBQyxXQUFVLFNBQUFDLGNBQWE7OztBQ0Z6QixJQUFNLG1CQUFtQixNQUFNO0FBQ3BDLFNBQU8sSUFBSSxLQUFLLGFBQWEsRUFBRSxPQUFPLEdBQUcsRUFBRSxRQUFRLE9BQU8sRUFBRTtBQUM5RDtBQUVPLElBQU0sZ0NBQWdDLENBQUMsV0FBNEI7QUFFeEUsTUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QixXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sT0FBTyxpQkFBaUI7QUFDOUIsTUFBSSxTQUFTLEtBQUs7QUFDaEIsV0FBTyxPQUFPLGVBQWU7QUFBQSxFQUMvQixPQUFPO0FBQ0wsV0FBTyxPQUFPLFNBQVMsRUFBRSxRQUFRLEtBQUssRUFBRSxFQUFFLFFBQVEsTUFBTSxHQUFHO0FBQUEsRUFDN0Q7QUFDRjtBQUVPLFNBQVMsa0JBQWtCLE9BQWdCO0FBQ2hELFNBQU8sVUFBVSxRQUFRLFVBQVU7QUFDckM7QUFFTyxTQUFTLG9CQUFvQixLQUFhO0FBQy9DLFFBQU0sdUJBQXVCLElBQzFCLFFBQVEsZ0JBQWdCLElBQUksRUFDNUIsUUFBUSxTQUFTLEdBQUcsRUFDcEIsUUFBUSxVQUFVLFNBQVMsRUFDM0IsUUFBUSxXQUFXLFVBQVU7QUFDaEMsU0FBTztBQUNUOzs7QUR0Qk8sSUFBZSxjQUFmLGNBQW1DQyxhQUFXO0FBQUEsRUFpQm5DLG9CQUFvQjtBQUNsQyxVQUFNLGtCQUFrQjtBQUN4QixTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQXlCLHlCQUF5QjtBQUFBLFFBQ3BELFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBRU8sa0JBQWtCLG1CQUEyQjtBQUNsRCxVQUFNLGtCQUFrQixLQUFLLFNBQVMsVUFBVSxLQUFLLE9BQUssRUFBRSxlQUFlLGlCQUFpQixLQUFLO0FBQUs7QUFFdEcsUUFBSSxLQUFLLHNCQUFzQixxQkFBcUIsQ0FBQyxnQkFBaUI7QUFDdEUsUUFBSSxVQUFVO0FBQ2QsUUFBSSxNQUFNLFFBQVEsZ0JBQWdCLEtBQUssR0FBRztBQUN4QyxnQkFBVSxnQkFBZ0IsTUFBTSxTQUFTLEtBQUssVUFBVTtBQUFBLElBQzFELE9BQU87QUFDTCxnQkFDRyxDQUFDLGtCQUFrQixLQUFLLFVBQVUsS0FDakMsQ0FBQyxrQkFBa0IsbURBQWlCLEtBQUssS0FDekMsS0FBSyxlQUFlLGdCQUFnQixTQUN0QztBQUFBLElBQ0o7QUFFQSxTQUFLLGFBQWEsT0FBTztBQUFBLEVBQzNCO0FBQUEsRUFFUSxhQUFhLE9BQWdCO0FBQ25DLFNBQUssYUFBYyxTQUFTLEtBQUssYUFBYSxVQUFZLENBQUMsU0FBUyxLQUFLLGFBQWEsU0FBVSxPQUFPO0FBQUEsRUFDekc7QUFDRjtBQS9DWTtBQUFBLEVBRFRDLFVBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxZQUFZLENBQUM7QUFBQSxHQUQ5QixZQUVWO0FBR0g7QUFBQSxFQUROQSxVQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcscUJBQXFCLENBQUM7QUFBQSxHQUp2QyxZQUtiO0FBR0c7QUFBQSxFQURUQSxVQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQVBOLFlBUVY7QUFHSDtBQUFBLEVBRE5BLFVBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFBQSxHQVZ4QixZQVdiO0FBSUM7QUFBQSxFQUZQQyxTQUFRLEVBQUUsU0FBUyxhQUFhLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDakRDLE9BQU07QUFBQSxHQWRhLFlBZVo7OztBRGhCSCxJQUFNLG1CQUFOLGNBQStCLFlBQVk7QUFBQSxFQWF2QyxTQUFTO0FBQ2hCLFdBQU9DLGdEQUE4QyxLQUFLLFVBQVU7QUFBQSxFQUN0RTtBQUFBLEVBRVUsYUFBYSxvQkFBNkU7QUFDbEcsU0FBSyxrQkFBa0IsS0FBSyxpQkFBaUI7QUFBQSxFQUMvQztBQUNGO0FBcEJhLGlCQUNLLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEZCxtQkFBTjtBQUFBLEVBRE5DLGdCQUFjLG9CQUFvQjtBQUFBLEdBQ3RCOzs7QUdMYixTQUFTLE9BQUFDLE1BQUssUUFBQUMsY0FBWTtBQUMxQixTQUFTLGlCQUFBQyx1QkFBcUI7QUFJdkIsSUFBTSxvQkFBTixjQUFnQyxZQUFZO0FBQUEsRUFBNUM7QUFBQTtBQVVMLFNBQVMsU0FBUyxNQUFNQyx1Q0FBcUMsS0FBSyxVQUFVO0FBQUE7QUFDOUU7QUFYYSxrQkFDSyxTQUFTQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRGQsb0JBQU47QUFBQSxFQUROQyxnQkFBYyxxQkFBcUI7QUFBQSxHQUN2Qjs7O0FDTGIsU0FBUyxPQUFBQyxNQUFLLFFBQUFDLGNBQVk7QUFDMUIsU0FBUyxpQkFBQUMsdUJBQXFCO0FBSXZCLElBQU0sbUJBQU4sY0FBK0IsWUFBWTtBQUFBLEVBQTNDO0FBQUE7QUFVTCxTQUFTLFNBQVMsTUFBTUMsdUNBQXFDLEtBQUssVUFBVTtBQUFBO0FBQzlFO0FBWGEsaUJBQ0ssU0FBU0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURkLG1CQUFOO0FBQUEsRUFETkMsZ0JBQWMsb0JBQW9CO0FBQUEsR0FDdEI7OztBQ0xiLFNBQVMsT0FBQUMsTUFBSyxRQUFBQyxjQUFZO0FBQzFCLFNBQVMsaUJBQWlCOzs7QUNEMUIsU0FBUyxZQUFBQyxXQUFVLFNBQUFDLGNBQWE7QUFDaEMsU0FBUyxjQUFBQyxvQkFBa0I7QUFHcEIsSUFBZSxjQUFmLGNBQW1DQyxhQUFtQztBQUFBLEVBYTNFLGNBQWM7QUFDWixVQUFNO0FBWnNELDhCQUFxQjtBQUV2QyxvQkFBVztBQUdYLG9CQUFXO0FBR3ZELFNBQVUsbUJBQXNDO0FBSzlDLFNBQUssYUFBYSxLQUFLLGdCQUFnQjtBQUFBLEVBQ3pDO0FBQUEsRUFJTyxpQkFBMEI7QUFDL0IsV0FBTyxLQUFLLFdBQVcsZUFBZTtBQUFBLEVBQ3hDO0FBQUEsRUFFTyxRQUFjO0FBQ25CLFNBQUssUUFBUTtBQUFBLEVBQ2Y7QUFBQSxFQUtBLElBQVcsa0JBQXFDO0FBQzlDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUNBLElBQUksZ0JBQWdCLE9BQTBCO0FBQzVDLFNBQUssbUJBQW1CO0FBQUEsRUFDMUI7QUFBQSxFQUVnQixvQkFBb0I7QUFDbEMsVUFBTSxrQkFBa0I7QUFFeEIsU0FBSztBQUFBLE1BQ0gsSUFBSSxZQUFZLDRCQUE0QjtBQUFBLFFBQzFDLFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBRU8sYUFBYSxPQUEwQjtBQUM1QyxTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQVksNEJBQTRCO0FBQUEsUUFDMUMsU0FBUztBQUFBLFFBQ1QsVUFBVTtBQUFBLFFBQ1YsWUFBWTtBQUFBLFFBQ1osUUFBUTtBQUFBLFVBQ04sb0JBQW9CLEtBQUs7QUFBQSxVQUN6QixVQUFVLE1BQU0sUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSTtBQUFBLFFBQ2hEO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjtBQS9Ec0IsWUFDYixpQkFBaUI7QUFDc0M7QUFBQSxFQUE3REMsVUFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLHNCQUFzQixDQUFDO0FBQUEsR0FGeEMsWUFFMEM7QUFFbEI7QUFBQSxFQUEzQ0EsVUFBUyxFQUFFLFNBQVMsTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUFBLEdBSnRCLFlBSXdCO0FBR0E7QUFBQSxFQUEzQ0EsVUFBUyxFQUFFLFNBQVMsTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUFBLEdBUHRCLFlBT3dCO0FBR2xDO0FBQUEsRUFEVEMsT0FBTTtBQUFBLEdBVGEsWUFVVjs7O0FEWFosU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsV0FBVSxTQUFBQyxjQUFhO0FBSXhDLElBQU0sNkJBQU4sY0FBeUMsWUFBWTtBQUFBLEVBQXJEO0FBQUE7QUFFTCxTQUFRLFFBQVE7QUFhaEIsU0FBUSxTQUFTO0FBQUE7QUFBQSxFQUlqQix1QkFBdUIsS0FBSyxTQUFpQjtBQUMzQyxVQUFNLGFBQWEsUUFBUSxNQUFNLEdBQUc7QUFDcEMsUUFBSSxVQUFVO0FBQ2QsZUFBVyxRQUFRLENBQUMsY0FBc0I7QUFDeEMsVUFBSSxVQUFVLFdBQVcsbUJBQW1CLEdBQUc7QUFDN0MsY0FBTSxTQUFTLFVBQVUsUUFBUSxxQkFBcUIsRUFBRTtBQUN4RCxhQUFLLFFBQVEsU0FBUyxNQUFNO0FBQzVCLGtCQUFVO0FBQUEsTUFDWjtBQUFBLElBQ0YsQ0FBQztBQUVELFFBQUksQ0FBQyxXQUFXLEtBQUssZ0JBQWdCO0FBQ25DLFlBQU0sZ0JBQWdCLEtBQUssS0FBSyxLQUFLLGlCQUFpQixFQUFFO0FBQ3hELFdBQUssUUFBUTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxJQUFJLFFBQTJCO0FBQzdCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUNBLElBQUksTUFBTSxLQUF3QjtBQUNoQyxRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLFdBQUssU0FBUztBQUNkLFlBQU0sV0FBVyxJQUFJLFNBQVM7QUFDOUIsZUFBUyxPQUFPLEtBQUssb0JBQW9CLEdBQUc7QUFDNUMsV0FBSyxXQUFXLGFBQWEsUUFBUTtBQUNyQyxXQUFLLFNBQVM7QUFBQSxJQUNoQixPQUFPO0FBQ0wsWUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFFZ0IsV0FBVztBQUN6QixVQUFNLFdBQVcsS0FBSyxXQUFXLGNBQWMsVUFBVTtBQUN6RCxRQUFJLENBQUMsU0FBVSxRQUFPO0FBRXRCLFFBQUksS0FBSyxlQUFlLEtBQUssd0JBQXdCO0FBRW5ELFdBQUssV0FBVyxZQUFZLENBQUMsQ0FBQztBQUM5QixlQUFTLGtCQUFrQixFQUFFO0FBQzdCLFlBQU0sZ0JBQ0osS0FBSyxZQUFZLFdBQVcsR0FBRyxLQUFLLEtBQUssWUFBWSxTQUFTLEdBQUcsSUFBSSxLQUFLLGNBQWMsSUFBSSxLQUFLLFdBQVc7QUFFOUcsWUFBTSxVQUFVLElBQUksT0FBTyxhQUFhO0FBQ3hDLFlBQU0sVUFBVSxTQUFTLGNBQWMsS0FBSyxRQUFRLEtBQUssU0FBUyxLQUFLO0FBRXZFLFVBQUksQ0FBQyxTQUFTO0FBRVosYUFBSyxXQUFXLFlBQVksRUFBRSxhQUFhLEtBQUssR0FBRyxLQUFLLHNCQUFzQjtBQUM5RSxpQkFBUyxrQkFBa0IsS0FBSyxzQkFBc0I7QUFBQSxNQUN4RDtBQUFBLElBQ0YsT0FBTztBQUNMLFlBQU0sVUFBVSxTQUFTLGNBQWM7QUFDdkMsV0FBSyxXQUFXLFlBQVksVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLE1BQU0sQ0FBQztBQUFBLElBQ25FO0FBRUEsV0FBTyxLQUFLLFdBQVcsTUFBTSxTQUFTLGNBQWM7QUFBQSxFQUN0RDtBQUFBLEVBRVMsaUJBQWlCO0FBQ3hCLFVBQU0sV0FBVyxLQUFLLFdBQVcsY0FBYyxVQUFVO0FBQ3pELFFBQUksQ0FBQyxTQUFVLFFBQU87QUFHdEIsVUFBTSxVQUFVLEtBQUssU0FBUztBQUM5QixRQUFJLENBQUMsU0FBUztBQUNaLGVBQVMsZUFBZTtBQUFBLElBQzFCO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFdBQW9CLFNBQVM7QUFDM0IsV0FBTztBQUFBLE1BQ0xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBWUY7QUFBQSxFQUNGO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBLGdCQUdLLEtBQUssa0JBQWtCO0FBQUE7QUFBQTtBQUFBLHFCQUdsQixHQUFJO0FBQUEsb0JBQ0wsV0FBUyxNQUFNLHlCQUF5QixDQUFDO0FBQUEsa0JBQzNDLEtBQUssV0FBVztBQUFBLG1CQUNmLEtBQUssV0FBVztBQUFBLGlCQUNsQixDQUFDLFVBQXNCO0FBQzlCLFdBQUssZUFBZTtBQUFBLElBQ3RCLENBQUM7QUFBQSx1QkFDYyxVQUFVLEtBQUssa0JBQWtCLEtBQUssa0JBQWtCLE1BQVMsQ0FBQztBQUFBLGdCQUN6RSxLQUFLLEtBQUs7QUFBQSxxQkFDTCxLQUFLLFFBQVE7QUFBQSxxQkFDYixLQUFLLFFBQVE7QUFBQSxpQkFDakIsS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUUxQjtBQUFBLEVBRVUsWUFBWSxPQUFjO0FBQ2xDLFFBQUksS0FBSyxZQUFZLEtBQUssU0FBVTtBQUNwQyxVQUFNLFFBQVEsTUFBTTtBQUNwQixTQUFLLGtCQUFrQixNQUFNLEtBQUs7QUFDbEMsUUFBSSxLQUFLLFdBQVcsTUFBTSxPQUFPO0FBQy9CLFdBQUssUUFBUSxNQUFNO0FBQ25CLFlBQU0sVUFBVSxLQUFLLFNBQVM7QUFDOUIsV0FBSyxhQUFhLE1BQU0sS0FBSztBQUFBLElBQy9CO0FBQUEsRUFDRjtBQUFBLEVBRVEsa0JBQWtCLE1BQWM7QUFDdEMsU0FBSyxhQUFhLFNBQVMsU0FBUyxLQUFLLFNBQVMsT0FBTztBQUFBLEVBQzNEO0FBQ0Y7QUE3SVU7QUFBQSxFQURQQyxPQUFNO0FBQUEsR0FESSwyQkFFSDtBQUdrRDtBQUFBLEVBQXpEQyxVQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsa0JBQWtCLENBQUM7QUFBQSxHQUw3QywyQkFLK0M7QUFFSDtBQUFBLEVBQXREQSxVQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsZUFBZSxDQUFDO0FBQUEsR0FQMUMsMkJBTzRDO0FBR0k7QUFBQSxFQUExREEsVUFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLG1CQUFtQixDQUFDO0FBQUEsR0FWOUMsMkJBVWdEO0FBRVE7QUFBQSxFQUFsRUEsVUFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLDJCQUEyQixDQUFDO0FBQUEsR0FadEQsMkJBWXdEO0FBRzNEO0FBQUEsRUFEUEQsT0FBTTtBQUFBLEdBZEksMkJBZUg7QUFFd0M7QUFBQSxFQUEvQ0MsVUFBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLFFBQVEsQ0FBQztBQUFBLEdBakJuQywyQkFpQnFDO0FBRWhEO0FBQUEsRUFEQyxNQUFNLFlBQVk7QUFBQSxHQWxCUiwyQkFtQlg7QUFuQlcsNkJBQU47QUFBQSxFQUROQyxnQkFBYywrQkFBK0I7QUFBQSxHQUNqQzs7O0FFUGIsU0FBeUIsUUFBQUMsY0FBWTtBQUNyQyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxZQUFVLFNBQUFDLGNBQWE7QUFDL0MsU0FBUyxhQUFBQyxrQkFBaUI7QUFDMUIsU0FBUyxpQkFBaUI7OztBQ0gxQixTQUFTLE9BQUFDLFlBQVc7QUFFcEIsSUFBTyw0Q0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FETVIsSUFBTSwwQkFBTixjQUFzQyxZQUFZO0FBQUEsRUFBbEQ7QUFBQTtBQVlMLFNBQVEsU0FBUztBQUVqQixvQkFBVyxVQUE0QjtBQUFBO0FBQUEsRUFFdkMsSUFBSSxRQUEyQjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFDQSxJQUFJLE1BQU0sS0FBd0I7QUFDaEMsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixXQUFLLFNBQVM7QUFDZCxZQUFNLFdBQVcsSUFBSSxTQUFTO0FBQzlCLGVBQVMsT0FBTyxLQUFLLG9CQUFvQixHQUFHO0FBQzVDLFdBQUssV0FBVyxhQUFhLFFBQVE7QUFDckMsV0FBSyxTQUFTO0FBQUEsSUFDaEIsT0FBTztBQUNMLFlBQU0sSUFBSSxNQUFNLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUFBLEVBRWdCLFdBQVc7QUFDekIsVUFBTSxRQUFRLEtBQUssV0FBVyxjQUFjLE9BQU87QUFDbkQsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUNuQixRQUFJLEtBQUssZUFBZSxLQUFLLHdCQUF3QjtBQUVuRCxXQUFLLFdBQVcsWUFBWSxDQUFDLENBQUM7QUFDOUIsWUFBTSxrQkFBa0IsRUFBRTtBQUMxQixZQUFNLFVBQVUsTUFBTSxjQUFjO0FBQ3BDLFVBQUksQ0FBQyxTQUFTO0FBRVosYUFBSyxXQUFXLFlBQVksRUFBRSxhQUFhLEtBQUssR0FBRyxLQUFLLHNCQUFzQjtBQUM5RSxjQUFNLGtCQUFrQixLQUFLLHNCQUFzQjtBQUFBLE1BQ3JEO0FBQUEsSUFDRixPQUFPO0FBQ0wsWUFBTSxVQUFVLE1BQU0sY0FBYztBQUNwQyxXQUFLLFdBQVcsWUFBWSxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsTUFBTSxDQUFDO0FBQUEsSUFDbkU7QUFDQSxXQUFPLEtBQUssV0FBVyxNQUFNLE1BQU0sY0FBYztBQUFBLEVBQ25EO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBLGdCQUdLLEtBQUssa0JBQWtCO0FBQUE7QUFBQTtBQUFBLGlCQUd0QixDQUFDLFVBQXNCO0FBQzlCLFdBQUssZUFBZTtBQUFBLElBQ3RCLENBQUM7QUFBQSxvQkFDVyxXQUFTLE1BQU0seUJBQXlCLENBQUM7QUFBQSxrQkFDM0MsS0FBSyxXQUFXO0FBQUEsbUJBQ2YsS0FBSyxXQUFXO0FBQUEsZ0JBQ25CLEtBQUssZUFBZSxXQUFXLFdBQVcsTUFBTTtBQUFBLHVCQUN6Q0MsV0FBVSxLQUFLLGtCQUFrQixLQUFLLGtCQUFrQixNQUFTLENBQUM7QUFBQSxrQkFDdkUsS0FBSyxNQUFNO0FBQUEsbUJBQ1ZBLFdBQVUsS0FBSyxjQUFjLEtBQUssY0FBYyxNQUFTLENBQUM7QUFBQSxvQkFDekQsR0FBSTtBQUFBLHFCQUNILEtBQUssUUFBUTtBQUFBLHFCQUNiLEtBQUssUUFBUTtBQUFBO0FBQUEsNEJBRU4sS0FBSyxnQkFBZ0I7QUFBQTtBQUFBLEVBRS9DO0FBQUEsRUFDVSxZQUFZLE9BQWM7QUFDbEMsUUFBSSxLQUFLLFlBQVksS0FBSyxTQUFVO0FBQ3BDLFVBQU0sUUFBUSxNQUFNO0FBQ3BCLFNBQUssa0JBQWtCLE1BQU0sS0FBSztBQUNsQyxRQUFJLEtBQUssV0FBVyxNQUFNLE9BQU87QUFDL0IsV0FBSyxRQUFRLE1BQU07QUFDbkIsWUFBTSxVQUFVLEtBQUssU0FBUztBQUM5QixXQUFLLGFBQWEsTUFBTSxLQUFLO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQUEsRUFFUyxpQkFBaUI7QUFDeEIsVUFBTSxRQUFRLEtBQUssV0FBVyxjQUFjLE9BQU87QUFDbkQsUUFBSSxDQUFDLE1BQU8sUUFBTztBQUduQixVQUFNLFVBQVUsS0FBSyxTQUFTO0FBQzlCLFFBQUksQ0FBQyxTQUFTO0FBQ1osWUFBTSxlQUFlO0FBQUEsSUFDdkI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsUUFBYztBQUNaLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQUEsRUFFUSxrQkFBa0IsTUFBYztBQUN0QyxTQUFLLGFBQWEsU0FBUyxTQUFTLEtBQUssU0FBUyxPQUFPO0FBQUEsRUFDM0Q7QUFDRjtBQXpHYSx3QkFDSixTQUF5QjtBQUUwQjtBQUFBLEVBQXpEQyxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsa0JBQWtCLENBQUM7QUFBQSxHQUg3Qyx3QkFHK0M7QUFFSDtBQUFBLEVBQXREQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsZUFBZSxDQUFDO0FBQUEsR0FMMUMsd0JBSzRDO0FBRUk7QUFBQSxFQUExREEsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLG1CQUFtQixDQUFDO0FBQUEsR0FQOUMsd0JBT2dEO0FBRVE7QUFBQSxFQUFsRUEsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLDJCQUEyQixDQUFDO0FBQUEsR0FUdEQsd0JBU3dEO0FBRzNEO0FBQUEsRUFEUEMsT0FBTTtBQUFBLEdBWEksd0JBWUg7QUFaRywwQkFBTjtBQUFBLEVBRE5DLGdCQUFjLDRCQUE0QjtBQUFBLEdBQzlCOzs7QUVSYixTQUFTLFFBQUFDLGNBQXdCO0FBQ2pDLFNBQVMsaUJBQUFDLHVCQUFxQjs7O0FDRDlCLFNBQVMsWUFBQUMsWUFBVSxhQUFhO0FBZXpCLElBQU0sZUFBZSxDQUFxQyxZQUFlLGFBQXFCO0FBQUEsRUFDbkcsTUFBZSw0QkFBNEIsV0FBdUM7QUFBQSxJQUFsRjtBQUFBO0FBQ0UsV0FBVSxrQkFBNEIsQ0FBQztBQU12QyxXQUFPLGFBQWE7QUFHcEIsV0FBTyxhQUFhO0FBUXBCLFdBQVUsd0JBQXdCLENBQUMsR0FBWSxhQUFzQjtBQUNuRSxhQUFLLGdCQUFnQixRQUFRLFFBQU8sR0FBRyxXQUFXLFFBQVM7QUFBQSxNQUM3RDtBQUdBLFdBQVUsd0JBQXdCLENBQUMsR0FBWSxhQUFzQjtBQUNuRSxhQUFLLGdCQUFnQixRQUFRLFlBQVcsT0FBTyxXQUFXLFFBQVM7QUFBQSxNQUNyRTtBQUVBLFdBQVEsU0FBNEI7QUFBQTtBQUFBLElBZDFCLHdCQUF3QixXQUFtQixXQUFtQjtBQUN0RSxXQUFLLG9CQUFvQjtBQUFBLElBQzNCO0FBQUEsSUFjQSxJQUFJLFFBQTJCO0FBQzdCLGFBQU8sTUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJLEtBQUssT0FBTyxLQUFLLEdBQUcsSUFBSSxLQUFLO0FBQUEsSUFDbkU7QUFBQSxJQUVBLElBQUksTUFBTSxLQUF3QjtBQUNoQyxVQUFJLEtBQUssYUFBYSxLQUFLLE9BQU8sUUFBUSxVQUFVO0FBQ2xELGFBQUssU0FBUyxJQUFJLE1BQU0sR0FBRztBQUFBLE1BQzdCLE9BQU87QUFDTCxhQUFLLFNBQVM7QUFBQSxNQUNoQjtBQUVBLFVBQUksTUFBTSxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQzlCLGNBQU0sV0FBVyxJQUFJLFNBQVM7QUFDOUIsYUFBSyxPQUFPLFFBQVEsY0FBWTtBQUM5QixtQkFBUyxPQUFPLEtBQUssb0JBQW9CLFFBQVE7QUFBQSxRQUNuRCxDQUFDO0FBQ0QsYUFBSyxXQUFXLGFBQWEsUUFBUTtBQUFBLE1BQ3ZDLE9BQU87QUFFTCxhQUFLLFdBQVcsYUFBYSxLQUFLLE1BQU07QUFBQSxNQUMxQztBQUNBLFdBQUssdUJBQXVCO0FBQUEsSUFDOUI7QUFBQSxJQUVBLElBQVcsa0JBQXFDO0FBQzlDLGFBQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUVBLElBQVcsZ0JBQWdCLE9BQTBCO0FBQ25ELFdBQUssbUJBQW1CO0FBQ3hCLFlBQU0sZ0JBQWdCLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7QUFDM0QsV0FBSyxnQkFBZ0IsUUFBUSxZQUFVO0FBQ3JDLGVBQU8sVUFBVSxPQUFPLE9BQU8sa0JBQWtCO0FBQ2pELGVBQU8sVUFBVSxPQUFPLE9BQU8sb0JBQW9CO0FBQ25ELFlBQUksY0FBYyxTQUFTLEdBQUc7QUFDNUIsY0FBSSxjQUFjLFNBQVMsT0FBTyxVQUFVLEdBQUc7QUFDN0MsbUJBQU8sVUFBVSxPQUFPLElBQUksa0JBQWtCO0FBQUEsVUFDaEQsT0FBTztBQUNMLG1CQUFPLFVBQVUsT0FBTyxJQUFJLG9CQUFvQjtBQUFBLFVBQ2xEO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVTLG9CQUFvQjtBQUMzQixZQUFNLGtCQUFrQjtBQUN4QixXQUFLLGlCQUFpQixZQUFZLFFBQVEsSUFBSSxLQUFLLHNCQUFzQjtBQUN6RSxXQUFLLGlCQUFpQixjQUFjLFFBQVEsSUFBSSxLQUFLLHdCQUF3QjtBQUM3RSxXQUFLLGlCQUFpQixZQUFZLFFBQVEsSUFBSSxLQUFLLDZCQUE2QjtBQUFBLElBQ2xGO0FBQUEsSUFFUyx1QkFBdUI7QUFDOUIsWUFBTSxxQkFBcUI7QUFDM0IsV0FBSyxvQkFBb0IsWUFBWSxRQUFRLElBQUksS0FBSyxzQkFBc0I7QUFDNUUsV0FBSyxvQkFBb0IsY0FBYyxRQUFRLElBQUksS0FBSyx3QkFBd0I7QUFDaEYsV0FBSyxvQkFBb0IsWUFBWSxRQUFRLElBQUksS0FBSyw2QkFBNkI7QUFBQSxJQUNyRjtBQUFBLElBRU8sV0FBb0I7QUFDekIsWUFBTSxrQkFBa0IsS0FBSyxnQkFBZ0IsT0FBTyxZQUFVLEtBQUssa0JBQWtCLE1BQU0sQ0FBQztBQUM1RixZQUFNLGdCQUFnQixnQkFBZ0I7QUFDdEMsVUFBSSxVQUFVO0FBQ2QsVUFBSSxrQkFBa0I7QUFDdEIsVUFBSSxLQUFLLGVBQWUsS0FBSyxnQkFBZ0IsS0FBSyxZQUFZO0FBQzVELGtCQUFVO0FBQ1YsMEJBQWtCLEtBQUssUUFBUSx3QkFBd0IsMEJBQTBCLEtBQUssVUFBVTtBQUFBLE1BQ2xHLFdBQVcsZ0JBQWdCLEtBQUssWUFBWTtBQUMxQyxrQkFBVTtBQUNWLDBCQUFrQixLQUFLLFFBQVEsd0JBQXdCLDRCQUE0QixLQUFLLFVBQVU7QUFBQSxNQUNwRztBQUVBLFVBQUksZ0JBQWdCLFNBQVMsR0FBRztBQUM5QixhQUFLLFdBQVc7QUFBQSxVQUNkLFVBQVUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxLQUFLO0FBQUEsVUFDbkM7QUFBQSxVQUNBLGdCQUFnQixnQkFBZ0IsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsS0FBSztBQUFBLFFBQ25FO0FBQUEsTUFDRjtBQUNBLFdBQUssZUFBZTtBQUNwQixhQUFPO0FBQUEsSUFDVDtBQUFBLElBRVMsaUJBQWlCO0FBQ3hCLFVBQUksS0FBSywyQkFBMkI7QUFDbEMsWUFBSSxDQUFDLEtBQUssV0FBVyxTQUFTLE9BQU87QUFDbkMsZUFBSywwQkFBMEIsY0FBYyxLQUFLLFdBQVc7QUFDN0QsZUFBSywwQkFBMEIsTUFBTSxVQUFVO0FBQUEsUUFDakQsT0FBTztBQUNMLGVBQUssMEJBQTBCLGNBQWM7QUFDN0MsZUFBSywwQkFBMEIsTUFBTSxVQUFVO0FBQUEsUUFDakQ7QUFBQSxNQUNGO0FBQ0EsYUFBTyxLQUFLLFdBQVcsU0FBUztBQUFBLElBQ2xDO0FBQUEsSUFFUSx1QkFBdUIsT0FBb0I7QUFDakQsWUFBTSxnQkFBZ0I7QUFDdEIsWUFBTSxnQkFBZ0IsTUFBTTtBQUM1QixvQkFBYyxXQUFXLEtBQUs7QUFFOUIsV0FBSyxnQkFBZ0IsS0FBSyxhQUFhO0FBQ3ZDLFdBQUssY0FBYyxhQUFhO0FBQUEsSUFDbEM7QUFBQSxJQUVRLHlCQUF5QixPQUFvQjtBQUNuRCxZQUFNLGdCQUFnQjtBQUN0QixZQUFNLGdCQUFnQixNQUFNO0FBQzVCLFdBQUssa0JBQWtCLEtBQUssZ0JBQWdCLE9BQU8sWUFBVSxXQUFXLGFBQWE7QUFBQSxJQUN2RjtBQUFBLElBRVEsc0JBQXNCO0FBQzVCLFdBQUssZ0JBQWdCLFFBQVEsWUFBVTtBQUNyQyxhQUFLLGNBQWMsTUFBTTtBQUFBLE1BQzNCLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFUSxjQUFjLGVBQXVCO0FBQzNDLFdBQUssV0FBVyxZQUFZLEtBQUssZUFBZSxJQUFJLGdCQUFnQjtBQUVwRSxvQkFBYyxVQUFVLE9BQU8sS0FBSyxlQUFlLElBQUksVUFBVTtBQUNqRSxvQkFBYyxVQUFVLE9BQU8sSUFBSSxjQUFjLFVBQVUsSUFBSTtBQUFBLElBQ2pFO0FBQUEsSUFFVSw4QkFBOEIsT0FBNEM7QUFDbEYsV0FBSyxxQkFBcUIsTUFBTSxNQUFnQjtBQUNoRCxVQUFJLEtBQUssZUFBZSxHQUFHO0FBQ3pCLGFBQUssZ0JBQWdCLFFBQVEsWUFBVTtBQUNyQyxjQUFJLE9BQU8sZUFBZSxNQUFNLE9BQU8sWUFBWTtBQUNqRCxpQkFBSyxrQkFBa0IsUUFBUSxLQUFLO0FBQUEsVUFDdEM7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQ0EsV0FBSyx1QkFBdUI7QUFBQSxJQUM5QjtBQUFBLElBRVEsa0JBQWtCLFFBQWdCLFNBQWtCO0FBcExoRTtBQXFMTSxXQUFJLFlBQU8sY0FBUCxtQkFBa0IsUUFBUTtBQUM1QixZQUFJLFNBQVM7QUFDWCxpQkFBTyxVQUFVLE9BQU8sSUFBSSxXQUFXO0FBQ3ZDLGlCQUFPLFVBQVUsY0FBYztBQUFBLFFBQ2pDLE9BQU87QUFDTCxpQkFBTyxVQUFVLE9BQU8sT0FBTyxXQUFXO0FBQzFDLGlCQUFPLFVBQVUsY0FBYztBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVRLGtCQUFrQixRQUF5QjtBQUNqRCxhQUFPLE9BQU8sVUFBVSxPQUFPLElBQUksV0FBVztBQUFBLElBQ2hEO0FBQUEsSUFFUSxxQkFBcUIsUUFBZ0I7QUFDM0MsWUFBTSxVQUFVLEtBQUssa0JBQWtCLE1BQU07QUFDN0MsV0FBSyxrQkFBa0IsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN6QztBQUFBLElBRVEseUJBQXlCO0FBQy9CLFlBQU0sa0JBQWtCLEtBQUssZ0JBQWdCLE9BQU8sWUFBVSxLQUFLLGtCQUFrQixNQUFNLENBQUM7QUFDNUYsWUFBTSxzQkFBc0IsZ0JBQWdCLElBQUksWUFBVSxPQUFPLFVBQVU7QUFFM0UsV0FBSyxRQUFRLEtBQUssZUFBZSxJQUFJLG9CQUFvQixDQUFDLEtBQUssS0FBSztBQUNwRSxXQUFLLFNBQVM7QUFDZCxXQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtRLHlCQUF5QjtBQUMvQixZQUFNLGdCQUFnQixNQUFNLFFBQVEsS0FBSyxNQUFNLElBQUksS0FBSyxTQUFTLENBQUMsS0FBSyxNQUFNO0FBQzdFLFdBQUssZ0JBQWdCLFFBQVEsWUFBVTtBQUNyQyxjQUFNLGFBQWEsY0FBYyxTQUFTLE9BQU8sVUFBVTtBQUMzRCxhQUFLLGtCQUFrQixRQUFRLFVBQVU7QUFBQSxNQUMzQyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUF4TVU7QUFBQSxJQURQLE1BQU0sb0JBQW9CO0FBQUEsS0FIZCxvQkFJTDtBQUdEO0FBQUEsSUFETkMsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLGNBQWMsQ0FBQztBQUFBLEtBTnZDLG9CQU9OO0FBR0E7QUFBQSxJQUROQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsY0FBYyxDQUFDO0FBQUEsS0FUdkMsb0JBVU47QUFHRztBQUFBLElBRFQsTUFBTSxjQUFjLEVBQUUsc0JBQXNCLEtBQUssQ0FBQztBQUFBLEtBWnRDLG9CQWFIO0FBS0E7QUFBQSxJQURULE1BQU0sWUFBWSxFQUFFLHNCQUFzQixLQUFLLENBQUM7QUFBQSxLQWpCcEMsb0JBa0JIO0FBS0E7QUFBQSxJQURULE1BQU0sWUFBWSxFQUFFLHNCQUFzQixLQUFLLENBQUM7QUFBQSxLQXRCcEMsb0JBdUJIO0FBc0xaLFNBQU87QUFDVDs7O0FEeE5PLElBQU0sd0JBQU4sY0FBb0MsYUFBYSxhQUFhLGFBQWEsRUFBRTtBQUFBLEVBQTdFO0FBQUE7QUFNTCxTQUFTLFNBQVMsTUFBTUM7QUFBQTtBQUFBLEVBTGYsb0JBQW9CO0FBQzNCLFVBQU0sa0JBQWtCO0FBQ3hCLFNBQUssYUFBYSwyQkFBMkIsRUFBRTtBQUFBLEVBQ2pEO0FBR0Y7QUFQYSx3QkFBTjtBQUFBLEVBRE5DLGdCQUFjLHlCQUF5QjtBQUFBLEdBQzNCOzs7QUVOYixTQUFTLE9BQUFDLE9BQUssUUFBQUMsY0FBWTtBQUMxQixTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxZQUFVLFNBQUFDLGNBQWE7QUFDL0MsU0FBUyxrQkFBa0I7QUFVcEIsSUFBTSw2QkFBTixjQUF5QyxZQUFZO0FBQUEsRUFBckQ7QUFBQTtBQTBDSSxtQkFBd0IsQ0FBQztBQUV6Qix5QkFBd0I7QUFHakMsc0JBQXFCO0FBQUE7QUFBQSxFQTlDckIsV0FBb0IsU0FBUztBQUMzQixXQUFPO0FBQUEsTUFDTEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBdUJGO0FBQUEsRUFDRjtBQUFBLEVBc0JTLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSx1Q0FDNEIsS0FBSyxjQUFjLGdCQUFnQixLQUFLLFFBQVEsZ0JBQWdCLEtBQUssUUFBUTtBQUFBLFVBQzFHLEtBQUssUUFBUTtBQUFBLE1BQ2IsWUFBVUE7QUFBQSw2QkFDUyxPQUFPLEtBQUssZ0JBQWdCLE9BQU8sUUFBUSxLQUFLLFdBQVcsT0FBTyxXQUFXLENBQUM7QUFBQTtBQUFBLElBRW5HLENBQUM7QUFBQTtBQUFBO0FBQUEsUUFHRCxXQUFXLEtBQUssYUFBYSxDQUFDO0FBQUE7QUFBQSxFQUVwQztBQUFBLEVBRUEsb0JBQW9CO0FBQ2xCLFVBQU0sa0JBQWtCO0FBQ3hCLFNBQUssaUJBQWlCLHdCQUF3QixLQUFLLGNBQWM7QUFDakUsVUFBTSxVQUFVLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixtQkFBbUIsQ0FBQztBQUNyRSxTQUFLLFVBQVU7QUFBQSxNQUNiO0FBQUEsUUFDRSxhQUFhLEtBQUs7QUFBQSxRQUNsQixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsTUFDWjtBQUFBLE1BQ0EsR0FBRyxRQUFRLElBQUksYUFBVztBQUFBLFFBQ3hCLGFBQWEsT0FBTztBQUFBLFFBQ3BCLE9BQU8sT0FBTyxhQUFhLFlBQVk7QUFBQSxRQUN2QyxVQUFVO0FBQUEsTUFDWixFQUFFO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLHVCQUF1QjtBQUNyQixTQUFLLG9CQUFvQix3QkFBd0IsS0FBSyxjQUFjO0FBQUEsRUFDdEU7QUFBQSxFQUVPLFdBQW9CO0FBQ3pCLFVBQU0saUJBQWlCLEtBQUssUUFBUSxLQUFLLFlBQVUsT0FBTyxRQUFRO0FBQ2xFLFdBQU8saUJBQWlCLGVBQWUsVUFBVSxLQUFLO0FBQUEsRUFDeEQ7QUFBQSxFQUVPLFFBQVE7QUFDYixTQUFLLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLE1BQU8saUNBQUssU0FBTCxFQUFhLFVBQVUsTUFBTSxFQUFFLEVBQUU7QUFBQSxFQUNuRjtBQUFBLEVBRUEsSUFBVyxNQUFNLE9BQWU7QUFDOUIsU0FBSyxVQUFVLEtBQUssUUFBUSxJQUFJLFlBQVU7QUFDeEMsVUFBSSxVQUFVLE9BQU8sT0FBTztBQUMxQixlQUFPLFdBQVc7QUFBQSxNQUNwQjtBQUNBLGFBQU87QUFBQSxJQUNULENBQUM7QUFBQSxFQUNIO0FBQUEsRUFDQSxJQUFJLFFBQWdCO0FBQ2xCLFdBQU8sS0FBSyxRQUFRLEtBQUssWUFBVSxPQUFPLFFBQVEsRUFBRTtBQUFBLEVBQ3REO0FBQUEsRUFFQSxJQUFJLGdCQUFnQixPQUEwQjtBQUM1QyxRQUFJLFVBQVUsSUFBSTtBQUNoQixXQUFLLGdCQUFnQjtBQUNyQjtBQUFBLElBQ0Y7QUFDQSxTQUFLLGdCQUFnQiwrQkFDbkIsS0FBSyxRQUFRLEtBQUssWUFBVSxVQUFVLE9BQU8sS0FBSyxFQUFFLFdBQ3REO0FBQUEsRUFDRjtBQUFBLEVBRU8sZUFBZSxPQUFjO0FBQ2xDLFVBQU0sc0JBQXVCLE1BQU0sT0FBNkI7QUFDaEUsU0FBSyxVQUFVLEtBQUssUUFBUSxJQUFJLFlBQVcsaUNBQUssU0FBTCxFQUFhLFVBQVUsT0FBTyxVQUFVLG9CQUFvQixFQUFFO0FBQ3pHLFNBQUssYUFBYSxtQkFBbUI7QUFBQSxFQUN2QztBQUNGO0FBekhhLDJCQTZCRyxrQkFBa0I7QUFBQSxFQUM5QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBRVM7QUFBQSxFQUFSQyxPQUFNO0FBQUEsR0ExQ0ksMkJBMENGO0FBRUE7QUFBQSxFQUFSQSxPQUFNO0FBQUEsR0E1Q0ksMkJBNENGO0FBR1Q7QUFBQSxFQURDQyxXQUFTLEVBQUUsV0FBVyxlQUFlLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0E5Q3pDLDJCQStDWDtBQS9DVyw2QkFBTjtBQUFBLEVBRE5DLGdCQUFjLCtCQUErQjtBQUFBLEdBQ2pDOzs7QUNYYixTQUFTLFFBQUFDLGNBQXdCO0FBQ2pDLFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLGtCQUFnQjs7O0FDWXhDLFNBQVMsWUFBQUMsa0JBQWdCO0FBTWxCLElBQU0sZUFBZSxDQUFxQyxZQUFlLGFBQXFCO0FBQUEsRUFDbkcsTUFBZSx1QkFBdUIsV0FBVztBQUFBLElBQWpEO0FBQUE7QUFDRSxXQUFRLFdBQW9CO0FBQUE7QUFBQSxJQVE1QixJQUFJLFFBQVEsT0FBZ0I7QUFDMUIsWUFBTSxXQUFXLEtBQUs7QUFDdEIsV0FBSyxXQUFXO0FBQ2hCLFVBQUksT0FBTztBQUNULGFBQUssZ0JBQWdCO0FBQUEsTUFDdkIsT0FBTztBQUNMLGFBQUsscUJBQXFCO0FBQUEsTUFDNUI7QUFDQSxXQUFLLGNBQWMsV0FBVyxRQUFRO0FBQUEsSUFDeEM7QUFBQSxJQUVBLElBQUksVUFBbUI7QUFDckIsYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBRUEsb0JBQW9CO0FBQ2xCLFlBQU0sa0JBQWtCO0FBR3hCLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGFBQUssZ0JBQWdCO0FBQUEsTUFDdkIsT0FBTztBQUNMLGFBQUsscUJBQXFCO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFUSxrQkFBa0I7QUFDeEIsWUFBTSxVQUFVLE1BQU0sS0FBSyxLQUFLLGlCQUE4QixRQUFRLENBQUM7QUFDdkUsWUFBTSxnQkFBZ0UsQ0FBQztBQUN2RSxZQUFNLG1CQUF1QyxDQUFDO0FBRzlDLGNBQVEsUUFBUSxDQUFDLFFBQVEsVUFBVTtBQUNqQyxZQUFJLE9BQU8sYUFBYSxPQUFPLEdBQUc7QUFDaEMsd0JBQWMsS0FBSyxFQUFFLFNBQVMsUUFBUSxNQUFhLENBQUM7QUFBQSxRQUN0RCxPQUFPO0FBQ0wsMkJBQWlCLEtBQUssTUFBTTtBQUFBLFFBQzlCO0FBQUEsTUFDRixDQUFDO0FBR0QsVUFBSSxpQkFBaUIsVUFBVSxHQUFHO0FBQ2hDLGdCQUFRLEtBQUssaUVBQWlFO0FBQzlFO0FBQUEsTUFDRjtBQUVBLFVBQUksYUFBYTtBQUNqQixZQUFNLGNBQWM7QUFDcEIsVUFBSSxVQUFVO0FBR2QsWUFBTSxnQkFBZ0IsQ0FBQyxHQUFHLGdCQUFnQjtBQUcxQyxhQUFPLENBQUMsY0FBYyxVQUFVLGFBQWE7QUFDM0M7QUFHQSxpQkFBUyxJQUFJLGlCQUFpQixTQUFTLEdBQUcsSUFBSSxHQUFHLEtBQUs7QUFDcEQsZ0JBQU0sSUFBSSxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssSUFBSSxFQUFFO0FBQzVDLFdBQUMsaUJBQWlCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUM7QUFBQSxRQUN4RjtBQUdBLHFCQUFhLENBQUMsaUJBQWlCLE1BQU0sQ0FBQyxRQUFRLFVBQVUsV0FBVyxjQUFjLEtBQUssQ0FBQztBQUV2RixZQUFJLFdBQVk7QUFBQSxNQUNsQjtBQUVBLFVBQUksQ0FBQyxZQUFZO0FBQ2YsZ0JBQVEsS0FBSyx3REFBd0Q7QUFBQSxNQUN2RTtBQUdBLFVBQUksUUFBUTtBQUNaLGNBQVEsUUFBUSxDQUFDLFFBQXFCLFVBQVU7QUFDOUMsWUFBSSxPQUFPLGFBQWEsT0FBTyxHQUFHO0FBQ2hDLGlCQUFPLE1BQU0sWUFBWSxTQUFTLE9BQU8sT0FBTyxDQUFDO0FBQUEsUUFDbkQsT0FBTztBQUNMLGdCQUFNLGlCQUFpQixpQkFBaUIsTUFBTTtBQUM5Qyx5QkFBZ0IsTUFBTSxZQUFZLFNBQVMsT0FBTyxPQUFPLENBQUM7QUFBQSxRQUM1RDtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUVRLHVCQUF1QjtBQUM3QixZQUFNLFVBQVUsTUFBTSxLQUFLLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDO0FBQ3JFLGNBQVEsUUFBUSxDQUFDLFFBQVEsVUFBVTtBQUNqQyxlQUFPLE1BQU0sWUFBWSxTQUFTLFNBQVM7QUFBQSxNQUM3QyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUEzRk07QUFBQSxJQUxIQyxXQUFTO0FBQUEsTUFDUixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsSUFDYixDQUFDO0FBQUEsS0FSWSxlQVNUO0FBNEZOLFNBQU87QUFDVDtBQUVBLElBQU0sMkJBQTJCO0FBQUEsRUFDL0IsY0FBYyxPQUErQjtBQUMzQyxXQUFPLFVBQVU7QUFBQSxFQUNuQjtBQUFBLEVBQ0EsWUFBWSxPQUF3QjtBQUNsQyxXQUFPLFFBQVEsU0FBUztBQUFBLEVBQzFCO0FBQ0Y7OztBQ3RIQSxTQUFTLFlBQUFDLGtCQUFnQjtBQVdsQixJQUFNLGtCQUFrQixDQUFxQyxZQUFlLGFBQXFCO0FBQUEsRUFDdEcsTUFBZSwwQkFBMEIsV0FBVztBQUFBLElBQXBEO0FBQUE7QUFDRSxXQUFRLFdBQXFCLENBQUM7QUFDOUIsV0FBUSxhQUFhLENBQUMsc0JBQXNCLDBCQUEwQix3QkFBd0I7QUFDOUYsV0FBUSxvQkFBb0IsQ0FBQyw0QkFBNEIsK0JBQStCO0FBQUE7QUFBQSxJQU14RixJQUFJLE1BQU0sT0FBZTtBQUN2QixVQUFJLENBQUMsT0FBTztBQUNWO0FBQUEsTUFDRjtBQUVBLFdBQUssV0FBVyxNQUFNLE1BQU0sR0FBRztBQUUvQixXQUFLLFdBQVc7QUFBQSxJQUVsQjtBQUFBLElBQ0EsSUFBSSxRQUFnQjtBQTdDeEI7QUE4Q00sZUFBTyxVQUFLLGFBQUwsbUJBQWUsS0FBSyxTQUFRO0FBQUEsSUFDckM7QUFBQSxJQUVtQixRQUFRLG9CQUEwQztBQUNuRSxZQUFNLFFBQVEsa0JBQWtCO0FBQ2hDLFVBQUksbUJBQW1CLElBQUksU0FBUyxHQUFHO0FBQ3JDLGFBQUssV0FBVztBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBRVEsYUFBYTtBQUNuQixZQUFNLHFCQUFxQixLQUFLLFNBQVM7QUFBQSxRQUN2QyxTQUFPLEtBQUssV0FBVyxTQUFTLEdBQUcsS0FBSyxLQUFLLGtCQUFrQixTQUFTLEdBQXNCO0FBQUEsTUFDaEc7QUFDQSxZQUFNLFdBQVcsV0FBUztBQUN4QixlQUFPLENBQUMsTUFBTSxDQUFDLEtBQUs7QUFBQSxNQUN0QjtBQUNBLFVBQUksb0JBQW9CO0FBQ3RCLGNBQU0saUJBQWlCLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixtQkFBbUIsQ0FBQyxFQUFFLElBQUksT0FBSyxDQUFvQjtBQUMzRyxjQUFNLFVBQVUsZUFDYixJQUFJLENBQUMsUUFBcUIsVUFBVTtBQUNuQyxpQkFBTyxFQUFFLElBQUksUUFBUSxPQUFPLFNBQVMsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sTUFBTSxRQUFRLFFBQVEsRUFBRTtBQUFBLFFBQzdGLENBQUMsRUFDQSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFDaEMsSUFBSSxZQUFVLE9BQU8sRUFBRTtBQUMxQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxVQUFDLFFBQVEsQ0FBQyxFQUFzQixTQUFTLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQSxRQUMvRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDUSxVQUFVLE9BQWU7QUFDL0IsVUFBSSxZQUFZLEtBQUssU0FBUyxPQUFPLE9BQUssS0FBSyxXQUFXLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSTtBQUMzRSxZQUFNLGtCQUFrQixLQUFLLFNBQVMsT0FBTyxPQUFLLEtBQUssa0JBQWtCLFNBQVMsQ0FBb0IsQ0FBQyxFQUFFLElBQUk7QUFFN0csVUFBSSxDQUFDLGFBQWEsaUJBQWlCO0FBRWpDLG9CQUFZO0FBQUEsTUFDZDtBQUNBLFVBQUksUUFBUTtBQUNaLGNBQVEsV0FBVztBQUFBLFFBQ2pCLEtBQUs7QUFDSCxrQkFBUSxHQUFHLEtBQUs7QUFDaEI7QUFBQSxRQUNGLEtBQUs7QUFDSCxrQkFBUSxHQUFHLE9BQU8sYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQzlDO0FBQUEsUUFDRixLQUFLO0FBQ0gsa0JBQVEsR0FBRyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQztBQUM5QztBQUFBLE1BQ0o7QUFDQSxVQUFJLG9CQUFvQiw0QkFBNEI7QUFDbEQsaUJBQVM7QUFBQSxNQUNYLFdBQVcsb0JBQW9CLGlDQUFpQztBQUM5RCxpQkFBUztBQUFBLE1BQ1g7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFwRU07QUFBQSxJQUpIQyxXQUFTO0FBQUEsTUFDUixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUEsS0FSWSxrQkFTVDtBQXFFTixTQUFPO0FBQ1Q7OztBQ3pHQSxTQUFTLE9BQUFDLGFBQVc7QUFFcEIsSUFBTyx3Q0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUhVUixJQUFNLHVCQUFOLGNBQ0c7QUFBQSxFQUNOLGFBQWEsYUFBYSxhQUFhLG1CQUFtQixHQUFHLG1CQUFtQjtBQUFBLEVBQ2hGO0FBQ0YsRUFFRjtBQUFBLEVBR0UsY0FBYztBQUNaLFVBQU07QUFDTixTQUFLLFdBQVcsT0FBTztBQUFBLEVBQ3pCO0FBQUEsRUFNQSxTQUFTO0FBQ1AsV0FBT0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlUO0FBQ0Y7QUF4QmEscUJBT0osU0FBeUI7QUFTekI7QUFBQSxFQUROQyxXQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQWZmLHFCQWdCSjtBQWhCSSx1QkFBTjtBQUFBLEVBRE5DLGdCQUFjLHdCQUF3QjtBQUFBLEdBQzFCOzs7QUlaYixTQUFTLE9BQUFDLE9BQUssUUFBQUMsUUFBTSxjQUFBQyxvQkFBa0I7QUFDdEMsU0FBUyxpQkFBQUMsdUJBQXFCO0FBSXZCLElBQU0sdUJBQU4sY0FBbUNDLGFBQVc7QUFBQSxFQVMxQyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUFBLEVBRU8sVUFBVTtBQUNmLFVBQU0sUUFBUSxJQUFJLDhCQUE4QjtBQUNoRCxVQUFNLFFBQVEsQ0FBQyxHQUFHLEtBQUssUUFBUTtBQUMvQixVQUFNLFFBQVEsS0FBSztBQUFBLEVBQ3JCO0FBQ0Y7QUFsQmEscUJBQ0osU0FBUztBQUFBLEVBQ2RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLRjtBQVBXLHVCQUFOO0FBQUEsRUFETkMsZ0JBQWMsd0JBQXdCO0FBQUEsR0FDMUI7QUEwQk4sSUFBTSxnQ0FBTixNQUFvQztBQUFBLEVBQ2xDLFFBQVEsT0FBc0I7QUFDbkMsZUFBVyxRQUFRLE9BQU87QUFDeEIsV0FBSyxRQUFRO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjs7O0FDckNBLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGNBQUFDLG9CQUFvQztBQUN4RCxTQUFTLGlCQUFBQyx1QkFBcUI7OztBQ0R2QixJQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJyQixJQUFNLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWtCcEIsSUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FEOUJoQyxJQUFxQix3QkFBckIsY0FBbURDLGFBQVc7QUFBQSxFQVNuRCxTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUFBLEVBRU8sVUFBVTtBQUNmLFVBQU0sUUFBUSxDQUFDLEdBQUcsS0FBSyxRQUFRO0FBRS9CLGVBQVcsUUFBUSxPQUFPO0FBQ3hCLFdBQUssUUFBUTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQUEsRUFFTyxhQUFhLG9CQUE2RTtBQUMvRixRQUFJLEtBQUssYUFBYSxVQUFVLEdBQUc7QUFDakMsWUFBTSx1QkFBdUIsS0FBSyxhQUFhLFVBQVUsRUFBRyxNQUFNLEdBQUc7QUFDckUsWUFBTSxlQUFlLHFCQUFxQixxQkFBcUIsU0FBUyxDQUFDLEVBQUUsUUFBUSxRQUFRLEVBQUU7QUFDN0YsV0FBSyxZQUFZO0FBQ2pCLGNBQVEsY0FBYztBQUFBLFFBQ3BCLEtBQUssZ0JBQWdCO0FBQ25CLGVBQUssWUFBWSxLQUFLLG1CQUFtQixXQUFXLEVBQUUsa0JBQWtCLGlCQUFpQjtBQUN6RjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEtBQUssc0JBQXNCO0FBQ3pCLGVBQUssWUFBWSxLQUFLLG1CQUFtQixnQkFBZ0IsRUFBRSxrQkFBa0IsaUJBQWlCO0FBQzlGO0FBQUEsUUFDRjtBQUFBLFFBQ0EsS0FBSztBQUNILGVBQUssWUFBWSxLQUFLLG1CQUFtQixZQUFZLEVBQUUsa0JBQWtCLGlCQUFpQjtBQUMxRjtBQUFBLE1BQ0o7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsbUJBQW1CLFNBQWlCO0FBQzFDLFdBQU8sU0FBUyxZQUFZLEVBQUUseUJBQXlCLE9BQU87QUFBQSxFQUNoRTtBQUNGO0FBN0NxQixzQkFDWixTQUFTO0FBQUEsRUFDZEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtGO0FBUG1CLHdCQUFyQjtBQUFBLEVBRENDLGdCQUFjLHlCQUF5QjtBQUFBLEdBQ25COzs7QUVOckIsU0FBUyxZQUFBQyxrQkFBZ0I7OztBQ0R6QixTQUFTLGlCQUFBQyx1QkFBcUI7QUFDOUIsU0FBUyxRQUFBQyxRQUFNLGNBQUFDLG9CQUFrQjtBQUcxQixJQUFNLFVBQU4sY0FBc0JDLGFBQWtDO0FBQUEsRUFDcEQsU0FBUztBQUNoQixXQUFPQztBQUFBLEVBQ1Q7QUFBQSxFQUVPLFVBQVU7QUFDZixVQUFNLElBQUksTUFBTSxpQkFBaUI7QUFBQSxFQUNuQztBQUNGO0FBUmEsVUFBTjtBQUFBLEVBRE5DLGdCQUFjLFVBQVU7QUFBQSxHQUNaOzs7QURPTixJQUFNLHdCQUFOLGNBQW9DLFFBQVE7QUFBQSxFQUdqRCxJQUFJLGtCQUF5QztBQUMzQyxXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFZ0IsVUFBa0I7QUFDaEMsVUFBTSxhQUFhLEtBQUssYUFBYSxZQUFZO0FBQ2pELFVBQU0sa0JBQWtCLEtBQUssUUFBUSxxQkFBcUIsRUFBRSxZQUFZLFVBQVU7QUFDbEYsUUFBSTtBQUNKLFFBQUksZ0JBQWdCLG9CQUFvQjtBQUN0QyxjQUFRLGdCQUFnQixtQkFBbUIsSUFBSSxTQUFTLEtBQUssZ0JBQWdCLFVBQVUsQ0FBQyxDQUFDO0FBQUEsSUFDM0Y7QUFDQSxRQUFJLFVBQVUsUUFBUSxVQUFVLFFBQVc7QUFDekMsY0FBUSxLQUFLLGdEQUFnRDtBQUM3RCxhQUFPO0FBQUEsSUFDVDtBQUNBLFNBQUs7QUFBQSxNQUNILElBQUksWUFBcUUseUJBQXlCO0FBQUEsUUFDaEcsU0FBUztBQUFBLFFBQ1QsVUFBVTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFVBQ04sbUJBQW1CLEtBQUs7QUFBQSxVQUN4QixPQUFPLDhCQUE4QixLQUFLO0FBQUEsUUFDNUM7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQTdCOEI7QUFBQSxFQUEzQkMsV0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FEZixzQkFDaUI7QUE4QjlCLGVBQWUsT0FBTyw0QkFBNEIscUJBQXFCOzs7QUUxQ3ZFLFNBQVMsUUFBQUMsY0FBWTtBQUlkLElBQU0sdUJBQU4sY0FBbUMsUUFBUTtBQUFBLEVBQ3ZDLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxFQUNUO0FBQUEsRUFFZ0IsVUFBVTtBQUN4QixVQUFNLFdBQVcsQ0FBQyxHQUFHLEtBQUssUUFBUTtBQUVsQyxhQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3hDLFlBQU0sU0FBUyxTQUFTLENBQUM7QUFFekIsVUFBSSxPQUFPLFVBQVUsR0FBRztBQUN0QixRQUFDLE9BQThCLFFBQVE7QUFFdkM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLGVBQWUsT0FBTywwQkFBMEIsb0JBQW9COzs7QUNwQjdELElBQU0scUJBQU4sY0FBaUMsUUFBUTtBQUFBLEVBQzlCLFVBQVU7QUFDeEIsVUFBTSxvQkFBb0IsS0FBSyxhQUFhLFlBQVk7QUFFeEQsVUFBTSxhQUFhLEtBQUs7QUFFeEIsVUFBTSxPQUFPLElBQUksdUJBQXVCLFVBQVU7QUFDbEQsVUFBTSxRQUFRLEtBQUssUUFBUTtBQUMzQixTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQXFFLHlCQUF5QjtBQUFBLFFBQ2hHLFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFFBQVE7QUFBQSxVQUNOO0FBQUEsVUFDQSxPQUFPLE1BQU0sUUFBUSxLQUFLLElBQ3RCLE1BQU0sSUFBSSxDQUFDLE1BQWMsOEJBQThCLENBQUMsQ0FBQyxJQUN6RCw4QkFBOEIsS0FBSztBQUFBLFFBQ3pDO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjtBQUVPLElBQU0seUJBQU4sTUFBdUQ7QUFBQSxFQUM1RCxZQUFvQixZQUFrQztBQUFsQztBQUFBLEVBQW1DO0FBQUEsRUFFdkQsVUFBZTtBQUNiLFVBQU0sUUFBUSxLQUFLLGFBQWEsS0FBSyxXQUFXLFVBQVUsSUFBSTtBQUU5RCxRQUFJLFVBQVUsUUFBUSxVQUFVLFFBQVc7QUFDekMsY0FBUSxLQUFLLDZDQUE2QztBQUMxRDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsZUFBZSxPQUFPLHlCQUF5QixrQkFBa0I7OztBQ3pDakUsU0FBUyxjQUFBQyxjQUFZLFFBQUFDLGNBQVk7QUFHMUIsSUFBTSxrQkFBTixjQUE4QkQsYUFBVztBQUFBLEVBQ3JDLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxFQUNUO0FBQUEsRUFFTyxZQUFZO0FBQ2pCLFVBQU0sU0FBUztBQUNmLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFTyxjQUF5QjtBQUM5QixXQUFPLENBQUMsR0FBRyxLQUFLLFFBQVE7QUFBQSxFQUMxQjtBQUFBLEVBRU8sVUFBVTtBQUNmLFVBQU0sV0FBVyxLQUFLLFlBQVk7QUFDbEMsYUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxZQUFNLFVBQVUsU0FBUyxDQUFDO0FBQzFCLGNBQVEsUUFBUTtBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUNGO0FBRUEsZUFBZSxPQUFPLHFCQUFxQixlQUFlOzs7QUMxQjFELFNBQVMsUUFBQUMsY0FBWTs7O0FDSWQsSUFBTSxnQkFBTixjQUE0QixnQkFBZ0I7QUFBQSxFQUNqQyxZQUFZO0FBQzFCLFVBQU0sYUFBYSxLQUFLO0FBQ3hCLFVBQU0sU0FBUyxXQUFXLFVBQVU7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVnQixjQUF5QjtBQUN2QyxVQUFNLFNBQVMsQ0FBQztBQUNoQixhQUFTLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUs7QUFDN0MsYUFBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7QUFBQSxJQUM5QjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sbUJBQW1CLGFBQWE7OztBRGpCL0MsSUFBTSxvQkFBTixjQUFnQyxjQUFjO0FBQUEsRUFDMUMsU0FBUztBQUNoQixXQUFPQyxTQUFPLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDOUI7QUFDRjtBQUVBLGVBQWUsT0FBTyx3QkFBd0IsaUJBQWlCOzs7QUVUL0QsU0FBUyxXQUFBQyxnQkFBZTtBQUN4QixTQUFTLE9BQUFDLE9BQUssUUFBQUMsUUFBTSxjQUFBQyxvQkFBa0I7QUFDdEMsU0FBUyxTQUFBQyxjQUFhO0FBWWYsSUFBZSxnQkFBZixjQUF3Q0MsYUFBMkM7QUFBQSxFQUFuRjtBQUFBO0FBNkJMLHdCQUFlO0FBQUE7QUFBQTtBQUFBLE1BSWIsTUFBTSxLQUFLLEtBQUssUUFBUSxFQUNyQixJQUFJLENBQUMsTUFBZTtBQUNuQixnQkFBUSxFQUFFLFFBQVEsWUFBWSxHQUFHO0FBQUEsVUFDL0IsS0FBSyxrQkFBa0I7QUFDckIsbUJBQU87QUFBQSxjQUNMLFVBQVUsRUFBRSxhQUFhLFdBQVc7QUFBQSxjQUNwQyxPQUFPLEVBQUUsWUFBWSxLQUFLO0FBQUEsY0FDMUIsYUFBYTtBQUFBLFlBQ2Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxLQUFLLGdCQUFnQjtBQUNuQixrQkFBTSxhQUFhLEVBQUUsYUFBYSxZQUFZLEtBQUs7QUFDbkQsa0JBQU0sV0FBVyxLQUFLLFFBQVEsVUFBVSxLQUFLLE9BQUssRUFBRSxlQUFlLFVBQVUsS0FBSztBQUNsRixtQkFBTztBQUFBLFVBQ1Q7QUFBQSxVQUNBLEtBQUssZ0JBQWdCO0FBQ25CLGtCQUFNLFdBQVc7QUFDakIsa0JBQU0sU0FBUyxTQUFTLFVBQVU7QUFDbEMsZ0JBQUksT0FBTyxTQUFTLEdBQUc7QUFDckIscUJBQU87QUFBQSxnQkFDTCxZQUFZO0FBQUEsZ0JBQ1osVUFBVSxPQUFPLENBQUMsRUFBRTtBQUFBLGdCQUNwQixPQUFPLE9BQU8sSUFBSSxPQUFLLEVBQUUsS0FBSztBQUFBLGdCQUM5QixhQUFhO0FBQUEsZ0JBQ2IsTUFBTTtBQUFBLGNBQ1I7QUFBQSxZQUNGO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsVUFDQSxLQUFLLGVBQWU7QUFDbEIsa0JBQU0sYUFBYSxFQUFFLGFBQWEsWUFBWSxLQUFLO0FBQ25ELGtCQUFNLG1CQUFxQyxLQUFLLFFBQVEsVUFBVSxLQUFLLE9BQUssRUFBRSxlQUFlLFVBQVUsS0FBSztBQUM1RyxtQkFBTztBQUFBLGNBQ0wsVUFBVSxpQkFBaUI7QUFBQSxjQUMzQixPQUFPLGlCQUFpQjtBQUFBLGNBQ3hCLGFBQWEsaUJBQWlCO0FBQUEsWUFDaEM7QUFBQSxVQUNGO0FBQUEsVUFDQSxTQUFTO0FBRVAsZ0JBQUk7QUFDRixvQkFBTSxhQUFhO0FBQ25CLG9CQUFNLFFBQVEsV0FBVyxVQUFVO0FBQ25DLHFCQUFPO0FBQUEsZ0JBQ0wsVUFBVTtBQUFBLGdCQUNWLE9BQU8sTUFBTSxTQUFTO0FBQUEsZ0JBQ3RCLGFBQWE7QUFBQSxjQUNmO0FBQUEsWUFDRixTQUFTLE9BQU87QUFDZCxzQkFBUSxLQUFLLHdCQUF3QjtBQUFBLFlBQ3ZDO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQyxFQUNBLE9BQU8sT0FBSyxNQUFNLElBQUk7QUFBQTtBQUFBO0FBQUEsRUE3RWxCLFNBQVM7QUFDaEIsV0FBT0MsY0FBWSxLQUFLLFVBQVUsS0FBSyxRQUFRLE1BQU0sQ0FBQyxDQUFDO0FBQUE7QUFBQSxFQUV6RDtBQUFBLEVBRU8sWUFBeUI7QUFDOUIsU0FBSyxTQUFTLEtBQUssVUFBVTtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFVSxZQUF5QjtBQUNqQyxVQUFNLElBQUksTUFBTSxpQkFBaUI7QUFBQSxFQUNuQztBQWtFRjtBQUFBO0FBekZzQixjQUtiLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFITjtBQUFBLEVBRFRDLE9BQU07QUFBQSxHQURhLGNBRVY7QUF5QkE7QUFBQSxFQUZUQyxTQUFRLEVBQUUsU0FBUyxhQUFhLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDakRELE9BQU07QUFBQSxHQTFCYSxjQTJCVjs7O0FDdkNMLElBQWUseUJBQWYsY0FBOEMsY0FBdUI7QUFBQSxFQUNuRSxZQUErQjtBQUNwQyxTQUFLLFNBQVMsS0FBSyxVQUFVO0FBQzdCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVPLFlBQStCO0FBQ3BDLFVBQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBLEVBQ25DO0FBQ0Y7OztBQ1BPLElBQU0sU0FBTixjQUFxQixZQUFZLHNCQUF3RSxFQUFFO0FBQUEsRUFDekcsWUFBWTtBQUNqQixXQUFPLEtBQUssa0JBQWtCLE1BQU0sS0FBSyxLQUFLLFFBQTJDLENBQUM7QUFBQSxFQUM1RjtBQUNGO0FBSU8sU0FBUyxZQUEyQyxNQUFhO0FBQ3RFLFNBQU8sTUFBTSxtQkFBbUIsS0FBSztBQUFBLElBQzVCLGtCQUFrQixVQUF5QztBQUVoRSxZQUFNLFNBQVMsU0FBUyxJQUFJLE9BQUs7QUFDL0IsY0FBTSxZQUFZO0FBQ2xCLFlBQUksQ0FBQyxVQUFVLFdBQVc7QUFDeEIsa0JBQVEsTUFBTSxrREFBa0Q7QUFDaEUsaUJBQU87QUFBQSxRQUNUO0FBQ0EsY0FBTSxRQUFRLFVBQVUsVUFBVTtBQUNsQyxZQUFJLE1BQU07QUFFVixZQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGNBQUksVUFBVSxRQUFRO0FBQ3BCLGtCQUFNO0FBQUEsVUFDUixXQUFXLFVBQVUsU0FBUztBQUM1QixrQkFBTTtBQUFBLFVBQ1IsT0FBTztBQUNMLG9CQUFRLE1BQU0sNENBQTRDO0FBQzFELG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0YsT0FBTztBQUNMLGNBQUksT0FBTyxVQUFVLFdBQVc7QUFDOUIsa0JBQU07QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNULENBQUM7QUFDRCxhQUFPLE9BQU8sTUFBTSxPQUFLO0FBQ3ZCLGVBQU8sT0FBTyxNQUFNLGFBQWE7QUFBQSxNQUNuQyxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFDRjs7O0FDN0NBLGVBQWUsT0FBTyxXQUFXLE1BQU07OztBQ0R2QyxTQUFTLFlBQUFFLGtCQUFnQjtBQUdsQixJQUFNLGVBQU4sY0FBMkIsY0FBc0I7QUFBQSxFQUFqRDtBQUFBO0FBQytDLG9CQUFxQjtBQUFBO0FBQUEsRUFFekQsWUFBb0I7QUFDbEMsVUFBTSxRQUFRLEtBQUssWUFBWSxLQUFLO0FBQ3BDLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFOc0Q7QUFBQSxFQUFuREMsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLFlBQVksQ0FBQztBQUFBLEdBRHZDLGFBQ3lDO0FBUXRELGVBQWUsT0FBTyxrQkFBa0IsWUFBWTs7O0FDUDdDLElBQU0sY0FBTixjQUEwQix1QkFBdUI7QUFBQSxFQUN0QyxZQUFZO0FBRTFCLFVBQU0sU0FBUyxLQUFLLGFBQWE7QUFDakMsUUFBSSxLQUFLLFNBQVMsV0FBVyxHQUFHO0FBQzlCLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUNFLE9BQU8sYUFBYSxrQkFDcEIsT0FBTyxhQUFhLGtCQUNwQixPQUFPLGdCQUFnQixZQUN2QjtBQUNBLGNBQU0sY0FBYyxPQUFPO0FBQzNCLGNBQU0sY0FBYyxPQUFPO0FBQzNCLGNBQU0sYUFBYSxZQUFZLE9BQU8sT0FBSyxZQUFZLFNBQVMsQ0FBQyxDQUFDO0FBRWxFLGNBQU0sU0FBUyxXQUFXLFNBQVM7QUFDbkMsZUFBTztBQUFBLE1BQ1QsV0FDRSxPQUFPLGFBQWEsa0JBQ3BCLE9BQU8sYUFBYSxrQkFDcEIsT0FBTyxnQkFBZ0IsVUFDdkI7QUFDQSxjQUFNLGNBQWMsT0FBTztBQUMzQixjQUFNLGNBQWMsT0FBTztBQUMzQixlQUFPLFlBQVksU0FBUyxXQUFXO0FBQUEsTUFDekMsT0FBTztBQUNMLGdCQUFRO0FBQUEsVUFDTjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUFPO0FBQ0wsY0FBUSxNQUFNLCtDQUErQztBQUFBLElBQy9EO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLGVBQWUsT0FBTyxnQkFBZ0IsV0FBVzs7O0FDeEMxQyxJQUFNLGFBQU4sY0FBeUIsY0FBaUM7QUFBQSxFQUMvRCxJQUFJLGlCQUFpQjtBQUNuQixXQUFPLEtBQUssYUFBYSxnQkFBZ0IsS0FBSztBQUFBLEVBQ2hEO0FBQUEsRUFFUyxZQUFZO0FBQ25CLFVBQU0sYUFBYSxLQUFLLGFBQWEsWUFBWSxLQUFLO0FBQ3RELFVBQU0sbUJBQXFDLEtBQUssUUFBUSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsVUFBVSxLQUFLO0FBQzVHLFFBQUksaUJBQWlCLGdCQUFnQixVQUFVO0FBQzdDLGFBQU8saUJBQWlCLGdCQUFnQixTQUFTLElBQUksaUJBQWlCLGdCQUFnQixDQUFDLElBQUk7QUFBQSxJQUM3RixPQUFPO0FBQ0wsYUFBTyxpQkFBaUI7QUFBQSxJQUMxQjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLGVBQWUsT0FBTyxlQUFlLFVBQVU7OztBQ25CL0MsU0FBUyxZQUFBQyxrQkFBZ0I7QUFJbEIsSUFBTSxrQkFBTixjQUE4QixjQUF1QjtBQUFBLEVBQXJEO0FBQUE7QUFDdUIsd0JBQXVEO0FBQUE7QUFBQSxFQUVuRixJQUFJLFVBQVU7QUFDWixVQUFNLE9BQU8sS0FBSyxhQUFhLFNBQVM7QUFDeEMsUUFBSSxDQUFDLE1BQU07QUFDVCxjQUFRLE1BQU0sOEJBQThCO0FBQzVDLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxVQUFVLFNBQVMsS0FBSyxhQUFhLFNBQVMsS0FBSyxHQUFHO0FBQzVELFFBQUksTUFBTSxPQUFPLEdBQUc7QUFDbEIsY0FBUSxNQUFNLG1DQUFtQztBQUNqRCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksVUFBVSxHQUFHO0FBQ2YsY0FBUSxNQUFNLCtCQUErQjtBQUM3QyxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksVUFBVSxLQUFLLEtBQUssaUJBQWlCLHNCQUFzQjtBQUM3RCxjQUFRLE1BQU0sc0VBQXNFO0FBQ3BGLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVnQixZQUFZO0FBQzFCLFFBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUM5QixZQUFNLFNBQVMsS0FBSyxhQUFhO0FBQ2pDLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUFJLEtBQUssaUJBQWlCLE1BQU07QUFDOUIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxVQUNFLE9BQU8sZ0JBQWdCLFlBQ3ZCLE9BQU8sZ0JBQWdCLFlBQ3ZCLE1BQU0sUUFBUSxPQUFPLEtBQUssS0FDMUIsTUFBTSxRQUFRLE9BQU8sS0FBSyxHQUMxQjtBQUNBLGdCQUFRLE1BQU0scUNBQXFDO0FBQ25ELGVBQU87QUFBQSxNQUNUO0FBQ0EsY0FBUSxPQUFPLENBQUMsRUFBRSxVQUFVO0FBQUEsUUFDMUIsS0FBSztBQUFBLFFBQ0wsS0FBSyxTQUFTO0FBQ1osZ0JBQU0sU0FBUyxXQUFXLE9BQU8sS0FBZTtBQUNoRCxnQkFBTSxTQUFTLFdBQVcsT0FBTyxLQUFlO0FBRWhELGNBQUksQ0FBQyxNQUFNLE1BQU0sS0FBSyxDQUFDLE1BQU0sTUFBTSxHQUFHO0FBQ3BDLGdCQUFJLEtBQUssaUJBQWlCLHNCQUFzQjtBQUM5QyxxQkFBTyxPQUFPLFlBQVksS0FBSyxPQUFPLE1BQU0sT0FBTyxZQUFZLEtBQUssT0FBTztBQUFBLFlBQzdFLE9BQU87QUFDTCxxQkFDRSxLQUFLLE1BQU0sU0FBUyxLQUFLLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssT0FBTyxNQUMzRSxLQUFLLE1BQU0sU0FBUyxLQUFLLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssT0FBTztBQUFBLFlBRS9FO0FBQUEsVUFDRixPQUFPO0FBQ0wsb0JBQVEsTUFBTSxxRUFBcUUsTUFBTSxLQUFLLE1BQU0sRUFBRTtBQUFBLFVBQ3hHO0FBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQSxTQUFTO0FBQ1Asa0JBQVEsTUFBTSwwRUFBMEU7QUFDeEY7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBQ0EsWUFBUSxNQUFNLG9EQUFvRDtBQUNsRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBdkU4QjtBQUFBLEVBQTNCQyxXQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQURmLGdCQUNpQjtBQXlFOUIsZUFBZSxPQUFPLHFCQUFxQixlQUFlOzs7QUM5RTFELFNBQVMsWUFBQUMsa0JBQWdCOzs7QUNFbEIsSUFBTSxnQkFBTixNQUFvQjtBQUFBLEVBQ3pCLE9BQWMsb0JBQW9CLFFBQTBCLFFBQTBCLFVBQTZCO0FBQ2pILFlBQVEsVUFBVTtBQUFBLE1BQ2hCLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFDSCxlQUFPLFdBQVc7QUFBQSxNQUNwQixLQUFLLFdBQVc7QUFDZCxjQUFNLE9BQU8sU0FBUyxRQUFRLEVBQUU7QUFDaEMsY0FBTSxPQUFPLFNBQVMsUUFBUSxFQUFFO0FBQ2hDLFlBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHO0FBQ2hDLGlCQUFPLFNBQVM7QUFBQSxRQUNsQixPQUFPO0FBQ0wsa0JBQVEsTUFBTSxrQkFBa0IsTUFBTSxXQUFXLE1BQU0sVUFBVTtBQUFBLFFBQ25FO0FBQ0E7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLFNBQVM7QUFDWixjQUFNLFNBQVMsV0FBVyxNQUFNO0FBQ2hDLGNBQU0sU0FBUyxXQUFXLE1BQU07QUFDaEMsWUFBSSxDQUFDLE1BQU0sTUFBTSxLQUFLLENBQUMsTUFBTSxNQUFNLEdBQUc7QUFDcEMsaUJBQU8sV0FBVztBQUFBLFFBQ3BCLE9BQU87QUFDTCxrQkFBUSxNQUFNLG9CQUFvQixNQUFNLFdBQVcsTUFBTSxZQUFZO0FBQUEsUUFDdkU7QUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUssZ0JBQWdCO0FBQ25CLGNBQU0sUUFBUSxPQUFPLE1BQU0sR0FBRyxFQUFFLEtBQUs7QUFDckMsY0FBTSxRQUFRLE9BQU8sTUFBTSxHQUFHLEVBQUUsS0FBSztBQUNyQyxZQUFJLE1BQU0sV0FBVyxLQUFLLE1BQU0sV0FBVyxHQUFHO0FBQzVDLGNBQUksYUFBYSxRQUFRO0FBQ3ZCLGtCQUFNLEtBQUs7QUFDWCxrQkFBTSxLQUFLO0FBQUEsVUFDYjtBQUNBLGlCQUFPLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxLQUFLLEdBQUc7QUFBQSxRQUMzQyxPQUFPO0FBQ0wsa0JBQVEsTUFBTSxzRUFBc0UsTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUFBLFFBQzNHO0FBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7OztBRDFDTyxJQUFNLFdBQU4sY0FBdUIsY0FBdUI7QUFBQSxFQUE5QztBQUFBO0FBQ3VCLHlCQUFtRDtBQUFBO0FBQUEsRUFFL0QsWUFBWTtBQUMxQixRQUFJLEtBQUssU0FBUyxXQUFXLEdBQUc7QUFDOUIsWUFBTSxTQUFTLEtBQUssYUFBYTtBQUNqQyxZQUFNLFNBQVMsT0FBTyxDQUFDO0FBQ3ZCLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsVUFBSSxLQUFLLGtCQUFrQixTQUFTO0FBQ2xDLGdCQUFRLE1BQU0sb0NBQW9DO0FBQ2xELGVBQU87QUFBQSxNQUNUO0FBQ0EsVUFDRSxPQUFPLGdCQUFnQixZQUN2QixPQUFPLGdCQUFnQixZQUN2QixNQUFNLFFBQVEsT0FBTyxLQUFLLEtBQzFCLE1BQU0sUUFBUSxPQUFPLEtBQUssR0FDMUI7QUFDQSxnQkFBUSxNQUFNLHFDQUFxQztBQUNuRCxlQUFPO0FBQUEsTUFDVDtBQUNBLGFBQU8sY0FBYyxvQkFBb0IsT0FBTyxPQUFpQixPQUFPLE9BQWlCLE9BQU8sUUFBUTtBQUFBLElBQzFHO0FBQ0EsWUFBUSxNQUFNLDRDQUE0QztBQUMxRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBekI4QjtBQUFBLEVBQTNCQyxXQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQURmLFNBQ2lCO0FBMkI5QixlQUFlLE9BQU8sYUFBYSxRQUFROzs7QUU5QnBDLElBQU0sUUFBTixjQUFvQixjQUF1QjtBQUFBLEVBQ2hDLFlBQXFCO0FBQ25DLFFBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUM5QixZQUFNLFNBQVMsS0FBSyxhQUFhO0FBQ2pDLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUFJLE9BQU8sYUFBYSxPQUFPLGFBQWEsT0FBTyxhQUFhLGFBQWEsT0FBTyxhQUFhLFVBQVU7QUFDekcsZUFBTyxDQUFDLE9BQU8sUUFBUSxDQUFDLE9BQU87QUFBQSxNQUNqQyxPQUFPO0FBQ0wsZ0JBQVEsTUFBTSw4Q0FBOEM7QUFBQSxNQUM5RDtBQUFBLElBQ0Y7QUFDQSxZQUFRLE1BQU0scUNBQXFDO0FBQ25ELFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sVUFBVSxLQUFLOzs7QUNmOUIsSUFBTSxTQUFOLGNBQXFCLHVCQUF1QjtBQUFBLEVBQ2pDLFlBQXFCO0FBQ25DLFFBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUM5QixZQUFNLFNBQVMsS0FBSyxhQUFhO0FBQ2pDLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUFJLE9BQU8sYUFBYSxPQUFPLGFBQWEsT0FBTyxhQUFhLGFBQWEsT0FBTyxhQUFhLFVBQVU7QUFDekcsZUFBTyxDQUFDLE9BQU8sU0FBUyxDQUFDLE9BQU87QUFBQSxNQUNsQyxPQUFPO0FBQ0wsZ0JBQVEsTUFBTSwrQ0FBK0M7QUFDN0QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQ0EsWUFBUSxJQUFJLHNDQUFzQztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsZUFBZSxPQUFPLFdBQVcsTUFBTTs7O0FDbEJoQyxJQUFNLFlBQU4sY0FBd0IsY0FBdUI7QUFBQSxFQUNwQyxZQUFxQjtBQUNuQyxRQUFJLEtBQUssU0FBUyxXQUFXLEdBQUc7QUFDOUIsWUFBTSxZQUFZLEtBQUssYUFBYTtBQUNwQyxVQUFJLENBQUMsV0FBVztBQUNkLGVBQU87QUFBQSxNQUNUO0FBQ0EsWUFBTSxRQUFRLFVBQVUsQ0FBQyxFQUFFO0FBQzNCLGFBQU8sU0FBUyxRQUFRLFNBQVMsVUFBYSxVQUFVO0FBQUEsSUFDMUQ7QUFDQSxZQUFRLE1BQU0sMkNBQTJDO0FBQ3pELFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sZUFBZSxTQUFTOzs7QUNqQnZDLElBQU0sUUFBTixjQUFvQixjQUF1QjtBQUFBLEVBQ2hDLFlBQXFCO0FBQ25DLFFBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUM5QixZQUFNLFNBQVMsS0FBSyxhQUFhO0FBQ2pDLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUFJLE9BQU8sYUFBYSxPQUFPLGFBQWEsT0FBTyxhQUFhLGFBQWEsT0FBTyxhQUFhLFVBQVU7QUFDekcsZUFBTyxDQUFDLE9BQU8sUUFBUSxDQUFDLE9BQU87QUFBQSxNQUNqQyxPQUFPO0FBQ0wsZ0JBQVEsTUFBTSw4Q0FBOEM7QUFBQSxNQUM5RDtBQUFBLElBQ0Y7QUFDQSxZQUFRLE1BQU0scUNBQXFDO0FBQ25ELFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sVUFBVSxLQUFLOzs7QUNmOUIsSUFBTSxTQUFOLGNBQXFCLHVCQUF1QjtBQUFBLEVBQ2pDLFlBQXFCO0FBQ25DLFFBQUksS0FBSyxTQUFTLFdBQVcsR0FBRztBQUM5QixZQUFNLFNBQVMsS0FBSyxhQUFhO0FBQ2pDLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsWUFBTSxTQUFTLE9BQU8sQ0FBQztBQUN2QixVQUFJLE9BQU8sYUFBYSxPQUFPLGFBQWEsT0FBTyxhQUFhLGFBQWEsT0FBTyxhQUFhLFVBQVU7QUFDekcsZUFBTyxDQUFDLE9BQU8sU0FBUyxDQUFDLE9BQU87QUFBQSxNQUNsQyxPQUFPO0FBQ0wsZ0JBQVEsTUFBTSwrQ0FBK0M7QUFDN0QsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQ0EsWUFBUSxJQUFJLHNDQUFzQztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsZUFBZSxPQUFPLFdBQVcsTUFBTTs7O0FDdkJ2QyxTQUFTLFlBQUFDLGtCQUFnQjtBQUtsQixJQUFNLGlCQUFOLGNBQTZCLGNBQXNCO0FBQUEsRUFHeEMsWUFBb0I7QUFDbEMsVUFBTSxXQUE2QixLQUFLLFFBQVEsVUFBVSxLQUFLLE9BQUssRUFBRSxlQUFlLEtBQUssVUFBVTtBQUNwRyxRQUFJLENBQUMsVUFBVTtBQUNiLGNBQVEsS0FBSyxZQUFZLEtBQUssVUFBVSxtQkFBbUI7QUFDM0QsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFVBQVUsU0FBUztBQUN6QixVQUFNLHFCQUFxQixDQUFDLE1BQU0sUUFBUSxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLFNBQVM7QUFDeEYsUUFBSSxTQUFTO0FBQ2IsZUFBVyxxQkFBcUIsb0JBQW9CO0FBQ2xELFlBQU0sY0FBYyxRQUFRLFdBQVcsS0FBSyxXQUFTO0FBQ25ELGVBQU8sY0FBYyxvQkFBb0IsTUFBTSxRQUFRLG1CQUFtQixTQUFTLFFBQVE7QUFBQSxNQUM3RixDQUFDO0FBQ0QsVUFBSSxFQUFFLGVBQWUsUUFBUSxZQUFZLGVBQWUsU0FBWTtBQUNsRSxrQkFBVSxZQUFZO0FBQUEsTUFDeEIsT0FBTztBQUNMLGtCQUFVLFFBQVE7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFDQSxRQUFJLFFBQVEsY0FBYyxNQUFNO0FBQzlCLGVBQVMsS0FBSyxJQUFJLFFBQVEsWUFBWSxNQUFNO0FBQUEsSUFDOUM7QUFDQSxRQUFJLFFBQVEsY0FBYyxNQUFNO0FBQzlCLGVBQVMsS0FBSyxJQUFJLFFBQVEsWUFBWSxNQUFNO0FBQUEsSUFDOUM7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBN0I4QjtBQUFBLEVBQTNCQyxXQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQURmLGVBQ2lCO0FBK0I5QixlQUFlLE9BQU8sb0JBQW9CLGNBQWM7OztBQ3JDeEQsU0FBUyxZQUFBQyxrQkFBZ0I7QUFDekIsU0FBUyxjQUFBQyxvQkFBa0I7QUFFcEIsSUFBTSxhQUFOLGNBQXlCQyxhQUFXO0FBQUEsRUFBcEM7QUFBQTtBQUNtRCx3QkFBdUI7QUFBQTtBQUFBLEVBSS9FLElBQVcsYUFBYTtBQUN0QixXQUFPLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixlQUFlLENBQUMsRUFBRSxJQUFJLFFBQU07QUFDbEUsYUFBTztBQUFBLFFBQ0wsUUFBUSxHQUFHLGFBQWEsU0FBUztBQUFBLFFBQ2pDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsY0FBYztBQUFBLE1BQzlDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBWjBEO0FBQUEsRUFBdkRDLFdBQVMsRUFBRSxXQUFXLGlCQUFpQixNQUFNLE9BQU8sQ0FBQztBQUFBLEdBRDNDLFdBQzZDO0FBQ0Y7QUFBQSxFQUFyREEsV0FBUyxFQUFFLFdBQVcsZUFBZSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBRnpDLFdBRTJDO0FBQ0E7QUFBQSxFQUFyREEsV0FBUyxFQUFFLFdBQVcsZUFBZSxNQUFNLE9BQU8sQ0FBQztBQUFBLEdBSHpDLFdBRzJDO0FBWXhELGVBQWUsT0FBTyxlQUFlLFVBQVU7OztBQ2R4QyxJQUFNLFdBQU4sTUFBTSxrQkFBaUIsY0FBdUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUW5DLFlBQVk7QUFDMUIsUUFBSSxLQUFLLFNBQVMsV0FBVyxHQUFHO0FBQzlCLFlBQU0sU0FBUyxLQUFLLGFBQWE7QUFDakMsWUFBTSxhQUFhLE9BQU8sQ0FBQztBQUMzQixZQUFNLG1CQUFtQixPQUFPLENBQUM7QUFDakMsYUFBTyxVQUFTLE1BQU0sWUFBWSxnQkFBZ0I7QUFBQSxJQUNwRDtBQUVBLFlBQVEsTUFBTSx3Q0FBd0M7QUFDdEQsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQWMsTUFBTSxZQUE4QixrQkFBb0M7QUF4QnhGO0FBeUJJLFlBQVEsaUJBQWlCLGFBQWE7QUFBQSxNQUNwQyxLQUFLLFVBQVU7QUFDYixZQUFJLFdBQVcsVUFBVSxLQUFNLFFBQU87QUFDdEMsWUFBSSxNQUFNLFFBQVEsV0FBVyxLQUFLLEtBQUssTUFBTSxRQUFRLGlCQUFpQixLQUFLLEdBQUc7QUFDNUUsa0JBQVEsTUFBTSxxQ0FBcUM7QUFDbkQsaUJBQU87QUFBQSxRQUNUO0FBQ0EsZUFBTyxjQUFjO0FBQUEsV0FDbkIsZ0JBQVcsVUFBWCxtQkFBa0I7QUFBQSxVQUNsQixpQkFBaUIsTUFBTSxTQUFTO0FBQUEsVUFDaEMsaUJBQWlCO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsTUFFQSxLQUFLLFdBQVc7QUFDZCxZQUFJLENBQUMsTUFBTSxRQUFRLFdBQVcsS0FBSyxLQUFLLENBQUMsTUFBTSxRQUFRLGlCQUFpQixLQUFLLEdBQUc7QUFDOUUsa0JBQVEsTUFBTSxxQ0FBcUM7QUFDbkQsaUJBQU87QUFBQSxRQUNUO0FBQ0EsWUFBSSxXQUFXLE1BQU0sV0FBVyxpQkFBaUIsTUFBTSxRQUFRO0FBQzdELGlCQUFPO0FBQUEsUUFDVDtBQUNBLGlCQUFTLElBQUksR0FBRyxJQUFJLFdBQVcsTUFBTSxRQUFRLEtBQUs7QUFDaEQsZ0JBQU0sU0FBUyxjQUFjO0FBQUEsWUFDM0IsaUJBQWlCLE1BQU0sQ0FBQztBQUFBLFlBQ3hCLFdBQVcsTUFBTSxDQUFDO0FBQUEsWUFDbEIsaUJBQWlCO0FBQUEsVUFDbkI7QUFDQSxjQUFJLENBQUMsUUFBUTtBQUNYLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsS0FBSyxZQUFZO0FBQ2YsWUFBSSxDQUFDLE1BQU0sUUFBUSxXQUFXLEtBQUssS0FBSyxDQUFDLE1BQU0sUUFBUSxpQkFBaUIsS0FBSyxHQUFHO0FBQzlFLGtCQUFRLE1BQU0scUNBQXFDO0FBQ25ELGlCQUFPO0FBQUEsUUFDVDtBQUNBLFlBQUksV0FBVyxNQUFNLFdBQVcsaUJBQWlCLE1BQU0sUUFBUTtBQUM3RCxpQkFBTztBQUFBLFFBQ1Q7QUFDQSxZQUFJLGNBQWM7QUFDbEIsbUJBQVcsaUJBQWlCLGlCQUFpQixPQUFPO0FBQ2xELGNBQUksZ0JBQStCO0FBQ25DLGdCQUFNLE1BQU0sQ0FBQyxHQUFHLFdBQVcsS0FBSztBQUNoQyxxQkFBVyxNQUFNLEtBQUs7QUFDcEIsa0JBQU0sU0FBUyxjQUFjLG9CQUFvQixlQUFlLElBQUksaUJBQWlCLFFBQVE7QUFDN0YsZ0JBQUksUUFBUTtBQUNWLDhCQUFnQjtBQUNoQjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQ0EsY0FBSSxrQkFBa0IsTUFBTTtBQUMxQixZQUFDLElBQWlCLE9BQU8sSUFBSSxRQUFRLGFBQWEsR0FBRyxDQUFDO0FBQUEsVUFDeEQsT0FBTztBQUNMLG1CQUFPO0FBQUEsVUFDVDtBQUNBO0FBQUEsUUFDRjtBQUNBLGVBQU87QUFBQSxNQUNUO0FBQUEsTUFFQTtBQUNFLGdCQUFRLE1BQU0scUNBQXFDO0FBQ25ELGVBQU87QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUNGO0FBRUEsZUFBZSxPQUFPLGFBQWEsUUFBUTs7O0FDN0ZwQyxJQUFNLFlBQU4sY0FBd0IsY0FBOEI7QUFBQSxFQUMzQyxZQUFZO0FBQzFCLFVBQU0sU0FBUyxLQUFLLGFBQWE7QUFFakMsUUFBSSxFQUFFLEtBQUssU0FBUyxXQUFXLElBQUk7QUFDakMsY0FBUSxLQUFLLCtDQUErQztBQUFBLElBQzlEO0FBRUEsVUFBTSxDQUFDLFFBQVEsTUFBTSxJQUFJO0FBRXpCLFFBQUksRUFBRSxPQUFPLGFBQWEsT0FBTyxXQUFXO0FBQzFDLGNBQVEsS0FBSyx5Q0FBeUM7QUFBQSxJQUN4RDtBQUNBLFFBQUksRUFBRSxPQUFPLGdCQUFnQixjQUFjLE9BQU8sZ0JBQWdCLFlBQVk7QUFDNUUsY0FBUSxLQUFLLHdEQUF3RDtBQUFBLElBQ3ZFO0FBQ0EsUUFBSSxPQUFPLGFBQWEsV0FBVyxPQUFPLGFBQWEsU0FBUztBQUM5RCxjQUFRLEtBQUsscUZBQXFGO0FBQUEsSUFDcEc7QUFDQSxRQUFJLE9BQU8sYUFBYSxjQUFjLE9BQU8sYUFBYSxZQUFZO0FBQ3BFLGNBQVEsS0FBSyxxRUFBcUU7QUFBQSxJQUNwRjtBQUdBLFFBQUksT0FBTyxVQUFVLFFBQVEsT0FBTyxVQUFVLE1BQU07QUFDbEQsYUFBTztBQUFBLElBQ1Q7QUFHQSxVQUFNLGNBQWMsT0FBTztBQUMzQixVQUFNLGNBQWMsT0FBTztBQUMzQixXQUFPLFlBQVksU0FBUyxXQUFXO0FBQUEsRUFDekM7QUFDRjtBQUVBLGVBQWUsT0FBTyxjQUFjLFNBQVM7OztBQ3BDdEMsSUFBTSxjQUFOLGNBQTBCLGNBQXdEO0FBQUEsRUFDdkUsWUFBZ0M7QUFDOUMsVUFBTSxZQUFZLEtBQUssYUFBYTtBQUNwQyxRQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLGNBQVEsTUFBTSwrQ0FBK0M7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFDQSxlQUFXLFlBQVksV0FBVztBQUNoQyxVQUFJLFNBQVMsZ0JBQWdCLGNBQWMsU0FBUyxnQkFBZ0IsVUFBVTtBQUM1RSxnQkFBUSxNQUFNLHdDQUF3QztBQUN0RCxlQUFPLENBQUM7QUFBQSxNQUNWO0FBQUEsSUFDRjtBQVNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sZ0JBQWdCLFdBQVc7OztBQzNCakQsU0FBUyxRQUFBQyxjQUFZO0FBR2QsSUFBTSxTQUFOLGNBQXFCLGNBQXVCO0FBQUEsRUFDeEMsU0FBUztBQUNoQixXQUFPQyxTQUFPLE1BQU0sT0FBTyxDQUFDO0FBQUEsRUFDOUI7QUFBQSxFQUVnQixZQUFZO0FBQzFCLFVBQU0sYUFBYSxLQUFLO0FBQ3hCLFVBQU0sU0FBUyxXQUFXLFVBQVU7QUFDcEMsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNGO0FBRUEsZUFBZSxPQUFPLFdBQVcsTUFBTTs7O0FDWmhDLElBQU0sUUFBTixjQUFvQix1QkFBdUI7QUFBQSxFQUNoQyxZQUFZO0FBRTFCLFVBQU0sU0FBUyxNQUFNLEtBQUssS0FBSyxRQUFRLEVBQUUsSUFBSSxPQUFLO0FBQ2hELFlBQU0sWUFBWTtBQUNsQixVQUFJLENBQUMsVUFBVSxXQUFXO0FBQ3hCLGdCQUFRLE1BQU0sa0RBQWtEO0FBQ2hFLGVBQU87QUFBQSxNQUNUO0FBQ0EsWUFBTSxRQUFRLFVBQVUsVUFBVTtBQUNsQyxVQUFJLE1BQU07QUFFVixVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFlBQUksVUFBVSxRQUFRO0FBQ3BCLGdCQUFNO0FBQUEsUUFDUixXQUFXLFVBQVUsU0FBUztBQUM1QixnQkFBTTtBQUFBLFFBQ1IsT0FBTztBQUNMLGtCQUFRLE1BQU0sNENBQTRDO0FBQzFELGlCQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0YsT0FBTztBQUNMLFlBQUksT0FBTyxVQUFVLFdBQVc7QUFDOUIsZ0JBQU07QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNULENBQUM7QUFDRCxXQUFPLE9BQU8sS0FBSyxPQUFLO0FBQ3RCLGFBQU8sT0FBTyxNQUFNLGFBQWE7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDtBQUNGO0FBRUEsZUFBZSxPQUFPLFVBQVUsS0FBSzs7O0FDbkM5QixJQUFNLGFBQU4sY0FBeUIsY0FBa0M7QUFBQSxFQUNoRCxZQUFnQztBQUM5QyxVQUFNLFlBQVksS0FBSyxhQUFhO0FBQ3BDLFFBQUksVUFBVSxXQUFXLEdBQUc7QUFDMUIsY0FBUSxNQUFNLCtDQUErQztBQUM3RCxhQUFPO0FBQUEsSUFDVDtBQUNBLGVBQVcsWUFBWSxXQUFXO0FBQ2hDLFVBQUksU0FBUyxnQkFBZ0IsYUFBYSxTQUFTLGdCQUFnQixVQUFVO0FBQzNFLGdCQUFRLE1BQU0sdUNBQXVDO0FBQ3JELGVBQU8sQ0FBQztBQUFBLE1BQ1Y7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLGVBQWUsT0FBTyxlQUFlLFVBQVU7OztBQ25CL0MsU0FBUyxXQUFBQyxnQkFBZTtBQUN4QixTQUFTLGNBQUFDLGNBQVksUUFBQUMsY0FBWTtBQUNqQyxTQUFTLFlBQUFDLFlBQVUsU0FBQUMsY0FBYTtBQUt6QixJQUFNLHFCQUFOLGNBQWlDQyxhQUFXO0FBQUEsRUFReEMsU0FBUztBQWZwQjtBQWdCSSxVQUFNLFNBQVEsZ0JBQUssWUFBTCxtQkFBYyxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsS0FBSyxnQkFBeEQsbUJBQXFFO0FBQ25GLFdBQU9DLFNBQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM5QztBQUFBLEVBRU8sWUFBb0Q7QUFDekQsVUFBTSxTQUFTLEtBQUssUUFBUSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsS0FBSyxVQUFVLEtBQUs7QUFDckYsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQWZFO0FBQUEsRUFEQ0MsV0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FEZixtQkFFWDtBQUlVO0FBQUEsRUFGVEMsU0FBUSxFQUFFLFNBQVMsYUFBYSxXQUFXLEtBQUssQ0FBQztBQUFBLEVBQ2pEQyxPQUFNO0FBQUEsR0FMSSxtQkFNRDtBQWFaLGVBQWUsT0FBTyx3QkFBd0Isa0JBQWtCOzs7QUN2QnpELElBQU0sYUFBTixjQUF5QixjQUFzQjtBQUFBLEVBQ3BDLFlBQVk7QUFDMUIsVUFBTSxTQUFTLEtBQUssYUFBYTtBQUNqQyxVQUFNLFVBQVUsT0FBTyxPQUFPLENBQUMsYUFBYSxpQkFBaUI7QUFDM0QsVUFBSSxhQUFhLFlBQVksV0FBVyxhQUFhLFlBQVksV0FBVztBQUMxRSxZQUFJO0FBQ0YsaUJBQU8sY0FBYyxTQUFTLGFBQWEsTUFBTSxTQUFTLENBQUM7QUFBQSxRQUM3RCxTQUFTLE9BQU87QUFDZCxrQkFBUSxLQUFLLDJCQUEyQjtBQUFBLFFBQzFDO0FBQUEsTUFDRixPQUFPO0FBQ0wsZ0JBQVEsS0FBSyx3QkFBd0IsYUFBYSxRQUFRLEVBQUU7QUFBQSxNQUM5RDtBQUNBLGFBQU87QUFBQSxJQUNULEdBQUcsQ0FBQztBQUNKLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sZUFBZSxVQUFVOzs7QUN0Qi9DLFNBQVMsWUFBQUMsa0JBQWdCO0FBS2xCLElBQU0saUJBQU4sY0FBNkIsY0FBdUI7QUFBQSxFQUFwRDtBQUFBO0FBQ29ELHlCQUFnQjtBQUFBO0FBQUEsRUFFekQsWUFBWTtBQUMxQixRQUFJLEtBQUssU0FBUyxXQUFXLEdBQUc7QUFDOUIsWUFBTSxTQUFTLEtBQUssYUFBYTtBQUNqQyxZQUFNLFNBQVMsT0FBTyxDQUFDO0FBQ3ZCLFlBQU0sU0FBUyxPQUFPLENBQUM7QUFDdkIsVUFDRSxPQUFPLGdCQUFnQixZQUN2QixPQUFPLGdCQUFnQixZQUN2QixNQUFNLFFBQVEsT0FBTyxLQUFLLEtBQzFCLE1BQU0sUUFBUSxPQUFPLEtBQUssR0FDMUI7QUFDQSxnQkFBUSxNQUFNLDRDQUE0QztBQUMxRCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sS0FBSyxLQUFLLGtCQUFrQixTQUFTLE9BQU8sUUFBUyxPQUFPLE1BQWlCLFlBQVk7QUFDL0YsWUFBTSxLQUFLLEtBQUssa0JBQWtCLFNBQVMsT0FBTyxRQUFTLE9BQU8sTUFBaUIsWUFBWTtBQUMvRixhQUFPLGNBQWMsb0JBQW9CLElBQWMsSUFBYyxPQUFPLFFBQVE7QUFBQSxJQUN0RjtBQUNBLFlBQVEsTUFBTSxtREFBbUQ7QUFDakUsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQXZCMkQ7QUFBQSxFQUF4REMsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLGlCQUFpQixDQUFDO0FBQUEsR0FENUMsZUFDOEM7QUF5QjNELGVBQWUsT0FBTyxvQkFBb0IsY0FBYzs7O0FDN0JqRCxJQUFNLFNBQU4sY0FBcUIsY0FBc0I7QUFBQSxFQUVoRCxjQUFjO0FBQ1osVUFBTTtBQUNOLFNBQUssY0FBYyxJQUFJLGlCQUFpQixNQUFNLEtBQUssS0FBSyxRQUFrRCxDQUFDO0FBQUEsRUFDN0c7QUFBQSxFQUVnQixZQUFZO0FBRTFCLFVBQU0sUUFBUSxLQUFLLFlBQVksVUFBVTtBQUN6QyxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRU8sSUFBTSxtQkFBTixNQUE0RDtBQUFBLEVBQ2pFLFlBQW9CLGFBQTBDO0FBQTFDO0FBQUEsRUFBMkM7QUFBQSxFQUV4RCxZQUFZO0FBQ2pCLFVBQU0sU0FBUyxLQUFLLFlBQVksSUFBSSxPQUFLO0FBQ3ZDLFVBQUksQ0FBQyxFQUFFLFdBQVc7QUFDaEIsZ0JBQVEsTUFBTSxrREFBa0Q7QUFDaEUsZUFBTztBQUFBLE1BQ1Q7QUFDQSxZQUFNLFFBQVEsRUFBRSxVQUFVO0FBQzFCLFVBQUksT0FBTyxNQUFNLEtBQUssR0FBRztBQUN2QixnQkFBUSxNQUFNLDhDQUE4QztBQUM1RCxlQUFPO0FBQUEsTUFDVDtBQUVBLGFBQU8sT0FBTyxLQUFLO0FBQUEsSUFDckIsQ0FBQztBQUNELFdBQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLElBQUksR0FBRyxDQUFDO0FBQUEsRUFDekM7QUFDRjtBQUVBLGVBQWUsT0FBTyxXQUFXLE1BQU07OztBQ25DaEMsSUFBTSxjQUFOLGNBQTBCLGNBQWlDO0FBQUEsRUFDaEQsWUFBWTtBQUMxQixVQUFNLGFBQWEsS0FBSyxhQUFhLFlBQVk7QUFDakQsVUFBTSxTQUFTLEtBQUssUUFBUSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsVUFBVSxFQUFFO0FBQzdFLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFFQSxlQUFlLE9BQU8sZ0JBQWdCLFdBQVc7OztBQ1ZqRCxTQUFTLFFBQUFDLGNBQVk7QUFDckIsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsWUFBVSxTQUFBQyxlQUFhO0FBUXhDLElBQU0sK0JBQU4sY0FBMkMsWUFBWTtBQUFBLEVBQXZEO0FBQUE7QUFhTCxTQUFRLGdCQUF3QjtBQStOaEMsc0JBQWEsT0FBTyxLQUFhLFlBQXNEO0FBQ3JGLFlBQU0sS0FBSyxvQkFBb0IsR0FBRztBQUNsQyxVQUFJO0FBQ0YsY0FBTSxnQkFBZ0IsTUFBTSxNQUFNLEdBQUc7QUFDckMsWUFBSSxjQUFjLElBQUk7QUFDcEIsZ0JBQU0sU0FBUyxNQUFNLGNBQWMsS0FBSztBQUN4QyxnQkFBTSxhQUFhO0FBQ25CLHFCQUFXLFlBQVksV0FBVyxPQUFPO0FBQ3ZDLGdCQUFJLFNBQVM7QUFDWCx5QkFBVyxNQUFNLFFBQVEsSUFBSSxLQUFLLGtCQUFrQixXQUFXLE1BQU0sUUFBUSxHQUFHLE9BQU87QUFBQSxZQUN6RjtBQUFBLFVBQ0Y7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGLFNBQVMsR0FBRztBQUFBLE1BRVo7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUVBLG1DQUEwQixDQUFDLE1BQWMsYUFBc0I7QUFDN0QsYUFBTyxLQUFLLFFBQVEsU0FBUyxFQUFFO0FBQy9CLGNBQU8sNkJBQU0sb0JBQW9CLFdBQVcsWUFBVyxDQUFDLFdBQ3BELE9BQ0EsS0FBSyxvQkFBb0IsR0FBRyxRQUFRLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDcEQ7QUFFQSw2QkFBb0IsQ0FBQyxNQUF5QixhQUFzQjtBQUNsRSxhQUFPLE1BQU0sUUFBUSxJQUFJLElBQ3JCLEtBQUssSUFBSSxPQUFLLEtBQUssd0JBQXdCLEdBQUcsUUFBUSxDQUFDLElBQ3ZELEtBQUssd0JBQXdCLE1BQU0sUUFBUTtBQUFBLElBQ2pEO0FBQUE7QUFBQSxFQTVQUSx1QkFBdUIsT0FBMkM7QUFDeEUsZUFBVyxlQUFlLE9BQU87QUFFL0IsVUFBSSxNQUFNLGVBQWUsV0FBVyxHQUFHO0FBQ3JDLGNBQU0sZUFBZSxNQUFNLFdBQThCO0FBQ3pELFlBQUksY0FBYztBQUNoQixxQkFBVyxhQUFhLGNBQWM7QUFFcEMsZ0JBQUksYUFBYSxlQUFlLFNBQVMsR0FBRztBQUMxQyxvQkFBTSxRQUFRLGFBQWEsU0FBc0M7QUFDakUsa0JBQUksTUFBTSxRQUFRLEtBQUssR0FBRztBQUN4Qix1QkFBTyxNQUFNLElBQUksTUFBTTtBQUFBLGNBQ3pCLFdBQVcsVUFBVSxVQUFhLFVBQVUsTUFBTTtBQUNoRCx1QkFBTyxPQUFPLEtBQUs7QUFBQSxjQUNyQjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLGdCQUFzQjtBQUc1QixTQUFLLGFBQWEsWUFBWSxNQUFNO0FBQ2xDLFlBQU0sV0FBVyxLQUFLLElBQUksWUFBWTtBQUN0QyxZQUFNLGNBQWMsS0FBSyxJQUFJLFlBQVk7QUFDekMsWUFBTSxjQUFjLEtBQUssVUFBVSxRQUFRO0FBQzNDLFVBQUksZ0JBQWdCLEtBQUssYUFBYTtBQUNwQyxhQUFLLGNBQWM7QUFDbkIsY0FBTSxRQUFRLEtBQUssdUJBQXVCLFdBQVc7QUFDckQsYUFBSyxRQUFRO0FBQ2IsYUFBSyxhQUFhLEtBQUs7QUFBQSxNQUN6QjtBQUFBLElBQ0YsR0FBRyxHQUFHO0FBQUEsRUFDUjtBQUFBLEVBRVEsZUFBcUI7QUFDM0IsUUFBSSxLQUFLLGVBQWUsUUFBVztBQUNqQyxvQkFBYyxLQUFLLFVBQVU7QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQW9CO0FBQ2xCLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLE1BQU0sS0FBd0I7QUFBQSxFQUVsQztBQUFBLEVBQ0EsSUFBSSxRQUEyQjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFQSxhQUFhLE1BQU07QUFDakIsVUFBTSxJQUFJLEtBQUssaUJBQWlCLFlBQVk7QUFDNUMsUUFBSSxTQUFTLENBQUM7QUFFZCxVQUFNLG1CQUFtQixRQUFNO0FBQzdCLFlBQU1DLGFBQVcsQ0FBQztBQUNsQixZQUFNLE1BQU0sR0FBRyxhQUFhLEtBQUs7QUFDakMsVUFBSSxLQUFLO0FBQ1AsY0FBTSxXQUFXLE1BQU0sS0FBSyxHQUFHLFFBQVE7QUFDdkMsY0FBTSxTQUFTLFNBQVMsSUFBSSxDQUFDLE1BQW1CLEVBQUUsYUFBYSxLQUFLLENBQUM7QUFDckUsY0FBTSxVQUFVLE9BQU8sU0FBUyxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQUssQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUUsWUFBSSxTQUFTO0FBQ1gsVUFBQUEsV0FBUyxHQUFHLElBQUksU0FBUyxJQUFJLE9BQUssbUJBQW1CLENBQUMsQ0FBQztBQUFBLFFBQ3pELE9BQU87QUFDTCxVQUFBQSxXQUFTLEdBQUcsSUFBSSxHQUFHO0FBQUEsUUFDckI7QUFBQSxNQUNGO0FBQ0EsYUFBT0E7QUFBQSxJQUNUO0FBRUEsVUFBTSxxQkFBcUIsQ0FBQyxPQUFrQjtBQUM1QyxVQUFJLElBQUk7QUFDTixZQUFJLGFBQWEsQ0FBQztBQUNsQixtQkFBVyxTQUFTLEdBQUcsVUFBVTtBQUMvQix1QkFBYSxrQ0FBSyxhQUFlLGlCQUFpQixLQUFLO0FBQUEsUUFDekQ7QUFDQSxlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFFQSxlQUFXLGNBQWMsR0FBRztBQUMxQixZQUFNLE1BQU0sV0FBVyxhQUFhLEtBQUs7QUFDekMsVUFBSSxDQUFDLEtBQUs7QUFDUixpQkFBUyxrQ0FBSyxTQUFXLG1CQUFtQixVQUFVO0FBQUEsTUFDeEQ7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUNBLFlBQVEsSUFBSSw0Q0FBNEM7QUFDeEQsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLFNBQVMsS0FBc0I7QUFDN0IsU0FBSyxNQUFNO0FBRVgsVUFBTSxPQUFPLEtBQUssY0FBYyxZQUFZLDJCQUEyQixRQUFRO0FBQy9FLFVBQU0sTUFDSixRQUFRLFFBQVEsS0FBSyxjQUFjLHdCQUF3QixJQUFJLEtBQUssY0FBYyxRQUFRO0FBQzVGLFFBQUksVUFBVSxJQUFJLHVCQUF1QjtBQUV6QyxRQUFJLFFBQVEsU0FBUyxLQUFLLGNBQWMsWUFBWSxHQUFHO0FBQ3JELE1BQUMsS0FBSyxjQUFjLFlBQVksRUFBa0IsTUFBTSxVQUFVO0FBQUEsSUFDcEU7QUFFQSxVQUFNLFNBQ0osUUFBUSxRQUNKO0FBQUEsTUFDRSxZQUFZLEtBQUs7QUFBQSxNQUNqQixTQUFTLE1BQU07QUFDYixnQkFBUSxJQUFJLFNBQVM7QUFBQSxNQUN2QjtBQUFBLElBQ0YsSUFDQSxLQUFLLGFBQWEsSUFBSTtBQUM1QixRQUFJLFFBQVEsT0FBTztBQUNqQixVQUFJLFlBQVksS0FBSyxRQUFRLE1BQVM7QUFBQSxJQUN4QyxPQUFPO0FBQ0wsTUFBQyxJQUFZLFdBQVcsS0FBSyxpQ0FBaUMsSUFBSSxtQkFBbUIsTUFBTTtBQUFBLElBQzdGO0FBQ0EsUUFBSSxRQUFRLE9BQU87QUFDakIsWUFBTSxRQUFRLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixNQUFNLENBQUMsRUFBRSxJQUFJLFNBQU8sSUFBSSxhQUFhLE1BQU0sQ0FBQztBQUMzRixZQUFNLFFBQVEsVUFBUTtBQUNwQixjQUFNLFNBQVMsU0FBUyxjQUFjLE1BQU07QUFDNUMsZUFBTyxNQUFNO0FBQ2IsZUFBTyxPQUFPO0FBQ2QsZUFBTyxRQUFRO0FBQ2YsZUFBTyxPQUFPO0FBQ2QsWUFBSSxZQUFZLE1BQU07QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSDtBQUNBLFNBQUssY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFFUyxvQkFBMEI7QUFDakMsVUFBTSxrQkFBa0I7QUFFeEIsV0FBTywrQkFBK0IsTUFBTTtBQUMxQyxhQUFPO0FBQUEsUUFDTCxVQUFVLFVBQVE7QUFDaEIsZUFBSyxTQUFTLElBQUk7QUFBQSxRQUNwQjtBQUFBLFFBQ0EsYUFBYSxNQUFNO0FBQUEsUUFFbkI7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBRUQsVUFBTSxTQUFTLEtBQUssbUJBQW1CO0FBQ3ZDLFVBQU0sYUFBYSxVQUFVLE9BQU8sTUFBTTtBQUMxQyxlQUFXLENBQUMsU0FBUyxHQUFHLENBQUFDLGFBQVc7QUFFakMsTUFBQUEsU0FBUSxDQUFDLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDdkIsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVTLHVCQUE2QjtBQUNwQyxVQUFNLHFCQUFxQjtBQUMzQixjQUFVLE1BQU0sS0FBSywrQkFBK0I7QUFFcEQsVUFBTSxVQUFVLFVBQVUsRUFBRTtBQUM1QixXQUFPLFFBQVEsS0FBSywrQkFBK0I7QUFDbkQsU0FBSyxhQUFhO0FBQUEsRUFDcEI7QUFBQSxFQUVBLHFCQUFxQjtBQUVuQixVQUFNLFNBQWlDO0FBQUEsTUFDckMsU0FBUyxLQUFLO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixPQUFPLE9BQU8sY0FBYyxLQUFLLENBQUM7QUFBQSxNQUNsQyxNQUFNLE9BQU8sYUFBYSxLQUFLLENBQUM7QUFBQSxJQUNsQztBQUVBLFFBQUksQ0FBQyxXQUFXLFNBQVM7QUFDdkIsV0FBSyxnQkFBZ0I7QUFDckIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFVBQVUsS0FBSyxhQUFhLGVBQWU7QUFDakQsVUFBTSxxQkFBcUIsS0FBSyxjQUFjLHlCQUF5QjtBQUV2RSxRQUFJLG9CQUFvQjtBQUN0QixZQUFNLFVBQVUsbUJBQW1CLGlCQUFpQix3QkFBd0I7QUFDNUUsaUJBQVcsVUFBVSxTQUFTO0FBQzVCLGNBQU0sV0FBVyxPQUFPLGFBQWEsSUFBSTtBQUN6QyxjQUFNLGNBQWMsT0FBTyxhQUFhLGNBQWM7QUFDdEQsY0FBTSxlQUFlLE9BQU8sYUFBYSxlQUFlO0FBRXhELFlBQUksWUFBWSxhQUFhO0FBRTNCLGdCQUFNLFFBQVEsZUFDVixLQUFLO0FBQUEsWUFDSCxLQUFLLGtCQUFrQixhQUFhLE9BQU87QUFBQSxZQUMzQyxLQUFLLGtCQUFrQixjQUFjLE9BQU87QUFBQSxVQUM5QyxJQUNBLEtBQUssa0JBQWtCLGFBQWEsT0FBTztBQUMvQyxnQkFBTSxlQUFlLE9BQU8sTUFBTSxRQUFRLEtBQUssQ0FBQztBQUNoRCxpQkFBTyxNQUFNLFFBQVEsSUFBSSxLQUFLLDJCQUEyQixjQUFjLEtBQUs7QUFBQSxRQUM5RTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLDJCQUEyQixPQUEwQixPQUEwQjtBQUNyRixVQUFNLGFBQWEsTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSztBQUN4RCxVQUFNLGFBQWEsTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSztBQUN4RCxXQUFPLFdBQVcsT0FBTyxVQUFVO0FBQUEsRUFDckM7QUFBQSxFQUVRLG9CQUFvQixLQUFhO0FBQ3ZDLFVBQU0sdUJBQXVCLElBQzFCLFFBQVEsZ0JBQWdCLElBQUksRUFDNUIsUUFBUSxTQUFTLEdBQUcsRUFDcEIsUUFBUSxVQUFVLFNBQVMsRUFDM0IsUUFBUSxXQUFXLFVBQVU7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQW1DUyxTQUFTO0FBQ2hCLFdBQU9DLHNCQUFvQixLQUFLLGlCQUM5QkE7QUFBQTtBQUFBLFVBRUksS0FBSyxhQUFhO0FBQUEsYUFDZjtBQUFBLEVBQ1g7QUFDRjtBQTdRRTtBQUFBLEVBRENGLFdBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxTQUFTLENBQUM7QUFBQSxHQU5wQyw2QkFPWDtBQUdBO0FBQUEsRUFEQ0EsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLHFDQUFxQyxDQUFDO0FBQUEsR0FUaEUsNkJBVVg7QUFHUTtBQUFBLEVBRFBHLFFBQU07QUFBQSxHQVpJLDZCQWFIO0FBYkcsK0JBQU47QUFBQSxFQUROQyxnQkFBYyxpQ0FBaUM7QUFBQSxHQUNuQzs7O0FDVGIsU0FBcUMsUUFBQUMsY0FBWTtBQUVqRCxTQUFTLGlCQUFBQyxpQkFBZSxTQUFBQyxlQUFhOzs7QUNGOUIsSUFBTSxtQkFBTixNQUFNLGtCQUFpQjtBQUFBO0FBQUEsRUEyQzVCLGNBQWM7QUExQ2QsU0FBUSxpQkFBaUI7QUFDekI7QUFBQSxTQUFRLGtCQUFrQjtBQUMxQjtBQUFBLFNBQVEsZ0JBQWdCO0FBQ3hCO0FBQUEsU0FBUSxjQUFjO0FBQ3RCO0FBQUEsU0FBUSxhQUEwQjtBQUNsQztBQUFBLFNBQVEsWUFBeUI7QUFDakM7QUFBQSxTQUFRLG9CQUFvQjtBQUM1QjtBQUFBLFNBQVEsYUFBYTtBQUNyQjtBQUFBLFNBQVEsbUJBQW1CO0FBQzNCO0FBQUEsU0FBUSx5QkFBeUI7QUFDakM7QUFBQSxTQUFRLFdBQWlCO0FBRXpCO0FBQUEsU0FBUSxpQkFBOEI7QUFDdEM7QUFBQSxTQUFRLHFCQUFvQyxDQUFDO0FBQzdDO0FBQUEsU0FBUSx1QkFBdUI7QUFFL0I7QUFBQSxTQUFRLGVBQWU7QUFBQSxNQUNyQixNQUFNLENBQUM7QUFBQSxNQUNQLFFBQVEsTUFBTSxLQUFLO0FBQ2pCLGFBQUssS0FBSyxJQUFJLElBQUk7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsUUFBUSxNQUFNO0FBQ1osZUFBTyxLQUFLLEtBQUssSUFBSTtBQUFBLE1BQ3ZCO0FBQUEsTUFDQSxlQUFlO0FBQUEsSUFDakI7QUFDQSxTQUFRLGNBQWMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBRW5DO0FBQUEsU0FBUSxhQUFhO0FBQ3JCO0FBQUEsU0FBUSxvQkFBb0I7QUFDNUI7QUFBQSxTQUFRLGFBQWE7QUFHckIsa0NBQXlCO0FBQ3pCLDhCQUFxQjtBQUNyQix3QkFBZTtBQUVmO0FBQUEsU0FBaUIsb0JBQW9CO0FBQ3JDO0FBQUEsU0FBaUIscUJBQXFCO0FBS3BDLFFBQUksa0JBQWlCLFVBQVU7QUFDN0IsYUFBTyxrQkFBaUI7QUFBQSxJQUMxQjtBQUNBLHNCQUFpQixXQUFXO0FBRzVCLGFBQVMsaUJBQWlCLGFBQWEsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJLEdBQUcsRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUMxRixhQUFTLGlCQUFpQixhQUFhLEtBQUssZ0JBQWdCLEtBQUssSUFBSSxHQUFHLEVBQUUsU0FBUyxNQUFNLENBQUM7QUFDMUYsYUFBUyxpQkFBaUIsWUFBWSxLQUFLLGVBQWUsS0FBSyxJQUFJLEdBQUcsRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUN4RixhQUFTLGlCQUFpQixXQUFXLEtBQUssZUFBZSxLQUFLLElBQUksR0FBRyxFQUFFLFNBQVMsTUFBTSxDQUFDO0FBQ3ZGLGFBQVMsaUJBQWlCLGVBQWUsS0FBSyxrQkFBa0IsS0FBSyxJQUFJLEdBQUcsRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUU5RixhQUFTLGlCQUFpQixXQUFXLEtBQUssY0FBYyxLQUFLLElBQUksQ0FBQztBQUNsRSxhQUFTLGlCQUFpQixTQUFTLEtBQUssWUFBWSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQ2hFO0FBQUEsRUFFQSxxQkFBcUIsWUFBdUI7QUFDMUMsZUFBVyxRQUFRLFFBQU07QUFDdkIsU0FBRyxhQUFhLFlBQVksR0FBRztBQUMvQixTQUFHLGlCQUFpQixTQUFTLE1BQU8sS0FBSyxpQkFBaUIsRUFBa0I7QUFDNUUsU0FBRyxpQkFBaUIsUUFBUSxNQUFPLEtBQUssaUJBQWlCLElBQUs7QUFFOUQsU0FBRyxpQkFBaUIsY0FBYyxLQUFLLGlCQUFpQixLQUFLLElBQUksR0FBRyxFQUFFLFNBQVMsTUFBTSxDQUFDO0FBQ3RGLFNBQUcsaUJBQWlCLGFBQWEsS0FBSyxpQkFBaUIsS0FBSyxJQUFJLEdBQUcsRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQ3ZGLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWNRLGlCQUFpQixHQUFHO0FBQzFCLFNBQUssaUJBQWlCLEtBQUssSUFBSTtBQUMvQixVQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksS0FBSyxvQkFBb0IsQ0FBQztBQUMzQyxTQUFLLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtBQUM5QixTQUFLLGFBQWEsRUFBRTtBQUNwQixTQUFLLGNBQWM7QUFHbkIsU0FBSyxXQUFXLEtBQUssV0FBVyxZQUFZO0FBRTVDLFFBQUksS0FBSyxvQkFBb0I7QUFDM0IsV0FBSyxhQUFhO0FBQ2xCLFdBQUssZ0JBQWdCLEdBQUcsRUFBRSxTQUFTLEdBQUcsU0FBUyxFQUFFLENBQUM7QUFBQSxJQUNwRDtBQUVBLFFBQUksQ0FBQyxLQUFLLGNBQWM7QUFFdEIsWUFBTSxnQkFBZ0IsT0FBTyxpQkFBaUIsS0FBSyxVQUFVO0FBQzdELFdBQUssbUJBQW1CLGNBQWMsY0FBYyxTQUFTLEtBQUssY0FBYztBQUdoRixXQUFLLG9CQUFvQixjQUFjLGNBQWM7QUFHckQsV0FBSyxXQUFXLE1BQU0sYUFBYTtBQUduQyxZQUFNLE9BQU8sS0FBSyxXQUFXLHNCQUFzQjtBQUNuRCxXQUFLLFlBQVksSUFBSSxJQUFJLEtBQUs7QUFDOUIsV0FBSyxZQUFZLElBQUksSUFBSSxLQUFLO0FBRzlCLFdBQUssV0FBVyxNQUFNLFNBQVM7QUFFL0IsV0FBSyxXQUFXLE1BQU07QUFBQSxJQUN4QjtBQUVBLE1BQUUsZUFBZTtBQUFBLEVBQ25CO0FBQUEsRUFFUSxnQkFBZ0IsR0FBRztBQUN6QixRQUFJLEtBQUssZUFBZSxLQUFLLFlBQVk7QUFDdkMsWUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssb0JBQW9CLENBQUM7QUFDM0MsWUFBTSxlQUFlLEVBQUUsU0FBUyxHQUFHLFNBQVMsRUFBRTtBQUU5QyxVQUFJLEtBQUssc0JBQXNCLFlBQVksS0FBSyxLQUFLLG1CQUFtQjtBQUN0RSxhQUFLLFdBQVcsTUFBTSxnQkFBZ0I7QUFDdEMsYUFBSyxhQUFhO0FBQUEsTUFDcEI7QUFFQSxXQUFLLGdCQUFnQixHQUFHLFlBQVk7QUFDcEMsUUFBRSxlQUFlO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBQUEsRUFFUSxnQkFBZ0IsR0FBRyxjQUFvRDtBQUM3RSxRQUFJLENBQUMsS0FBSyxXQUFZO0FBRXRCLFFBQUksS0FBSyxjQUFjO0FBRXJCLFVBQUksQ0FBQyxLQUFLLFdBQVc7QUFDbkIsYUFBSyxXQUFXLE1BQU0sVUFBVSxLQUFLLG1CQUFtQixTQUFTO0FBQ2pFLGFBQUssWUFBWSxLQUFLLFdBQVcsVUFBVSxJQUFJO0FBRS9DLFlBQUksS0FBSyx3QkFBd0I7QUFDL0IsZ0JBQU0saUJBQWlCLE9BQU8saUJBQWlCLEtBQUssVUFBVTtBQUM5RCxxQkFBVyxTQUFTLGdCQUFnQjtBQUNsQyxpQkFBSyxVQUFVLE1BQU0sS0FBSyxJQUFJLGVBQWUsaUJBQWlCLEtBQUs7QUFBQSxVQUNyRTtBQUFBLFFBQ0Y7QUFHQSxZQUFJLEtBQUssb0JBQW9CLFlBQVk7QUFFdkMsZUFBSyxTQUFTLEtBQUssWUFBWSxLQUFLLFNBQVM7QUFBQSxRQUMvQyxXQUFXLEtBQUssb0JBQW9CLFVBQVU7QUFDNUMsbUJBQVMsS0FBSyxZQUFZLEtBQUssU0FBUztBQUFBLFFBQzFDO0FBRUEsYUFBSyx1QkFBdUIsWUFBWTtBQUN4QyxhQUFLLG1CQUFtQixZQUFZO0FBQ3BDLGFBQUssb0JBQW9CLEtBQUssWUFBWSxXQUFXO0FBQUEsTUFDdkQ7QUFFQSxXQUFLLHdCQUF3QixZQUFZO0FBQUEsSUFDM0MsT0FBTztBQUVMLFVBQUksS0FBSyxpQkFBaUI7QUFDeEIsY0FBTSxTQUFTLGFBQWEsVUFBVSxLQUFLLGdCQUFnQjtBQUMzRCxjQUFNLFNBQVMsYUFBYSxVQUFVLEtBQUssZ0JBQWdCO0FBTTNELGFBQUssV0FBVyxNQUFNLFlBQVksR0FBRyxLQUFLLGdCQUFnQixjQUFjLE1BQU0sT0FBTyxNQUFNO0FBRTNGLFlBQUksQ0FBQyxLQUFLLHdCQUF3QjtBQUNoQyxlQUFLLG9CQUFvQixLQUFLLFlBQVksV0FBVztBQUNyRCxlQUFLLHlCQUF5QjtBQUFBLFFBQ2hDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxVQUFNLGFBQWEsS0FBSyxlQUFlLENBQUM7QUFFeEMsUUFBSSxlQUFlLEtBQUssWUFBWTtBQUNsQyxXQUFLLG9CQUFvQixZQUFZLFdBQVc7QUFDaEQsV0FBSyxvQkFBb0IsS0FBSyxZQUFZLFdBQVc7QUFDckQsV0FBSyxhQUFhO0FBQUEsSUFDcEI7QUFFQSxTQUFLLG9CQUFvQjtBQUN6QixRQUFJLEtBQUssa0JBQW1CLE1BQUssb0JBQW9CLFlBQVksVUFBVTtBQUFBLEVBQzdFO0FBQUEsRUFFUSxlQUFlLEdBQUc7QUF2TTVCO0FBd01JLFNBQUssb0JBQW9CO0FBQ3pCLFNBQUssY0FBYztBQUNuQixRQUFJLFlBQVk7QUFJaEIsUUFBSSxLQUFLLG1CQUFtQjtBQUMxQixXQUFLLG9CQUFvQixLQUFLLG1CQUFtQixNQUFNO0FBQ3ZELFdBQUssb0JBQW9CLEtBQUssWUFBWSxTQUFTO0FBQ25ELGtCQUFZO0FBQUEsSUFDZCxXQUFXLEtBQUssWUFBWTtBQUMxQixZQUFNLGVBQWUsSUFBSSxZQUFZLFdBQVcsRUFBRSxTQUFTLE1BQU0sWUFBWSxLQUFLLENBQUM7QUFDbkYsbUJBQWEsY0FBYyxJQUFJLEVBQUUsWUFBWSxPQUFPO0FBQ3BELGlCQUFLLGVBQUwsbUJBQWlCLGNBQWM7QUFBQSxJQUNqQztBQUVBLFNBQUssZUFBZSxTQUFTO0FBQUEsRUFDL0I7QUFBQSxFQUVRLGtCQUFrQixHQUFHO0FBQzNCLFNBQUssZUFBZTtBQUFBLEVBQ3RCO0FBQUEsRUFFUSxlQUFlLE9BQU87QUFDNUIsVUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEtBQUssb0JBQW9CLEtBQUs7QUFDL0MsV0FBTyxLQUFLLHFCQUFxQixVQUFVLEdBQUcsQ0FBQztBQUFBLEVBQ2pEO0FBQUEsRUFFUSxxQkFBcUIsTUFBNEIsR0FBVyxHQUFXLFFBQWdCLEdBQW1CO0FBRWhILFVBQU0sWUFBWTtBQUNsQixRQUFJLFFBQVEsV0FBVztBQUNyQixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sVUFBVSxLQUFLLGlCQUFpQixHQUFHLENBQUM7QUFFMUMsUUFBSSxDQUFDLFNBQVM7QUFDWixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksUUFBUSxhQUFhLFVBQVUsR0FBRztBQUNwQyxhQUFPO0FBQUEsSUFDVDtBQUdBLFFBQUksaUJBQWlCLFFBQVE7QUFDN0IsV0FBTyxnQkFBZ0I7QUFDckIsVUFBSSxlQUFlLGFBQWEsVUFBVSxHQUFHO0FBQzNDLGVBQU87QUFBQSxNQUNUO0FBQ0EsdUJBQWlCLGVBQWU7QUFBQSxJQUNsQztBQUdBLFFBQUksUUFBUSxjQUFjLFFBQVEsV0FBVztBQUMzQyxZQUFNLGdCQUFnQixLQUFLLHFCQUFxQixRQUFRLFlBQVksR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUNuRixVQUFJLGVBQWU7QUFDakIsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBR0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLGNBQWMsR0FBa0I7QUFDdEMsUUFBSSxLQUFLLGdCQUFnQjtBQUN2QixVQUFJLEVBQUUsUUFBUSxPQUFPLENBQUMsS0FBSyxZQUFZO0FBRXJDLFVBQUUsZUFBZTtBQUNqQixhQUFLLGNBQWM7QUFDbkIsYUFBSyxhQUFhLEtBQUs7QUFDdkIsYUFBSyxhQUFhO0FBR2xCLGFBQUssaUJBQWlCO0FBR3RCLGFBQUssb0JBQW9CLEtBQUssWUFBWSxXQUFXO0FBQUEsTUFDdkQsV0FBVyxFQUFFLFFBQVEsU0FBUyxLQUFLLFlBQVk7QUFFN0MsVUFBRSxlQUFlO0FBQ2pCLGFBQUssbUJBQW1CO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRVEsWUFBWSxHQUFrQjtBQUNwQyxRQUFJLEVBQUUsUUFBUSxPQUFPLEtBQUssY0FBYyxLQUFLLG1CQUFtQjtBQUU5RCxRQUFFLGVBQWU7QUFDakIsV0FBSyxvQkFBb0IsS0FBSyxtQkFBbUIsTUFBTTtBQUN2RCxXQUFLLG9CQUFvQixLQUFLLFlBQVksU0FBUztBQUNuRCxXQUFLLGVBQWUsSUFBSTtBQUFBLElBQzFCO0FBQUEsRUFDRjtBQUFBLEVBRVEsbUJBQW1CO0FBRXpCLFNBQUsscUJBQXFCLE1BQU0sS0FBSyxTQUFTLGlCQUFpQixZQUFZLENBQUM7QUFDNUUsU0FBSyx1QkFBdUI7QUFBQSxFQUM5QjtBQUFBLEVBRVEscUJBQXFCO0FBQzNCLFFBQUksS0FBSyxtQkFBbUIsV0FBVyxFQUFHO0FBRzFDLFNBQUssd0JBQXdCLEtBQUssdUJBQXVCLEtBQUssS0FBSyxtQkFBbUI7QUFHdEYsVUFBTSxlQUFlLEtBQUssbUJBQW1CLEtBQUssb0JBQW9CO0FBQ3RFLGlCQUFhLE1BQU07QUFHbkIsU0FBSyxvQkFBb0I7QUFHekIsU0FBSyxvQkFBb0IsY0FBYyxXQUFXO0FBQUEsRUFDcEQ7QUFBQSxFQUVRLG9CQUFvQixPQUFPLE9BQU8sT0FBTztBQUMvQyxVQUFNLFFBQVEsTUFBTSxVQUFVLE1BQU0sUUFBUSxDQUFDLElBQUk7QUFDakQsV0FBTztBQUFBLE1BQ0wsR0FBRyxPQUFPLE1BQU0sUUFBUSxNQUFNO0FBQUEsTUFDOUIsR0FBRyxPQUFPLE1BQU0sUUFBUSxNQUFNO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBQUEsRUFFUSx1QkFBdUIsT0FBTztBQUNwQyxVQUFNLE9BQU8sS0FBSyxXQUFXLHNCQUFzQjtBQUNuRCxTQUFLLFlBQVksSUFBSSxNQUFNLFVBQVUsS0FBSztBQUMxQyxTQUFLLFlBQVksSUFBSSxNQUFNLFVBQVUsS0FBSztBQUFBLEVBQzVDO0FBQUEsRUFFUSxtQkFBbUIsT0FBTztBQUNoQyxTQUFLLFVBQVUsTUFBTSxXQUFXO0FBQ2hDLFNBQUssVUFBVSxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsS0FBSyxZQUFZLENBQUM7QUFDaEUsU0FBSyxVQUFVLE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxLQUFLLFlBQVksQ0FBQztBQUNqRSxTQUFLLFVBQVUsTUFBTSxnQkFBZ0I7QUFDckMsU0FBSyxVQUFVLE1BQU0sU0FBUztBQUFBLEVBQ2hDO0FBQUEsRUFFUSx3QkFBd0IsT0FBTztBQUNyQywwQkFBc0IsTUFBTTtBQUMxQixVQUFJLEtBQUsscUJBQXFCLENBQUMsS0FBSyxVQUFXO0FBRS9DLFlBQU0sVUFBVSxNQUFNLFVBQVUsS0FBSyxZQUFZO0FBQ2pELFlBQU0sU0FBUyxNQUFNLFVBQVUsS0FBSyxZQUFZO0FBR2hELFlBQU0sRUFBRSxTQUFTLGFBQWEsUUFBUSxXQUFXLElBQUksS0FBSyxnQkFBZ0IsU0FBUyxRQUFRLEtBQUssU0FBUztBQUV6RyxXQUFLLFVBQVUsTUFBTSxPQUFPLEdBQUcsV0FBVztBQUMxQyxXQUFLLFVBQVUsTUFBTSxNQUFNLEdBQUcsVUFBVTtBQUFBLElBQzFDLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSx5QkFBeUIsUUFBZ0IsUUFBZ0I7QUFFL0QsUUFBSTtBQUNKLFFBQUksS0FBSyxvQkFBb0IsWUFBWTtBQUN2QyxxQkFBZSxLQUFLLFNBQVMsS0FBSyxzQkFBc0I7QUFBQSxJQUMxRCxXQUFXLEtBQUssb0JBQW9CLFVBQVU7QUFDNUMscUJBQWUsU0FBUyxnQkFBZ0Isc0JBQXNCO0FBQUEsSUFDaEUsT0FBTztBQUVMLHFCQUFlLElBQUksUUFBUSxHQUFHLEdBQUcsT0FBTyxZQUFZLE9BQU8sV0FBVztBQUFBLElBQ3hFO0FBR0EsVUFBTSxjQUFjLEtBQUssV0FBVyxzQkFBc0I7QUFDMUQsVUFBTSxlQUFlLFlBQVk7QUFDakMsVUFBTSxnQkFBZ0IsWUFBWTtBQUdsQyxVQUFNLFVBQVUsWUFBWSxPQUFPO0FBQ25DLFVBQU0sU0FBUyxZQUFZLE1BQU07QUFHakMsVUFBTSxjQUFjLEtBQUssSUFBSSxhQUFhLE1BQU0sS0FBSyxJQUFJLFNBQVMsYUFBYSxRQUFRLFlBQVksQ0FBQztBQUNwRyxVQUFNLGFBQWEsS0FBSyxJQUFJLGFBQWEsS0FBSyxLQUFLLElBQUksUUFBUSxhQUFhLFNBQVMsYUFBYSxDQUFDO0FBR25HLFVBQU0sZ0JBQWdCLGNBQWMsWUFBWTtBQUNoRCxVQUFNLGdCQUFnQixhQUFhLFlBQVk7QUFFL0MsV0FBTyxFQUFFLGVBQWUsY0FBYztBQUFBLEVBQ3hDO0FBQUEsRUFFUSxnQkFBZ0IsU0FBaUIsUUFBZ0IsU0FBc0I7QUFFN0UsUUFBSTtBQUNKLFFBQUksS0FBSyxvQkFBb0IsWUFBWTtBQUN2QyxxQkFBZSxLQUFLLFNBQVMsS0FBSyxzQkFBc0I7QUFBQSxJQUMxRCxXQUFXLEtBQUssb0JBQW9CLFVBQVU7QUFDNUMscUJBQWUsU0FBUyxnQkFBZ0Isc0JBQXNCO0FBQUEsSUFDaEUsT0FBTztBQUVMLHFCQUFlLElBQUksUUFBUSxHQUFHLEdBQUcsT0FBTyxZQUFZLE9BQU8sV0FBVztBQUFBLElBQ3hFO0FBR0EsVUFBTSxjQUFjLFFBQVEsc0JBQXNCO0FBQ2xELFVBQU0sZUFBZSxZQUFZO0FBQ2pDLFVBQU0sZ0JBQWdCLFlBQVk7QUFHbEMsVUFBTSxjQUFjLEtBQUssSUFBSSxhQUFhLE1BQU0sS0FBSyxJQUFJLFNBQVMsYUFBYSxRQUFRLFlBQVksQ0FBQztBQUNwRyxVQUFNLGFBQWEsS0FBSyxJQUFJLGFBQWEsS0FBSyxLQUFLLElBQUksUUFBUSxhQUFhLFNBQVMsYUFBYSxDQUFDO0FBRW5HLFdBQU8sRUFBRSxTQUFTLGFBQWEsUUFBUSxXQUFXO0FBQUEsRUFDcEQ7QUFBQSxFQUVRLHNCQUFzQixPQUFlO0FBQzNDLFVBQU0sUUFBUSxLQUFLLElBQUksTUFBTSxVQUFVLEtBQUssZ0JBQWdCLENBQUM7QUFDN0QsVUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLFVBQVUsS0FBSyxnQkFBZ0IsQ0FBQztBQUM3RCxXQUFPLFFBQVE7QUFBQSxFQUNqQjtBQUFBLEVBRVEsb0JBQW9CLFNBQVMsV0FBVyxTQUFTLE1BQU07QUFDN0QsUUFBSSxDQUFDLFFBQVM7QUFDZCxVQUFNLFFBQVEsSUFBSSxZQUFZLFdBQVcsRUFBRSxTQUFTLFFBQVEsWUFBWSxLQUFLLENBQUM7QUFDOUUsVUFBTSxjQUFjLElBQUksS0FBSztBQUM3QixZQUFRLGNBQWMsS0FBSztBQUFBLEVBQzdCO0FBQUEsRUFFUSxlQUFlLFlBQXFCLE9BQU87QUEzYXJEO0FBNGFJLFFBQUksS0FBSyxZQUFZO0FBQ25CLFVBQUksS0FBSyxjQUFjO0FBQ3JCLGFBQUssV0FBVyxNQUFNLFVBQVU7QUFDaEMsbUJBQUssY0FBTCxtQkFBZ0IsY0FBYyxZQUFZLEtBQUs7QUFBQSxNQUNqRCxPQUFPO0FBRUwsWUFBSSxDQUFDLFVBQVcsTUFBSyxXQUFXLE1BQU0sWUFBWTtBQUNsRCxhQUFLLFdBQVcsTUFBTSxTQUFTO0FBQy9CLGFBQUssV0FBVyxNQUFNLGdCQUFnQjtBQUV0QyxhQUFLLFdBQVcsTUFBTSxhQUFhLEtBQUs7QUFHeEMsYUFBSyxvQkFBb0I7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFFQSxTQUFLLGFBQWE7QUFDbEIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssWUFBWTtBQUNqQixTQUFLLGNBQWM7QUFDbkIsU0FBSyxpQkFBaUI7QUFDdEIsU0FBSyxrQkFBa0I7QUFDdkIsU0FBSyxvQkFBb0I7QUFDekIsU0FBSyxlQUFlO0FBQUEsTUFDbEIsTUFBTSxDQUFDO0FBQUEsTUFDUCxRQUFRLE1BQU0sS0FBSztBQUNqQixhQUFLLEtBQUssSUFBSSxJQUFJO0FBQUEsTUFDcEI7QUFBQSxNQUNBLFFBQVEsTUFBTTtBQUNaLGVBQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsZUFBZTtBQUFBLElBQ2pCO0FBQ0EsU0FBSyxjQUFjLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUNoQyxTQUFLLGFBQWE7QUFDbEIsU0FBSyxvQkFBb0I7QUFDekIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUsseUJBQXlCO0FBRTlCLFNBQUssV0FBVztBQUFBLEVBQ2xCO0FBQ0Y7OztBQ3RkQSxTQUFTLFlBQUFDLGtCQUFnQjtBQU9sQixJQUFNLGtCQUFrQixDQUM3QixZQUNBLGVBQ0EsdUJBQ0c7QUFBQSxFQUNILE1BQWUsMEJBQTBCLFdBQVc7QUFBQSxJQUFwRDtBQUFBO0FBRzhDLHNCQUFXO0FBQUE7QUFBQSxJQUU5QyxhQUFhLGNBQW9CO0FBQ3hDLFVBQUksS0FBSyxlQUFlLEVBQUc7QUFDM0IsWUFBTSxhQUFhLFlBQVk7QUFFL0IsWUFBTSxhQUFhLEtBQUsscUJBQXFCO0FBQzdDLFdBQUssd0JBQXdCO0FBQzdCLGlCQUFXLFFBQVEsZUFBYTtBQUM5QixhQUFLLGlCQUFpQixTQUFTO0FBQy9CLGFBQUssMkJBQTJCLFNBQVM7QUFBQSxNQUMzQyxDQUFDO0FBQUEsSUFDSDtBQUFBLElBRVEsaUJBQTBCO0FBQ2hDLGFBQU8sS0FBSyxVQUFVLFNBQVMsbUJBQW1CO0FBQUEsSUFDcEQ7QUFBQSxJQUVRLHVCQUFrQztBQUN4QyxhQUFPLE1BQU07QUFBQSxRQUNYLGdCQUFnQixLQUFLLFdBQVcsaUJBQWlCLGtCQUFrQixJQUFJLEtBQUssaUJBQWlCLGtCQUFrQjtBQUFBLE1BQ2pIO0FBQUEsSUFDRjtBQUFBLElBRVEsMEJBQWdDO0FBQ3RDLFdBQUssa0JBQWtCLEtBQUssZ0JBQWdCLEtBQUssSUFBSTtBQUNyRCxXQUFLLG1CQUFtQixLQUFLLGlCQUFpQixLQUFLLElBQUk7QUFDdkQsV0FBSyxtQkFBbUIsS0FBSyxpQkFBaUIsS0FBSyxJQUFJO0FBQ3ZELFdBQUssY0FBYyxLQUFLLFlBQVksS0FBSyxJQUFJO0FBQUEsSUFDL0M7QUFBQSxJQUVRLGlCQUFpQixXQUEwQjtBQUNqRCxnQkFBVSxhQUFhLFlBQVksTUFBTTtBQUN6QyxnQkFBVSxpQkFBaUIsYUFBYSxLQUFLLGdCQUFnQjtBQUM3RCxXQUFLLHFCQUFxQixTQUFTO0FBQUEsSUFDckM7QUFBQSxJQUVRLDJCQUEyQixXQUEwQjtBQUMzRCxXQUFLLFdBQVcsSUFBSSxpQkFBaUIsZUFBYTtBQUNoRCxrQkFBVSxRQUFRLENBQUMsRUFBRSxjQUFjLE1BQU07QUFDdkMsY0FBSSxrQkFBa0IsWUFBWTtBQUNoQyxpQkFBSyx3QkFBd0IsU0FBUztBQUFBLFVBQ3hDO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQ0QsV0FBSyxTQUFTLFFBQVEsV0FBVyxFQUFFLFlBQVksS0FBSyxDQUFDO0FBQUEsSUFDdkQ7QUFBQSxJQUVRLHdCQUF3QixXQUEwQjtBQUN4RCxZQUFNLFdBQVcsVUFBVSxhQUFhLFVBQVU7QUFDbEQsVUFBSSxVQUFVO0FBQ1osYUFBSyxxQkFBcUIsU0FBUztBQUFBLE1BQ3JDLE9BQU87QUFDTCxhQUFLLHFCQUFxQixTQUFTO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBQUEsSUFFUSxxQkFBcUIsV0FBMEI7QUFDckQsZ0JBQVUsaUJBQWlCLFlBQVksS0FBSyxlQUFlO0FBQzNELGdCQUFVLGlCQUFpQixhQUFhLEtBQUssZ0JBQWdCO0FBQzdELGdCQUFVLGlCQUFpQixRQUFRLEtBQUssV0FBVztBQUFBLElBQ3JEO0FBQUEsSUFFUSxxQkFBcUIsV0FBMEI7QUFDckQsZ0JBQVUsb0JBQW9CLFlBQVksS0FBSyxlQUFlO0FBQzlELGdCQUFVLG9CQUFvQixhQUFhLEtBQUssZ0JBQWdCO0FBQ2hFLGdCQUFVLG9CQUFvQixRQUFRLEtBQUssV0FBVztBQUFBLElBQ3hEO0FBQUEsSUFFUyx1QkFBNkI7QUFyRjFDO0FBc0ZNLFVBQUksS0FBSyxlQUFlLEVBQUc7QUFDM0IsWUFBTSxxQkFBcUI7QUFDM0IsaUJBQUssYUFBTCxtQkFBZTtBQUFBLElBQ2pCO0FBQUEsSUFFUSxpQkFBaUIsSUFBcUI7QUFDNUMsU0FBRyxlQUFlO0FBQUEsSUFDcEI7QUFBQSxJQUVRLGdCQUFnQixJQUF3QjtBQUM5QyxTQUFHLGVBQWU7QUFDbEIsV0FBSyxrQkFBa0IsR0FBRyxhQUE0QjtBQUN0RCxTQUFHLGFBQWEsYUFBYTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUFBLElBRVEsa0JBQWtCLFdBQThCO0FBQ3RELGdCQUFVLGFBQWEsVUFBVSxFQUFFO0FBQUEsSUFDckM7QUFBQSxJQUVBLE1BQWMsWUFBWSxJQUFpQztBQUN6RCxTQUFHLGVBQWU7QUFDbEIsWUFBTSxZQUFZLEdBQUc7QUFDckIsWUFBTSxhQUFhLEdBQUcsYUFBYSxRQUFRLE1BQU07QUFDakQsWUFBTSxZQUFZLEtBQUssY0FBYyxVQUFVO0FBRy9DLFVBQUksQ0FBQyxVQUFXLFFBQU87QUFDdkIsVUFBSSxhQUFhLENBQUMsS0FBSyxZQUFZLFdBQVcsU0FBUyxHQUFHO0FBQ3hELGtCQUFVLE1BQU0sWUFBWTtBQUM1QixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sS0FBSyx5QkFBeUIsV0FBVyxTQUFTO0FBQ3hELFdBQUssb0JBQW9CLFNBQVM7QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVRLGNBQWMsWUFBd0M7QUFDNUQsVUFBSSxDQUFDLFdBQVksUUFBTztBQUN4QixhQUNFLEtBQUssY0FBYyxlQUFlLFVBQVUsR0FBRyxLQUFLLEtBQUssV0FBVyxjQUFjLGVBQWUsVUFBVSxHQUFHO0FBQUEsSUFFbEg7QUFBQSxJQUVRLFlBQVksV0FBd0IsV0FBaUM7QUFDM0UsYUFBTyxVQUFVLGNBQWMsYUFBYSxZQUFZLE1BQU0sVUFBVSxhQUFhLFlBQVk7QUFBQSxJQUNuRztBQUFBLElBRUEsTUFBYyx5QkFBeUIsV0FBd0IsV0FBdUM7QUFDcEcsWUFBTSxjQUFjLE1BQVk7QUFDOUIsa0JBQVUsTUFBTSxZQUFZO0FBQzVCLGtCQUFVLFlBQVksU0FBUztBQUcvQixhQUFLLHNCQUFzQixFQUFFO0FBQzdCLGFBQUssY0FBYyxFQUFFLElBQUk7QUFBQSxNQUMzQjtBQUVBLFVBQUksQ0FBQyxTQUFTLHFCQUFxQjtBQUNqQyxvQkFBWTtBQUNaO0FBQUEsTUFDRjtBQUVBLFlBQU0sYUFBYSxTQUFTLG9CQUFvQixXQUFXO0FBQzNELFlBQU0sV0FBVztBQUFBLElBR25CO0FBQUEsSUFFUSxvQkFBb0IsV0FBOEI7QUFDeEQsZ0JBQVUsZ0JBQWdCLFFBQVE7QUFBQSxJQUNwQztBQUFBLElBRVEsaUJBQWlCLElBQXdCO0FBQy9DLFNBQUcsZUFBZTtBQUNsQixXQUFLLG9CQUFvQixHQUFHLGFBQTRCO0FBQ3hELFNBQUcsYUFBYSxhQUFhO0FBQzdCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQXRKOEM7QUFBQSxJQUEzQ0MsV0FBUyxFQUFFLE1BQU0sU0FBUyxTQUFTLEtBQUssQ0FBQztBQUFBLEtBSDdCLGtCQUcrQjtBQXVKOUMsU0FBTztBQUNUOzs7QUNuSk8sSUFBTSxrQkFBa0IsQ0FDN0IsWUFDQSxlQUNBLGtCQUNHO0FBQUEsRUFDSCxNQUFlLDBCQUEwQixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBNERwRDtBQUNBLFNBQU87QUFDVDs7O0FDbkZBLFNBQVMsWUFBQUMsa0JBQWdCOzs7QUN5QmxCLFNBQVMsVUFBVSxlQUF1QixTQUE0QjtBQUMzRSxNQUFJO0FBQ0osUUFBTSxrQkFBOEMsbUJBQy9DO0FBRUwsU0FBTyxDQUNMLE9BQ0Esb0JBQ1M7QUFDVCxVQUFNLEVBQUUsbUJBQW1CLHFCQUFxQixJQUFJO0FBRXBELFVBQU0sb0JBQW9CLFdBQTJCO0FBekN6RDtBQTBDTSx3QkFBa0IsS0FBSyxJQUFJO0FBQzNCLFlBQU0sV0FBVyxDQUFDLGlCQUFtQztBQUNuRCxjQUFNLGtCQUFrQixNQUFNLEtBQUssS0FBSyxpQkFBaUIsYUFBYSxDQUFDO0FBQ3ZFLG1CQUFXLFlBQVksY0FBYztBQUNuQyxnQkFBTSxhQUFhLE1BQU0sS0FBSyxTQUFTLFVBQVUsRUFBRSxJQUFJLE9BQUssQ0FBWTtBQUN4RSxnQkFBTSxlQUFlLE1BQU0sS0FBSyxTQUFTLFVBQVUsRUFBRSxJQUFJLE9BQUssQ0FBWTtBQUMxRSxjQUFJLFNBQVMsU0FBUyxlQUFlLFdBQVcsS0FBSyxPQUFLLGdCQUFnQixTQUFTLENBQUMsQ0FBQyxHQUFHO0FBQ3RGLFlBQUMsS0FBSyxlQUFlLEVBQStCLFlBQVksWUFBWTtBQUFBLFVBQzlFO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFDQSxpQkFBVyxJQUFJLGlCQUFpQixRQUFRO0FBQ3hDLGVBQVMsUUFBUSxNQUFNLEVBQUUsV0FBVyxNQUFNLFNBQVMsS0FBSyxDQUFDO0FBRXpELFlBQU0saUJBQWdCLFVBQUssaUJBQWlCLGFBQWEsTUFBbkMsWUFBd0MsQ0FBQztBQUMvRCxNQUFDLEtBQUssZUFBZSxFQUErQixNQUFNLEtBQUssYUFBYSxHQUFHLENBQUMsQ0FBQztBQUFBLElBQ25GO0FBRUEsVUFBTSx1QkFBdUIsV0FBMkI7QUFDdEQsMkJBQXFCLEtBQUssSUFBSTtBQUM5QixlQUFTLFdBQVc7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFDRjs7O0FEL0NPLElBQU0sMkJBQTJCLENBQ3RDLFlBQ0Esb0JBQ0EsNEJBQ0EsdUJBQ0c7QUFBQSxFQUNILE1BQWUsbUNBQW1DO0FBQUEsSUFDaEQsZ0JBQWdCLFlBQVksNEJBQTRCLGtCQUFrQjtBQUFBLElBQzFFO0FBQUEsSUFDQTtBQUFBLEVBQ0YsRUFBRTtBQUFBLElBSkY7QUFBQTtBQUtFLFdBQVUsYUFBYSxvQkFBSSxJQUF5RDtBQUNwRixXQUFVLGFBQTRCLENBQUM7QUFHTywyQkFBMEM7QUFBQSxRQUN0RixxQkFBcUI7QUFBQSxRQUNyQixxQkFBcUI7QUFBQSxRQUNyQixhQUFhO0FBQUEsTUFDZjtBQUMwRSw2QkFBa0I7QUFDbEIsNkJBQWtCO0FBa0U1RixXQUFRLGtCQUFrQixDQUFDLE9BQWtCO0FBQzNDLGNBQU0sU0FBUyxHQUFHO0FBQ2xCLFdBQUcsYUFBYSxRQUFRLFFBQVEsT0FBTyxhQUFhLFlBQVksQ0FBQztBQUNqRSxlQUFPLGFBQWEsWUFBWSxFQUFFO0FBQ2xDLGFBQUssbUJBQW1CO0FBQUEsTUFDMUI7QUFFQSxXQUFRLGdCQUFnQixPQUFPLE9BQWtCO0FBQy9DLFdBQUcsZUFBZTtBQUNsQixhQUFLLHFCQUFxQjtBQUMxQixjQUFNLFlBQVksR0FBRztBQUNyQixrQkFBVSxnQkFBZ0IsVUFBVTtBQUNwQyxjQUFNLGFBQWEsTUFBTSxLQUFLLFdBQVcsRUFBRTtBQUMzQyxZQUFJLENBQUMsWUFBWTtBQUNmLGNBQUksS0FBSyxjQUFjLHFCQUFxQjtBQUMxQyxpQkFBSyxnQ0FBZ0MsU0FBUztBQUFBLFVBQ2hEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFZQTtBQUFBO0FBQUEsV0FBUSx1QkFBdUIsQ0FBQyxPQUFvQztBQUNsRSxZQUFJLENBQUMsR0FBRyxhQUFhLE9BQU87QUFDMUIsaUJBQU8sUUFBUSxRQUFRLEtBQUs7QUFBQSxRQUM5QjtBQUNBLGVBQU8sSUFBSSxRQUFRLGFBQVc7QUFDNUIsY0FBSSxrQkFBa0I7QUFHdEIsZ0JBQU0sUUFBUSxNQUFNLEtBQUssR0FBRyxhQUFhLEtBQUs7QUFDOUMsZ0JBQU0sVUFBVSxNQUFNO0FBR3RCLGNBQUksWUFBWSxHQUFHO0FBQ2pCLG9CQUFRLEtBQUs7QUFDYjtBQUFBLFVBQ0Y7QUFFQSxnQkFBTSxRQUFRLFVBQVE7QUFDcEIsZ0JBQUksS0FBSyxTQUFTLFlBQVksS0FBSyxTQUFTLFFBQVE7QUFDbEQsbUJBQUssWUFBWSxVQUFRO0FBQ3ZCLG9CQUFJLFNBQVMsYUFBYTtBQUN4QixvQ0FBa0I7QUFBQSxnQkFDcEI7QUFHQSxvQkFBSSxZQUFZLEdBQUc7QUFDakIsMEJBQVEsZUFBZTtBQUFBLGdCQUN6QjtBQUFBLGNBQ0YsQ0FBQztBQUFBLFlBQ0gsT0FBTztBQUVMLGtCQUFJLFlBQVksR0FBRztBQUNqQix3QkFBUSxlQUFlO0FBQUEsY0FDekI7QUFBQSxZQUNGO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSCxDQUFDO0FBQUEsTUFDSDtBQUFBO0FBQUEsSUFsSUEsdUJBQXVCLFlBQTJCLGNBQXlCO0FBQ3pFLFVBQUksS0FBSyxlQUFlLEVBQUc7QUFDM0IsWUFBTSxnQkFBZ0IsS0FBSyx5QkFBeUIsVUFBVTtBQUU5RCxVQUFJLGNBQWMsU0FBUyxHQUFHO0FBQzVCLGFBQUssaUJBQWlCLGFBQWE7QUFBQSxNQUNyQztBQUFBLElBQ0Y7QUFBQSxJQUVTLGFBQWEsY0FBb0I7QUFDeEMsWUFBTSxhQUFhLFlBQVk7QUFDL0IsV0FBSyxxQkFBcUI7QUFBQSxJQUM1QjtBQUFBLElBRVMsb0JBQW9CO0FBQzNCLFlBQU0sa0JBQWtCO0FBQ3hCLFdBQUssc0JBQXNCO0FBQUEsSUFDN0I7QUFBQSxJQUVRLHdCQUF3QjtBQUM5QixXQUFLLGNBQWMsSUFBSSxpQkFBaUI7QUFDeEMsV0FBSztBQUFBLFFBQ0gsSUFBSSxZQUF3Qyw0QkFBNEI7QUFBQSxVQUN0RSxTQUFTO0FBQUEsVUFDVCxVQUFVO0FBQUEsVUFDVixRQUFRO0FBQUEsUUFDVixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUVRLGlCQUEwQjtBQUNoQyxhQUFPLEtBQUssVUFBVSxTQUFTLG1CQUFtQjtBQUFBLElBQ3BEO0FBQUEsSUFFUSx5QkFBeUIsWUFBMEM7QUFDekUsYUFBTyxXQUFXLE9BQU8sT0FBSyxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQ3ZEO0FBQUEsSUFFUSxpQkFBaUIsWUFBaUM7QUFDeEQsV0FBSyxZQUFZLHFCQUFxQixVQUFVO0FBQ2hELGlCQUFXLFFBQVEsZUFBYSxLQUFLLGVBQWUsU0FBUyxDQUFDO0FBQUEsSUFDaEU7QUFBQSxJQUVRLGVBQWUsV0FBOEI7QUFDbkQsWUFBTSxRQUFRLE1BQU0sS0FBSyxVQUFVLFdBQVcsUUFBUSxFQUFFLFFBQVEsU0FBUztBQUN6RSxXQUFLLFdBQVcsSUFBSSxXQUFXO0FBQUEsUUFDN0IsUUFBUSxVQUFVO0FBQUEsUUFDbEI7QUFBQSxNQUNGLENBQUM7QUFDRCxnQkFBVSxNQUFNLHFCQUFxQixRQUFRLEtBQUssSUFBSSxLQUFLLGFBQWEsWUFBWSxLQUFLLE9BQU8sV0FBVyxDQUFDO0FBQzVHLGdCQUFVLGFBQWEsaUJBQWlCLE1BQU07QUFDOUMsZ0JBQVUsaUJBQWlCLGFBQWEsS0FBSyxlQUFlO0FBQzVELGdCQUFVLGlCQUFpQixXQUFXLEtBQUssYUFBYTtBQUFBLElBQzFEO0FBQUEsSUFFUSx1QkFBNkI7QUFDbkMsV0FBSyxhQUFhLE1BQU07QUFBQSxRQUN0Qiw2QkFDSSxLQUFLLFdBQVcsaUJBQWlCLGtCQUFrQixJQUNuRCxLQUFLLGlCQUFpQixrQkFBa0I7QUFBQSxNQUM5QztBQUFBLElBQ0Y7QUFBQSxJQXNCUSxxQkFBMkI7QUFDakMsV0FBSyxXQUFXLFFBQVEsT0FBSyxFQUFFLGFBQWEsV0FBVyxFQUFFLENBQUM7QUFBQSxJQUM1RDtBQUFBLElBRVEsdUJBQTZCO0FBQ25DLFdBQUssV0FBVyxRQUFRLE9BQUssRUFBRSxnQkFBZ0IsU0FBUyxDQUFDO0FBQUEsSUFDM0Q7QUFBQSxJQTJDQSxNQUFjLFdBQVcsSUFBaUM7QUFDeEQsWUFBTSxrQkFBa0IsTUFBTSxLQUFLLHFCQUFxQixFQUFFO0FBQzFELGFBQU8sR0FBRyxhQUFhLGVBQWUsVUFBVTtBQUFBLElBQ2xEO0FBQUEsSUFFUSxTQUFTLElBQXdCO0FBQ3ZDLGFBQU8sR0FBRyxhQUFhLGVBQWU7QUFBQSxJQUN4QztBQUFBLElBRUEsTUFBYyxnQ0FBZ0MsV0FBdUM7QUFDbkYsWUFBTSxFQUFFLFFBQVEsTUFBTSxJQUFJLEtBQUssV0FBVyxJQUFJLFNBQVM7QUFDdkQsWUFBTSxjQUFjLEtBQUssSUFBSSxPQUFPLE9BQU8sU0FBUyxNQUFNO0FBRTFELFlBQU0sZ0JBQWdCLENBQUNDLFlBQXdCQyxTQUFxQkMsV0FBa0I7QUFDcEYsY0FBTUMsZUFBYyxLQUFLLElBQUlELFFBQU9ELFFBQU8sU0FBUyxNQUFNO0FBQzFELFFBQUFBLFFBQU8sYUFBYUQsWUFBV0MsUUFBTyxTQUFTRSxZQUFXLENBQUM7QUFDM0QsUUFBQUgsV0FBVSxNQUFNLFlBQVk7QUFDNUIsYUFBSyxxQkFBcUI7QUFBQSxNQUM1QjtBQUdBLFVBQUksQ0FBQyxTQUFTLHFCQUFxQjtBQUNqQyxzQkFBYyxXQUFXLFFBQVEsS0FBSztBQUN0QztBQUFBLE1BQ0Y7QUFHQSxZQUFNLGFBQWEsU0FBUyxvQkFBb0IsTUFBTTtBQUNwRCxrQkFBVSxNQUFNLFlBQVk7QUFDNUIsc0JBQWMsV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUN4QyxDQUFDO0FBQUEsSUFJSDtBQUFBLElBRVUsdUJBQTZCO0FBQ3JDLFdBQUssV0FBVyxRQUFRLENBQUMsR0FBRyxVQUFVO0FBQ3BDLGNBQU0sV0FBVyxFQUFFLEVBQUUsYUFBYSxXQUFXLEtBQUs7QUFDbEQsY0FBTSxzQkFBc0IsRUFBRSxpQkFBaUIsd0JBQXdCLEVBQUU7QUFDekUsY0FBTSxtQkFBbUIsdUJBQXVCO0FBQ2hELFlBQUksa0JBQWtCO0FBQ3BCLGVBQUssaUJBQWlCLENBQUM7QUFBQSxRQUN6QixPQUFPO0FBQ0wsZUFBSyxnQkFBZ0IsQ0FBQztBQUFBLFFBQ3hCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBRVEsaUJBQWlCLFdBQTBCO0FBQ2pELGdCQUFVLGFBQWEsWUFBWSxFQUFFO0FBQ3JDLGdCQUFVLGdCQUFnQixVQUFVO0FBQUEsSUFDdEM7QUFBQSxJQUVRLGdCQUFnQixXQUEwQjtBQUNoRCxnQkFBVSxnQkFBZ0IsVUFBVTtBQUNwQyxnQkFBVSxhQUFhLFlBQVksTUFBTTtBQUFBLElBQzNDO0FBQUEsSUFFQSxJQUFJLFFBQWtCO0FBQ3BCLGFBQU8sS0FBSyxvQkFBb0I7QUFBQSxJQUNsQztBQUFBLElBRUEsSUFBSSxNQUFNLE9BQWlCO0FBQ3pCLFVBQUksS0FBSyxlQUFlLEVBQUc7QUFFM0IsV0FBSyxnQkFBZ0I7QUFDckIscUNBQU8sUUFBUSxXQUFTLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFDbEQ7QUFBQSxJQUVRLGNBQWMsVUFBd0I7QUFDNUMsWUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLElBQUksU0FBUyxNQUFNLEdBQUcsRUFBRSxRQUFRO0FBQ3pELFlBQU0sWUFBWSxLQUFLLGtCQUFrQixNQUFNO0FBQy9DLGNBQVEsUUFBUSxZQUFVLEtBQUssMEJBQTBCLFFBQVEsU0FBUyxDQUFDO0FBQUEsSUFDN0U7QUFBQSxJQUVRLGtCQUFrQixZQUF5QztBQUNqRSxhQUFPLEtBQUssV0FBVyxLQUFLLFVBQVEsS0FBSyxhQUFhLFlBQVksTUFBTSxVQUFVO0FBQUEsSUFDcEY7QUFBQSxJQUVBLE1BQWMsMEJBQTBCLFFBQWdCLFdBQW1DO0FBQ3pGLFlBQU0sWUFBWSxLQUFLLGNBQTJCLGVBQWUsTUFBTSxHQUFHO0FBQzFFLFVBQUksQ0FBQyxhQUFhLENBQUMsV0FBVztBQUM1QixnQkFBUSxNQUFNLGlFQUFpRSxNQUFNLEVBQUU7QUFDdkY7QUFBQSxNQUNGO0FBQ0EsWUFBTSxjQUFjLE1BQVk7QUFDOUIsa0JBQVUsTUFBTSxZQUFZO0FBQzVCLGtCQUFVLFlBQVksU0FBUztBQUMvQixhQUFLLHFCQUFxQjtBQUFBLE1BQzVCO0FBRUEsVUFBSSxDQUFDLFNBQVMscUJBQXFCO0FBQ2pDLG9CQUFZO0FBQUEsTUFDZCxPQUFPO0FBQ0wsY0FBTSxhQUFhLFNBQVMsb0JBQW9CLFdBQVc7QUFDM0QsY0FBTSxXQUFXO0FBQUEsTUFDbkI7QUFBQSxJQUNGO0FBQUEsSUFFQSxXQUFvQjtBQUNsQixZQUFNLG9CQUFvQixLQUFLLHFCQUFxQjtBQUNwRCxhQUFPLEtBQUssbUJBQW1CLEtBQUssS0FBSyxtQkFBbUI7QUFBQSxJQUM5RDtBQUFBLElBRVEsdUJBQStCO0FBQ3JDLGFBQU8sS0FBSyxXQUFXLE9BQU8sT0FBSyxFQUFFLG9CQUFvQixDQUFDLEVBQUU7QUFBQSxJQUM5RDtBQUFBLElBRU8sZUFBcUI7QUFDMUIsWUFBTSxXQUFXLEtBQUssb0JBQW9CO0FBQzFDLFdBQUs7QUFBQSxRQUNILElBQUksWUFBWSw0QkFBNEI7QUFBQSxVQUMxQyxTQUFTO0FBQUEsVUFDVCxVQUFVO0FBQUEsVUFDVixRQUFRO0FBQUEsWUFDTixvQkFBb0IsS0FBSztBQUFBLFlBQ3pCO0FBQUEsVUFDRjtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsSUFFUSxzQkFBZ0M7QUFDdEMsWUFBTSxXQUFXLEtBQUssV0FDbkIsSUFBSSxlQUFhO0FBQ2hCLGNBQU0sd0JBQXdCLFVBQVUsaUJBQWlCLHdCQUF3QjtBQUNqRixjQUFNLGNBQWMsTUFBTSxLQUFLLHFCQUFxQixFQUFFLElBQUksT0FBSyxFQUFFLGFBQWEsWUFBWSxDQUFDO0FBQzNGLGNBQU0sc0JBQXNCLFVBQVUsYUFBYSxZQUFZO0FBQy9ELGVBQU8sWUFBWSxJQUFJLFFBQU0sR0FBRyxFQUFFLElBQUksbUJBQW1CLEVBQUU7QUFBQSxNQUM3RCxDQUFDLEVBQ0EsS0FBSztBQUNSLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxNQUFNLE9BQU8sTUFBWTtBQUN2QixXQUFLLGdCQUFnQjtBQUNyQixVQUFJLEtBQU0sTUFBSyxhQUFhO0FBQUEsSUFDOUI7QUFBQSxJQUVBLE1BQWMsa0JBQWlDO0FBQzdDLFlBQU0sZ0JBQWdCLENBQUMsV0FBd0IsUUFBcUIsVUFBa0I7QUFDcEYsa0JBQVUsTUFBTSxZQUFZO0FBQzVCLGNBQU0sY0FBYyxLQUFLLElBQUksT0FBTyxPQUFPLFNBQVMsTUFBTTtBQUMxRCxlQUFPLGFBQWEsV0FBVyxPQUFPLFNBQVMsV0FBVyxDQUFDO0FBQUEsTUFDN0Q7QUFFQSxVQUFJLENBQUMsU0FBUyxxQkFBcUI7QUFFakMsYUFBSyxXQUFXLFFBQVEsQ0FBQyxFQUFFLFFBQVEsTUFBTSxHQUFHLGNBQWM7QUFDeEQsd0JBQWMsV0FBVyxRQUFRLEtBQUs7QUFBQSxRQUN4QyxDQUFDO0FBQ0Q7QUFBQSxNQUNGO0FBR0EsWUFBTSxhQUFhLFNBQVMsb0JBQW9CLE1BQU07QUFDcEQsYUFBSyxXQUFXLFFBQVEsQ0FBQyxFQUFFLFFBQVEsTUFBTSxHQUFHLGNBQWM7QUFDeEQsd0JBQWMsV0FBVyxRQUFRLEtBQUs7QUFBQSxRQUN4QyxDQUFDO0FBQUEsTUFDSCxDQUFDO0FBRUQsWUFBTSxXQUFXO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBalRnRDtBQUFBLElBQTdDSSxXQUFTLEVBQUUsV0FBVyxPQUFPLE1BQU0sT0FBTyxDQUFDO0FBQUEsS0FUL0IsMkJBU2lDO0FBSzRCO0FBQUEsSUFBekVBLFdBQVMsRUFBRSxNQUFNLFFBQVEsU0FBUyxNQUFNLFdBQVcsbUJBQW1CLENBQUM7QUFBQSxLQWQzRCwyQkFjNkQ7QUFDQTtBQUFBLElBQXpFQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFNBQVMsTUFBTSxXQUFXLG1CQUFtQixDQUFDO0FBQUEsS0FmM0QsMkJBZTZEO0FBRzFFO0FBQUEsSUFEQyxVQUFVLGtCQUFrQjtBQUFBLEtBakJoQiwyQkFrQmI7QUEwU0YsU0FBTztBQUNUOzs7QUVyVkEsU0FBUyxPQUFBQyxhQUFXO0FBRXBCLElBQU8sMkNBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FOTVIsSUFBTSwwQkFBTixjQUFzQztBQUFBLEVBQzNDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsRUFBRTtBQUFBLEVBUUEsY0FBYztBQUNaLFVBQU07QUFSQyxTQUFRLGVBQTBCLENBQUM7QUFTMUMsU0FBSyx5QkFBeUIsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJO0FBQzVELFNBQUssaUJBQWlCLHlDQUF5QyxLQUFLLHNCQUFzQjtBQUFBLEVBQzVGO0FBQUEsRUFFUSxnQkFBZ0IsT0FBb0I7QUFDMUMsVUFBTSxTQUFTLE1BQU07QUFDckIsU0FBSyxhQUFhLEtBQUssTUFBTTtBQUFBLEVBQy9CO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBLFVBR0QsS0FBSyxhQUFhLFNBQVMsS0FDN0IsTUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLEtBQUssYUFBYSxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDaEUsQ0FBQyxHQUFHLFVBQ0ZBO0FBQUEsK0JBQ21CLEtBQUsscURBQXFELEtBQUs7QUFBQSxnQ0FDOUQsS0FBSyxxREFBcUQsS0FBSztBQUFBO0FBQUEsSUFFdkYsQ0FBQztBQUFBO0FBQUEsRUFFUDtBQUFBLEVBRUEsdUJBQXVCO0FBQ3JCLFVBQU0scUJBQXFCO0FBQzNCLFNBQUssb0JBQW9CLHlDQUF5QyxLQUFLLHNCQUFzQjtBQUFBLEVBQy9GO0FBQ0Y7QUEzQ2Esd0JBUUosU0FBeUI7QUFGZjtBQUFBLEVBQWhCQyxRQUFNO0FBQUEsR0FOSSx3QkFNTTtBQU5OLDBCQUFOO0FBQUEsRUFETkMsZ0JBQWMsMkJBQTJCO0FBQUEsR0FDN0I7OztBT1JiLFNBQVMsUUFBQUMsY0FBWTtBQUNyQixTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxZQUFVLFNBQUFDLGVBQWE7QUFLeEMsSUFBTSx1QkFBTixjQUFtQyxZQUFZO0FBQUEsRUFjcEQsY0FBYztBQUNaLFVBQU07QUFpQlIsU0FBUSxnQkFBd0I7QUFoQjlCLFNBQUssb0JBQW9CLEtBQUssa0JBQWtCLEtBQUssSUFBSTtBQUFBLEVBQzNEO0FBQUEsRUFzQlMsb0JBQTBCO0FBQ2pDLFVBQU0sa0JBQWtCO0FBRXhCLFVBQU0sZ0JBQWdCLEtBQUssS0FBSyxXQUFXLE1BQU0sSUFDN0MsS0FBSyxPQUNMLG9CQUFvQixLQUFLLGNBQWMsTUFBTSxLQUFLLElBQUk7QUFFMUQsVUFBTSxhQUFhLEVBQ2hCLEtBQUssY0FBWSxTQUFTLEtBQUssQ0FBQyxFQUNoQyxLQUFLLFVBQVE7QUFDWixXQUFLLFdBQVc7QUFDaEIsV0FBSyxTQUFTO0FBQUEsSUFDaEIsQ0FBQyxFQUNBLE1BQU0sU0FBTztBQUNaLFdBQUssZ0JBQWdCO0FBQUEsSUFDdkIsQ0FBQztBQUFBLEVBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsV0FBVztBQUNULFVBQU0sU0FBUyxLQUFLLFdBQVcsY0FBYyxlQUFlLEdBQzFELFlBQVksT0FBTyxpQkFBaUIsUUFDcEMsWUFBWSxPQUFPO0FBR3JCLFdBQU8saUJBQWlCLFdBQVcsS0FBSyxpQkFBaUI7QUFDekQsY0FBVSxLQUFLO0FBQ2YsY0FBVSxNQUFNO0FBQUE7QUFBQTtBQUFBLHdCQUdJLG9CQUFvQixHQUFHLEtBQUssVUFBVSxJQUFJLEtBQUssU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFBQSx5QkFDbEUsb0JBQW9CLEdBQUcsS0FBSyxVQUFVLElBQUksS0FBSyxTQUFTLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLE9BSXRGO0FBRUgsY0FBVSxNQUFNO0FBQUEsRUFDbEI7QUFBQSxFQUVRLGFBQWE7QUFDbkIsVUFBTSxzQkFBc0IsS0FBSyxXQUFXLGlCQUFpQixRQUFRO0FBQ3JFLFVBQU0sU0FBUyxLQUFLLGlCQUFpQixRQUFRO0FBRTdDLFVBQU0sZUFBZSxDQUFDLEdBQUcscUJBQXFCLEdBQUcsTUFBTTtBQUN2RCxlQUFXQyxXQUFVLGNBQWM7QUFDakMsWUFBTSxZQUFZQSxRQUFPO0FBQ3pCLFlBQU0sZUFBZSxJQUFJLElBQUksV0FBVyxPQUFPLFNBQVMsSUFBSSxFQUFFLFdBQVcsT0FBTyxTQUFTO0FBQ3pGLFVBQUksY0FBYztBQUNoQixZQUFJO0FBQ0YsZ0JBQU0sV0FBV0EsUUFBTyxtQkFBbUJBLFFBQU8sY0FBYztBQUNoRSxjQUFJLFVBQVU7QUFDWixpQkFBSyxnQkFBZ0IsVUFBVSxZQUFZO0FBQUEsVUFDN0M7QUFBQSxRQUNGLFNBQVMsR0FBRztBQUNWLGtCQUFRLE1BQU0sa0NBQWtDLENBQUM7QUFBQSxRQUNuRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsaUJBQWEsUUFBUSxDQUFDQSxTQUFRLFVBQVU7QUFDdEMsVUFBSSxhQUFhLFFBQVFBLE9BQU0sTUFBTSxPQUFPO0FBQzFDLHFCQUFhLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDOUI7QUFBQSxJQUNGLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsZ0JBQWdCLGdCQUEwQixVQUFVLENBQUMsR0FBRztBQUU5RCxVQUFNLGlCQUFpQixlQUFlLGlCQUFpQixRQUFRO0FBRS9ELG1CQUFlLFFBQVEsWUFBVTtBQUUvQixjQUFRLEtBQUssTUFBTTtBQUluQixZQUFNLFlBQVksT0FBTztBQUN6QixZQUFNLGVBQWUsSUFBSSxJQUFJLFdBQVcsT0FBTyxTQUFTLElBQUksRUFBRSxXQUFXLE9BQU8sU0FBUztBQUV6RixVQUFJLGNBQWM7QUFDaEIsWUFBSTtBQUNGLGdCQUFNLFlBQVksT0FBTyxtQkFBbUIsT0FBTyxjQUFjO0FBQ2pFLGVBQUssZ0JBQWdCLFdBQVcsT0FBTztBQUFBLFFBQ3pDLFNBQVMsR0FBRztBQUNWLGtCQUFRLE1BQU0sa0NBQWtDLENBQUM7QUFBQSxRQUNuRDtBQUFBLE1BQ0YsT0FBTztBQUNMLGdCQUFRLEtBQUssZ0NBQWdDLFNBQVM7QUFBQSxNQUN4RDtBQUFBLElBQ0YsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSx1QkFBdUIsTUFBYyxNQUFXO0FBQ3RELFdBQU8sWUFBWSxFQUFFLE1BQU0sS0FBSyxHQUFHLEdBQUc7QUFDdEMsVUFBTSxVQUFVLEtBQUssV0FBVztBQUNoQyxlQUFXLFVBQVUsU0FBUztBQUM1QixVQUFJLE9BQU8sZUFBZTtBQUN4QixlQUFPLGNBQWMsWUFBWSxFQUFFLE1BQU0sS0FBSyxHQUFHLEdBQUc7QUFBQSxNQUN0RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxrQkFBa0IsT0FBcUI7QUFDckMsVUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFDN0IsWUFBUSxNQUFNO0FBQUEsTUFDWixLQUFLO0FBQ0gsYUFBSyxjQUFjO0FBQ25CLGFBQUssYUFBYSxJQUFJO0FBQ3RCO0FBQUEsTUFDRixLQUFLLGVBQWU7QUFDbEIsYUFBSyx1QkFBdUIsZ0JBQWdCLEtBQUssV0FBVztBQUM1RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUssWUFBWTtBQUNmLGNBQU0sWUFBWSxLQUFLLFNBQVMsTUFBTSxJQUFJLFdBQVM7QUFDakQsZ0JBQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxJQUFJLFFBQVEsb0JBQW9CLEtBQUssYUFBYSxNQUFNLEtBQUs7QUFDaEcsaUJBQU87QUFBQSxRQUNULENBQUM7QUFDRCxhQUFLLHVCQUF1QixhQUFhLFNBQVM7QUFDbEQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLO0FBQ0gsZ0JBQVEsSUFBSSxnQ0FBZ0M7QUFDNUM7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRUEsV0FBb0I7QUFDbEIsV0FBTyxLQUFLLGdCQUFnQjtBQUFBLEVBQzlCO0FBQUEsRUFFQSxJQUFJLFFBQTJCO0FBQzdCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQSxFQUVBLElBQUksTUFBTSxLQUF3QjtBQUNoQyxRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLFdBQUssY0FBYztBQUNuQixXQUFLLGFBQWEsR0FBRztBQUFBLElBQ3ZCLE9BQU87QUFDTCxZQUFNLElBQUksTUFBTSx3QkFBd0I7QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFBQSxFQUVTLHVCQUE2QjtBQUNwQyxXQUFPLG9CQUFvQixXQUFXLEtBQUssaUJBQWlCO0FBQzVELFVBQU0scUJBQXFCO0FBQUEsRUFDN0I7QUFBQSxFQUVTLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxnQkFDSyxLQUFLLGFBQWEsT0FBTyxDQUFDO0FBQUEsaUJBQ3pCLEtBQUssYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNcEMsS0FBSyxpQkFDUEE7QUFBQTtBQUFBLFVBRUksS0FBSyxhQUFhO0FBQUEsYUFDZjtBQUFBLEVBQ1g7QUFDRjtBQTlMRTtBQUFBLEVBRENDLFdBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxPQUFPLENBQUM7QUFBQSxHQW5CbEMscUJBb0JYO0FBR0E7QUFBQSxFQURDQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsaUJBQWlCLENBQUM7QUFBQSxHQXRCNUMscUJBdUJYO0FBR0E7QUFBQSxFQURDQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsZ0JBQWdCLENBQUM7QUFBQSxHQXpCM0MscUJBMEJYO0FBR0E7QUFBQSxFQURDQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsS0FBSyxDQUFDO0FBQUEsR0E1QmhDLHFCQTZCWDtBQUdRO0FBQUEsRUFEUEMsUUFBTTtBQUFBLEdBL0JJLHFCQWdDSDtBQWhDRyx1QkFBTjtBQUFBLEVBRE5DLGdCQUFjLHdCQUF3QjtBQUFBLEdBQzFCOzs7QUNOYixTQUFTLFFBQUFDLGNBQVk7QUFDckIsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsa0JBQWdCO0FBR2pDLElBQU0sMkJBQU4sY0FBdUMsWUFBWTtBQUFBLEVBQW5EO0FBQUE7QUFFTCxTQUFPLGVBQXVCO0FBQUE7QUFBQSxFQUs5QixXQUFvQjtBQUVsQixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsSUFBSSxRQUEyQjtBQUU3QixXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsSUFBSSxNQUFNLEtBQXdCO0FBQUEsRUFFbEM7QUFBQSxFQUVTLFNBQVM7QUFDaEIsV0FBT0MsMkJBQXlCLEtBQUssUUFBUSx5QkFBeUIsS0FBSyxVQUFVLElBQUksS0FBSyxLQUFLO0FBQUEsRUFDckc7QUFBQSxFQUNPLFdBQVcsR0FBVTtBQUMxQixTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQVksZUFBZTtBQUFBLFFBQzdCLFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFFBQVEsRUFBRSxvQkFBb0IsS0FBSyxvQkFBb0IsY0FBYyxLQUFLLGlCQUFpQixPQUFPO0FBQUEsTUFDcEcsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUEvQlM7QUFBQSxFQUROQyxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsZ0JBQWdCLENBQUM7QUFBQSxHQUQzQyx5QkFFSjtBQUdBO0FBQUEsRUFETkEsV0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FKZix5QkFLSjtBQUxJLDJCQUFOO0FBQUEsRUFETkMsZ0JBQWMsNkJBQTZCO0FBQUEsR0FDL0I7OztBQ0piLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxjQUF3QjtBQUN0QyxTQUFTLGlCQUFBQyx1QkFBcUI7QUFLdkIsSUFBTSx5QkFBTixjQUFxQyx5QkFBeUIsYUFBYSxnQkFBZ0IsT0FBTyxTQUFTLEVBQUU7QUFBQSxFQWdDekcsU0FBUztBQUNoQixXQUFPQztBQUFBLEVBQ1Q7QUFBQSxFQUVBLElBQUksZ0JBQWdCLE9BQTBCO0FBQzVDLFFBQUksVUFBMkMsQ0FBQztBQUNoRCxVQUFNLFdBQVcsTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSztBQUV0RCxRQUFJLFVBQVU7QUFDWixnQkFBVSxTQUFTLElBQUksT0FBSztBQUMxQixjQUFNLFFBQVEsRUFBRSxNQUFNLEdBQUc7QUFDekIsZUFBTyxFQUFFLE1BQU0sTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsRUFBRTtBQUFBLE1BQ3pDLENBQUM7QUFBQSxJQUNIO0FBRUEsVUFBTSxPQUFPLEtBQUssaUJBQWlCLFNBQVM7QUFDNUMsU0FBSyxRQUFRLENBQUMsS0FBSyxVQUFVO0FBdERqQztBQXVETSxZQUFNLGFBQWEsSUFBSSxhQUFhLFlBQVk7QUFDaEQsWUFBTSxrQkFBaUIsYUFBUSxLQUFLLE9BQUssRUFBRSxRQUFRLFVBQVUsTUFBdEMsbUJBQXlDO0FBQ2hFLFlBQU0sUUFBTyxVQUFLLGNBQWMsNEJBQTRCLGNBQWMsSUFBSSxNQUFqRSxtQkFBb0UsWUFBWTtBQUM3RixVQUFJLGtCQUFrQixNQUFNO0FBQzFCLFlBQUksR0FBQyxTQUFJLHVCQUFKLG1CQUF3QixVQUFVLFNBQVMsb0JBQW1CO0FBQ2pFLGdCQUFNLFdBQVcsU0FBUyxjQUFjLE1BQU07QUFDOUMsbUJBQVMsVUFBVSxJQUFJLGdCQUFnQjtBQUN2QyxtQkFBUyxjQUFjO0FBQ3ZCLGNBQUksc0JBQXNCLFlBQVksUUFBUTtBQUFBLFFBQ2hEO0FBQUEsTUFDRixZQUFXLFNBQUksdUJBQUosbUJBQXdCLFVBQVUsU0FBUyxtQkFBbUI7QUFDdkUsWUFBSSxtQkFBbUIsT0FBTztBQUFBLE1BQ2hDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBaEVhLHVCQUNLLFNBQVM7QUFBQSxFQUN2QkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0QkY7QUE5QlcseUJBQU47QUFBQSxFQUROQyxnQkFBYywyQkFBMkI7QUFBQSxHQUM3Qjs7O0FDTmIsU0FBUyxPQUFBQyxPQUFLLFFBQUFDLFFBQU0sV0FBVztBQUMvQixTQUFTLGlCQUFBQyxpQkFBZSxTQUFBQyxRQUFPLHVCQUF1QixTQUFBQyxlQUFhO0FBQ25FLFNBQVMsYUFBQUMsa0JBQWlCO0FBQzFCLFNBQVMsY0FBYzs7O0FDRGhCLFNBQVMsaUJBQ2QsT0FDQSxjQUNBLEtBQ0EsU0FDQTtBQUNBLFVBQVEsT0FBTztBQUFBLElBQ2IsS0FBSztBQUNIO0FBQ0UsY0FBTSxDQUFDLFNBQVMsU0FBUyxNQUFNLElBQUk7QUFDbkMsY0FBTSxhQUFjLFVBQVUsSUFBSSxRQUFTO0FBQzNDLGNBQU0sYUFBYyxVQUFVLElBQUksU0FBVTtBQUM1QyxjQUFNLFlBQWEsU0FBUyxJQUFJLFFBQVM7QUFDekMsZ0JBQVEsTUFBTSxPQUFPLGFBQWEsWUFBWTtBQUM5QyxnQkFBUSxNQUFNLE1BQU0sYUFBYSxZQUFZO0FBQzdDLGdCQUFRLE1BQU0sUUFBUSxRQUFRLE1BQU0sU0FBUyxJQUFJLFlBQVk7QUFDN0QsZ0JBQVEsTUFBTSxlQUFlO0FBQUEsTUFDL0I7QUFDQTtBQUFBLElBRUYsS0FBSztBQUNIO0FBQ0UsY0FBTSxDQUFDLE9BQU8sTUFBTSxRQUFRLE9BQU8sSUFBSTtBQUN2QyxjQUFNLFdBQVksUUFBUSxJQUFJLFFBQVM7QUFDdkMsY0FBTSxVQUFXLE9BQU8sSUFBSSxTQUFVO0FBQ3RDLGNBQU0sWUFBYSxTQUFTLElBQUksUUFBUztBQUN6QyxjQUFNLGFBQWMsVUFBVSxJQUFJLFNBQVU7QUFDNUMsZ0JBQVEsTUFBTSxPQUFPLFdBQVc7QUFDaEMsZ0JBQVEsTUFBTSxNQUFNLFVBQVU7QUFDOUIsZ0JBQVEsTUFBTSxRQUFRLFlBQVksV0FBVztBQUM3QyxnQkFBUSxNQUFNLFNBQVMsYUFBYSxVQUFVO0FBQUEsTUFDaEQ7QUFDQTtBQUFBLElBRUYsS0FBSztBQUNIO0FBRUUsY0FBTSxhQUFhLGFBQWEsT0FBTyxDQUFDLEtBQUssY0FBYyxjQUFjLFVBQVU7QUFDakYsY0FBSSxlQUFlLE1BQU0sR0FBRztBQUMxQixrQkFBTSxVQUFVLElBQUksSUFBSTtBQUN4QixnQkFBSSxJQUFJLE1BQU0sSUFBSSxFQUFFLEdBQUcsU0FBUyxHQUFHLE1BQU0sWUFBWSxFQUFFO0FBQUEsVUFDekQsT0FBTztBQUNMLGdCQUFJLEtBQUssWUFBWTtBQUFBLFVBQ3ZCO0FBQ0EsaUJBQU87QUFBQSxRQUNULEdBQUcsQ0FBQyxDQUFDO0FBR0wsY0FBTSxRQUFRLEtBQUssSUFBSSxHQUFHLFdBQVcsSUFBSSxXQUFTLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGNBQU0sU0FBUyxLQUFLLElBQUksR0FBRyxXQUFXLElBQUksV0FBUyxNQUFNLENBQUMsQ0FBQztBQUMzRCxjQUFNLE9BQU8sS0FBSyxJQUFJLEdBQUcsV0FBVyxJQUFJLFdBQVMsTUFBTSxDQUFDLENBQUM7QUFDekQsY0FBTSxVQUFVLEtBQUssSUFBSSxHQUFHLFdBQVcsSUFBSSxXQUFTLE1BQU0sQ0FBQyxDQUFDO0FBRzVELGNBQU0sV0FBWSxRQUFRLElBQUksUUFBUztBQUN2QyxjQUFNLFVBQVcsT0FBTyxJQUFJLFNBQVU7QUFDdEMsY0FBTSxZQUFhLFNBQVMsSUFBSSxRQUFTO0FBQ3pDLGNBQU0sYUFBYyxVQUFVLElBQUksU0FBVTtBQUc1QyxnQkFBUSxNQUFNLE9BQVEsUUFBUSxJQUFJLFFBQVMsTUFBTTtBQUNqRCxnQkFBUSxNQUFNLE1BQU8sT0FBTyxJQUFJLFNBQVUsTUFBTTtBQUNoRCxnQkFBUSxNQUFNLFFBQVEsWUFBWSxXQUFXO0FBQzdDLGdCQUFRLE1BQU0sU0FBUyxhQUFhLFVBQVU7QUFPOUMsY0FBTSxjQUFjLFdBQVcsSUFBSSxZQUFVO0FBQUEsVUFDM0MsSUFBSyxNQUFNLElBQUksVUFBVSxTQUFTLFNBQVU7QUFBQSxVQUM1QyxJQUFLLE1BQU0sSUFBSSxTQUFTLFVBQVUsUUFBUztBQUFBLFFBQzdDLEVBQUU7QUFHRixjQUFNLFFBQVEsWUFBWSxJQUFJLE9BQUssS0FBSyxNQUFNLEVBQUUsQ0FBQyxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLEdBQUc7QUFHM0YsZ0JBQVEsTUFBTSxXQUFXLFdBQVcsS0FBSztBQUFBLE1BQzNDO0FBQ0E7QUFBQSxJQUVGO0FBQ0U7QUFBQSxFQUNKO0FBQ0Y7OztBRC9FTyxJQUFNLGlDQUFOLGNBQTZDLFlBQVk7QUFBQSxFQXdDOUQsY0FBYztBQUNaLFVBQU07QUF0Q1Isc0JBQWE7QUFDYixvQkFBVztBQUNGLGtCQUFTLENBQUM7QUFxQ2pCLFNBQUssaUJBQWlCLHdCQUF3QixLQUFLLHlCQUF5QjtBQUFBLEVBQzlFO0FBQUEsRUFFQSxRQUFjO0FBQ1osU0FBSyxTQUFTLENBQUM7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsV0FBb0I7QUFDbEIsV0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLEVBQzlCO0FBQUEsRUFDQSxJQUFJLE1BQU0sS0FBd0I7QUFDaEMsUUFBSSxNQUFNLFFBQVEsR0FBRyxHQUFHO0FBQ3RCLFdBQUssU0FBUztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsSUFBSSxRQUEyQjtBQUM3QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFUyxTQUFTO0FBckVwQjtBQXNFSSxXQUFPQztBQUFBO0FBQUE7QUFBQSxrQkFHT0MsWUFBVSxVQUFLLFFBQVEsQ0FBQyxNQUFkLG1CQUFpQixLQUFLLENBQUM7QUFBQSxtQkFDaENBLFlBQVUsVUFBSyxRQUFRLENBQUMsTUFBZCxtQkFBaUIsTUFBTSxDQUFDO0FBQUEsMEJBQzVCLFVBQUssUUFBUSxDQUFDLE1BQWQsbUJBQWlCLEtBQUssS0FBSSxVQUFLLFFBQVEsQ0FBQyxNQUFkLG1CQUFpQixNQUFNO0FBQUE7QUFBQSxZQUU5RDtBQUFBLE1BQ0EsS0FBSztBQUFBLE1BQ0wsVUFBUTtBQUFBLE1BQ1IsQ0FBQyxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUEscUJBR1IsU0FBUyxLQUFLLGNBQThCLGlCQUFpQixLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFBQSxxQkFDbEcsU0FBUyxLQUFLLGNBQThCLGlCQUFpQixLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFBQSxxQkFDakcsU0FBUyxLQUFLLGNBQThCLGlCQUFpQixLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFBQSxxQkFDbEcsU0FBUyxLQUFLLGNBQThCLGlCQUFpQixLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFBQTtBQUFBO0FBQUEseUJBRzdGLENBQUMsTUFBYTtBQUNyQixVQUFFLGdCQUFnQjtBQUNsQixhQUFLLFNBQVMsS0FBSyxPQUFPLE9BQU8sQ0FBQyxHQUFHLE1BQU0sTUFBTSxLQUFLO0FBQ3RELGFBQUssYUFBYSxLQUFLLE1BQU07QUFBQSxNQUMvQixDQUFDO0FBQUE7QUFBQTtBQUFBLElBR1AsQ0FBQztBQUFBLFlBQ0MsS0FBSyxjQUNQO0FBQUE7QUFBQSxpQkFFTyxLQUFLLFdBQVcsQ0FBQztBQUFBLGlCQUNqQixLQUFLLFdBQVcsQ0FBQztBQUFBLGlCQUNqQixLQUFLLFdBQVcsQ0FBQztBQUFBLGlCQUNqQixLQUFLLFdBQVcsQ0FBQztBQUFBO0FBQUE7QUFBQSxhQUdyQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVg7QUFBQSxFQUVRLDBCQUEwQixHQUF3QztBQUN4RSxVQUFNLE1BQU0sS0FBSyxjQUFjLEtBQUs7QUFDcEMsVUFBTSxVQUFVLEVBQUU7QUFDbEIsVUFBTSxTQUFTLFFBQVEsYUFBYSxRQUFRO0FBQzVDLFVBQU0sUUFBUSxRQUFRLGFBQWEsT0FBTztBQUMxQyxVQUFNLGVBQWUsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJLE9BQUssU0FBUyxDQUFDLENBQUM7QUFDM0QscUJBQWlCLE9BQU8sY0FBYyxLQUFLLE9BQU87QUFBQSxFQUNwRDtBQUFBLEVBRVMsYUFBYSxHQUFTO0FBQzdCLFVBQU0sYUFBYSxDQUFDO0FBRXBCLFNBQUssV0FBVyxLQUFLLGlCQUFpQix3QkFBd0I7QUFFOUQsYUFBUyxpQkFBaUIsYUFBYSxXQUFTO0FBQzlDLFdBQUssYUFBYTtBQUFBLFFBQ2hCLEdBQUcsTUFBTSxVQUFVLEtBQUssUUFBUSxDQUFDLEVBQUUsc0JBQXNCLEVBQUU7QUFBQSxRQUMzRCxHQUFHLE1BQU0sVUFBVSxLQUFLLFFBQVEsQ0FBQyxFQUFFLHNCQUFzQixFQUFFO0FBQUEsTUFDN0Q7QUFBQSxJQUNGLENBQUM7QUFFRCxTQUFLLFNBQVMsUUFBUSxhQUFXO0FBQy9CLGNBQVEsTUFBTSxPQUFPLFFBQVEsYUFBYSxRQUFRLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJO0FBQ3BFLGNBQVEsTUFBTSxNQUFNLFFBQVEsYUFBYSxRQUFRLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJO0FBRW5FLGNBQVEsaUJBQWlCLFNBQVMsV0FBUztBQUN6QyxZQUFJLENBQUMsS0FBSyxZQUFZO0FBQ3BCLGVBQUssYUFBYSxNQUFNO0FBRXhCLGVBQUssYUFBYTtBQUFBLFlBQ2hCLEdBQUcsS0FBSyxXQUFXLGFBQWEsUUFBUSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFBQSxZQUN0RCxHQUFHLEtBQUssV0FBVyxhQUFhLFFBQVEsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQUEsVUFDeEQ7QUFBQSxRQUNGLFdBQVcsQ0FBQyxLQUFLLFVBQVU7QUFDekIsZUFBSyxXQUFXLE1BQU07QUFFdEIsZUFBSyxTQUFTO0FBQUEsWUFDWixHQUFHLEtBQUs7QUFBQSxZQUNSLEtBQUssV0FBVyxhQUFhLFlBQVksSUFBSSxNQUFNLEtBQUssU0FBUyxhQUFhLFlBQVk7QUFBQSxVQUM1RjtBQUNBLGVBQUssYUFBYSxLQUFLLE1BQU07QUFDN0IsZUFBSyxhQUFhO0FBQ2xCLGVBQUssV0FBVztBQUFBLFFBQ2xCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBQ1MsdUJBQXVCO0FBQzlCLFVBQU0scUJBQXFCO0FBQzNCLFNBQUssb0JBQW9CLHdCQUF3QixLQUFLLHlCQUF5QjtBQUFBLEVBQ2pGO0FBQ0Y7QUFBQTtBQTFKYSwrQkFZSyxTQUFTO0FBQUEsRUFDdkJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdCRjtBQWhDUztBQUFBLEVBQVJDLFFBQU07QUFBQSxHQUxJLCtCQUtGO0FBQ0E7QUFBQSxFQUFSQSxRQUFNO0FBQUEsR0FOSSwrQkFNRjtBQUNBO0FBQUEsRUFBUkEsUUFBTTtBQUFBLEdBUEksK0JBT0Y7QUFDSztBQUFBLEVBQWJDLE9BQU0sS0FBSztBQUFBLEdBUkQsK0JBUUc7QUFDOEI7QUFBQSxFQUEzQyxzQkFBc0IsRUFBRSxVQUFVLE1BQU0sQ0FBQztBQUFBLEdBVC9CLCtCQVNpQztBQVRqQyxpQ0FBTjtBQUFBLEVBRE5DLGdCQUFjLG1DQUFtQztBQUFBLEdBQ3JDOzs7QUVUYixTQUFTLE9BQUFDLE9BQUssUUFBQUMsY0FBd0I7QUFDdEMsU0FBUyxpQkFBQUMsdUJBQXFCO0FBTXZCLElBQU0sZ0NBQU4sY0FBNEM7QUFBQSxFQUNqRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEVBQUU7QUFBQSxFQVlTLFNBQVM7QUFDaEIsV0FBT0M7QUFBQTtBQUFBO0FBQUEsRUFHVDtBQUFBLEVBRVEsMEJBQTBCLEdBQTRCO0FBQzVELFVBQU0sTUFBTSxLQUFLLGNBQWMsS0FBSztBQUNwQyxVQUFNLFVBQVUsRUFBRTtBQUNsQixVQUFNLFNBQVMsUUFBUSxhQUFhLFFBQVE7QUFDNUMsVUFBTSxRQUFRLFFBQVEsYUFBYSxPQUFPO0FBQzFDLFVBQU0sZUFBZSxPQUFPLE1BQU0sR0FBRyxFQUFFLElBQUksT0FBSyxTQUFTLENBQUMsQ0FBQztBQUczRCxZQUFRLE9BQU87QUFBQSxNQUNiLEtBQUs7QUFDSDtBQUNFLGdCQUFNLENBQUMsU0FBUyxTQUFTLE1BQU0sSUFBSTtBQUNuQyxrQkFBUSxNQUFNLE9BQU8sVUFBVSxTQUFTO0FBQ3hDLGtCQUFRLE1BQU0sTUFBTSxVQUFVLFNBQVM7QUFDdkMsa0JBQVEsTUFBTSxRQUFRLFFBQVEsTUFBTSxTQUFTLElBQUksU0FBUztBQUFBLFFBQzVEO0FBQ0E7QUFBQSxNQUVGLEtBQUs7QUFDSDtBQUNFLGdCQUFNLENBQUMsT0FBTyxNQUFNLFFBQVEsT0FBTyxJQUFJO0FBQ3ZDLGtCQUFRLE1BQU0sT0FBTyxRQUFRO0FBQzdCLGtCQUFRLE1BQU0sTUFBTSxPQUFPO0FBQzNCLGtCQUFRLE1BQU0sUUFBUSxTQUFTLFFBQVE7QUFDdkMsa0JBQVEsTUFBTSxTQUFTLFVBQVUsT0FBTztBQUFBLFFBQzFDO0FBQ0E7QUFBQSxNQUVGO0FBQ0U7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRVMsb0JBQTBCO0FBQ2pDLFVBQU0sa0JBQWtCO0FBQ3hCLFNBQUssaUJBQWlCLHdCQUF3QixLQUFLLHlCQUF5QjtBQUFBLEVBQzlFO0FBQUEsRUFDUyx1QkFBdUI7QUFDOUIsVUFBTSxxQkFBcUI7QUFDM0IsU0FBSyxvQkFBb0Isd0JBQXdCLEtBQUsseUJBQXlCO0FBQUEsRUFDakY7QUFDRjtBQWhFYSw4QkFNSyxTQUFTQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU5kLGdDQUFOO0FBQUEsRUFETkMsZ0JBQWMsbUNBQW1DO0FBQUEsR0FDckM7OztBQ1BiLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxjQUFZO0FBSTFCLFNBQVMsaUJBQUFDLHVCQUFxQjtBQU92QixJQUFNLDZCQUFOLGNBQXlDLGFBQWEsYUFBYSxvQkFBb0IsRUFBRTtBQUFBLEVBQXpGO0FBQUE7QUFHTCxTQUFVLGtCQUE0QixDQUFDO0FBQUE7QUFBQSxFQW1COUIsU0FBUztBQUNoQixXQUFPQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1UO0FBQUEsRUFFUSxnQkFBZ0IsR0FBZ0U7QUFDdEYsVUFBTSxFQUFFLFdBQVcsSUFBSSxFQUFFO0FBRXpCLFVBQU0sVUFBVSxLQUFLLGdCQUFnQixLQUFLLFFBQU0sR0FBRyxhQUFhLFlBQVksTUFBTSxVQUFVO0FBRTVGLFVBQU0sZUFBZSxLQUFLLGdCQUFnQjtBQUMxQyxRQUFJLENBQUMsS0FBSyxnQkFBZ0I7QUFDeEIsV0FBSyxpQkFBaUI7QUFDdEIsVUFBSSxRQUFRLFNBQVMsTUFBTTtBQUN6QixZQUFLLEtBQUssZ0JBQW9DLE9BQU8sT0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFVBQVUsY0FBYztBQUM3RixlQUFLLGlCQUFpQjtBQUN0QjtBQUFBLFFBQ0Y7QUFDQSxnQkFBUSxRQUFTLEtBQUssZ0JBQW9DLE9BQU8sT0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUztBQUMxRixhQUFLLGlCQUFpQjtBQUN0QjtBQUFBLE1BQ0YsT0FBTztBQUNMLFFBQUMsS0FBSyxnQkFBb0MsUUFBUSxDQUFBQyxhQUFXO0FBQzNELGNBQUlBLFNBQVEsUUFBUUEsU0FBUSxPQUFPO0FBQ2pDLFlBQUFBLFNBQVE7QUFBQSxVQUNWO0FBQ0EsaUJBQU9BO0FBQUEsUUFDVCxDQUFDO0FBQ0QsZ0JBQVEsUUFBUTtBQUFBLE1BQ2xCO0FBQ0EsV0FBSyxpQkFBaUI7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLDBCQUEwQixHQUF3QztBQUN4RSxVQUFNLE1BQU0sS0FBSyxjQUFjLEtBQUs7QUFDcEMsVUFBTSxVQUFVLEVBQUU7QUFDbEIsVUFBTSxTQUFTLFFBQVEsYUFBYSxRQUFRO0FBQzVDLFVBQU0sUUFBUSxRQUFRLGFBQWEsT0FBTztBQUMxQyxVQUFNLGVBQWUsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJLE9BQUssU0FBUyxDQUFDLENBQUM7QUFFM0QscUJBQWlCLE9BQU8sY0FBYyxLQUFLLE9BQU87QUFBQSxFQUNwRDtBQUFBLEVBRVMsb0JBQTBCO0FBQ2pDLFVBQU0sa0JBQWtCO0FBQ3hCLFNBQUssaUJBQWlCLCtCQUErQixLQUFLLGVBQWU7QUFDekUsU0FBSyxpQkFBaUIsK0JBQStCLEtBQUsseUJBQXlCO0FBQUEsRUFDckY7QUFBQSxFQUNTLHVCQUF1QjtBQUM5QixVQUFNLHFCQUFxQjtBQUMzQixTQUFLLG9CQUFvQiwrQkFBK0IsS0FBSyxlQUFlO0FBQzVFLFNBQUssb0JBQW9CLCtCQUErQixLQUFLLHlCQUF5QjtBQUFBLEVBQ3hGO0FBQ0Y7QUFBQTtBQUFBO0FBaEZhLDJCQU9LLFNBQVM7QUFBQSxFQUN2QkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUY7QUFwQlcsNkJBQU47QUFBQSxFQUROQyxnQkFBYywrQkFBK0I7QUFBQSxHQUNqQzs7O0FDWGIsU0FBUyxPQUFBQyxPQUFLLFFBQUFDLGNBQXdCO0FBQ3RDLFNBQVMsaUJBQUFDLHVCQUFxQjtBQU92QixJQUFNLHdCQUFOLGNBQW9DLGFBQWEsYUFBYSxvQkFBb0IsRUFBRTtBQUFBLEVBa0JoRixTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVQ7QUFBQSxFQUVRLDBCQUEwQixHQUF3QztBQUN4RSxVQUFNLE1BQU0sS0FBSyxjQUFjLEtBQUs7QUFDcEMsVUFBTSxVQUFVLEVBQUU7QUFDbEIsVUFBTSxTQUFTLFFBQVEsYUFBYSxRQUFRO0FBQzVDLFVBQU0sUUFBUSxRQUFRLGFBQWEsT0FBTztBQUMxQyxVQUFNLGVBQWUsT0FBTyxNQUFNLEdBQUcsRUFBRSxJQUFJLE9BQUssU0FBUyxDQUFDLENBQUM7QUFFM0QscUJBQWlCLE9BQU8sY0FBYyxLQUFLLE9BQU87QUFBQSxFQUNwRDtBQUFBLEVBRVMsb0JBQTBCO0FBQ2pDLFVBQU0sa0JBQWtCO0FBQ3hCLFNBQUssaUJBQWlCLCtCQUErQixLQUFLLHlCQUF5QjtBQUFBLEVBQ3JGO0FBQUEsRUFDUyx1QkFBdUI7QUFDOUIsVUFBTSxxQkFBcUI7QUFDM0IsU0FBSyxvQkFBb0IsaUNBQWlDLEtBQUsseUJBQXlCO0FBQUEsRUFDMUY7QUFDRjtBQUFBO0FBQUE7QUE3Q2Esc0JBR0ssU0FBUztBQUFBLEVBQ3ZCQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFGO0FBakJXLHdCQUFOO0FBQUEsRUFETkMsZ0JBQWMseUJBQXlCO0FBQUEsR0FDM0I7OztBQ1JiLFNBQXlCLFFBQUFDLGNBQXdCO0FBRWpELFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLFlBQVUsU0FBQUMsZUFBYTtBQUMvQyxTQUFTLGNBQUFDLG1CQUFrQjs7O0FDSDNCLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGNBQUFDLG9CQUFrQjtBQUN0QyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxrQkFBZ0I7QUFTakMsSUFBTSw0QkFBTixjQUF3QyxtQkFBbUJDLGNBQVksOEJBQThCLEVBQUU7QUFBQSxFQUF2RztBQUFBO0FBb0JMLFNBQU8sV0FBbUI7QUFPMUIsU0FBTyxXQUFtQjtBQU0xQixTQUFPLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlOLG9CQUEwQjtBQUNqQyxVQUFNLGtCQUFrQjtBQUN4QixTQUFLLGFBQWEsUUFBUSw4QkFBOEI7QUFDeEQsU0FBSyxhQUFhLFFBQVEsOEJBQThCO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVDtBQUNGO0FBdERhLDBCQUNKLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUJUO0FBQUEsRUFKTkMsV0FBUztBQUFBLElBQ1IsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLEVBQ2IsQ0FBQztBQUFBLEdBbkJVLDBCQW9CSjtBQU9BO0FBQUEsRUFKTkEsV0FBUztBQUFBLElBQ1IsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLEVBQ2IsQ0FBQztBQUFBLEdBMUJVLDBCQTJCSjtBQU1BO0FBQUEsRUFKTkEsV0FBUztBQUFBLElBQ1IsTUFBTTtBQUFBLElBQ04sV0FBVztBQUFBLEVBQ2IsQ0FBQztBQUFBLEdBaENVLDBCQWlDSjtBQWpDSSw0QkFBTjtBQUFBLEVBRk5DLGdCQUFjLDhCQUE4QjtBQUFBLEdBRWhDOzs7QUNWYixTQUFTLE9BQUFDLGFBQVc7QUFJcEIsSUFBTyx1Q0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBRm1CUixJQUFNLHNCQUFOLGNBQWtDO0FBQUEsRUFDdkM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixFQUFFO0FBQUEsRUFMSztBQUFBO0FBVUwsNEJBQTRDO0FBRW5DLHFCQUErQixDQUFDO0FBVWhDLDBCQUEyQixDQUFDO0FBQ3lCLDhCQUE2QjtBQXNCM0YsNEJBQW1CLE9BQUs7QUFDdEIsWUFBTSxRQUFRLEVBQUU7QUFDaEIsVUFBSSxLQUFLLHFCQUFxQixPQUFPO0FBQ25DLGNBQU0sVUFBVTtBQUNoQixhQUFLLG1CQUFtQjtBQUN4QixhQUFLLGtCQUFrQixDQUFDO0FBQUEsTUFDMUIsT0FBTztBQUNMLGFBQUssbUJBQW1CO0FBQUEsTUFDMUI7QUFBQSxJQUNGO0FBRUEsNkJBQW9CLE9BQUs7QUFDdkIsWUFBTSxXQUFXLEVBQUU7QUFDbkIsWUFBTSxRQUFRLFNBQVM7QUFDdkIsWUFBTSxPQUFPLFNBQVM7QUFDdEIsWUFBTSxPQUFPLFNBQVM7QUFFdEIsVUFBSSxTQUFTLFNBQVM7QUFDcEIsWUFBSSxDQUFDLEtBQUssT0FBTztBQUNmLGVBQUssUUFBUSxDQUFDLEtBQUs7QUFBQSxRQUNyQixXQUFXLEtBQUssTUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJO0FBQzNDLGNBQUksU0FBUyxTQUFTO0FBQ3BCLGlCQUFLLFFBQVEsS0FBSyxNQUFNLE9BQU8sT0FBSyxFQUFFLFFBQVEsSUFBSSxNQUFNLEVBQUU7QUFBQSxVQUM1RDtBQUNBLGVBQUssUUFBUSxDQUFDLEdBQUcsS0FBSyxPQUFPLEtBQUs7QUFBQSxRQUNwQztBQUNBLGFBQUssbUJBQW1CO0FBQUEsTUFDMUIsT0FBTztBQUNMLGFBQUssUUFBUSxLQUFLLE1BQU0sT0FBTyxPQUFLLE1BQU0sS0FBSztBQUMvQyxhQUFLLG1CQUFtQjtBQUFBLE1BQzFCO0FBRUEsV0FBSyxjQUFjO0FBQ25CLFdBQUs7QUFBQSxRQUNILElBQUksWUFBaUMsNEJBQTRCO0FBQUEsVUFDL0QsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsUUFBUTtBQUFBLFlBQ04sb0JBQW9CLEtBQUs7QUFBQSxZQUN6QixVQUFVLE1BQU0sUUFBUSxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSztBQUFBLFVBQy9EO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUEsRUExRUEsSUFBSSxRQUFrQjtBQUNwQixRQUFJLENBQUMsS0FBSyxVQUFVLFNBQVMsbUJBQW1CLEVBQUcsUUFBTyxNQUFNO0FBQUEsUUFDM0QsUUFBTyxLQUFLO0FBQUEsRUFDbkI7QUFBQSxFQUNBLElBQUksTUFBTSxLQUFlO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLLFVBQVUsU0FBUyxtQkFBbUIsRUFBRyxPQUFNLFFBQVE7QUFBQSxRQUM1RCxNQUFLLFlBQVk7QUFBQSxFQUN4QjtBQUFBLEVBSUEsTUFBTSxvQkFBbUM7QUFDdkMsVUFBTSxrQkFBa0I7QUFTeEIsU0FBSyxPQUFPLE1BQU07QUFBQSxNQUNoQixLQUFLLGlCQUFpQixpRUFBaUU7QUFBQSxJQUN6RjtBQUNBLFNBQUssT0FBTyxNQUFNO0FBQUEsTUFDaEIsS0FBSyxpQkFBaUIsZ0VBQWdFO0FBQUEsSUFDeEY7QUFFQSxTQUFLLFFBQVEsQ0FBQztBQUFBLEVBQ2hCO0FBQUEsRUErQ0EsSUFBSSxnQkFBZ0IsZUFBa0M7QUFDcEQsUUFBSSxrQkFBa0IsSUFBSTtBQUN4QixXQUFLLGlCQUFpQixDQUFDO0FBQ3ZCO0FBQUEsSUFDRixXQUFXLE1BQU0sUUFBUSxhQUFhLEdBQUc7QUFDdkMsV0FBSyxpQkFBaUI7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFBQSxFQUVTLFNBQVM7QUFDaEIsUUFBSSxDQUFDLEtBQUssVUFBVSxTQUFTLG1CQUFtQixHQUFHO0FBQ2pELGFBQU9DO0FBQUEsSUFDVDtBQUNBLFdBQU9BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUtDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxNQUFNQSw2QkFBMkJDLFlBQVcsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDO0FBQUE7QUFBQTtBQUFBLFVBR3hGLEtBQUssS0FBSztBQUFBLE1BQ1YsQ0FBQyxLQUFLLFdBQ0pEO0FBQUEsb0NBQ3dCQyxZQUFXLElBQUksU0FBUyxDQUFDO0FBQUEsZ0JBQzdDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxXQUFXO0FBQy9CLGNBQU0sUUFBUSxJQUFJLGFBQWEsWUFBWTtBQUMzQyxjQUFNLFFBQVEsSUFBSSxhQUFhLFlBQVk7QUFDM0MsY0FBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLEtBQUs7QUFDL0IsY0FBTSxxQkFBcUIsS0FBSyxNQUFNLE9BQU8sT0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsVUFBVTtBQUN2RixjQUFNLFVBQVUsS0FBSyxNQUFNLFNBQVMsS0FBSztBQUN6QyxjQUFNLE9BQU8sTUFBTSxVQUFVLGVBQWUsRUFBRSxJQUFJLEtBQUssZUFBZSxTQUFTLEtBQUssSUFBSSxlQUFlLEVBQUU7QUFFekcsY0FBTSxVQUNKLEtBQUssZUFBZSxTQUFTLElBQ3pCLE9BQ0EsSUFBSSxhQUFhLElBQ2YsUUFDQSxzQkFBc0IsSUFBSSxZQUFZLENBQUM7QUFDL0MsZUFBT0Q7QUFBQTtBQUFBLDJCQUVJLElBQUksYUFBYSxJQUFJLFVBQVUsVUFBVTtBQUFBLDJCQUN6QyxJQUFJO0FBQUEsMkJBQ0osS0FBSztBQUFBLDRCQUNKLEtBQUs7QUFBQSxnQ0FDRCxPQUFPO0FBQUEsOEJBQ1QsT0FBSyxLQUFLLGtCQUFrQixDQUFDLENBQUM7QUFBQSw2QkFDL0IsT0FBTSxJQUFJLGFBQWEsSUFBSSxLQUFLLGlCQUFpQixDQUFDLElBQUksSUFBSztBQUFBO0FBQUE7QUFBQSxNQUcxRSxDQUFDLENBQUM7QUFBQTtBQUFBLElBRVIsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUdQO0FBQ0Y7QUFsSmEsb0JBTUosU0FBeUI7QUFNdkI7QUFBQSxFQUFSRSxRQUFNO0FBQUEsR0FaSSxvQkFZRjtBQVVBO0FBQUEsRUFBUkEsUUFBTTtBQUFBLEdBdEJJLG9CQXNCRjtBQUNxRDtBQUFBLEVBQTdEQyxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsc0JBQXNCLENBQUM7QUFBQSxHQXZCakQsb0JBdUJtRDtBQXZCbkQsc0JBQU47QUFBQSxFQUROQyxnQkFBYyx1QkFBdUI7QUFBQSxHQUN6Qjs7O0FHdkJiLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxjQUFZO0FBQzFCLFNBQVMsaUJBQUFDLHVCQUFxQjtBQUl2QixJQUFNLHNCQUFOLGNBQWtDLFlBQVk7QUFBQSxFQTJDbkQsY0FBYztBQUNaLFVBQU07QUEzQ1IsU0FBUSxTQUFTO0FBQUEsRUE0Q2pCO0FBQUEsRUEzQ0EsUUFBUTtBQUFBLEVBRVI7QUFBQSxFQUNBLFdBQW9CO0FBQ2xCLFdBQU87QUFBQSxFQUVUO0FBQUEsRUFFQSxJQUFJLFFBQTJCO0FBQzdCLFdBQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBSSxNQUFNLEtBQXdCO0FBQ2hDLFVBQU0sV0FBVyxDQUFDLE1BQU0sU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELFFBQUksVUFBVTtBQUNaLFdBQUssU0FBUyxTQUFTLElBQUksU0FBUyxDQUFDO0FBQUEsSUFDdkMsT0FBTztBQUNMLFlBQU0sSUFBSSxNQUFNLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUFBLEVBRUEsV0FBb0IsYUFBYTtBQUMvQixXQUFPLGtDQUNGLFlBQVksYUFDWjtBQUFBLE1BQ0QsTUFBTTtBQUFBLFFBQ0osTUFBTTtBQUFBLFFBQ04sV0FBVztBQUFBLFFBQ1gsU0FBUztBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsRUFFSjtBQUFBLEVBSVMsU0FBUztBQUNoQixXQUFPQztBQUFBO0FBQUEsRUFFVDtBQUFBLEVBTVMsb0JBQW9CO0FBQzNCLFVBQU0sa0JBQWtCO0FBRXhCLFVBQU0sY0FBYyxLQUFLLGNBQWMsT0FBTyxLQUFLLEtBQUssY0FBYyxPQUFPLEtBQUssS0FBSyxjQUFjLFFBQVE7QUFDN0csUUFBSSxhQUFhO0FBRWYsa0JBQVksaUJBQWlCLFNBQVMsTUFBTTtBQUcxQyxhQUFLO0FBQ0wsYUFBSyxhQUFhLEtBQUssS0FBSztBQUFBLE1BQzlCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGO0FBN0RhLG9CQW9DSyxTQUFTLENBQUNDLE9BQUs7QUFwQ3BCLHNCQUFOO0FBQUEsRUFETkMsZ0JBQWMsdUJBQXVCO0FBQUEsR0FDekI7OztBQ0xiLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxjQUF3QjtBQUN0QyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxZQUFVLFNBQUFDLGVBQWE7QUFDL0MsU0FBUyxjQUFBQyxtQkFBa0I7QUFPcEIsSUFBTSxzQkFBTixjQUFrQztBQUFBLEVBQ3ZDLHlCQUF5QixhQUFhLHFCQUFxQixNQUFNLFdBQVc7QUFBQSxFQUM1RTtBQUNGLEVBQUU7QUFBQSxFQUhLO0FBQUE7QUFNSSxxQkFBb0I7QUFDcEIsNEJBQTZCLENBQUM7QUFDOUIsZ0NBQWdDO0FBQUE7QUFBQSxFQTBEaEMsU0FBUztBQUNoQixVQUFNLFVBQVUsTUFBTSxLQUFLLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDO0FBQ3JFLFFBQUksS0FBSyxZQUFZLFFBQVEsUUFBUTtBQUNuQyxXQUFLLFlBQVksUUFBUTtBQUFBLElBQzNCO0FBRUEsV0FBT0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUlDLE1BQU0sS0FBSyxNQUFNLEtBQUssU0FBUyxDQUFDLEVBQUU7QUFBQSxNQUNsQyxDQUFDLEdBQUcsTUFDRkEseURBQXVELENBQUMsaUJBQWlCLEtBQUssd0JBQzVFLEtBQUssaUJBQWlCLFNBQVMsSUFDM0JDLFlBQVcsaUNBQWlDLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxTQUFTLElBQzdFLEVBQUU7QUFBQSxJQUNaLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHVDtBQUFBLEVBRUEsSUFBSSxnQkFBZ0IsT0FBMEI7QUFDNUMsUUFBSSxVQUFVLElBQUk7QUFDaEIsV0FBSyx1QkFBdUI7QUFDNUI7QUFBQSxJQUNGO0FBRUEsUUFBSSxLQUFLLGlCQUFpQixXQUFXLEdBQUc7QUFDdEMsWUFBTSxZQUFZLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7QUFFdkQsZ0JBQVUsUUFBUSxDQUFDLFVBQVUsVUFBVTtBQUNyQyxZQUFJLGVBQWUsS0FBSyxjQUFjLGlDQUFpQyxRQUFRLElBQUk7QUFDbkYsWUFBSSxDQUFDLGNBQWM7QUFDakIseUJBQWUsS0FBSyxXQUFXLGNBQWMsaUNBQWlDLFFBQVEsSUFBSTtBQUFBLFFBQzVGO0FBRUEsY0FBTSxPQUFPLDZDQUFjLFlBQVk7QUFDdkMsYUFBSyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUssa0JBQWtCLElBQUk7QUFBQSxNQUN6RCxDQUFDO0FBQUEsSUFDSDtBQUVBLFNBQUssdUJBQXVCO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVSxjQUF3QjtBQUNoQyxVQUFNLGFBQWEsTUFBTSxLQUFzQixLQUFLLFdBQVcsaUJBQWlCLFdBQVcsQ0FBQztBQUU1RixVQUFNLFdBQVcsV0FBVyxJQUFJLGVBQWE7QUFDM0MsWUFBTSxtQkFBbUIsVUFBVSxpQkFBaUIsd0JBQXdCO0FBQzVFLFlBQU0sY0FBYyxNQUFNLEtBQUssZ0JBQWdCLEVBQUUsSUFBSSxPQUFLLEVBQUUsYUFBYSxZQUFZLENBQUM7QUFDdEYsYUFBTyxDQUFDLEdBQUcsV0FBVyxFQUFFLEtBQUssR0FBRztBQUFBLElBQ2xDLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsTUFBZSxhQUFhLGNBQWM7QUFDeEMsVUFBTSxhQUFhLFlBQVk7QUFDL0IsU0FBSyxjQUFjLE1BQU0sS0FBSyxLQUFLLGlCQUFpQixtQkFBbUIsQ0FBQztBQUN4RSxTQUFLLFlBQVksUUFBUSxRQUFNLEdBQUcsYUFBYSxRQUFRLG1CQUFtQixDQUFDO0FBQUEsRUFDN0U7QUFDRjtBQW5JYSxvQkFjSyxTQUFTO0FBQUEsRUFDdkJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaURGO0FBMURTO0FBQUEsRUFBUkMsUUFBTTtBQUFBLEdBTkksb0JBTUY7QUFDQTtBQUFBLEVBQVJBLFFBQU07QUFBQSxHQVBJLG9CQU9GO0FBQ0E7QUFBQSxFQUFSQSxRQUFNO0FBQUEsR0FSSSxvQkFRRjtBQUlGO0FBQUEsRUFETkMsV0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FYZixvQkFZSjtBQVpJLHNCQUFOO0FBQUEsRUFETkMsZ0JBQWMsdUJBQXVCO0FBQUEsR0FDekI7OztBQ1RiLFNBQVMsY0FBQUMsY0FBWSxPQUFBQyxPQUFLLFFBQUFDLGNBQVk7QUFFL0IsSUFBTSxnQ0FBTixjQUE0Q0YsYUFBVztBQUFBLEVBQ25ELFNBQVM7QUFDaEIsV0FBT0U7QUFBQSxFQUNUO0FBZ0JGO0FBbkJhLDhCQUtLLFNBQVM7QUFBQSxFQUN2QkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUY7QUFHRixlQUFlLE9BQU8sbUNBQW1DLDZCQUE2Qjs7O0FDdkJ0RixTQUFTLGNBQUFFLGNBQVksT0FBQUMsT0FBSyxRQUFBQyxjQUFZO0FBQ3RDLFNBQVMsaUJBQUFDLHVCQUFxQjtBQUd2QixJQUFNLHlCQUFOLGNBQXFDQyxhQUFXO0FBQUEsRUFNNUMsU0FBUztBQUNoQixXQUFPQztBQUFBLEVBQ1Q7QUFBQSxFQVdBLGNBQWM7QUFDWixVQUFNO0FBQ04sU0FBSyxxQkFBcUIsS0FBSyxtQkFBbUIsS0FBSyxJQUFJO0FBQzNELFNBQUsscUJBQXFCLEtBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLEVBQzdEO0FBQUE7QUFBQSxFQUdBLG1CQUFtQixPQUFPO0FBQ3hCLFVBQU0sZUFBZTtBQUdyQixVQUFNLFNBQVMsTUFBTSxVQUFVLEtBQUs7QUFDcEMsVUFBTSxTQUFTLE1BQU0sVUFBVSxLQUFLO0FBR3BDLFNBQUssWUFBWSxNQUFNLE9BQU8sS0FBSyxZQUFZLGFBQWEsU0FBUztBQUNyRSxTQUFLLFlBQVksTUFBTSxNQUFNLEtBQUssWUFBWSxZQUFZLFNBQVM7QUFHbkUsU0FBSyxTQUFTLE1BQU07QUFDcEIsU0FBSyxTQUFTLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBRVMsYUFBYSxHQUFTO0FBQzdCLFVBQU0sYUFBYSxDQUFDO0FBR3BCLFNBQUssY0FBYyxLQUFLLGNBQWMscUNBQXFDO0FBSTNFLFNBQUssU0FBUztBQUNkLFNBQUssU0FBUztBQUdkLFNBQUssWUFBWSxpQkFBaUIsYUFBYSxDQUFDLFVBQXNCO0FBRXBFLFdBQUssU0FBUyxNQUFNO0FBQ3BCLFdBQUssU0FBUyxNQUFNO0FBR3BCLGVBQVMsaUJBQWlCLGFBQWEsS0FBSyxvQkFBb0IsSUFBSTtBQUFBLElBQ3RFLENBQUM7QUFDRCxhQUFTLGlCQUFpQixXQUFXLEtBQUssa0JBQWtCO0FBQUEsRUFDOUQ7QUFBQSxFQUVBLG1CQUFtQixPQUFPO0FBQ3hCLGFBQVMsb0JBQW9CLGFBQWEsS0FBSyxvQkFBb0IsSUFBSTtBQUFBLEVBQ3pFO0FBQUEsRUFFUyx1QkFBdUI7QUFDOUIsVUFBTSxxQkFBcUI7QUFDM0IsYUFBUyxvQkFBb0IsYUFBYSxLQUFLLGtCQUFrQjtBQUNqRSxhQUFTLG9CQUFvQixXQUFXLEtBQUssa0JBQWtCO0FBQUEsRUFDakU7QUFDRjtBQTFFYSx1QkFVSyxTQUFTO0FBQUEsRUFDdkJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1GO0FBakJXLHlCQUFOO0FBQUEsRUFETkMsZ0JBQWMsMkJBQTJCO0FBQUEsR0FDN0I7OztBQ0piLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxjQUFZO0FBQzFCLFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLFlBQVUsU0FBQUMsZUFBYTtBQUMvQyxTQUFTLFVBQUFDLGVBQWM7QUFDdkIsU0FBUyxnQkFBZ0I7QUFJbEIsSUFBTSw0QkFBTixjQUF3QyxZQUFZO0FBQUEsRUFBcEQ7QUFBQTtBQWlCTCxTQUFPLGFBQXFCO0FBTTVCLFNBQU8sYUFBcUI7QUFHNUIsU0FBUSxVQUFvQixDQUFDO0FBRzdCO0FBQUEsU0FBUSxjQUF1QztBQUcvQztBQUFBLFNBQVEsZ0JBQWdCLENBQUMsVUFBc0I7QUFDN0MsVUFBSSxLQUFLLFFBQVEsU0FBUyxLQUFLLFlBQVk7QUFDekMsY0FBTSxJQUFJLE1BQU07QUFDaEIsY0FBTSxJQUFJLE1BQU07QUFFaEIsYUFBSyxVQUFVLENBQUMsR0FBRyxLQUFLLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzVDLGFBQUssYUFBYSxLQUFLLE9BQU87QUFBQSxNQUNoQztBQUFBLElBQ0Y7QUFBQTtBQUFBLEVBRVMsU0FBUztBQUNoQixXQUFPQztBQUFBO0FBQUEsVUFFREM7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLFdBQVM7QUFBQSxNQUNULENBQUMsT0FBTyxVQUFVRDtBQUFBO0FBQUE7QUFBQSxzQkFHTixTQUFTO0FBQUEsUUFDZixVQUFVO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxNQUFNLEdBQUcsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFBQSxRQUM1QixLQUFLLEdBQUcsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFBQSxNQUM3QixDQUFDLENBQUM7QUFBQSw0Q0FDNEIsS0FBSztBQUFBLHVCQUMxQixDQUFDLE1BQWE7QUFDckIsVUFBRSxnQkFBZ0I7QUFDbEIsYUFBSyxVQUFVLEtBQUssUUFBUSxPQUFPLENBQUMsR0FBRyxNQUFNLE1BQU0sS0FBSztBQUN4RCxhQUFLLGFBQWEsS0FBSyxPQUFPO0FBQUEsTUFDaEMsQ0FBQztBQUFBO0FBQUE7QUFBQSxJQUdQLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHUDtBQUFBLEVBRUEsUUFBYztBQUNaLFNBQUssVUFBVSxDQUFDO0FBQUEsRUFDbEI7QUFBQSxFQUVBLFdBQW9CO0FBQ2xCLFdBQU8sS0FBSyxRQUFRLFVBQVUsS0FBSyxjQUFjLEtBQUssUUFBUSxVQUFVLEtBQUs7QUFBQSxFQUMvRTtBQUFBLEVBRUEsSUFBSSxNQUFNLEtBQXdCO0FBQ2hDLFNBQUssVUFBVSxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHO0FBQUEsRUFDaEQ7QUFBQSxFQUNBLElBQUksUUFBMkI7QUFDN0IsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRVMsZUFBcUI7QUFDNUIsU0FBSyxjQUFjLEtBQUssY0FBYyxLQUFLO0FBRTNDLFFBQUksS0FBSyxhQUFhO0FBRXBCLFdBQUssWUFBWSxpQkFBaUIsU0FBUyxLQUFLLGFBQWE7QUFBQSxJQUMvRCxPQUFPO0FBQ0wsY0FBUSxLQUFLLDBEQUEwRDtBQUFBLElBQ3pFO0FBQUEsRUFDRjtBQUFBLEVBRVMsdUJBQTZCO0FBQ3BDLFVBQU0scUJBQXFCO0FBRTNCLFFBQUksS0FBSyxhQUFhO0FBRXBCLFdBQUssWUFBWSxvQkFBb0IsU0FBUyxLQUFLLGFBQWE7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFDRjtBQXhHYSwwQkFDSyxTQUFTO0FBQUEsRUFDdkJFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNGO0FBTU87QUFBQSxFQUpOQyxXQUFTO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsRUFDYixDQUFDO0FBQUEsR0FoQlUsMEJBaUJKO0FBTUE7QUFBQSxFQUpOQSxXQUFTO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixXQUFXO0FBQUEsRUFDYixDQUFDO0FBQUEsR0F0QlUsMEJBdUJKO0FBR0M7QUFBQSxFQURQQyxRQUFNO0FBQUEsR0F6QkksMEJBMEJIO0FBMUJHLDRCQUFOO0FBQUEsRUFETkMsZ0JBQWMsOEJBQThCO0FBQUEsR0FDaEM7OztBQ1BiLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGVBQWU7QUFDbkMsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsWUFBVSxTQUFBQyxjQUFhO0FBOEJ4QyxJQUFNLHVCQUFOLGNBQW1DLFlBQVk7QUFBQTtBQUFBLEVBc0VwRCxjQUFjO0FBQ1osVUFBTTtBQXRFUixTQUFRLFNBQVM7QUFTcUMscUJBQVk7QUFFckMsbUJBQVU7QUErQnZDLGlDQUF3QixDQUFDLEtBQUssYUFBYTtBQUFBLElBQUM7QUFHNUMsaUNBQXdCLENBQUMsS0FBSyxhQUFhO0FBQUEsSUFBQztBQTRCMUMsU0FBSyxTQUFTLGlCQUFpQixJQUFJO0FBQUEsRUFDckM7QUFBQSxFQTVEc0QsSUFBSSxJQUFJLE9BQWU7QUFDM0UsU0FBSyxPQUFPO0FBQ1osU0FBSyxTQUFTO0FBQ2QsU0FBSyxNQUFNLFlBQVksU0FBUyxHQUFHLEtBQUssSUFBSSxFQUFFO0FBQUEsRUFDaEQ7QUFBQSxFQUNBLElBQUksTUFBYztBQUNoQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFHc0QsSUFBSSxJQUFJLE9BQWU7QUFDM0UsU0FBSyxPQUFPO0FBQ1osU0FBSyxNQUFNLFlBQVksU0FBUyxHQUFHLEtBQUssSUFBSSxFQUFFO0FBQUEsRUFDaEQ7QUFBQSxFQUNBLElBQUksTUFBYztBQUNoQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFHK0MsSUFBSSxLQUFLLE9BQWU7QUFDckUsU0FBSyxRQUFRO0FBQ2IsU0FBSyxNQUFNLFlBQVksVUFBVSxHQUFHLEtBQUssS0FBSyxFQUFFO0FBQUEsRUFDbEQ7QUFBQSxFQUNBLElBQUksT0FBZTtBQUNqQixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFRQSxRQUFRO0FBQUEsRUFFUjtBQUFBLEVBQ0EsV0FBb0I7QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLElBQUksUUFBMkI7QUFDN0IsV0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLEVBQzlCO0FBQUEsRUFFQSxJQUFJLE1BQU0sS0FBd0I7QUFDaEMsVUFBTSxXQUFXLENBQUMsTUFBTSxTQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFDaEQsUUFBSSxVQUFVO0FBQ1osV0FBSyxTQUFTLFNBQVMsSUFBSSxTQUFTLENBQUM7QUFBQSxJQUN2QyxPQUFPO0FBQ0wsWUFBTSxJQUFJLE1BQU0sd0JBQXdCO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFXQSxJQUFJLFNBQVMsWUFBK0I7QUFDMUMsUUFBSSxNQUFNLFFBQVEsVUFBVSxHQUFHO0FBQzdCLGNBQVEsTUFBTSwwRUFBMEU7QUFDeEY7QUFBQSxJQUNGO0FBQ0EsVUFBTSxRQUFRLFNBQVMsVUFBVTtBQUNqQyxRQUFJLE9BQU8sTUFBTSxLQUFLLEdBQUc7QUFDdkIsY0FBUSxNQUFNLGdEQUFnRDtBQUM5RDtBQUFBLElBQ0Y7QUFDQSxTQUFLLFNBQVM7QUFBQSxFQUNoQjtBQUFBLEVBSVMsU0FBUztBQUVoQixRQUFJLEtBQUssU0FBUyxLQUFLLEtBQUs7QUFDMUIsV0FBSyxTQUFTLEtBQUs7QUFBQSxJQUNyQjtBQUNBLFFBQUksS0FBSyxTQUFTLEtBQUssS0FBSztBQUMxQixXQUFLLFNBQVMsS0FBSztBQUFBLElBQ3JCO0FBQ0EsVUFBTSxtQkFBb0IsS0FBSyxTQUFTLEtBQUssUUFBUSxLQUFLLE1BQU0sS0FBSyxPQUFRO0FBQzdFLFNBQUssTUFBTSxZQUFZLHNCQUFzQixHQUFHLGVBQWUsR0FBRztBQUNsRSxTQUFLLGFBQWEsaUJBQWlCLEtBQUssTUFBTSxTQUFTLENBQUM7QUFFeEQsV0FBT0M7QUFBQTtBQUFBLFVBRUQsS0FBSyxPQUFPLGlCQUFpQixlQUFlLEtBQUssU0FDL0NBO0FBQUEscUJBQ1MsS0FBSyxJQUFJO0FBQUEscUJBQ1QsS0FBSyxJQUFJO0FBQUEsc0JBRWxCLE9BQU87QUFBQSxVQUNULEtBQUssT0FBTyxpQkFBaUIsY0FBYyxLQUFLLFNBQVNBLDhDQUE0QyxPQUFPO0FBQUEsZ0RBQ3RFLEtBQUssWUFBWSxnQkFBZ0IsS0FBSyxZQUFZO0FBQUE7QUFBQSxjQUVwRixLQUFLLE9BQU8saUJBQWlCLGNBQWMsS0FBSyxTQUM5Q0Esc0NBQW9DLEtBQUssS0FBSyxXQUM5QyxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckI7QUFBQSxFQUVTLG9CQUFvQjtBQUMzQixVQUFNLGtCQUFrQjtBQUN4QixTQUFLLE9BQU87QUFDWixTQUFLLGFBQWEsWUFBWSxHQUFHO0FBQ2pDLFNBQUssYUFBYSxRQUFRLFFBQVE7QUFBQSxFQUNwQztBQUFBLEVBRVEsYUFBYSxPQUFPO0FBQzFCLFVBQU0sa0JBQWtCLENBQUFDLFdBQVM7QUFDL0IsWUFBTSxFQUFFLEdBQUFDLEdBQUUsSUFBSSxLQUFLLHFCQUFxQkQsTUFBSztBQUM3QyxZQUFNRSxTQUFRRCxLQUFJLEtBQUssTUFBTSxzQkFBc0IsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCO0FBQ3JGLFdBQUssZUFBZUMsTUFBSztBQUN6QixNQUFBRixPQUFNLGdCQUFnQjtBQUFBLElBQ3hCO0FBRUEsVUFBTSxpQkFBaUIsTUFBTTtBQUMzQixlQUFTLG9CQUFvQixhQUFhLGVBQWU7QUFDekQsZUFBUyxvQkFBb0IsWUFBWSxjQUFjO0FBRXZELFdBQUssYUFBYSxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDekM7QUFFQSxhQUFTLGlCQUFpQixhQUFhLGVBQWU7QUFDdEQsYUFBUyxpQkFBaUIsWUFBWSxjQUFjO0FBRXBELFVBQU0sRUFBRSxFQUFFLElBQUksS0FBSyxxQkFBcUIsS0FBSztBQUM3QyxVQUFNLFFBQVEsSUFBSSxLQUFLLE1BQU0sc0JBQXNCLEVBQUUsT0FBTyxTQUFTLGdCQUFnQjtBQUNyRixTQUFLLGVBQWUsS0FBSztBQUN6QixVQUFNLGdCQUFnQjtBQUFBLEVBQ3hCO0FBQUEsRUFFUSxhQUFhLE9BQU87QUFDMUIsVUFBTSxrQkFBa0IsQ0FBQ0EsV0FBc0I7QUFFN0MsWUFBTUUsU0FBUUYsT0FBTSxRQUFRLEtBQUssTUFBTSxzQkFBc0IsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCO0FBRS9GLFdBQUssZUFBZUUsTUFBSztBQUN6QixNQUFBRixPQUFNLGVBQWU7QUFDckIsTUFBQUEsT0FBTSxnQkFBZ0I7QUFBQSxJQUN4QjtBQUVBLFVBQU0sZ0JBQWdCLE1BQU07QUFDMUIsZUFBUyxvQkFBb0IsYUFBYSxlQUFlO0FBQ3pELGVBQVMsb0JBQW9CLFdBQVcsYUFBYTtBQUVyRCxXQUFLLGFBQWEsS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQ3pDO0FBRUEsYUFBUyxpQkFBaUIsYUFBYSxlQUFlO0FBQ3RELGFBQVMsaUJBQWlCLFdBQVcsYUFBYTtBQUdsRCxVQUFNLFFBQVEsTUFBTSxRQUFRLEtBQUssTUFBTSxzQkFBc0IsRUFBRSxPQUFPLFNBQVMsZ0JBQWdCO0FBRS9GLFNBQUssZUFBZSxLQUFLO0FBQ3pCLFVBQU0sZUFBZTtBQUNyQixVQUFNLGdCQUFnQjtBQUFBLEVBQ3hCO0FBQUE7QUFBQSxFQUdRLGVBQWUsT0FBZTtBQUNwQyxVQUFNLFdBQVcsS0FBSyxPQUFRLEtBQUssTUFBTSxLQUFLLE9BQU8sUUFBUyxLQUFLLE1BQU0sc0JBQXNCLEVBQUU7QUFDakcsVUFBTSxtQkFBbUIsS0FBSyxNQUFNLEtBQUssT0FBTyxXQUFXLEtBQUssT0FBTyxLQUFLLEtBQUssSUFBSSxLQUFLO0FBQzFGLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQUEsRUFFUSxxQkFBcUIsR0FHM0I7QUFDQSxRQUFJO0FBQ0osUUFBSSxFQUFFLFFBQVEsZ0JBQWdCLEVBQUUsUUFBUSxlQUFlLEVBQUUsUUFBUSxjQUFjLEVBQUUsUUFBUSxlQUFlO0FBQ3RHLFlBQU0sTUFBTSxPQUFPLEVBQUUsa0JBQWtCLGNBQWMsSUFBSSxFQUFFO0FBQzNELFlBQU0sUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDO0FBQ3BELG1CQUFhO0FBQUEsUUFDWCxHQUFHLE1BQU07QUFBQSxRQUNULEdBQUcsTUFBTTtBQUFBLE1BQ1g7QUFBQSxJQUNGLFdBQ0UsRUFBRSxRQUFRLGVBQ1YsRUFBRSxRQUFRLGFBQ1YsRUFBRSxRQUFRLGVBQ1YsRUFBRSxRQUFRLGVBQ1YsRUFBRSxRQUFRLGNBQ1YsRUFBRSxRQUFRLGdCQUNWLEVBQUUsUUFBUSxjQUNWO0FBQ0EsbUJBQWE7QUFBQSxRQUNYLEdBQUcsRUFBRTtBQUFBLFFBQ0wsR0FBRyxFQUFFO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBek5hLHFCQTBGSyxTQUFTLENBQUNHLE9BQUs7QUFyRnZCO0FBQUEsRUFEUEMsT0FBTSxPQUFPO0FBQUEsR0FKSCxxQkFLSDtBQUdBO0FBQUEsRUFEUEEsT0FBTSxPQUFPO0FBQUEsR0FQSCxxQkFRSDtBQUU4QztBQUFBLEVBQXJEQyxXQUFTLEVBQUUsTUFBTSxTQUFTLFdBQVcsYUFBYSxDQUFDO0FBQUEsR0FWekMscUJBVTJDO0FBRXpCO0FBQUEsRUFBNUJBLFdBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLEdBWmhCLHFCQVlrQjtBQUc2QjtBQUFBLEVBQXpEQSxXQUFTLEVBQUUsTUFBTSxRQUFRLFdBQVcsY0FBYyxDQUFDO0FBQUEsR0FmekMscUJBZStDO0FBVUE7QUFBQSxFQUF6REEsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLGNBQWMsQ0FBQztBQUFBLEdBekJ6QyxxQkF5QitDO0FBU1A7QUFBQSxFQUFsREEsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLE9BQU8sQ0FBQztBQUFBLEdBbENsQyxxQkFrQ3dDO0FBU25EO0FBQUEsRUFEQyxNQUFNLFlBQVksRUFBRSxzQkFBc0IsS0FBSyxDQUFDO0FBQUEsR0ExQ3RDLHFCQTJDWDtBQUdBO0FBQUEsRUFEQyxNQUFNLFlBQVksRUFBRSxzQkFBc0IsS0FBSyxDQUFDO0FBQUEsR0E3Q3RDLHFCQThDWDtBQTlDVyx1QkFBTjtBQUFBLEVBRE5DLGdCQUFjLHdCQUF3QjtBQUFBLEdBQzFCOzs7QUMvQmIsU0FBUyxXQUFBQyxnQkFBZTtBQUN4QixTQUFTLGNBQUFDLGNBQVksUUFBQUMsY0FBWTtBQUNqQyxTQUFTLGlCQUFBQyxpQkFBZSxTQUFBQyxlQUFhO0FBaUI5QixJQUFNLG9CQUFOLGNBQWdDQyxhQUFnQztBQUFBLEVBUXJFLFNBQVM7QUFDUCxXQUFPQywyQkFBeUIsS0FBSyxnQkFBZ0I7QUFBQSxFQUN2RDtBQUFBLEVBRUEsaUJBQWlCLE9BQWM7QUEvQmpDO0FBaUNJLFVBQU0sY0FBYyxNQUFNLE1BQUssZ0JBQUssc0JBQUwsbUJBQXdCLGVBQXhCLFlBQXNDLENBQUMsQ0FBQyxFQUFFO0FBQUEsTUFDdkUsVUFBUSxLQUFLLGFBQWEsS0FBSztBQUFBLElBQ2pDO0FBQ0EsUUFBSTtBQUNGLFdBQUssbUJBQW1CLElBQUksU0FBUyxXQUFXLE1BQU0sU0FBUSxpQkFBWSxnQkFBWixZQUEyQixFQUFFO0FBQUEsSUFDN0YsU0FBUyxHQUFHO0FBQ1YsY0FBUSxNQUFNLG9EQUFvRCxDQUFDO0FBQUEsSUFDckU7QUFBQSxFQUNGO0FBQUEsRUFFTyxZQUFZO0FBQ2pCLFVBQU0sS0FBSztBQUFBLE1BQ1QsVUFBVSxDQUFDLHVCQUE0QjtBQTdDN0M7QUE4Q1Esc0NBQUssYUFBTCxtQkFBZSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsd0JBQXBELG1CQUF5RSxVQUF6RSxZQUFrRjtBQUFBO0FBQUEsTUFDcEYsU0FBUyxDQUFDLHVCQUE0QjtBQS9DNUM7QUFnRFMsc0NBQUssYUFBTCxtQkFBZSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWUsd0JBQXBELG1CQUNHLG9CQURILFlBQ3NCO0FBQUE7QUFBQSxJQUMzQjtBQUNBLFVBQU0sT0FBTztBQUFBLE1BQ1gsYUFBYSxDQUFDLHVCQUE0QjtBQXBEaEQ7QUFxRFEsMEJBQUssYUFBTCxtQkFBZSxVQUFVLEtBQUssT0FBSyxFQUFFLGVBQWU7QUFBQTtBQUFBLE1BQ3RELHVCQUF1QixDQUFDLG1CQUEyQixVQUE2QjtBQUM5RSxhQUFLO0FBQUEsVUFDSCxJQUFJLFlBQXFFLHlCQUF5QjtBQUFBLFlBQ2hHLFNBQVM7QUFBQSxZQUNULFVBQVU7QUFBQSxZQUNWLFFBQVE7QUFBQSxjQUNOO0FBQUEsY0FDQTtBQUFBLFlBQ0Y7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLE1BQ0Esd0JBQXdCLENBQUMsb0JBQTRCLGFBQWdDO0FBQ25GLGFBQUs7QUFBQSxVQUNILElBQUksWUFBeUUsNEJBQTRCO0FBQUEsWUFDdkcsU0FBUztBQUFBLFlBQ1QsVUFBVTtBQUFBLFlBQ1YsUUFBUTtBQUFBLGNBQ047QUFBQSxjQUNBO0FBQUEsWUFDRjtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFdBQU8sS0FBSyxpQkFBaUIsS0FBSyxVQUFVLElBQUksSUFBSTtBQUFBLEVBQ3REO0FBQ0Y7QUF6RFU7QUFBQSxFQUZQQyxTQUFRLEVBQUUsU0FBUyxhQUFhLFdBQVcsS0FBSyxDQUFDO0FBQUEsRUFDakRDLFFBQU07QUFBQSxHQUxJLGtCQU1IO0FBTkcsb0JBQU47QUFBQSxFQUROQyxnQkFBYyxxQkFBcUI7QUFBQSxHQUN2Qjs7O0FDbkJiLFNBQVMsY0FBQUMsY0FBWSxPQUFBQyxPQUFLLFFBQUFDLGNBQVk7QUFDdEMsU0FBUyxpQkFBQUMsdUJBQXFCO0FBR3ZCLElBQU0sdUJBQU4sY0FBbUNDLGFBQVc7QUFBQSxFQVMxQyxvQkFBb0I7QUFDM0IsVUFBTSxrQkFBa0I7QUFDeEIsU0FBSztBQUFBLE1BQ0gsSUFBSSxZQUFZLHdCQUF3QjtBQUFBLFFBQ3RDLFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBRVMsU0FBUztBQUNoQixXQUFPQztBQUFBLEVBQ1Q7QUFDRjtBQXZCYSxxQkFDSixTQUFTQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURMLHVCQUFOO0FBQUEsRUFETkMsZ0JBQWMsd0JBQXdCO0FBQUEsR0FDMUI7OztBQ0piLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGNBQUFDLG9CQUFrQjtBQUN0QyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxrQkFBZ0I7QUFHakMsSUFBTSxTQUFOLGNBQXFCQyxhQUFXO0FBQUEsRUFBaEM7QUFBQTtBQVFzQyxvQkFBK0I7QUFBQTtBQUFBLEVBRWpFLFNBQVM7QUFDaEIsV0FBT0M7QUFBQSxFQUNUO0FBQ0Y7QUFiYSxPQUNKLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU8yQjtBQUFBLEVBQTFDQyxXQUFTLEVBQUUsTUFBTSxRQUFRLFNBQVMsS0FBSyxDQUFDO0FBQUEsR0FSOUIsT0FRZ0M7QUFSaEMsU0FBTjtBQUFBLEVBRE5DLGdCQUFjLFNBQVM7QUFBQSxHQUNYOzs7QUNKYixTQUFTLE9BQUFDLE9BQUssY0FBQUMsb0JBQWtCO0FBQ2hDLFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLGtCQUFnQjtBQUdqQyxJQUFNLFlBQU4sY0FBd0JDLGFBQVc7QUFBQSxFQUFuQztBQUFBO0FBUXNDLG9CQUErQjtBQUFBO0FBQUEsRUFFMUUsb0JBQW9CO0FBQ2xCLFNBQUssYUFBYSxRQUFRLGFBQWE7QUFBQSxFQUN6QztBQUNGO0FBYmEsVUFDSixTQUFTQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPMkI7QUFBQSxFQUExQ0MsV0FBUyxFQUFFLE1BQU0sUUFBUSxTQUFTLEtBQUssQ0FBQztBQUFBLEdBUjlCLFVBUWdDO0FBUmhDLFlBQU47QUFBQSxFQUROQyxnQkFBYyxhQUFhO0FBQUEsR0FDZjs7O0FDSmIsU0FBUyxPQUFBQyxPQUFLLFFBQUFDLFFBQU0sY0FBQUMsb0JBQWtCO0FBQ3RDLFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLGtCQUFnQjtBQUlqQyxJQUFNLGFBQU4sY0FBeUIsbUJBQW1CQyxjQUFZLGNBQWMsRUFBRTtBQUFBLEVBQXhFO0FBQUE7QUFRc0Msb0JBQStCO0FBQUE7QUFBQSxFQUVqRSxvQkFBMEI7QUFDakMsVUFBTSxrQkFBa0I7QUFDeEIsU0FBSyxhQUFhLFFBQVEsY0FBYztBQUFBLEVBQzFDO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUEsRUFDVDtBQUNGO0FBbEJhLFdBQ0osU0FBU0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTzJCO0FBQUEsRUFBMUNDLFdBQVMsRUFBRSxNQUFNLFFBQVEsU0FBUyxLQUFLLENBQUM7QUFBQSxHQVI5QixXQVFnQztBQVJoQyxhQUFOO0FBQUEsRUFETkMsZ0JBQWMsY0FBYztBQUFBLEdBQ2hCOzs7QUNMYixTQUFTLE9BQUFDLE9BQUssY0FBQUMsb0JBQWtCO0FBQ2hDLFNBQVMsaUJBQUFDLGlCQUFlLFlBQUFDLGtCQUFnQjtBQU1qQyxJQUFNLG1CQUFOLGNBQStCLG1CQUFtQkMsY0FBWSxvQkFBb0IsRUFBRTtBQVMzRjtBQVRhLGlCQUNKLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3lEO0FBQUEsRUFBeEVDLFdBQVMsRUFBRSxXQUFXLG1CQUFtQixNQUFNLFFBQVEsU0FBUyxLQUFLLENBQUM7QUFBQSxHQVI1RCxpQkFROEQ7QUFSOUQsbUJBQU47QUFBQSxFQUROQyxnQkFBYyxvQkFBb0I7QUFBQSxHQUN0Qjs7O0FDUGIsU0FBUyxPQUFBQyxPQUFLLFFBQUFDLFFBQU0sY0FBQUMsb0JBQWtCO0FBQ3RDLFNBQVMsaUJBQUFDLHVCQUFxQjtBQUl2QixJQUFNLGFBQU4sY0FBeUIsbUJBQW1CQyxjQUFZLGFBQWEsRUFBRTtBQUFBLEVBUW5FLFNBQVM7QUFDaEIsV0FBT0M7QUFBQTtBQUFBLEVBRVQ7QUFDRjtBQVphLFdBQ0osU0FBU0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREwsYUFBTjtBQUFBLEVBRE5DLGdCQUFjLGFBQWE7QUFBQSxHQUNmOzs7QUNMYixTQUFTLE9BQUFDLE9BQUssUUFBQUMsUUFBTSxjQUFBQyxvQkFBa0I7QUFDdEMsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsa0JBQWdCO0FBR2pDLElBQU0sa0JBQU4sY0FBOEJDLGFBQVc7QUFBQSxFQUM5QyxXQUFvQixTQUFTO0FBQzNCLFdBQU87QUFBQSxNQUNMQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU1GO0FBQUEsRUFDRjtBQUFBLEVBS1Msb0JBQW9CO0FBQzNCLFVBQU0sa0JBQWtCO0FBRXhCLFNBQUssaUJBQWlCLFNBQVMsS0FBSyxxQkFBcUI7QUFFekQsU0FBSztBQUFBLE1BQ0gsSUFBSSxZQUFZLDhCQUE4QjtBQUFBLFFBQzVDLFNBQVM7QUFBQSxRQUNULFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBRVMsdUJBQXVCO0FBQzlCLFNBQUssb0JBQW9CLFNBQVMsS0FBSyxxQkFBcUI7QUFBQSxFQUM5RDtBQUFBLEVBRVMsU0FBUztBQUNoQixXQUFPQztBQUFBLEVBQ1Q7QUFBQSxFQUVRLHdCQUF3QjtBQUc5QixTQUFLO0FBQUEsTUFDSCxJQUFJLFlBQVksNEJBQTRCO0FBQUEsUUFDMUMsU0FBUztBQUFBLFFBQ1QsWUFBWTtBQUFBLFFBQ1osVUFBVTtBQUFBLFFBQ1YsUUFBUSxFQUFFLFlBQVksS0FBSyxXQUFXO0FBQUEsTUFDeEMsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFwQ0U7QUFBQSxFQURDQyxXQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFBQSxHQVpmLGdCQWFYO0FBYlcsa0JBQU47QUFBQSxFQUROQyxnQkFBYyxtQkFBbUI7QUFBQSxHQUNyQjs7O0FDSmIsU0FBUyxPQUFBQyxPQUFLLFFBQUFDLFFBQU0sY0FBQUMsY0FBWSxXQUFBQyxnQkFBZTtBQUMvQyxTQUFTLGlCQUFBQyxpQkFBZSxZQUFBQyxrQkFBZ0I7QUFRakMsSUFBTSxrQkFBTixjQUE4QixtQkFBbUJDLGNBQVksbUJBQW1CLEVBQUU7QUFBQSxFQXlCdkYsSUFBSSxVQUFVO0FBQ1osV0FBTyxLQUFLLFdBQVcsRUFBRSxPQUFPLElBQUksV0FBVztBQUFBLEVBQ2pEO0FBQUEsRUFFUyxTQUFTO0FBQ2hCLFdBQU9DO0FBQUE7QUFBQTtBQUFBLFFBR0gsS0FBSyxTQUFTQSx5QkFBdUIsS0FBSyxNQUFNLFdBQVdDLFFBQU87QUFBQTtBQUFBLEVBRXhFO0FBQ0Y7QUFwQ2EsZ0JBQ0osU0FBU0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJUO0FBQUEsRUFETkMsV0FBUyxFQUFFLE1BQU0sUUFBUSxXQUFXLE1BQU0sQ0FBQztBQUFBLEdBckJqQyxnQkFzQko7QUF0Qkksa0JBQU47QUFBQSxFQUROQyxnQkFBYyxtQkFBbUI7QUFBQSxHQUNyQjs7O0FDK0RiLFFBQVE7QUFBQSxFQUNOO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7IiwKICAibmFtZXMiOiBbInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJ4bWwiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAic3RhdGUiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImNzcyIsICJodG1sIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJjc3MiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3NzIiwgImh0bWwiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiY3NzIiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJodG1sIiwgImh0bWwiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAic3RhdGUiLCAiY29uc3VtZSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJodG1sIiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgInN0YXRlIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJyZXF1aXJlIiwgImh0bWwiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJwcm9wZXJ0eSIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZnJhbWUiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicXVlcnkiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgImh0bWwiLCAiaWZEZWZpbmVkIiwgImNzcyIsICJzdGF0ZSIsICJxdWVyeSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiaG90c3BvdCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJ1bnNhZmVIVE1MIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJodG1sIiwgInVuc2FmZUhUTUwiLCAiY3NzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicmVwZWF0IiwgImh0bWwiLCAicmVwZWF0IiwgImNzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicXVlcnkiLCAiaHRtbCIsICJldmVudCIsICJ4IiwgImRpZmZYIiwgImNzcyIsICJxdWVyeSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNvbnN1bWUiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibm90aGluZyIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K
6593
+ //# sourceMappingURL=index.js.map