@tricoteuses/assemblee 1.0.7 → 1.1.0

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 (134) hide show
  1. package/lib/api.js +3 -9
  2. package/lib/api.mjs +4 -5
  3. package/lib/bugs/acteur-00010/plugin.test.js +3 -50
  4. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  5. package/lib/bugs/acteur-00010.js +2 -57
  6. package/lib/bugs/acteur-00010.mjs +1 -6
  7. package/lib/bugs/agenda-00002/plugin.test.js +3 -53
  8. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -3
  9. package/lib/bugs/agenda-00002.js +3 -148
  10. package/lib/bugs/agenda-00002.mjs +1 -28
  11. package/lib/bugs/agenda-00008/plugin.test.js +3 -52
  12. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  13. package/lib/bugs/agenda-00008.js +2 -61
  14. package/lib/bugs/agenda-00008.mjs +1 -5
  15. package/lib/bugs/agenda-00011/plugin.test.js +5 -99
  16. package/lib/bugs/agenda-00011/plugin.test.mjs +3 -3
  17. package/lib/bugs/agenda-00011.js +4 -105
  18. package/lib/bugs/agenda-00011.mjs +3 -29
  19. package/lib/bugs.js +3 -164
  20. package/lib/bugs.mjs +1 -26
  21. package/lib/cleaners/actes_legislatifs.js +11 -115
  22. package/lib/cleaners/actes_legislatifs.mjs +7 -82
  23. package/lib/cleaners/acteurs.js +12 -92
  24. package/lib/cleaners/acteurs.mjs +7 -38
  25. package/lib/cleaners/amendements.js +10 -103
  26. package/lib/cleaners/amendements.mjs +4 -58
  27. package/lib/cleaners/documents.js +5 -67
  28. package/lib/cleaners/documents.mjs +1 -37
  29. package/lib/cleaners/dossiers_legislatifs.js +5 -61
  30. package/lib/cleaners/dossiers_legislatifs.mjs +1 -29
  31. package/lib/cleaners/index.js +1 -9
  32. package/lib/cleaners/index.mjs +1 -1
  33. package/lib/cleaners/organes.js +1 -33
  34. package/lib/cleaners/organes.mjs +1 -17
  35. package/lib/cleaners/reunions.js +4 -119
  36. package/lib/cleaners/reunions.mjs +1 -64
  37. package/lib/cleaners/scrutins.js +10 -102
  38. package/lib/cleaners/scrutins.mjs +1 -48
  39. package/lib/cleaners/xml.js +8 -42
  40. package/lib/cleaners/xml.mjs +6 -8
  41. package/lib/datasets.js +14 -113
  42. package/lib/datasets.mjs +6 -46
  43. package/lib/dates.js +7 -37
  44. package/lib/dates.mjs +9 -14
  45. package/lib/dossiers_legislatifs.js +6 -68
  46. package/lib/dossiers_legislatifs.mjs +5 -36
  47. package/lib/file_systems.js +56 -139
  48. package/lib/file_systems.mjs +1 -9
  49. package/lib/git.js +4 -53
  50. package/lib/git.mjs +1 -12
  51. package/lib/index.js +1 -15
  52. package/lib/index.mjs +1 -1
  53. package/lib/inserters.js +23 -146
  54. package/lib/inserters.mjs +6 -87
  55. package/lib/loaders.js +44 -316
  56. package/lib/loaders.mjs +12 -135
  57. package/lib/organes.js +1 -7
  58. package/lib/organes.mjs +1 -4
  59. package/lib/parsers/documents.js +22 -151
  60. package/lib/parsers/documents.mjs +19 -81
  61. package/lib/parsers/index.js +1 -4
  62. package/lib/parsers/index.mjs +1 -1
  63. package/lib/parsers/recherche_amendements.js +302 -527
  64. package/lib/parsers/recherche_amendements.mjs +8 -31
  65. package/lib/raw_types/acteurs_et_organes.d.ts +1 -30
  66. package/lib/raw_types/acteurs_et_organes.js +5 -124
  67. package/lib/raw_types/acteurs_et_organes.mjs +5 -105
  68. package/lib/raw_types/agendas.js +6 -89
  69. package/lib/raw_types/agendas.mjs +9 -65
  70. package/lib/raw_types/amendements.d.ts +2 -0
  71. package/lib/raw_types/amendements.js +10 -90
  72. package/lib/raw_types/amendements.mjs +11 -69
  73. package/lib/raw_types/dossiers_legislatifs.js +6 -96
  74. package/lib/raw_types/dossiers_legislatifs.mjs +6 -73
  75. package/lib/raw_types/scrutins.js +6 -81
  76. package/lib/raw_types/scrutins.mjs +9 -57
  77. package/lib/scripts/bugs_helper.js +2 -181
  78. package/lib/scripts/bugs_helper.mjs +2 -39
  79. package/lib/scripts/clean_data.js +27 -143
  80. package/lib/scripts/clean_data.mjs +15 -34
  81. package/lib/scripts/clean_reorganized_data.js +76 -240
  82. package/lib/scripts/clean_reorganized_data.mjs +36 -99
  83. package/lib/scripts/diff_amendements.js +19 -79
  84. package/lib/scripts/diff_amendements.mjs +17 -35
  85. package/lib/scripts/document_dossiers_legislatifs.js +17 -142
  86. package/lib/scripts/document_dossiers_legislatifs.mjs +6 -90
  87. package/lib/scripts/get_today_reunions.js +4 -22
  88. package/lib/scripts/get_today_reunions.mjs +1 -7
  89. package/lib/scripts/merge_scrutins.js +3 -47
  90. package/lib/scripts/merge_scrutins.mjs +1 -9
  91. package/lib/scripts/parse_textes_lois.js +15 -44
  92. package/lib/scripts/parse_textes_lois.mjs +18 -19
  93. package/lib/scripts/raw_types_from_amendements.js +3 -95
  94. package/lib/scripts/raw_types_from_amendements.mjs +1 -16
  95. package/lib/scripts/reorganize_data.js +74 -294
  96. package/lib/scripts/reorganize_data.mjs +22 -133
  97. package/lib/scripts/retrieve_deputes_photos.js +6 -119
  98. package/lib/scripts/retrieve_deputes_photos.mjs +7 -33
  99. package/lib/scripts/retrieve_documents.js +4 -192
  100. package/lib/scripts/retrieve_documents.mjs +2 -50
  101. package/lib/scripts/retrieve_open_data.js +44 -116
  102. package/lib/scripts/retrieve_open_data.mjs +14 -19
  103. package/lib/scripts/retrieve_pending_amendments.js +4 -98
  104. package/lib/scripts/retrieve_pending_amendments.mjs +1 -14
  105. package/lib/scripts/retrieve_senateurs_photos.js +18 -114
  106. package/lib/scripts/retrieve_senateurs_photos.mjs +20 -48
  107. package/lib/scripts/retrieve_textes_lois.js +3 -122
  108. package/lib/scripts/retrieve_textes_lois.mjs +3 -21
  109. package/lib/scripts/test_load.js +2 -10
  110. package/lib/scripts/test_load.mjs +2 -1
  111. package/lib/scripts/test_load_big_files.js +2 -10
  112. package/lib/scripts/test_load_big_files.mjs +2 -1
  113. package/lib/scripts/validate_json.js +4 -119
  114. package/lib/scripts/validate_json.mjs +2 -36
  115. package/lib/shared_types/codes_actes.js +1 -24
  116. package/lib/shared_types/codes_actes.mjs +3 -10
  117. package/lib/strings.js +1 -5
  118. package/lib/strings.mjs +1 -1
  119. package/lib/types/acteurs_et_organes.js +9 -84
  120. package/lib/types/acteurs_et_organes.mjs +10 -63
  121. package/lib/types/agendas.js +8 -90
  122. package/lib/types/agendas.mjs +11 -66
  123. package/lib/types/amendements.d.ts +2 -0
  124. package/lib/types/amendements.js +12 -92
  125. package/lib/types/amendements.mjs +15 -70
  126. package/lib/types/dossiers_legislatifs.js +8 -96
  127. package/lib/types/dossiers_legislatifs.mjs +10 -72
  128. package/lib/types/legislatures.js +1 -3
  129. package/lib/types/legislatures.mjs +1 -2
  130. package/lib/types/scrutins.js +8 -82
  131. package/lib/types/scrutins.mjs +11 -58
  132. package/lib/urls.js +3 -27
  133. package/lib/urls.mjs +3 -21
  134. package/package.json +1 -1
@@ -1,125 +1,65 @@
1
1
  "use strict";
2
2
 
3
3
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
-
5
4
  require("core-js/modules/es.array.slice.js");
6
-
7
5
  require("core-js/modules/es.symbol.js");
8
-
9
6
  require("core-js/modules/es.symbol.description.js");
10
-
11
7
  require("core-js/modules/es.symbol.iterator.js");
12
-
13
8
  require("core-js/modules/es.array.is-array.js");
14
-
15
9
  require("core-js/modules/es.object.define-property.js");
16
-
17
10
  require("core-js/modules/es.object.set-prototype-of.js");
18
-
19
11
  require("core-js/modules/es.function.bind.js");
20
-
21
12
  require("core-js/modules/es.object.get-prototype-of.js");
22
-
23
13
  require("core-js/modules/es.reflect.construct.js");
24
-
25
14
  require("core-js/modules/es.object.create.js");
26
-
27
15
  require("core-js/modules/es.object.assign.js");
28
-
29
16
  require("core-js/modules/es.array.iterator.js");
30
-
31
17
  require("core-js/modules/es.object.to-string.js");
32
-
33
18
  require("core-js/modules/es.set.js");
34
-
35
19
  require("core-js/modules/es.string.iterator.js");
36
-
37
20
  require("core-js/modules/web.dom-collections.iterator.js");
38
-
39
21
  require("core-js/modules/es.array.from.js");
40
-
41
22
  require("core-js/modules/es.array.join.js");
42
-
43
23
  require("core-js/modules/es.regexp.exec.js");
44
-
45
24
  require("core-js/modules/es.string.match.js");
46
-
47
25
  require("core-js/modules/es.string.replace.js");
48
-
49
26
  require("core-js/modules/es.array.map.js");
50
-
51
27
  require("core-js/modules/es.map.js");
52
-
53
28
  require("core-js/modules/es.regexp.constructor.js");
54
-
55
29
  require("core-js/modules/es.regexp.to-string.js");
56
-
57
30
  require("core-js/modules/es.array.concat.js");
58
-
59
31
  require("core-js/modules/es.function.name.js");
60
-
61
32
  require("core-js/modules/es.object.entries.js");
62
-
63
33
  require("core-js/modules/es.string.starts-with.js");
64
-
65
34
  require("core-js/modules/es.string.ends-with.js");
66
-
67
35
  require("core-js/modules/es.object.keys.js");
68
-
69
36
  var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
70
-
71
37
  var _commandLineUsage = _interopRequireDefault(require("command-line-usage"));
72
-
73
38
  var _assert = _interopRequireDefault(require("assert"));
74
-
75
39
  var _file_systems = require("../file_systems");
76
-
77
40
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
78
-
79
41
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
80
-
81
42
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
82
-
83
43
  function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
84
-
85
44
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
86
-
87
45
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
88
-
89
46
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
90
-
91
47
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
92
-
93
48
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
94
-
95
49
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
96
-
97
50
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
98
-
99
51
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
100
-
101
52
  function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
102
-
103
53
  function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
104
-
105
54
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
106
-
107
55
  function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
108
-
109
56
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
110
-
111
57
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
112
-
113
58
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
114
-
115
59
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
116
-
117
60
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
118
-
119
61
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
120
-
121
62
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
122
-
123
63
  function parseArgs(argv) {
124
64
  var optionsDefinitions = [{
125
65
  description: "pathname to a JSON file or a glob pattern to JSON files",
@@ -149,27 +89,21 @@ function parseArgs(argv) {
149
89
  var options = (0, _commandLineArgs["default"])(optionsDefinitions, {
150
90
  argv: argv
151
91
  });
152
-
153
92
  if (!("help" in options) && !("data" in options)) {
154
93
  console.error("--data is mandatory");
155
94
  options.help = true;
156
95
  }
157
-
158
96
  if ("help" in options) {
159
97
  var usage = (0, _commandLineUsage["default"])(sections);
160
98
  console.warn(usage);
161
99
  return null;
162
100
  }
163
-
164
101
  return options;
165
102
  }
166
-
167
103
  function eqSet(as, bs) {
168
104
  if (as.size !== bs.size) return false;
169
-
170
105
  var _iterator = _createForOfIteratorHelper(as),
171
- _step;
172
-
106
+ _step;
173
107
  try {
174
108
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
175
109
  var a = _step.value;
@@ -180,45 +114,31 @@ function eqSet(as, bs) {
180
114
  } finally {
181
115
  _iterator.f();
182
116
  }
183
-
184
117
  return true;
185
118
  }
186
-
187
119
  var Code2Pattern = /*#__PURE__*/_createClass(function Code2Pattern(pattern, children) {
188
120
  _classCallCheck(this, Code2Pattern);
189
-
190
121
  _defineProperty(this, "_pattern_", void 0);
191
-
192
122
  _defineProperty(this, "_match_count_", void 0);
193
-
194
123
  this._pattern_ = pattern;
195
124
  this._match_count_ = 0;
196
125
  Object.assign(this, children);
197
126
  });
198
-
199
127
  var Code2PatternComFond = /*#__PURE__*/function (_Code2Pattern) {
200
128
  _inherits(Code2PatternComFond, _Code2Pattern);
201
-
202
129
  var _super = _createSuper(Code2PatternComFond);
203
-
204
130
  function Code2PatternComFond() {
205
131
  _classCallCheck(this, Code2PatternComFond);
206
-
207
132
  return _super.call(this, "^/SAISIE/(/NOMIN/)*(/REUNION/)*(/RAPPORT/)*$", {});
208
133
  }
209
-
210
134
  return _createClass(Code2PatternComFond);
211
135
  }(Code2Pattern);
212
-
213
136
  var LectureMapping = /*#__PURE__*/function () {
214
137
  function LectureMapping() {
215
138
  _classCallCheck(this, LectureMapping);
216
-
217
139
  _defineProperty(this, "libelle", {});
218
-
219
140
  _defineProperty(this, "codes", new Set());
220
141
  }
221
-
222
142
  _createClass(LectureMapping, [{
223
143
  key: "add",
224
144
  value: function add(acte) {
@@ -232,7 +152,6 @@ var LectureMapping = /*#__PURE__*/function () {
232
152
  value: function remap(acte, codeActe) {
233
153
  acte.codeActe = codeActe;
234
154
  var types = this.libelle[acte.libelleActe.nomCanonique];
235
-
236
155
  if (!(types.has("SN") && types.has("AN"))) {
237
156
  if (types.has("SN")) acte.libelleActe.nomCanonique += " (Sénat)";else if (types.has("AN")) acte.libelleActe.nomCanonique += " (Assemblée Nationale)";
238
157
  }
@@ -280,21 +199,15 @@ var LectureMapping = /*#__PURE__*/function () {
280
199
  return LectureMapping.map(acte.codeActe);
281
200
  }
282
201
  }]);
283
-
284
202
  return LectureMapping;
285
203
  }();
286
-
287
204
  _defineProperty(LectureMapping, "codes_lecture", ["AN1", "SN1", "ANNLEC", "SNNLEC", "ANLDEF", "AN2", "SN2", "SN3"]);
288
-
289
205
  _defineProperty(LectureMapping, "codes_lecture_regexp", new RegExp("^(?:" + LectureMapping.codes_lecture.join("|") + ")(-.*)?$"));
290
-
291
206
  var LectureMapper = /*#__PURE__*/function () {
292
207
  function LectureMapper() {
293
208
  _classCallCheck(this, LectureMapper);
294
-
295
209
  _defineProperty(this, "mapping", {});
296
210
  }
297
-
298
211
  _createClass(LectureMapper, [{
299
212
  key: "has",
300
213
  value: function has(codeActe) {
@@ -304,7 +217,6 @@ var LectureMapper = /*#__PURE__*/function () {
304
217
  key: "collect",
305
218
  value: function collect(acte) {
306
219
  var codeActe = LectureMapping.getCodeActe(acte);
307
-
308
220
  if (codeActe != undefined) {
309
221
  var lectures = this.mapping;
310
222
  if (!(codeActe in lectures)) lectures[codeActe] = new LectureMapping();
@@ -333,32 +245,20 @@ var LectureMapper = /*#__PURE__*/function () {
333
245
  return this.mapping[codeActe].getCodes();
334
246
  }
335
247
  }]);
336
-
337
248
  return LectureMapper;
338
249
  }();
339
-
340
250
  var ActesDocumentation = /*#__PURE__*/function () {
341
251
  function ActesDocumentation(sanityChecks) {
342
252
  var verbose = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
343
-
344
253
  _classCallCheck(this, ActesDocumentation);
345
-
346
254
  _defineProperty(this, "verbose", void 0);
347
-
348
255
  _defineProperty(this, "sanityChecks", void 0);
349
-
350
256
  _defineProperty(this, "lectureMapper", new LectureMapper());
351
-
352
257
  _defineProperty(this, "remappedProcedures", {});
353
-
354
258
  _defineProperty(this, "anchorsPrinted", {});
355
-
356
259
  _defineProperty(this, "anchors", new Set());
357
-
358
260
  _defineProperty(this, "codes", {});
359
-
360
261
  _defineProperty(this, "procedures", null);
361
-
362
262
  _defineProperty(this, "code2pattern", new Code2Pattern(null, {
363
263
  "Procédure législative": new Code2Pattern("^(((/lecture/)+)|((/lecture/)+/CMP/(/lecture/)*))(/CC/)?(/PROM/)?(/AN-APPLI/)?$", {
364
264
  lecture: new Code2Pattern("^(/DEPOT/)?(/DPTLETTRECT/)?(/ETI/)?(/AVCE/)?(/DGVT/)?(/ACIN/)?(/MOTION/)*(/PROCACC/)?(/COM/)?((/DEBATS/)+)?(/RTRINI/)?$", {
@@ -437,19 +337,16 @@ var ActesDocumentation = /*#__PURE__*/function () {
437
337
  lecture: new Code2Pattern("^(/DEPOT/)?$", {})
438
338
  })
439
339
  }));
440
-
441
340
  this.verbose = verbose;
442
341
  this.sanityChecks = sanityChecks;
443
342
  this.procedures = {};
444
343
  this.code2pattern._match_count_++;
445
344
  }
446
-
447
345
  _createClass(ActesDocumentation, [{
448
346
  key: "walkFiles",
449
347
  value: function walkFiles(data, action) {
450
348
  var _iterator2 = _createForOfIteratorHelper((0, _file_systems.getFiles)(data)),
451
- _step2;
452
-
349
+ _step2;
453
350
  try {
454
351
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
455
352
  var file = _step2.value;
@@ -468,7 +365,6 @@ var ActesDocumentation = /*#__PURE__*/function () {
468
365
  key: "collectFiles",
469
366
  value: function collectFiles(data) {
470
367
  var _this = this;
471
-
472
368
  this.walkFiles(data, function (_actes, actesLegislatifs, _c2p, _parent) {
473
369
  _this.collect(actesLegislatifs);
474
370
  });
@@ -477,7 +373,6 @@ var ActesDocumentation = /*#__PURE__*/function () {
477
373
  key: "processFiles",
478
374
  value: function processFiles(data) {
479
375
  var _this2 = this;
480
-
481
376
  this.walkFiles(data, function (actes, actesLegislatifs, c2p, parent) {
482
377
  _this2.merge(actes, actesLegislatifs, c2p, parent);
483
378
  });
@@ -487,15 +382,14 @@ var ActesDocumentation = /*#__PURE__*/function () {
487
382
  key: "remapActes",
488
383
  value: function remapActes(actes) {
489
384
  var results = [];
490
-
491
385
  var _iterator3 = _createForOfIteratorHelper(actes),
492
- _step3;
493
-
386
+ _step3;
494
387
  try {
495
388
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
496
389
  var acte = _step3.value;
497
- this.lectureMapper.remap(acte); // CC-SAISIE- suffix does not imply a hierarchy
390
+ this.lectureMapper.remap(acte);
498
391
 
392
+ // CC-SAISIE- suffix does not imply a hierarchy
499
393
  acte.codeActe = acte.codeActe.replace(/^CC-SAISIE.*/, "CC-SAISIE");
500
394
  results.push(acte);
501
395
  }
@@ -504,17 +398,14 @@ var ActesDocumentation = /*#__PURE__*/function () {
504
398
  } finally {
505
399
  _iterator3.f();
506
400
  }
507
-
508
401
  return results;
509
402
  }
510
403
  }, {
511
404
  key: "collectActes",
512
405
  value: function collectActes(actes) {
513
406
  var results = [];
514
-
515
407
  var _iterator4 = _createForOfIteratorHelper(actes),
516
- _step4;
517
-
408
+ _step4;
518
409
  try {
519
410
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
520
411
  var acte = _step4.value;
@@ -526,22 +417,21 @@ var ActesDocumentation = /*#__PURE__*/function () {
526
417
  } finally {
527
418
  _iterator4.f();
528
419
  }
529
-
530
420
  return results;
531
421
  }
532
422
  }, {
533
423
  key: "remapProcedure",
534
424
  value: function remapProcedure(procedure) {
535
425
  var merge_procedures = new Map([["Proposition de loi ordinaire", "Procédure législative"], ["Projet de loi ordinaire", "Procédure législative"], ["Projet de ratification des traités et conventions", "Procédure législative"], ["Projet ou proposition de loi organique", "Procédure législative"], ["Projet ou proposition de loi constitutionnelle", "Procédure législative"], ["Projet de loi de finances de l'année", "Procédure législative"], ["Projet de loi de finances rectificative", "Procédure législative"], ["Projet de loi de financement de la sécurité sociale", "Procédure législative"]]);
536
-
537
426
  if (merge_procedures.has(procedure)) {
538
427
  this.remappedProcedures[procedure] = null;
539
428
  return merge_procedures.get(procedure);
540
429
  } else {
541
430
  return procedure;
542
431
  }
543
- } // return the codeActes in the same order they appear in the regexp
432
+ }
544
433
 
434
+ // return the codeActes in the same order they appear in the regexp
545
435
  }, {
546
436
  key: "orderedCodes",
547
437
  value: function orderedCodes(codes, c2p, parent) {
@@ -576,7 +466,6 @@ var ActesDocumentation = /*#__PURE__*/function () {
576
466
  shortCode = shortCode.replace(/-(AN|SN)$/, "");
577
467
  this.codes[shortCode] = null;
578
468
  var name = acte.libelleActe.nomCanonique;
579
-
580
469
  if (!(code in actes)) {
581
470
  actes[code] = {
582
471
  type: acte.xsiType,
@@ -587,7 +476,6 @@ var ActesDocumentation = /*#__PURE__*/function () {
587
476
  } else {
588
477
  actes[code].name.add(name);
589
478
  }
590
-
591
479
  if ("actesLegislatifs" in acte) this.merge(actes[code].actes, acte.actesLegislatifs, c2p[code], code);
592
480
  }
593
481
  }, {
@@ -595,10 +483,8 @@ var ActesDocumentation = /*#__PURE__*/function () {
595
483
  value: function merge(actes, actesLegislatifs, c2p, parent) {
596
484
  var l = this.remapActes(actesLegislatifs);
597
485
  this.validateChronology(l, c2p, parent);
598
-
599
486
  var _iterator5 = _createForOfIteratorHelper(l),
600
- _step5;
601
-
487
+ _step5;
602
488
  try {
603
489
  for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
604
490
  var acte = _step5.value;
@@ -614,8 +500,7 @@ var ActesDocumentation = /*#__PURE__*/function () {
614
500
  key: "collect",
615
501
  value: function collect(actesLegislatifs) {
616
502
  var _iterator6 = _createForOfIteratorHelper(this.collectActes(actesLegislatifs)),
617
- _step6;
618
-
503
+ _step6;
619
504
  try {
620
505
  for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
621
506
  var acte = _step6.value;
@@ -631,12 +516,10 @@ var ActesDocumentation = /*#__PURE__*/function () {
631
516
  key: "validateLevel",
632
517
  value: function validateLevel(c2p, path) {
633
518
  (0, _assert["default"])(c2p._match_count_ > 0, "".concat(path, " is never used"));
634
-
635
519
  for (var _i3 = 0, _arr = Object.entries(c2p); _i3 < _arr.length; _i3++) {
636
520
  var _arr$_i = _slicedToArray(_arr[_i3], 2),
637
- key = _arr$_i[0],
638
- value = _arr$_i[1];
639
-
521
+ key = _arr$_i[0],
522
+ value = _arr$_i[1];
640
523
  if (value != null && value.constructor.name == "Code2Pattern") this.validateLevel(value, path.concat([key]));
641
524
  }
642
525
  }
@@ -684,10 +567,8 @@ var ActesDocumentation = /*#__PURE__*/function () {
684
567
  key: "printLevel",
685
568
  value: function printLevel(actes, sections, c2p, parent) {
686
569
  var keys = this.orderedCodes(Object.keys(actes), c2p, parent);
687
-
688
570
  var _iterator7 = _createForOfIteratorHelper(keys),
689
- _step7;
690
-
571
+ _step7;
691
572
  try {
692
573
  for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
693
574
  var key = _step7.value;
@@ -736,12 +617,10 @@ var ActesDocumentation = /*#__PURE__*/function () {
736
617
  key: "print",
737
618
  value: function print() {
738
619
  this.anchorsPrinted = {};
739
-
740
620
  for (var _i6 = 0, _arr2 = Object.entries(this.procedures); _i6 < _arr2.length; _i6++) {
741
621
  var _arr2$_i = _slicedToArray(_arr2[_i6], 2),
742
- key = _arr2$_i[0],
743
- actes = _arr2$_i[1];
744
-
622
+ key = _arr2$_i[0],
623
+ actes = _arr2$_i[1];
745
624
  var code = key.replace(/ +/g, "_");
746
625
  this.codes[code] = null;
747
626
  var aggregated = this.getAggregated(key);
@@ -751,15 +630,12 @@ var ActesDocumentation = /*#__PURE__*/function () {
751
630
  console.log(underline);
752
631
  this.printLevel(actes, "-~.'", this.code2pattern[key], null);
753
632
  }
754
-
755
633
  this.printCodes();
756
634
  this.printAnchorsIndex();
757
635
  }
758
636
  }]);
759
-
760
637
  return ActesDocumentation;
761
638
  }();
762
-
763
639
  function main(argv) {
764
640
  var options = parseArgs(argv);
765
641
  if (options === null) return 1;
@@ -769,8 +645,7 @@ function main(argv) {
769
645
  doc.print();
770
646
  return 0;
771
647
  }
772
- /* istanbul ignore if */
773
-
774
648
 
649
+ /* istanbul ignore if */
775
650
  if (process.argv[1].endsWith("document_dossiers_legislatifs.ts")) process.exit(main(process.argv));
776
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0T3B0aW9uIiwibXVsdGlwbGUiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJzZWN0aW9ucyIsImhlYWRlciIsImNvbnRlbnQiLCJvcHRpb25MaXN0Iiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNvbnNvbGUiLCJlcnJvciIsImhlbHAiLCJ1c2FnZSIsImNvbW1hbmRMaW5lVXNhZ2UiLCJ3YXJuIiwiZXFTZXQiLCJhcyIsImJzIiwic2l6ZSIsImEiLCJoYXMiLCJDb2RlMlBhdHRlcm4iLCJwYXR0ZXJuIiwiY2hpbGRyZW4iLCJfcGF0dGVybl8iLCJfbWF0Y2hfY291bnRfIiwiT2JqZWN0IiwiYXNzaWduIiwiQ29kZTJQYXR0ZXJuQ29tRm9uZCIsIkxlY3R1cmVNYXBwaW5nIiwiU2V0IiwiYWN0ZSIsImNvZGVzIiwiYWRkIiwiY29kZUFjdGUiLCJnZXRUeXBlIiwibGliZWxsZUFjdGUiLCJub21DYW5vbmlxdWUiLCJsaWJlbGxlIiwidHlwZXMiLCJBcnJheSIsImZyb20iLCJjIiwiY29kZSIsImxvZyIsImpvaW4iLCJtYXRjaCIsImNvZGVzX2xlY3R1cmVfcmVnZXhwIiwiRXJyb3IiLCJyZXBsYWNlIiwiaXNMZWN0dXJlIiwibWFwIiwiUmVnRXhwIiwiY29kZXNfbGVjdHVyZSIsIkxlY3R1cmVNYXBwZXIiLCJtYXBwaW5nIiwiZ2V0Q29kZUFjdGUiLCJ1bmRlZmluZWQiLCJsZWN0dXJlcyIsInJlbWFwIiwibWVyZ2VDb2RlcyIsInByaW50QW5jaG9ycyIsImdldENvZGVzIiwiQWN0ZXNEb2N1bWVudGF0aW9uIiwic2FuaXR5Q2hlY2tzIiwidmVyYm9zZSIsImxlY3R1cmUiLCJDTVAiLCJDQyIsIlBST00iLCJBTjIxIiwiQU5MVU5JIiwiUsOpc29sdXRpb24iLCJBTjIwIiwiRVUiLCJJbW11bml0w6kiLCJwcm9jZWR1cmVzIiwiY29kZTJwYXR0ZXJuIiwiZGF0YSIsImFjdGlvbiIsImdldEZpbGVzIiwiZmlsZSIsImRvc3NpZXIiLCJsb2FkIiwicHJvY2VkdXJlIiwicmVtYXBQcm9jZWR1cmUiLCJwcm9jZWR1cmVQYXJsZW1lbnRhaXJlIiwiYWN0ZXNMZWdpc2xhdGlmcyIsIndhbGtGaWxlcyIsIl9hY3RlcyIsIl9jMnAiLCJfcGFyZW50IiwiY29sbGVjdCIsImFjdGVzIiwiYzJwIiwicGFyZW50IiwibWVyZ2UiLCJ2YWxpZGF0ZSIsInJlc3VsdHMiLCJsZWN0dXJlTWFwcGVyIiwicHVzaCIsIm1lcmdlX3Byb2NlZHVyZXMiLCJNYXAiLCJyZW1hcHBlZFByb2NlZHVyZXMiLCJnZXQiLCJvcmRlcmVkIiwieCIsImFzc2VydCIsInNlcXVlbmNlIiwic2hvcnRDb2RlIiwieHNpVHlwZSIsImwiLCJyZW1hcEFjdGVzIiwidmFsaWRhdGVDaHJvbm9sb2d5IiwibWVyZ2VBY3RlIiwiY29sbGVjdEFjdGVzIiwicGF0aCIsImVudHJpZXMiLCJrZXkiLCJ2YWx1ZSIsImNvbnN0cnVjdG9yIiwidmFsaWRhdGVMZXZlbCIsImNvbmNhdCIsImVudHJ5IiwidGl0bGUiLCJ1bmRlcmxpbmUiLCJsZW5ndGgiLCJhbmNob3JzUHJpbnRlZCIsImFuY2hvcnMiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJrZXlzIiwib3JkZXJlZENvZGVzIiwicmVuYW1lQ01QIiwiYWRkQW5jaG9ycyIsInByaW50RW50cnkiLCJwcmludExldmVsIiwic3Vic3RyaW5nIiwicmVtYXBwZWQiLCJhZ2dyZWdhdGVkIiwiZ2V0QWdncmVnYXRlZCIsInByaW50Q29kZXMiLCJwcmludEFuY2hvcnNJbmRleCIsIm1haW4iLCJkb2MiLCJjb2xsZWN0RmlsZXMiLCJwcm9jZXNzRmlsZXMiLCJwcmludCIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZG9jdW1lbnRfZG9zc2llcnNfbGVnaXNsYXRpZnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lVXNhZ2UgZnJvbSBcImNvbW1hbmQtbGluZS11c2FnZVwiXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgbG9hZCwgZ2V0RmlsZXMgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInBhdGhuYW1lIHRvIGEgSlNPTiBmaWxlIG9yIGEgZ2xvYiBwYXR0ZXJuIHRvIEpTT04gZmlsZXNcIixcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJuby1zYW5pdHktY2hlY2tzXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVzY3JpcHRpb246IFwiRG8gbm90IHBlcmZvcm0gc2FuaXR5IGNoZWNrcy5cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlc2NyaXB0aW9uOiBcImluY3JlYXNlIHZlcmJvc2l0eVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJoZWxwXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQcmludCB0aGlzIHVzYWdlIGd1aWRlLlwiLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAge1xuICAgICAgaGVhZGVyOiBcIkFpZGUgw6AgbGEgZG9jdW1lbnRhdGlvbiBkdSBkb3NzaWVyIGzDqWdpc2xhdGlmXCIsXG4gICAgICBjb250ZW50OiBcIkfDqW7DqHJlIHVuZSBoacOpcmFyY2hpZSBkZXMgYWN0ZXMgbMOpZ2lzbGF0aWZzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiT3B0aW9uc1wiLFxuICAgICAgb3B0aW9uTGlzdDogb3B0aW9uc0RlZmluaXRpb25zLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICBpZiAoIShcImhlbHBcIiBpbiBvcHRpb25zKSAmJiAhKFwiZGF0YVwiIGluIG9wdGlvbnMpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi0tZGF0YSBpcyBtYW5kYXRvcnlcIilcbiAgICBvcHRpb25zLmhlbHAgPSB0cnVlXG4gIH1cbiAgaWYgKFwiaGVscFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2FnZSA9IGNvbW1hbmRMaW5lVXNhZ2Uoc2VjdGlvbnMpXG4gICAgY29uc29sZS53YXJuKHVzYWdlKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gZXFTZXQoYXM6IFNldDxzdHJpbmc+LCBiczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKGFzLnNpemUgIT09IGJzLnNpemUpIHJldHVybiBmYWxzZVxuICBmb3IgKHZhciBhIG9mIGFzKSBpZiAoIWJzLmhhcyhhKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmNsYXNzIENvZGUyUGF0dGVybiB7XG4gIF9wYXR0ZXJuXzogYW55XG4gIF9tYXRjaF9jb3VudF86IG51bWJlclxuICBjb25zdHJ1Y3RvcihwYXR0ZXJuOiBhbnksIGNoaWxkcmVuOiBhbnkpIHtcbiAgICB0aGlzLl9wYXR0ZXJuXyA9IHBhdHRlcm5cbiAgICB0aGlzLl9tYXRjaF9jb3VudF8gPSAwXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjaGlsZHJlbilcbiAgfVxufVxuXG5jbGFzcyBDb2RlMlBhdHRlcm5Db21Gb25kIGV4dGVuZHMgQ29kZTJQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJeL1NBSVNJRS8oL05PTUlOLykqKC9SRVVOSU9OLykqKC9SQVBQT1JULykqJFwiLCB7fSlcbiAgfVxufVxuXG5jbGFzcyBMZWN0dXJlTWFwcGluZyB7XG4gIGxpYmVsbGU6IGFueSA9IHt9XG4gIGNvZGVzOiBhbnkgPSBuZXcgU2V0KClcblxuICBzdGF0aWMgY29kZXNfbGVjdHVyZTogc3RyaW5nW10gPSBbXG4gICAgXCJBTjFcIixcbiAgICBcIlNOMVwiLFxuICAgIFwiQU5OTEVDXCIsXG4gICAgXCJTTk5MRUNcIixcbiAgICBcIkFOTERFRlwiLFxuICAgIFwiQU4yXCIsXG4gICAgXCJTTjJcIixcbiAgICBcIlNOM1wiLFxuICBdXG4gIHN0YXRpYyBjb2Rlc19sZWN0dXJlX3JlZ2V4cDogYW55ID0gbmV3IFJlZ0V4cChcbiAgICBcIl4oPzpcIiArIExlY3R1cmVNYXBwaW5nLmNvZGVzX2xlY3R1cmUuam9pbihcInxcIikgKyBcIikoLS4qKT8kXCIsXG4gIClcblxuICBzdGF0aWMgaXNMZWN0dXJlKGFjdGU6IGFueSkge1xuICAgIHJldHVybiBhY3RlLmNvZGVBY3RlLm1hdGNoKExlY3R1cmVNYXBwaW5nLmNvZGVzX2xlY3R1cmVfcmVnZXhwKVxuICB9XG5cbiAgc3RhdGljIGdldFR5cGUoYWN0ZTogYW55KSB7XG4gICAgaWYgKGFjdGUuY29kZUFjdGUubWF0Y2goL15BTi8pKSByZXR1cm4gXCJBTlwiXG4gICAgZWxzZSBpZiAoYWN0ZS5jb2RlQWN0ZS5tYXRjaCgvXlNOLykpIHJldHVybiBcIlNOXCJcbiAgICBlbHNlIHRocm93IEVycm9yKGAke2FjdGUuY29kZUFjdGV9IGRvZXMgbm90IHN0YXJ0IHdpdGggQU4gb3IgU05gKVxuICB9XG5cbiAgc3RhdGljIG1hcChjb2RlQWN0ZTogYW55KSB7XG4gICAgcmV0dXJuIGNvZGVBY3RlLnJlcGxhY2UoTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZV9yZWdleHAsIGBsZWN0dXJlJDFgKVxuICB9XG5cbiAgc3RhdGljIGdldENvZGVBY3RlKGFjdGU6IGFueSkge1xuICAgIGlmICghTGVjdHVyZU1hcHBpbmcuaXNMZWN0dXJlKGFjdGUpKSByZXR1cm5cblxuICAgIHJldHVybiBMZWN0dXJlTWFwcGluZy5tYXAoYWN0ZS5jb2RlQWN0ZSlcbiAgfVxuXG4gIGFkZChhY3RlOiBhbnkpIHtcbiAgICB0aGlzLmNvZGVzLmFkZChhY3RlLmNvZGVBY3RlKVxuXG4gICAgY29uc3QgdHlwZSA9IExlY3R1cmVNYXBwaW5nLmdldFR5cGUoYWN0ZSlcblxuICAgIGlmICghKGFjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlIGluIHRoaXMubGliZWxsZSkpXG4gICAgICB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdID0gbmV3IFNldCgpXG4gICAgdGhpcy5saWJlbGxlW2FjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlXS5hZGQodHlwZSlcbiAgfVxuXG4gIHJlbWFwKGFjdGU6IGFueSwgY29kZUFjdGU6IHN0cmluZykge1xuICAgIGFjdGUuY29kZUFjdGUgPSBjb2RlQWN0ZVxuXG4gICAgbGV0IHR5cGVzID0gdGhpcy5saWJlbGxlW2FjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlXVxuICAgIGlmICghKHR5cGVzLmhhcyhcIlNOXCIpICYmIHR5cGVzLmhhcyhcIkFOXCIpKSkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhcIlNOXCIpKSBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZSArPSBcIiAoU8OpbmF0KVwiXG4gICAgICBlbHNlIGlmICh0eXBlcy5oYXMoXCJBTlwiKSlcbiAgICAgICAgYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWUgKz0gXCIgKEFzc2VtYmzDqWUgTmF0aW9uYWxlKVwiXG4gICAgfVxuICB9XG5cbiAgbWVyZ2VDb2Rlcyhjb2RlczogYW55KSB7XG4gICAgZm9yIChjb25zdCBjIG9mIEFycmF5LmZyb20odGhpcy5jb2RlcykpIGNvZGVzLmFkZChjKVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKCkge1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBBcnJheS5mcm9tKHRoaXMuY29kZXMpKSBjb25zb2xlLmxvZyhgLi4gXyR7Y29kZX06YClcbiAgfVxuXG4gIGdldENvZGVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29kZXMpLmpvaW4oXCIsXCIpXG4gIH1cbn1cblxuY2xhc3MgTGVjdHVyZU1hcHBlciB7XG4gIG1hcHBpbmc6IGFueSA9IHt9XG5cbiAgaGFzKGNvZGVBY3RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29kZUFjdGUgaW4gdGhpcy5tYXBwaW5nXG4gIH1cblxuICBjb2xsZWN0KGFjdGU6IGFueSkge1xuICAgIGNvbnN0IGNvZGVBY3RlID0gTGVjdHVyZU1hcHBpbmcuZ2V0Q29kZUFjdGUoYWN0ZSlcbiAgICBpZiAoY29kZUFjdGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgbGVjdHVyZXMgPSB0aGlzLm1hcHBpbmdcbiAgICAgIGlmICghKGNvZGVBY3RlIGluIGxlY3R1cmVzKSkgbGVjdHVyZXNbY29kZUFjdGVdID0gbmV3IExlY3R1cmVNYXBwaW5nKClcbiAgICAgIGxlY3R1cmVzW2NvZGVBY3RlXS5hZGQoYWN0ZSlcbiAgICB9XG4gIH1cblxuICByZW1hcChhY3RlOiBhbnkpIHtcbiAgICBjb25zdCBjb2RlQWN0ZSA9IExlY3R1cmVNYXBwaW5nLmdldENvZGVBY3RlKGFjdGUpXG4gICAgaWYgKGNvZGVBY3RlICE9IHVuZGVmaW5lZCkgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5yZW1hcChhY3RlLCBjb2RlQWN0ZSlcbiAgfVxuXG4gIG1lcmdlQ29kZXMoY29kZXM6IGFueSwgY29kZUFjdGU6IHN0cmluZykge1xuICAgIHRoaXMubWFwcGluZ1tjb2RlQWN0ZV0ubWVyZ2VDb2Rlcyhjb2RlcylcbiAgfVxuXG4gIHByaW50QW5jaG9ycyhjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5wcmludEFuY2hvcnMoKVxuICB9XG5cbiAgZ2V0Q29kZXMoY29kZUFjdGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLmdldENvZGVzKClcbiAgfVxufVxuXG5jbGFzcyBBY3Rlc0RvY3VtZW50YXRpb24ge1xuICB2ZXJib3NlOiBib29sZWFuXG4gIHNhbml0eUNoZWNrczogYm9vbGVhblxuICBsZWN0dXJlTWFwcGVyOiBhbnkgPSBuZXcgTGVjdHVyZU1hcHBlcigpXG4gIHJlbWFwcGVkUHJvY2VkdXJlczogYW55ID0ge31cbiAgYW5jaG9yc1ByaW50ZWQ6IGFueSA9IHt9XG4gIGFuY2hvcnM6IGFueSA9IG5ldyBTZXQoKVxuICBjb2RlczogYW55ID0ge31cbiAgcHJvY2VkdXJlczogYW55ID0gbnVsbFxuICBjb2RlMnBhdHRlcm46IGFueSA9IG5ldyBDb2RlMlBhdHRlcm4obnVsbCwge1xuICAgIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXigoKC9sZWN0dXJlLykrKXwoKC9sZWN0dXJlLykrL0NNUC8oL2xlY3R1cmUvKSopKSgvQ0MvKT8oL1BST00vKT8oL0FOLUFQUExJLyk/JFwiLFxuICAgICAge1xuICAgICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvREVQT1QvKT8oL0RQVExFVFRSRUNULyk/KC9FVEkvKT8oL0FWQ0UvKT8oL0RHVlQvKT8oL0FDSU4vKT8oL01PVElPTi8pKigvUFJPQ0FDQy8pPygvQ09NLyk/KCgvREVCQVRTLykrKT8oL1JUUklOSS8pPyRcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxlY3R1cmUtQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9GT05EL3wvQVZJUy8pKyRcIiwge1xuICAgICAgICAgICAgICBcImxlY3R1cmUtQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICAgICAgXCJsZWN0dXJlLUNPTS1BVklTXCI6IG5ldyBDb2RlMlBhdHRlcm5Db21Gb25kKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFwibGVjdHVyZS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgICAgXCJeKC9TRUFOQ0UvKSooKC9NT1RJT04vKT8oL01PVElPTi1WT1RFLykrKT8oL0RFQy8pPyRcIixcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIENNUDogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICBcIl4oL0RFUE9UL3wvU0FJU0lFLyl7MSwyfSgvQ09NLyk/KC9ERUMvKT8oL0RFQkFUUy1BTi8vREVCQVRTLVNOLyk/XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJDTVAtQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgICAgIFwiXigvTk9NSU4vKT8oL1JBUFBPUlQtQU4vfC9SQVBQT1JULVNOLyl7Mn0kXCIsXG4gICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFwiQ01QLURFQkFUUy1BTlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgICAgICAgIFwiQ01QLURFQkFUUy1TTlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBDQzogbmV3IENvZGUyUGF0dGVybihcIl4oL1NBSVNJRS8pKygvQ09OQ0xVU0lPTi8pPyRcIiwge30pLFxuICAgICAgICBQUk9NOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUFVCLyk/JFwiLCB7fSksXG4gICAgICAgIFwiQU4tQVBQTElcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1JBUFBPUlQvKT8kXCIsIHt9KSxcbiAgICAgIH0sXG4gICAgKSxcbiAgICBcIkFsbG9jdXRpb24gZHUgUHLDqXNpZGVudCBkZSBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vQU4yMS8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjE6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BUEFOLyk/JFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJSw6lzb2x1dGlvbiBBcnRpY2xlIDM0LTFcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOTFVOSS8pPyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0RFQkFUUy8pPygvUlRSSU5JLyk/JFwiLCB7XG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykrKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFLDqXNvbHV0aW9uOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLyk/KC9DQy8pPyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTL3wvUlRSSU5JLyk/JFwiLCB7XG4gICAgICAgIFwiQU5MVU5JLUNPTVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQ0FFLyk/KC9GT05ELyk/JFwiLCB7XG4gICAgICAgICAgXCJBTkxVTkktQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICBcIkFOTFVOSS1DT00tQ0FFXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgICBcIl4oL1NBSVNJRS8pPygvTk9NSU4vKT8oL1JFVU5JT04vKT8oL1JBUFBPUlQvKT8oL0RFQy8pPyRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcIkFOTFVOSS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pKigvREVDLyk/JFwiLCB7fSksXG4gICAgICB9KSxcbiAgICAgIENDOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0FJU0lFLyk/KC9DT05DTFVTSU9OLyk/JFwiLCB7fSksXG4gICAgfSksXG4gICAgXCJSYXBwb3J0IGQnaW5mb3JtYXRpb24gc2FucyBtaXNzaW9uXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4oL0FOMjAvKT8oL0VVLyk/JFwiLFxuICAgICAge1xuICAgICAgICBBTjIwOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUkFQUE9SVC8pPyRcIiwge30pLFxuICAgICAgICBFVTogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFQy8pKyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiTWlzc2lvbiBkJ2luZm9ybWF0aW9uXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BTjIwLyk/JFwiLCB7XG4gICAgICBBTjIwOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvTUlTSU5GLyk/JFwiLCB7XG4gICAgICAgIFwiQU4yMC1NSVNJTkZcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICBcIl4oL0NSRUEvKT8oL05PTUlOLyk/KC9SQVBQT1JULyk/JFwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgXCJDb21taXNzaW9uIGQnZW5xdcOqdGVcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOMjAvKT8kXCIsIHtcbiAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9DT01FTlEvKT8kXCIsIHtcbiAgICAgICAgXCJBTjIwLUNPTUVOUVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvQ1JFQS8pPygvTk9NSU4vKT8oL1JBUFBPUlQvKT8kXCIsXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBcIkVuZ2FnZW1lbnQgZGUgbGEgcmVzcG9uc2FiaWxpdMOpIGdvdXZlcm5lbWVudGFsZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeL0FOMjEvJFwiLFxuICAgICAge1xuICAgICAgICBBTjIxOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigoKC9NT1RJT04vKSovREVCQVRTLyl8KC9ER1ZULykpezEsMn0kXCIsIHtcbiAgICAgICAgICBcIkFOMjEtREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL01PVElPTi1WT1RFLykqJFwiLCB7fSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiTW90aW9uIHLDqWbDqXJlbmRhaXJlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9sZWN0dXJlLykrJFwiLCB7XG4gICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTLyk/JFwiLCB7XG4gICAgICAgIFwibGVjdHVyZS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcImxlY3R1cmUtQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pKigvUkFQUE9SVC8pKiRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcImxlY3R1cmUtREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIEltbXVuaXTDqTogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOTFVOSS8pKyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTLyk/KC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9GT05ELyk/JFwiLCB7XG4gICAgICAgICAgXCJBTkxVTkktQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pKigvUkFQUE9SVC8pKiRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcIkFOTFVOSS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pPygvREVDLykkXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFwiUmVzcG9uc2FiaWxpdMOpIHDDqW5hbGUgZHUgcHLDqXNpZGVudCBkZSBsYSByw6lwdWJsaXF1ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeL2xlY3R1cmUvJFwiLFxuICAgICAge1xuICAgICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL1JFQ0JVUkVBVS8pPyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiUHJvcG9zaXRpb24gZGUgbG9pIHByw6lzZW50w6llIGVuIGFwcGxpY2F0aW9uIGRlIGwnYXJ0aWNsZSAxMSBkZSBsYSBDb25zdGl0dXRpb25cIjpcbiAgICAgIG5ldyBDb2RlMlBhdHRlcm4oXCJeL2xlY3R1cmUvJFwiLCB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPyRcIiwge30pLFxuICAgICAgfSksXG4gIH0pXG5cbiAgY29uc3RydWN0b3Ioc2FuaXR5Q2hlY2tzOiBib29sZWFuLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlXG4gICAgdGhpcy5zYW5pdHlDaGVja3MgPSBzYW5pdHlDaGVja3NcbiAgICB0aGlzLnByb2NlZHVyZXMgPSB7fVxuICAgIHRoaXMuY29kZTJwYXR0ZXJuLl9tYXRjaF9jb3VudF8rK1xuICB9XG5cbiAgd2Fsa0ZpbGVzKGRhdGE6IHN0cmluZ1tdLCBhY3Rpb246IGFueSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBnZXRGaWxlcyhkYXRhKSkge1xuICAgICAgY29uc3QgZG9zc2llciA9IGxvYWQoZmlsZSlcbiAgICAgIGxldCBwcm9jZWR1cmU6IHN0cmluZyA9IHRoaXMucmVtYXBQcm9jZWR1cmUoXG4gICAgICAgIGRvc3NpZXIucHJvY2VkdXJlUGFybGVtZW50YWlyZS5saWJlbGxlLFxuICAgICAgKVxuICAgICAgaWYgKCEocHJvY2VkdXJlIGluIHRoaXMucHJvY2VkdXJlcykpIHRoaXMucHJvY2VkdXJlc1twcm9jZWR1cmVdID0ge31cbiAgICAgIGFjdGlvbihcbiAgICAgICAgdGhpcy5wcm9jZWR1cmVzW3Byb2NlZHVyZV0sXG4gICAgICAgIGRvc3NpZXIuYWN0ZXNMZWdpc2xhdGlmcyxcbiAgICAgICAgdGhpcy5jb2RlMnBhdHRlcm5bcHJvY2VkdXJlXSxcbiAgICAgICAgbnVsbCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb2xsZWN0RmlsZXMoZGF0YTogc3RyaW5nW10pIHtcbiAgICB0aGlzLndhbGtGaWxlcyhcbiAgICAgIGRhdGEsXG4gICAgICAoX2FjdGVzOiBhbnksIGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgX2MycDogYW55LCBfcGFyZW50OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0KGFjdGVzTGVnaXNsYXRpZnMpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHByb2Nlc3NGaWxlcyhkYXRhOiBzdHJpbmdbXSkge1xuICAgIHRoaXMud2Fsa0ZpbGVzKFxuICAgICAgZGF0YSxcbiAgICAgIChhY3RlczogYW55LCBhY3Rlc0xlZ2lzbGF0aWZzOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1lcmdlKGFjdGVzLCBhY3Rlc0xlZ2lzbGF0aWZzLCBjMnAsIHBhcmVudClcbiAgICAgIH0sXG4gICAgKVxuICAgIGlmICh0aGlzLnNhbml0eUNoZWNrcykgdGhpcy52YWxpZGF0ZSgpXG4gIH1cblxuICByZW1hcEFjdGVzKGFjdGVzOiBhbnkpOiBhbnkge1xuICAgIGxldCByZXN1bHRzID0gW11cbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgYWN0ZXMpIHtcbiAgICAgIHRoaXMubGVjdHVyZU1hcHBlci5yZW1hcChhY3RlKVxuXG4gICAgICAvLyBDQy1TQUlTSUUtIHN1ZmZpeCBkb2VzIG5vdCBpbXBseSBhIGhpZXJhcmNoeVxuICAgICAgYWN0ZS5jb2RlQWN0ZSA9IGFjdGUuY29kZUFjdGUucmVwbGFjZSgvXkNDLVNBSVNJRS4qLywgXCJDQy1TQUlTSUVcIilcblxuICAgICAgcmVzdWx0cy5wdXNoKGFjdGUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICBjb2xsZWN0QWN0ZXMoYWN0ZXM6IGFueSk6IGFueSB7XG4gICAgbGV0IHJlc3VsdHMgPSBbXVxuICAgIGZvciAoY29uc3QgYWN0ZSBvZiBhY3Rlcykge1xuICAgICAgdGhpcy5sZWN0dXJlTWFwcGVyLmNvbGxlY3QoYWN0ZSlcblxuICAgICAgcmVzdWx0cy5wdXNoKGFjdGUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICByZW1hcFByb2NlZHVyZShwcm9jZWR1cmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWVyZ2VfcHJvY2VkdXJlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoW1xuICAgICAgW1wiUHJvcG9zaXRpb24gZGUgbG9pIG9yZGluYWlyZVwiLCBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCJdLFxuICAgICAgW1wiUHJvamV0IGRlIGxvaSBvcmRpbmFpcmVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgZGUgcmF0aWZpY2F0aW9uIGRlcyB0cmFpdMOpcyBldCBjb252ZW50aW9uc1wiLFxuICAgICAgICBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIsXG4gICAgICBdLFxuICAgICAgW1wiUHJvamV0IG91IHByb3Bvc2l0aW9uIGRlIGxvaSBvcmdhbmlxdWVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgb3UgcHJvcG9zaXRpb24gZGUgbG9pIGNvbnN0aXR1dGlvbm5lbGxlXCIsXG4gICAgICAgIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIixcbiAgICAgIF0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VzIGRlIGwnYW5uw6llXCIsIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIl0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VzIHJlY3RpZmljYXRpdmVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VtZW50IGRlIGxhIHPDqWN1cml0w6kgc29jaWFsZVwiLFxuICAgICAgICBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIsXG4gICAgICBdLFxuICAgIF0pXG4gICAgaWYgKG1lcmdlX3Byb2NlZHVyZXMuaGFzKHByb2NlZHVyZSkpIHtcbiAgICAgIHRoaXMucmVtYXBwZWRQcm9jZWR1cmVzW3Byb2NlZHVyZV0gPSBudWxsXG4gICAgICByZXR1cm4gbWVyZ2VfcHJvY2VkdXJlcy5nZXQocHJvY2VkdXJlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvY2VkdXJlXG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIHRoZSBjb2RlQWN0ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHJlZ2V4cFxuICBvcmRlcmVkQ29kZXMoY29kZXM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICAgIGNvZGVzID0gbmV3IFNldChjb2RlcylcbiAgICBpZiAoIXRoaXMuc2FuaXR5Q2hlY2tzKSByZXR1cm4gY29kZXNcbiAgICBsZXQgb3JkZXJlZCA9IGMycFtcIl9wYXR0ZXJuX1wiXS5tYXRjaChuZXcgUmVnRXhwKFwiLy4qPy9cIiwgXCJnXCIpKVxuICAgIG9yZGVyZWQgPSBvcmRlcmVkLm1hcCgoeDogc3RyaW5nKSA9PiB4LnJlcGxhY2UobmV3IFJlZ0V4cChcIi8oLiopL1wiKSwgXCIkMVwiKSlcbiAgICBpZiAocGFyZW50ICE9IG51bGwpIG9yZGVyZWQgPSBvcmRlcmVkLm1hcCgoeDogc3RyaW5nKSA9PiBgJHtwYXJlbnR9LSR7eH1gKVxuICAgIG9yZGVyZWQgPSBuZXcgU2V0KG9yZGVyZWQpXG4gICAgYXNzZXJ0KGVxU2V0KG9yZGVyZWQsIGNvZGVzKSwgYCR7Wy4uLm9yZGVyZWRdfSAhPSAke1suLi5jb2Rlc119YClcbiAgICByZXR1cm4gb3JkZXJlZFxuICB9XG5cbiAgdmFsaWRhdGVDaHJvbm9sb2d5KGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IGMycFtcIl9wYXR0ZXJuX1wiXVxuICAgIGNvbnN0IHNlcXVlbmNlID0gYWN0ZXNMZWdpc2xhdGlmc1xuICAgICAgLm1hcCgoeDogYW55KSA9PiBgLyR7eC5jb2RlQWN0ZX0vYC5yZXBsYWNlKGAvJHtwYXJlbnR9LWAsIFwiL1wiKSlcbiAgICAgIC5qb2luKFwiXCIpXG4gICAgYXNzZXJ0KFxuICAgICAgc2VxdWVuY2UubWF0Y2gobmV3IFJlZ0V4cChwYXR0ZXJuKSksXG4gICAgICBgJHtwYXR0ZXJufSBkb2VzIG5vdCBtYXRjaCAke3NlcXVlbmNlfWAsXG4gICAgKVxuICAgIGMycC5fbWF0Y2hfY291bnRfKytcbiAgfVxuXG4gIG1lcmdlQWN0ZShhY3RlczogYW55LCBhY3RlOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBhY3RlLmNvZGVBY3RlXG4gICAgbGV0IHNob3J0Q29kZTogc3RyaW5nID0gY29kZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke3BhcmVudH0tYCksIFwiXCIpXG4gICAgc2hvcnRDb2RlID0gc2hvcnRDb2RlLnJlcGxhY2UoLy0oQU58U04pJC8sIFwiXCIpXG4gICAgdGhpcy5jb2Rlc1tzaG9ydENvZGVdID0gbnVsbFxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZVxuICAgIGlmICghKGNvZGUgaW4gYWN0ZXMpKSB7XG4gICAgICBhY3Rlc1tjb2RlXSA9IHtcbiAgICAgICAgdHlwZTogYWN0ZS54c2lUeXBlLFxuICAgICAgICBuYW1lOiBuZXcgU2V0KFtuYW1lXSksXG4gICAgICAgIHNob3J0Q29kZTogc2hvcnRDb2RlLFxuICAgICAgICBhY3Rlczoge30sXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGVzW2NvZGVdLm5hbWUuYWRkKG5hbWUpXG4gICAgfVxuICAgIGlmIChcImFjdGVzTGVnaXNsYXRpZnNcIiBpbiBhY3RlKVxuICAgICAgdGhpcy5tZXJnZShhY3Rlc1tjb2RlXS5hY3RlcywgYWN0ZS5hY3Rlc0xlZ2lzbGF0aWZzLCBjMnBbY29kZV0sIGNvZGUpXG4gIH1cblxuICBtZXJnZShhY3RlczogYW55LCBhY3Rlc0xlZ2lzbGF0aWZzOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGwgPSB0aGlzLnJlbWFwQWN0ZXMoYWN0ZXNMZWdpc2xhdGlmcylcbiAgICB0aGlzLnZhbGlkYXRlQ2hyb25vbG9neShsLCBjMnAsIHBhcmVudClcbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgbCkgdGhpcy5tZXJnZUFjdGUoYWN0ZXMsIGFjdGUsIGMycCwgcGFyZW50KVxuICB9XG5cbiAgY29sbGVjdChhY3Rlc0xlZ2lzbGF0aWZzOiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgdGhpcy5jb2xsZWN0QWN0ZXMoYWN0ZXNMZWdpc2xhdGlmcykpXG4gICAgICBpZiAoXCJhY3Rlc0xlZ2lzbGF0aWZzXCIgaW4gYWN0ZSkgdGhpcy5jb2xsZWN0KGFjdGUuYWN0ZXNMZWdpc2xhdGlmcylcbiAgfVxuXG4gIHZhbGlkYXRlTGV2ZWwoYzJwOiBhbnksIHBhdGg6IGFueSkge1xuICAgIGFzc2VydChjMnAuX21hdGNoX2NvdW50XyA+IDAsIGAke3BhdGh9IGlzIG5ldmVyIHVzZWRgKVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGMycCkgYXMgW3N0cmluZywgYW55XVtdKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09IFwiQ29kZTJQYXR0ZXJuXCIpXG4gICAgICAgIHRoaXMudmFsaWRhdGVMZXZlbCh2YWx1ZSwgcGF0aC5jb25jYXQoW2tleV0pKVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRoaXMudmFsaWRhdGVMZXZlbCh0aGlzLmNvZGUycGF0dGVybiwgW10pXG4gIH1cblxuICBwcmludEVudHJ5KHNlY3Rpb25zOiBzdHJpbmcsIGVudHJ5OiBzdHJpbmcsIGNvZGVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0aXRsZSA9IGBcXGAke2VudHJ5fVxcYF9fYFxuICAgIGNvbnNvbGUubG9nKHRpdGxlKVxuICAgIGNvbnN0IHVuZGVybGluZSA9IG5ldyBBcnJheSh0aXRsZS5sZW5ndGggKyAxKS5qb2luKHNlY3Rpb25zWzBdKVxuICAgIGNvbnNvbGUubG9nKHVuZGVybGluZSlcbiAgICBjb25zb2xlLmxvZyhjb2RlcylcbiAgfVxuXG4gIGFkZEFuY2hvcnMoa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuYW5jaG9yc1ByaW50ZWQpIHJldHVyblxuICAgIGlmICh0aGlzLmxlY3R1cmVNYXBwZXIuaGFzKGtleSkpXG4gICAgICB0aGlzLmxlY3R1cmVNYXBwZXIubWVyZ2VDb2Rlcyh0aGlzLmFuY2hvcnMsIGtleSlcbiAgICBlbHNlIHRoaXMuYW5jaG9ycy5hZGQoa2V5KVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmFuY2hvcnNQcmludGVkKSByZXR1cm5cbiAgICB0aGlzLmFuY2hvcnNQcmludGVkW2tleV0gPSBudWxsXG4gICAgaWYgKHRoaXMubGVjdHVyZU1hcHBlci5oYXMoa2V5KSkgdGhpcy5sZWN0dXJlTWFwcGVyLnByaW50QW5jaG9ycyhrZXkpXG4gICAgZWxzZSBjb25zb2xlLmxvZyhgLi4gXyR7a2V5fTpgKVxuICB9XG5cbiAgZ2V0Q29kZXMoa2V5OiBzdHJpbmcsIHNob3J0Q29kZTogc3RyaW5nKSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmFuY2hvcnNQcmludGVkKSByZXR1cm4gYGNmIFxcXFwqJHtzaG9ydENvZGV9XFxcXCpgXG4gICAgaWYgKHRoaXMubGVjdHVyZU1hcHBlci5oYXMoa2V5KSkgcmV0dXJuIHRoaXMubGVjdHVyZU1hcHBlci5nZXRDb2RlcyhrZXkpXG4gICAgZWxzZSByZXR1cm4ga2V5XG4gIH1cblxuICByZW5hbWVDTVAoa2V5OiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIkNNUFwiKSkge1xuICAgICAgaWYgKGtleS5lbmRzV2l0aChcIi1TTlwiKSkgcmV0dXJuIGAke25hbWV9IChTw6luYXQpYFxuICAgICAgZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiLUFOXCIpKSByZXR1cm4gYCR7bmFtZX0gKEFzc2VtYmzDqWUgTmF0aW9uYWxlKWBcbiAgICAgIGVsc2UgcmV0dXJuIG5hbWVcbiAgICB9IGVsc2UgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIHByaW50TGV2ZWwoYWN0ZXM6IGFueSwgc2VjdGlvbnM6IHN0cmluZywgYzJwOiBhbnksIHBhcmVudDogYW55KSB7XG4gICAgY29uc3Qga2V5czogU2V0PHN0cmluZz4gPSB0aGlzLm9yZGVyZWRDb2RlcyhPYmplY3Qua2V5cyhhY3RlcyksIGMycCwgcGFyZW50KVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYWN0ZXNba2V5XVxuICAgICAgbGV0IG5hbWUgPSBBcnJheS5mcm9tKHZhbHVlLm5hbWUpLmpvaW4oXCIsIFwiKVxuICAgICAgbmFtZSA9IHRoaXMucmVuYW1lQ01QKGtleSwgbmFtZSlcbiAgICAgIGNvbnN0IGNvZGVzID0gdGhpcy5nZXRDb2RlcyhrZXksIHZhbHVlLnNob3J0Q29kZSlcbiAgICAgIHRoaXMuYWRkQW5jaG9ycyhrZXkpXG4gICAgICB0aGlzLnByaW50QW5jaG9ycyhrZXkpXG4gICAgICBjb25zb2xlLmxvZyhcIlwiKVxuICAgICAgdGhpcy5wcmludEVudHJ5KHNlY3Rpb25zLCBgJHtuYW1lfSA8JHt2YWx1ZS5zaG9ydENvZGV9VE9DXz5gLCBjb2RlcylcbiAgICAgIGNvbnNvbGUubG9nKFwiXCIpXG4gICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUuYWN0ZXMpLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMucHJpbnRMZXZlbCh2YWx1ZS5hY3Rlcywgc2VjdGlvbnMuc3Vic3RyaW5nKDEpLCBjMnBba2V5XSwga2V5KVxuICAgIH1cbiAgfVxuXG4gIHByaW50Q29kZXMoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2RlcykpXG4gICAgICBjb25zb2xlLmxvZyhgLi4gXyR7a2V5fVRPQzogaHR0cDovL2ApXG4gIH1cblxuICBwcmludEFuY2hvcnNJbmRleCgpIHtcbiAgICBmb3IgKGNvbnN0IGNvZGUgb2YgQXJyYXkuZnJvbSh0aGlzLmFuY2hvcnMpKVxuICAgICAgY29uc29sZS5sb2coYCogOnJlZjpcXGAke2NvZGV9IDwke2NvZGV9PlxcYGApXG4gIH1cblxuICBnZXRBZ2dyZWdhdGVkKHByb2NlZHVyZTogc3RyaW5nKSB7XG4gICAgaWYgKHByb2NlZHVyZSA9PSBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIpIHtcbiAgICAgIGNvbnN0IHJlbWFwcGVkID0gT2JqZWN0LmtleXModGhpcy5yZW1hcHBlZFByb2NlZHVyZXMpLmpvaW4oXCIsIFwiKVxuICAgICAgcmV0dXJuIGAgKGFncsOpZ2F0aW9uIGRlICR7cmVtYXBwZWR9KWBcbiAgICB9IGVsc2UgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHByaW50KCk6IHZvaWQge1xuICAgIHRoaXMuYW5jaG9yc1ByaW50ZWQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgYWN0ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJvY2VkdXJlcykgYXMgW1xuICAgICAgc3RyaW5nLFxuICAgICAgYW55LFxuICAgIF1bXSkge1xuICAgICAgY29uc3QgY29kZSA9IGtleS5yZXBsYWNlKC8gKy9nLCBcIl9cIilcbiAgICAgIHRoaXMuY29kZXNbY29kZV0gPSBudWxsXG4gICAgICBjb25zdCBhZ2dyZWdhdGVkID0gdGhpcy5nZXRBZ2dyZWdhdGVkKGtleSlcbiAgICAgIGNvbnN0IHRpdGxlID0gYFxcYCR7a2V5fSA8JHtjb2RlfVRPQ18+XFxgX18ke2FnZ3JlZ2F0ZWR9YFxuICAgICAgY29uc29sZS5sb2codGl0bGUpXG4gICAgICBjb25zdCB1bmRlcmxpbmUgPSBuZXcgQXJyYXkodGl0bGUubGVuZ3RoICsgMSkuam9pbihcIj1cIilcbiAgICAgIGNvbnNvbGUubG9nKHVuZGVybGluZSlcbiAgICAgIHRoaXMucHJpbnRMZXZlbChhY3RlcywgXCItfi4nXCIsIHRoaXMuY29kZTJwYXR0ZXJuW2tleV0sIG51bGwpXG4gICAgfVxuICAgIHRoaXMucHJpbnRDb2RlcygpXG4gICAgdGhpcy5wcmludEFuY2hvcnNJbmRleCgpXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChvcHRpb25zID09PSBudWxsKSByZXR1cm4gMVxuICBsZXQgZG9jID0gbmV3IEFjdGVzRG9jdW1lbnRhdGlvbihcbiAgICAhb3B0aW9uc1tcIm5vLXNhbml0eS1jaGVja3NcIl0sXG4gICAgb3B0aW9ucy52ZXJib3NlLFxuICApXG4gIGRvYy5jb2xsZWN0RmlsZXMob3B0aW9ucy5kYXRhKVxuICBkb2MucHJvY2Vzc0ZpbGVzKG9wdGlvbnMuZGF0YSlcbiAgZG9jLnByaW50KClcbiAgcmV0dXJuIDBcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiZG9jdW1lbnRfZG9zc2llcnNfbGVnaXNsYXRpZnMudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLFNBQVNBLFNBQVQsQ0FBbUJDLElBQW5CLEVBQXdDO0VBQ3RDLElBQU1DLGtCQUFrQixHQUFHLENBQ3pCO0lBQ0VDLFdBQVcsRUFBRSx5REFEZjtJQUVFQyxhQUFhLEVBQUUsSUFGakI7SUFHRUMsUUFBUSxFQUFFLElBSFo7SUFJRUMsSUFBSSxFQUFFLE1BSlI7SUFLRUMsSUFBSSxFQUFFQztFQUxSLENBRHlCLEVBUXpCO0lBQ0VGLElBQUksRUFBRSxrQkFEUjtJQUVFQyxJQUFJLEVBQUVFLE9BRlI7SUFHRU4sV0FBVyxFQUFFO0VBSGYsQ0FSeUIsRUFhekI7SUFDRUcsSUFBSSxFQUFFLFNBRFI7SUFFRUMsSUFBSSxFQUFFRSxPQUZSO0lBR0VOLFdBQVcsRUFBRTtFQUhmLENBYnlCLEVBa0J6QjtJQUNFRyxJQUFJLEVBQUUsTUFEUjtJQUVFSCxXQUFXLEVBQUU7RUFGZixDQWxCeUIsQ0FBM0I7RUF1QkEsSUFBTU8sUUFBUSxHQUFH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
651
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUFyZ3MiLCJhcmd2Iiwib3B0aW9uc0RlZmluaXRpb25zIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0T3B0aW9uIiwibXVsdGlwbGUiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJzZWN0aW9ucyIsImhlYWRlciIsImNvbnRlbnQiLCJvcHRpb25MaXN0Iiwib3B0aW9ucyIsImNvbW1hbmRMaW5lQXJncyIsImNvbnNvbGUiLCJlcnJvciIsImhlbHAiLCJ1c2FnZSIsImNvbW1hbmRMaW5lVXNhZ2UiLCJ3YXJuIiwiZXFTZXQiLCJhcyIsImJzIiwic2l6ZSIsImEiLCJoYXMiLCJDb2RlMlBhdHRlcm4iLCJwYXR0ZXJuIiwiY2hpbGRyZW4iLCJfcGF0dGVybl8iLCJfbWF0Y2hfY291bnRfIiwiT2JqZWN0IiwiYXNzaWduIiwiQ29kZTJQYXR0ZXJuQ29tRm9uZCIsIkxlY3R1cmVNYXBwaW5nIiwiU2V0IiwiYWN0ZSIsImNvZGVzIiwiYWRkIiwiY29kZUFjdGUiLCJnZXRUeXBlIiwibGliZWxsZUFjdGUiLCJub21DYW5vbmlxdWUiLCJsaWJlbGxlIiwidHlwZXMiLCJBcnJheSIsImZyb20iLCJjIiwiY29kZSIsImxvZyIsImpvaW4iLCJtYXRjaCIsImNvZGVzX2xlY3R1cmVfcmVnZXhwIiwiRXJyb3IiLCJyZXBsYWNlIiwiaXNMZWN0dXJlIiwibWFwIiwiUmVnRXhwIiwiY29kZXNfbGVjdHVyZSIsIkxlY3R1cmVNYXBwZXIiLCJtYXBwaW5nIiwiZ2V0Q29kZUFjdGUiLCJ1bmRlZmluZWQiLCJsZWN0dXJlcyIsInJlbWFwIiwibWVyZ2VDb2RlcyIsInByaW50QW5jaG9ycyIsImdldENvZGVzIiwiQWN0ZXNEb2N1bWVudGF0aW9uIiwic2FuaXR5Q2hlY2tzIiwidmVyYm9zZSIsImxlY3R1cmUiLCJDTVAiLCJDQyIsIlBST00iLCJBTjIxIiwiQU5MVU5JIiwiUsOpc29sdXRpb24iLCJBTjIwIiwiRVUiLCJJbW11bml0w6kiLCJwcm9jZWR1cmVzIiwiY29kZTJwYXR0ZXJuIiwiZGF0YSIsImFjdGlvbiIsImdldEZpbGVzIiwiZmlsZSIsImRvc3NpZXIiLCJsb2FkIiwicHJvY2VkdXJlIiwicmVtYXBQcm9jZWR1cmUiLCJwcm9jZWR1cmVQYXJsZW1lbnRhaXJlIiwiYWN0ZXNMZWdpc2xhdGlmcyIsIndhbGtGaWxlcyIsIl9hY3RlcyIsIl9jMnAiLCJfcGFyZW50IiwiY29sbGVjdCIsImFjdGVzIiwiYzJwIiwicGFyZW50IiwibWVyZ2UiLCJ2YWxpZGF0ZSIsInJlc3VsdHMiLCJsZWN0dXJlTWFwcGVyIiwicHVzaCIsIm1lcmdlX3Byb2NlZHVyZXMiLCJNYXAiLCJyZW1hcHBlZFByb2NlZHVyZXMiLCJnZXQiLCJvcmRlcmVkIiwieCIsImFzc2VydCIsInNlcXVlbmNlIiwic2hvcnRDb2RlIiwieHNpVHlwZSIsImwiLCJyZW1hcEFjdGVzIiwidmFsaWRhdGVDaHJvbm9sb2d5IiwibWVyZ2VBY3RlIiwiY29sbGVjdEFjdGVzIiwicGF0aCIsImVudHJpZXMiLCJrZXkiLCJ2YWx1ZSIsImNvbnN0cnVjdG9yIiwidmFsaWRhdGVMZXZlbCIsImNvbmNhdCIsImVudHJ5IiwidGl0bGUiLCJ1bmRlcmxpbmUiLCJsZW5ndGgiLCJhbmNob3JzUHJpbnRlZCIsImFuY2hvcnMiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJrZXlzIiwib3JkZXJlZENvZGVzIiwicmVuYW1lQ01QIiwiYWRkQW5jaG9ycyIsInByaW50RW50cnkiLCJwcmludExldmVsIiwic3Vic3RyaW5nIiwicmVtYXBwZWQiLCJhZ2dyZWdhdGVkIiwiZ2V0QWdncmVnYXRlZCIsInByaW50Q29kZXMiLCJwcmludEFuY2hvcnNJbmRleCIsIm1haW4iLCJkb2MiLCJjb2xsZWN0RmlsZXMiLCJwcm9jZXNzRmlsZXMiLCJwcmludCIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvZG9jdW1lbnRfZG9zc2llcnNfbGVnaXNsYXRpZnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lVXNhZ2UgZnJvbSBcImNvbW1hbmQtbGluZS11c2FnZVwiXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgbG9hZCwgZ2V0RmlsZXMgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcInBhdGhuYW1lIHRvIGEgSlNPTiBmaWxlIG9yIGEgZ2xvYiBwYXR0ZXJuIHRvIEpTT04gZmlsZXNcIixcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG5hbWU6IFwiZGF0YVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJuby1zYW5pdHktY2hlY2tzXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVzY3JpcHRpb246IFwiRG8gbm90IHBlcmZvcm0gc2FuaXR5IGNoZWNrcy5cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlc2NyaXB0aW9uOiBcImluY3JlYXNlIHZlcmJvc2l0eVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJoZWxwXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJQcmludCB0aGlzIHVzYWdlIGd1aWRlLlwiLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAge1xuICAgICAgaGVhZGVyOiBcIkFpZGUgw6AgbGEgZG9jdW1lbnRhdGlvbiBkdSBkb3NzaWVyIGzDqWdpc2xhdGlmXCIsXG4gICAgICBjb250ZW50OiBcIkfDqW7DqHJlIHVuZSBoacOpcmFyY2hpZSBkZXMgYWN0ZXMgbMOpZ2lzbGF0aWZzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBoZWFkZXI6IFwiT3B0aW9uc1wiLFxuICAgICAgb3B0aW9uTGlzdDogb3B0aW9uc0RlZmluaXRpb25zLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICBpZiAoIShcImhlbHBcIiBpbiBvcHRpb25zKSAmJiAhKFwiZGF0YVwiIGluIG9wdGlvbnMpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIi0tZGF0YSBpcyBtYW5kYXRvcnlcIilcbiAgICBvcHRpb25zLmhlbHAgPSB0cnVlXG4gIH1cbiAgaWYgKFwiaGVscFwiIGluIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2FnZSA9IGNvbW1hbmRMaW5lVXNhZ2Uoc2VjdGlvbnMpXG4gICAgY29uc29sZS53YXJuKHVzYWdlKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gZXFTZXQoYXM6IFNldDxzdHJpbmc+LCBiczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKGFzLnNpemUgIT09IGJzLnNpemUpIHJldHVybiBmYWxzZVxuICBmb3IgKHZhciBhIG9mIGFzKSBpZiAoIWJzLmhhcyhhKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmNsYXNzIENvZGUyUGF0dGVybiB7XG4gIF9wYXR0ZXJuXzogYW55XG4gIF9tYXRjaF9jb3VudF86IG51bWJlclxuICBjb25zdHJ1Y3RvcihwYXR0ZXJuOiBhbnksIGNoaWxkcmVuOiBhbnkpIHtcbiAgICB0aGlzLl9wYXR0ZXJuXyA9IHBhdHRlcm5cbiAgICB0aGlzLl9tYXRjaF9jb3VudF8gPSAwXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjaGlsZHJlbilcbiAgfVxufVxuXG5jbGFzcyBDb2RlMlBhdHRlcm5Db21Gb25kIGV4dGVuZHMgQ29kZTJQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJeL1NBSVNJRS8oL05PTUlOLykqKC9SRVVOSU9OLykqKC9SQVBQT1JULykqJFwiLCB7fSlcbiAgfVxufVxuXG5jbGFzcyBMZWN0dXJlTWFwcGluZyB7XG4gIGxpYmVsbGU6IGFueSA9IHt9XG4gIGNvZGVzOiBhbnkgPSBuZXcgU2V0KClcblxuICBzdGF0aWMgY29kZXNfbGVjdHVyZTogc3RyaW5nW10gPSBbXG4gICAgXCJBTjFcIixcbiAgICBcIlNOMVwiLFxuICAgIFwiQU5OTEVDXCIsXG4gICAgXCJTTk5MRUNcIixcbiAgICBcIkFOTERFRlwiLFxuICAgIFwiQU4yXCIsXG4gICAgXCJTTjJcIixcbiAgICBcIlNOM1wiLFxuICBdXG4gIHN0YXRpYyBjb2Rlc19sZWN0dXJlX3JlZ2V4cDogYW55ID0gbmV3IFJlZ0V4cChcbiAgICBcIl4oPzpcIiArIExlY3R1cmVNYXBwaW5nLmNvZGVzX2xlY3R1cmUuam9pbihcInxcIikgKyBcIikoLS4qKT8kXCIsXG4gIClcblxuICBzdGF0aWMgaXNMZWN0dXJlKGFjdGU6IGFueSkge1xuICAgIHJldHVybiBhY3RlLmNvZGVBY3RlLm1hdGNoKExlY3R1cmVNYXBwaW5nLmNvZGVzX2xlY3R1cmVfcmVnZXhwKVxuICB9XG5cbiAgc3RhdGljIGdldFR5cGUoYWN0ZTogYW55KSB7XG4gICAgaWYgKGFjdGUuY29kZUFjdGUubWF0Y2goL15BTi8pKSByZXR1cm4gXCJBTlwiXG4gICAgZWxzZSBpZiAoYWN0ZS5jb2RlQWN0ZS5tYXRjaCgvXlNOLykpIHJldHVybiBcIlNOXCJcbiAgICBlbHNlIHRocm93IEVycm9yKGAke2FjdGUuY29kZUFjdGV9IGRvZXMgbm90IHN0YXJ0IHdpdGggQU4gb3IgU05gKVxuICB9XG5cbiAgc3RhdGljIG1hcChjb2RlQWN0ZTogYW55KSB7XG4gICAgcmV0dXJuIGNvZGVBY3RlLnJlcGxhY2UoTGVjdHVyZU1hcHBpbmcuY29kZXNfbGVjdHVyZV9yZWdleHAsIGBsZWN0dXJlJDFgKVxuICB9XG5cbiAgc3RhdGljIGdldENvZGVBY3RlKGFjdGU6IGFueSkge1xuICAgIGlmICghTGVjdHVyZU1hcHBpbmcuaXNMZWN0dXJlKGFjdGUpKSByZXR1cm5cblxuICAgIHJldHVybiBMZWN0dXJlTWFwcGluZy5tYXAoYWN0ZS5jb2RlQWN0ZSlcbiAgfVxuXG4gIGFkZChhY3RlOiBhbnkpIHtcbiAgICB0aGlzLmNvZGVzLmFkZChhY3RlLmNvZGVBY3RlKVxuXG4gICAgY29uc3QgdHlwZSA9IExlY3R1cmVNYXBwaW5nLmdldFR5cGUoYWN0ZSlcblxuICAgIGlmICghKGFjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlIGluIHRoaXMubGliZWxsZSkpXG4gICAgICB0aGlzLmxpYmVsbGVbYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWVdID0gbmV3IFNldCgpXG4gICAgdGhpcy5saWJlbGxlW2FjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlXS5hZGQodHlwZSlcbiAgfVxuXG4gIHJlbWFwKGFjdGU6IGFueSwgY29kZUFjdGU6IHN0cmluZykge1xuICAgIGFjdGUuY29kZUFjdGUgPSBjb2RlQWN0ZVxuXG4gICAgbGV0IHR5cGVzID0gdGhpcy5saWJlbGxlW2FjdGUubGliZWxsZUFjdGUubm9tQ2Fub25pcXVlXVxuICAgIGlmICghKHR5cGVzLmhhcyhcIlNOXCIpICYmIHR5cGVzLmhhcyhcIkFOXCIpKSkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhcIlNOXCIpKSBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZSArPSBcIiAoU8OpbmF0KVwiXG4gICAgICBlbHNlIGlmICh0eXBlcy5oYXMoXCJBTlwiKSlcbiAgICAgICAgYWN0ZS5saWJlbGxlQWN0ZS5ub21DYW5vbmlxdWUgKz0gXCIgKEFzc2VtYmzDqWUgTmF0aW9uYWxlKVwiXG4gICAgfVxuICB9XG5cbiAgbWVyZ2VDb2Rlcyhjb2RlczogYW55KSB7XG4gICAgZm9yIChjb25zdCBjIG9mIEFycmF5LmZyb20odGhpcy5jb2RlcykpIGNvZGVzLmFkZChjKVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKCkge1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBBcnJheS5mcm9tKHRoaXMuY29kZXMpKSBjb25zb2xlLmxvZyhgLi4gXyR7Y29kZX06YClcbiAgfVxuXG4gIGdldENvZGVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29kZXMpLmpvaW4oXCIsXCIpXG4gIH1cbn1cblxuY2xhc3MgTGVjdHVyZU1hcHBlciB7XG4gIG1hcHBpbmc6IGFueSA9IHt9XG5cbiAgaGFzKGNvZGVBY3RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29kZUFjdGUgaW4gdGhpcy5tYXBwaW5nXG4gIH1cblxuICBjb2xsZWN0KGFjdGU6IGFueSkge1xuICAgIGNvbnN0IGNvZGVBY3RlID0gTGVjdHVyZU1hcHBpbmcuZ2V0Q29kZUFjdGUoYWN0ZSlcbiAgICBpZiAoY29kZUFjdGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgbGVjdHVyZXMgPSB0aGlzLm1hcHBpbmdcbiAgICAgIGlmICghKGNvZGVBY3RlIGluIGxlY3R1cmVzKSkgbGVjdHVyZXNbY29kZUFjdGVdID0gbmV3IExlY3R1cmVNYXBwaW5nKClcbiAgICAgIGxlY3R1cmVzW2NvZGVBY3RlXS5hZGQoYWN0ZSlcbiAgICB9XG4gIH1cblxuICByZW1hcChhY3RlOiBhbnkpIHtcbiAgICBjb25zdCBjb2RlQWN0ZSA9IExlY3R1cmVNYXBwaW5nLmdldENvZGVBY3RlKGFjdGUpXG4gICAgaWYgKGNvZGVBY3RlICE9IHVuZGVmaW5lZCkgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5yZW1hcChhY3RlLCBjb2RlQWN0ZSlcbiAgfVxuXG4gIG1lcmdlQ29kZXMoY29kZXM6IGFueSwgY29kZUFjdGU6IHN0cmluZykge1xuICAgIHRoaXMubWFwcGluZ1tjb2RlQWN0ZV0ubWVyZ2VDb2Rlcyhjb2RlcylcbiAgfVxuXG4gIHByaW50QW5jaG9ycyhjb2RlQWN0ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5tYXBwaW5nW2NvZGVBY3RlXS5wcmludEFuY2hvcnMoKVxuICB9XG5cbiAgZ2V0Q29kZXMoY29kZUFjdGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm1hcHBpbmdbY29kZUFjdGVdLmdldENvZGVzKClcbiAgfVxufVxuXG5jbGFzcyBBY3Rlc0RvY3VtZW50YXRpb24ge1xuICB2ZXJib3NlOiBib29sZWFuXG4gIHNhbml0eUNoZWNrczogYm9vbGVhblxuICBsZWN0dXJlTWFwcGVyOiBhbnkgPSBuZXcgTGVjdHVyZU1hcHBlcigpXG4gIHJlbWFwcGVkUHJvY2VkdXJlczogYW55ID0ge31cbiAgYW5jaG9yc1ByaW50ZWQ6IGFueSA9IHt9XG4gIGFuY2hvcnM6IGFueSA9IG5ldyBTZXQoKVxuICBjb2RlczogYW55ID0ge31cbiAgcHJvY2VkdXJlczogYW55ID0gbnVsbFxuICBjb2RlMnBhdHRlcm46IGFueSA9IG5ldyBDb2RlMlBhdHRlcm4obnVsbCwge1xuICAgIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgIFwiXigoKC9sZWN0dXJlLykrKXwoKC9sZWN0dXJlLykrL0NNUC8oL2xlY3R1cmUvKSopKSgvQ0MvKT8oL1BST00vKT8oL0FOLUFQUExJLyk/JFwiLFxuICAgICAge1xuICAgICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvREVQT1QvKT8oL0RQVExFVFRSRUNULyk/KC9FVEkvKT8oL0FWQ0UvKT8oL0RHVlQvKT8oL0FDSU4vKT8oL01PVElPTi8pKigvUFJPQ0FDQy8pPygvQ09NLyk/KCgvREVCQVRTLykrKT8oL1JUUklOSS8pPyRcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxlY3R1cmUtQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9GT05EL3wvQVZJUy8pKyRcIiwge1xuICAgICAgICAgICAgICBcImxlY3R1cmUtQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICAgICAgXCJsZWN0dXJlLUNPTS1BVklTXCI6IG5ldyBDb2RlMlBhdHRlcm5Db21Gb25kKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFwibGVjdHVyZS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgICAgXCJeKC9TRUFOQ0UvKSooKC9NT1RJT04vKT8oL01PVElPTi1WT1RFLykrKT8oL0RFQy8pPyRcIixcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIENNUDogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICBcIl4oL0RFUE9UL3wvU0FJU0lFLyl7MSwyfSgvQ09NLyk/KC9ERUMvKT8oL0RFQkFUUy1BTi8vREVCQVRTLVNOLyk/XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJDTVAtQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgICAgIFwiXigvTk9NSU4vKT8oL1JBUFBPUlQtQU4vfC9SQVBQT1JULVNOLyl7Mn0kXCIsXG4gICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFwiQ01QLURFQkFUUy1BTlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgICAgICAgIFwiQ01QLURFQkFUUy1TTlwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykqKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBDQzogbmV3IENvZGUyUGF0dGVybihcIl4oL1NBSVNJRS8pKygvQ09OQ0xVU0lPTi8pPyRcIiwge30pLFxuICAgICAgICBQUk9NOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUFVCLyk/JFwiLCB7fSksXG4gICAgICAgIFwiQU4tQVBQTElcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1JBUFBPUlQvKT8kXCIsIHt9KSxcbiAgICAgIH0sXG4gICAgKSxcbiAgICBcIkFsbG9jdXRpb24gZHUgUHLDqXNpZGVudCBkZSBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4vQU4yMS8kXCIsXG4gICAgICB7XG4gICAgICAgIEFOMjE6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BUEFOLyk/JFwiLCB7fSksXG4gICAgICB9LFxuICAgICksXG4gICAgXCJSw6lzb2x1dGlvbiBBcnRpY2xlIDM0LTFcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOTFVOSS8pPyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0RFQkFUUy8pPygvUlRSSU5JLyk/JFwiLCB7XG4gICAgICAgIFwiQU5MVU5JLURFQkFUU1wiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0VBTkNFLykrKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFLDqXNvbHV0aW9uOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQU5MVU5JLyk/KC9DQy8pPyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTL3wvUlRSSU5JLyk/JFwiLCB7XG4gICAgICAgIFwiQU5MVU5JLUNPTVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvQ0FFLyk/KC9GT05ELyk/JFwiLCB7XG4gICAgICAgICAgXCJBTkxVTkktQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybkNvbUZvbmQoKSxcbiAgICAgICAgICBcIkFOTFVOSS1DT00tQ0FFXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICAgICAgICBcIl4oL1NBSVNJRS8pPygvTk9NSU4vKT8oL1JFVU5JT04vKT8oL1JBUFBPUlQvKT8oL0RFQy8pPyRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcIkFOTFVOSS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pKigvREVDLyk/JFwiLCB7fSksXG4gICAgICB9KSxcbiAgICAgIENDOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvU0FJU0lFLyk/KC9DT05DTFVTSU9OLyk/JFwiLCB7fSksXG4gICAgfSksXG4gICAgXCJSYXBwb3J0IGQnaW5mb3JtYXRpb24gc2FucyBtaXNzaW9uXCI6IG5ldyBDb2RlMlBhdHRlcm4oXG4gICAgICBcIl4oL0FOMjAvKT8oL0VVLyk/JFwiLFxuICAgICAge1xuICAgICAgICBBTjIwOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvUkFQUE9SVC8pPyRcIiwge30pLFxuICAgICAgICBFVTogbmV3IENvZGUyUGF0dGVybihcIl4oL0RFQy8pKyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiTWlzc2lvbiBkJ2luZm9ybWF0aW9uXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9BTjIwLyk/JFwiLCB7XG4gICAgICBBTjIwOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvTUlTSU5GLyk/JFwiLCB7XG4gICAgICAgIFwiQU4yMC1NSVNJTkZcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICBcIl4oL0NSRUEvKT8oL05PTUlOLyk/KC9SQVBQT1JULyk/JFwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgXCJDb21taXNzaW9uIGQnZW5xdcOqdGVcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOMjAvKT8kXCIsIHtcbiAgICAgIEFOMjA6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9DT01FTlEvKT8kXCIsIHtcbiAgICAgICAgXCJBTjIwLUNPTUVOUVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgICAgIFwiXigvQ1JFQS8pPygvTk9NSU4vKT8oL1JBUFBPUlQvKT8kXCIsXG4gICAgICAgICAge30sXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBcIkVuZ2FnZW1lbnQgZGUgbGEgcmVzcG9uc2FiaWxpdMOpIGdvdXZlcm5lbWVudGFsZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeL0FOMjEvJFwiLFxuICAgICAge1xuICAgICAgICBBTjIxOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigoKC9NT1RJT04vKSovREVCQVRTLyl8KC9ER1ZULykpezEsMn0kXCIsIHtcbiAgICAgICAgICBcIkFOMjEtREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9TRUFOQ0UvKSooL01PVElPTi1WT1RFLykqJFwiLCB7fSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiTW90aW9uIHLDqWbDqXJlbmRhaXJlXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9sZWN0dXJlLykrJFwiLCB7XG4gICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTLyk/JFwiLCB7XG4gICAgICAgIFwibGVjdHVyZS1DT01cIjogbmV3IENvZGUyUGF0dGVybihcIl4oL0ZPTkQvKT8kXCIsIHtcbiAgICAgICAgICBcImxlY3R1cmUtQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pKigvUkFQUE9SVC8pKiRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcImxlY3R1cmUtREVCQVRTXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERUMvKT8kXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIEltbXVuaXTDqTogbmV3IENvZGUyUGF0dGVybihcIl4oL0FOTFVOSS8pKyRcIiwge1xuICAgICAgQU5MVU5JOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL0NPTS8pPygvREVCQVRTLyk/KC9SVFJJTkkvKT8kXCIsIHtcbiAgICAgICAgXCJBTkxVTkktQ09NXCI6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9GT05ELyk/JFwiLCB7XG4gICAgICAgICAgXCJBTkxVTkktQ09NLUZPTkRcIjogbmV3IENvZGUyUGF0dGVybihcbiAgICAgICAgICAgIFwiXigvU0FJU0lFLyk/KC9OT01JTi8pKigvUkFQUE9SVC8pKiRcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgIH0pLFxuICAgICAgICBcIkFOTFVOSS1ERUJBVFNcIjogbmV3IENvZGUyUGF0dGVybihcIl4oL1NFQU5DRS8pPygvREVDLykkXCIsIHt9KSxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIFwiUmVzcG9uc2FiaWxpdMOpIHDDqW5hbGUgZHUgcHLDqXNpZGVudCBkZSBsYSByw6lwdWJsaXF1ZVwiOiBuZXcgQ29kZTJQYXR0ZXJuKFxuICAgICAgXCJeL2xlY3R1cmUvJFwiLFxuICAgICAge1xuICAgICAgICBsZWN0dXJlOiBuZXcgQ29kZTJQYXR0ZXJuKFwiXigvREVQT1QvKT8oL1JFQ0JVUkVBVS8pPyRcIiwge30pLFxuICAgICAgfSxcbiAgICApLFxuICAgIFwiUHJvcG9zaXRpb24gZGUgbG9pIHByw6lzZW50w6llIGVuIGFwcGxpY2F0aW9uIGRlIGwnYXJ0aWNsZSAxMSBkZSBsYSBDb25zdGl0dXRpb25cIjpcbiAgICAgIG5ldyBDb2RlMlBhdHRlcm4oXCJeL2xlY3R1cmUvJFwiLCB7XG4gICAgICAgIGxlY3R1cmU6IG5ldyBDb2RlMlBhdHRlcm4oXCJeKC9ERVBPVC8pPyRcIiwge30pLFxuICAgICAgfSksXG4gIH0pXG5cbiAgY29uc3RydWN0b3Ioc2FuaXR5Q2hlY2tzOiBib29sZWFuLCB2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlXG4gICAgdGhpcy5zYW5pdHlDaGVja3MgPSBzYW5pdHlDaGVja3NcbiAgICB0aGlzLnByb2NlZHVyZXMgPSB7fVxuICAgIHRoaXMuY29kZTJwYXR0ZXJuLl9tYXRjaF9jb3VudF8rK1xuICB9XG5cbiAgd2Fsa0ZpbGVzKGRhdGE6IHN0cmluZ1tdLCBhY3Rpb246IGFueSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBnZXRGaWxlcyhkYXRhKSkge1xuICAgICAgY29uc3QgZG9zc2llciA9IGxvYWQoZmlsZSlcbiAgICAgIGxldCBwcm9jZWR1cmU6IHN0cmluZyA9IHRoaXMucmVtYXBQcm9jZWR1cmUoXG4gICAgICAgIGRvc3NpZXIucHJvY2VkdXJlUGFybGVtZW50YWlyZS5saWJlbGxlLFxuICAgICAgKVxuICAgICAgaWYgKCEocHJvY2VkdXJlIGluIHRoaXMucHJvY2VkdXJlcykpIHRoaXMucHJvY2VkdXJlc1twcm9jZWR1cmVdID0ge31cbiAgICAgIGFjdGlvbihcbiAgICAgICAgdGhpcy5wcm9jZWR1cmVzW3Byb2NlZHVyZV0sXG4gICAgICAgIGRvc3NpZXIuYWN0ZXNMZWdpc2xhdGlmcyxcbiAgICAgICAgdGhpcy5jb2RlMnBhdHRlcm5bcHJvY2VkdXJlXSxcbiAgICAgICAgbnVsbCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb2xsZWN0RmlsZXMoZGF0YTogc3RyaW5nW10pIHtcbiAgICB0aGlzLndhbGtGaWxlcyhcbiAgICAgIGRhdGEsXG4gICAgICAoX2FjdGVzOiBhbnksIGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgX2MycDogYW55LCBfcGFyZW50OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0KGFjdGVzTGVnaXNsYXRpZnMpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHByb2Nlc3NGaWxlcyhkYXRhOiBzdHJpbmdbXSkge1xuICAgIHRoaXMud2Fsa0ZpbGVzKFxuICAgICAgZGF0YSxcbiAgICAgIChhY3RlczogYW55LCBhY3Rlc0xlZ2lzbGF0aWZzOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1lcmdlKGFjdGVzLCBhY3Rlc0xlZ2lzbGF0aWZzLCBjMnAsIHBhcmVudClcbiAgICAgIH0sXG4gICAgKVxuICAgIGlmICh0aGlzLnNhbml0eUNoZWNrcykgdGhpcy52YWxpZGF0ZSgpXG4gIH1cblxuICByZW1hcEFjdGVzKGFjdGVzOiBhbnkpOiBhbnkge1xuICAgIGxldCByZXN1bHRzID0gW11cbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgYWN0ZXMpIHtcbiAgICAgIHRoaXMubGVjdHVyZU1hcHBlci5yZW1hcChhY3RlKVxuXG4gICAgICAvLyBDQy1TQUlTSUUtIHN1ZmZpeCBkb2VzIG5vdCBpbXBseSBhIGhpZXJhcmNoeVxuICAgICAgYWN0ZS5jb2RlQWN0ZSA9IGFjdGUuY29kZUFjdGUucmVwbGFjZSgvXkNDLVNBSVNJRS4qLywgXCJDQy1TQUlTSUVcIilcblxuICAgICAgcmVzdWx0cy5wdXNoKGFjdGUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICBjb2xsZWN0QWN0ZXMoYWN0ZXM6IGFueSk6IGFueSB7XG4gICAgbGV0IHJlc3VsdHMgPSBbXVxuICAgIGZvciAoY29uc3QgYWN0ZSBvZiBhY3Rlcykge1xuICAgICAgdGhpcy5sZWN0dXJlTWFwcGVyLmNvbGxlY3QoYWN0ZSlcblxuICAgICAgcmVzdWx0cy5wdXNoKGFjdGUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cblxuICByZW1hcFByb2NlZHVyZShwcm9jZWR1cmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWVyZ2VfcHJvY2VkdXJlczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoW1xuICAgICAgW1wiUHJvcG9zaXRpb24gZGUgbG9pIG9yZGluYWlyZVwiLCBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCJdLFxuICAgICAgW1wiUHJvamV0IGRlIGxvaSBvcmRpbmFpcmVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgZGUgcmF0aWZpY2F0aW9uIGRlcyB0cmFpdMOpcyBldCBjb252ZW50aW9uc1wiLFxuICAgICAgICBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIsXG4gICAgICBdLFxuICAgICAgW1wiUHJvamV0IG91IHByb3Bvc2l0aW9uIGRlIGxvaSBvcmdhbmlxdWVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgb3UgcHJvcG9zaXRpb24gZGUgbG9pIGNvbnN0aXR1dGlvbm5lbGxlXCIsXG4gICAgICAgIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIixcbiAgICAgIF0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VzIGRlIGwnYW5uw6llXCIsIFwiUHJvY8OpZHVyZSBsw6lnaXNsYXRpdmVcIl0sXG4gICAgICBbXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VzIHJlY3RpZmljYXRpdmVcIiwgXCJQcm9jw6lkdXJlIGzDqWdpc2xhdGl2ZVwiXSxcbiAgICAgIFtcbiAgICAgICAgXCJQcm9qZXQgZGUgbG9pIGRlIGZpbmFuY2VtZW50IGRlIGxhIHPDqWN1cml0w6kgc29jaWFsZVwiLFxuICAgICAgICBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIsXG4gICAgICBdLFxuICAgIF0pXG4gICAgaWYgKG1lcmdlX3Byb2NlZHVyZXMuaGFzKHByb2NlZHVyZSkpIHtcbiAgICAgIHRoaXMucmVtYXBwZWRQcm9jZWR1cmVzW3Byb2NlZHVyZV0gPSBudWxsXG4gICAgICByZXR1cm4gbWVyZ2VfcHJvY2VkdXJlcy5nZXQocHJvY2VkdXJlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvY2VkdXJlXG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIHRoZSBjb2RlQWN0ZXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHJlZ2V4cFxuICBvcmRlcmVkQ29kZXMoY29kZXM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICAgIGNvZGVzID0gbmV3IFNldChjb2RlcylcbiAgICBpZiAoIXRoaXMuc2FuaXR5Q2hlY2tzKSByZXR1cm4gY29kZXNcbiAgICBsZXQgb3JkZXJlZCA9IGMycFtcIl9wYXR0ZXJuX1wiXS5tYXRjaChuZXcgUmVnRXhwKFwiLy4qPy9cIiwgXCJnXCIpKVxuICAgIG9yZGVyZWQgPSBvcmRlcmVkLm1hcCgoeDogc3RyaW5nKSA9PiB4LnJlcGxhY2UobmV3IFJlZ0V4cChcIi8oLiopL1wiKSwgXCIkMVwiKSlcbiAgICBpZiAocGFyZW50ICE9IG51bGwpIG9yZGVyZWQgPSBvcmRlcmVkLm1hcCgoeDogc3RyaW5nKSA9PiBgJHtwYXJlbnR9LSR7eH1gKVxuICAgIG9yZGVyZWQgPSBuZXcgU2V0KG9yZGVyZWQpXG4gICAgYXNzZXJ0KGVxU2V0KG9yZGVyZWQsIGNvZGVzKSwgYCR7Wy4uLm9yZGVyZWRdfSAhPSAke1suLi5jb2Rlc119YClcbiAgICByZXR1cm4gb3JkZXJlZFxuICB9XG5cbiAgdmFsaWRhdGVDaHJvbm9sb2d5KGFjdGVzTGVnaXNsYXRpZnM6IGFueSwgYzJwOiBhbnksIHBhcmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IGMycFtcIl9wYXR0ZXJuX1wiXVxuICAgIGNvbnN0IHNlcXVlbmNlID0gYWN0ZXNMZWdpc2xhdGlmc1xuICAgICAgLm1hcCgoeDogYW55KSA9PiBgLyR7eC5jb2RlQWN0ZX0vYC5yZXBsYWNlKGAvJHtwYXJlbnR9LWAsIFwiL1wiKSlcbiAgICAgIC5qb2luKFwiXCIpXG4gICAgYXNzZXJ0KFxuICAgICAgc2VxdWVuY2UubWF0Y2gobmV3IFJlZ0V4cChwYXR0ZXJuKSksXG4gICAgICBgJHtwYXR0ZXJufSBkb2VzIG5vdCBtYXRjaCAke3NlcXVlbmNlfWAsXG4gICAgKVxuICAgIGMycC5fbWF0Y2hfY291bnRfKytcbiAgfVxuXG4gIG1lcmdlQWN0ZShhY3RlczogYW55LCBhY3RlOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBjb2RlOiBzdHJpbmcgPSBhY3RlLmNvZGVBY3RlXG4gICAgbGV0IHNob3J0Q29kZTogc3RyaW5nID0gY29kZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke3BhcmVudH0tYCksIFwiXCIpXG4gICAgc2hvcnRDb2RlID0gc2hvcnRDb2RlLnJlcGxhY2UoLy0oQU58U04pJC8sIFwiXCIpXG4gICAgdGhpcy5jb2Rlc1tzaG9ydENvZGVdID0gbnVsbFxuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBhY3RlLmxpYmVsbGVBY3RlLm5vbUNhbm9uaXF1ZVxuICAgIGlmICghKGNvZGUgaW4gYWN0ZXMpKSB7XG4gICAgICBhY3Rlc1tjb2RlXSA9IHtcbiAgICAgICAgdHlwZTogYWN0ZS54c2lUeXBlLFxuICAgICAgICBuYW1lOiBuZXcgU2V0KFtuYW1lXSksXG4gICAgICAgIHNob3J0Q29kZTogc2hvcnRDb2RlLFxuICAgICAgICBhY3Rlczoge30sXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGVzW2NvZGVdLm5hbWUuYWRkKG5hbWUpXG4gICAgfVxuICAgIGlmIChcImFjdGVzTGVnaXNsYXRpZnNcIiBpbiBhY3RlKVxuICAgICAgdGhpcy5tZXJnZShhY3Rlc1tjb2RlXS5hY3RlcywgYWN0ZS5hY3Rlc0xlZ2lzbGF0aWZzLCBjMnBbY29kZV0sIGNvZGUpXG4gIH1cblxuICBtZXJnZShhY3RlczogYW55LCBhY3Rlc0xlZ2lzbGF0aWZzOiBhbnksIGMycDogYW55LCBwYXJlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGwgPSB0aGlzLnJlbWFwQWN0ZXMoYWN0ZXNMZWdpc2xhdGlmcylcbiAgICB0aGlzLnZhbGlkYXRlQ2hyb25vbG9neShsLCBjMnAsIHBhcmVudClcbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgbCkgdGhpcy5tZXJnZUFjdGUoYWN0ZXMsIGFjdGUsIGMycCwgcGFyZW50KVxuICB9XG5cbiAgY29sbGVjdChhY3Rlc0xlZ2lzbGF0aWZzOiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGFjdGUgb2YgdGhpcy5jb2xsZWN0QWN0ZXMoYWN0ZXNMZWdpc2xhdGlmcykpXG4gICAgICBpZiAoXCJhY3Rlc0xlZ2lzbGF0aWZzXCIgaW4gYWN0ZSkgdGhpcy5jb2xsZWN0KGFjdGUuYWN0ZXNMZWdpc2xhdGlmcylcbiAgfVxuXG4gIHZhbGlkYXRlTGV2ZWwoYzJwOiBhbnksIHBhdGg6IGFueSkge1xuICAgIGFzc2VydChjMnAuX21hdGNoX2NvdW50XyA+IDAsIGAke3BhdGh9IGlzIG5ldmVyIHVzZWRgKVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGMycCkgYXMgW3N0cmluZywgYW55XVtdKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lID09IFwiQ29kZTJQYXR0ZXJuXCIpXG4gICAgICAgIHRoaXMudmFsaWRhdGVMZXZlbCh2YWx1ZSwgcGF0aC5jb25jYXQoW2tleV0pKVxuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRoaXMudmFsaWRhdGVMZXZlbCh0aGlzLmNvZGUycGF0dGVybiwgW10pXG4gIH1cblxuICBwcmludEVudHJ5KHNlY3Rpb25zOiBzdHJpbmcsIGVudHJ5OiBzdHJpbmcsIGNvZGVzOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0aXRsZSA9IGBcXGAke2VudHJ5fVxcYF9fYFxuICAgIGNvbnNvbGUubG9nKHRpdGxlKVxuICAgIGNvbnN0IHVuZGVybGluZSA9IG5ldyBBcnJheSh0aXRsZS5sZW5ndGggKyAxKS5qb2luKHNlY3Rpb25zWzBdKVxuICAgIGNvbnNvbGUubG9nKHVuZGVybGluZSlcbiAgICBjb25zb2xlLmxvZyhjb2RlcylcbiAgfVxuXG4gIGFkZEFuY2hvcnMoa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuYW5jaG9yc1ByaW50ZWQpIHJldHVyblxuICAgIGlmICh0aGlzLmxlY3R1cmVNYXBwZXIuaGFzKGtleSkpXG4gICAgICB0aGlzLmxlY3R1cmVNYXBwZXIubWVyZ2VDb2Rlcyh0aGlzLmFuY2hvcnMsIGtleSlcbiAgICBlbHNlIHRoaXMuYW5jaG9ycy5hZGQoa2V5KVxuICB9XG5cbiAgcHJpbnRBbmNob3JzKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmFuY2hvcnNQcmludGVkKSByZXR1cm5cbiAgICB0aGlzLmFuY2hvcnNQcmludGVkW2tleV0gPSBudWxsXG4gICAgaWYgKHRoaXMubGVjdHVyZU1hcHBlci5oYXMoa2V5KSkgdGhpcy5sZWN0dXJlTWFwcGVyLnByaW50QW5jaG9ycyhrZXkpXG4gICAgZWxzZSBjb25zb2xlLmxvZyhgLi4gXyR7a2V5fTpgKVxuICB9XG5cbiAgZ2V0Q29kZXMoa2V5OiBzdHJpbmcsIHNob3J0Q29kZTogc3RyaW5nKSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmFuY2hvcnNQcmludGVkKSByZXR1cm4gYGNmIFxcXFwqJHtzaG9ydENvZGV9XFxcXCpgXG4gICAgaWYgKHRoaXMubGVjdHVyZU1hcHBlci5oYXMoa2V5KSkgcmV0dXJuIHRoaXMubGVjdHVyZU1hcHBlci5nZXRDb2RlcyhrZXkpXG4gICAgZWxzZSByZXR1cm4ga2V5XG4gIH1cblxuICByZW5hbWVDTVAoa2V5OiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcIkNNUFwiKSkge1xuICAgICAgaWYgKGtleS5lbmRzV2l0aChcIi1TTlwiKSkgcmV0dXJuIGAke25hbWV9IChTw6luYXQpYFxuICAgICAgZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiLUFOXCIpKSByZXR1cm4gYCR7bmFtZX0gKEFzc2VtYmzDqWUgTmF0aW9uYWxlKWBcbiAgICAgIGVsc2UgcmV0dXJuIG5hbWVcbiAgICB9IGVsc2UgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIHByaW50TGV2ZWwoYWN0ZXM6IGFueSwgc2VjdGlvbnM6IHN0cmluZywgYzJwOiBhbnksIHBhcmVudDogYW55KSB7XG4gICAgY29uc3Qga2V5czogU2V0PHN0cmluZz4gPSB0aGlzLm9yZGVyZWRDb2RlcyhPYmplY3Qua2V5cyhhY3RlcyksIGMycCwgcGFyZW50KVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYWN0ZXNba2V5XVxuICAgICAgbGV0IG5hbWUgPSBBcnJheS5mcm9tKHZhbHVlLm5hbWUpLmpvaW4oXCIsIFwiKVxuICAgICAgbmFtZSA9IHRoaXMucmVuYW1lQ01QKGtleSwgbmFtZSlcbiAgICAgIGNvbnN0IGNvZGVzID0gdGhpcy5nZXRDb2RlcyhrZXksIHZhbHVlLnNob3J0Q29kZSlcbiAgICAgIHRoaXMuYWRkQW5jaG9ycyhrZXkpXG4gICAgICB0aGlzLnByaW50QW5jaG9ycyhrZXkpXG4gICAgICBjb25zb2xlLmxvZyhcIlwiKVxuICAgICAgdGhpcy5wcmludEVudHJ5KHNlY3Rpb25zLCBgJHtuYW1lfSA8JHt2YWx1ZS5zaG9ydENvZGV9VE9DXz5gLCBjb2RlcylcbiAgICAgIGNvbnNvbGUubG9nKFwiXCIpXG4gICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUuYWN0ZXMpLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMucHJpbnRMZXZlbCh2YWx1ZS5hY3Rlcywgc2VjdGlvbnMuc3Vic3RyaW5nKDEpLCBjMnBba2V5XSwga2V5KVxuICAgIH1cbiAgfVxuXG4gIHByaW50Q29kZXMoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5jb2RlcykpXG4gICAgICBjb25zb2xlLmxvZyhgLi4gXyR7a2V5fVRPQzogaHR0cDovL2ApXG4gIH1cblxuICBwcmludEFuY2hvcnNJbmRleCgpIHtcbiAgICBmb3IgKGNvbnN0IGNvZGUgb2YgQXJyYXkuZnJvbSh0aGlzLmFuY2hvcnMpKVxuICAgICAgY29uc29sZS5sb2coYCogOnJlZjpcXGAke2NvZGV9IDwke2NvZGV9PlxcYGApXG4gIH1cblxuICBnZXRBZ2dyZWdhdGVkKHByb2NlZHVyZTogc3RyaW5nKSB7XG4gICAgaWYgKHByb2NlZHVyZSA9PSBcIlByb2PDqWR1cmUgbMOpZ2lzbGF0aXZlXCIpIHtcbiAgICAgIGNvbnN0IHJlbWFwcGVkID0gT2JqZWN0LmtleXModGhpcy5yZW1hcHBlZFByb2NlZHVyZXMpLmpvaW4oXCIsIFwiKVxuICAgICAgcmV0dXJuIGAgKGFncsOpZ2F0aW9uIGRlICR7cmVtYXBwZWR9KWBcbiAgICB9IGVsc2UgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHByaW50KCk6IHZvaWQge1xuICAgIHRoaXMuYW5jaG9yc1ByaW50ZWQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgYWN0ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJvY2VkdXJlcykgYXMgW1xuICAgICAgc3RyaW5nLFxuICAgICAgYW55LFxuICAgIF1bXSkge1xuICAgICAgY29uc3QgY29kZSA9IGtleS5yZXBsYWNlKC8gKy9nLCBcIl9cIilcbiAgICAgIHRoaXMuY29kZXNbY29kZV0gPSBudWxsXG4gICAgICBjb25zdCBhZ2dyZWdhdGVkID0gdGhpcy5nZXRBZ2dyZWdhdGVkKGtleSlcbiAgICAgIGNvbnN0IHRpdGxlID0gYFxcYCR7a2V5fSA8JHtjb2RlfVRPQ18+XFxgX18ke2FnZ3JlZ2F0ZWR9YFxuICAgICAgY29uc29sZS5sb2codGl0bGUpXG4gICAgICBjb25zdCB1bmRlcmxpbmUgPSBuZXcgQXJyYXkodGl0bGUubGVuZ3RoICsgMSkuam9pbihcIj1cIilcbiAgICAgIGNvbnNvbGUubG9nKHVuZGVybGluZSlcbiAgICAgIHRoaXMucHJpbnRMZXZlbChhY3RlcywgXCItfi4nXCIsIHRoaXMuY29kZTJwYXR0ZXJuW2tleV0sIG51bGwpXG4gICAgfVxuICAgIHRoaXMucHJpbnRDb2RlcygpXG4gICAgdGhpcy5wcmludEFuY2hvcnNJbmRleCgpXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbihhcmd2OiBhbnkpOiBudW1iZXIge1xuICBjb25zdCBvcHRpb25zID0gcGFyc2VBcmdzKGFyZ3YpXG4gIGlmIChvcHRpb25zID09PSBudWxsKSByZXR1cm4gMVxuICBsZXQgZG9jID0gbmV3IEFjdGVzRG9jdW1lbnRhdGlvbihcbiAgICAhb3B0aW9uc1tcIm5vLXNhbml0eS1jaGVja3NcIl0sXG4gICAgb3B0aW9ucy52ZXJib3NlLFxuICApXG4gIGRvYy5jb2xsZWN0RmlsZXMob3B0aW9ucy5kYXRhKVxuICBkb2MucHJvY2Vzc0ZpbGVzKG9wdGlvbnMuZGF0YSlcbiAgZG9jLnByaW50KClcbiAgcmV0dXJuIDBcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiZG9jdW1lbnRfZG9zc2llcnNfbGVnaXNsYXRpZnMudHNcIikpXG4gIHByb2Nlc3MuZXhpdChtYWluKHByb2Nlc3MuYXJndikpXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBZ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVoRCxTQUFTQSxTQUFTLENBQUNDLElBQWMsRUFBTztFQUN0QyxJQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtJQUNFQyxXQUFXLEVBQUUseURBQXlEO0lBQ3RFQyxhQUFhLEVBQUUsSUFBSTtJQUNuQkMsUUFBUSxFQUFFLElBQUk7SUFDZEMsSUFBSSxFQUFFLE1BQU07SUFDWkMsSUFBSSxFQUFFQztFQUNSLENBQUMsRUFDRDtJQUNFRixJQUFJLEVBQUUsa0JBQWtCO0lBQ3hCQyxJQUFJLEVBQUVFLE9BQU87SUFDYk4sV0FBVyxFQUFFO0VBQ2YsQ0FBQyxFQUNEO0lBQ0VHLElBQUksRUFBRSxTQUFTO0lBQ2ZDLElBQUksRUFBRUUsT0FBTztJQUNiTixXQUFXLEVBQUU7RUFDZixDQUFDLEVBQ0Q7SUFDRUcsSUFBSSxFQUFFLE1BQU07SUFDWkgsV0FBVyxFQUFFO0VBQ2YsQ0FBQyxD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