cdktn 0.25.0-pre.51 → 0.25.0-pre.53

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 (59) hide show
  1. package/.jsii +38 -19
  2. package/lib/annotations.js +1 -1
  3. package/lib/app.js +1 -1
  4. package/lib/aspect.js +1 -1
  5. package/lib/asset-hash.js +1 -1
  6. package/lib/asset-staging.d.ts +6 -3
  7. package/lib/asset-staging.js +10 -7
  8. package/lib/assets.js +4 -4
  9. package/lib/backends/azurerm-backend.js +2 -2
  10. package/lib/backends/cloud-backend.js +4 -4
  11. package/lib/backends/consul-backend.js +2 -2
  12. package/lib/backends/cos-backend.js +2 -2
  13. package/lib/backends/gcs-backend.js +2 -2
  14. package/lib/backends/http-backend.js +2 -2
  15. package/lib/backends/local-backend.js +2 -2
  16. package/lib/backends/oss-backend.js +2 -2
  17. package/lib/backends/pg-backend.js +2 -2
  18. package/lib/backends/remote-backend.js +4 -4
  19. package/lib/backends/s3-backend.js +2 -2
  20. package/lib/backends/swift-backend.js +2 -2
  21. package/lib/complex-computed-list.js +26 -26
  22. package/lib/errors.d.ts +1 -0
  23. package/lib/errors.js +6 -3
  24. package/lib/functions/provider-function.js +1 -1
  25. package/lib/functions/terraform-functions.generated.js +1 -1
  26. package/lib/ignore-strategy.js +1 -1
  27. package/lib/importable-resource.js +1 -1
  28. package/lib/manifest.js +1 -1
  29. package/lib/resource.js +1 -1
  30. package/lib/terraform-asset.d.ts +17 -1
  31. package/lib/terraform-asset.js +3 -2
  32. package/lib/terraform-backend.js +1 -1
  33. package/lib/terraform-count.js +1 -1
  34. package/lib/terraform-data-resource.js +1 -1
  35. package/lib/terraform-data-source.js +1 -1
  36. package/lib/terraform-element.js +1 -1
  37. package/lib/terraform-ephemeral-resource.js +1 -1
  38. package/lib/terraform-functions.js +1 -1
  39. package/lib/terraform-hcl-module.js +1 -1
  40. package/lib/terraform-iterator.js +5 -5
  41. package/lib/terraform-local.js +1 -1
  42. package/lib/terraform-module.js +1 -1
  43. package/lib/terraform-operators.js +1 -1
  44. package/lib/terraform-output.js +1 -1
  45. package/lib/terraform-provider.js +1 -1
  46. package/lib/terraform-provisioner.js +1 -1
  47. package/lib/terraform-remote-state.js +1 -1
  48. package/lib/terraform-resource-targets.js +1 -1
  49. package/lib/terraform-resource.js +1 -1
  50. package/lib/terraform-stack.js +1 -1
  51. package/lib/terraform-variable.js +2 -2
  52. package/lib/testing/index.js +1 -1
  53. package/lib/testing/matchers.js +1 -1
  54. package/lib/tokens/lazy.js +2 -2
  55. package/lib/tokens/resolvable.js +2 -2
  56. package/lib/tokens/string-fragments.js +1 -1
  57. package/lib/tokens/token.js +2 -2
  58. package/lib/upgrade-id-aspect.js +1 -1
  59. package/package.json +1 -1
package/.jsii CHANGED
@@ -1764,7 +1764,7 @@
1764
1764
  },
1765
1765
  "locationInModule": {
1766
1766
  "filename": "src/asset-staging.ts",
1767
- "line": 499
1767
+ "line": 502
1768
1768
  },
1769
1769
  "name": "stage",
1770
1770
  "parameters": [
@@ -1988,7 +1988,7 @@
1988
1988
  "kind": "enum",
1989
1989
  "locationInModule": {
1990
1990
  "filename": "src/terraform-asset.ts",
1991
- "line": 78
1991
+ "line": 95
1992
1992
  },
1993
1993
  "members": [
1994
1994
  {
@@ -22575,7 +22575,7 @@
22575
22575
  },
22576
22576
  "locationInModule": {
22577
22577
  "filename": "src/terraform-asset.ts",
22578
- "line": 125
22578
+ "line": 142
22579
22579
  },
22580
22580
  "parameters": [
22581
22581
  {
@@ -22604,7 +22604,7 @@
22604
22604
  "kind": "class",
22605
22605
  "locationInModule": {
22606
22606
  "filename": "src/terraform-asset.ts",
22607
- "line": 108
22607
+ "line": 125
22608
22608
  },
22609
22609
  "name": "TerraformAsset",
22610
22610
  "properties": [
@@ -22617,7 +22617,7 @@
22617
22617
  "immutable": true,
22618
22618
  "locationInModule": {
22619
22619
  "filename": "src/terraform-asset.ts",
22620
- "line": 112
22620
+ "line": 129
22621
22621
  },
22622
22622
  "name": "assetHash",
22623
22623
  "overrides": "cdktn.IAsset",
@@ -22633,7 +22633,7 @@
22633
22633
  "immutable": true,
22634
22634
  "locationInModule": {
22635
22635
  "filename": "src/terraform-asset.ts",
22636
- "line": 230
22636
+ "line": 248
22637
22637
  },
22638
22638
  "name": "fileName",
22639
22639
  "type": {
@@ -22648,7 +22648,7 @@
22648
22648
  "immutable": true,
22649
22649
  "locationInModule": {
22650
22650
  "filename": "src/terraform-asset.ts",
22651
- "line": 217
22651
+ "line": 235
22652
22652
  },
22653
22653
  "name": "path",
22654
22654
  "type": {
@@ -22661,7 +22661,7 @@
22661
22661
  },
22662
22662
  "locationInModule": {
22663
22663
  "filename": "src/terraform-asset.ts",
22664
- "line": 114
22664
+ "line": 131
22665
22665
  },
22666
22666
  "name": "type",
22667
22667
  "type": {
@@ -22681,7 +22681,7 @@
22681
22681
  "kind": "interface",
22682
22682
  "locationInModule": {
22683
22683
  "filename": "src/terraform-asset.ts",
22684
- "line": 26
22684
+ "line": 27
22685
22685
  },
22686
22686
  "name": "TerraformAssetConfig",
22687
22687
  "properties": [
@@ -22693,7 +22693,7 @@
22693
22693
  "immutable": true,
22694
22694
  "locationInModule": {
22695
22695
  "filename": "src/terraform-asset.ts",
22696
- "line": 28
22696
+ "line": 29
22697
22697
  },
22698
22698
  "name": "path",
22699
22699
  "type": {
@@ -22708,7 +22708,7 @@
22708
22708
  "immutable": true,
22709
22709
  "locationInModule": {
22710
22710
  "filename": "src/terraform-asset.ts",
22711
- "line": 32
22711
+ "line": 33
22712
22712
  },
22713
22713
  "name": "assetHash",
22714
22714
  "optional": true,
@@ -22727,7 +22727,7 @@
22727
22727
  "immutable": true,
22728
22728
  "locationInModule": {
22729
22729
  "filename": "src/terraform-asset.ts",
22730
- "line": 45
22730
+ "line": 46
22731
22731
  },
22732
22732
  "name": "assetHashType",
22733
22733
  "optional": true,
@@ -22746,7 +22746,7 @@
22746
22746
  "immutable": true,
22747
22747
  "locationInModule": {
22748
22748
  "filename": "src/terraform-asset.ts",
22749
- "line": 75
22749
+ "line": 92
22750
22750
  },
22751
22751
  "name": "bundler",
22752
22752
  "optional": true,
@@ -22758,14 +22758,14 @@
22758
22758
  "abstract": true,
22759
22759
  "docs": {
22760
22760
  "default": "- nothing is excluded",
22761
- "remarks": "See\n`AssetStagingOptions.exclude` for the accepted forms. Both the computed\nhash and the staged/packed content honor the exclusion.",
22761
+ "remarks": "See\n`AssetStagingOptions.exclude` for the accepted forms. Both the computed\nhash and the staged/packed content honor the exclusion. Cannot be\ncombined with `ignoreStrategy`, which replaces this matcher rather than\nlayering on top of it.",
22762
22762
  "stability": "experimental",
22763
22763
  "summary": "Paths to exclude from the asset, relative to `path`."
22764
22764
  },
22765
22765
  "immutable": true,
22766
22766
  "locationInModule": {
22767
22767
  "filename": "src/terraform-asset.ts",
22768
- "line": 54
22768
+ "line": 57
22769
22769
  },
22770
22770
  "name": "exclude",
22771
22771
  "optional": true,
@@ -22788,7 +22788,7 @@
22788
22788
  "immutable": true,
22789
22789
  "locationInModule": {
22790
22790
  "filename": "src/terraform-asset.ts",
22791
- "line": 62
22791
+ "line": 79
22792
22792
  },
22793
22793
  "name": "extraHash",
22794
22794
  "optional": true,
@@ -22796,6 +22796,25 @@
22796
22796
  "primitive": "string"
22797
22797
  }
22798
22798
  },
22799
+ {
22800
+ "abstract": true,
22801
+ "docs": {
22802
+ "default": "- `exclude` is used with the built-in matcher",
22803
+ "remarks": "`!`-negation only takes effect if the strategy also sets\n`pruneExcludedDirectories: false`; otherwise an excluded directory is\npruned before its contents are ever checked against a re-include\npattern. See `IIgnoreStrategy.pruneExcludedDirectories`.",
22804
+ "stability": "experimental",
22805
+ "summary": "Exclusion matching, for callers that need `.gitignore` / `.dockerignore` parity (including `!`-negation) rather than the built-in exact-path / suffix / directory matcher. See `AssetStagingOptions.ignoreStrategy`."
22806
+ },
22807
+ "immutable": true,
22808
+ "locationInModule": {
22809
+ "filename": "src/terraform-asset.ts",
22810
+ "line": 71
22811
+ },
22812
+ "name": "ignoreStrategy",
22813
+ "optional": true,
22814
+ "type": {
22815
+ "fqn": "cdktn.IIgnoreStrategy"
22816
+ }
22817
+ },
22799
22818
  {
22800
22819
  "abstract": true,
22801
22820
  "docs": {
@@ -22804,7 +22823,7 @@
22804
22823
  "immutable": true,
22805
22824
  "locationInModule": {
22806
22825
  "filename": "src/terraform-asset.ts",
22807
- "line": 30
22826
+ "line": 31
22808
22827
  },
22809
22828
  "name": "type",
22810
22829
  "optional": true,
@@ -32706,6 +32725,6 @@
32706
32725
  "symbolId": "src/testing/matchers:ToPlanSuccessfullyOptions"
32707
32726
  }
32708
32727
  },
32709
- "version": "0.25.0-pre.51",
32710
- "fingerprint": "Of8L5qWuq5RmAJvcXlVt94KBmD59kpz/99IBgxBxE84="
32728
+ "version": "0.25.0-pre.53",
32729
+ "fingerprint": "4pBVcGy6A0ygNKgZtR8CbVvKA+rZkQ0Y3SYbEdj2WEc="
32711
32730
  }
@@ -14,7 +14,7 @@ exports.DISABLE_STACK_TRACE_IN_METADATA = "@cdktf/disable_stack_trace_in_metadat
14
14
  */
15
15
  class Annotations {
16
16
  scope;
17
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Annotations", version: "0.25.0-pre.51" };
17
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Annotations", version: "0.25.0-pre.53" };
18
18
  /**
19
19
  * Returns the annotations API for a construct scope.
20
20
  * @param scope The scope
package/lib/app.js CHANGED
@@ -51,7 +51,7 @@ exports.CONTEXT_ENV = "CDKTF_CONTEXT_JSON";
51
51
  * Represents a cdktn application.
52
52
  */
53
53
  class App extends constructs_1.Construct {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.App", version: "0.25.0-pre.51" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.App", version: "0.25.0-pre.53" };
55
55
  /**
56
56
  * The output directory into which resources will be synthesized.
57
57
  */
package/lib/aspect.js CHANGED
@@ -8,7 +8,7 @@ const ASPECTS_SYMBOL = Symbol("cdktf-aspects");
8
8
  * synthesis.
9
9
  */
10
10
  class Aspects {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Aspects", version: "0.25.0-pre.51" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Aspects", version: "0.25.0-pre.53" };
12
12
  /**
13
13
  * Returns the `Aspects` object associated with a construct scope.
14
14
  * @param scope The scope for which these aspects will apply.
package/lib/asset-hash.js CHANGED
@@ -51,7 +51,7 @@ const errors_1 = require("./errors");
51
51
  * staged copy; this is the identity half without the staging half.
52
52
  */
53
53
  class AssetHash {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetHash", version: "0.25.0-pre.51" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetHash", version: "0.25.0-pre.53" };
55
55
  /**
56
56
  * Content hash of a file or directory, without staging it.
57
57
  *
@@ -143,9 +143,12 @@ export declare class AssetStaging extends Construct implements IAsset {
143
143
  /**
144
144
  * Absolute path to the source the bundler should read.
145
145
  *
146
- * With no exclusions the resolved source is handed over directly. Otherwise
147
- * the excluded source tree is materialised into the scratch directory, so
148
- * the bundler sees the same file set the hash was taken over.
146
+ * With no exclusions, or with a file source, the resolved source is handed
147
+ * over directly — a file has no children to filter, matching `hashSource`,
148
+ * which only ever applies the ignore strategy to a directory's entries and
149
+ * never to the root itself. Otherwise the excluded source tree is
150
+ * materialised into the scratch directory, so the bundler sees the same
151
+ * file set the hash was taken over.
149
152
  */
150
153
  private filteredSource;
151
154
  /**
@@ -145,7 +145,7 @@ function registerStrandedScratch(dir) {
145
145
  * describes.
146
146
  */
147
147
  class AssetStaging extends constructs_1.Construct {
148
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetStaging", version: "0.25.0-pre.51" };
148
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetStaging", version: "0.25.0-pre.53" };
149
149
  sourcePath;
150
150
  displayName;
151
151
  ignoreStrategy;
@@ -177,7 +177,7 @@ class AssetStaging extends constructs_1.Construct {
177
177
  this.hashCache = hashCacheFor(this.node.root);
178
178
  this.bundler = props.bundler;
179
179
  if (props.exclude?.length && props.ignoreStrategy) {
180
- throw (0, errors_1.assetHashConflictingExcludeOptions)();
180
+ throw (0, errors_1.assetStagingConflictingExcludeOptions)(this.displayName);
181
181
  }
182
182
  this.ignoreStrategy =
183
183
  props.ignoreStrategy ?? new ignore_strategy_1.ExcludeIgnoreStrategy(props.exclude ?? []);
@@ -368,13 +368,16 @@ class AssetStaging extends constructs_1.Construct {
368
368
  /**
369
369
  * Absolute path to the source the bundler should read.
370
370
  *
371
- * With no exclusions the resolved source is handed over directly. Otherwise
372
- * the excluded source tree is materialised into the scratch directory, so
373
- * the bundler sees the same file set the hash was taken over.
371
+ * With no exclusions, or with a file source, the resolved source is handed
372
+ * over directly — a file has no children to filter, matching `hashSource`,
373
+ * which only ever applies the ignore strategy to a directory's entries and
374
+ * never to the root itself. Otherwise the excluded source tree is
375
+ * materialised into the scratch directory, so the bundler sees the same
376
+ * file set the hash was taken over.
374
377
  */
375
378
  filteredSource(scratch) {
376
379
  const absoluteSource = path.resolve(this.sourcePath);
377
- if (!this.hasExclusions) {
380
+ if (!this.hasExclusions || fs.statSync(absoluteSource).isFile()) {
378
381
  return absoluteSource;
379
382
  }
380
383
  const input = path.join(scratch, "input");
@@ -458,4 +461,4 @@ class AssetStaging extends constructs_1.Construct {
458
461
  }
459
462
  }
460
463
  exports.AssetStaging = AssetStaging;
461
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc3RhZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3NldC1zdGFnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDJDQUFtRDtBQUNuRCwrQ0FBaUM7QUFDakMsdUNBQXlCO0FBQ3pCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IscUNBT2tCO0FBQ2xCLHFDQVdrQjtBQUNsQix5Q0FBb0Q7QUFDcEQsdURBQTJFO0FBQzNFLHFDQUFrRDtBQUVsRCxrRkFBa0Y7QUFDbEYsZ0VBQWdFO0FBQ2hFLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDO0FBRTVDOzs7O0dBSUc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLHFCQUFxQixDQUFDO0FBRWpFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFtQyxDQUFDO0FBRXhFOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFnQjtJQUNwQyxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDOUMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQjtJQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLG1CQUFtQixFQUFFLENBQUM7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QUN4RSxJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3V0gsb0NBOFdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7XG4gIEFzc2V0SGFzaFR5cGUsXG4gIEFzc2V0T3B0aW9ucyxcbiAgQnVuZGxlT3V0cHV0VHlwZSxcbiAgSUFzc2V0LFxuICBJQXNzZXRCdW5kbGVyLFxuICBJQXNzZXRQYWNrYWdpbmcsXG59IGZyb20gXCIuL2Fzc2V0c1wiO1xuaW1wb3J0IHtcbiAgYXNzZXRIYXNoQ29uZmxpY3RpbmdFeGNsdWRlT3B0aW9ucyxcbiAgYXNzZXRIYXNoQ29uZmxpY3RpbmdIYXNoVHlwZSxcbiAgYXNzZXRIYXNoSW52YWxpZCxcbiAgYXNzZXRIYXNoVHlwZUN1c3RvbVJlcXVpcmVzSGFzaCxcbiAgYXNzZXRIYXNoVHlwZVVua25vd24sXG4gIGFzc2V0U3RhZ2luZ0FscmVhZHlTdGFnZWQsXG4gIGFzc2V0U3RhZ2luZ0J1bmRsZXJEaXJlY3RvcnlPdXRwdXROZWVkc0RpcmVjdG9yeVBhY2thZ2luZyxcbiAgYXNzZXRTdGFnaW5nQnVuZGxlckZpbGVPdXRwdXROZWVkc0ZpbGVQYWNrYWdpbmcsXG4gIGFzc2V0U3RhZ2luZ0J1bmRsZXJPdXRwdXROb3REaXJlY3RvcnksXG4gIGFzc2V0U3RhZ2luZ0J1bmRsZXJPdXRwdXROb3RGaWxlLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IENBTk9OSUNBTF9BU1NFVF9IQVNIRVMgfSBmcm9tIFwiLi9mZWF0dXJlc1wiO1xuaW1wb3J0IHsgRXhjbHVkZUlnbm9yZVN0cmF0ZWd5LCBJSWdub3JlU3RyYXRlZ3kgfSBmcm9tIFwiLi9pZ25vcmUtc3RyYXRlZ3lcIjtcbmltcG9ydCB7IGNvcHlTeW5jLCBoYXNoUGF0aCB9IGZyb20gXCIuL3ByaXZhdGUvZnNcIjtcblxuLy8gQSByZXNvbHZlZCBoYXNoIGlzIHVzZWQgdmVyYmF0aW0gYXMgYSBwYXRoIHNlZ21lbnQgKHNlZSBgVGVycmFmb3JtQXNzZXQucGF0aGApLFxuLy8gc28gaXQgbWF5IG9ubHkgY29udGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsd2F5cyBzYWZlIHRoZXJlLlxuY29uc3QgU0FGRV9BU1NFVF9IQVNIID0gL15bQS1aYS16MC05Xy4tXSskLztcblxuLyoqXG4gKiBDb250ZXh0IGtleSBmb3IgYSB2YWx1ZSBmb2xkZWQgaW50byBldmVyeSBjb21wdXRlZCBhc3NldCBoYXNoIGluIHRoZVxuICogY29uc3RydWN0IHRyZWUsIGFsb25nc2lkZSBgZXh0cmFIYXNoYC4gQSBidWxrIGNhY2hlLWJ1c3RpbmcgZXNjYXBlIGhhdGNoIOKAlFxuICogYGV4dHJhSGFzaGAgaXMgc2NvcGVkIHRvIG9uZSBhc3NldCwgdGhpcyBpcyBzY29wZWQgdG8gdGhlIHdob2xlIGFwcC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFTU0VUX0hBU0hfU0FMVF9DT05URVhUX0tFWSA9IFwiY2RrdG46YXNzZXRIYXNoU2FsdFwiO1xuXG4vKipcbiAqIENhY2hlcyB0aGUgYmFzZSAocHJlIGBleHRyYUhhc2hgL3NhbHQpIGhhc2ggb2YgYSBgU09VUkNFYC9gT1VUUFVUYCB3YWxrLFxuICogc28gdGhhdCBtdWx0aXBsZSBgQXNzZXRTdGFnaW5nYCBpbnN0YW5jZXMgd2l0aCBpZGVudGljYWwgaW5wdXRzIOKAlCB0aGUgc2FtZVxuICogYXNzZXQgcmVmZXJlbmNlZCBmcm9tIG1vcmUgdGhhbiBvbmUgcmVzb3VyY2Ugb3Igc3RhY2sg4oCUIGhhc2ggdGhlIHNvdXJjZVxuICogdHJlZSBvbmNlIHBlciBzeW50aCBpbnN0ZWFkIG9mIG9uY2UgcGVyIHJlZmVyZW5jZS5cbiAqXG4gKiBLZXllZCBwZXIgY29uc3RydWN0LXRyZWUgcm9vdCAodGhlIGBBcHBgKSByYXRoZXIgdGhhbiBhdCBtb2R1bGUgc2NvcGU6IGFuXG4gKiBBcHAgaW5zdGFuY2UgbGl2ZXMgZXhhY3RseSBhcyBsb25nIGFzIG9uZSBzeW50aCwgc28gYSBsb25nLXJ1bm5pbmcgcHJvY2Vzc1xuICogdGhhdCBzeW50aHMgcmVwZWF0ZWRseSBhZ2FpbnN0IGNoYW5naW5nIGZpbGVzIChlLmcuIGBjZGt0biB3YXRjaGApIGFsd2F5c1xuICogZ2V0cyBhIGZyZXNoIGNhY2hlIGluc3RlYWQgb2YgYSBzdGFsZSBoYXNoIGZyb20gYSBwcmV2aW91cyBzeW50aC5cbiAqL1xuY29uc3QgaGFzaENhY2hlc0J5Um9vdCA9IG5ldyBXZWFrTWFwPElDb25zdHJ1Y3QsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKlxuICogVGhlIGhhc2ggY2FjaGUgc2NvcGVkIHRvIGEgY29uc3RydWN0LXRyZWUgcm9vdCwgY3JlYXRlZCBvbiBmaXJzdCB1c2UuXG4gKlxuICogU2VlIHtAbGluayBoYXNoQ2FjaGVzQnlSb290fSBmb3Igd2h5IHRoZSBjYWNoZSBpcyBzY29wZWQgcGVyIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGhhc2hDYWNoZUZvcihyb290OiBJQ29uc3RydWN0KTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGxldCBjYWNoZSA9IGhhc2hDYWNoZXNCeVJvb3QuZ2V0KHJvb3QpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgaGFzaENhY2hlc0J5Um9vdC5zZXQocm9vdCwgY2FjaGUpO1xuICB9XG4gIHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBFYWdlci1idWlsZCBzY3JhdGNoIGRpcmVjdG9yaWVzIGF3YWl0aW5nIGNsZWFudXAsIHN3ZXB0IG9uIHByb2Nlc3MgZXhpdCBvclxuICogYW4gaW50ZXJydXB0aW5nIHNpZ25hbC5cbiAqXG4gKiBBbiBgT1VUUFVUYC1oYXNoIGJ1aWxkIHJ1bnMgaW4gdGhlIGNvbnN0cnVjdG9yIGJ1dCBpcyBub3JtYWxseSB0b3JuIGRvd24gaW5cbiAqIGBzdGFnZSgpYC4gV2hlbiB0aGUgYXNzZXQncyBzdGFjayBpcyBub3Qgc3ludGhlc2l6ZWQgdGhpcyBwYXNzLCBgc3RhZ2UoKWBcbiAqIG5ldmVyIHJ1bnMsIHNvIHRoZSBzd2VlcCByZWNsYWltcyB3aGF0IGNhbiBiZSBsYXJnZSB0cmVlcyAoYG5vZGVfbW9kdWxlc2AsXG4gKiBidWlsZCBjYWNoZXMpIHRoYXQgYG9zLnRtcGRpcigpYCBkb2VzIG5vdCBjbGVhciByZWxpYWJseS5cbiAqL1xuY29uc3Qgc3RyYW5kZWRTY3JhdGNoRGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xubGV0IGV4aXRTd2VlcEluc3RhbGxlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgcmVtb3ZlIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgc2NyYXRjaCBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIHN3ZWVwU3RyYW5kZWRTY3JhdGNoKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHN0cmF5IG9mIHN0cmFuZGVkU2NyYXRjaERpcnMpIHtcbiAgICB0cnkge1xuICAgICAgZnMucm1TeW5jKHN0cmF5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCBvbiB0aGUgd2F5IG91dDsgbm90aGluZyB1c2VmdWwgdG8gZG8gaWYgaXQgZmFpbHMuXG4gICAgfVxuICB9XG4gIHN0cmFuZGVkU2NyYXRjaERpcnMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBUcmFjayBhIHNjcmF0Y2ggZGlyZWN0b3J5IGZvciByZW1vdmFsIGlmIGl0IHN1cnZpdmVzIHRvIHByb2Nlc3MgZXhpdC5cbiAqXG4gKiBgZXhpdGAgYWxvbmUgbWlzc2VzIGEgQ3RybC1DIG9yIGEgYGtpbGxgIGR1cmluZyBzeW50aCDigJQgZXhhY3RseSB3aGVuIHRoZVxuICogbGFyZ2VzdCB0cmVlcyAoYG5vZGVfbW9kdWxlc2AsIGJ1aWxkIGNhY2hlcykgYXJlIGxlZnQgYmVoaW5kIOKAlCBiZWNhdXNlIE5vZGVcbiAqIGRvZXMgbm90IHJ1biBgZXhpdGAgaGFuZGxlcnMgb24gYFNJR0lOVGAvYFNJR1RFUk1gLiBUaGUgc2lnbmFsIGhhbmRsZXJzXG4gKiBzd2VlcCwgdGhlbiByZS1yYWlzZSB0aGUgc2lnbmFsIHNvIGFueSBvdGhlciBsaXN0ZW5lcnMgKHRoZSBDTEkncyBvd24pIHN0aWxsXG4gKiBydW4sIG9yIHRoZSBkZWZhdWx0IGRpc3Bvc2l0aW9uIHRlcm1pbmF0ZXMgdGhlIHByb2Nlc3MgaWYgdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyU3RyYW5kZWRTY3JhdGNoKGRpcjogc3RyaW5nKTogdm9pZCB7XG4gIHN0cmFuZGVkU2NyYXRjaERpcnMuYWRkKGRpcik7XG4gIGlmICghZXhpdFN3ZWVwSW5zdGFsbGVkKSB7XG4gICAgZXhpdFN3ZWVwSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAvLyBgZXhpdGAgaGFuZGxlcnMgbXVzdCBiZSBzeW5jaHJvbm91czsgYHJtU3luY2AgaXMuXG4gICAgcHJvY2Vzcy5vbmNlKFwiZXhpdFwiLCBzd2VlcFN0cmFuZGVkU2NyYXRjaCk7XG4gICAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICBzd2VlcFN0cmFuZGVkU2NyYXRjaCgpO1xuICAgICAgICAvLyBSZS1yYWlzZSBzbyB0aGUgc2lnbmFsIGlzIG5vdCBzd2FsbG93ZWQuIGBwcm9jZXNzLm9uY2VgIGhhcyBhbHJlYWR5XG4gICAgICAgIC8vIHJlbW92ZWQgdGhpcyBsaXN0ZW5lciwgc28gdGhlIHJlLXJhaXNlIHJlYWNoZXMgd2hhdGV2ZXIgZWxzZSBpc1xuICAgICAgICAvLyByZWdpc3RlcmVkIOKAlCB0aGUgQ0xJJ3Mgb3duIFNJR0lOVC9TSUdURVJNIGhhbmRsZXJzIOKAlCBvciwgaWYgbm90aGluZ1xuICAgICAgICAvLyBpcywgdGhlIGRlZmF1bHQgZGlzcG9zaXRpb24gdGhhdCB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzLiBSZW1vdmluZ1xuICAgICAgICAvLyBvdGhlciBsaXN0ZW5lcnMgaGVyZSB3b3VsZCBkaXNjYXJkIGV4YWN0bHkgdGhvc2UgdGhlIGFwcCByZWxpZXMgb24uXG4gICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgc2lnbmFsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBBc3NldFN0YWdpbmd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0U3RhZ2luZ09wdGlvbnMgZXh0ZW5kcyBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgc291cmNlIGZpbGUgb3IgZGlyZWN0b3J5LiBSZXNvbHZpbmcgYSByZWxhdGl2ZSBwYXRoXG4gICAqIGFnYWluc3QgYGNka3RmLmpzb25gIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IHRoZSBzdGFnZWQgcmVzdWx0IGlzIHByb2R1Y2VkIGFuZCBzaGFwZWQuIFRoZSBjYWxsZXIgZGVjaWRlcyB0aGlzXG4gICAqIChlLmcuIGZyb20gaXRzIG93biBgQXNzZXRUeXBlYCkg4oCUIGBBc3NldFN0YWdpbmdgIG5ldmVyIGluZmVycyBvciBjaGFuZ2VzXG4gICAqIGl0IGJhc2VkIG9uIGBleGNsdWRlYC9gZXh0cmFIYXNoYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2luZzogSUFzc2V0UGFja2FnaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRocyB0byBleGNsdWRlLCByZWxhdGl2ZSB0byBgc291cmNlUGF0aGAuIENhbm5vdCBiZSBjb21iaW5lZCB3aXRoXG4gICAqIGBpZ25vcmVTdHJhdGVneWAsIHdoaWNoIHJlcGxhY2VzIHRoaXMgbWF0Y2hlciByYXRoZXIgdGhhbiBsYXllcmluZyBvblxuICAgKiB0b3Agb2YgaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBpcyBleGNsdWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBFeGNsdXNpb24gbWF0Y2hpbmcsIGZvciBjYWxsZXJzIHRoYXQgbmVlZCBgLmdpdGlnbm9yZWAgLyBgLmRvY2tlcmlnbm9yZWBcbiAgICogcGFyaXR5IHJhdGhlciB0aGFuIHRoZSBidWlsdC1pbiBleGFjdC1wYXRoIC8gc3VmZml4IC8gZGlyZWN0b3J5IG1hdGNoZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYGV4Y2x1ZGVgIGlzIHVzZWQgd2l0aCB0aGUgYnVpbHQtaW4gbWF0Y2hlclxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlU3RyYXRlZ3k/OiBJSWdub3JlU3RyYXRlZ3k7XG5cbiAgLyoqXG4gICAqIEV4dHJhIGluZm9ybWF0aW9uIHRvIGZvbGQgaW50byB0aGUgaGFzaCAoZS5nLiBidWlsZCBpbnN0cnVjdGlvbnMgYW5kXG4gICAqIG90aGVyIGlucHV0cykuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgaGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFIYXNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGJ1bmRsZXIgdGhhdCBidWlsZHMgdGhlIHNvdXJjZSBpbnRvIGFuIGFydGlmYWN0IGJlZm9yZSBzdGFnaW5nLlxuICAgKlxuICAgKiBVbmRlciB0aGUgZGVmYXVsdCBgU09VUkNFYCBoYXNoaW5nIHRoZSBidWlsZCBpcyBkZWZlcnJlZCB0byBgc3RhZ2UoKWAgYW5kXG4gICAqIHN0YXlzIHNraXBwYWJsZTsgYE9VVFBVVGAgaGFzaGluZyBidWlsZHMgZWFnZXJseSBhdCBjb25zdHJ1Y3Rpb24gdGltZSB0b1xuICAgKiBoYXNoIHRoZSBhcnRpZmFjdCwgZm9yZ29pbmcgc2tpcHBhYmlsaXR5LiBUaGUgYnVuZGxlcidzIGRlY2xhcmVkIG91dHB1dFxuICAgKiBzaGFwZSBtdXN0IG1hdGNoIHRoZSBwYWNrYWdpbmc6IGEgYEJ1bmRsZVJlc3VsdC5kaXJlY3RvcnlgIG5lZWRzIGFcbiAgICogZGlyZWN0b3J5LWFjY2VwdGluZyBwYWNrYWdpbmcsIGEgYEJ1bmRsZVJlc3VsdC5maWxlYCBhIHNpbmdsZS1maWxlIG9uZVxuICAgKiAoYEFzc2V0VHlwZS5GSUxFYCkuIFRoZSBtaXNtYXRjaCBpcyBjYXVnaHQgb25jZSB0aGUgYnVpbGQgcnVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc291cmNlIGlzIHN0YWdlZCB2ZXJiYXRpbSwgd2l0aCBubyBidWlsZCBzdGVwXG4gICAqL1xuICByZWFkb25seSBidW5kbGVyPzogSUFzc2V0QnVuZGxlcjtcblxuICAvKipcbiAgICogSWRlbnRpZmllciB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGV5IG5hbWUgdGhlIHVzZXItZmFjaW5nIGNvbnN0cnVjdFxuICAgKiAoZS5nLiB0aGUgYFRlcnJhZm9ybUFzc2V0YCkgcmF0aGVyIHRoYW4gdGhpcyBpbnRlcm5hbCBzdGFnaW5nIGNoaWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzdGFnaW5nIGNvbnN0cnVjdCdzIG93biBpZFxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW4gYXNzZXQncyBpZGVudGl0eSBhbmQgc3RhZ2VzIGl0cyBjb250ZW50IHRvIGRpc2suXG4gKlxuICogVGhlIGhhc2ggaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbjsgdGhlIGZpbGVzeXN0ZW0gd3JpdGVcbiAqIGlzIGRlZmVycmVkIHRvIGBzdGFnZSgpYCwgdGhlIG9uZSB3aW5kb3cgd2hlcmUgaXQgaXMgc2FmZS4gSGFzaGluZyBpc1xuICogY2FjaGVkIHBlciBzeW50aCAoc2VlIHtAbGluayBoYXNoQ2FjaGVzQnlSb290fSkgc28gYW4gYXNzZXQgcmVmZXJlbmNlZCBmcm9tXG4gKiBzZXZlcmFsIHBsYWNlcyBpcyB3YWxrZWQgb25jZS4gV2l0aG91dCBhIGJ1bmRsZXIsIGBTT1VSQ0VgIGFuZCBgT1VUUFVUYCBib3RoXG4gKiBoYXNoIHRoZSBzb3VyY2U7IHdpdGggb25lIHRoZXkgZGl2ZXJnZSwgYXMgYEFzc2V0U3RhZ2luZ09wdGlvbnMuYnVuZGxlcmBcbiAqIGRlc2NyaWJlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2V0U3RhZ2luZyBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElBc3NldCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWdub3JlU3RyYXRlZ3k6IElJZ25vcmVTdHJhdGVneTtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNFeGNsdXNpb25zOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhc2hDYWNoZTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBidW5kbGVyPzogSUFzc2V0QnVuZGxlcjtcblxuICAvKipcbiAgICogT3V0cHV0IG9mIGFuIGVhZ2VyIGBPVVRQVVRgLWhhc2ggYnVpbGQsIGNhcnJpZWQgdG8gYHN0YWdlKClgIGZvciByZXVzZS5cbiAgICpcbiAgICogVW5kZWZpbmVkIG9uIGV2ZXJ5IG90aGVyIHBhdGgsIHdoZXJlIHRoZSBidWlsZCBpcyBkZWZlcnJlZCBvciBhYnNlbnQuXG4gICAqL1xuICBwcml2YXRlIGVhZ2VyQnVpbGQ/OiB7XG4gICAgcmVhZG9ubHkgc2NyYXRjaDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHByb2R1Y2VkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgb3V0cHV0VHlwZTogQnVuZGxlT3V0cHV0VHlwZTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IG9uY2UgYHN0YWdlKClgIGhhcyBydW4sIHNvIGEgc2Vjb25kIGNhbGwgY2Fubm90IHJlYnVpbGQuIEFuIGVhZ2VyXG4gICAqIGBPVVRQVVRgIGJ1aWxkIGlzIGNhcHR1cmVkIGF0IGNvbnN0cnVjdGlvbiBhbmQgY29uc3VtZWQgYnkgdGhlIGZpcnN0XG4gICAqIGBzdGFnZSgpYDsgd2l0aG91dCB0aGlzIGd1YXJkIGEgc2Vjb25kIGNhbGwgd291bGQgZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgKiBkZWZlcnJlZCBidWlsZCBwYXRoIGFuZCBzdGFnZSBieXRlcyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgaGFzaC5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gZmFsc2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IHBhY2thZ2luZzogSUFzc2V0UGFja2FnaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNEaXJlY3Rvcnk6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBhc3NldEhhc2g6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFzc2V0U3RhZ2luZ09wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5zb3VyY2VQYXRoID0gcHJvcHMuc291cmNlUGF0aDtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gcHJvcHMuZGlzcGxheU5hbWUgPz8gaWQ7XG4gICAgdGhpcy5wYWNrYWdpbmcgPSBwcm9wcy5wYWNrYWdpbmc7XG4gICAgdGhpcy5pc0RpcmVjdG9yeSA9IHByb3BzLnBhY2thZ2luZy5wcm9kdWNlc0RpcmVjdG9yeTtcbiAgICB0aGlzLmhhc2hDYWNoZSA9IGhhc2hDYWNoZUZvcih0aGlzLm5vZGUucm9vdCk7XG4gICAgdGhpcy5idW5kbGVyID0gcHJvcHMuYnVuZGxlcjtcblxuICAgIGlmIChwcm9wcy5leGNsdWRlPy5sZW5ndGggJiYgcHJvcHMuaWdub3JlU3RyYXRlZ3kpIHtcbiAgICAgIHRocm93IGFzc2V0SGFzaENvbmZsaWN0aW5nRXhjbHVkZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pZ25vcmVTdHJhdGVneSA9XG4gICAgICBwcm9wcy5pZ25vcmVTdHJhdGVneSA/PyBuZXcgRXhjbHVkZUlnbm9yZVN0cmF0ZWd5KHByb3BzLmV4Y2x1ZGUgPz8gW10pO1xuICAgIC8vIEEgY3VzdG9tIHN0cmF0ZWd5IGlzIGFzc3VtZWQgdG8gZXhjbHVkZSBzb21ldGhpbmc7IHRoZSBidWlsdC1pbiBvbmUgb25seVxuICAgIC8vIGRvZXMgd2l0aCBhIG5vbi1lbXB0eSBgZXhjbHVkZWAuIERyaXZlcyB3aGV0aGVyIHRoZSBidW5kbGVyIGlzIGhhbmRlZCBhXG4gICAgLy8gbWF0ZXJpYWxpc2VkIGZpbHRlcmVkIGNvcHkgb3IgdGhlIHNvdXJjZSBkaXJlY3RseS5cbiAgICB0aGlzLmhhc0V4Y2x1c2lvbnMgPVxuICAgICAgcHJvcHMuaWdub3JlU3RyYXRlZ3kgIT09IHVuZGVmaW5lZCB8fCAhIXByb3BzLmV4Y2x1ZGU/Lmxlbmd0aDtcblxuICAgIC8vIEJ1bmRsZXIgb3V0cHV0IHNoYXBlIChkaXJlY3RvcnkgdnMgZmlsZSkgaXMgb25seSBrbm93biBvbmNlIGBidW5kbGVgXG4gICAgLy8gcnVucywgc28gaXRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcGFja2FnaW5nIGlzIGNoZWNrZWQgdGhlbiwgbm90IGhlcmVcbiAgICAvLyDigJQgYSBkZWZlcnJlZCBTT1VSQ0UgYnVpbGQgaGFzIG5vdCBydW4geWV0IGF0IGNvbnN0cnVjdGlvbiB0aW1lLlxuXG4gICAgdGhpcy5hc3NldEhhc2ggPSB0aGlzLnJlc29sdmVBc3NldEhhc2godGhpcy5kaXNwbGF5TmFtZSwgcHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQXNzZXRIYXNoKGlkOiBzdHJpbmcsIHByb3BzOiBBc3NldFN0YWdpbmdPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGFzc2V0SGFzaCwgYXNzZXRIYXNoVHlwZSwgZXh0cmFIYXNoIH0gPSBwcm9wcztcblxuICAgIGlmIChhc3NldEhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKFxuICAgICAgICBhc3NldEhhc2hUeXBlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgYXNzZXRIYXNoVHlwZSAhPT0gQXNzZXRIYXNoVHlwZS5DVVNUT01cbiAgICAgICkge1xuICAgICAgICB0aHJvdyBhc3NldEhhc2hDb25mbGljdGluZ0hhc2hUeXBlKGlkKTtcbiAgICAgIH1cbiAgICAgIGlmICghU0FGRV9BU1NFVF9IQVNILnRlc3QoYXNzZXRIYXNoKSkge1xuICAgICAgICB0aHJvdyBhc3NldEhhc2hJbnZhbGlkKGlkLCBhc3NldEhhc2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFzc2V0SGFzaDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFzc2V0SGFzaFR5cGUpIHtcbiAgICAgIGNhc2UgQXNzZXRIYXNoVHlwZS5DVVNUT006XG4gICAgICAgIHRocm93IGFzc2V0SGFzaFR5cGVDdXN0b21SZXF1aXJlc0hhc2goaWQpO1xuICAgICAgY2FzZSBBc3NldEhhc2hUeXBlLlNPVVJDRTpcbiAgICAgIGNhc2UgQXNzZXRIYXNoVHlwZS5PVVRQVVQ6XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSAhIXRoaXMubm9kZS50cnlHZXRDb250ZXh0KENBTk9OSUNBTF9BU1NFVF9IQVNIRVMpO1xuICAgICAgICBjb25zdCBhcmNoaXZlID0gdGhpcy5wYWNrYWdpbmcub21pdHNEaXJlY3RvcnlFbnRyaWVzO1xuICAgICAgICBjb25zdCBzYWx0ID0gdGhpcy5ub2RlLnRyeUdldENvbnRleHQoQVNTRVRfSEFTSF9TQUxUX0NPTlRFWFRfS0VZKTtcblxuICAgICAgICAvLyBPVVRQVVQgaGFzaGVzIHRoZSBidWlsdCBhcnRpZmFjdCBhbmQgc28gbXVzdCBidWlsZCBlYWdlcmx5LCBmb3Jnb2luZ1xuICAgICAgICAvLyBza2lwcGFiaWxpdHkgKCMzODApOyBldmVyeSBvdGhlciBjYXNlIGhhc2hlcyB0aGUgc291cmNlIHZlcmJhdGltLlxuICAgICAgICBjb25zdCBiYXNlSGFzaCA9XG4gICAgICAgICAgdGhpcy5idW5kbGVyICYmIGFzc2V0SGFzaFR5cGUgPT09IEFzc2V0SGFzaFR5cGUuT1VUUFVUXG4gICAgICAgICAgICA/IHRoaXMuaGFzaE91dHB1dChjYW5vbmljYWwsIGFyY2hpdmUpXG4gICAgICAgICAgICA6IHRoaXMuaGFzaFNvdXJjZShjYW5vbmljYWwsIGFyY2hpdmUpO1xuXG4gICAgICAgIC8vIEZvciBTT1VSQ0UsIGZvbGRpbmcgaW4gYnVuZGxlcktleSBpcyB0aGUgb25seSB3YXkgYnVpbGQgaWRlbnRpdHlcbiAgICAgICAgLy8gcmVhY2hlcyB0aGUgaGFzaCwgc2luY2UgdGhlIHNvdXJjZSB0cmVlIGNhbm5vdCBzZWUgdGhlIGJ1aWxkLlxuICAgICAgICBjb25zdCBidW5kbGVyS2V5ID0gdGhpcy5idW5kbGVyPy5idW5kbGVyS2V5O1xuICAgICAgICBpZiAoIWV4dHJhSGFzaCAmJiAhc2FsdCAmJiAhYnVuZGxlcktleSkge1xuICAgICAgICAgIHJldHVybiBiYXNlSGFzaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb2xkZWQgPSBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoYmFzZUhhc2gpO1xuICAgICAgICBpZiAoZXh0cmFIYXNoKSB7XG4gICAgICAgICAgZm9sZGVkLnVwZGF0ZShleHRyYUhhc2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidW5kbGVyS2V5KSB7XG4gICAgICAgICAgZm9sZGVkLnVwZGF0ZShidW5kbGVyS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2FsdCkge1xuICAgICAgICAgIGZvbGRlZC51cGRhdGUoU3RyaW5nKHNhbHQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVkLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAzMikudG9VcHBlckNhc2UoKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIE91dC1vZi1yYW5nZSB2YWx1ZSBmcm9tIGEgbm9uLVR5cGVTY3JpcHQgY2FsbGVyLlxuICAgICAgICB0aHJvdyBhc3NldEhhc2hUeXBlVW5rbm93bihpZCwgYXNzZXRIYXNoVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhc2ggdGhlIHNvdXJjZSB0cmVlLCBob25vcmluZyB0aGUgaWdub3JlIHN0cmF0ZWd5LlxuICAgKlxuICAgKiBDYWNoZWQgcGVyIHN5bnRoIHNvIGFuIGFzc2V0IHJlZmVyZW5jZWQgbW9yZSB0aGFuIG9uY2UgaXMgd2Fsa2VkIG9uY2UuXG4gICAqL1xuICBwcml2YXRlIGhhc2hTb3VyY2UoY2Fub25pY2FsOiBib29sZWFuLCBhcmNoaXZlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAvLyBPbmx5IGNhY2hlYWJsZSB3aGVuIHRoZSBpZ25vcmUgc3RyYXRlZ3kgY2FuIHN1bW1hcml6ZSBpdHMgYmVoYXZpb3JcbiAgICAvLyBhcyBhIHN0cmluZyAoc2VlIGBJSWdub3JlU3RyYXRlZ3kuY2FjaGVLZXlgKTsgb3RoZXJ3aXNlIGV2ZXJ5IGNhbGxcbiAgICAvLyBpcyB0cmVhdGVkIGFzIHVuaXF1ZS5cbiAgICBjb25zdCBjYWNoZUtleSA9XG4gICAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5LmNhY2hlS2V5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICAgICAgICBjYW5vbmljYWwsXG4gICAgICAgICAgICBhcmNoaXZlLFxuICAgICAgICAgICAgaWdub3JlOiB0aGlzLmlnbm9yZVN0cmF0ZWd5LmNhY2hlS2V5LFxuICAgICAgICAgIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGVLZXkgPyB0aGlzLmhhc2hDYWNoZS5nZXQoY2FjaGVLZXkpIDogdW5kZWZpbmVkO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNoID0gaGFzaFBhdGgodGhpcy5zb3VyY2VQYXRoLCB7XG4gICAgICBjYW5vbmljYWwsXG4gICAgICBhcmNoaXZlLFxuICAgICAgc2hvdWxkRXhjbHVkZTogKHJlbGF0aXZlUGF0aCwgaXNEaXJlY3RvcnkpID0+XG4gICAgICAgIHRoaXMuaWdub3JlU3RyYXRlZ3kuaWdub3Jlcyh7IHJlbGF0aXZlUGF0aCwgaXNEaXJlY3RvcnkgfSksXG4gICAgICBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXM6XG4gICAgICAgIHRoaXMuaWdub3JlU3RyYXRlZ3kucHJ1bmVFeGNsdWRlZERpcmVjdG9yaWVzID09PSBmYWxzZSxcbiAgICB9KTtcbiAgICBpZiAoY2FjaGVLZXkpIHtcbiAgICAgIHRoaXMuaGFzaENhY2hlLnNldChjYWNoZUtleSwgaGFzaCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBidW5kbGVyJ3Mgb3V0cHV0IGVhZ2VybHkgYW5kIGhhc2ggdGhlIGJ1aWx0IGFydGlmYWN0LlxuICAgKlxuICAgKiBUaGUgb3V0cHV0IGlzIHN0YXNoZWQgZm9yIGBzdGFnZSgpYCB0byByZXVzZSwgc28gdGhlIGJ1aWxkIGlzIG5vdFxuICAgKiByZXBlYXRlZC4gSXQgaXMgaGFzaGVkIHZlcmJhdGltOiBgZXhjbHVkZWAgZmlsdGVycyB0aGUgc291cmNlIGEgYnVuZGxlclxuICAgKiByZWFkcywgbm90IHRoZSBhcnRpZmFjdCBpdCBwcm9kdWNlcy5cbiAgICovXG4gIHByaXZhdGUgaGFzaE91dHB1dChjYW5vbmljYWw6IGJvb2xlYW4sIGFyY2hpdmU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwiY2RrdG4tYnVuZGxlLVwiKSk7XG4gICAgLy8gUmVnaXN0ZXJlZCBzbyB0aGUgZXhpdCBzd2VlcCByZWNsYWltcyBpdCBpZiBzdGFnZSgpIG5ldmVyIHJ1bnMgZm9yIGFuXG4gICAgLy8gdW5zeW50aGVzaXplZCBzdGFjazsgc3RhZ2UoKSByZW1vdmVzIGFuZCB1bnJlZ2lzdGVycyBpdCBvdGhlcndpc2UuXG4gICAgcmVnaXN0ZXJTdHJhbmRlZFNjcmF0Y2goc2NyYXRjaCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcHJvZHVjZWQsIG91dHB1dFR5cGUgfSA9IHRoaXMucnVuQnVuZGxlKHNjcmF0Y2gpO1xuICAgICAgdGhpcy5lYWdlckJ1aWxkID0geyBzY3JhdGNoLCBwcm9kdWNlZCwgb3V0cHV0VHlwZSB9O1xuICAgICAgLy8gQSBzaW5nbGUtZmlsZSBhcnRpZmFjdCBpcyBoYXNoZWQgYXMgYSBmaWxlIChubyBhcmNoaXZlIGZyYW1pbmcpOyBhXG4gICAgICAvLyBkaXJlY3RvcnkgaXMgaGFzaGVkIGFzIHRoZSBwYWNrYWdlZCB0cmVlIHdvdWxkIGJlLlxuICAgICAgY29uc3QgaXNGaWxlID0gb3V0cHV0VHlwZSA9PT0gQnVuZGxlT3V0cHV0VHlwZS5GSUxFO1xuICAgICAgcmV0dXJuIGhhc2hQYXRoKHByb2R1Y2VkLCB7IGNhbm9uaWNhbCwgYXJjaGl2ZTogYXJjaGl2ZSAmJiAhaXNGaWxlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFRoZSBidWlsZCBmYWlsZWQgYmVmb3JlIGBlYWdlckJ1aWxkYCB3YXMgc2V0LCBzbyBzdGFnZSgpIGNhbiBuZXZlclxuICAgICAgLy8gcmVhY2ggdGhpcyBzY3JhdGNoIHRvIGNsZWFuIGl0LiBSZWNsYWltIGl0IG5vdyByYXRoZXIgdGhhbiBsZWF2aW5nIGFcbiAgICAgIC8vIHBvdGVudGlhbGx5IGxhcmdlIHRyZWUgKG5vZGVfbW9kdWxlcywgYnVpbGQgY2FjaGVzKSB0byB0aGUgZXhpdCBzd2VlcC5cbiAgICAgIHRoaXMuY2xlYW51cFNjcmF0Y2goc2NyYXRjaCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGJ1bmRsZXIgYWdhaW5zdCB0aGUgZmlsdGVyZWQgc291cmNlIGFuZCByZXR1cm4gaXRzIG91dHB1dC5cbiAgICpcbiAgICogVGhlIGJ1bmRsZXIgaXMgaGFuZGVkIGFuIGFic29sdXRlIGBzb3VyY2VgIChpdHMgY3dkIGlzIGl0cyBvd24sIHNvIGFcbiAgICogcmVsYXRpdmUgcGF0aCB3b3VsZCByZXNvbHZlIGVsc2V3aGVyZSkgdGhhdCBoYXMgYWxyZWFkeSBoYWQgYGV4Y2x1ZGVgXG4gICAqIGFwcGxpZWQuIE1hdGVyaWFsaXNpbmcgdGhlIGZpbHRlcmVkIGlucHV0IGhlcmUgaXMgd2hhdCBtYWtlcyB0aGUgYnVuZGxlclxuICAgKiByZWFkIGV4YWN0bHkgdGhlIHRyZWUgdGhlIGhhc2ggd2FzIHRha2VuIG92ZXIsIHdoaWNoIGEgcmF3IHNvdXJjZVxuICAgKiBoYW5kLW9mZiB3b3VsZCBub3QsIHNpbmNlIGBoYXNoU291cmNlYCBob25vdXJzIGBleGNsdWRlYC5cbiAgICovXG4gIHByaXZhdGUgcnVuQnVuZGxlKHNjcmF0Y2g6IHN0cmluZyk6IHtcbiAgICBwcm9kdWNlZDogc3RyaW5nO1xuICAgIG91dHB1dFR5cGU6IEJ1bmRsZU91dHB1dFR5cGU7XG4gIH0ge1xuICAgIGNvbnN0IG91dHB1dERpciA9IHBhdGguam9pbihzY3JhdGNoLCBcIm91dHB1dFwiKTtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1bmRsZXIhLmJ1bmRsZSh7XG4gICAgICBzb3VyY2U6IHRoaXMuZmlsdGVyZWRTb3VyY2Uoc2NyYXRjaCksXG4gICAgICBvdXRwdXREaXIsXG4gICAgfSk7XG5cbiAgICAvLyBBIGJhcmUgYnVuZGxlciB0aGF0IGRlY2xpbmVzIGhhcyBub3RoaW5nIHRvIGZhbGwgYmFjayB0byDigJQgZGVjbGluaW5nIGlzXG4gICAgLy8gb25seSBtZWFuaW5nZnVsIGluc2lkZSBhIENoYWluQnVuZGxlciwgd2hpY2ggY29uc3VtZXMgaXQgYmVmb3JlIGl0XG4gICAgLy8gcmVhY2hlcyBoZXJlLiBBIG5vbi1kZWNsaW5lZCByZXN1bHQgYWx3YXlzIGNhcnJpZXMgYSBwYXRoIGFuZCBzaGFwZS5cbiAgICBpZiAoXG4gICAgICByZXN1bHQuaXNEZWNsaW5lZCB8fFxuICAgICAgcmVzdWx0LnBhdGggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgcmVzdWx0Lm91dHB1dFR5cGUgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgYXNzZXRTdGFnaW5nQnVuZGxlck91dHB1dE5vdERpcmVjdG9yeShcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSxcbiAgICAgICAgU3RyaW5nKHJlc3VsdC5wYXRoKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZHVjZWQgPSByZXN1bHQucGF0aDtcbiAgICB0aGlzLnZhbGlkYXRlT3V0cHV0U2hhcGUocHJvZHVjZWQsIHJlc3VsdC5vdXRwdXRUeXBlKTtcbiAgICByZXR1cm4geyBwcm9kdWNlZCwgb3V0cHV0VHlwZTogcmVzdWx0Lm91dHB1dFR5cGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgYSBidW5kbGVyIHJlc3VsdCB3aG9zZSBkZWNsYXJlZCBzaGFwZSBkb2VzIG5vdCBtYXRjaCB3aGF0IGlzIG9uXG4gICAqIGRpc2ssIG9yIGRvZXMgbm90IG1hdGNoIHRoZSBwYWNrYWdpbmcuXG4gICAqXG4gICAqIENhdGNoaW5nIHRoZSBtaXNtYXRjaCBoZXJlIHR1cm5zIGFuIG9wYXF1ZSBFSVNESVIvRVBFUk0gYXQgcGFjayB0aW1lIGludG9cbiAgICogYSBjbGVhciBlcnJvciBuYW1pbmcgdGhlIHBhY2thZ2luZyB0aGUgYnVuZGxlcidzIG91dHB1dCBzaGFwZSBuZWVkcy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVPdXRwdXRTaGFwZShcbiAgICBwcm9kdWNlZDogc3RyaW5nLFxuICAgIG91dHB1dFR5cGU6IEJ1bmRsZU91dHB1dFR5cGUsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocHJvZHVjZWQpO1xuICAgIGNvbnN0IHN0YXQgPSBleGlzdHMgPyBmcy5zdGF0U3luYyhwcm9kdWNlZCkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3V0cHV0VHlwZSA9PT0gQnVuZGxlT3V0cHV0VHlwZS5GSUxFKSB7XG4gICAgICBpZiAoIXN0YXQ/LmlzRmlsZSgpKSB7XG4gICAgICAgIHRocm93IGFzc2V0U3RhZ2luZ0J1bmRsZXJPdXRwdXROb3RGaWxlKHRoaXMuZGlzcGxheU5hbWUsIHByb2R1Y2VkKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5zdGFnZXNTaW5nbGVGaWxlKSB7XG4gICAgICAgIHRocm93IGFzc2V0U3RhZ2luZ0J1bmRsZXJGaWxlT3V0cHV0TmVlZHNGaWxlUGFja2FnaW5nKHRoaXMuZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghc3RhdD8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgYXNzZXRTdGFnaW5nQnVuZGxlck91dHB1dE5vdERpcmVjdG9yeSh0aGlzLmRpc3BsYXlOYW1lLCBwcm9kdWNlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5wYWNrYWdpbmcuYWNjZXB0c0RpcmVjdG9yeVNvdXJjZSkge1xuICAgICAgdGhyb3cgYXNzZXRTdGFnaW5nQnVuZGxlckRpcmVjdG9yeU91dHB1dE5lZWRzRGlyZWN0b3J5UGFja2FnaW5nKFxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGFja2FnaW5nIHN0YWdlcyBhIHNpbmdsZSBmaWxlIHZlcmJhdGltIChBc3NldFR5cGUuRklMRSkuXG4gICAqXG4gICAqIEEgdmVyYmF0aW0tZmlsZSBwYWNrYWdpbmcgbmVpdGhlciBwcm9kdWNlcyBhIGRpcmVjdG9yeSBub3IgcmVhZHMgb25lIGFzXG4gICAqIGl0cyBzb3VyY2UuIERlcml2ZWQgZnJvbSBleGlzdGluZyBgSUFzc2V0UGFja2FnaW5nYCBmbGFncyBzbyBvdXQtb2YtdHJlZVxuICAgKiBwYWNrYWdpbmdzIG5lZWQgbm8gbmV3IGludGVyZmFjZSBtZW1iZXIuXG4gICAqL1xuICBwcml2YXRlIGdldCBzdGFnZXNTaW5nbGVGaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5wYWNrYWdpbmcucHJvZHVjZXNEaXJlY3RvcnkgJiZcbiAgICAgICF0aGlzLnBhY2thZ2luZy5hY2NlcHRzRGlyZWN0b3J5U291cmNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2UgdGhlIGJ1bmRsZXIgc2hvdWxkIHJlYWQuXG4gICAqXG4gICAqIFdpdGggbm8gZXhjbHVzaW9ucyB0aGUgcmVzb2x2ZWQgc291cmNlIGlzIGhhbmRlZCBvdmVyIGRpcmVjdGx5LiBPdGhlcndpc2VcbiAgICogdGhlIGV4Y2x1ZGVkIHNvdXJjZSB0cmVlIGlzIG1hdGVyaWFsaXNlZCBpbnRvIHRoZSBzY3JhdGNoIGRpcmVjdG9yeSwgc29cbiAgICogdGhlIGJ1bmRsZXIgc2VlcyB0aGUgc2FtZSBmaWxlIHNldCB0aGUgaGFzaCB3YXMgdGFrZW4gb3Zlci5cbiAgICovXG4gIHByaXZhdGUgZmlsdGVyZWRTb3VyY2Uoc2NyYXRjaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBhYnNvbHV0ZVNvdXJjZSA9IHBhdGgucmVzb2x2ZSh0aGlzLnNvdXJjZVBhdGgpO1xuICAgIGlmICghdGhpcy5oYXNFeGNsdXNpb25zKSB7XG4gICAgICByZXR1cm4gYWJzb2x1dGVTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNjcmF0Y2gsIFwiaW5wdXRcIik7XG4gICAgZnMubWtkaXJTeW5jKGlucHV0KTtcbiAgICBjb3B5U3luYyhhYnNvbHV0ZVNvdXJjZSwgaW5wdXQsIHtcbiAgICAgIHNob3VsZEV4Y2x1ZGU6IChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5Lmlnbm9yZXMoeyByZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5IH0pLFxuICAgICAgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzOlxuICAgICAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5LnBydW5lRXhjbHVkZWREaXJlY3RvcmllcyA9PT0gZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWdlIHRoZSBhc3NldCdzIGNvbnRlbnQgdG8gYHRhcmdldFBhdGhgLlxuICAgKlxuICAgKiBDYWxsZWQgZnJvbSB0aGUgb3duaW5nIGNvbnN0cnVjdCdzIGBvblN5bnRoZXNpemVgIGhvb2suIFdpdGhvdXQgYSBidW5kbGVyXG4gICAqIHRoZSBzb3VyY2UgaXMgcGFja2FnZWQgdmVyYmF0aW07IHdpdGggb25lLCB0aGUgYnVuZGxlcidzIG91dHB1dCBpcywgYnVpbHRcbiAgICogZWFnZXJseSBmb3IgYE9VVFBVVGAgaGFzaGluZyBvciBkZWZlcnJlZCB0byBoZXJlIGZvciBgU09VUkNFYC5cbiAgICovXG4gIHB1YmxpYyBzdGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBTdGFnZSBleGFjdGx5IG9uY2U6IGEgcmVidWlsZCBjb3VsZCBzdGFnZSBieXRlcyBub3QgbWF0Y2hpbmcgdGhlXG4gICAgLy8gYWxyZWFkeS1jb21wdXRlZCBoYXNoIChzZWUgdGhlIGBzdGFnZWRgIGZpZWxkKS5cbiAgICBpZiAodGhpcy5zdGFnZWQpIHtcbiAgICAgIHRocm93IGFzc2V0U3RhZ2luZ0FscmVhZHlTdGFnZWQodGhpcy5kaXNwbGF5TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2VkID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5idW5kbGVyKSB7XG4gICAgICB0aGlzLnBhY2thZ2luZy5wYWNrKHtcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0UGF0aCxcbiAgICAgICAgaWdub3JlU3RyYXRlZ3k6IHRoaXMuaWdub3JlU3RyYXRlZ3ksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBgT1VUUFVUYCBoYXNoaW5nIGFscmVhZHkgYnVpbHQgdGhlIGFydGlmYWN0IGluIHRoZSBjb25zdHJ1Y3RvcjsgcGFja2FnZVxuICAgIC8vIHRoYXQgZXhhY3QgcmVzdWx0IGFuZCBjbGVhbiB1cCBpdHMgc2NyYXRjaCwgcmF0aGVyIHRoYW4gYnVpbGRpbmcgdHdpY2UuXG4gICAgaWYgKHRoaXMuZWFnZXJCdWlsZCkge1xuICAgICAgY29uc3QgeyBzY3JhdGNoLCBwcm9kdWNlZCB9ID0gdGhpcy5lYWdlckJ1aWxkO1xuICAgICAgdGhpcy5lYWdlckJ1aWxkID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wYWNrQnVuZGxlck91dHB1dChwcm9kdWNlZCwgdGFyZ2V0UGF0aCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmNsZWFudXBTY3JhdGNoKHNjcmF0Y2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGBTT1VSQ0VgIGhhc2hpbmcgZGVmZXJzIHRoZSBidWlsZCB0byBoZXJlLlxuICAgIGNvbnN0IHNjcmF0Y2ggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwiY2RrdG4tYnVuZGxlLVwiKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcHJvZHVjZWQgfSA9IHRoaXMucnVuQnVuZGxlKHNjcmF0Y2gpO1xuICAgICAgdGhpcy5wYWNrQnVuZGxlck91dHB1dChwcm9kdWNlZCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY2xlYW51cFNjcmF0Y2goc2NyYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGJ1bmRsZXIgc2NyYXRjaCBkaXJlY3RvcnkgYW5kIGRyb3AgaXQgZnJvbSB0aGUgZXhpdC1zd2VlcCBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBTY3JhdGNoKHNjcmF0Y2g6IHN0cmluZyk6IHZvaWQge1xuICAgIGZzLnJtU3luYyhzY3JhdGNoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgc3RyYW5kZWRTY3JhdGNoRGlycy5kZWxldGUoc2NyYXRjaCk7XG4gIH1cblxuICAvKipcbiAgICogUGFja2FnZSBhIGJ1bmRsZXIncyBvdXRwdXQgaW50byBgdGFyZ2V0UGF0aGAsIHZlcmJhdGltLlxuICAgKlxuICAgKiBUaGUgb3V0cHV0J3Mgc2hhcGUgd2FzIGFscmVhZHkgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHBhY2thZ2luZyBpblxuICAgKiB7QGxpbmsgcnVuQnVuZGxlfSwgc28gdGhlIHBhY2thZ2luZyBoYW5kbGVzIHRoZSBzb3VyY2UgZGlyZWN0bHkg4oCUIGEgZmlsZVxuICAgKiBzb3VyY2UgZm9yIEFzc2V0VHlwZS5GSUxFLCBhIGRpcmVjdG9yeSBzb3VyY2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBUaGUgaWdub3JlIHN0cmF0ZWd5IGlzIGRlbGliZXJhdGVseSBub3QgYXBwbGllZC4gYGV4Y2x1ZGVgIGZpbHRlcnMgdGhlXG4gICAqIHNvdXJjZSBhIGJ1bmRsZXIgcmVhZHMsIG5vdCBpdHMgcHJvZHVjdDogYW4gaW5zdGFsbC1zdHlsZSBidW5kbGVyXG4gICAqIChgbnBtIGluc3RhbGwgLS1wcm9kdWN0aW9uYCwgYHBpcCBpbnN0YWxsIC10YCkgd3JpdGVzIGV4YWN0bHkgdGhlXG4gICAqIGRlcGVuZGVuY3kgZGlyZWN0b3J5IGEgdXNlciBleGNsdWRlcyBmcm9tIHNvdXJjZSwgYW5kIHJlLWFwcGx5aW5nIHRoZVxuICAgKiBleGNsdXNpb24gd291bGQgc2hpcCBhbiBhcnRpZmFjdCBtaXNzaW5nIHRob3NlIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByaXZhdGUgcGFja0J1bmRsZXJPdXRwdXQocHJvZHVjZWQ6IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYWNrYWdpbmcucGFjayh7XG4gICAgICBzb3VyY2U6IHByb2R1Y2VkLFxuICAgICAgdGFyZ2V0OiB0YXJnZXRQYXRoLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
464
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc3RhZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3NldC1zdGFnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDJDQUFtRDtBQUNuRCwrQ0FBaUM7QUFDakMsdUNBQXlCO0FBQ3pCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IscUNBT2tCO0FBQ2xCLHFDQVdrQjtBQUNsQix5Q0FBb0Q7QUFDcEQsdURBQTJFO0FBQzNFLHFDQUFrRDtBQUVsRCxrRkFBa0Y7QUFDbEYsZ0VBQWdFO0FBQ2hFLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDO0FBRTVDOzs7O0dBSUc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLHFCQUFxQixDQUFDO0FBRWpFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFtQyxDQUFDO0FBRXhFOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFnQjtJQUNwQyxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDOUMsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxTQUFTLG9CQUFvQjtJQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxnRUFBZ0U7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLEdBQVc7SUFDMUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hCLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMxQixvREFBb0Q7UUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUMzQyxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBVSxFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUN4QixvQkFBb0IsRUFBRSxDQUFDO2dCQUN2QixzRUFBc0U7Z0JBQ3RFLGtFQUFrRTtnQkFDbEUsc0VBQXNFO2dCQUN0RSxvRUFBb0U7Z0JBQ3BFLHNFQUFzRTtnQkFDdEUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBbUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsWUFBYSxTQUFRLHNCQUFTOztJQUN4QixVQUFVLENBQVM7SUFDbkIsV0FBVyxDQUFTO0lBQ3BCLGNBQWMsQ0FBa0I7SUFDaEMsYUFBYSxDQUFVO0lBQ3ZCLFNBQVMsQ0FBc0I7SUFDL0IsT0FBTyxDQUFpQjtJQUV6Qzs7OztPQUlHO0lBQ0ssVUFBVSxDQUloQjtJQUVGOzs7OztPQUtHO0lBQ0ssTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVQLFNBQVMsQ0FBa0I7SUFDM0IsV0FBVyxDQUFVO0lBQ3JCLFNBQVMsQ0FBUztJQUVsQyxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFBLDhDQUFxQyxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWM7WUFDakIsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJLHVDQUFxQixDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLGFBQWE7WUFDaEIsS0FBSyxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBRWhFLHVFQUF1RTtRQUN2RSwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBRWxFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQVUsRUFBRSxLQUEwQjtRQUM3RCxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFdEQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUIsSUFDRSxhQUFhLEtBQUssU0FBUztnQkFDM0IsYUFBYSxLQUFLLHNCQUFhLENBQUMsTUFBTSxFQUN0QyxDQUFDO2dCQUNELE1BQU0sSUFBQSxxQ0FBNEIsRUFBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFBLHlCQUFnQixFQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELFFBQVEsYUFBYSxFQUFFLENBQUM7WUFDdEIsS0FBSyxzQkFBYSxDQUFDLE1BQU07Z0JBQ3ZCLE1BQU0sSUFBQSx3Q0FBK0IsRUFBQyxFQUFFLENBQUMsQ0FBQztZQUM1QyxLQUFLLHNCQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssc0JBQWEsQ0FBQyxNQUFNLENBQUM7WUFDMUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQ0FBc0IsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDO2dCQUNyRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQ0FBMkIsQ0FBQyxDQUFDO2dCQUVsRSx1RUFBdUU7Z0JBQ3ZFLG9FQUFvRTtnQkFDcEUsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLE9BQU8sSUFBSSxhQUFhLEtBQUssc0JBQWEsQ0FBQyxNQUFNO29CQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDO29CQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBRTFDLG1FQUFtRTtnQkFDbkUsZ0VBQWdFO2dCQUNoRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN2QyxPQUFPLFFBQVEsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekQsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO2dCQUNELElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztnQkFDRCxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekQsQ0FBQztZQUNEO2dCQUNFLG1EQUFtRDtnQkFDbkQsTUFBTSxJQUFBLDZCQUFvQixFQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxVQUFVLENBQUMsU0FBa0IsRUFBRSxPQUFnQjtRQUNyRCxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLHdCQUF3QjtRQUN4QixNQUFNLFFBQVEsR0FDWixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQ3hDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsU0FBUztnQkFDVCxPQUFPO2dCQUNQLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7YUFDckMsQ0FBQztZQUNKLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFaEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ25FLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFBLGFBQVEsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLFNBQVM7WUFDVCxPQUFPO1lBQ1AsYUFBYSxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQzVELDhCQUE4QixFQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixLQUFLLEtBQUs7U0FDekQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssVUFBVSxDQUFDLFNBQWtCLEVBQUUsT0FBZ0I7UUFDckQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ3BELHFFQUFxRTtZQUNyRSxxREFBcUQ7WUFDckQsTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLHlCQUFnQixDQUFDLElBQUksQ0FBQztZQUNwRCxPQUFPLElBQUEsYUFBUSxFQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUseUVBQXlFO1lBQ3pFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssU0FBUyxDQUFDLE9BQWU7UUFJL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7WUFDcEMsU0FBUztTQUNWLENBQUMsQ0FBQztRQUVILDBFQUEwRTtRQUMxRSxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLElBQ0UsTUFBTSxDQUFDLFVBQVU7WUFDakIsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1lBQ3pCLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUMvQixDQUFDO1lBQ0QsTUFBTSxJQUFBLDhDQUFxQyxFQUN6QyxJQUFJLENBQUMsV0FBVyxFQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNwQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxtQkFBbUIsQ0FDekIsUUFBZ0IsRUFDaEIsVUFBNEI7UUFFNUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUV4RCxJQUFJLFVBQVUsS0FBSyx5QkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBQSx5Q0FBZ0MsRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBQSx3REFBK0MsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBQSw4Q0FBcUMsRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBQSxrRUFBeUQsRUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FDakIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBWSxnQkFBZ0I7UUFDMUIsT0FBTyxDQUNMLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7WUFDakMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGNBQWMsQ0FBQyxPQUFlO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNoRSxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixJQUFBLGFBQVEsRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFFO1lBQzlCLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUM1RCw4QkFBOEIsRUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsS0FBSyxLQUFLO1NBQ3pELENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxVQUFrQjtRQUM3QixtRUFBbUU7UUFDbkUsa0RBQWtEO1FBQ2xELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBQSxrQ0FBeUIsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYzthQUNwQyxDQUFDLENBQUM7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxjQUFjLENBQUMsT0FBZTtRQUNwQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckQsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSyxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE1BQU0sRUFBRSxVQUFVO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBaFhILG9DQWlYQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBBc3NldEhhc2hUeXBlLFxuICBBc3NldE9wdGlvbnMsXG4gIEJ1bmRsZU91dHB1dFR5cGUsXG4gIElBc3NldCxcbiAgSUFzc2V0QnVuZGxlcixcbiAgSUFzc2V0UGFja2FnaW5nLFxufSBmcm9tIFwiLi9hc3NldHNcIjtcbmltcG9ydCB7XG4gIGFzc2V0SGFzaENvbmZsaWN0aW5nSGFzaFR5cGUsXG4gIGFzc2V0SGFzaEludmFsaWQsXG4gIGFzc2V0SGFzaFR5cGVDdXN0b21SZXF1aXJlc0hhc2gsXG4gIGFzc2V0SGFzaFR5cGVVbmtub3duLFxuICBhc3NldFN0YWdpbmdBbHJlYWR5U3RhZ2VkLFxuICBhc3NldFN0YWdpbmdCdW5kbGVyRGlyZWN0b3J5T3V0cHV0TmVlZHNEaXJlY3RvcnlQYWNrYWdpbmcsXG4gIGFzc2V0U3RhZ2luZ0J1bmRsZXJGaWxlT3V0cHV0TmVlZHNGaWxlUGFja2FnaW5nLFxuICBhc3NldFN0YWdpbmdCdW5kbGVyT3V0cHV0Tm90RGlyZWN0b3J5LFxuICBhc3NldFN0YWdpbmdCdW5kbGVyT3V0cHV0Tm90RmlsZSxcbiAgYXNzZXRTdGFnaW5nQ29uZmxpY3RpbmdFeGNsdWRlT3B0aW9ucyxcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBDQU5PTklDQUxfQVNTRVRfSEFTSEVTIH0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcbmltcG9ydCB7IEV4Y2x1ZGVJZ25vcmVTdHJhdGVneSwgSUlnbm9yZVN0cmF0ZWd5IH0gZnJvbSBcIi4vaWdub3JlLXN0cmF0ZWd5XCI7XG5pbXBvcnQgeyBjb3B5U3luYywgaGFzaFBhdGggfSBmcm9tIFwiLi9wcml2YXRlL2ZzXCI7XG5cbi8vIEEgcmVzb2x2ZWQgaGFzaCBpcyB1c2VkIHZlcmJhdGltIGFzIGEgcGF0aCBzZWdtZW50IChzZWUgYFRlcnJhZm9ybUFzc2V0LnBhdGhgKSxcbi8vIHNvIGl0IG1heSBvbmx5IGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGFyZSBhbHdheXMgc2FmZSB0aGVyZS5cbmNvbnN0IFNBRkVfQVNTRVRfSEFTSCA9IC9eW0EtWmEtejAtOV8uLV0rJC87XG5cbi8qKlxuICogQ29udGV4dCBrZXkgZm9yIGEgdmFsdWUgZm9sZGVkIGludG8gZXZlcnkgY29tcHV0ZWQgYXNzZXQgaGFzaCBpbiB0aGVcbiAqIGNvbnN0cnVjdCB0cmVlLCBhbG9uZ3NpZGUgYGV4dHJhSGFzaGAuIEEgYnVsayBjYWNoZS1idXN0aW5nIGVzY2FwZSBoYXRjaCDigJRcbiAqIGBleHRyYUhhc2hgIGlzIHNjb3BlZCB0byBvbmUgYXNzZXQsIHRoaXMgaXMgc2NvcGVkIHRvIHRoZSB3aG9sZSBhcHAuXG4gKi9cbmV4cG9ydCBjb25zdCBBU1NFVF9IQVNIX1NBTFRfQ09OVEVYVF9LRVkgPSBcImNka3RuOmFzc2V0SGFzaFNhbHRcIjtcblxuLyoqXG4gKiBDYWNoZXMgdGhlIGJhc2UgKHByZSBgZXh0cmFIYXNoYC9zYWx0KSBoYXNoIG9mIGEgYFNPVVJDRWAvYE9VVFBVVGAgd2FsayxcbiAqIHNvIHRoYXQgbXVsdGlwbGUgYEFzc2V0U3RhZ2luZ2AgaW5zdGFuY2VzIHdpdGggaWRlbnRpY2FsIGlucHV0cyDigJQgdGhlIHNhbWVcbiAqIGFzc2V0IHJlZmVyZW5jZWQgZnJvbSBtb3JlIHRoYW4gb25lIHJlc291cmNlIG9yIHN0YWNrIOKAlCBoYXNoIHRoZSBzb3VyY2VcbiAqIHRyZWUgb25jZSBwZXIgc3ludGggaW5zdGVhZCBvZiBvbmNlIHBlciByZWZlcmVuY2UuXG4gKlxuICogS2V5ZWQgcGVyIGNvbnN0cnVjdC10cmVlIHJvb3QgKHRoZSBgQXBwYCkgcmF0aGVyIHRoYW4gYXQgbW9kdWxlIHNjb3BlOiBhblxuICogQXBwIGluc3RhbmNlIGxpdmVzIGV4YWN0bHkgYXMgbG9uZyBhcyBvbmUgc3ludGgsIHNvIGEgbG9uZy1ydW5uaW5nIHByb2Nlc3NcbiAqIHRoYXQgc3ludGhzIHJlcGVhdGVkbHkgYWdhaW5zdCBjaGFuZ2luZyBmaWxlcyAoZS5nLiBgY2RrdG4gd2F0Y2hgKSBhbHdheXNcbiAqIGdldHMgYSBmcmVzaCBjYWNoZSBpbnN0ZWFkIG9mIGEgc3RhbGUgaGFzaCBmcm9tIGEgcHJldmlvdXMgc3ludGguXG4gKi9cbmNvbnN0IGhhc2hDYWNoZXNCeVJvb3QgPSBuZXcgV2Vha01hcDxJQ29uc3RydWN0LCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4vKipcbiAqIFRoZSBoYXNoIGNhY2hlIHNjb3BlZCB0byBhIGNvbnN0cnVjdC10cmVlIHJvb3QsIGNyZWF0ZWQgb24gZmlyc3QgdXNlLlxuICpcbiAqIFNlZSB7QGxpbmsgaGFzaENhY2hlc0J5Um9vdH0gZm9yIHdoeSB0aGUgY2FjaGUgaXMgc2NvcGVkIHBlciByb290LlxuICovXG5mdW5jdGlvbiBoYXNoQ2FjaGVGb3Iocm9vdDogSUNvbnN0cnVjdCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBsZXQgY2FjaGUgPSBoYXNoQ2FjaGVzQnlSb290LmdldChyb290KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIGhhc2hDYWNoZXNCeVJvb3Quc2V0KHJvb3QsIGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogRWFnZXItYnVpbGQgc2NyYXRjaCBkaXJlY3RvcmllcyBhd2FpdGluZyBjbGVhbnVwLCBzd2VwdCBvbiBwcm9jZXNzIGV4aXQgb3JcbiAqIGFuIGludGVycnVwdGluZyBzaWduYWwuXG4gKlxuICogQW4gYE9VVFBVVGAtaGFzaCBidWlsZCBydW5zIGluIHRoZSBjb25zdHJ1Y3RvciBidXQgaXMgbm9ybWFsbHkgdG9ybiBkb3duIGluXG4gKiBgc3RhZ2UoKWAuIFdoZW4gdGhlIGFzc2V0J3Mgc3RhY2sgaXMgbm90IHN5bnRoZXNpemVkIHRoaXMgcGFzcywgYHN0YWdlKClgXG4gKiBuZXZlciBydW5zLCBzbyB0aGUgc3dlZXAgcmVjbGFpbXMgd2hhdCBjYW4gYmUgbGFyZ2UgdHJlZXMgKGBub2RlX21vZHVsZXNgLFxuICogYnVpbGQgY2FjaGVzKSB0aGF0IGBvcy50bXBkaXIoKWAgZG9lcyBub3QgY2xlYXIgcmVsaWFibHkuXG4gKi9cbmNvbnN0IHN0cmFuZGVkU2NyYXRjaERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmxldCBleGl0U3dlZXBJbnN0YWxsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHJlbW92ZSBldmVyeSBzdGlsbC1yZWdpc3RlcmVkIHNjcmF0Y2ggZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBzd2VlcFN0cmFuZGVkU2NyYXRjaCgpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdHJheSBvZiBzdHJhbmRlZFNjcmF0Y2hEaXJzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLnJtU3luYyhzdHJheSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdC1lZmZvcnQgb24gdGhlIHdheSBvdXQ7IG5vdGhpbmcgdXNlZnVsIHRvIGRvIGlmIGl0IGZhaWxzLlxuICAgIH1cbiAgfVxuICBzdHJhbmRlZFNjcmF0Y2hEaXJzLmNsZWFyKCk7XG59XG5cbi8qKlxuICogVHJhY2sgYSBzY3JhdGNoIGRpcmVjdG9yeSBmb3IgcmVtb3ZhbCBpZiBpdCBzdXJ2aXZlcyB0byBwcm9jZXNzIGV4aXQuXG4gKlxuICogYGV4aXRgIGFsb25lIG1pc3NlcyBhIEN0cmwtQyBvciBhIGBraWxsYCBkdXJpbmcgc3ludGgg4oCUIGV4YWN0bHkgd2hlbiB0aGVcbiAqIGxhcmdlc3QgdHJlZXMgKGBub2RlX21vZHVsZXNgLCBidWlsZCBjYWNoZXMpIGFyZSBsZWZ0IGJlaGluZCDigJQgYmVjYXVzZSBOb2RlXG4gKiBkb2VzIG5vdCBydW4gYGV4aXRgIGhhbmRsZXJzIG9uIGBTSUdJTlRgL2BTSUdURVJNYC4gVGhlIHNpZ25hbCBoYW5kbGVyc1xuICogc3dlZXAsIHRoZW4gcmUtcmFpc2UgdGhlIHNpZ25hbCBzbyBhbnkgb3RoZXIgbGlzdGVuZXJzICh0aGUgQ0xJJ3Mgb3duKSBzdGlsbFxuICogcnVuLCBvciB0aGUgZGVmYXVsdCBkaXNwb3NpdGlvbiB0ZXJtaW5hdGVzIHRoZSBwcm9jZXNzIGlmIHRoZXJlIGFyZSBub25lLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclN0cmFuZGVkU2NyYXRjaChkaXI6IHN0cmluZyk6IHZvaWQge1xuICBzdHJhbmRlZFNjcmF0Y2hEaXJzLmFkZChkaXIpO1xuICBpZiAoIWV4aXRTd2VlcEluc3RhbGxlZCkge1xuICAgIGV4aXRTd2VlcEluc3RhbGxlZCA9IHRydWU7XG4gICAgLy8gYGV4aXRgIGhhbmRsZXJzIG11c3QgYmUgc3luY2hyb25vdXM7IGBybVN5bmNgIGlzLlxuICAgIHByb2Nlc3Mub25jZShcImV4aXRcIiwgc3dlZXBTdHJhbmRlZFNjcmF0Y2gpO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIl0gYXMgY29uc3QpIHtcbiAgICAgIHByb2Nlc3Mub25jZShzaWduYWwsICgpID0+IHtcbiAgICAgICAgc3dlZXBTdHJhbmRlZFNjcmF0Y2goKTtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIHNpZ25hbCBpcyBub3Qgc3dhbGxvd2VkLiBgcHJvY2Vzcy5vbmNlYCBoYXMgYWxyZWFkeVxuICAgICAgICAvLyByZW1vdmVkIHRoaXMgbGlzdGVuZXIsIHNvIHRoZSByZS1yYWlzZSByZWFjaGVzIHdoYXRldmVyIGVsc2UgaXNcbiAgICAgICAgLy8gcmVnaXN0ZXJlZCDigJQgdGhlIENMSSdzIG93biBTSUdJTlQvU0lHVEVSTSBoYW5kbGVycyDigJQgb3IsIGlmIG5vdGhpbmdcbiAgICAgICAgLy8gaXMsIHRoZSBkZWZhdWx0IGRpc3Bvc2l0aW9uIHRoYXQgdGVybWluYXRlcyB0aGUgcHJvY2Vzcy4gUmVtb3ZpbmdcbiAgICAgICAgLy8gb3RoZXIgbGlzdGVuZXJzIGhlcmUgd291bGQgZGlzY2FyZCBleGFjdGx5IHRob3NlIHRoZSBhcHAgcmVsaWVzIG9uLlxuICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgQXNzZXRTdGFnaW5nfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFN0YWdpbmdPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIG9yIGRpcmVjdG9yeS4gUmVzb2x2aW5nIGEgcmVsYXRpdmUgcGF0aFxuICAgKiBhZ2FpbnN0IGBjZGt0Zi5qc29uYCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgc3RhZ2VkIHJlc3VsdCBpcyBwcm9kdWNlZCBhbmQgc2hhcGVkLiBUaGUgY2FsbGVyIGRlY2lkZXMgdGhpc1xuICAgKiAoZS5nLiBmcm9tIGl0cyBvd24gYEFzc2V0VHlwZWApIOKAlCBgQXNzZXRTdGFnaW5nYCBuZXZlciBpbmZlcnMgb3IgY2hhbmdlc1xuICAgKiBpdCBiYXNlZCBvbiBgZXhjbHVkZWAvYGV4dHJhSGFzaGAuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdpbmc6IElBc3NldFBhY2thZ2luZztcblxuICAvKipcbiAgICogUGF0aHMgdG8gZXhjbHVkZSwgcmVsYXRpdmUgdG8gYHNvdXJjZVBhdGhgLiBDYW5ub3QgYmUgY29tYmluZWQgd2l0aFxuICAgKiBgaWdub3JlU3RyYXRlZ3lgLCB3aGljaCByZXBsYWNlcyB0aGlzIG1hdGNoZXIgcmF0aGVyIHRoYW4gbGF5ZXJpbmcgb25cbiAgICogdG9wIG9mIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgaXMgZXhjbHVkZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRXhjbHVzaW9uIG1hdGNoaW5nLCBmb3IgY2FsbGVycyB0aGF0IG5lZWQgYC5naXRpZ25vcmVgIC8gYC5kb2NrZXJpZ25vcmVgXG4gICAqIHBhcml0eSByYXRoZXIgdGhhbiB0aGUgYnVpbHQtaW4gZXhhY3QtcGF0aCAvIHN1ZmZpeCAvIGRpcmVjdG9yeSBtYXRjaGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBleGNsdWRlYCBpcyB1c2VkIHdpdGggdGhlIGJ1aWx0LWluIG1hdGNoZXJcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZVN0cmF0ZWd5PzogSUlnbm9yZVN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBFeHRyYSBpbmZvcm1hdGlvbiB0byBmb2xkIGludG8gdGhlIGhhc2ggKGUuZy4gYnVpbGQgaW5zdHJ1Y3Rpb25zIGFuZFxuICAgKiBvdGhlciBpbnB1dHMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGhhc2hcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSGFzaD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBidW5kbGVyIHRoYXQgYnVpbGRzIHRoZSBzb3VyY2UgaW50byBhbiBhcnRpZmFjdCBiZWZvcmUgc3RhZ2luZy5cbiAgICpcbiAgICogVW5kZXIgdGhlIGRlZmF1bHQgYFNPVVJDRWAgaGFzaGluZyB0aGUgYnVpbGQgaXMgZGVmZXJyZWQgdG8gYHN0YWdlKClgIGFuZFxuICAgKiBzdGF5cyBza2lwcGFibGU7IGBPVVRQVVRgIGhhc2hpbmcgYnVpbGRzIGVhZ2VybHkgYXQgY29uc3RydWN0aW9uIHRpbWUgdG9cbiAgICogaGFzaCB0aGUgYXJ0aWZhY3QsIGZvcmdvaW5nIHNraXBwYWJpbGl0eS4gVGhlIGJ1bmRsZXIncyBkZWNsYXJlZCBvdXRwdXRcbiAgICogc2hhcGUgbXVzdCBtYXRjaCB0aGUgcGFja2FnaW5nOiBhIGBCdW5kbGVSZXN1bHQuZGlyZWN0b3J5YCBuZWVkcyBhXG4gICAqIGRpcmVjdG9yeS1hY2NlcHRpbmcgcGFja2FnaW5nLCBhIGBCdW5kbGVSZXN1bHQuZmlsZWAgYSBzaW5nbGUtZmlsZSBvbmVcbiAgICogKGBBc3NldFR5cGUuRklMRWApLiBUaGUgbWlzbWF0Y2ggaXMgY2F1Z2h0IG9uY2UgdGhlIGJ1aWxkIHJ1bnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHNvdXJjZSBpcyBzdGFnZWQgdmVyYmF0aW0sIHdpdGggbm8gYnVpbGQgc3RlcFxuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxlcj86IElBc3NldEJ1bmRsZXI7XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdXNlZCBpbiBlcnJvciBtZXNzYWdlcywgc28gdGhleSBuYW1lIHRoZSB1c2VyLWZhY2luZyBjb25zdHJ1Y3RcbiAgICogKGUuZy4gdGhlIGBUZXJyYWZvcm1Bc3NldGApIHJhdGhlciB0aGFuIHRoaXMgaW50ZXJuYWwgc3RhZ2luZyBjaGlsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgc3RhZ2luZyBjb25zdHJ1Y3QncyBvd24gaWRcbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGFuIGFzc2V0J3MgaWRlbnRpdHkgYW5kIHN0YWdlcyBpdHMgY29udGVudCB0byBkaXNrLlxuICpcbiAqIFRoZSBoYXNoIGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3Rpb247IHRoZSBmaWxlc3lzdGVtIHdyaXRlXG4gKiBpcyBkZWZlcnJlZCB0byBgc3RhZ2UoKWAsIHRoZSBvbmUgd2luZG93IHdoZXJlIGl0IGlzIHNhZmUuIEhhc2hpbmcgaXNcbiAqIGNhY2hlZCBwZXIgc3ludGggKHNlZSB7QGxpbmsgaGFzaENhY2hlc0J5Um9vdH0pIHNvIGFuIGFzc2V0IHJlZmVyZW5jZWQgZnJvbVxuICogc2V2ZXJhbCBwbGFjZXMgaXMgd2Fsa2VkIG9uY2UuIFdpdGhvdXQgYSBidW5kbGVyLCBgU09VUkNFYCBhbmQgYE9VVFBVVGAgYm90aFxuICogaGFzaCB0aGUgc291cmNlOyB3aXRoIG9uZSB0aGV5IGRpdmVyZ2UsIGFzIGBBc3NldFN0YWdpbmdPcHRpb25zLmJ1bmRsZXJgXG4gKiBkZXNjcmliZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldFN0YWdpbmcgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQXNzZXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGlnbm9yZVN0cmF0ZWd5OiBJSWdub3JlU3RyYXRlZ3k7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzRXhjbHVzaW9uczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNoQ2FjaGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVuZGxlcj86IElBc3NldEJ1bmRsZXI7XG5cbiAgLyoqXG4gICAqIE91dHB1dCBvZiBhbiBlYWdlciBgT1VUUFVUYC1oYXNoIGJ1aWxkLCBjYXJyaWVkIHRvIGBzdGFnZSgpYCBmb3IgcmV1c2UuXG4gICAqXG4gICAqIFVuZGVmaW5lZCBvbiBldmVyeSBvdGhlciBwYXRoLCB3aGVyZSB0aGUgYnVpbGQgaXMgZGVmZXJyZWQgb3IgYWJzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBlYWdlckJ1aWxkPzoge1xuICAgIHJlYWRvbmx5IHNjcmF0Y2g6IHN0cmluZztcbiAgICByZWFkb25seSBwcm9kdWNlZDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG91dHB1dFR5cGU6IEJ1bmRsZU91dHB1dFR5cGU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBvbmNlIGBzdGFnZSgpYCBoYXMgcnVuLCBzbyBhIHNlY29uZCBjYWxsIGNhbm5vdCByZWJ1aWxkLiBBbiBlYWdlclxuICAgKiBgT1VUUFVUYCBidWlsZCBpcyBjYXB0dXJlZCBhdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnN1bWVkIGJ5IHRoZSBmaXJzdFxuICAgKiBgc3RhZ2UoKWA7IHdpdGhvdXQgdGhpcyBndWFyZCBhIHNlY29uZCBjYWxsIHdvdWxkIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICogZGVmZXJyZWQgYnVpbGQgcGF0aCBhbmQgc3RhZ2UgYnl0ZXMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGhhc2guXG4gICAqL1xuICBwcml2YXRlIHN0YWdlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBwYWNrYWdpbmc6IElBc3NldFBhY2thZ2luZztcbiAgcHVibGljIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzZXRIYXNoOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBc3NldFN0YWdpbmdPcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuc291cmNlUGF0aCA9IHByb3BzLnNvdXJjZVBhdGg7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHByb3BzLmRpc3BsYXlOYW1lID8/IGlkO1xuICAgIHRoaXMucGFja2FnaW5nID0gcHJvcHMucGFja2FnaW5nO1xuICAgIHRoaXMuaXNEaXJlY3RvcnkgPSBwcm9wcy5wYWNrYWdpbmcucHJvZHVjZXNEaXJlY3Rvcnk7XG4gICAgdGhpcy5oYXNoQ2FjaGUgPSBoYXNoQ2FjaGVGb3IodGhpcy5ub2RlLnJvb3QpO1xuICAgIHRoaXMuYnVuZGxlciA9IHByb3BzLmJ1bmRsZXI7XG5cbiAgICBpZiAocHJvcHMuZXhjbHVkZT8ubGVuZ3RoICYmIHByb3BzLmlnbm9yZVN0cmF0ZWd5KSB7XG4gICAgICB0aHJvdyBhc3NldFN0YWdpbmdDb25mbGljdGluZ0V4Y2x1ZGVPcHRpb25zKHRoaXMuZGlzcGxheU5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5ID1cbiAgICAgIHByb3BzLmlnbm9yZVN0cmF0ZWd5ID8/IG5ldyBFeGNsdWRlSWdub3JlU3RyYXRlZ3kocHJvcHMuZXhjbHVkZSA/PyBbXSk7XG4gICAgLy8gQSBjdXN0b20gc3RyYXRlZ3kgaXMgYXNzdW1lZCB0byBleGNsdWRlIHNvbWV0aGluZzsgdGhlIGJ1aWx0LWluIG9uZSBvbmx5XG4gICAgLy8gZG9lcyB3aXRoIGEgbm9uLWVtcHR5IGBleGNsdWRlYC4gRHJpdmVzIHdoZXRoZXIgdGhlIGJ1bmRsZXIgaXMgaGFuZGVkIGFcbiAgICAvLyBtYXRlcmlhbGlzZWQgZmlsdGVyZWQgY29weSBvciB0aGUgc291cmNlIGRpcmVjdGx5LlxuICAgIHRoaXMuaGFzRXhjbHVzaW9ucyA9XG4gICAgICBwcm9wcy5pZ25vcmVTdHJhdGVneSAhPT0gdW5kZWZpbmVkIHx8ICEhcHJvcHMuZXhjbHVkZT8ubGVuZ3RoO1xuXG4gICAgLy8gQnVuZGxlciBvdXRwdXQgc2hhcGUgKGRpcmVjdG9yeSB2cyBmaWxlKSBpcyBvbmx5IGtub3duIG9uY2UgYGJ1bmRsZWBcbiAgICAvLyBydW5zLCBzbyBpdHMgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBwYWNrYWdpbmcgaXMgY2hlY2tlZCB0aGVuLCBub3QgaGVyZVxuICAgIC8vIOKAlCBhIGRlZmVycmVkIFNPVVJDRSBidWlsZCBoYXMgbm90IHJ1biB5ZXQgYXQgY29uc3RydWN0aW9uIHRpbWUuXG5cbiAgICB0aGlzLmFzc2V0SGFzaCA9IHRoaXMucmVzb2x2ZUFzc2V0SGFzaCh0aGlzLmRpc3BsYXlOYW1lLCBwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBc3NldEhhc2goaWQ6IHN0cmluZywgcHJvcHM6IEFzc2V0U3RhZ2luZ09wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgYXNzZXRIYXNoLCBhc3NldEhhc2hUeXBlLCBleHRyYUhhc2ggfSA9IHByb3BzO1xuXG4gICAgaWYgKGFzc2V0SGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGFzc2V0SGFzaFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBhc3NldEhhc2hUeXBlICE9PSBBc3NldEhhc2hUeXBlLkNVU1RPTVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IGFzc2V0SGFzaENvbmZsaWN0aW5nSGFzaFR5cGUoaWQpO1xuICAgICAgfVxuICAgICAgaWYgKCFTQUZFX0FTU0VUX0hBU0gudGVzdChhc3NldEhhc2gpKSB7XG4gICAgICAgIHRocm93IGFzc2V0SGFzaEludmFsaWQoaWQsIGFzc2V0SGFzaCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXNzZXRIYXNoO1xuICAgIH1cblxuICAgIHN3aXRjaCAoYXNzZXRIYXNoVHlwZSkge1xuICAgICAgY2FzZSBBc3NldEhhc2hUeXBlLkNVU1RPTTpcbiAgICAgICAgdGhyb3cgYXNzZXRIYXNoVHlwZUN1c3RvbVJlcXVpcmVzSGFzaChpZCk7XG4gICAgICBjYXNlIEFzc2V0SGFzaFR5cGUuU09VUkNFOlxuICAgICAgY2FzZSBBc3NldEhhc2hUeXBlLk9VVFBVVDpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9ICEhdGhpcy5ub2RlLnRyeUdldENvbnRleHQoQ0FOT05JQ0FMX0FTU0VUX0hBU0hFUyk7XG4gICAgICAgIGNvbnN0IGFyY2hpdmUgPSB0aGlzLnBhY2thZ2luZy5vbWl0c0RpcmVjdG9yeUVudHJpZXM7XG4gICAgICAgIGNvbnN0IHNhbHQgPSB0aGlzLm5vZGUudHJ5R2V0Q29udGV4dChBU1NFVF9IQVNIX1NBTFRfQ09OVEVYVF9LRVkpO1xuXG4gICAgICAgIC8vIE9VVFBVVCBoYXNoZXMgdGhlIGJ1aWx0IGFydGlmYWN0IGFuZCBzbyBtdXN0IGJ1aWxkIGVhZ2VybHksIGZvcmdvaW5nXG4gICAgICAgIC8vIHNraXBwYWJpbGl0eSAoIzM4MCk7IGV2ZXJ5IG90aGVyIGNhc2UgaGFzaGVzIHRoZSBzb3VyY2UgdmVyYmF0aW0uXG4gICAgICAgIGNvbnN0IGJhc2VIYXNoID1cbiAgICAgICAgICB0aGlzLmJ1bmRsZXIgJiYgYXNzZXRIYXNoVHlwZSA9PT0gQXNzZXRIYXNoVHlwZS5PVVRQVVRcbiAgICAgICAgICAgID8gdGhpcy5oYXNoT3V0cHV0KGNhbm9uaWNhbCwgYXJjaGl2ZSlcbiAgICAgICAgICAgIDogdGhpcy5oYXNoU291cmNlKGNhbm9uaWNhbCwgYXJjaGl2ZSk7XG5cbiAgICAgICAgLy8gRm9yIFNPVVJDRSwgZm9sZGluZyBpbiBidW5kbGVyS2V5IGlzIHRoZSBvbmx5IHdheSBidWlsZCBpZGVudGl0eVxuICAgICAgICAvLyByZWFjaGVzIHRoZSBoYXNoLCBzaW5jZSB0aGUgc291cmNlIHRyZWUgY2Fubm90IHNlZSB0aGUgYnVpbGQuXG4gICAgICAgIGNvbnN0IGJ1bmRsZXJLZXkgPSB0aGlzLmJ1bmRsZXI/LmJ1bmRsZXJLZXk7XG4gICAgICAgIGlmICghZXh0cmFIYXNoICYmICFzYWx0ICYmICFidW5kbGVyS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGJhc2VIYXNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvbGRlZCA9IGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpLnVwZGF0ZShiYXNlSGFzaCk7XG4gICAgICAgIGlmIChleHRyYUhhc2gpIHtcbiAgICAgICAgICBmb2xkZWQudXBkYXRlKGV4dHJhSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1bmRsZXJLZXkpIHtcbiAgICAgICAgICBmb2xkZWQudXBkYXRlKGJ1bmRsZXJLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYWx0KSB7XG4gICAgICAgICAgZm9sZGVkLnVwZGF0ZShTdHJpbmcoc2FsdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb2xkZWQuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDMyKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gT3V0LW9mLXJhbmdlIHZhbHVlIGZyb20gYSBub24tVHlwZVNjcmlwdCBjYWxsZXIuXG4gICAgICAgIHRocm93IGFzc2V0SGFzaFR5cGVVbmtub3duKGlkLCBhc3NldEhhc2hUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFzaCB0aGUgc291cmNlIHRyZWUsIGhvbm9yaW5nIHRoZSBpZ25vcmUgc3RyYXRlZ3kuXG4gICAqXG4gICAqIENhY2hlZCBwZXIgc3ludGggc28gYW4gYXNzZXQgcmVmZXJlbmNlZCBtb3JlIHRoYW4gb25jZSBpcyB3YWxrZWQgb25jZS5cbiAgICovXG4gIHByaXZhdGUgaGFzaFNvdXJjZShjYW5vbmljYWw6IGJvb2xlYW4sIGFyY2hpdmU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIE9ubHkgY2FjaGVhYmxlIHdoZW4gdGhlIGlnbm9yZSBzdHJhdGVneSBjYW4gc3VtbWFyaXplIGl0cyBiZWhhdmlvclxuICAgIC8vIGFzIGEgc3RyaW5nIChzZWUgYElJZ25vcmVTdHJhdGVneS5jYWNoZUtleWApOyBvdGhlcndpc2UgZXZlcnkgY2FsbFxuICAgIC8vIGlzIHRyZWF0ZWQgYXMgdW5pcXVlLlxuICAgIGNvbnN0IGNhY2hlS2V5ID1cbiAgICAgIHRoaXMuaWdub3JlU3RyYXRlZ3kuY2FjaGVLZXkgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHNvdXJjZVBhdGg6IHRoaXMuc291cmNlUGF0aCxcbiAgICAgICAgICAgIGNhbm9uaWNhbCxcbiAgICAgICAgICAgIGFyY2hpdmUsXG4gICAgICAgICAgICBpZ25vcmU6IHRoaXMuaWdub3JlU3RyYXRlZ3kuY2FjaGVLZXksXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZUtleSA/IHRoaXMuaGFzaENhY2hlLmdldChjYWNoZUtleSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc2ggPSBoYXNoUGF0aCh0aGlzLnNvdXJjZVBhdGgsIHtcbiAgICAgIGNhbm9uaWNhbCxcbiAgICAgIGFyY2hpdmUsXG4gICAgICBzaG91bGRFeGNsdWRlOiAocmVsYXRpdmVQYXRoLCBpc0RpcmVjdG9yeSkgPT5cbiAgICAgICAgdGhpcy5pZ25vcmVTdHJhdGVneS5pZ25vcmVzKHsgcmVsYXRpdmVQYXRoLCBpc0RpcmVjdG9yeSB9KSxcbiAgICAgIGRlc2NlbmRJbnRvRXhjbHVkZWREaXJlY3RvcmllczpcbiAgICAgICAgdGhpcy5pZ25vcmVTdHJhdGVneS5wcnVuZUV4Y2x1ZGVkRGlyZWN0b3JpZXMgPT09IGZhbHNlLFxuICAgIH0pO1xuICAgIGlmIChjYWNoZUtleSkge1xuICAgICAgdGhpcy5oYXNoQ2FjaGUuc2V0KGNhY2hlS2V5LCBoYXNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGJ1bmRsZXIncyBvdXRwdXQgZWFnZXJseSBhbmQgaGFzaCB0aGUgYnVpbHQgYXJ0aWZhY3QuXG4gICAqXG4gICAqIFRoZSBvdXRwdXQgaXMgc3Rhc2hlZCBmb3IgYHN0YWdlKClgIHRvIHJldXNlLCBzbyB0aGUgYnVpbGQgaXMgbm90XG4gICAqIHJlcGVhdGVkLiBJdCBpcyBoYXNoZWQgdmVyYmF0aW06IGBleGNsdWRlYCBmaWx0ZXJzIHRoZSBzb3VyY2UgYSBidW5kbGVyXG4gICAqIHJlYWRzLCBub3QgdGhlIGFydGlmYWN0IGl0IHByb2R1Y2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNoT3V0cHV0KGNhbm9uaWNhbDogYm9vbGVhbiwgYXJjaGl2ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJjZGt0bi1idW5kbGUtXCIpKTtcbiAgICAvLyBSZWdpc3RlcmVkIHNvIHRoZSBleGl0IHN3ZWVwIHJlY2xhaW1zIGl0IGlmIHN0YWdlKCkgbmV2ZXIgcnVucyBmb3IgYW5cbiAgICAvLyB1bnN5bnRoZXNpemVkIHN0YWNrOyBzdGFnZSgpIHJlbW92ZXMgYW5kIHVucmVnaXN0ZXJzIGl0IG90aGVyd2lzZS5cbiAgICByZWdpc3RlclN0cmFuZGVkU2NyYXRjaChzY3JhdGNoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBwcm9kdWNlZCwgb3V0cHV0VHlwZSB9ID0gdGhpcy5ydW5CdW5kbGUoc2NyYXRjaCk7XG4gICAgICB0aGlzLmVhZ2VyQnVpbGQgPSB7IHNjcmF0Y2gsIHByb2R1Y2VkLCBvdXRwdXRUeXBlIH07XG4gICAgICAvLyBBIHNpbmdsZS1maWxlIGFydGlmYWN0IGlzIGhhc2hlZCBhcyBhIGZpbGUgKG5vIGFyY2hpdmUgZnJhbWluZyk7IGFcbiAgICAgIC8vIGRpcmVjdG9yeSBpcyBoYXNoZWQgYXMgdGhlIHBhY2thZ2VkIHRyZWUgd291bGQgYmUuXG4gICAgICBjb25zdCBpc0ZpbGUgPSBvdXRwdXRUeXBlID09PSBCdW5kbGVPdXRwdXRUeXBlLkZJTEU7XG4gICAgICByZXR1cm4gaGFzaFBhdGgocHJvZHVjZWQsIHsgY2Fub25pY2FsLCBhcmNoaXZlOiBhcmNoaXZlICYmICFpc0ZpbGUgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVGhlIGJ1aWxkIGZhaWxlZCBiZWZvcmUgYGVhZ2VyQnVpbGRgIHdhcyBzZXQsIHNvIHN0YWdlKCkgY2FuIG5ldmVyXG4gICAgICAvLyByZWFjaCB0aGlzIHNjcmF0Y2ggdG8gY2xlYW4gaXQuIFJlY2xhaW0gaXQgbm93IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICAgICAgLy8gcG90ZW50aWFsbHkgbGFyZ2UgdHJlZSAobm9kZV9tb2R1bGVzLCBidWlsZCBjYWNoZXMpIHRvIHRoZSBleGl0IHN3ZWVwLlxuICAgICAgdGhpcy5jbGVhbnVwU2NyYXRjaChzY3JhdGNoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgYnVuZGxlciBhZ2FpbnN0IHRoZSBmaWx0ZXJlZCBzb3VyY2UgYW5kIHJldHVybiBpdHMgb3V0cHV0LlxuICAgKlxuICAgKiBUaGUgYnVuZGxlciBpcyBoYW5kZWQgYW4gYWJzb2x1dGUgYHNvdXJjZWAgKGl0cyBjd2QgaXMgaXRzIG93biwgc28gYVxuICAgKiByZWxhdGl2ZSBwYXRoIHdvdWxkIHJlc29sdmUgZWxzZXdoZXJlKSB0aGF0IGhhcyBhbHJlYWR5IGhhZCBgZXhjbHVkZWBcbiAgICogYXBwbGllZC4gTWF0ZXJpYWxpc2luZyB0aGUgZmlsdGVyZWQgaW5wdXQgaGVyZSBpcyB3aGF0IG1ha2VzIHRoZSBidW5kbGVyXG4gICAqIHJlYWQgZXhhY3RseSB0aGUgdHJlZSB0aGUgaGFzaCB3YXMgdGFrZW4gb3Zlciwgd2hpY2ggYSByYXcgc291cmNlXG4gICAqIGhhbmQtb2ZmIHdvdWxkIG5vdCwgc2luY2UgYGhhc2hTb3VyY2VgIGhvbm91cnMgYGV4Y2x1ZGVgLlxuICAgKi9cbiAgcHJpdmF0ZSBydW5CdW5kbGUoc2NyYXRjaDogc3RyaW5nKToge1xuICAgIHByb2R1Y2VkOiBzdHJpbmc7XG4gICAgb3V0cHV0VHlwZTogQnVuZGxlT3V0cHV0VHlwZTtcbiAgfSB7XG4gICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5qb2luKHNjcmF0Y2gsIFwib3V0cHV0XCIpO1xuICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYnVuZGxlciEuYnVuZGxlKHtcbiAgICAgIHNvdXJjZTogdGhpcy5maWx0ZXJlZFNvdXJjZShzY3JhdGNoKSxcbiAgICAgIG91dHB1dERpcixcbiAgICB9KTtcblxuICAgIC8vIEEgYmFyZSBidW5kbGVyIHRoYXQgZGVjbGluZXMgaGFzIG5vdGhpbmcgdG8gZmFsbCBiYWNrIHRvIOKAlCBkZWNsaW5pbmcgaXNcbiAgICAvLyBvbmx5IG1lYW5pbmdmdWwgaW5zaWRlIGEgQ2hhaW5CdW5kbGVyLCB3aGljaCBjb25zdW1lcyBpdCBiZWZvcmUgaXRcbiAgICAvLyByZWFjaGVzIGhlcmUuIEEgbm9uLWRlY2xpbmVkIHJlc3VsdCBhbHdheXMgY2FycmllcyBhIHBhdGggYW5kIHNoYXBlLlxuICAgIGlmIChcbiAgICAgIHJlc3VsdC5pc0RlY2xpbmVkIHx8XG4gICAgICByZXN1bHQucGF0aCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICByZXN1bHQub3V0cHV0VHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBhc3NldFN0YWdpbmdCdW5kbGVyT3V0cHV0Tm90RGlyZWN0b3J5KFxuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lLFxuICAgICAgICBTdHJpbmcocmVzdWx0LnBhdGgpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9kdWNlZCA9IHJlc3VsdC5wYXRoO1xuICAgIHRoaXMudmFsaWRhdGVPdXRwdXRTaGFwZShwcm9kdWNlZCwgcmVzdWx0Lm91dHB1dFR5cGUpO1xuICAgIHJldHVybiB7IHByb2R1Y2VkLCBvdXRwdXRUeXBlOiByZXN1bHQub3V0cHV0VHlwZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdCBhIGJ1bmRsZXIgcmVzdWx0IHdob3NlIGRlY2xhcmVkIHNoYXBlIGRvZXMgbm90IG1hdGNoIHdoYXQgaXMgb25cbiAgICogZGlzaywgb3IgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2luZy5cbiAgICpcbiAgICogQ2F0Y2hpbmcgdGhlIG1pc21hdGNoIGhlcmUgdHVybnMgYW4gb3BhcXVlIEVJU0RJUi9FUEVSTSBhdCBwYWNrIHRpbWUgaW50b1xuICAgKiBhIGNsZWFyIGVycm9yIG5hbWluZyB0aGUgcGFja2FnaW5nIHRoZSBidW5kbGVyJ3Mgb3V0cHV0IHNoYXBlIG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU91dHB1dFNoYXBlKFxuICAgIHByb2R1Y2VkOiBzdHJpbmcsXG4gICAgb3V0cHV0VHlwZTogQnVuZGxlT3V0cHV0VHlwZSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhwcm9kdWNlZCk7XG4gICAgY29uc3Qgc3RhdCA9IGV4aXN0cyA/IGZzLnN0YXRTeW5jKHByb2R1Y2VkKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChvdXRwdXRUeXBlID09PSBCdW5kbGVPdXRwdXRUeXBlLkZJTEUpIHtcbiAgICAgIGlmICghc3RhdD8uaXNGaWxlKCkpIHtcbiAgICAgICAgdGhyb3cgYXNzZXRTdGFnaW5nQnVuZGxlck91dHB1dE5vdEZpbGUodGhpcy5kaXNwbGF5TmFtZSwgcHJvZHVjZWQpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnN0YWdlc1NpbmdsZUZpbGUpIHtcbiAgICAgICAgdGhyb3cgYXNzZXRTdGFnaW5nQnVuZGxlckZpbGVPdXRwdXROZWVkc0ZpbGVQYWNrYWdpbmcodGhpcy5kaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBhc3NldFN0YWdpbmdCdW5kbGVyT3V0cHV0Tm90RGlyZWN0b3J5KHRoaXMuZGlzcGxheU5hbWUsIHByb2R1Y2VkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhY2thZ2luZy5hY2NlcHRzRGlyZWN0b3J5U291cmNlKSB7XG4gICAgICB0aHJvdyBhc3NldFN0YWdpbmdCdW5kbGVyRGlyZWN0b3J5T3V0cHV0TmVlZHNEaXJlY3RvcnlQYWNrYWdpbmcoXG4gICAgICAgIHRoaXMuZGlzcGxheU5hbWUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYWNrYWdpbmcgc3RhZ2VzIGEgc2luZ2xlIGZpbGUgdmVyYmF0aW0gKEFzc2V0VHlwZS5GSUxFKS5cbiAgICpcbiAgICogQSB2ZXJiYXRpbS1maWxlIHBhY2thZ2luZyBuZWl0aGVyIHByb2R1Y2VzIGEgZGlyZWN0b3J5IG5vciByZWFkcyBvbmUgYXNcbiAgICogaXRzIHNvdXJjZS4gRGVyaXZlZCBmcm9tIGV4aXN0aW5nIGBJQXNzZXRQYWNrYWdpbmdgIGZsYWdzIHNvIG91dC1vZi10cmVlXG4gICAqIHBhY2thZ2luZ3MgbmVlZCBubyBuZXcgaW50ZXJmYWNlIG1lbWJlci5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHN0YWdlc1NpbmdsZUZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnBhY2thZ2luZy5wcm9kdWNlc0RpcmVjdG9yeSAmJlxuICAgICAgIXRoaXMucGFja2FnaW5nLmFjY2VwdHNEaXJlY3RvcnlTb3VyY2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHNvdXJjZSB0aGUgYnVuZGxlciBzaG91bGQgcmVhZC5cbiAgICpcbiAgICogV2l0aCBubyBleGNsdXNpb25zLCBvciB3aXRoIGEgZmlsZSBzb3VyY2UsIHRoZSByZXNvbHZlZCBzb3VyY2UgaXMgaGFuZGVkXG4gICAqIG92ZXIgZGlyZWN0bHkg4oCUIGEgZmlsZSBoYXMgbm8gY2hpbGRyZW4gdG8gZmlsdGVyLCBtYXRjaGluZyBgaGFzaFNvdXJjZWAsXG4gICAqIHdoaWNoIG9ubHkgZXZlciBhcHBsaWVzIHRoZSBpZ25vcmUgc3RyYXRlZ3kgdG8gYSBkaXJlY3RvcnkncyBlbnRyaWVzIGFuZFxuICAgKiBuZXZlciB0byB0aGUgcm9vdCBpdHNlbGYuIE90aGVyd2lzZSB0aGUgZXhjbHVkZWQgc291cmNlIHRyZWUgaXNcbiAgICogbWF0ZXJpYWxpc2VkIGludG8gdGhlIHNjcmF0Y2ggZGlyZWN0b3J5LCBzbyB0aGUgYnVuZGxlciBzZWVzIHRoZSBzYW1lXG4gICAqIGZpbGUgc2V0IHRoZSBoYXNoIHdhcyB0YWtlbiBvdmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJlZFNvdXJjZShzY3JhdGNoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFic29sdXRlU291cmNlID0gcGF0aC5yZXNvbHZlKHRoaXMuc291cmNlUGF0aCk7XG4gICAgaWYgKCF0aGlzLmhhc0V4Y2x1c2lvbnMgfHwgZnMuc3RhdFN5bmMoYWJzb2x1dGVTb3VyY2UpLmlzRmlsZSgpKSB7XG4gICAgICByZXR1cm4gYWJzb2x1dGVTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNjcmF0Y2gsIFwiaW5wdXRcIik7XG4gICAgZnMubWtkaXJTeW5jKGlucHV0KTtcbiAgICBjb3B5U3luYyhhYnNvbHV0ZVNvdXJjZSwgaW5wdXQsIHtcbiAgICAgIHNob3VsZEV4Y2x1ZGU6IChyZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5Lmlnbm9yZXMoeyByZWxhdGl2ZVBhdGgsIGlzRGlyZWN0b3J5IH0pLFxuICAgICAgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzOlxuICAgICAgICB0aGlzLmlnbm9yZVN0cmF0ZWd5LnBydW5lRXhjbHVkZWREaXJlY3RvcmllcyA9PT0gZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWdlIHRoZSBhc3NldCdzIGNvbnRlbnQgdG8gYHRhcmdldFBhdGhgLlxuICAgKlxuICAgKiBDYWxsZWQgZnJvbSB0aGUgb3duaW5nIGNvbnN0cnVjdCdzIGBvblN5bnRoZXNpemVgIGhvb2suIFdpdGhvdXQgYSBidW5kbGVyXG4gICAqIHRoZSBzb3VyY2UgaXMgcGFja2FnZWQgdmVyYmF0aW07IHdpdGggb25lLCB0aGUgYnVuZGxlcidzIG91dHB1dCBpcywgYnVpbHRcbiAgICogZWFnZXJseSBmb3IgYE9VVFBVVGAgaGFzaGluZyBvciBkZWZlcnJlZCB0byBoZXJlIGZvciBgU09VUkNFYC5cbiAgICovXG4gIHB1YmxpYyBzdGFnZSh0YXJnZXRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBTdGFnZSBleGFjdGx5IG9uY2U6IGEgcmVidWlsZCBjb3VsZCBzdGFnZSBieXRlcyBub3QgbWF0Y2hpbmcgdGhlXG4gICAgLy8gYWxyZWFkeS1jb21wdXRlZCBoYXNoIChzZWUgdGhlIGBzdGFnZWRgIGZpZWxkKS5cbiAgICBpZiAodGhpcy5zdGFnZWQpIHtcbiAgICAgIHRocm93IGFzc2V0U3RhZ2luZ0FscmVhZHlTdGFnZWQodGhpcy5kaXNwbGF5TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2VkID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5idW5kbGVyKSB7XG4gICAgICB0aGlzLnBhY2thZ2luZy5wYWNrKHtcbiAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0UGF0aCxcbiAgICAgICAgaWdub3JlU3RyYXRlZ3k6IHRoaXMuaWdub3JlU3RyYXRlZ3ksXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBgT1VUUFVUYCBoYXNoaW5nIGFscmVhZHkgYnVpbHQgdGhlIGFydGlmYWN0IGluIHRoZSBjb25zdHJ1Y3RvcjsgcGFja2FnZVxuICAgIC8vIHRoYXQgZXhhY3QgcmVzdWx0IGFuZCBjbGVhbiB1cCBpdHMgc2NyYXRjaCwgcmF0aGVyIHRoYW4gYnVpbGRpbmcgdHdpY2UuXG4gICAgaWYgKHRoaXMuZWFnZXJCdWlsZCkge1xuICAgICAgY29uc3QgeyBzY3JhdGNoLCBwcm9kdWNlZCB9ID0gdGhpcy5lYWdlckJ1aWxkO1xuICAgICAgdGhpcy5lYWdlckJ1aWxkID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wYWNrQnVuZGxlck91dHB1dChwcm9kdWNlZCwgdGFyZ2V0UGF0aCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmNsZWFudXBTY3JhdGNoKHNjcmF0Y2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGBTT1VSQ0VgIGhhc2hpbmcgZGVmZXJzIHRoZSBidWlsZCB0byBoZXJlLlxuICAgIGNvbnN0IHNjcmF0Y2ggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwiY2RrdG4tYnVuZGxlLVwiKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcHJvZHVjZWQgfSA9IHRoaXMucnVuQnVuZGxlKHNjcmF0Y2gpO1xuICAgICAgdGhpcy5wYWNrQnVuZGxlck91dHB1dChwcm9kdWNlZCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY2xlYW51cFNjcmF0Y2goc2NyYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGJ1bmRsZXIgc2NyYXRjaCBkaXJlY3RvcnkgYW5kIGRyb3AgaXQgZnJvbSB0aGUgZXhpdC1zd2VlcCBzZXQuXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBTY3JhdGNoKHNjcmF0Y2g6IHN0cmluZyk6IHZvaWQge1xuICAgIGZzLnJtU3luYyhzY3JhdGNoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgc3RyYW5kZWRTY3JhdGNoRGlycy5kZWxldGUoc2NyYXRjaCk7XG4gIH1cblxuICAvKipcbiAgICogUGFja2FnZSBhIGJ1bmRsZXIncyBvdXRwdXQgaW50byBgdGFyZ2V0UGF0aGAsIHZlcmJhdGltLlxuICAgKlxuICAgKiBUaGUgb3V0cHV0J3Mgc2hhcGUgd2FzIGFscmVhZHkgdmFsaWRhdGVkIGFnYWluc3QgdGhlIHBhY2thZ2luZyBpblxuICAgKiB7QGxpbmsgcnVuQnVuZGxlfSwgc28gdGhlIHBhY2thZ2luZyBoYW5kbGVzIHRoZSBzb3VyY2UgZGlyZWN0bHkg4oCUIGEgZmlsZVxuICAgKiBzb3VyY2UgZm9yIEFzc2V0VHlwZS5GSUxFLCBhIGRpcmVjdG9yeSBzb3VyY2Ugb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBUaGUgaWdub3JlIHN0cmF0ZWd5IGlzIGRlbGliZXJhdGVseSBub3QgYXBwbGllZC4gYGV4Y2x1ZGVgIGZpbHRlcnMgdGhlXG4gICAqIHNvdXJjZSBhIGJ1bmRsZXIgcmVhZHMsIG5vdCBpdHMgcHJvZHVjdDogYW4gaW5zdGFsbC1zdHlsZSBidW5kbGVyXG4gICAqIChgbnBtIGluc3RhbGwgLS1wcm9kdWN0aW9uYCwgYHBpcCBpbnN0YWxsIC10YCkgd3JpdGVzIGV4YWN0bHkgdGhlXG4gICAqIGRlcGVuZGVuY3kgZGlyZWN0b3J5IGEgdXNlciBleGNsdWRlcyBmcm9tIHNvdXJjZSwgYW5kIHJlLWFwcGx5aW5nIHRoZVxuICAgKiBleGNsdXNpb24gd291bGQgc2hpcCBhbiBhcnRpZmFjdCBtaXNzaW5nIHRob3NlIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByaXZhdGUgcGFja0J1bmRsZXJPdXRwdXQocHJvZHVjZWQ6IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYWNrYWdpbmcucGFjayh7XG4gICAgICBzb3VyY2U6IHByb2R1Y2VkLFxuICAgICAgdGFyZ2V0OiB0YXJnZXRQYXRoLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
package/lib/assets.js CHANGED
@@ -115,7 +115,7 @@ class ZipPackaging {
115
115
  * directly rather than extending this class.
116
116
  */
117
117
  class AssetPackaging {
118
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetPackaging", version: "0.25.0-pre.51" };
118
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AssetPackaging", version: "0.25.0-pre.53" };
119
119
  /**
120
120
  * Copy a single file as-is.
121
121
  */
@@ -161,7 +161,7 @@ var BundleOutputType;
161
161
  * caller should fall back. See {@link declined} for the decline protocol.
162
162
  */
163
163
  class BundleResult {
164
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BundleResult", version: "0.25.0-pre.51" };
164
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BundleResult", version: "0.25.0-pre.53" };
165
165
  /**
166
166
  * A directory-tree artifact at `path`.
167
167
  */
@@ -217,7 +217,7 @@ exports.BundleResult = BundleResult;
217
217
  */
218
218
  class BundlerKey {
219
219
  parts;
220
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BundlerKey", version: "0.25.0-pre.51" };
220
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.BundlerKey", version: "0.25.0-pre.53" };
221
221
  /**
222
222
  * Start a key from an ordered list of parts.
223
223
  *
@@ -278,7 +278,7 @@ exports.BundlerKey = BundlerKey;
278
278
  */
279
279
  class ChainBundler {
280
280
  bundlers;
281
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ChainBundler", version: "0.25.0-pre.51" };
281
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ChainBundler", version: "0.25.0-pre.53" };
282
282
  /**
283
283
  * Chain bundlers in the order given; earlier bundlers are preferred.
284
284
  */
@@ -8,7 +8,7 @@ const terraform_remote_state_1 = require("../terraform-remote-state");
8
8
  // eslint-disable-next-line jsdoc/require-jsdoc
9
9
  class AzurermBackend extends terraform_backend_1.TerraformBackend {
10
10
  props;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AzurermBackend", version: "0.25.0-pre.51" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.AzurermBackend", version: "0.25.0-pre.53" };
12
12
  constructor(scope, props) {
13
13
  super(scope, "backend", "azurerm");
14
14
  this.props = props;
@@ -29,7 +29,7 @@ class AzurermBackend extends terraform_backend_1.TerraformBackend {
29
29
  exports.AzurermBackend = AzurermBackend;
30
30
  // eslint-disable-next-line jsdoc/require-jsdoc
31
31
  class DataTerraformRemoteStateAzurerm extends terraform_remote_state_1.TerraformRemoteState {
32
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateAzurerm", version: "0.25.0-pre.51" };
32
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateAzurerm", version: "0.25.0-pre.53" };
33
33
  constructor(scope, id, config) {
34
34
  super(scope, id, "azurerm", config);
35
35
  }
@@ -28,7 +28,7 @@ function getHostNameType(hostname) {
28
28
  */
29
29
  class CloudBackend extends terraform_backend_1.TerraformBackend {
30
30
  props;
31
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CloudBackend", version: "0.25.0-pre.51" };
31
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CloudBackend", version: "0.25.0-pre.53" };
32
32
  constructor(scope, props) {
33
33
  super(scope, "backend", "cloud");
34
34
  this.props = props;
@@ -94,7 +94,7 @@ exports.CloudBackend = CloudBackend;
94
94
  * A cloud workspace can either be a single named workspace, or a list of tagged workspaces.
95
95
  */
96
96
  class CloudWorkspace {
97
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CloudWorkspace", version: "0.25.0-pre.51" };
97
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CloudWorkspace", version: "0.25.0-pre.53" };
98
98
  }
99
99
  exports.CloudWorkspace = CloudWorkspace;
100
100
  /**
@@ -104,7 +104,7 @@ exports.CloudWorkspace = CloudWorkspace;
104
104
  class NamedCloudWorkspace extends CloudWorkspace {
105
105
  name;
106
106
  project;
107
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NamedCloudWorkspace", version: "0.25.0-pre.51" };
107
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.NamedCloudWorkspace", version: "0.25.0-pre.53" };
108
108
  constructor(name, project) {
109
109
  super();
110
110
  this.name = name;
@@ -133,7 +133,7 @@ exports.NamedCloudWorkspace = NamedCloudWorkspace;
133
133
  class TaggedCloudWorkspaces extends CloudWorkspace {
134
134
  tags;
135
135
  project;
136
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TaggedCloudWorkspaces", version: "0.25.0-pre.51" };
136
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TaggedCloudWorkspaces", version: "0.25.0-pre.53" };
137
137
  constructor(tags, project) {
138
138
  super();
139
139
  this.tags = tags;
@@ -8,7 +8,7 @@ const terraform_remote_state_1 = require("../terraform-remote-state");
8
8
  // eslint-disable-next-line jsdoc/require-jsdoc
9
9
  class ConsulBackend extends terraform_backend_1.TerraformBackend {
10
10
  props;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ConsulBackend", version: "0.25.0-pre.51" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ConsulBackend", version: "0.25.0-pre.53" };
12
12
  constructor(scope, props) {
13
13
  super(scope, "backend", "consul");
14
14
  this.props = props;
@@ -29,7 +29,7 @@ class ConsulBackend extends terraform_backend_1.TerraformBackend {
29
29
  exports.ConsulBackend = ConsulBackend;
30
30
  // eslint-disable-next-line jsdoc/require-jsdoc
31
31
  class DataTerraformRemoteStateConsul extends terraform_remote_state_1.TerraformRemoteState {
32
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateConsul", version: "0.25.0-pre.51" };
32
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateConsul", version: "0.25.0-pre.53" };
33
33
  constructor(scope, id, config) {
34
34
  super(scope, id, "consul", config);
35
35
  }
@@ -8,7 +8,7 @@ const terraform_remote_state_1 = require("../terraform-remote-state");
8
8
  // eslint-disable-next-line jsdoc/require-jsdoc
9
9
  class CosBackend extends terraform_backend_1.TerraformBackend {
10
10
  props;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CosBackend", version: "0.25.0-pre.51" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.CosBackend", version: "0.25.0-pre.53" };
12
12
  constructor(scope, props) {
13
13
  super(scope, "backend", "cos");
14
14
  this.props = props;
@@ -29,7 +29,7 @@ class CosBackend extends terraform_backend_1.TerraformBackend {
29
29
  exports.CosBackend = CosBackend;
30
30
  // eslint-disable-next-line jsdoc/require-jsdoc
31
31
  class DataTerraformRemoteStateCos extends terraform_remote_state_1.TerraformRemoteState {
32
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateCos", version: "0.25.0-pre.51" };
32
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateCos", version: "0.25.0-pre.53" };
33
33
  constructor(scope, id, config) {
34
34
  super(scope, id, "cos", config);
35
35
  }
@@ -8,7 +8,7 @@ const terraform_remote_state_1 = require("../terraform-remote-state");
8
8
  // eslint-disable-next-line jsdoc/require-jsdoc
9
9
  class GcsBackend extends terraform_backend_1.TerraformBackend {
10
10
  props;
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.GcsBackend", version: "0.25.0-pre.51" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.GcsBackend", version: "0.25.0-pre.53" };
12
12
  constructor(scope, props) {
13
13
  super(scope, "backend", "gcs");
14
14
  this.props = props;
@@ -29,7 +29,7 @@ class GcsBackend extends terraform_backend_1.TerraformBackend {
29
29
  exports.GcsBackend = GcsBackend;
30
30
  // eslint-disable-next-line jsdoc/require-jsdoc
31
31
  class DataTerraformRemoteStateGcs extends terraform_remote_state_1.TerraformRemoteState {
32
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateGcs", version: "0.25.0-pre.51" };
32
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.DataTerraformRemoteStateGcs", version: "0.25.0-pre.53" };
33
33
  constructor(scope, id, config) {
34
34
  super(scope, id, "gcs", config);
35
35
  }