@tricoteuses/assemblee 1.9.13 → 1.10.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 (235) hide show
  1. package/README.md +0 -5
  2. package/lib/api.js +1 -1
  3. package/lib/api.mjs +1 -1
  4. package/lib/bugs/acteur-00010/plugin.test.js +5 -5
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  6. package/lib/bugs/acteur-00010.js +17 -18
  7. package/lib/bugs/acteur-00010.mjs +1 -1
  8. package/lib/bugs/agenda-00002/plugin.test.js +6 -6
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -1
  10. package/lib/bugs/agenda-00002.js +31 -32
  11. package/lib/bugs/agenda-00002.mjs +3 -3
  12. package/lib/bugs/agenda-00008/plugin.test.js +5 -5
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  14. package/lib/bugs/agenda-00008.js +17 -18
  15. package/lib/bugs/agenda-00008.mjs +1 -1
  16. package/lib/bugs/agenda-00011/plugin.test.js +10 -10
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +1 -1
  18. package/lib/bugs/agenda-00011.js +28 -29
  19. package/lib/bugs/agenda-00011.mjs +3 -3
  20. package/lib/bugs.js +27 -29
  21. package/lib/bugs.mjs +3 -3
  22. package/lib/cleaners/actes_legislatifs.js +5 -5
  23. package/lib/cleaners/actes_legislatifs.mjs +1 -1
  24. package/lib/cleaners/acteurs.js +5 -5
  25. package/lib/cleaners/acteurs.mjs +1 -1
  26. package/lib/cleaners/amendements.js +5 -5
  27. package/lib/cleaners/amendements.mjs +1 -1
  28. package/lib/cleaners/debats.js +1 -1
  29. package/lib/cleaners/debats.mjs +1 -1
  30. package/lib/cleaners/documents.js +5 -5
  31. package/lib/cleaners/documents.mjs +1 -1
  32. package/lib/cleaners/dossiers_legislatifs.js +5 -5
  33. package/lib/cleaners/dossiers_legislatifs.mjs +1 -1
  34. package/lib/cleaners/index.d.ts +0 -1
  35. package/lib/cleaners/index.js +1 -8
  36. package/lib/cleaners/index.mjs +1 -2
  37. package/lib/cleaners/organes.js +2 -2
  38. package/lib/cleaners/organes.mjs +1 -1
  39. package/lib/cleaners/questions.js +1 -1
  40. package/lib/cleaners/questions.mjs +1 -1
  41. package/lib/cleaners/reunions.js +5 -5
  42. package/lib/cleaners/reunions.mjs +1 -1
  43. package/lib/cleaners/scrutins.js +8 -8
  44. package/lib/cleaners/scrutins.mjs +1 -1
  45. package/lib/cleaners/xml.js +8 -8
  46. package/lib/cleaners/xml.mjs +1 -1
  47. package/lib/datasets.d.ts +1 -13
  48. package/lib/datasets.js +10 -29
  49. package/lib/datasets.mjs +2 -21
  50. package/lib/dates.js +3 -4
  51. package/lib/dates.mjs +1 -1
  52. package/lib/dossiers_legislatifs.js +8 -8
  53. package/lib/dossiers_legislatifs.mjs +1 -1
  54. package/lib/file_systems.js +15 -14
  55. package/lib/file_systems.mjs +3 -3
  56. package/lib/git.js +5 -5
  57. package/lib/git.mjs +1 -1
  58. package/lib/index.d.ts +1 -0
  59. package/lib/index.js +8 -1
  60. package/lib/index.mjs +2 -1
  61. package/lib/inserters.js +4 -4
  62. package/lib/inserters.mjs +1 -1
  63. package/lib/loaders.d.ts +0 -5
  64. package/lib/loaders.js +255 -299
  65. package/lib/loaders.mjs +1 -13
  66. package/lib/logger.js +1 -1
  67. package/lib/logger.mjs +1 -1
  68. package/lib/organes.js +1 -1
  69. package/lib/organes.mjs +1 -1
  70. package/lib/parsers/documents.js +11 -11
  71. package/lib/parsers/documents.mjs +1 -1
  72. package/lib/parsers/index.d.ts +1 -0
  73. package/lib/parsers/index.js +8 -1
  74. package/lib/parsers/index.mjs +2 -1
  75. package/lib/parsers/recherche_amendements.js +17 -15
  76. package/lib/parsers/recherche_amendements.mjs +1 -1
  77. package/lib/parsers/textes_lois.d.ts +22 -15
  78. package/lib/parsers/textes_lois.js +264 -752
  79. package/lib/parsers/textes_lois.mjs +249 -597
  80. package/lib/raw_types/acteurs_et_organes.js +9 -9
  81. package/lib/raw_types/acteurs_et_organes.mjs +1 -1
  82. package/lib/raw_types/agendas.d.ts +1 -0
  83. package/lib/raw_types/agendas.js +11 -10
  84. package/lib/raw_types/agendas.mjs +3 -2
  85. package/lib/raw_types/amendements.js +9 -9
  86. package/lib/raw_types/amendements.mjs +1 -1
  87. package/lib/raw_types/debats.js +9 -9
  88. package/lib/raw_types/debats.mjs +1 -1
  89. package/lib/raw_types/dossiers_legislatifs.js +9 -9
  90. package/lib/raw_types/dossiers_legislatifs.mjs +1 -1
  91. package/lib/raw_types/questions.js +9 -9
  92. package/lib/raw_types/questions.mjs +1 -1
  93. package/lib/raw_types/scrutins.js +9 -9
  94. package/lib/raw_types/scrutins.mjs +1 -1
  95. package/lib/scripts/bugs_helper.js +25 -26
  96. package/lib/scripts/bugs_helper.mjs +3 -3
  97. package/lib/scripts/clean_reorganized_data.js +256 -245
  98. package/lib/scripts/clean_reorganized_data.mjs +18 -29
  99. package/lib/scripts/diff_amendements.js +9 -8
  100. package/lib/scripts/diff_amendements.mjs +1 -1
  101. package/lib/scripts/document_dossiers_legislatifs.js +24 -27
  102. package/lib/scripts/document_dossiers_legislatifs.mjs +3 -3
  103. package/lib/scripts/get_today_reunions.js +3 -2
  104. package/lib/scripts/get_today_reunions.mjs +1 -1
  105. package/lib/scripts/merge_scrutins.js +9 -8
  106. package/lib/scripts/merge_scrutins.mjs +1 -1
  107. package/lib/scripts/parse_textes_lois.js +6 -5
  108. package/lib/scripts/parse_textes_lois.mjs +1 -1
  109. package/lib/scripts/process_open_dataset.d.ts +0 -2
  110. package/lib/scripts/process_open_dataset.js +19 -19
  111. package/lib/scripts/process_open_dataset.mjs +3 -5
  112. package/lib/scripts/raw_types_from_amendements.d.ts +0 -1
  113. package/lib/scripts/raw_types_from_amendements.js +122 -198
  114. package/lib/scripts/raw_types_from_amendements.mjs +105 -60
  115. package/lib/scripts/reorganize_data.js +14 -15
  116. package/lib/scripts/reorganize_data.mjs +3 -3
  117. package/lib/scripts/retrieve_deputes_photos.js +40 -31
  118. package/lib/scripts/retrieve_deputes_photos.mjs +10 -2
  119. package/lib/scripts/retrieve_documents.d.ts +1 -1
  120. package/lib/scripts/retrieve_documents.js +230 -138
  121. package/lib/scripts/retrieve_documents.mjs +87 -38
  122. package/lib/scripts/retrieve_open_data.js +27 -30
  123. package/lib/scripts/retrieve_open_data.mjs +5 -8
  124. package/lib/scripts/retrieve_pending_amendments.js +14 -14
  125. package/lib/scripts/retrieve_pending_amendments.mjs +1 -1
  126. package/lib/scripts/retrieve_senateurs_photos.js +10 -10
  127. package/lib/scripts/retrieve_senateurs_photos.mjs +1 -1
  128. package/lib/scripts/retrieve_textes_lois.js +17 -15
  129. package/lib/scripts/retrieve_textes_lois.mjs +1 -1
  130. package/lib/scripts/shared/cli_helpers.d.ts +11 -0
  131. package/lib/scripts/shared/cli_helpers.js +13 -2
  132. package/lib/scripts/shared/cli_helpers.mjs +12 -1
  133. package/lib/scripts/test_iter_load.js +5 -19
  134. package/lib/scripts/test_iter_load.mjs +2 -9
  135. package/lib/scripts/test_load.js +2 -2
  136. package/lib/scripts/test_load.mjs +1 -1
  137. package/lib/scripts/test_load_big_files.js +2 -2
  138. package/lib/scripts/test_load_big_files.mjs +1 -1
  139. package/lib/scripts/validate_json.js +17 -18
  140. package/lib/scripts/validate_json.mjs +3 -3
  141. package/lib/shared_types/codes_actes.js +1 -1
  142. package/lib/shared_types/codes_actes.mjs +1 -1
  143. package/lib/strings.js +1 -1
  144. package/lib/strings.mjs +1 -1
  145. package/lib/types/acteurs_et_organes.js +9 -9
  146. package/lib/types/acteurs_et_organes.mjs +1 -1
  147. package/lib/types/agendas.d.ts +1 -0
  148. package/lib/types/agendas.js +11 -10
  149. package/lib/types/agendas.mjs +3 -2
  150. package/lib/types/amendements.js +9 -9
  151. package/lib/types/amendements.mjs +1 -1
  152. package/lib/types/debats.js +9 -9
  153. package/lib/types/debats.mjs +1 -1
  154. package/lib/types/dossiers_legislatifs.d.ts +13 -0
  155. package/lib/types/dossiers_legislatifs.js +47 -9
  156. package/lib/types/dossiers_legislatifs.mjs +39 -1
  157. package/lib/types/legislatures.js +1 -1
  158. package/lib/types/legislatures.mjs +1 -1
  159. package/lib/types/questions.js +9 -9
  160. package/lib/types/questions.mjs +1 -1
  161. package/lib/types/scrutins.js +9 -9
  162. package/lib/types/scrutins.mjs +1 -1
  163. package/lib/urls.js +2 -2
  164. package/lib/urls.mjs +1 -1
  165. package/package.json +14 -20
  166. package/lib/cleaners/textes_loi.d.ts +0 -1
  167. package/lib/cleaners/textes_loi.js +0 -12
  168. package/lib/cleaners/textes_loi.mjs +0 -5
  169. package/lib/examples/PIONANR5L15B0020/input.d.ts +0 -2
  170. package/lib/examples/PIONANR5L15B0020/input.js +0 -10
  171. package/lib/examples/PIONANR5L15B0020/input.mjs +0 -193
  172. package/lib/examples/PIONANR5L15B0020/input.ts +0 -193
  173. package/lib/examples/PIONANR5L15B0020/loi.json +0 -26
  174. package/lib/examples/PIONANR5L15B0020/loi_populated.json +0 -29
  175. package/lib/examples/PIONANR5L15B0020/meta.json +0 -28
  176. package/lib/examples/PIONANR5L15B0020/motifs.json +0 -5
  177. package/lib/examples/PIONANR5L15B0020/motifs_populated.json +0 -6
  178. package/lib/examples/PIONANR5L15B0020/sommaire.json +0 -3
  179. package/lib/examples/PRJLANR5L16B0914/input.d.ts +0 -2
  180. package/lib/examples/PRJLANR5L16B0914/input.js +0 -10
  181. package/lib/examples/PRJLANR5L16B0914/input.mjs +0 -322
  182. package/lib/examples/PRJLANR5L16B0914/input.ts +0 -322
  183. package/lib/examples/PRJLANR5L16B0914/loi.json +0 -14
  184. package/lib/examples/PRJLANR5L16B0914/loi_populated.json +0 -20
  185. package/lib/examples/PRJLANR5L16B0914/meta.json +0 -35
  186. package/lib/examples/PRJLANR5L16B0914/motifs.json +0 -4
  187. package/lib/examples/PRJLANR5L16B0914/motifs_populated.json +0 -5
  188. package/lib/examples/PRJLANR5L16B0914/sommaire.json +0 -3
  189. package/lib/examples/PRJLANR5L16B2014/README.md +0 -2
  190. package/lib/examples/PRJLANR5L16B2014/input.d.ts +0 -2
  191. package/lib/examples/PRJLANR5L16B2014/input.js +0 -10
  192. package/lib/examples/PRJLANR5L16B2014/input.mjs +0 -577
  193. package/lib/examples/PRJLANR5L16B2014/input.ts +0 -577
  194. package/lib/examples/PRJLANR5L16B2014/loi.json +0 -369
  195. package/lib/examples/PRJLANR5L16B2014/meta.json +0 -31
  196. package/lib/examples/PRJLANR5L16B2014/motifs.json +0 -5
  197. package/lib/examples/PRJLANR5L16B2014/sommaire.json +0 -51
  198. package/lib/examples/PRJLANR5L16B2424/alineas.json +0 -44
  199. package/lib/examples/PRJLANR5L16B2424/input.d.ts +0 -2
  200. package/lib/examples/PRJLANR5L16B2424/input.js +0 -10
  201. package/lib/examples/PRJLANR5L16B2424/input.mjs +0 -322
  202. package/lib/examples/PRJLANR5L16B2424/input.ts +0 -322
  203. package/lib/examples/PRJLANR5L16B2424/loi.json +0 -74
  204. package/lib/examples/PRJLANR5L16B2424/loi_populated.json +0 -87
  205. package/lib/examples/PRJLANR5L16B2424/meta.json +0 -31
  206. package/lib/examples/PRJLANR5L16B2424/motifs.json +0 -4
  207. package/lib/examples/PRJLANR5L16B2424/motifs_populated.json +0 -5
  208. package/lib/examples/PRJLANR5L16B2424/sommaire.json +0 -3
  209. package/lib/examples/PRJLANR5L16B2462/input.d.ts +0 -2
  210. package/lib/examples/PRJLANR5L16B2462/input.js +0 -10
  211. package/lib/examples/PRJLANR5L16B2462/input.mjs +0 -1308
  212. package/lib/examples/PRJLANR5L16B2462/input.ts +0 -1308
  213. package/lib/examples/PRJLANR5L16B2462/loi.json +0 -74
  214. package/lib/examples/PRJLANR5L16B2462/loi_populated.json +0 -310
  215. package/lib/examples/PRJLANR5L16B2462/meta.json +0 -29
  216. package/lib/examples/PRJLANR5L16B2462/motifs.json +0 -6
  217. package/lib/examples/PRJLANR5L16B2462/motifs_populated.json +0 -6
  218. package/lib/examples/PRJLANR5L16B2462/sommaire.json +0 -50
  219. package/lib/examples/README.md +0 -3
  220. package/lib/raw_types/textes_loi.d.ts +0 -93
  221. package/lib/raw_types/textes_loi.js +0 -429
  222. package/lib/raw_types/textes_loi.mjs +0 -378
  223. package/lib/schemas/texte_loi/Alinea.json +0 -36
  224. package/lib/schemas/texte_loi/ExposeMotifs.json +0 -24
  225. package/lib/schemas/texte_loi/MetaDonnees.json +0 -126
  226. package/lib/schemas/texte_loi/ProjetLoi.json +0 -64
  227. package/lib/schemas/texte_loi/Sommaire.json +0 -48
  228. package/lib/schemas/texte_loi/TexteLoi.json +0 -225
  229. package/lib/schemas/texte_loi/TexteLoiPartiel.json +0 -237
  230. package/lib/scripts/process_textes_loi_dataset.d.ts +0 -7
  231. package/lib/scripts/process_textes_loi_dataset.js +0 -373
  232. package/lib/scripts/process_textes_loi_dataset.mjs +0 -239
  233. package/lib/types/textes_loi.d.ts +0 -94
  234. package/lib/types/textes_loi.js +0 -429
  235. package/lib/types/textes_loi.mjs +0 -378
@@ -1,791 +1,303 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  require("core-js/modules/es.symbol.js");
5
4
  require("core-js/modules/es.symbol.description.js");
6
- require("core-js/modules/es.symbol.async-iterator.js");
7
5
  require("core-js/modules/es.symbol.iterator.js");
8
- require("core-js/modules/es.symbol.to-primitive.js");
9
- require("core-js/modules/es.symbol.to-string-tag.js");
10
- require("core-js/modules/es.array.filter.js");
11
- require("core-js/modules/es.array.for-each.js");
12
6
  require("core-js/modules/es.array.from.js");
13
7
  require("core-js/modules/es.array.is-array.js");
14
8
  require("core-js/modules/es.array.iterator.js");
15
- require("core-js/modules/es.array.reverse.js");
16
9
  require("core-js/modules/es.array.slice.js");
17
- require("core-js/modules/es.date.to-primitive.js");
18
10
  require("core-js/modules/es.date.to-string.js");
19
- require("core-js/modules/es.function.name.js");
20
- require("core-js/modules/es.json.to-string-tag.js");
21
- require("core-js/modules/es.math.to-string-tag.js");
22
- require("core-js/modules/es.number.constructor.js");
23
- require("core-js/modules/es.object.create.js");
24
- require("core-js/modules/es.object.define-properties.js");
25
11
  require("core-js/modules/es.object.define-property.js");
26
- require("core-js/modules/es.object.get-own-property-descriptor.js");
27
- require("core-js/modules/es.object.get-own-property-descriptors.js");
28
- require("core-js/modules/es.object.get-prototype-of.js");
29
- require("core-js/modules/es.object.keys.js");
30
- require("core-js/modules/es.object.set-prototype-of.js");
12
+ require("core-js/modules/es.object.to-string.js");
31
13
  require("core-js/modules/es.regexp.to-string.js");
32
14
  require("core-js/modules/es.string.iterator.js");
33
- require("core-js/modules/web.dom-collections.for-each.js");
34
15
  require("core-js/modules/web.dom-collections.iterator.js");
35
16
  Object.defineProperty(exports, "__esModule", {
36
17
  value: true
37
18
  });
38
- exports.parseTexteLoi = parseTexteLoi;
39
- require("core-js/modules/es.array.map.js");
40
- require("core-js/modules/es.object.to-string.js");
41
- require("core-js/modules/es.promise.js");
19
+ exports.parseTexte = parseTexte;
20
+ require("core-js/modules/es.array.includes.js");
21
+ require("core-js/modules/es.function.name.js");
42
22
  require("core-js/modules/es.regexp.exec.js");
23
+ require("core-js/modules/es.string.includes.js");
24
+ require("core-js/modules/es.string.match.js");
43
25
  require("core-js/modules/es.string.replace.js");
44
- var _openai = require("@langchain/openai");
45
- var _prompts = require("@langchain/core/prompts");
46
- var _ajv = _interopRequireDefault(require("ajv"));
47
- var _logger = require("../logger");
48
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
49
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
50
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
51
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
52
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
53
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
54
- 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(_e) { throw _e; }, 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(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
55
- 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); }
56
- 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; }
57
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
58
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
59
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
60
- var ALINEA_SCHEMA = require("../schemas/texte_loi/Alinea.json");
61
- var EXPOSE_MOTIFS_SCHEMA = require("../schemas/texte_loi/ExposeMotifs.json");
62
- var META_DONNEES_SCHEMA = require("../schemas/texte_loi/MetaDonnees.json");
63
- var PROJET_LOI_SCHEMA = require("../schemas/texte_loi/ProjetLoi.json");
64
- var SOMMAIRE_SCHEMA = require("../schemas/texte_loi/Sommaire.json");
65
-
66
- /**
67
- * Object containing input examples and their output schemas.
68
- * Used to train the LLM.
69
- * @type {Record<string, {motifs: any, input: any, loi: any, meta: any, sommaire: any}>}
70
- */
71
- var EXAMPLES = {
72
- PRJLANR5L16B0914: {
73
- motifs: require("../examples/PRJLANR5L16B0914/motifs.json"),
74
- input: require("../examples/PRJLANR5L16B0914/input"),
75
- loi: require("../examples/PRJLANR5L16B0914/loi.json"),
76
- meta: require("../examples/PRJLANR5L16B0914/meta.json"),
77
- sommaire: require("../examples/PRJLANR5L16B0914/sommaire.json")
78
- },
79
- PRJLANR5L16B2014: {
80
- motifs: require("../examples/PRJLANR5L16B2014/motifs.json"),
81
- input: require("../examples/PRJLANR5L16B2014/input"),
82
- loi: require("../examples/PRJLANR5L16B2014/loi.json"),
83
- meta: require("../examples/PRJLANR5L16B2014/meta.json"),
84
- sommaire: require("../examples/PRJLANR5L16B2014/sommaire.json")
85
- },
86
- PRJLANR5L16B2424: {
87
- alineas: require("../examples/PRJLANR5L16B2424/alineas.json"),
88
- motifs: require("../examples/PRJLANR5L16B2424/motifs.json"),
89
- input: require("../examples/PRJLANR5L16B2424/input"),
90
- loi: require("../examples/PRJLANR5L16B2424/loi.json"),
91
- meta: require("../examples/PRJLANR5L16B2424/meta.json"),
92
- sommaire: require("../examples/PRJLANR5L16B2424/sommaire.json")
93
- }
94
- };
95
- var FULL_TEXTE_SCHEMA = {
96
- $schema: "http://json-schema.org/draft-07/schema#",
97
- title: "Sommaire",
98
- description: "Récupération d'un texte complet",
99
- type: "object",
100
- properties: {
101
- texte: {
102
- description: "Texte complet de la section indiquée.",
103
- type: "string"
26
+ require("core-js/modules/es.string.trim.js");
27
+ var _assert = _interopRequireDefault(require("assert"));
28
+ var _jsdom = require("jsdom");
29
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
30
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
31
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
32
+ 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."); }
33
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
34
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
35
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
36
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
37
+ function parseHeader(header) {
38
+ var headersMapping = [{
39
+ regex: /^(RAPPORT_)?ANNEXE(_|$)|^ETAT_/,
40
+ level: 0,
41
+ name: "Annexe"
42
+ }, {
43
+ regex: /^TOME_/,
44
+ level: 1,
45
+ name: "Tome"
46
+ }, {
47
+ regex: /^PARTIE_|^(PREMIERE|SECONDE|DEUXIEME|TROISIEME|QUATRIEME)_PARTIE(_|$)/,
48
+ level: 2,
49
+ name: "Partie"
50
+ }, {
51
+ regex: /^LIVRE_/,
52
+ level: 3,
53
+ name: "Livre"
54
+ }, {
55
+ regex: /^TITRE_/,
56
+ level: 4,
57
+ name: "Titre"
58
+ }, {
59
+ regex: /^SOUSTITRE_/,
60
+ level: 5,
61
+ name: "SousTitre"
62
+ }, {
63
+ regex: /^CHAPITRE_/,
64
+ level: 6,
65
+ name: "Chapitre"
66
+ }, {
67
+ regex: /^SECTION_/,
68
+ level: 7,
69
+ name: "Section"
70
+ }, {
71
+ regex: /^SOUSSECTION_/,
72
+ level: 8,
73
+ name: "SousSection"
74
+ }, {
75
+ regex: /^ARTICLES?_|^EXPOSE_DES_MOTIFS$/,
76
+ level: 9,
77
+ name: "Article"
78
+ }];
79
+ for (var _i = 0, _headersMapping = headersMapping; _i < _headersMapping.length; _i++) {
80
+ var _headersMapping$_i = _headersMapping[_i],
81
+ regex = _headersMapping$_i.regex,
82
+ level = _headersMapping$_i.level,
83
+ name = _headersMapping$_i.name;
84
+ if (header.match(regex)) {
85
+ return [level, name];
104
86
  }
105
- },
106
- required: ["texte"]
107
- };
108
-
109
- /**
110
- * LLM model.
111
- */
112
- var MODEL = null;
113
- if (process && process.env && process.env.OPENAI_API_KEY || undefined) {
114
- MODEL = new _openai.ChatOpenAI({
115
- temperature: 0,
116
- topP: 0.0,
117
- model: "gpt-4o-mini",
118
- apiKey: process && process.env && process.env.OPENAI_API_KEY || undefined,
119
- maxTokens: -1
120
- });
121
- }
122
-
123
- /**
124
- * System input template for the LLM.
125
- */
126
- var SYSTEM_TEMPLATE = "\n # Instructions :\n \n Tu es un expert de la loi et de l'analyse de pages HTML.\n Tu dois analyser un texte de loi afin de s\xE9parer et de structurer les \xE9l\xE9ments qui le composent. Le format d'entr\xE9e est HTML.\n\n Le texte est divis\xE9 en deux parties :\n A) un expos\xE9 des motifs qui indique les raisons pour lesquelles ce projet est soumis au Parlement. Il peut contenir 3 \xE9l\xE9ments : 1) une citation au d\xE9but d'un document, 2) le texte principal qui d\xE9veloppe les arguments de l'auteur \xE0 l'appui de la modification l\xE9gislative ou des dispositions nouvelles qu'il propose, 3) des paragraphes qui pr\xE9sentent les articles.\n B) le dispositif qui est la partie normative et r\xE9dig\xE9e en articles. Il peut comporter des divisions nomm\xE9es titres, chapitres, sections, sous-sections. Lorsqu'il y a un seul niveau de structure, on retrouvera le chapitre ; s\u2019il y a deux niveaux de structure, on retrouvera des chapitres puis des sections. S\u2019il y a trois niveaux de structure, on retrouvera des titres puis des chapitres puis des sections.\n\n Si le texte de loi ne comporte pas de division, le sommaire doit rester vide.\n Toutes les lignes qui d\xE9butent par un '\xAB' ne sont pas \xE0 prendre en compte dans les divisions\n Ta r\xE9ponse doit \xEAtre un JSON structur\xE9 avec les \xE9l\xE9ments du texte de loi en respectant le sch\xE9ma JSON fourni.\n";
127
- var SILENT_LOG = false;
128
-
129
- /**
130
- * Parses the given HTML string and returns the parsed textes loi.
131
- *
132
- * @param {string} html - The HTML string to parse.
133
- * @return {Promise<{partial: {sommaire: any, loi: any, motifs: any, meta: any}, completed: {sommaire: any, loi: any, motifs: any, meta: any}}>} - The parsed textes loi, including the partial and completed versions.
134
- */
135
- function parseTexteLoi(_x) {
136
- return _parseTexteLoi.apply(this, arguments);
137
- }
138
- /**
139
- * Cleans the given HTML string by removing unnecessary tags and content.
140
- *
141
- * @param {string} html - The HTML string to be cleaned.
142
- * @return {string} The cleaned HTML string.
143
- */
144
- function _parseTexteLoi() {
145
- _parseTexteLoi = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(html) {
146
- var options,
147
- meta,
148
- sommaire,
149
- partialMotifs,
150
- partialLoi,
151
- exposeMotifs,
152
- loi,
153
- _args = arguments;
154
- return _regeneratorRuntime().wrap(function _callee$(_context) {
155
- while (1) switch (_context.prev = _context.next) {
156
- case 0:
157
- options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {
158
- silent: false
159
- };
160
- SILENT_LOG = options.silent;
161
- (0, _logger.runLogFun)(console.info("Start extracting loi..."), options);
162
- _context.next = 5;
163
- return extractMetaDonnees(html);
164
- case 5:
165
- meta = _context.sent;
166
- _context.next = 8;
167
- return extractSommaire(html);
168
- case 8:
169
- sommaire = _context.sent;
170
- _context.next = 11;
171
- return extractMotifs(html);
172
- case 11:
173
- partialMotifs = _context.sent;
174
- _context.next = 14;
175
- return extractProjetLoi(html);
176
- case 14:
177
- partialLoi = _context.sent;
178
- _context.next = 17;
179
- return populateMotifs(partialMotifs, html);
180
- case 17:
181
- exposeMotifs = _context.sent;
182
- _context.next = 20;
183
- return populateProjetLoi(partialLoi, html);
184
- case 20:
185
- loi = _context.sent;
186
- return _context.abrupt("return", {
187
- sommaire: sommaire,
188
- loi: loi,
189
- exposeMotifs: exposeMotifs,
190
- meta: meta
191
- });
192
- case 22:
193
- case "end":
194
- return _context.stop();
195
- }
196
- }, _callee);
197
- }));
198
- return _parseTexteLoi.apply(this, arguments);
199
- }
200
- function cleanHtml(html) {
201
- var cleanedHtml = html.replace(/(<style[\w\W]+style>)/g, "");
202
- cleanedHtml = cleanedHtml.replace(/(<head[\w\W]+head>)/g, "");
203
- cleanedHtml = cleanedHtml.replace(/<img[^>]*>/g, "");
204
- return cleanedHtml;
87
+ }
88
+ return [null, ""];
205
89
  }
206
-
207
- /**
208
- * Removes all HTML tags from the given HTML string and returns the cleaned text.
209
- *
210
- * @param {string} html - The HTML string from which to remove tags.
211
- * @return {string} The cleaned text without any HTML tags.
212
- */
213
- function removeHtmlTags(html) {
214
- // Regular expression to match HTML tags
215
- var htmlTagRegex = /<[^>]*>/g;
216
-
217
- // Replace all HTML tags with an empty string
218
- var textWithoutTags = html.replace(htmlTagRegex, "");
219
- return textWithoutTags;
90
+ function cleanText(text) {
91
+ return (text === null || text === void 0 ? void 0 : text.replace(/[\n\t]+/g, "").trim()) || "";
220
92
  }
93
+ var excludedAlineas = [/^Délibéré en séance publique/, /^Fait le/, /^Le Président,$/, /^Signé/];
94
+ function parseTexte(assembleeUrl, page) {
95
+ // Repair HTML.
96
+ var html = page.replace(/(<style[\w\W]+style>)/g, "");
221
97
 
222
- /**
223
- * Populates the motifs object with the extracted text from the given HTML.
224
- *
225
- * @param {Record<string, any>} motifs - The motifs object to be populated.
226
- * @param {string} html - The HTML string from which to extract the text.
227
- * @return {Promise<Record<string, any>>} - The populated motifs object.
228
- */
229
- function populateMotifs(_x2, _x3) {
230
- return _populateMotifs.apply(this, arguments);
231
- }
232
- /**
233
- * Asynchronously populates a projet loi object with the full text of each article and alinea in the given HTML.
234
- *
235
- * @param {Record<string, any>} partial - The partial projet loi object to be populated.
236
- * @param {string} html - The HTML containing the text of the articles and alineas.
237
- * @return {Promise<Record<string, any>>} A Promise that resolves to the fully populated projet loi object.
238
- */
239
- function _populateMotifs() {
240
- _populateMotifs = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(motifs, html) {
241
- var cleanedHtml, systemTemplate, prompt, structuredModel, chain, articlePromptResult;
242
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
243
- while (1) switch (_context2.prev = _context2.next) {
244
- case 0:
245
- (0, _logger.runLogFun)(console.info("Populating expose motifs..."));
246
- cleanedHtml = cleanHtml(html);
247
- if (!(motifs.debut === motifs.fin || !motifs.fin)) {
248
- _context2.next = 6;
249
- break;
98
+ // Extract subdivisions from HTML.
99
+ var _JSDOM = new _jsdom.JSDOM(html),
100
+ window = _JSDOM.window;
101
+ var document = window.document;
102
+ _assert["default"].strictEqual(document.children.length, 1);
103
+ var htmlElement = document.children[0];
104
+ _assert["default"].strictEqual(htmlElement.children.length, 2);
105
+ var bodyElement = htmlElement.children[1];
106
+ if (bodyElement.children.length < 3) {
107
+ // Occurs in http://www.assemblee-nationale.fr/15/textes/0326.asp.
108
+ window.close(); // Free memory.
109
+ return {
110
+ error: {
111
+ code: -1,
112
+ message: "Texte de loi sans contenu"
113
+ },
114
+ html: html,
115
+ page: page
116
+ };
117
+ }
118
+ _assert["default"].strictEqual(bodyElement.children[0].tagName, "DIV");
119
+ // First child is a DIV describing the document (Assemblée's header). Skip it for now.
120
+ var bodyChild = bodyElement.children[1];
121
+ _assert["default"].strictEqual(bodyChild.tagName, "BR");
122
+ var alineaElement = null;
123
+ var isMultiLinesHeader = false;
124
+ var level = null;
125
+ var levels = [];
126
+ var nextParentState = null;
127
+ var state = "nextBodyChild";
128
+ var subdivisions = [];
129
+ var subdivisionAlineas = null;
130
+ var subdivisionHeaders = null;
131
+ while (state !== null) {
132
+ switch (state) {
133
+ case "nextBodyChild":
134
+ if (bodyChild.nextElementSibling === null) {
135
+ // The document has been fully parsed.
136
+ state = null;
137
+ } else {
138
+ bodyChild = bodyChild.nextElementSibling;
139
+ if (bodyChild.tagName === "DIV") {
140
+ alineaElement = bodyChild.children[0];
141
+ if (alineaElement === undefined || bodyChild.id.includes("ftn")) {
142
+ // No alinea in current bodyChild: go to next bodyChild.
143
+ state = "nextBodyChild";
144
+ } else {
145
+ state = "alineaElement";
146
+ }
147
+ } else {
148
+ // <P/> is for footnotes
149
+ (0, _assert["default"])(["BR", "HR", "P"].includes(bodyChild.tagName), "Unexpected tag name \"".concat(bodyChild.tagName, "\" for body child"));
150
+ // Stay in the same state to go to next bodyChild.
250
151
  }
251
- motifs.texte = motifs.debut;
252
- _context2.next = 14;
253
- break;
254
- case 6:
255
- systemTemplate = "\n # Instructions :\n\n Tu es un expert de la loi et de l'analyse de pages HTML.\n Tu dois analyser un texte de loi afin d'en extraire certaines parties. \n Le format d'entr\xE9e est du HTML. Le format de sortie est du texte.\n R\xE9cup\xE8re l'int\xE9gralit\xE9 du texte commen\xE7ant par :\n\n \"\"\"\n {debut}\n \"\"\"\n\n Et finissant par :\n\n \"\"\"\n {fin}\n \"\"\"\n ";
256
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", systemTemplate], ["human", "{input}"]]);
257
- structuredModel = MODEL.withStructuredOutput(FULL_TEXTE_SCHEMA);
258
- chain = prompt.pipe(structuredModel);
259
- _context2.next = 12;
260
- return chain.invoke({
261
- input: cleanedHtml,
262
- debut: motifs.debut,
263
- fin: motifs.fin
264
- });
265
- case 12:
266
- articlePromptResult = _context2.sent;
267
- motifs.texte = articlePromptResult.texte;
268
- case 14:
269
- (0, _logger.runLogFun)(console.info("Opération de peuplement de l'exposé des motifs terminée ✅"), {
270
- silent: SILENT_LOG
271
- });
272
- (0, _logger.delimiter)(SILENT_LOG);
273
- delete motifs.debut;
274
- delete motifs.fin;
275
- return _context2.abrupt("return", motifs);
276
- case 19:
277
- case "end":
278
- return _context2.stop();
279
- }
280
- }, _callee2);
281
- }));
282
- return _populateMotifs.apply(this, arguments);
283
- }
284
- function populateProjetLoi(_x4, _x5) {
285
- return _populateProjetLoi.apply(this, arguments);
286
- }
287
- /**
288
- * Asynchronously extracts the "expose motifs" from the given HTML.
289
- *
290
- * @param {string} html - The HTML string from which to extract the "expose motifs".
291
- * @return {Promise<Record<string, any>>} - A Promise that resolves to the extracted "expose motifs" object.
292
- * The object contains the following properties:
293
- * - `debut`: The beginning of the "expose motifs".
294
- * - `fin`: The end of the "expose motifs".
295
- * @throws {Error} - If the extracted "expose motifs" do not validate against the EXPOSE_MOTIFS_SCHEMA.
296
- */
297
- function _populateProjetLoi() {
298
- _populateProjetLoi = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(partial, html) {
299
- var cleanedHtml, articles, fullArticles, systemTemplate, prompt, structuredModel, chain, _iterator, _step, article, articlePromptResult, _iterator2, _step2, alinea, alineaPromptResult, projetLoi;
300
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
301
- while (1) switch (_context3.prev = _context3.next) {
302
- case 0:
303
- (0, _logger.runLogFun)(console.group("Peuplement du projet loi..."), {
304
- silent: SILENT_LOG
305
- });
306
- cleanedHtml = cleanHtml(html);
307
- articles = partial.articles;
308
- fullArticles = [];
309
- systemTemplate = "\n # Instructions :\n\n Tu es un expert de la loi et de l'analyse de pages HTML.\n Tu dois analyser un texte de loi afin d'en extraire certaines parties. \n Le format d'entr\xE9e est du HTML. Le format de sortie est du texte.\n R\xE9cup\xE8re l'int\xE9gralit\xE9 du texte commen\xE7ant par :\n\n \"\"\"\n {debut}\n \"\"\"\n\n Et finissant par :\n\n \"\"\"\n {fin}\n \"\"\"\n ";
310
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", systemTemplate], ["human", "{input}"]]);
311
- structuredModel = MODEL.withStructuredOutput(FULL_TEXTE_SCHEMA);
312
- chain = prompt.pipe(structuredModel);
313
- _iterator = _createForOfIteratorHelper(articles);
314
- _context3.prev = 9;
315
- _iterator.s();
316
- case 11:
317
- if ((_step = _iterator.n()).done) {
318
- _context3.next = 51;
152
+ }
153
+ break;
154
+ case "alineaElement":
155
+ switch (alineaElement.tagName) {
156
+ case "DIV":
157
+ state = "nextAlineaElement";
319
158
  break;
320
- }
321
- article = _step.value;
322
- if (!(article.debut === article.fin || !article.fin)) {
323
- _context3.next = 17;
159
+ case "H4":
160
+ // TODO
161
+ nextParentState = "nextAlineaElement";
162
+ state = "firstParagraphChild";
324
163
  break;
325
- }
326
- article.texte = article.debut;
327
- _context3.next = 21;
328
- break;
329
- case 17:
330
- _context3.next = 19;
331
- return chain.invoke({
332
- input: cleanedHtml,
333
- debut: article.debut,
334
- fin: article.fin
335
- });
336
- case 19:
337
- articlePromptResult = _context3.sent;
338
- article.texte = articlePromptResult.texte;
339
- case 21:
340
- _iterator2 = _createForOfIteratorHelper(article.alineas);
341
- _context3.prev = 22;
342
- _iterator2.s();
343
- case 24:
344
- if ((_step2 = _iterator2.n()).done) {
345
- _context3.next = 37;
164
+ case "P":
165
+ nextParentState = "nextAlineaElement";
166
+ state = "firstParagraphChild";
346
167
  break;
347
- }
348
- alinea = _step2.value;
349
- if (!(alinea.debut === alinea.fin || !alinea.fin)) {
350
- _context3.next = 29;
168
+ case "OL":
169
+ // TODO
170
+ state = "nextAlineaElement";
351
171
  break;
352
- }
353
- alinea.texte = alinea.debut;
354
- return _context3.abrupt("continue", 35);
355
- case 29:
356
- _context3.next = 31;
357
- return chain.invoke({
358
- input: article.texte,
359
- debut: alinea.debut,
360
- fin: alinea.fin
361
- });
362
- case 31:
363
- alineaPromptResult = _context3.sent;
364
- delete alinea.debut;
365
- delete alinea.fin;
366
- alinea.texte = alineaPromptResult.texte;
367
- case 35:
368
- _context3.next = 24;
369
- break;
370
- case 37:
371
- _context3.next = 42;
172
+ case "TABLE":
173
+ nextParentState = "nextAlineaElement";
174
+ state = "firstParagraphChild";
175
+ break;
176
+ default:
177
+ return {
178
+ error: {
179
+ code: -2,
180
+ message: "Unexpected tag name for alinea element: ".concat(alineaElement.tagName)
181
+ },
182
+ html: html,
183
+ page: page
184
+ };
185
+ }
186
+ break;
187
+ case "firstParagraphChild":
188
+ var headerText = alineaElement.textContent;
189
+ var nameComputed = (headerText || "").normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/\(nouveau\)/, "").replace(/\(Pour coordination\)/, "").replace(/\(Supprimés?\)/, "").replace(/ /g, " ").replace(/[\-,.…]/g, "").trim().replace(/ {1,}/g, "_");
190
+ var nameUpper = nameComputed.toUpperCase();
191
+ var _parseHeader = parseHeader(nameUpper),
192
+ _parseHeader2 = _slicedToArray(_parseHeader, 2),
193
+ nextLevel = _parseHeader2[0],
194
+ paragraphType = _parseHeader2[1];
195
+ if (!nameUpper || nameUpper.match(/^(PROJET|PROPOSITION)_DE_LOI(_|$)/) !== null) {
196
+ // Occurs in:
197
+ // * http://www.assemblee-nationale.fr/15/textes/0232.asp
198
+ // * http://www.assemblee-nationale.fr/15/textes/0626.asp
199
+ // * http://www.assemblee-nationale.fr/15/textes/0676.asp
200
+ state = nextParentState;
372
201
  break;
373
- case 39:
374
- _context3.prev = 39;
375
- _context3.t0 = _context3["catch"](22);
376
- _iterator2.e(_context3.t0);
377
- case 42:
378
- _context3.prev = 42;
379
- _iterator2.f();
380
- return _context3.finish(42);
381
- case 45:
382
- (0, _logger.runLogFun)(console.info("Opération de peuplement du contenu du projet de loi terminée ✅"), {
383
- silent: SILENT_LOG
384
- });
385
- delete article.debut;
386
- delete article.fin;
387
- fullArticles.push(article);
388
- case 49:
389
- _context3.next = 11;
202
+ } else if (nameUpper === "JEUX_OLYMPIQUES_ET_PARALYMPIQUES_DE_2024") {
203
+ // Occurs in http://www.assemblee-nationale.fr/15/textes/0676.asp
204
+ state = nextParentState;
390
205
  break;
391
- case 51:
392
- _context3.next = 56;
206
+ } else if (nameUpper === "TEXTE_DE_LA_COMMISSION_MIXTE_PARITAIRE") {
207
+ // Occurs in http://www.assemblee-nationale.fr/15/textes/1294.asp
208
+ state = nextParentState;
393
209
  break;
394
- case 53:
395
- _context3.prev = 53;
396
- _context3.t1 = _context3["catch"](9);
397
- _iterator.e(_context3.t1);
398
- case 56:
399
- _context3.prev = 56;
400
- _iterator.f();
401
- return _context3.finish(56);
402
- case 59:
403
- projetLoi = _objectSpread(_objectSpread({}, partial), {}, {
404
- articles: fullArticles
405
- });
406
- (0, _logger.runLogFun)(console.groupEnd(), {
407
- silent: SILENT_LOG
408
- });
409
- (0, _logger.delimiter)();
410
- return _context3.abrupt("return", projetLoi);
411
- case 63:
412
- case "end":
413
- return _context3.stop();
414
- }
415
- }, _callee3, null, [[9, 53, 56, 59], [22, 39, 42, 45]]);
416
- }));
417
- return _populateProjetLoi.apply(this, arguments);
418
- }
419
- function extractMotifs(_x6) {
420
- return _extractMotifs.apply(this, arguments);
421
- }
422
- /**
423
- * Asynchronously extracts the metadata from the given HTML.
424
- *
425
- * @param {string} html - The HTML string from which to extract the metadata.
426
- * @return {Promise<Record<string, any>>} - A Promise that resolves to the extracted metadata object.
427
- * The object contains the following properties:
428
- * - `documentRef`: The reference of the document.
429
- * - `titre`: The title of the document.
430
- * - `numeroTexte`: The number of the text.
431
- * - `procedureAcceleree`: The accelerated procedure.
432
- * @throws {Error} - If the extracted metadata do not validate against the META_DONNEES_SCHEMA.
433
- */
434
- function _extractMotifs() {
435
- _extractMotifs = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(html) {
436
- var cleanedHtml, structuredModel, motifsSystemTemplate, prompt, chain, motifsPromptResult, ajv;
437
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
438
- while (1) switch (_context4.prev = _context4.next) {
439
- case 0:
440
- (0, _logger.runLogFun)(console.group("Parsing expose motifs..."), {
441
- silent: SILENT_LOG
442
- });
443
- cleanedHtml = cleanHtml(html);
444
- cleanedHtml = removeHtmlTags(cleanedHtml);
445
- structuredModel = MODEL.withStructuredOutput(EXPOSE_MOTIFS_SCHEMA);
446
- motifsSystemTemplate = "\n ".concat(SYSTEM_TEMPLATE, "\n\n # Examples: \n\n ## Exemple 1 User Input :\n \"\"\"\n {example1}\n \"\"\"\n \n ## Exemple 1 JSON Output :\n \"\"\"\n {output1}\n \"\"\"\n\n ## Exemple 2 User Input :\n \"\"\"\n {example2}\n \"\"\"\n \n ## Exemple 2 JSON Output :\n \"\"\"\n {output2}\n \"\"\"\n ");
447
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", motifsSystemTemplate], ["human", "{input}"]]);
448
- chain = prompt.pipe(structuredModel);
449
- _context4.next = 9;
450
- return chain.invoke({
451
- input: cleanedHtml,
452
- example1: EXAMPLES.PRJLANR5L16B0914.input,
453
- example2: EXAMPLES.PRJLANR5L16B2424.input,
454
- output1: EXAMPLES.PRJLANR5L16B0914.motifs,
455
- output2: EXAMPLES.PRJLANR5L16B2424.motifs
456
- });
457
- case 9:
458
- motifsPromptResult = _context4.sent;
459
- // console.log(JSON.stringify(motifsPromptResult))
460
- (0, _logger.runLogFun)(console.table([["Début", motifsPromptResult.debut.substring(0, 30)], ["Fin", motifsPromptResult.fin.substring(0, 30)]]), {
461
- silent: SILENT_LOG
462
- });
463
- (0, _logger.runLogFun)(console.groupEnd(), {
464
- silent: SILENT_LOG
465
- });
466
- (0, _logger.delimiter)();
467
- ajv = new _ajv["default"]();
468
- if (!ajv.validate(EXPOSE_MOTIFS_SCHEMA, motifsPromptResult)) {
469
- _context4.next = 17;
470
- break;
471
- }
472
- (0, _logger.runLogFun)(console.info("Exposé des motifs OK 👌"), {
473
- silent: SILENT_LOG
474
- });
475
- return _context4.abrupt("return", motifsPromptResult);
476
- case 17:
477
- (0, _logger.runLogFun)(console.warn("Exposé des motifs KO ❌"), {
478
- silent: SILENT_LOG
479
- });
480
- return _context4.abrupt("return", {});
481
- case 19:
482
- case "end":
483
- return _context4.stop();
484
- }
485
- }, _callee4);
486
- }));
487
- return _extractMotifs.apply(this, arguments);
488
- }
489
- function extractMetaDonnees(_x7) {
490
- return _extractMetaDonnees.apply(this, arguments);
491
- }
492
- /**
493
- * Asynchronously extracts the "projet de loi" from the given HTML.
494
- *
495
- * @param {string} html - The HTML string from which to extract the "projet de loi".
496
- * @return {Promise<Record<string, any>>} - A Promise that resolves to the extracted "projet de loi" object.
497
- * The object contains the following properties:
498
- * - `articles`: An array of article objects, each containing the following properties:
499
- * - `numeroArticle`: The number of the article.
500
- * - `cardinal`: The cardinal of the article.
501
- * - `titre`: The title of the article.
502
- * - `debut`: The beginning of the article.
503
- * - `fin`: The end of the article.
504
- * - `alineas`: An array of alineas.
505
- * @throws {Error} - If the extracted "projet de loi" does not validate against the PROJET_LOI_SCHEMA.
506
- */
507
- function _extractMetaDonnees() {
508
- _extractMetaDonnees = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(html) {
509
- var cleanedHtml, structuredModel, metaDonneesSystemTemplate, prompt, chain, result, ajv;
510
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
511
- while (1) switch (_context5.prev = _context5.next) {
512
- case 0:
513
- (0, _logger.delimiter)();
514
- cleanedHtml = cleanHtml(html);
515
- cleanedHtml = removeHtmlTags(cleanedHtml);
516
- structuredModel = MODEL.withStructuredOutput(META_DONNEES_SCHEMA);
517
- metaDonneesSystemTemplate = "\n ".concat(SYSTEM_TEMPLATE, "\n ");
518
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", metaDonneesSystemTemplate], ["human", "{input}"]]);
519
- chain = prompt.pipe(structuredModel);
520
- _context5.next = 9;
521
- return chain.invoke({
522
- input: cleanedHtml,
523
- example1: EXAMPLES.PRJLANR5L16B0914.input,
524
- example2: EXAMPLES.PRJLANR5L16B2424.input,
525
- output1: EXAMPLES.PRJLANR5L16B0914.meta,
526
- output2: EXAMPLES.PRJLANR5L16B2424.meta
527
- });
528
- case 9:
529
- result = _context5.sent;
530
- console.group("Meta-données");
531
- console.table([["Référence", result.documentRef], ["Titre", result.titre], ["Numéro du texte", result.numeroTexte], ["Procédure accéléré", result.procedureAcceleree]]);
532
- console.groupEnd();
533
- (0, _logger.delimiter)();
534
- ajv = new _ajv["default"]();
535
- if (!ajv.validate(META_DONNEES_SCHEMA, result)) {
536
- _context5.next = 18;
537
- break;
210
+ }
211
+ var lineHtml = cleanText(alineaElement.outerHTML);
212
+ var lineText = cleanText(alineaElement.textContent);
213
+ if (nextLevel === null) {
214
+ // It is a regular alinea
215
+ // Exclude some alineas
216
+ var excludeAlinea = false;
217
+ var _iterator = _createForOfIteratorHelper(excludedAlineas),
218
+ _step;
219
+ try {
220
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
221
+ var regex = _step.value;
222
+ if (regex.test(lineText)) {
223
+ excludeAlinea = true;
224
+ }
225
+ }
226
+ } catch (err) {
227
+ _iterator.e(err);
228
+ } finally {
229
+ _iterator.f();
538
230
  }
539
- (0, _logger.runLogFun)(console.warn("Meta-données OK 👌"), {
540
- silent: SILENT_LOG
541
- });
542
- return _context5.abrupt("return", result);
543
- case 18:
544
- (0, _logger.runLogFun)(console.warn("Meta-données non-conforme ❌"), {
545
- silent: SILENT_LOG
546
- });
547
- return _context5.abrupt("return", {});
548
- case 20:
549
- case "end":
550
- return _context5.stop();
551
- }
552
- }, _callee5);
553
- }));
554
- return _extractMetaDonnees.apply(this, arguments);
555
- }
556
- function extractProjetLoi(_x8) {
557
- return _extractProjetLoi.apply(this, arguments);
558
- }
559
- function _extractProjetLoi() {
560
- _extractProjetLoi = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(html) {
561
- var cleanedHtml, structuredModel, projetLoiSystemTemplate, prompt, chain, articlesPromptResult, _iterator3, _step3, article, ajv;
562
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
563
- while (1) switch (_context6.prev = _context6.next) {
564
- case 0:
565
- (0, _logger.runLogFun)(console.group("Parsing loi..."), {
566
- silent: SILENT_LOG
567
- });
568
- cleanedHtml = cleanHtml(html);
569
- structuredModel = MODEL.withStructuredOutput(PROJET_LOI_SCHEMA);
570
- projetLoiSystemTemplate = "\n ".concat(SYSTEM_TEMPLATE, "\n\n # Examples: \n\n ## Exemple 1 User Input :\n \"\"\"\n {example1}\n \"\"\"\n \n ## Exemple 1 JSON Output :\n \"\"\"\n {output1}\n \"\"\"\n\n ## Exemple 2 User Input :\n \"\"\"\n {example2}\n \"\"\"\n \n ## Exemple 2 JSON Output :\n \"\"\"\n {output2}\n \"\"\"\n ");
571
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", projetLoiSystemTemplate], ["human", "{input}"]]);
572
- chain = prompt.pipe(structuredModel);
573
- _context6.next = 8;
574
- return chain.invoke({
575
- input: cleanedHtml,
576
- example1: EXAMPLES.PRJLANR5L16B0914.input,
577
- example2: EXAMPLES.PRJLANR5L16B2424.input,
578
- output1: EXAMPLES.PRJLANR5L16B0914.loi,
579
- output2: EXAMPLES.PRJLANR5L16B2424.loi
580
- });
581
- case 8:
582
- articlesPromptResult = _context6.sent;
583
- (0, _logger.runLogFun)(console.log("Found ", articlesPromptResult.articles.length, " articles."), {
584
- silent: SILENT_LOG
585
- });
586
- _iterator3 = _createForOfIteratorHelper(articlesPromptResult.articles);
587
- _context6.prev = 11;
588
- _iterator3.s();
589
- case 13:
590
- if ((_step3 = _iterator3.n()).done) {
591
- _context6.next = 20;
231
+ if (excludeAlinea) {
232
+ state = nextParentState;
592
233
  break;
593
234
  }
594
- article = _step3.value;
595
- _context6.next = 17;
596
- return extractAlineas(html, article);
597
- case 17:
598
- article.alineas = _context6.sent;
599
- case 18:
600
- _context6.next = 13;
601
- break;
602
- case 20:
603
- _context6.next = 25;
604
- break;
605
- case 22:
606
- _context6.prev = 22;
607
- _context6.t0 = _context6["catch"](11);
608
- _iterator3.e(_context6.t0);
609
- case 25:
610
- _context6.prev = 25;
611
- _iterator3.f();
612
- return _context6.finish(25);
613
- case 28:
614
- (0, _logger.runLogFun)(console.table(articlesPromptResult.articles.map(function (article) {
615
- return [article.numeroArticle, article.titre, article.debut.substring(0, 10), article.fin.substring(0, 10), "Nombre d'alineas : ".concat(article.alineas.length)];
616
- })), {
617
- silent: SILENT_LOG
618
- });
619
- (0, _logger.runLogFun)(console.groupEnd(), {
620
- silent: SILENT_LOG
621
- });
622
- ajv = new _ajv["default"]();
623
- if (!ajv.validate(PROJET_LOI_SCHEMA, articlesPromptResult)) {
624
- _context6.next = 35;
625
- break;
235
+ if (subdivisionHeaders.length === 0 || isMultiLinesHeader && subdivisionAlineas.length === 0) {
236
+ subdivisionHeaders.push({
237
+ texte: lineText,
238
+ html: lineHtml
239
+ });
240
+ } else {
241
+ subdivisionAlineas.push({
242
+ texte: lineText,
243
+ html: lineHtml
244
+ });
626
245
  }
627
- (0, _logger.runLogFun)(console.info("Projet de loi OK 👌"), {
628
- silent: SILENT_LOG
629
- });
630
- (0, _logger.delimiter)();
631
- return _context6.abrupt("return", articlesPromptResult);
632
- case 35:
633
- (0, _logger.runLogFun)(console.warn("Projet de loi KO ❌"), {
634
- silent: SILENT_LOG
635
- });
636
- (0, _logger.delimiter)();
637
- return _context6.abrupt("return", {});
638
- case 38:
639
- case "end":
640
- return _context6.stop();
641
- }
642
- }, _callee6, null, [[11, 22, 25, 28]]);
643
- }));
644
- return _extractProjetLoi.apply(this, arguments);
645
- }
646
- function extractAlineas(_x9, _x10) {
647
- return _extractAlineas.apply(this, arguments);
648
- }
649
- /**
650
- * Asynchronously extracts the "sommaire" (outline) from the given HTML.
651
- *
652
- * @param {string} html - The HTML string from which to extract the "sommaire".
653
- * @return {Promise<Record<string, any>>} - A Promise that resolves to the extracted "sommaire" object.
654
- * The object contains the following properties:
655
- * - `sommaire`: An array of main division objects, each containing the following properties:
656
- * - `numeroDivision`: The number of the main division.
657
- * - `titre`: The title of the main division.
658
- * - `typeDivision`: The type of content in the main division.
659
- * - `sequence`: The sequence of the main division.
660
- * - `parent`: The parent of the main division.
661
- * @throws {Error} - If the extracted "sommaire" does not validate against the SOMMAIRE_SCHEMA.
662
- */
663
- function _extractAlineas() {
664
- _extractAlineas = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(html, article) {
665
- var cleanedHtml, structuredModel, alineasSystemTemplate, prompt, chain, alineasPromptResult, ajv;
666
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
667
- while (1) switch (_context7.prev = _context7.next) {
668
- case 0:
669
- (0, _logger.runLogFun)(console.group("Parsing alineas..."), {
670
- silent: SILENT_LOG
671
- });
672
- cleanedHtml = cleanHtml(html);
673
- structuredModel = MODEL.withStructuredOutput(ALINEA_SCHEMA);
674
- alineasSystemTemplate = "\n ".concat(SYSTEM_TEMPLATE, "\n\n Extrais tous les alineas de la portion de texte commen\xE7ant par \xAB {debut} \xBB et finissant par \xAB {fin} \xBB.\n Un alin\xE9a contiennent toujours une balise \xAB <img \xBB.\n\n # Examples: \n\n ## Exemple 1 User Input :\n \"\"\"\n {example1}\n \"\"\"\n \n ## Exemple 1 JSON Output :\n \"\"\"\n {output1}\n \"\"\"\n ");
675
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", alineasSystemTemplate], ["human", "{input}"]]);
676
- chain = prompt.pipe(structuredModel);
677
- _context7.next = 8;
678
- return chain.invoke({
679
- input: cleanedHtml,
680
- debut: article.debut,
681
- fin: article.fin,
682
- example1: EXAMPLES.PRJLANR5L16B2424.input,
683
- output1: EXAMPLES.PRJLANR5L16B2424.alineas
684
- });
685
- case 8:
686
- alineasPromptResult = _context7.sent;
687
- ajv = new _ajv["default"]();
688
- if (!ajv.validate(ALINEA_SCHEMA, alineasPromptResult)) {
689
- _context7.next = 15;
690
- break;
246
+ if (isMultiLinesHeader && subdivisionHeaders.length >= 2) {
247
+ isMultiLinesHeader = false;
691
248
  }
692
- (0, _logger.runLogFun)(console.info("Found ", alineasPromptResult.alineas.length, " alineas for Article ", article.numeroArticle, article.titre), {
693
- silent: SILENT_LOG
694
- });
695
- (0, _logger.runLogFun)(console.groupEnd(), {
696
- silent: SILENT_LOG
697
- });
698
- (0, _logger.delimiter)();
699
- return _context7.abrupt("return", alineasPromptResult.alineas);
700
- case 15:
701
- (0, _logger.runLogFun)(console.warn("Alineas KO"), {
702
- silent: SILENT_LOG
703
- });
704
- (0, _logger.delimiter)();
705
- return _context7.abrupt("return", {});
706
- case 18:
707
- case "end":
708
- return _context7.stop();
709
- }
710
- }, _callee7);
711
- }));
712
- return _extractAlineas.apply(this, arguments);
713
- }
714
- function extractSommaire(_x11) {
715
- return _extractSommaire.apply(this, arguments);
716
- }
717
- function _extractSommaire() {
718
- _extractSommaire = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(html) {
719
- var cleanedHtml, structuredModel, sommaireSystemTemplate, prompt, chain, sommairePromptResult, ajv;
720
- return _regeneratorRuntime().wrap(function _callee8$(_context8) {
721
- while (1) switch (_context8.prev = _context8.next) {
722
- case 0:
723
- cleanedHtml = cleanHtml(html);
724
- cleanedHtml = removeHtmlTags(cleanedHtml);
725
- structuredModel = MODEL.withStructuredOutput(SOMMAIRE_SCHEMA);
726
- sommaireSystemTemplate = "\n ".concat(SYSTEM_TEMPLATE, "\n\n # Examples: \n\n ## Exemple 1 User Input :\n \"\"\"\n {example1}\n \"\"\"\n \n ## Exemple 1 JSON Output :\n \"\"\"\n {output1}\n \"\"\"\n\n ## Exemple 2 User Input :\n \"\"\"\n {example2}\n \"\"\"\n \n ## Exemple 2 JSON Output :\n \"\"\"\n {output2}\n \"\"\"\n ");
727
- prompt = _prompts.ChatPromptTemplate.fromMessages([["system", sommaireSystemTemplate], ["human", "{input}"]]);
728
- chain = prompt.pipe(structuredModel);
729
- _context8.next = 8;
730
- return chain.invoke({
731
- input: cleanedHtml,
732
- example1: EXAMPLES.PRJLANR5L16B2014.input,
733
- output1: EXAMPLES.PRJLANR5L16B2014.sommaire,
734
- example2: EXAMPLES.PRJLANR5L16B0914.input,
735
- output2: EXAMPLES.PRJLANR5L16B0914.sommaire
736
- });
737
- case 8:
738
- sommairePromptResult = _context8.sent;
739
- if (sommairePromptResult.sommaire) {
740
- _context8.next = 13;
741
- break;
249
+ // Skip paragraph.
250
+ state = nextParentState;
251
+ break;
252
+ } else if (nextLevel !== null) {
253
+ // It is a header
254
+ level = nextLevel;
255
+ while (levels.length > 0 && level < levels[levels.length - 1]) {
256
+ levels.pop();
742
257
  }
743
- (0, _logger.runLogFun)(console.warn("Aucun sommaire n'a été trouvé ❓"), {
744
- silent: SILENT_LOG
745
- });
746
- (0, _logger.delimiter)();
747
- return _context8.abrupt("return", {
748
- sommaire: []
749
- });
750
- case 13:
751
- (0, _logger.runLogFun)(console.group("Sommaire"), {
752
- silent: SILENT_LOG
753
- });
754
- (0, _logger.runLogFun)(console.log("Found ", sommairePromptResult.sommaire.length, " main divisions (level 1)."), {
755
- silent: SILENT_LOG
756
- });
757
- (0, _logger.runLogFun)(console.table(sommairePromptResult.sommaire.map(function (item) {
758
- return [item.sequence, item.titre, item.typeDivision, item.parent];
759
- })), {
760
- silent: SILENT_LOG
761
- });
762
- (0, _logger.runLogFun)(console.groupEnd(), {
763
- silent: SILENT_LOG
764
- });
765
- ajv = new _ajv["default"]();
766
- if (!ajv.validate(SOMMAIRE_SCHEMA, sommairePromptResult)) {
767
- _context8.next = 22;
768
- break;
258
+ if (levels.length === 0 || level > levels[levels.length - 1]) {
259
+ levels.push(level);
769
260
  }
770
- (0, _logger.runLogFun)(console.info("Sommaire OK 👌"), {
771
- silent: SILENT_LOG
772
- });
773
- (0, _logger.delimiter)();
774
- return _context8.abrupt("return", sommairePromptResult.sommaire);
775
- case 22:
776
- (0, _logger.runLogFun)(console.warn("La construction du sommaire est KO ❌"), {
777
- silent: SILENT_LOG
778
- });
779
- (0, _logger.delimiter)();
780
- return _context8.abrupt("return", {
781
- sommaire: []
782
- });
783
- case 25:
784
- case "end":
785
- return _context8.stop();
786
- }
787
- }, _callee8);
788
- }));
789
- return _extractSommaire.apply(this, arguments);
261
+ subdivisionAlineas = [];
262
+ subdivisionHeaders = [{
263
+ texte: lineText,
264
+ html: lineHtml
265
+ }];
266
+
267
+ // Articles & "Exposé des motifs" are the only divisions without second title.
268
+ isMultiLinesHeader = nameUpper.match(/^ARTICLES?_/) === null && nameUpper.match(/^EXPOSE_DES_MOTIFS$/) === null;
269
+ subdivisions.push({
270
+ id: "D_" + nameComputed,
271
+ type: paragraphType,
272
+ niveau: level + 1,
273
+ niveauRelatif: levels.length,
274
+ titres: subdivisionHeaders,
275
+ alineas: subdivisionAlineas
276
+ });
277
+ }
278
+ state = nextParentState;
279
+ break;
280
+ case "nextAlineaElement":
281
+ alineaElement = alineaElement.nextElementSibling;
282
+ if (alineaElement === null) {
283
+ // The bodyChild has been fully parsed. Go to next bodyChild
284
+ state = "nextBodyChild";
285
+ } else {
286
+ state = "alineaElement";
287
+ }
288
+ break;
289
+ default:
290
+ throw "Unexpected state: ".concat(state);
291
+ }
292
+ }
293
+ window.close(); // Free memory.
294
+
295
+ return {
296
+ error: null,
297
+ html: html,
298
+ page: page,
299
+ subdivisions: subdivisions,
300
+ url: assembleeUrl
301
+ };
790
302
  }
791
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfb3BlbmFpIiwicmVxdWlyZSIsIl9wcm9tcHRzIiwiX2FqdiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbG9nZ2VyIiwib2JqIiwiX19lc01vZHVsZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJrZXkiLCJ2YWx1ZSIsIl90b1Byb3BlcnR5S2V5IiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZiIsIlN0cmluZyIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIk51bWJlciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiYWxsb3dBcnJheUxpa2UiLCJpdCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiRiIsInMiLCJuIiwiZG9uZSIsIl9lIiwiZiIsIm5vcm1hbENvbXBsZXRpb24iLCJkaWRFcnIiLCJlcnIiLCJzdGVwIiwibmV4dCIsIl9lMiIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiYXJyIiwibGVuIiwiYXJyMiIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImEiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImgiLCJsIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwicmVqZWN0IiwiX25leHQiLCJfdGhyb3ciLCJpbmZvIiwiZXJyb3IiLCJfYXN5bmNUb0dlbmVyYXRvciIsImZuIiwic2VsZiIsImFyZ3MiLCJ1bmRlZmluZWQiLCJBTElORUFfU0NIRU1BIiwiRVhQT1NFX01PVElGU19TQ0hFTUEiLCJNRVRBX0RPTk5FRVNfU0NIRU1BIiwiUFJPSkVUX0xPSV9TQ0hFTUEiLCJTT01NQUlSRV9TQ0hFTUEiLCJFWEFNUExFUyIsIlBSSkxBTlI1TDE2QjA5MTQiLCJtb3RpZnMiLCJpbnB1dCIsImxvaSIsIm1ldGEiLCJzb21tYWlyZSIsIlBSSkxBTlI1TDE2QjIwMTQiLCJQUkpMQU5SNUwxNkIyNDI0IiwiYWxpbmVhcyIsIkZVTExfVEVYVEVfU0NIRU1BIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJwcm9wZXJ0aWVzIiwidGV4dGUiLCJyZXF1aXJlZCIsIk1PREVMIiwicHJvY2VzcyIsImVudiIsInByb2Nlc3MuZW52IiwiT1BFTkFJX0FQSV9LRVkiLCJDaGF0T3BlbkFJIiwidGVtcGVyYXR1cmUiLCJ0b3BQIiwibW9kZWwiLCJhcGlLZXkiLCJtYXhUb2tlbnMiLCJTWVNURU1fVEVNUExBVEUiLCJTSUxFTlRfTE9HIiwicGFyc2VUZXh0ZUxvaSIsIl94IiwiX3BhcnNlVGV4dGVMb2kiLCJfY2FsbGVlIiwiaHRtbCIsIm9wdGlvbnMiLCJwYXJ0aWFsTW90aWZzIiwicGFydGlhbExvaSIsImV4cG9zZU1vdGlmcyIsIl9hcmdzIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInNpbGVudCIsInJ1bkxvZ0Z1biIsImNvbnNvbGUiLCJleHRyYWN0TWV0YURvbm5lZXMiLCJleHRyYWN0U29tbWFpcmUiLCJleHRyYWN0TW90aWZzIiwiZXh0cmFjdFByb2pldExvaSIsInBvcHVsYXRlTW90aWZzIiwicG9wdWxhdGVQcm9qZXRMb2kiLCJjbGVhbkh0bWwiLCJjbGVhbmVkSHRtbCIsInJlcGxhY2UiLCJyZW1vdmVIdG1sVGFncyIsImh0bWxUYWdSZWdleCIsInRleHRXaXRob3V0VGFncyIsIl94MiIsIl94MyIsIl9wb3B1bGF0ZU1vdGlmcyIsIl9jYWxsZWUyIiwic3lzdGVtVGVtcGxhdGUiLCJwcm9tcHQiLCJzdHJ1Y3R1cmVkTW9kZWwiLCJjaGFpbiIsImFydGljbGVQcm9tcHRSZXN1bHQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJkZWJ1dCIsImZpbiIsIkNoYXRQcm9tcHRUZW1wbGF0ZSIsImZyb21NZXNzYWdlcyIsIndpdGhTdHJ1Y3R1cmVkT3V0cHV0IiwicGlwZSIsImRlbGltaXRlciIsIl94NCIsIl94NSIsIl9wb3B1bGF0ZVByb2pldExvaSIsIl9jYWxsZWUzIiwicGFydGlhbCIsImFydGljbGVzIiwiZnVsbEFydGljbGVzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJhcnRpY2xlIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImFsaW5lYSIsImFsaW5lYVByb21wdFJlc3VsdCIsInByb2pldExvaSIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsImdyb3VwIiwidDAiLCJ0MSIsImdyb3VwRW5kIiwiX3g2IiwiX2V4dHJhY3RNb3RpZnMiLCJfY2FsbGVlNCIsIm1vdGlmc1N5c3RlbVRlbXBsYXRlIiwibW90aWZzUHJvbXB0UmVzdWx0IiwiYWp2IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiY29uY2F0IiwiZXhhbXBsZTEiLCJleGFtcGxlMiIsIm91dHB1dDEiLCJvdXRwdXQyIiwidGFibGUiLCJzdWJzdHJpbmciLCJBanYiLCJ2YWxpZGF0ZSIsIndhcm4iLCJfeDciLCJfZXh0cmFjdE1ldGFEb25uZWVzIiwiX2NhbGxlZTUiLCJtZXRhRG9ubmVlc1N5c3RlbVRlbXBsYXRlIiwicmVzdWx0IiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ1IiwiZG9jdW1lbnRSZWYiLCJ0aXRyZSIsIm51bWVyb1RleHRlIiwicHJvY2VkdXJlQWNjZWxlcmVlIiwiX3g4IiwiX2V4dHJhY3RQcm9qZXRMb2kiLCJfY2FsbGVlNiIsInByb2pldExvaVN5c3RlbVRlbXBsYXRlIiwiYXJ0aWNsZXNQcm9tcHRSZXN1bHQiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwibG9nIiwiZXh0cmFjdEFsaW5lYXMiLCJtYXAiLCJudW1lcm9BcnRpY2xlIiwiX3g5IiwiX3gxMCIsIl9leHRyYWN0QWxpbmVhcyIsIl9jYWxsZWU3IiwiYWxpbmVhc1N5c3RlbVRlbXBsYXRlIiwiYWxpbmVhc1Byb21wdFJlc3VsdCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsIl94MTEiLCJfZXh0cmFjdFNvbW1haXJlIiwiX2NhbGxlZTgiLCJzb21tYWlyZVN5c3RlbVRlbXBsYXRlIiwic29tbWFpcmVQcm9tcHRSZXN1bHQiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJpdGVtIiwic2VxdWVuY2UiLCJ0eXBlRGl2aXNpb24iLCJwYXJlbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2Vycy90ZXh0ZXNfbG9pcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGF0T3BlbkFJIH0gZnJvbSBcIkBsYW5nY2hhaW4vb3BlbmFpXCJcbmltcG9ydCB7IENoYXRQcm9tcHRUZW1wbGF0ZSB9IGZyb20gXCJAbGFuZ2NoYWluL2NvcmUvcHJvbXB0c1wiXG5pbXBvcnQgQWp2IGZyb20gXCJhanZcIlxuXG5pbXBvcnQgeyBkZWxpbWl0ZXIsIHJ1bkxvZ0Z1biB9IGZyb20gXCIuLi9sb2dnZXJcIlxuXG5jb25zdCBBTElORUFfU0NIRU1BID0gcmVxdWlyZShcIi4uL3NjaGVtYXMvdGV4dGVfbG9pL0FsaW5lYS5qc29uXCIpXG5jb25zdCBFWFBPU0VfTU9USUZTX1NDSEVNQSA9IHJlcXVpcmUoXCIuLi9zY2hlbWFzL3RleHRlX2xvaS9FeHBvc2VNb3RpZnMuanNvblwiKVxuY29uc3QgTUVUQV9ET05ORUVTX1NDSEVNQSA9IHJlcXVpcmUoXCIuLi9zY2hlbWFzL3RleHRlX2xvaS9NZXRhRG9ubmVlcy5qc29uXCIpXG5jb25zdCBQUk9KRVRfTE9JX1NDSEVNQSA9IHJlcXVpcmUoXCIuLi9zY2hlbWFzL3RleHRlX2xvaS9Qcm9qZXRMb2kuanNvblwiKVxuY29uc3QgU09NTUFJUkVfU0NIRU1BID0gcmVxdWlyZShcIi4uL3NjaGVtYXMvdGV4dGVfbG9pL1NvbW1haXJlLmpzb25cIilcblxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBpbnB1dCBleGFtcGxlcyBhbmQgdGhlaXIgb3V0cHV0IHNjaGVtYXMuXG4gKiBVc2VkIHRvIHRyYWluIHRoZSBMTE0uXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge21vdGlmczogYW55LCBpbnB1dDogYW55LCBsb2k6IGFueSwgbWV0YTogYW55LCBzb21tYWlyZTogYW55fT59XG4gKi9cbmNvbnN0IEVYQU1QTEVTID0ge1xuICBQUkpMQU5SNUwxNkIwOTE0OiB7XG4gICAgbW90aWZzOiByZXF1aXJlKFwiLi4vZXhhbXBsZXMvUFJKTEFOUjVMMTZCMDkxNC9tb3RpZnMuanNvblwiKSxcbiAgICBpbnB1dDogcmVxdWlyZShcIi4uL2V4YW1wbGVzL1BSSkxBTlI1TDE2QjA5MTQvaW5wdXRcIiksXG4gICAgbG9pOiByZXF1aXJlKFwiLi4vZXhhbXBsZXMvUFJKTEFOUjVMMTZCMDkxNC9sb2kuanNvblwiKSxcbiAgICBtZXRhOiByZXF1aXJlKFwiLi4vZXhhbXBsZXMvUFJKTEFOUjVMMTZCMDkxNC9tZXRhLmpzb25cIiksXG4gICAgc29tbWFpcmU6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIwOTE0L3NvbW1haXJlLmpzb25cIiksXG4gIH0sXG4gIFBSSkxBTlI1TDE2QjIwMTQ6IHtcbiAgICBtb3RpZnM6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyMDE0L21vdGlmcy5qc29uXCIpLFxuICAgIGlucHV0OiByZXF1aXJlKFwiLi4vZXhhbXBsZXMvUFJKTEFOUjVMMTZCMjAxNC9pbnB1dFwiKSxcbiAgICBsb2k6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyMDE0L2xvaS5qc29uXCIpLFxuICAgIG1ldGE6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyMDE0L21ldGEuanNvblwiKSxcbiAgICBzb21tYWlyZTogcmVxdWlyZShcIi4uL2V4YW1wbGVzL1BSSkxBTlI1TDE2QjIwMTQvc29tbWFpcmUuanNvblwiKSxcbiAgfSxcbiAgUFJKTEFOUjVMMTZCMjQyNDoge1xuICAgIGFsaW5lYXM6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyNDI0L2FsaW5lYXMuanNvblwiKSxcbiAgICBtb3RpZnM6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyNDI0L21vdGlmcy5qc29uXCIpLFxuICAgIGlucHV0OiByZXF1aXJlKFwiLi4vZXhhbXBsZXMvUFJKTEFOUjVMMTZCMjQyNC9pbnB1dFwiKSxcbiAgICBsb2k6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyNDI0L2xvaS5qc29uXCIpLFxuICAgIG1ldGE6IHJlcXVpcmUoXCIuLi9leGFtcGxlcy9QUkpMQU5SNUwxNkIyNDI0L21ldGEuanNvblwiKSxcbiAgICBzb21tYWlyZTogcmVxdWlyZShcIi4uL2V4YW1wbGVzL1BSSkxBTlI1TDE2QjI0MjQvc29tbWFpcmUuanNvblwiKSxcbiAgfSxcbn1cblxuY29uc3QgRlVMTF9URVhURV9TQ0hFTUEgPSB7XG4gICRzY2hlbWE6IFwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjXCIsXG4gIHRpdGxlOiBcIlNvbW1haXJlXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlLDqWN1cMOpcmF0aW9uIGQndW4gdGV4dGUgY29tcGxldFwiLFxuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgdGV4dGU6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRleHRlIGNvbXBsZXQgZGUgbGEgc2VjdGlvbiBpbmRpcXXDqWUuXCIsXG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH0sXG4gIHJlcXVpcmVkOiBbXCJ0ZXh0ZVwiXSxcbn1cblxuLyoqXG4gKiBMTE0gbW9kZWwuXG4gKi9cbmxldCBNT0RFTDogYW55ID0gbnVsbFxuXG5pZiAocHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVkpIHtcbiAgTU9ERUwgPSBuZXcgQ2hhdE9wZW5BSSh7XG4gICAgdGVtcGVyYXR1cmU6IDAsXG4gICAgdG9wUDogMC4wLFxuICAgIG1vZGVsOiBcImdwdC00by1taW5pXCIsXG4gICAgYXBpS2V5OiBwcm9jZXNzLmVudi5PUEVOQUlfQVBJX0tFWSxcbiAgICBtYXhUb2tlbnM6IC0xLFxuICB9KVxufVxuXG4vKipcbiAqIFN5c3RlbSBpbnB1dCB0ZW1wbGF0ZSBmb3IgdGhlIExMTS5cbiAqL1xuY29uc3QgU1lTVEVNX1RFTVBMQVRFOiBzdHJpbmcgPSBgXG4gICMgSW5zdHJ1Y3Rpb25zIDpcbiAgXG4gIFR1IGVzIHVuIGV4cGVydCBkZSBsYSBsb2kgZXQgZGUgbCdhbmFseXNlIGRlIHBhZ2VzIEhUTUwuXG4gIFR1IGRvaXMgYW5hbHlzZXIgdW4gdGV4dGUgZGUgbG9pIGFmaW4gZGUgc8OpcGFyZXIgZXQgZGUgc3RydWN0dXJlciBsZXMgw6lsw6ltZW50cyBxdWkgbGUgY29tcG9zZW50LiBMZSBmb3JtYXQgZCdlbnRyw6llIGVzdCBIVE1MLlxuXG4gIExlIHRleHRlIGVzdCBkaXZpc8OpIGVuIGRldXggcGFydGllcyA6XG4gIEEpIHVuIGV4cG9zw6kgZGVzIG1vdGlmcyBxdWkgaW5kaXF1ZSBsZXMgcmFpc29ucyBwb3VyIGxlc3F1ZWxsZXMgY2UgcHJvamV0IGVzdCBzb3VtaXMgYXUgUGFybGVtZW50LiBJbCBwZXV0IGNvbnRlbmlyIDMgw6lsw6ltZW50cyA6IDEpIHVuZSBjaXRhdGlvbiBhdSBkw6lidXQgZCd1biBkb2N1bWVudCwgMikgbGUgdGV4dGUgcHJpbmNpcGFsIHF1aSBkw6l2ZWxvcHBlIGxlcyBhcmd1bWVudHMgZGUgbCdhdXRldXIgw6AgbCdhcHB1aSBkZSBsYSBtb2RpZmljYXRpb24gbMOpZ2lzbGF0aXZlIG91IGRlcyBkaXNwb3NpdGlvbnMgbm91dmVsbGVzIHF1J2lsIHByb3Bvc2UsIDMpIGRlcyBwYXJhZ3JhcGhlcyBxdWkgcHLDqXNlbnRlbnQgbGVzIGFydGljbGVzLlxuICBCKSBsZSBkaXNwb3NpdGlmIHF1aSBlc3QgbGEgcGFydGllIG5vcm1hdGl2ZSBldCByw6lkaWfDqWUgZW4gYXJ0aWNsZXMuIElsIHBldXQgY29tcG9ydGVyIGRlcyBkaXZpc2lvbnMgbm9tbcOpZXMgdGl0cmVzLCBjaGFwaXRyZXMsIHNlY3Rpb25zLCBzb3VzLXNlY3Rpb25zLiBMb3JzcXUnaWwgeSBhIHVuIHNldWwgbml2ZWF1IGRlIHN0cnVjdHVyZSwgb24gcmV0cm91dmVyYSBsZSBjaGFwaXRyZSA7IHPigJlpbCB5IGEgZGV1eCBuaXZlYXV4IGRlIHN0cnVjdHVyZSwgb24gcmV0cm91dmVyYSBkZXMgY2hhcGl0cmVzIHB1aXMgZGVzIHNlY3Rpb25zLiBT4oCZaWwgeSBhIHRyb2lzIG5pdmVhdXggZGUgc3RydWN0dXJlLCBvbiByZXRyb3V2ZXJhIGRlcyB0aXRyZXMgcHVpcyBkZXMgY2hhcGl0cmVzIHB1aXMgZGVzIHNlY3Rpb25zLlxuXG4gIFNpIGxlIHRleHRlIGRlIGxvaSBuZSBjb21wb3J0ZSBwYXMgZGUgZGl2aXNpb24sIGxlIHNvbW1haXJlIGRvaXQgcmVzdGVyIHZpZGUuXG4gIFRvdXRlcyBsZXMgbGlnbmVzIHF1aSBkw6lidXRlbnQgcGFyIHVuICfCqycgbmUgc29udCBwYXMgw6AgcHJlbmRyZSBlbiBjb21wdGUgZGFucyBsZXMgZGl2aXNpb25zXG4gIFRhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gSlNPTiBzdHJ1Y3R1csOpIGF2ZWMgbGVzIMOpbMOpbWVudHMgZHUgdGV4dGUgZGUgbG9pIGVuIHJlc3BlY3RhbnQgbGUgc2Now6ltYSBKU09OIGZvdXJuaS5cbmBcblxubGV0IFNJTEVOVF9MT0cgPSBmYWxzZVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmcgYW5kIHJldHVybnMgdGhlIHBhcnNlZCB0ZXh0ZXMgbG9pLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gVGhlIEhUTUwgc3RyaW5nIHRvIHBhcnNlLlxuICogQHJldHVybiB7UHJvbWlzZTx7cGFydGlhbDoge3NvbW1haXJlOiBhbnksIGxvaTogYW55LCBtb3RpZnM6IGFueSwgbWV0YTogYW55fSwgY29tcGxldGVkOiB7c29tbWFpcmU6IGFueSwgbG9pOiBhbnksIG1vdGlmczogYW55LCBtZXRhOiBhbnl9fT59IC0gVGhlIHBhcnNlZCB0ZXh0ZXMgbG9pLCBpbmNsdWRpbmcgdGhlIHBhcnRpYWwgYW5kIGNvbXBsZXRlZCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlVGV4dGVMb2koaHRtbDogc3RyaW5nLCBvcHRpb25zID0geyBzaWxlbnQ6IGZhbHNlIH0pIHtcbiAgU0lMRU5UX0xPRyA9IG9wdGlvbnMuc2lsZW50XG5cbiAgcnVuTG9nRnVuKGNvbnNvbGUuaW5mbyhcIlN0YXJ0IGV4dHJhY3RpbmcgbG9pLi4uXCIpLCBvcHRpb25zKVxuICBjb25zdCBtZXRhID0gYXdhaXQgZXh0cmFjdE1ldGFEb25uZWVzKGh0bWwpXG4gIGNvbnN0IHNvbW1haXJlID0gYXdhaXQgZXh0cmFjdFNvbW1haXJlKGh0bWwpXG4gIGNvbnN0IHBhcnRpYWxNb3RpZnM6IGFueSA9IGF3YWl0IGV4dHJhY3RNb3RpZnMoaHRtbClcbiAgY29uc3QgcGFydGlhbExvaTogYW55ID0gYXdhaXQgZXh0cmFjdFByb2pldExvaShodG1sKVxuICBjb25zdCBleHBvc2VNb3RpZnMgPSBhd2FpdCBwb3B1bGF0ZU1vdGlmcyhwYXJ0aWFsTW90aWZzLCBodG1sKVxuICBjb25zdCBsb2kgPSBhd2FpdCBwb3B1bGF0ZVByb2pldExvaShwYXJ0aWFsTG9pLCBodG1sKVxuXG4gIHJldHVybiB7XG4gICAgc29tbWFpcmUsXG4gICAgbG9pLFxuICAgIGV4cG9zZU1vdGlmcyxcbiAgICBtZXRhLFxuICB9XG59XG5cbi8qKlxuICogQ2xlYW5zIHRoZSBnaXZlbiBIVE1MIHN0cmluZyBieSByZW1vdmluZyB1bm5lY2Vzc2FyeSB0YWdzIGFuZCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gVGhlIEhUTUwgc3RyaW5nIHRvIGJlIGNsZWFuZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGVhbmVkIEhUTUwgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBjbGVhbkh0bWwoaHRtbDogc3RyaW5nKSB7XG4gIGxldCBjbGVhbmVkSHRtbCA9IGh0bWwucmVwbGFjZSgvKDxzdHlsZVtcXHdcXFddK3N0eWxlPikvZywgXCJcIilcbiAgY2xlYW5lZEh0bWwgPSBjbGVhbmVkSHRtbC5yZXBsYWNlKC8oPGhlYWRbXFx3XFxXXStoZWFkPikvZywgXCJcIilcbiAgY2xlYW5lZEh0bWwgPSBjbGVhbmVkSHRtbC5yZXBsYWNlKC88aW1nW14+XSo+L2csIFwiXCIpXG5cbiAgcmV0dXJuIGNsZWFuZWRIdG1sXG59XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgSFRNTCB0YWdzIGZyb20gdGhlIGdpdmVuIEhUTUwgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSBjbGVhbmVkIHRleHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBUaGUgSFRNTCBzdHJpbmcgZnJvbSB3aGljaCB0byByZW1vdmUgdGFncy5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNsZWFuZWQgdGV4dCB3aXRob3V0IGFueSBIVE1MIHRhZ3MuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUh0bWxUYWdzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBIVE1MIHRhZ3NcbiAgY29uc3QgaHRtbFRhZ1JlZ2V4ID0gLzxbXj5dKj4vZ1xuXG4gIC8vIFJlcGxhY2UgYWxsIEhUTUwgdGFncyB3aXRoIGFuIGVtcHR5IHN0cmluZ1xuICBjb25zdCB0ZXh0V2l0aG91dFRhZ3MgPSBodG1sLnJlcGxhY2UoaHRtbFRhZ1JlZ2V4LCBcIlwiKVxuICByZXR1cm4gdGV4dFdpdGhvdXRUYWdzXG59XG5cbi8qKlxuICogUG9wdWxhdGVzIHRoZSBtb3RpZnMgb2JqZWN0IHdpdGggdGhlIGV4dHJhY3RlZCB0ZXh0IGZyb20gdGhlIGdpdmVuIEhUTUwuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb3RpZnMgLSBUaGUgbW90aWZzIG9iamVjdCB0byBiZSBwb3B1bGF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIFRoZSBIVE1MIHN0cmluZyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIHRleHQuXG4gKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIFRoZSBwb3B1bGF0ZWQgbW90aWZzIG9iamVjdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9wdWxhdGVNb3RpZnMobW90aWZzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBodG1sOiBzdHJpbmcpIHtcbiAgcnVuTG9nRnVuKGNvbnNvbGUuaW5mbyhcIlBvcHVsYXRpbmcgZXhwb3NlIG1vdGlmcy4uLlwiKSlcbiAgbGV0IGNsZWFuZWRIdG1sID0gY2xlYW5IdG1sKGh0bWwpXG5cbiAgaWYgKG1vdGlmcy5kZWJ1dCA9PT0gbW90aWZzLmZpbiB8fCAhbW90aWZzLmZpbikge1xuICAgIG1vdGlmcy50ZXh0ZSA9IG1vdGlmcy5kZWJ1dFxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHN5c3RlbVRlbXBsYXRlID0gYFxuICAgICAgIyBJbnN0cnVjdGlvbnMgOlxuXG4gICAgICBUdSBlcyB1biBleHBlcnQgZGUgbGEgbG9pIGV0IGRlIGwnYW5hbHlzZSBkZSBwYWdlcyBIVE1MLlxuICAgICAgVHUgZG9pcyBhbmFseXNlciB1biB0ZXh0ZSBkZSBsb2kgYWZpbiBkJ2VuIGV4dHJhaXJlIGNlcnRhaW5lcyBwYXJ0aWVzLiBcbiAgICAgIExlIGZvcm1hdCBkJ2VudHLDqWUgZXN0IGR1IEhUTUwuIExlIGZvcm1hdCBkZSBzb3J0aWUgZXN0IGR1IHRleHRlLlxuICAgICAgUsOpY3Vww6hyZSBsJ2ludMOpZ3JhbGl0w6kgZHUgdGV4dGUgY29tbWVuw6dhbnQgcGFyIDpcblxuICAgICAgXCJcIlwiXG4gICAgICB7ZGVidXR9XG4gICAgICBcIlwiXCJcblxuICAgICAgRXQgZmluaXNzYW50IHBhciA6XG5cbiAgICAgIFwiXCJcIlxuICAgICAge2Zpbn1cbiAgICAgIFwiXCJcIlxuICAgIGBcblxuICAgIGNvbnN0IHByb21wdCA9IENoYXRQcm9tcHRUZW1wbGF0ZS5mcm9tTWVzc2FnZXMoW1xuICAgICAgW1wic3lzdGVtXCIsIHN5c3RlbVRlbXBsYXRlXSxcbiAgICAgIFtcImh1bWFuXCIsIFwie2lucHV0fVwiXSxcbiAgICBdKVxuXG4gICAgY29uc3Qgc3RydWN0dXJlZE1vZGVsID0gTU9ERUwud2l0aFN0cnVjdHVyZWRPdXRwdXQoRlVMTF9URVhURV9TQ0hFTUEpXG4gICAgY29uc3QgY2hhaW4gPSBwcm9tcHQucGlwZShzdHJ1Y3R1cmVkTW9kZWwpXG5cbiAgICBjb25zdCBhcnRpY2xlUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgICAgaW5wdXQ6IGNsZWFuZWRIdG1sLFxuICAgICAgZGVidXQ6IG1vdGlmcy5kZWJ1dCxcbiAgICAgIGZpbjogbW90aWZzLmZpbixcbiAgICB9KVxuXG4gICAgbW90aWZzLnRleHRlID0gYXJ0aWNsZVByb21wdFJlc3VsdC50ZXh0ZVxuICB9XG5cbiAgcnVuTG9nRnVuKFxuICAgIGNvbnNvbGUuaW5mbyhcIk9ww6lyYXRpb24gZGUgcGV1cGxlbWVudCBkZSBsJ2V4cG9zw6kgZGVzIG1vdGlmcyB0ZXJtaW7DqWUg4pyFXCIpLFxuICAgIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0sXG4gIClcbiAgZGVsaW1pdGVyKFNJTEVOVF9MT0cpXG5cbiAgZGVsZXRlIG1vdGlmcy5kZWJ1dFxuICBkZWxldGUgbW90aWZzLmZpblxuICByZXR1cm4gbW90aWZzXG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcG9wdWxhdGVzIGEgcHJvamV0IGxvaSBvYmplY3Qgd2l0aCB0aGUgZnVsbCB0ZXh0IG9mIGVhY2ggYXJ0aWNsZSBhbmQgYWxpbmVhIGluIHRoZSBnaXZlbiBIVE1MLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGFydGlhbCAtIFRoZSBwYXJ0aWFsIHByb2pldCBsb2kgb2JqZWN0IHRvIGJlIHBvcHVsYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gVGhlIEhUTUwgY29udGFpbmluZyB0aGUgdGV4dCBvZiB0aGUgYXJ0aWNsZXMgYW5kIGFsaW5lYXMuXG4gKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZnVsbHkgcG9wdWxhdGVkIHByb2pldCBsb2kgb2JqZWN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3B1bGF0ZVByb2pldExvaShwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBodG1sOiBzdHJpbmcpIHtcbiAgcnVuTG9nRnVuKGNvbnNvbGUuZ3JvdXAoXCJQZXVwbGVtZW50IGR1IHByb2pldCBsb2kuLi5cIiksIHtcbiAgICBzaWxlbnQ6IFNJTEVOVF9MT0csXG4gIH0pXG4gIGxldCBjbGVhbmVkSHRtbCA9IGNsZWFuSHRtbChodG1sKVxuXG4gIGNvbnN0IGFydGljbGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gPSBwYXJ0aWFsLmFydGljbGVzXG4gIGNvbnN0IGZ1bGxBcnRpY2xlczogUmVjb3JkPHN0cmluZywgYW55PltdID0gW11cblxuICBjb25zdCBzeXN0ZW1UZW1wbGF0ZSA9IGBcbiAgICAjIEluc3RydWN0aW9ucyA6XG5cbiAgICBUdSBlcyB1biBleHBlcnQgZGUgbGEgbG9pIGV0IGRlIGwnYW5hbHlzZSBkZSBwYWdlcyBIVE1MLlxuICAgIFR1IGRvaXMgYW5hbHlzZXIgdW4gdGV4dGUgZGUgbG9pIGFmaW4gZCdlbiBleHRyYWlyZSBjZXJ0YWluZXMgcGFydGllcy4gXG4gICAgTGUgZm9ybWF0IGQnZW50csOpZSBlc3QgZHUgSFRNTC4gTGUgZm9ybWF0IGRlIHNvcnRpZSBlc3QgZHUgdGV4dGUuXG4gICAgUsOpY3Vww6hyZSBsJ2ludMOpZ3JhbGl0w6kgZHUgdGV4dGUgY29tbWVuw6dhbnQgcGFyIDpcblxuICAgIFwiXCJcIlxuICAgIHtkZWJ1dH1cbiAgICBcIlwiXCJcblxuICAgIEV0IGZpbmlzc2FudCBwYXIgOlxuXG4gICAgXCJcIlwiXG4gICAge2Zpbn1cbiAgICBcIlwiXCJcbiAgYFxuXG4gIGNvbnN0IHByb21wdCA9IENoYXRQcm9tcHRUZW1wbGF0ZS5mcm9tTWVzc2FnZXMoW1xuICAgIFtcInN5c3RlbVwiLCBzeXN0ZW1UZW1wbGF0ZV0sXG4gICAgW1wiaHVtYW5cIiwgXCJ7aW5wdXR9XCJdLFxuICBdKVxuXG4gIGNvbnN0IHN0cnVjdHVyZWRNb2RlbCA9IE1PREVMLndpdGhTdHJ1Y3R1cmVkT3V0cHV0KEZVTExfVEVYVEVfU0NIRU1BKVxuICBjb25zdCBjaGFpbiA9IHByb21wdC5waXBlKHN0cnVjdHVyZWRNb2RlbClcblxuICBmb3IgKGNvbnN0IGFydGljbGUgb2YgYXJ0aWNsZXMpIHtcbiAgICBpZiAoYXJ0aWNsZS5kZWJ1dCA9PT0gYXJ0aWNsZS5maW4gfHwgIWFydGljbGUuZmluKSB7XG4gICAgICBhcnRpY2xlLnRleHRlID0gYXJ0aWNsZS5kZWJ1dFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcnRpY2xlUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgICAgICBpbnB1dDogY2xlYW5lZEh0bWwsXG4gICAgICAgIGRlYnV0OiBhcnRpY2xlLmRlYnV0LFxuICAgICAgICBmaW46IGFydGljbGUuZmluLFxuICAgICAgfSlcblxuICAgICAgYXJ0aWNsZS50ZXh0ZSA9IGFydGljbGVQcm9tcHRSZXN1bHQudGV4dGVcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFsaW5lYSBvZiBhcnRpY2xlLmFsaW5lYXMpIHtcbiAgICAgIGlmIChhbGluZWEuZGVidXQgPT09IGFsaW5lYS5maW4gfHwgIWFsaW5lYS5maW4pIHtcbiAgICAgICAgYWxpbmVhLnRleHRlID0gYWxpbmVhLmRlYnV0XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFsaW5lYVByb21wdFJlc3VsdDogYW55ID0gYXdhaXQgY2hhaW4uaW52b2tlKHtcbiAgICAgICAgaW5wdXQ6IGFydGljbGUudGV4dGUsXG4gICAgICAgIGRlYnV0OiBhbGluZWEuZGVidXQsXG4gICAgICAgIGZpbjogYWxpbmVhLmZpbixcbiAgICAgIH0pXG5cbiAgICAgIGRlbGV0ZSBhbGluZWEuZGVidXRcbiAgICAgIGRlbGV0ZSBhbGluZWEuZmluXG4gICAgICBhbGluZWEudGV4dGUgPSBhbGluZWFQcm9tcHRSZXN1bHQudGV4dGVcbiAgICB9XG5cbiAgICBydW5Mb2dGdW4oXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIFwiT3DDqXJhdGlvbiBkZSBwZXVwbGVtZW50IGR1IGNvbnRlbnUgZHUgcHJvamV0IGRlIGxvaSB0ZXJtaW7DqWUg4pyFXCIsXG4gICAgICApLFxuICAgICAgeyBzaWxlbnQ6IFNJTEVOVF9MT0cgfSxcbiAgICApXG4gICAgZGVsZXRlIGFydGljbGUuZGVidXRcbiAgICBkZWxldGUgYXJ0aWNsZS5maW5cbiAgICBmdWxsQXJ0aWNsZXMucHVzaChhcnRpY2xlKVxuICB9XG5cbiAgY29uc3QgcHJvamV0TG9pID0ge1xuICAgIC4uLnBhcnRpYWwsXG4gICAgYXJ0aWNsZXM6IGZ1bGxBcnRpY2xlcyxcbiAgfVxuXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwRW5kKCksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gIGRlbGltaXRlcigpXG4gIHJldHVybiBwcm9qZXRMb2lcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBleHRyYWN0cyB0aGUgXCJleHBvc2UgbW90aWZzXCIgZnJvbSB0aGUgZ2l2ZW4gSFRNTC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIFRoZSBIVE1MIHN0cmluZyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIFwiZXhwb3NlIG1vdGlmc1wiLlxuICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZXh0cmFjdGVkIFwiZXhwb3NlIG1vdGlmc1wiIG9iamVjdC5cbiAqIFRoZSBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgZGVidXRgOiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBcImV4cG9zZSBtb3RpZnNcIi5cbiAqIC0gYGZpbmA6IFRoZSBlbmQgb2YgdGhlIFwiZXhwb3NlIG1vdGlmc1wiLlxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlIGV4dHJhY3RlZCBcImV4cG9zZSBtb3RpZnNcIiBkbyBub3QgdmFsaWRhdGUgYWdhaW5zdCB0aGUgRVhQT1NFX01PVElGU19TQ0hFTUEuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RNb3RpZnMoaHRtbDogc3RyaW5nKSB7XG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwKFwiUGFyc2luZyBleHBvc2UgbW90aWZzLi4uXCIpLCB7IHNpbGVudDogU0lMRU5UX0xPRyB9KVxuICBsZXQgY2xlYW5lZEh0bWwgPSBjbGVhbkh0bWwoaHRtbClcbiAgY2xlYW5lZEh0bWwgPSByZW1vdmVIdG1sVGFncyhjbGVhbmVkSHRtbClcblxuICBjb25zdCBzdHJ1Y3R1cmVkTW9kZWwgPSBNT0RFTC53aXRoU3RydWN0dXJlZE91dHB1dChFWFBPU0VfTU9USUZTX1NDSEVNQSlcblxuICBjb25zdCBtb3RpZnNTeXN0ZW1UZW1wbGF0ZSA9IGBcbiAgICAke1NZU1RFTV9URU1QTEFURX1cblxuICAgICMgRXhhbXBsZXM6IFxuXG4gICAgIyMgRXhlbXBsZSAxIFVzZXIgSW5wdXQgOlxuICAgIFwiXCJcIlxuICAgIHtleGFtcGxlMX1cbiAgICBcIlwiXCJcbiAgICBcbiAgICAjIyBFeGVtcGxlIDEgSlNPTiBPdXRwdXQgOlxuICAgIFwiXCJcIlxuICAgIHtvdXRwdXQxfVxuICAgIFwiXCJcIlxuXG4gICAgIyMgRXhlbXBsZSAyIFVzZXIgSW5wdXQgOlxuICAgIFwiXCJcIlxuICAgIHtleGFtcGxlMn1cbiAgICBcIlwiXCJcbiAgICBcbiAgICAjIyBFeGVtcGxlIDIgSlNPTiBPdXRwdXQgOlxuICAgIFwiXCJcIlxuICAgIHtvdXRwdXQyfVxuICAgIFwiXCJcIlxuICAgIGBcblxuICBjb25zdCBwcm9tcHQgPSBDaGF0UHJvbXB0VGVtcGxhdGUuZnJvbU1lc3NhZ2VzKFtcbiAgICBbXCJzeXN0ZW1cIiwgbW90aWZzU3lzdGVtVGVtcGxhdGVdLFxuICAgIFtcImh1bWFuXCIsIFwie2lucHV0fVwiXSxcbiAgXSlcblxuICBjb25zdCBjaGFpbiA9IHByb21wdC5waXBlKHN0cnVjdHVyZWRNb2RlbClcbiAgY29uc3QgbW90aWZzUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgIGlucHV0OiBjbGVhbmVkSHRtbCxcbiAgICBleGFtcGxlMTogRVhBTVBMRVMuUFJKTEFOUjVMMTZCMDkxNC5pbnB1dCxcbiAgICBleGFtcGxlMjogRVhBTVBMRVMuUFJKTEFOUjVMMTZCMjQyNC5pbnB1dCxcbiAgICBvdXRwdXQxOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIwOTE0Lm1vdGlmcyxcbiAgICBvdXRwdXQyOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyNDI0Lm1vdGlmcyxcbiAgfSlcblxuICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShtb3RpZnNQcm9tcHRSZXN1bHQpKVxuICBydW5Mb2dGdW4oXG4gICAgY29uc29sZS50YWJsZShbXG4gICAgICBbXCJEw6lidXRcIiwgbW90aWZzUHJvbXB0UmVzdWx0LmRlYnV0LnN1YnN0cmluZygwLCAzMCldLFxuICAgICAgW1wiRmluXCIsIG1vdGlmc1Byb21wdFJlc3VsdC5maW4uc3Vic3RyaW5nKDAsIDMwKV0sXG4gICAgXSksXG4gICAgeyBzaWxlbnQ6IFNJTEVOVF9MT0cgfSxcbiAgKVxuXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwRW5kKCksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gIGRlbGltaXRlcigpXG5cbiAgY29uc3QgYWp2ID0gbmV3IEFqdigpXG4gIGlmIChhanYudmFsaWRhdGUoRVhQT1NFX01PVElGU19TQ0hFTUEsIG1vdGlmc1Byb21wdFJlc3VsdCkpIHtcbiAgICBydW5Mb2dGdW4oY29uc29sZS5pbmZvKFwiRXhwb3PDqSBkZXMgbW90aWZzIE9LIPCfkYxcIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gICAgcmV0dXJuIG1vdGlmc1Byb21wdFJlc3VsdFxuICB9XG5cbiAgcnVuTG9nRnVuKGNvbnNvbGUud2FybihcIkV4cG9zw6kgZGVzIG1vdGlmcyBLTyDinYxcIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGV4dHJhY3RzIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBnaXZlbiBIVE1MLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gVGhlIEhUTUwgc3RyaW5nIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgbWV0YWRhdGEuXG4gKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBleHRyYWN0ZWQgbWV0YWRhdGEgb2JqZWN0LlxuICogVGhlIG9iamVjdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBkb2N1bWVudFJlZmA6IFRoZSByZWZlcmVuY2Ugb2YgdGhlIGRvY3VtZW50LlxuICogLSBgdGl0cmVgOiBUaGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LlxuICogLSBgbnVtZXJvVGV4dGVgOiBUaGUgbnVtYmVyIG9mIHRoZSB0ZXh0LlxuICogLSBgcHJvY2VkdXJlQWNjZWxlcmVlYDogVGhlIGFjY2VsZXJhdGVkIHByb2NlZHVyZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIHRoZSBleHRyYWN0ZWQgbWV0YWRhdGEgZG8gbm90IHZhbGlkYXRlIGFnYWluc3QgdGhlIE1FVEFfRE9OTkVFU19TQ0hFTUEuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RNZXRhRG9ubmVlcyhodG1sOiBzdHJpbmcpIHtcbiAgZGVsaW1pdGVyKClcbiAgbGV0IGNsZWFuZWRIdG1sID0gY2xlYW5IdG1sKGh0bWwpXG4gIGNsZWFuZWRIdG1sID0gcmVtb3ZlSHRtbFRhZ3MoY2xlYW5lZEh0bWwpXG5cbiAgY29uc3Qgc3RydWN0dXJlZE1vZGVsID0gTU9ERUwud2l0aFN0cnVjdHVyZWRPdXRwdXQoTUVUQV9ET05ORUVTX1NDSEVNQSlcblxuICBjb25zdCBtZXRhRG9ubmVlc1N5c3RlbVRlbXBsYXRlID0gYFxuICAgICR7U1lTVEVNX1RFTVBMQVRFfVxuICAgIGBcblxuICBjb25zdCBwcm9tcHQgPSBDaGF0UHJvbXB0VGVtcGxhdGUuZnJvbU1lc3NhZ2VzKFtcbiAgICBbXCJzeXN0ZW1cIiwgbWV0YURvbm5lZXNTeXN0ZW1UZW1wbGF0ZV0sXG4gICAgW1wiaHVtYW5cIiwgXCJ7aW5wdXR9XCJdLFxuICBdKVxuXG4gIGNvbnN0IGNoYWluID0gcHJvbXB0LnBpcGUoc3RydWN0dXJlZE1vZGVsKVxuICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGNoYWluLmludm9rZSh7XG4gICAgaW5wdXQ6IGNsZWFuZWRIdG1sLFxuICAgIGV4YW1wbGUxOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIwOTE0LmlucHV0LFxuICAgIGV4YW1wbGUyOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyNDI0LmlucHV0LFxuICAgIG91dHB1dDE6IEVYQU1QTEVTLlBSSkxBTlI1TDE2QjA5MTQubWV0YSxcbiAgICBvdXRwdXQyOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyNDI0Lm1ldGEsXG4gIH0pXG5cbiAgY29uc29sZS5ncm91cChcIk1ldGEtZG9ubsOpZXNcIilcbiAgY29uc29sZS50YWJsZShbXG4gICAgW1wiUsOpZsOpcmVuY2VcIiwgcmVzdWx0LmRvY3VtZW50UmVmXSxcbiAgICBbXCJUaXRyZVwiLCByZXN1bHQudGl0cmVdLFxuICAgIFtcIk51bcOpcm8gZHUgdGV4dGVcIiwgcmVzdWx0Lm51bWVyb1RleHRlXSxcbiAgICBbXCJQcm9jw6lkdXJlIGFjY8OpbMOpcsOpXCIsIHJlc3VsdC5wcm9jZWR1cmVBY2NlbGVyZWVdLFxuICBdKVxuICBjb25zb2xlLmdyb3VwRW5kKClcbiAgZGVsaW1pdGVyKClcblxuICBjb25zdCBhanYgPSBuZXcgQWp2KClcbiAgaWYgKGFqdi52YWxpZGF0ZShNRVRBX0RPTk5FRVNfU0NIRU1BLCByZXN1bHQpKSB7XG4gICAgcnVuTG9nRnVuKGNvbnNvbGUud2FybihcIk1ldGEtZG9ubsOpZXMgT0sg8J+RjFwiKSwgeyBzaWxlbnQ6IFNJTEVOVF9MT0cgfSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBydW5Mb2dGdW4oY29uc29sZS53YXJuKFwiTWV0YS1kb25uw6llcyBub24tY29uZm9ybWUg4p2MXCIpLCB7XG4gICAgc2lsZW50OiBTSUxFTlRfTE9HLFxuICB9KVxuICByZXR1cm4ge31cbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBleHRyYWN0cyB0aGUgXCJwcm9qZXQgZGUgbG9pXCIgZnJvbSB0aGUgZ2l2ZW4gSFRNTC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIFRoZSBIVE1MIHN0cmluZyBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIFwicHJvamV0IGRlIGxvaVwiLlxuICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZXh0cmFjdGVkIFwicHJvamV0IGRlIGxvaVwiIG9iamVjdC5cbiAqIFRoZSBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgYXJ0aWNsZXNgOiBBbiBhcnJheSBvZiBhcnRpY2xlIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgIC0gYG51bWVyb0FydGljbGVgOiBUaGUgbnVtYmVyIG9mIHRoZSBhcnRpY2xlLlxuICogICAtIGBjYXJkaW5hbGA6IFRoZSBjYXJkaW5hbCBvZiB0aGUgYXJ0aWNsZS5cbiAqICAgLSBgdGl0cmVgOiBUaGUgdGl0bGUgb2YgdGhlIGFydGljbGUuXG4gKiAgIC0gYGRlYnV0YDogVGhlIGJlZ2lubmluZyBvZiB0aGUgYXJ0aWNsZS5cbiAqICAgLSBgZmluYDogVGhlIGVuZCBvZiB0aGUgYXJ0aWNsZS5cbiAqICAgLSBgYWxpbmVhc2A6IEFuIGFycmF5IG9mIGFsaW5lYXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgZXh0cmFjdGVkIFwicHJvamV0IGRlIGxvaVwiIGRvZXMgbm90IHZhbGlkYXRlIGFnYWluc3QgdGhlIFBST0pFVF9MT0lfU0NIRU1BLlxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0UHJvamV0TG9pKGh0bWw6IHN0cmluZykge1xuICBydW5Mb2dGdW4oY29uc29sZS5ncm91cChcIlBhcnNpbmcgbG9pLi4uXCIpLCB7IHNpbGVudDogU0lMRU5UX0xPRyB9KVxuICBsZXQgY2xlYW5lZEh0bWwgPSBjbGVhbkh0bWwoaHRtbClcbiAgY29uc3Qgc3RydWN0dXJlZE1vZGVsID0gTU9ERUwud2l0aFN0cnVjdHVyZWRPdXRwdXQoUFJPSkVUX0xPSV9TQ0hFTUEpXG5cbiAgY29uc3QgcHJvamV0TG9pU3lzdGVtVGVtcGxhdGUgPSBgXG4gICAgJHtTWVNURU1fVEVNUExBVEV9XG5cbiAgICAjIEV4YW1wbGVzOiBcblxuICAgICMjIEV4ZW1wbGUgMSBVc2VyIElucHV0IDpcbiAgICBcIlwiXCJcbiAgICB7ZXhhbXBsZTF9XG4gICAgXCJcIlwiXG4gICAgXG4gICAgIyMgRXhlbXBsZSAxIEpTT04gT3V0cHV0IDpcbiAgICBcIlwiXCJcbiAgICB7b3V0cHV0MX1cbiAgICBcIlwiXCJcblxuICAgICMjIEV4ZW1wbGUgMiBVc2VyIElucHV0IDpcbiAgICBcIlwiXCJcbiAgICB7ZXhhbXBsZTJ9XG4gICAgXCJcIlwiXG4gICAgXG4gICAgIyMgRXhlbXBsZSAyIEpTT04gT3V0cHV0IDpcbiAgICBcIlwiXCJcbiAgICB7b3V0cHV0Mn1cbiAgICBcIlwiXCJcbiAgICBgXG5cbiAgY29uc3QgcHJvbXB0ID0gQ2hhdFByb21wdFRlbXBsYXRlLmZyb21NZXNzYWdlcyhbXG4gICAgW1wic3lzdGVtXCIsIHByb2pldExvaVN5c3RlbVRlbXBsYXRlXSxcbiAgICBbXCJodW1hblwiLCBcIntpbnB1dH1cIl0sXG4gIF0pXG5cbiAgY29uc3QgY2hhaW4gPSBwcm9tcHQucGlwZShzdHJ1Y3R1cmVkTW9kZWwpXG4gIGNvbnN0IGFydGljbGVzUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgIGlucHV0OiBjbGVhbmVkSHRtbCxcbiAgICBleGFtcGxlMTogRVhBTVBMRVMuUFJKTEFOUjVMMTZCMDkxNC5pbnB1dCxcbiAgICBleGFtcGxlMjogRVhBTVBMRVMuUFJKTEFOUjVMMTZCMjQyNC5pbnB1dCxcbiAgICBvdXRwdXQxOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIwOTE0LmxvaSxcbiAgICBvdXRwdXQyOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyNDI0LmxvaSxcbiAgfSlcblxuICBydW5Mb2dGdW4oXG4gICAgY29uc29sZS5sb2coXCJGb3VuZCBcIiwgYXJ0aWNsZXNQcm9tcHRSZXN1bHQuYXJ0aWNsZXMubGVuZ3RoLCBcIiBhcnRpY2xlcy5cIiksXG4gICAgeyBzaWxlbnQ6IFNJTEVOVF9MT0cgfSxcbiAgKVxuXG4gIGZvciAoY29uc3QgYXJ0aWNsZSBvZiBhcnRpY2xlc1Byb21wdFJlc3VsdC5hcnRpY2xlcykge1xuICAgIGFydGljbGUuYWxpbmVhcyA9IGF3YWl0IGV4dHJhY3RBbGluZWFzKGh0bWwsIGFydGljbGUpXG4gIH1cblxuICBydW5Mb2dGdW4oXG4gICAgY29uc29sZS50YWJsZShcbiAgICAgIGFydGljbGVzUHJvbXB0UmVzdWx0LmFydGljbGVzLm1hcCgoYXJ0aWNsZTogYW55KSA9PiBbXG4gICAgICAgIGFydGljbGUubnVtZXJvQXJ0aWNsZSxcbiAgICAgICAgYXJ0aWNsZS50aXRyZSxcbiAgICAgICAgYXJ0aWNsZS5kZWJ1dC5zdWJzdHJpbmcoMCwgMTApLFxuICAgICAgICBhcnRpY2xlLmZpbi5zdWJzdHJpbmcoMCwgMTApLFxuICAgICAgICBgTm9tYnJlIGQnYWxpbmVhcyA6ICR7YXJ0aWNsZS5hbGluZWFzLmxlbmd0aH1gLFxuICAgICAgXSksXG4gICAgKSxcbiAgICB7IHNpbGVudDogU0lMRU5UX0xPRyB9LFxuICApXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwRW5kKCksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG5cbiAgY29uc3QgYWp2ID0gbmV3IEFqdigpXG4gIGlmIChhanYudmFsaWRhdGUoUFJPSkVUX0xPSV9TQ0hFTUEsIGFydGljbGVzUHJvbXB0UmVzdWx0KSkge1xuICAgIHJ1bkxvZ0Z1bihjb25zb2xlLmluZm8oXCJQcm9qZXQgZGUgbG9pIE9LIPCfkYxcIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gICAgZGVsaW1pdGVyKClcbiAgICByZXR1cm4gYXJ0aWNsZXNQcm9tcHRSZXN1bHRcbiAgfVxuXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLndhcm4oXCJQcm9qZXQgZGUgbG9pIEtPIOKdjFwiKSwgeyBzaWxlbnQ6IFNJTEVOVF9MT0cgfSlcbiAgZGVsaW1pdGVyKClcbiAgcmV0dXJuIHt9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RBbGluZWFzKGh0bWw6IHN0cmluZywgYXJ0aWNsZTogYW55KSB7XG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwKFwiUGFyc2luZyBhbGluZWFzLi4uXCIpLCB7IHNpbGVudDogU0lMRU5UX0xPRyB9KVxuICBsZXQgY2xlYW5lZEh0bWwgPSBjbGVhbkh0bWwoaHRtbClcblxuICBjb25zdCBzdHJ1Y3R1cmVkTW9kZWwgPSBNT0RFTC53aXRoU3RydWN0dXJlZE91dHB1dChBTElORUFfU0NIRU1BKVxuXG4gIGNvbnN0IGFsaW5lYXNTeXN0ZW1UZW1wbGF0ZSA9IGBcbiAgICAke1NZU1RFTV9URU1QTEFURX1cblxuICAgIEV4dHJhaXMgdG91cyBsZXMgYWxpbmVhcyBkZSBsYSBwb3J0aW9uIGRlIHRleHRlIGNvbW1lbsOnYW50IHBhciDCqyB7ZGVidXR9IMK7IGV0IGZpbmlzc2FudCBwYXIgwqsge2Zpbn0gwrsuXG4gICAgVW4gYWxpbsOpYSBjb250aWVubmVudCB0b3Vqb3VycyB1bmUgYmFsaXNlIMKrIDxpbWcgwrsuXG5cbiAgICAjIEV4YW1wbGVzOiBcblxuICAgICMjIEV4ZW1wbGUgMSBVc2VyIElucHV0IDpcbiAgICBcIlwiXCJcbiAgICB7ZXhhbXBsZTF9XG4gICAgXCJcIlwiXG4gICAgXG4gICAgIyMgRXhlbXBsZSAxIEpTT04gT3V0cHV0IDpcbiAgICBcIlwiXCJcbiAgICB7b3V0cHV0MX1cbiAgICBcIlwiXCJcbiAgICBgXG5cbiAgY29uc3QgcHJvbXB0ID0gQ2hhdFByb21wdFRlbXBsYXRlLmZyb21NZXNzYWdlcyhbXG4gICAgW1wic3lzdGVtXCIsIGFsaW5lYXNTeXN0ZW1UZW1wbGF0ZV0sXG4gICAgW1wiaHVtYW5cIiwgXCJ7aW5wdXR9XCJdLFxuICBdKVxuXG4gIGNvbnN0IGNoYWluID0gcHJvbXB0LnBpcGUoc3RydWN0dXJlZE1vZGVsKVxuICBjb25zdCBhbGluZWFzUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgIGlucHV0OiBjbGVhbmVkSHRtbCxcbiAgICBkZWJ1dDogYXJ0aWNsZS5kZWJ1dCxcbiAgICBmaW46IGFydGljbGUuZmluLFxuICAgIGV4YW1wbGUxOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyNDI0LmlucHV0LFxuICAgIG91dHB1dDE6IEVYQU1QTEVTLlBSSkxBTlI1TDE2QjI0MjQuYWxpbmVhcyxcbiAgfSlcblxuICBjb25zdCBhanYgPSBuZXcgQWp2KClcbiAgaWYgKGFqdi52YWxpZGF0ZShBTElORUFfU0NIRU1BLCBhbGluZWFzUHJvbXB0UmVzdWx0IGFzIGFueSkpIHtcbiAgICBydW5Mb2dGdW4oXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIFwiRm91bmQgXCIsXG4gICAgICAgIGFsaW5lYXNQcm9tcHRSZXN1bHQuYWxpbmVhcy5sZW5ndGgsXG4gICAgICAgIFwiIGFsaW5lYXMgZm9yIEFydGljbGUgXCIsXG4gICAgICAgIGFydGljbGUubnVtZXJvQXJ0aWNsZSxcbiAgICAgICAgYXJ0aWNsZS50aXRyZSxcbiAgICAgICksXG4gICAgICB7IHNpbGVudDogU0lMRU5UX0xPRyB9LFxuICAgIClcbiAgICBydW5Mb2dGdW4oY29uc29sZS5ncm91cEVuZCgpLCB7IHNpbGVudDogU0lMRU5UX0xPRyB9KVxuICAgIGRlbGltaXRlcigpXG4gICAgcmV0dXJuIGFsaW5lYXNQcm9tcHRSZXN1bHQuYWxpbmVhc1xuICB9XG5cbiAgcnVuTG9nRnVuKGNvbnNvbGUud2FybihcIkFsaW5lYXMgS09cIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gIGRlbGltaXRlcigpXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGV4dHJhY3RzIHRoZSBcInNvbW1haXJlXCIgKG91dGxpbmUpIGZyb20gdGhlIGdpdmVuIEhUTUwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBUaGUgSFRNTCBzdHJpbmcgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBcInNvbW1haXJlXCIuXG4gKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBleHRyYWN0ZWQgXCJzb21tYWlyZVwiIG9iamVjdC5cbiAqIFRoZSBvYmplY3QgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgc29tbWFpcmVgOiBBbiBhcnJheSBvZiBtYWluIGRpdmlzaW9uIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgIC0gYG51bWVyb0RpdmlzaW9uYDogVGhlIG51bWJlciBvZiB0aGUgbWFpbiBkaXZpc2lvbi5cbiAqICAgLSBgdGl0cmVgOiBUaGUgdGl0bGUgb2YgdGhlIG1haW4gZGl2aXNpb24uXG4gKiAgIC0gYHR5cGVEaXZpc2lvbmA6IFRoZSB0eXBlIG9mIGNvbnRlbnQgaW4gdGhlIG1haW4gZGl2aXNpb24uXG4gKiAgIC0gYHNlcXVlbmNlYDogVGhlIHNlcXVlbmNlIG9mIHRoZSBtYWluIGRpdmlzaW9uLlxuICogICAtIGBwYXJlbnRgOiBUaGUgcGFyZW50IG9mIHRoZSBtYWluIGRpdmlzaW9uLlxuICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlIGV4dHJhY3RlZCBcInNvbW1haXJlXCIgZG9lcyBub3QgdmFsaWRhdGUgYWdhaW5zdCB0aGUgU09NTUFJUkVfU0NIRU1BLlxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0U29tbWFpcmUoaHRtbDogc3RyaW5nKSB7XG4gIGxldCBjbGVhbmVkSHRtbCA9IGNsZWFuSHRtbChodG1sKVxuICBjbGVhbmVkSHRtbCA9IHJlbW92ZUh0bWxUYWdzKGNsZWFuZWRIdG1sKVxuXG4gIGNvbnN0IHN0cnVjdHVyZWRNb2RlbCA9IE1PREVMLndpdGhTdHJ1Y3R1cmVkT3V0cHV0KFNPTU1BSVJFX1NDSEVNQSlcblxuICBjb25zdCBzb21tYWlyZVN5c3RlbVRlbXBsYXRlID0gYFxuICAgICR7U1lTVEVNX1RFTVBMQVRFfVxuXG4gICAgIyBFeGFtcGxlczogXG5cbiAgICAjIyBFeGVtcGxlIDEgVXNlciBJbnB1dCA6XG4gICAgXCJcIlwiXG4gICAge2V4YW1wbGUxfVxuICAgIFwiXCJcIlxuICAgIFxuICAgICMjIEV4ZW1wbGUgMSBKU09OIE91dHB1dCA6XG4gICAgXCJcIlwiXG4gICAge291dHB1dDF9XG4gICAgXCJcIlwiXG5cbiAgICAjIyBFeGVtcGxlIDIgVXNlciBJbnB1dCA6XG4gICAgXCJcIlwiXG4gICAge2V4YW1wbGUyfVxuICAgIFwiXCJcIlxuICAgIFxuICAgICMjIEV4ZW1wbGUgMiBKU09OIE91dHB1dCA6XG4gICAgXCJcIlwiXG4gICAge291dHB1dDJ9XG4gICAgXCJcIlwiXG4gICAgYFxuXG4gIGNvbnN0IHByb21wdCA9IENoYXRQcm9tcHRUZW1wbGF0ZS5mcm9tTWVzc2FnZXMoW1xuICAgIFtcInN5c3RlbVwiLCBzb21tYWlyZVN5c3RlbVRlbXBsYXRlXSxcbiAgICBbXCJodW1hblwiLCBcIntpbnB1dH1cIl0sXG4gIF0pXG5cbiAgY29uc3QgY2hhaW4gPSBwcm9tcHQucGlwZShzdHJ1Y3R1cmVkTW9kZWwpXG4gIGNvbnN0IHNvbW1haXJlUHJvbXB0UmVzdWx0OiBhbnkgPSBhd2FpdCBjaGFpbi5pbnZva2Uoe1xuICAgIGlucHV0OiBjbGVhbmVkSHRtbCxcbiAgICBleGFtcGxlMTogRVhBTVBMRVMuUFJKTEFOUjVMMTZCMjAxNC5pbnB1dCxcbiAgICBvdXRwdXQxOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIyMDE0LnNvbW1haXJlLFxuICAgIGV4YW1wbGUyOiBFWEFNUExFUy5QUkpMQU5SNUwxNkIwOTE0LmlucHV0LFxuICAgIG91dHB1dDI6IEVYQU1QTEVTLlBSSkxBTlI1TDE2QjA5MTQuc29tbWFpcmUsXG4gIH0pXG5cbiAgaWYgKCFzb21tYWlyZVByb21wdFJlc3VsdC5zb21tYWlyZSkge1xuICAgIHJ1bkxvZ0Z1bihjb25zb2xlLndhcm4oXCJBdWN1biBzb21tYWlyZSBuJ2Egw6l0w6kgdHJvdXbDqSDinZNcIiksIHtcbiAgICAgIHNpbGVudDogU0lMRU5UX0xPRyxcbiAgICB9KVxuICAgIGRlbGltaXRlcigpXG4gICAgcmV0dXJuIHsgc29tbWFpcmU6IFtdIH1cbiAgfVxuXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwKFwiU29tbWFpcmVcIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gIHJ1bkxvZ0Z1bihcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiRm91bmQgXCIsXG4gICAgICBzb21tYWlyZVByb21wdFJlc3VsdC5zb21tYWlyZS5sZW5ndGgsXG4gICAgICBcIiBtYWluIGRpdmlzaW9ucyAobGV2ZWwgMSkuXCIsXG4gICAgKSxcbiAgICB7IHNpbGVudDogU0lMRU5UX0xPRyB9LFxuICApXG4gIHJ1bkxvZ0Z1bihcbiAgICBjb25zb2xlLnRhYmxlKFxuICAgICAgc29tbWFpcmVQcm9tcHRSZXN1bHQuc29tbWFpcmUubWFwKChpdGVtOiBhbnkpID0+IFtcbiAgICAgICAgaXRlbS5zZXF1ZW5jZSxcbiAgICAgICAgaXRlbS50aXRyZSxcbiAgICAgICAgaXRlbS50eXBlRGl2aXNpb24sXG4gICAgICAgIGl0ZW0ucGFyZW50LFxuICAgICAgXSksXG4gICAgKSxcbiAgICB7IHNpbGVudDogU0lMRU5UX0xPRyB9LFxuICApXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLmdyb3VwRW5kKCksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG5cbiAgY29uc3QgYWp2ID0gbmV3IEFqdigpXG4gIGlmIChhanYudmFsaWRhdGUoU09NTUFJUkVfU0NIRU1BLCBzb21tYWlyZVByb21wdFJlc3VsdCBhcyBhbnkpKSB7XG4gICAgcnVuTG9nRnVuKGNvbnNvbGUuaW5mbyhcIlNvbW1haXJlIE9LIPCfkYxcIiksIHsgc2lsZW50OiBTSUxFTlRfTE9HIH0pXG4gICAgZGVsaW1pdGVyKClcbiAgICByZXR1cm4gc29tbWFpcmVQcm9tcHRSZXN1bHQuc29tbWFpcmVcbiAgfVxuXG4gIHJ1bkxvZ0Z1bihjb25zb2xlLndhcm4oXCJMYSBjb25zdHJ1Y3Rpb24gZHUgc29tbWFpcmUgZXN0IEtPIOKdjFwiKSwge1xuICAgIHNpbGVudDogU0lMRU5UX0xPRyxcbiAgfSlcbiAgZGVsaW1pdGVyKClcbiAgcmV0dXJuIHsgc29tbWFpcmU6IFtdIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBLElBQUFJLE9B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
303
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXNzZXJ0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfanNkb20iLCJlIiwiX19lc01vZHVsZSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX3NsaWNlZFRvQXJyYXkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfbm9uSXRlcmFibGVSZXN0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJsIiwiaSIsIk9iamVjdCIsInB1c2giLCJwYXJzZUhlYWRlciIsImhlYWRlciIsImhlYWRlcnNNYXBwaW5nIiwicmVnZXgiLCJsZXZlbCIsIl9pIiwiX2hlYWRlcnNNYXBwaW5nIiwiX2hlYWRlcnNNYXBwaW5nJF9pIiwibWF0Y2giLCJjbGVhblRleHQiLCJ0ZXh0IiwicmVwbGFjZSIsInRyaW0iLCJleGNsdWRlZEFsaW5lYXMiLCJwYXJzZVRleHRlIiwiYXNzZW1ibGVlVXJsIiwicGFnZSIsImh0bWwiLCJfSlNET00iLCJKU0RPTSIsIndpbmRvdyIsImRvY3VtZW50IiwiYXNzZXJ0Iiwic3RyaWN0RXF1YWwiLCJjaGlsZHJlbiIsImh0bWxFbGVtZW50IiwiYm9keUVsZW1lbnQiLCJjbG9zZSIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJ0YWdOYW1lIiwiYm9keUNoaWxkIiwiYWxpbmVhRWxlbWVudCIsImlzTXVsdGlMaW5lc0hlYWRlciIsImxldmVscyIsIm5leHRQYXJlbnRTdGF0ZSIsInN0YXRlIiwic3ViZGl2aXNpb25zIiwic3ViZGl2aXNpb25BbGluZWFzIiwic3ViZGl2aXNpb25IZWFkZXJzIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidW5kZWZpbmVkIiwiaWQiLCJpbmNsdWRlcyIsImNvbmNhdCIsImhlYWRlclRleHQiLCJ0ZXh0Q29udGVudCIsIm5hbWVDb21wdXRlZCIsIm5vcm1hbGl6ZSIsIm5hbWVVcHBlciIsInRvVXBwZXJDYXNlIiwiX3BhcnNlSGVhZGVyIiwiX3BhcnNlSGVhZGVyMiIsIm5leHRMZXZlbCIsInBhcmFncmFwaFR5cGUiLCJsaW5lSHRtbCIsIm91dGVySFRNTCIsImxpbmVUZXh0IiwiZXhjbHVkZUFsaW5lYSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiZXJyIiwidGV4dGUiLCJwb3AiLCJ0eXBlIiwibml2ZWF1Iiwibml2ZWF1UmVsYXRpZiIsInRpdHJlcyIsImFsaW5lYXMiLCJ1cmwiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGFyc2Vycy90ZXh0ZXNfbG9pcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgSlNET00gfSBmcm9tIFwianNkb21cIlxuXG5mdW5jdGlvbiBwYXJzZUhlYWRlcihoZWFkZXI6IHN0cmluZyk6IFtudW1iZXIgfCBudWxsLCBzdHJpbmddIHtcbiAgY29uc3QgaGVhZGVyc01hcHBpbmc6IHsgcmVnZXg6IFJlZ0V4cDsgbGV2ZWw6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXSA9IFtcbiAgICB7IHJlZ2V4OiAvXihSQVBQT1JUXyk/QU5ORVhFKF98JCl8XkVUQVRfLywgbGV2ZWw6IDAsIG5hbWU6IFwiQW5uZXhlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXlRPTUVfLywgbGV2ZWw6IDEsIG5hbWU6IFwiVG9tZVwiIH0sXG4gICAge1xuICAgICAgcmVnZXg6XG4gICAgICAgIC9eUEFSVElFX3xeKFBSRU1JRVJFfFNFQ09OREV8REVVWElFTUV8VFJPSVNJRU1FfFFVQVRSSUVNRSlfUEFSVElFKF98JCkvLFxuICAgICAgbGV2ZWw6IDIsXG4gICAgICBuYW1lOiBcIlBhcnRpZVwiLFxuICAgIH0sXG4gICAgeyByZWdleDogL15MSVZSRV8vLCBsZXZlbDogMywgbmFtZTogXCJMaXZyZVwiIH0sXG4gICAgeyByZWdleDogL15USVRSRV8vLCBsZXZlbDogNCwgbmFtZTogXCJUaXRyZVwiIH0sXG4gICAgeyByZWdleDogL15TT1VTVElUUkVfLywgbGV2ZWw6IDUsIG5hbWU6IFwiU291c1RpdHJlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXkNIQVBJVFJFXy8sIGxldmVsOiA2LCBuYW1lOiBcIkNoYXBpdHJlXCIgfSxcbiAgICB7IHJlZ2V4OiAvXlNFQ1RJT05fLywgbGV2ZWw6IDcsIG5hbWU6IFwiU2VjdGlvblwiIH0sXG4gICAgeyByZWdleDogL15TT1VTU0VDVElPTl8vLCBsZXZlbDogOCwgbmFtZTogXCJTb3VzU2VjdGlvblwiIH0sXG4gICAgeyByZWdleDogL15BUlRJQ0xFUz9ffF5FWFBPU0VfREVTX01PVElGUyQvLCBsZXZlbDogOSwgbmFtZTogXCJBcnRpY2xlXCIgfSxcbiAgXVxuXG4gIGZvciAobGV0IHsgcmVnZXgsIGxldmVsLCBuYW1lIH0gb2YgaGVhZGVyc01hcHBpbmcpIHtcbiAgICBpZiAoaGVhZGVyLm1hdGNoKHJlZ2V4KSkge1xuICAgICAgcmV0dXJuIFtsZXZlbCwgbmFtZV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtudWxsLCBcIlwiXVxufVxuXG5mdW5jdGlvbiBjbGVhblRleHQodGV4dDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0Py5yZXBsYWNlKC9bXFxuXFx0XSsvZywgXCJcIikudHJpbSgpIHx8IFwiXCJcbn1cblxuY29uc3QgZXhjbHVkZWRBbGluZWFzID0gW1xuICAvXkTDqWxpYsOpcsOpIGVuIHPDqWFuY2UgcHVibGlxdWUvLFxuICAvXkZhaXQgbGUvLFxuICAvXkxlIFByw6lzaWRlbnQsJC8sXG4gIC9eU2lnbsOpLyxcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGV4dGUoYXNzZW1ibGVlVXJsOiBzdHJpbmcsIHBhZ2U6IHN0cmluZykge1xuICAvLyBSZXBhaXIgSFRNTC5cbiAgbGV0IGh0bWwgPSBwYWdlLnJlcGxhY2UoLyg8c3R5bGVbXFx3XFxXXStzdHlsZT4pL2csIFwiXCIpXG5cbiAgLy8gRXh0cmFjdCBzdWJkaXZpc2lvbnMgZnJvbSBIVE1MLlxuICBjb25zdCB7IHdpbmRvdyB9ID0gbmV3IEpTRE9NKGh0bWwpXG4gIGNvbnN0IHsgZG9jdW1lbnQgfSA9IHdpbmRvd1xuICBhc3NlcnQuc3RyaWN0RXF1YWwoZG9jdW1lbnQuY2hpbGRyZW4ubGVuZ3RoLCAxKVxuICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNoaWxkcmVuWzBdXG4gIGFzc2VydC5zdHJpY3RFcXVhbChodG1sRWxlbWVudC5jaGlsZHJlbi5sZW5ndGgsIDIpXG4gIGNvbnN0IGJvZHlFbGVtZW50ID0gaHRtbEVsZW1lbnQuY2hpbGRyZW5bMV1cblxuICBpZiAoYm9keUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoIDwgMykge1xuICAgIC8vIE9jY3VycyBpbiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzAzMjYuYXNwLlxuICAgIHdpbmRvdy5jbG9zZSgpIC8vIEZyZWUgbWVtb3J5LlxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBjb2RlOiAtMSwgbWVzc2FnZTogXCJUZXh0ZSBkZSBsb2kgc2FucyBjb250ZW51XCIgfSxcbiAgICAgIGh0bWwsXG4gICAgICBwYWdlLFxuICAgIH1cbiAgfVxuICBhc3NlcnQuc3RyaWN0RXF1YWwoYm9keUVsZW1lbnQuY2hpbGRyZW5bMF0udGFnTmFtZSwgXCJESVZcIilcbiAgLy8gRmlyc3QgY2hpbGQgaXMgYSBESVYgZGVzY3JpYmluZyB0aGUgZG9jdW1lbnQgKEFzc2VtYmzDqWUncyBoZWFkZXIpLiBTa2lwIGl0IGZvciBub3cuXG4gIGxldCBib2R5Q2hpbGQgPSBib2R5RWxlbWVudC5jaGlsZHJlblsxXVxuXG4gIGFzc2VydC5zdHJpY3RFcXVhbChib2R5Q2hpbGQudGFnTmFtZSwgXCJCUlwiKVxuICBsZXQgYWxpbmVhRWxlbWVudDogRWxlbWVudCB8IG51bGwgPSBudWxsXG4gIGxldCBpc011bHRpTGluZXNIZWFkZXI6IGJvb2xlYW4gPSBmYWxzZVxuICBsZXQgbGV2ZWw6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIGxldCBsZXZlbHM6IG51bWJlcltdID0gW11cbiAgbGV0IG5leHRQYXJlbnRTdGF0ZSA9IG51bGxcbiAgbGV0IHN0YXRlOiBzdHJpbmcgfCBudWxsID0gXCJuZXh0Qm9keUNoaWxkXCJcbiAgY29uc3Qgc3ViZGl2aXNpb25zID0gW11cbiAgbGV0IHN1YmRpdmlzaW9uQWxpbmVhczogb2JqZWN0W10gfCBudWxsID0gbnVsbFxuICBsZXQgc3ViZGl2aXNpb25IZWFkZXJzOiBvYmplY3RbXSB8IG51bGwgPSBudWxsXG4gIHdoaWxlIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgXCJuZXh0Qm9keUNoaWxkXCI6XG4gICAgICAgIGlmIChib2R5Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhlIGRvY3VtZW50IGhhcyBiZWVuIGZ1bGx5IHBhcnNlZC5cbiAgICAgICAgICBzdGF0ZSA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5Q2hpbGQgPSBib2R5Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgaWYgKGJvZHlDaGlsZC50YWdOYW1lID09PSBcIkRJVlwiKSB7XG4gICAgICAgICAgICBhbGluZWFFbGVtZW50ID0gYm9keUNoaWxkLmNoaWxkcmVuWzBdXG5cbiAgICAgICAgICAgIGlmIChhbGluZWFFbGVtZW50ID09PSB1bmRlZmluZWQgfHwgYm9keUNoaWxkLmlkLmluY2x1ZGVzKFwiZnRuXCIpKSB7XG4gICAgICAgICAgICAgIC8vIE5vIGFsaW5lYSBpbiBjdXJyZW50IGJvZHlDaGlsZDogZ28gdG8gbmV4dCBib2R5Q2hpbGQuXG4gICAgICAgICAgICAgIHN0YXRlID0gXCJuZXh0Qm9keUNoaWxkXCJcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlID0gXCJhbGluZWFFbGVtZW50XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gPFAvPiBpcyBmb3IgZm9vdG5vdGVzXG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIFtcIkJSXCIsIFwiSFJcIiwgXCJQXCJdLmluY2x1ZGVzKGJvZHlDaGlsZC50YWdOYW1lKSxcbiAgICAgICAgICAgICAgYFVuZXhwZWN0ZWQgdGFnIG5hbWUgXCIke2JvZHlDaGlsZC50YWdOYW1lfVwiIGZvciBib2R5IGNoaWxkYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC8vIFN0YXkgaW4gdGhlIHNhbWUgc3RhdGUgdG8gZ28gdG8gbmV4dCBib2R5Q2hpbGQuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiYWxpbmVhRWxlbWVudFwiOlxuICAgICAgICBzd2l0Y2ggKGFsaW5lYUVsZW1lbnQhLnRhZ05hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiRElWXCI6XG4gICAgICAgICAgICBzdGF0ZSA9IFwibmV4dEFsaW5lYUVsZW1lbnRcIlxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIFwiSDRcIjpcbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIG5leHRQYXJlbnRTdGF0ZSA9IFwibmV4dEFsaW5lYUVsZW1lbnRcIlxuICAgICAgICAgICAgc3RhdGUgPSBcImZpcnN0UGFyYWdyYXBoQ2hpbGRcIlxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIFwiUFwiOlxuICAgICAgICAgICAgbmV4dFBhcmVudFN0YXRlID0gXCJuZXh0QWxpbmVhRWxlbWVudFwiXG4gICAgICAgICAgICBzdGF0ZSA9IFwiZmlyc3RQYXJhZ3JhcGhDaGlsZFwiXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgXCJPTFwiOlxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgc3RhdGUgPSBcIm5leHRBbGluZWFFbGVtZW50XCJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBcIlRBQkxFXCI6XG4gICAgICAgICAgICBuZXh0UGFyZW50U3RhdGUgPSBcIm5leHRBbGluZWFFbGVtZW50XCJcbiAgICAgICAgICAgIHN0YXRlID0gXCJmaXJzdFBhcmFncmFwaENoaWxkXCJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgY29kZTogLTIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgdGFnIG5hbWUgZm9yIGFsaW5lYSBlbGVtZW50OiAke1xuICAgICAgICAgICAgICAgICAgYWxpbmVhRWxlbWVudCEudGFnTmFtZVxuICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBodG1sLFxuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiZmlyc3RQYXJhZ3JhcGhDaGlsZFwiOlxuICAgICAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxpbmVhRWxlbWVudCEudGV4dENvbnRlbnRcbiAgICAgICAgY29uc3QgbmFtZUNvbXB1dGVkID0gKGhlYWRlclRleHQgfHwgXCJcIilcbiAgICAgICAgICAubm9ybWFsaXplKFwiTkZEXCIpXG4gICAgICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csIFwiXCIpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKG5vdXZlYXVcXCkvLCBcIlwiKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXChQb3VyIGNvb3JkaW5hdGlvblxcKS8sIFwiXCIpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKFN1cHByaW3DqXM/XFwpLywgXCJcIilcbiAgICAgICAgICAucmVwbGFjZSgvwqAvZywgXCIgXCIpXG4gICAgICAgICAgLnJlcGxhY2UoL1tcXC0sLuKApl0vZywgXCJcIilcbiAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgLnJlcGxhY2UoLyB7MSx9L2csIFwiX1wiKVxuXG4gICAgICAgIGNvbnN0IG5hbWVVcHBlciA9IG5hbWVDb21wdXRlZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IFtuZXh0TGV2ZWwsIHBhcmFncmFwaFR5cGVdID0gcGFyc2VIZWFkZXIobmFtZVVwcGVyKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhbmFtZVVwcGVyIHx8XG4gICAgICAgICAgbmFtZVVwcGVyLm1hdGNoKC9eKFBST0pFVHxQUk9QT1NJVElPTilfREVfTE9JKF98JCkvKSAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBPY2N1cnMgaW46XG4gICAgICAgICAgLy8gKiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzAyMzIuYXNwXG4gICAgICAgICAgLy8gKiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzA2MjYuYXNwXG4gICAgICAgICAgLy8gKiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzA2NzYuYXNwXG4gICAgICAgICAgc3RhdGUgPSBuZXh0UGFyZW50U3RhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWVVcHBlciA9PT0gXCJKRVVYX09MWU1QSVFVRVNfRVRfUEFSQUxZTVBJUVVFU19ERV8yMDI0XCIpIHtcbiAgICAgICAgICAvLyBPY2N1cnMgaW4gaHR0cDovL3d3dy5hc3NlbWJsZWUtbmF0aW9uYWxlLmZyLzE1L3RleHRlcy8wNjc2LmFzcFxuICAgICAgICAgIHN0YXRlID0gbmV4dFBhcmVudFN0YXRlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lVXBwZXIgPT09IFwiVEVYVEVfREVfTEFfQ09NTUlTU0lPTl9NSVhURV9QQVJJVEFJUkVcIikge1xuICAgICAgICAgIC8vIE9jY3VycyBpbiBodHRwOi8vd3d3LmFzc2VtYmxlZS1uYXRpb25hbGUuZnIvMTUvdGV4dGVzLzEyOTQuYXNwXG4gICAgICAgICAgc3RhdGUgPSBuZXh0UGFyZW50U3RhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZUh0bWwgPSBjbGVhblRleHQoYWxpbmVhRWxlbWVudCEub3V0ZXJIVE1MKVxuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGNsZWFuVGV4dChhbGluZWFFbGVtZW50IS50ZXh0Q29udGVudClcblxuICAgICAgICBpZiAobmV4dExldmVsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSXQgaXMgYSByZWd1bGFyIGFsaW5lYVxuICAgICAgICAgIC8vIEV4Y2x1ZGUgc29tZSBhbGluZWFzXG4gICAgICAgICAgbGV0IGV4Y2x1ZGVBbGluZWEgPSBmYWxzZVxuICAgICAgICAgIGZvciAobGV0IHJlZ2V4IG9mIGV4Y2x1ZGVkQWxpbmVhcykge1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3QobGluZVRleHQpKSB7XG4gICAgICAgICAgICAgIGV4Y2x1ZGVBbGluZWEgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleGNsdWRlQWxpbmVhKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IG5leHRQYXJlbnRTdGF0ZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc3ViZGl2aXNpb25IZWFkZXJzIS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIChpc011bHRpTGluZXNIZWFkZXIgJiYgc3ViZGl2aXNpb25BbGluZWFzIS5sZW5ndGggPT09IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdWJkaXZpc2lvbkhlYWRlcnMhLnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0ZTogbGluZVRleHQsXG4gICAgICAgICAgICAgIGh0bWw6IGxpbmVIdG1sLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3ViZGl2aXNpb25BbGluZWFzIS5wdXNoKHtcbiAgICAgICAgICAgICAgdGV4dGU6IGxpbmVUZXh0LFxuICAgICAgICAgICAgICBodG1sOiBsaW5lSHRtbCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc011bHRpTGluZXNIZWFkZXIgJiYgc3ViZGl2aXNpb25IZWFkZXJzIS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgaXNNdWx0aUxpbmVzSGVhZGVyID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2tpcCBwYXJhZ3JhcGguXG4gICAgICAgICAgc3RhdGUgPSBuZXh0UGFyZW50U3RhdGVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKG5leHRMZXZlbCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIEl0IGlzIGEgaGVhZGVyXG4gICAgICAgICAgbGV2ZWwgPSBuZXh0TGV2ZWxcbiAgICAgICAgICB3aGlsZSAobGV2ZWxzLmxlbmd0aCA+IDAgJiYgbGV2ZWwgPCBsZXZlbHNbbGV2ZWxzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICBsZXZlbHMucG9wKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxldmVscy5sZW5ndGggPT09IDAgfHwgbGV2ZWwgPiBsZXZlbHNbbGV2ZWxzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICBsZXZlbHMucHVzaChsZXZlbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdWJkaXZpc2lvbkFsaW5lYXMgPSBbXVxuICAgICAgICAgIHN1YmRpdmlzaW9uSGVhZGVycyA9IFt7IHRleHRlOiBsaW5lVGV4dCwgaHRtbDogbGluZUh0bWwgfV1cblxuICAgICAgICAgIC8vIEFydGljbGVzICYgXCJFeHBvc8OpIGRlcyBtb3RpZnNcIiBhcmUgdGhlIG9ubHkgZGl2aXNpb25zIHdpdGhvdXQgc2Vjb25kIHRpdGxlLlxuICAgICAgICAgIGlzTXVsdGlMaW5lc0hlYWRlciA9XG4gICAgICAgICAgICBuYW1lVXBwZXIubWF0Y2goL15BUlRJQ0xFUz9fLykgPT09IG51bGwgJiZcbiAgICAgICAgICAgIG5hbWVVcHBlci5tYXRjaCgvXkVYUE9TRV9ERVNfTU9USUZTJC8pID09PSBudWxsXG5cbiAgICAgICAgICBzdWJkaXZpc2lvbnMucHVzaCh7XG4gICAgICAgICAgICBpZDogXCJEX1wiICsgbmFtZUNvbXB1dGVkLFxuICAgICAgICAgICAgdHlwZTogcGFyYWdyYXBoVHlwZSxcbiAgICAgICAgICAgIG5pdmVhdTogbGV2ZWwgKyAxLFxuICAgICAgICAgICAgbml2ZWF1UmVsYXRpZjogbGV2ZWxzLmxlbmd0aCxcbiAgICAgICAgICAgIHRpdHJlczogc3ViZGl2aXNpb25IZWFkZXJzLFxuICAgICAgICAgICAgYWxpbmVhczogc3ViZGl2aXNpb25BbGluZWFzLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IG5leHRQYXJlbnRTdGF0ZVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm5leHRBbGluZWFFbGVtZW50XCI6XG4gICAgICAgIGFsaW5lYUVsZW1lbnQgPSBhbGluZWFFbGVtZW50IS5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgaWYgKGFsaW5lYUVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGUgYm9keUNoaWxkIGhhcyBiZWVuIGZ1bGx5IHBhcnNlZC4gR28gdG8gbmV4dCBib2R5Q2hpbGRcbiAgICAgICAgICBzdGF0ZSA9IFwibmV4dEJvZHlDaGlsZFwiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSBcImFsaW5lYUVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBgVW5leHBlY3RlZCBzdGF0ZTogJHtzdGF0ZX1gXG4gICAgfVxuICB9XG5cbiAgd2luZG93LmNsb3NlKCkgLy8gRnJlZSBtZW1vcnkuXG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvcjogbnVsbCxcbiAgICBodG1sLFxuICAgIHBhZ2UsXG4gICAgc3ViZGl2aXNpb25zLFxuICAgIHVybDogYXNzZW1ibGVlVXJsLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQTZCLFNBQUFELHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsZ0JBQUFBLENBQUE7QUFBQSxTQUFBRSwyQkFBQUMsQ0FBQSxFQUFBSCxDQUFBLFFBQUFJLENBQUEseUJBQUFDLE1BQUEsSUFBQUYsQ0FBQSxDQUFBRSxNQUFBLENBQUFDLFFBQUEsS0FBQUgsQ0FBQSxxQkFBQUMsQ0FBQSxRQUFBRyxLQUFBLENBQUFDLE9BQUEsQ0FBQUwsQ0FBQSxNQUFBQyxDQUFBLEdBQUFLLDJCQUFBLENBQUFOLENBQUEsTUFBQUgsQ0FBQSxJQUFBRyxDQUFBLHVCQUFBQSxDQUFBLENBQUFPLE1BQUEsSUFBQU4sQ0FBQSxLQUFBRCxDQUFBLEdBQUFDLENBQUEsT0FBQU8sRUFBQSxNQUFBQyxDQUFBLFlBQUFBLEVBQUEsZUFBQUMsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUEsRUFBQSxXQUFBSCxFQUFBLElBQUFSLENBQUEsQ0FBQU8sTUFBQSxLQUFBSyxJQUFBLFdBQUFBLElB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