@tricoteuses/assemblee 1.10.4 → 2.0.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 (275) hide show
  1. package/README.md +8 -1
  2. package/lib/amendements-79bwpkvR.js +154 -0
  3. package/lib/amendements-CV3s5a0M.js +667 -0
  4. package/lib/cleaners/index.d.ts +9 -9
  5. package/lib/cleaners.js +564 -0
  6. package/lib/datasets.d.ts +3 -3
  7. package/lib/dossiers_legislatifs.d.ts +2 -2
  8. package/lib/index.d.ts +17 -22
  9. package/lib/index.js +1542 -314
  10. package/lib/inserters.d.ts +5 -5
  11. package/lib/loaders-9mHdTl9L.js +4158 -0
  12. package/lib/loaders.d.ts +12 -12
  13. package/lib/loaders.js +29 -1689
  14. package/lib/organes.d.ts +1 -1
  15. package/lib/parse-Ccs6wcUg.js +2512 -0
  16. package/lib/parsers/index.d.ts +2 -3
  17. package/lib/parsers/plf.d.ts +1 -0
  18. package/lib/parsers/recherche_amendements.d.ts +2 -2
  19. package/lib/parsers/textes_lois.d.ts +1 -23
  20. package/lib/parsers.js +398 -0
  21. package/lib/raw_types/acteurs_et_organes.d.ts +4 -2
  22. package/lib/raw_types/debats.d.ts +2 -2
  23. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -1
  24. package/lib/schemas/acteurs_et_organes.json +1166 -0
  25. package/lib/schemas/agendas.json +1745 -0
  26. package/lib/schemas/amendements.json +2085 -0
  27. package/lib/schemas/debats.json +842 -0
  28. package/lib/schemas/dossiers_legislatifs.json +3874 -0
  29. package/lib/schemas/legislatures.json +17 -0
  30. package/lib/schemas/questions.json +704 -0
  31. package/lib/schemas/scrutins.json +701 -0
  32. package/lib/scripts/retrieve_deputes_photos.d.ts +1 -1
  33. package/lib/types/acteurs_et_organes.d.ts +344 -2
  34. package/lib/types/agendas.d.ts +236 -10
  35. package/lib/types/amendements.d.ts +276 -1
  36. package/lib/types/debats.d.ts +52 -2
  37. package/lib/types/dossiers_legislatifs.d.ts +403 -9
  38. package/lib/types/questions.d.ts +99 -2
  39. package/lib/types/scrutins.d.ts +101 -0
  40. package/lib/urls.d.ts +2 -2
  41. package/package.json +33 -95
  42. package/lib/api.js +0 -52
  43. package/lib/api.mjs +0 -45
  44. package/lib/bugs/acteur-00010/plugin.test.js +0 -90
  45. package/lib/bugs/acteur-00010/plugin.test.mjs +0 -33
  46. package/lib/bugs/acteur-00010.d.ts +0 -7
  47. package/lib/bugs/acteur-00010.js +0 -116
  48. package/lib/bugs/acteur-00010.mjs +0 -26
  49. package/lib/bugs/agenda-00002/plugin.test.js +0 -124
  50. package/lib/bugs/agenda-00002/plugin.test.mjs +0 -50
  51. package/lib/bugs/agenda-00002.d.ts +0 -15
  52. package/lib/bugs/agenda-00002.js +0 -406
  53. package/lib/bugs/agenda-00002.mjs +0 -172
  54. package/lib/bugs/agenda-00008/plugin.test.js +0 -92
  55. package/lib/bugs/agenda-00008/plugin.test.mjs +0 -31
  56. package/lib/bugs/agenda-00008.d.ts +0 -7
  57. package/lib/bugs/agenda-00008.js +0 -123
  58. package/lib/bugs/agenda-00008.mjs +0 -26
  59. package/lib/bugs/agenda-00011/plugin.test.d.ts +0 -1
  60. package/lib/bugs/agenda-00011/plugin.test.js +0 -263
  61. package/lib/bugs/agenda-00011/plugin.test.mjs +0 -152
  62. package/lib/bugs/agenda-00011.d.ts +0 -16
  63. package/lib/bugs/agenda-00011.js +0 -333
  64. package/lib/bugs/agenda-00011.mjs +0 -125
  65. package/lib/bugs.d.ts +0 -21
  66. package/lib/bugs.js +0 -452
  67. package/lib/bugs.mjs +0 -70
  68. package/lib/cleaners/actes_legislatifs.js +0 -315
  69. package/lib/cleaners/actes_legislatifs.mjs +0 -253
  70. package/lib/cleaners/acteurs.js +0 -265
  71. package/lib/cleaners/acteurs.mjs +0 -180
  72. package/lib/cleaners/amendements.js +0 -294
  73. package/lib/cleaners/amendements.mjs +0 -227
  74. package/lib/cleaners/debats.js +0 -12
  75. package/lib/cleaners/debats.mjs +0 -5
  76. package/lib/cleaners/documents.js +0 -205
  77. package/lib/cleaners/documents.mjs +0 -133
  78. package/lib/cleaners/dossiers_legislatifs.js +0 -131
  79. package/lib/cleaners/dossiers_legislatifs.mjs +0 -70
  80. package/lib/cleaners/index.js +0 -70
  81. package/lib/cleaners/index.mjs +0 -10
  82. package/lib/cleaners/organes.js +0 -65
  83. package/lib/cleaners/organes.mjs +0 -48
  84. package/lib/cleaners/questions.js +0 -12
  85. package/lib/cleaners/questions.mjs +0 -5
  86. package/lib/cleaners/reunions.js +0 -312
  87. package/lib/cleaners/reunions.mjs +0 -255
  88. package/lib/cleaners/scrutins.js +0 -340
  89. package/lib/cleaners/scrutins.mjs +0 -221
  90. package/lib/cleaners/xml.js +0 -95
  91. package/lib/cleaners/xml.mjs +0 -58
  92. package/lib/datasets.js +0 -837
  93. package/lib/datasets.mjs +0 -755
  94. package/lib/dates.js +0 -124
  95. package/lib/dates.mjs +0 -100
  96. package/lib/dossiers_legislatifs.js +0 -346
  97. package/lib/dossiers_legislatifs.mjs +0 -208
  98. package/lib/file_systems.js +0 -162
  99. package/lib/file_systems.mjs +0 -62
  100. package/lib/git.js +0 -223
  101. package/lib/git.mjs +0 -151
  102. package/lib/index.mjs +0 -17
  103. package/lib/inserters.js +0 -521
  104. package/lib/inserters.mjs +0 -337
  105. package/lib/loaders.mjs +0 -886
  106. package/lib/logger.js +0 -35
  107. package/lib/logger.mjs +0 -26
  108. package/lib/organes.js +0 -22
  109. package/lib/organes.mjs +0 -15
  110. package/lib/parsers/documents.d.ts +0 -62
  111. package/lib/parsers/documents.js +0 -453
  112. package/lib/parsers/documents.mjs +0 -370
  113. package/lib/parsers/index.js +0 -40
  114. package/lib/parsers/index.mjs +0 -4
  115. package/lib/parsers/recherche_amendements.js +0 -403
  116. package/lib/parsers/recherche_amendements.mjs +0 -167
  117. package/lib/parsers/textes_lois.js +0 -307
  118. package/lib/parsers/textes_lois.mjs +0 -264
  119. package/lib/raw_types/acteurs_et_organes.js +0 -1213
  120. package/lib/raw_types/acteurs_et_organes.mjs +0 -1146
  121. package/lib/raw_types/agendas.js +0 -777
  122. package/lib/raw_types/agendas.mjs +0 -724
  123. package/lib/raw_types/amendements.js +0 -1052
  124. package/lib/raw_types/amendements.mjs +0 -993
  125. package/lib/raw_types/debats.js +0 -630
  126. package/lib/raw_types/debats.mjs +0 -573
  127. package/lib/raw_types/dossiers_legislatifs.js +0 -1529
  128. package/lib/raw_types/dossiers_legislatifs.mjs +0 -1471
  129. package/lib/raw_types/questions.js +0 -469
  130. package/lib/raw_types/questions.mjs +0 -416
  131. package/lib/raw_types/scrutins.js +0 -651
  132. package/lib/raw_types/scrutins.mjs +0 -598
  133. package/lib/schemas/acteur/Acteur.json +0 -56
  134. package/lib/schemas/acteur/AdresseElectronique.json +0 -52
  135. package/lib/schemas/acteur/AdressePostale.json +0 -75
  136. package/lib/schemas/acteur/Civ.json +0 -14
  137. package/lib/schemas/acteur/Collaborateur.json +0 -29
  138. package/lib/schemas/acteur/EtatCivil.json +0 -51
  139. package/lib/schemas/acteur/Ident.json +0 -40
  140. package/lib/schemas/acteur/Lieu.json +0 -66
  141. package/lib/schemas/acteur/Mandat.json +0 -192
  142. package/lib/schemas/acteur/Profession.json +0 -46
  143. package/lib/schemas/agenda/Agenda.json +0 -318
  144. package/lib/schemas/agenda/CycleDeVie.json +0 -45
  145. package/lib/schemas/agenda/PointOdj.json +0 -82
  146. package/lib/schemas/amendement/Amendement.json +0 -246
  147. package/lib/schemas/amendement/Diff.json +0 -25
  148. package/lib/schemas/amendement/DispositifAmdtCredit.json +0 -85
  149. package/lib/schemas/amendement/Identifiant.json +0 -62
  150. package/lib/schemas/amendement/PointeurFragmentTexte.json +0 -127
  151. package/lib/schemas/amendement/Representation.json +0 -67
  152. package/lib/schemas/amendement/Total.json +0 -26
  153. package/lib/schemas/converted_from_type/acteurs_et_organes.json +0 -666
  154. package/lib/schemas/converted_from_type/agendas.json +0 -1100
  155. package/lib/schemas/converted_from_type/amendements.json +0 -3191
  156. package/lib/schemas/converted_from_type/debats.json +0 -682
  157. package/lib/schemas/converted_from_type/deputes.json +0 -26
  158. package/lib/schemas/converted_from_type/dossiers_legislatifs.json +0 -2918
  159. package/lib/schemas/converted_from_type/legislatures.json +0 -16
  160. package/lib/schemas/converted_from_type/questions.json +0 -328
  161. package/lib/schemas/converted_from_type/scrutins.json +0 -393
  162. package/lib/schemas/debat/Contenu.json +0 -75
  163. package/lib/schemas/debat/Debat.json +0 -40
  164. package/lib/schemas/debat/Metadonnees.json +0 -75
  165. package/lib/schemas/debat/Orateur.json +0 -60
  166. package/lib/schemas/debat/Point.json +0 -169
  167. package/lib/schemas/debat/Sommaire.json +0 -71
  168. package/lib/schemas/debat/SommaireElement.json +0 -108
  169. package/lib/schemas/debat/Texte.json +0 -34
  170. package/lib/schemas/document/CodeLibelle.json +0 -25
  171. package/lib/schemas/document/Document.json +0 -385
  172. package/lib/schemas/document/Indexation.json +0 -38
  173. package/lib/schemas/dossier/ActeLegislatif.json +0 -211
  174. package/lib/schemas/dossier/ActeLegislatifBase.json +0 -62
  175. package/lib/schemas/dossier/Agenda.json +0 -23
  176. package/lib/schemas/dossier/ConseilConstitutionnel.json +0 -35
  177. package/lib/schemas/dossier/Decision.json +0 -25
  178. package/lib/schemas/dossier/Dossier.json +0 -124
  179. package/lib/schemas/dossier/EtudeImpact.json +0 -29
  180. package/lib/schemas/dossier/EtudePlf.json +0 -105
  181. package/lib/schemas/dossier/Europe.json +0 -42
  182. package/lib/schemas/dossier/FamCodeLibelle.json +0 -25
  183. package/lib/schemas/dossier/InfoJO.json +0 -23
  184. package/lib/schemas/dossier/Initiateur.json +0 -36
  185. package/lib/schemas/dossier/Motion.json +0 -27
  186. package/lib/schemas/dossier/Promulgation.json +0 -62
  187. package/lib/schemas/dossier/Rapporteur.json +0 -36
  188. package/lib/schemas/dossier/Texte.json +0 -47
  189. package/lib/schemas/organe/CodeTypeOrgane.json +0 -43
  190. package/lib/schemas/organe/Organe.json +0 -136
  191. package/lib/schemas/organe/ViMoDe.json +0 -28
  192. package/lib/schemas/question/Auteur.json +0 -58
  193. package/lib/schemas/question/Cloture.json +0 -28
  194. package/lib/schemas/question/InfoJO.json +0 -40
  195. package/lib/schemas/question/MinAttribElement.json +0 -30
  196. package/lib/schemas/question/Question.json +0 -172
  197. package/lib/schemas/question/Renouvellement.json +0 -17
  198. package/lib/schemas/question/Signalement.json +0 -21
  199. package/lib/schemas/question/Texte.json +0 -24
  200. package/lib/schemas/scrutin/DecompteVoix.json +0 -35
  201. package/lib/schemas/scrutin/Dysfonctionnement.json +0 -50
  202. package/lib/schemas/scrutin/MiseAuPoint.json +0 -53
  203. package/lib/schemas/scrutin/OrganeVotant.json +0 -88
  204. package/lib/schemas/scrutin/Scrutin.json +0 -187
  205. package/lib/schemas/scrutin/Votant.json +0 -37
  206. package/lib/scripts/bugs_helper.d.ts +0 -13
  207. package/lib/scripts/bugs_helper.js +0 -595
  208. package/lib/scripts/bugs_helper.mjs +0 -251
  209. package/lib/scripts/clean_reorganized_data.js +0 -610
  210. package/lib/scripts/clean_reorganized_data.mjs +0 -273
  211. package/lib/scripts/diff_amendements.js +0 -249
  212. package/lib/scripts/diff_amendements.mjs +0 -202
  213. package/lib/scripts/document_dossiers_legislatifs.js +0 -655
  214. package/lib/scripts/document_dossiers_legislatifs.mjs +0 -414
  215. package/lib/scripts/get_today_reunions.js +0 -37
  216. package/lib/scripts/get_today_reunions.mjs +0 -31
  217. package/lib/scripts/merge_scrutins.js +0 -97
  218. package/lib/scripts/merge_scrutins.mjs +0 -47
  219. package/lib/scripts/parse_textes_lois.d.ts +0 -1
  220. package/lib/scripts/parse_textes_lois.js +0 -171
  221. package/lib/scripts/parse_textes_lois.mjs +0 -140
  222. package/lib/scripts/process_open_dataset.js +0 -301
  223. package/lib/scripts/process_open_dataset.mjs +0 -134
  224. package/lib/scripts/raw_types_from_amendements.js +0 -135
  225. package/lib/scripts/raw_types_from_amendements.mjs +0 -134
  226. package/lib/scripts/reorganize_data.js +0 -805
  227. package/lib/scripts/reorganize_data.mjs +0 -517
  228. package/lib/scripts/retrieve_deputes_photos.js +0 -310
  229. package/lib/scripts/retrieve_deputes_photos.mjs +0 -158
  230. package/lib/scripts/retrieve_documents.js +0 -547
  231. package/lib/scripts/retrieve_documents.mjs +0 -242
  232. package/lib/scripts/retrieve_open_data.js +0 -107
  233. package/lib/scripts/retrieve_open_data.mjs +0 -26
  234. package/lib/scripts/retrieve_pending_amendments.js +0 -206
  235. package/lib/scripts/retrieve_pending_amendments.mjs +0 -57
  236. package/lib/scripts/retrieve_senateurs_photos.js +0 -234
  237. package/lib/scripts/retrieve_senateurs_photos.mjs +0 -116
  238. package/lib/scripts/retrieve_textes_lois.d.ts +0 -1
  239. package/lib/scripts/retrieve_textes_lois.js +0 -240
  240. package/lib/scripts/retrieve_textes_lois.mjs +0 -85
  241. package/lib/scripts/shared/cli_helpers.js +0 -89
  242. package/lib/scripts/shared/cli_helpers.mjs +0 -81
  243. package/lib/scripts/test_iter_load.js +0 -155
  244. package/lib/scripts/test_iter_load.mjs +0 -72
  245. package/lib/scripts/test_load.js +0 -26
  246. package/lib/scripts/test_load.mjs +0 -16
  247. package/lib/scripts/test_load_big_files.js +0 -26
  248. package/lib/scripts/test_load_big_files.mjs +0 -16
  249. package/lib/scripts/validate_json.js +0 -353
  250. package/lib/scripts/validate_json.mjs +0 -184
  251. package/lib/shared_types/codes_actes.js +0 -231
  252. package/lib/shared_types/codes_actes.mjs +0 -224
  253. package/lib/strings.js +0 -16
  254. package/lib/strings.mjs +0 -7
  255. package/lib/types/acteurs_et_organes.js +0 -963
  256. package/lib/types/acteurs_et_organes.mjs +0 -904
  257. package/lib/types/agendas.js +0 -628
  258. package/lib/types/agendas.mjs +0 -575
  259. package/lib/types/amendements.js +0 -899
  260. package/lib/types/amendements.mjs +0 -842
  261. package/lib/types/debats.js +0 -619
  262. package/lib/types/debats.mjs +0 -562
  263. package/lib/types/dossiers_legislatifs.js +0 -1188
  264. package/lib/types/dossiers_legislatifs.mjs +0 -1130
  265. package/lib/types/legislatures.js +0 -17
  266. package/lib/types/legislatures.mjs +0 -10
  267. package/lib/types/questions.js +0 -454
  268. package/lib/types/questions.mjs +0 -401
  269. package/lib/types/scrutins.js +0 -556
  270. package/lib/types/scrutins.mjs +0 -503
  271. package/lib/urls.js +0 -325
  272. package/lib/urls.mjs +0 -258
  273. /package/lib/{bugs/acteur-00010/plugin.test.d.ts → scripts/add_links_to_documents.d.ts} +0 -0
  274. /package/lib/{bugs/agenda-00002/plugin.test.d.ts → scripts/copy-schemas.d.ts} +0 -0
  275. /package/lib/{bugs/agenda-00008/plugin.test.d.ts → scripts/generate-json-schemas.d.ts} +0 -0
@@ -1,273 +0,0 @@
1
- import commandLineArgs from "command-line-args";
2
- import fs from "fs-extra";
3
- import path from "path";
4
- import { cleanActeur, cleanAmendement, cleanDocumentOrDivision, cleanDossierParlementaire, cleanOrgane, cleanReunion, cleanScrutin, cleanQuestion, cleanCompteRendu } from "../cleaners/index.mjs";
5
- import { datasets, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
6
- import { downloadAndParse } from "./retrieve_documents.mjs";
7
- import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
8
- import { walkDir } from "../file_systems.mjs";
9
- import * as git from "../git.mjs";
10
- import { Convert as ActeursEtOrganesConvert } from "../types/acteurs_et_organes.mjs";
11
- import { Convert as AgendasConvert } from "../types/agendas.mjs";
12
- import { Convert as AmendementsConvert } from "../types/amendements.mjs";
13
- import { Convert as DossiersLegislatifsConvert } from "../types/dossiers_legislatifs.mjs";
14
- import { Convert as ScrutinsConvert } from "../types/scrutins.mjs";
15
- import { Convert as QuestionsConvert } from "../types/questions.mjs";
16
- import { Convert as ComptesRendusConvert } from "../types/debats.mjs";
17
- import { cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, dataDirDefaultOption, silentOption, verboseOption, pullOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption } from "./shared/cli_helpers.mjs";
18
- function parseArgs(argv) {
19
- const optionsDefinitions = [cloneOption, commitOption, remoteOption, legislatureOption, categoriesOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, fetchDocumentsOption, parseDocumentsOption, documentFormatOption, {
20
- alias: "d",
21
- help: "single dataset to reorganize",
22
- name: "dataset",
23
- type: String
24
- }, {
25
- help: "do not reset --hard after commit to save I/O if the working tree is to be discarded",
26
- name: "no-reset-after-commit",
27
- type: Boolean
28
- }, {
29
- alias: "V",
30
- help: "don't validate data",
31
- name: "no-validate",
32
- type: Boolean
33
- }];
34
- const options = commandLineArgs(optionsDefinitions, {
35
- argv: argv
36
- });
37
- return options;
38
- }
39
- function cloneGit(gitGroupUrl, datasetName, dataDir) {
40
- git.clone(gitGroupUrl, `${datasetName}_nettoye`, dataDir);
41
- }
42
- function commitGit(datasetCleanDir, options, exitCode, subdirectories) {
43
- if (options.commit) {
44
- const errorCode = git.commitAndPush(datasetCleanDir, "Nouvelle moisson", options.remote);
45
- if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
46
- exitCode = errorCode;
47
- }
48
- }
49
- if (commitAndPushUid(datasetCleanDir, options, subdirectories) && (exitCode === 0 || exitCode === 10)) {
50
- exitCode = 1;
51
- }
52
- return exitCode;
53
- }
54
- function cleanAndValidateData(data, cleaner, fromJson, toJson, noValidate) {
55
- cleaner(data);
56
- if (typeof data === "object" && Object.keys(data).length === 0) {
57
- // By convention: an empty object must be deleted.
58
- return null;
59
- }
60
- const jsonData = JSON.stringify(data, null, 2);
61
- if (!noValidate) {
62
- return jsonData;
63
- } else {
64
- const validatedData = fromJson(jsonData);
65
- return toJson(validatedData);
66
- }
67
- }
68
- async function processFiles(datasetRawDir, datasetCleanDir, walkDirParams, cleaner, dataConverter, options, postProcessor) {
69
- for (const filePathArray of walkDir(datasetRawDir, walkDirParams)) {
70
- const filename = filePathArray[filePathArray.length - 1];
71
- if (!filename.endsWith(".json")) continue;
72
- const rawFilePath = path.join(datasetRawDir, ...filePathArray);
73
- const rawJson = fs.readFileSync(rawFilePath, {
74
- encoding: "utf8"
75
- });
76
- if (options.verbose) console.log(`Cleaning file: ${rawFilePath}...`);
77
- const data = JSON.parse(rawJson);
78
- const validateData = !options["no-validate"];
79
- const cleanJson = cleanAndValidateData(data, cleaner, dataConverter.fromJson, dataConverter.toJson, validateData);
80
- if (cleanJson !== null) {
81
- const cleanFilePath = path.join(datasetCleanDir, ...filePathArray);
82
- fs.ensureDirSync(path.dirname(cleanFilePath));
83
- fs.writeFileSync(cleanFilePath, cleanJson, {
84
- encoding: "utf8"
85
- });
86
- if (postProcessor) {
87
- await postProcessor(data, datasetCleanDir, options);
88
- }
89
- }
90
- }
91
- }
92
- async function cleanReorganizedData(options) {
93
- const dataDir = options.dataDir;
94
- Date.prototype.toJSON = patchedDateToJson;
95
- let exitCode = options.commit ? 10 : 0;
96
- const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
97
- const enabledDatasets = getEnabledDatasets(options.categories);
98
- let chosenDatasets = filterByLegislature(datasets, options.legislature);
99
- if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
100
- for (const dataset of chosenDatasets.acteursEtOrganes) {
101
- const datasetName = path.basename(dataset.filename, ".json");
102
- if (options.dataset && datasetName !== options.dataset) {
103
- continue;
104
- }
105
- cloneGit(gitGroupUrl, datasetName, dataDir);
106
- const datasetRawDir = path.join(dataDir, datasetName);
107
- const datasetCleanDir = datasetRawDir + "_nettoye";
108
- if (options.pull) {
109
- git.resetAndPull(datasetCleanDir);
110
- }
111
- analyzeAndRemove(datasetName, options);
112
- await processFiles(datasetRawDir, datasetCleanDir, ["acteurs"], cleanActeur, {
113
- fromJson: ActeursEtOrganesConvert.toActeur,
114
- toJson: ActeursEtOrganesConvert.acteurToJson
115
- }, options);
116
- await processFiles(datasetRawDir, datasetCleanDir, ["organes"], cleanOrgane, {
117
- fromJson: ActeursEtOrganesConvert.toOrgane,
118
- toJson: ActeursEtOrganesConvert.organeToJson
119
- }, options);
120
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["acteurs", "organes"]);
121
- }
122
- }
123
- if (enabledDatasets & EnabledDatasets.Agendas) {
124
- for (const dataset of chosenDatasets.agendas) {
125
- const datasetName = path.basename(dataset.filename, ".json");
126
- if (options.dataset && datasetName !== options.dataset) {
127
- continue;
128
- }
129
- cloneGit(gitGroupUrl, datasetName, dataDir);
130
- analyzeAndRemove(datasetName, options);
131
- const datasetRawDir = path.join(dataDir, datasetName);
132
- const datasetCleanDir = datasetRawDir + "_nettoye";
133
- await processFiles(datasetRawDir, datasetCleanDir, [], cleanReunion, {
134
- fromJson: AgendasConvert.toReunion,
135
- toJson: AgendasConvert.reunionToJson
136
- }, options);
137
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
138
- }
139
- }
140
- if (enabledDatasets & EnabledDatasets.Amendements) {
141
- for (const dataset of chosenDatasets.amendements) {
142
- const datasetName = path.basename(dataset.filename, ".json");
143
- if (options.dataset && datasetName !== options.dataset) {
144
- continue;
145
- }
146
- cloneGit(gitGroupUrl, datasetName, dataDir);
147
- analyzeAndRemove(datasetName, options);
148
- const datasetRawDir = path.join(dataDir, datasetName);
149
- const datasetCleanDir = datasetRawDir + "_nettoye";
150
- await processFiles(datasetRawDir, datasetCleanDir, [], cleanAmendement, {
151
- fromJson: AmendementsConvert.toAmendement,
152
- toJson: AmendementsConvert.amendementToJson
153
- }, options);
154
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
155
- }
156
- }
157
- if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
158
- for (const dataset of chosenDatasets.dossiersLegislatifs) {
159
- const datasetName = path.basename(dataset.filename, ".json");
160
- if (options.dataset && datasetName !== options.dataset) {
161
- continue;
162
- }
163
- cloneGit(gitGroupUrl, datasetName, dataDir);
164
- analyzeAndRemove(datasetName, options);
165
- const datasetRawDir = path.join(dataDir, datasetName);
166
- const datasetCleanDir = datasetRawDir + "_nettoye";
167
- await processFiles(datasetRawDir, datasetCleanDir, ["documents"], cleanDocumentOrDivision, {
168
- fromJson: DossiersLegislatifsConvert.toDocument,
169
- toJson: DossiersLegislatifsConvert.documentToJson
170
- }, options, downloadAndParse);
171
- await processFiles(datasetRawDir, datasetCleanDir, ["dossiers"], cleanDossierParlementaire, {
172
- fromJson: DossiersLegislatifsConvert.toDossierParlementaire,
173
- toJson: DossiersLegislatifsConvert.dossierParlementaireToJson
174
- }, options);
175
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["documents", "dossiers"]);
176
- }
177
- }
178
- if (enabledDatasets & EnabledDatasets.Scrutins) {
179
- for (const dataset of chosenDatasets.scrutins) {
180
- const datasetName = path.basename(dataset.filename, ".json");
181
- if (options.dataset && datasetName !== options.dataset) {
182
- continue;
183
- }
184
- cloneGit(gitGroupUrl, datasetName, dataDir);
185
- analyzeAndRemove(datasetName, options);
186
- const datasetRawDir = path.join(dataDir, datasetName);
187
- const datasetCleanDir = datasetRawDir + "_nettoye";
188
- await processFiles(datasetRawDir, datasetCleanDir, [], cleanScrutin, {
189
- fromJson: ScrutinsConvert.toScrutin,
190
- toJson: ScrutinsConvert.scrutinToJson
191
- }, options);
192
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
193
- }
194
- }
195
- if (enabledDatasets & EnabledDatasets.Questions) {
196
- for (const dataset of datasets.questions) {
197
- const datasetName = path.basename(dataset.filename, ".json");
198
- if (options.dataset && datasetName !== options.dataset) {
199
- continue;
200
- }
201
- cloneGit(gitGroupUrl, datasetName, dataDir);
202
- analyzeAndRemove(datasetName, options);
203
- const datasetRawDir = path.join(dataDir, datasetName);
204
- const datasetCleanDir = datasetRawDir + "_nettoye";
205
- await processFiles(datasetRawDir, datasetCleanDir, [], cleanQuestion, {
206
- fromJson: QuestionsConvert.toQuestion,
207
- toJson: QuestionsConvert.questionToJson
208
- }, options);
209
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
210
- }
211
- }
212
- if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
213
- for (const dataset of datasets.comptesRendusSeances) {
214
- const datasetName = path.basename(dataset.filename, ".xml");
215
- if (options.dataset && datasetName !== options.dataset) {
216
- continue;
217
- }
218
- cloneGit(gitGroupUrl, datasetName, dataDir);
219
- analyzeAndRemove(datasetName, options);
220
- const datasetRawDir = path.join(dataDir, datasetName);
221
- const datasetCleanDir = datasetRawDir + "_nettoye";
222
- await processFiles(datasetRawDir, datasetCleanDir, [], cleanCompteRendu, {
223
- fromJson: ComptesRendusConvert.toCompteRendu,
224
- toJson: ComptesRendusConvert.compteRenduToJson
225
- }, options);
226
- exitCode = commitGit(datasetCleanDir, options, exitCode, ["."]);
227
- }
228
- }
229
-
230
- // Restore standard conversion of dates to JSON.
231
- Date.prototype.toJSON = existingDateToJson;
232
- return exitCode;
233
- }
234
- function analyzeAndRemove(datasetName, options) {
235
- const dataDir = options.dataDir;
236
- const datasetRawDir = path.join(dataDir, datasetName);
237
- const datasetCleanDir = datasetRawDir + "_nettoye";
238
- if (!options.silent) {
239
- console.log(`Cleaning directory: ${datasetCleanDir}…`);
240
- }
241
- fs.ensureDirSync(datasetCleanDir);
242
- for (const filename of fs.readdirSync(datasetCleanDir)) {
243
- if (filename[0] === ".") {
244
- continue;
245
- }
246
- const pathname = path.join(datasetCleanDir, filename);
247
- fs.removeSync(pathname);
248
- }
249
- }
250
- function commitAndPushUid(repositoryDir, options, subdirectories) {
251
- let error = false;
252
- if (options.commit) {
253
- git.uidBranchUpdate(repositoryDir, subdirectories, options["no-reset-after-commit"]);
254
- for (const remote of options.remote || []) {
255
- try {
256
- git.run(repositoryDir, `push --quiet ${remote} uid:uid`);
257
- } catch (childProcess) {
258
- error = true;
259
- }
260
- }
261
- }
262
- return error;
263
- }
264
- function main(argv) {
265
- const options = parseArgs(argv);
266
- return cleanReorganizedData(options);
267
- }
268
-
269
- /* istanbul ignore if */
270
- if (process.argv[1].endsWith("clean_reorganized_data.ts")) {
271
- main(process.argv).then(process.exit);
272
- }
273
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJjbGVhbkFjdGV1ciIsImNsZWFuQW1lbmRlbWVudCIsImNsZWFuRG9jdW1lbnRPckRpdmlzaW9uIiwiY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSIsImNsZWFuT3JnYW5lIiwiY2xlYW5SZXVuaW9uIiwiY2xlYW5TY3J1dGluIiwiY2xlYW5RdWVzdGlvbiIsImNsZWFuQ29tcHRlUmVuZHUiLCJkYXRhc2V0cyIsIkVuYWJsZWREYXRhc2V0cyIsImdldEVuYWJsZWREYXRhc2V0cyIsImZpbHRlckJ5TGVnaXNsYXR1cmUiLCJkb3dubG9hZEFuZFBhcnNlIiwiZXhpc3RpbmdEYXRlVG9Kc29uIiwicGF0Y2hlZERhdGVUb0pzb24iLCJ3YWxrRGlyIiwiZ2l0IiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0IiwiQWdlbmRhc0NvbnZlcnQiLCJBbWVuZGVtZW50c0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydCIsIlNjcnV0aW5zQ29udmVydCIsIlF1ZXN0aW9uc0NvbnZlcnQiLCJDb21wdGVzUmVuZHVzQ29udmVydCIsImNsb25lT3B0aW9uIiwiY29tbWl0T3B0aW9uIiwicmVtb3RlT3B0aW9uIiwibGVnaXNsYXR1cmVPcHRpb24iLCJjYXRlZ29yaWVzT3B0aW9uIiwiZGF0YURpckRlZmF1bHRPcHRpb24iLCJzaWxlbnRPcHRpb24iLCJ2ZXJib3NlT3B0aW9uIiwicHVsbE9wdGlvbiIsImZldGNoRG9jdW1lbnRzT3B0aW9uIiwicGFyc2VEb2N1bWVudHNPcHRpb24iLCJkb2N1bWVudEZvcm1hdE9wdGlvbiIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJvcHRpb25zIiwiY2xvbmVHaXQiLCJnaXRHcm91cFVybCIsImRhdGFzZXROYW1lIiwiZGF0YURpciIsImNsb25lIiwiY29tbWl0R2l0IiwiZGF0YXNldENsZWFuRGlyIiwiZXhpdENvZGUiLCJzdWJkaXJlY3RvcmllcyIsImNvbW1pdCIsImVycm9yQ29kZSIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJjb21taXRBbmRQdXNoVWlkIiwiY2xlYW5BbmRWYWxpZGF0ZURhdGEiLCJkYXRhIiwiY2xlYW5lciIsImZyb21Kc29uIiwidG9Kc29uIiwibm9WYWxpZGF0ZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJqc29uRGF0YSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWxpZGF0ZWREYXRhIiwicHJvY2Vzc0ZpbGVzIiwiZGF0YXNldFJhd0RpciIsIndhbGtEaXJQYXJhbXMiLCJkYXRhQ29udmVydGVyIiwicG9zdFByb2Nlc3NvciIsImZpbGVQYXRoQXJyYXkiLCJmaWxlbmFtZSIsImVuZHNXaXRoIiwicmF3RmlsZVBhdGgiLCJqb2luIiwicmF3SnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwidmVyYm9zZSIsImNvbnNvbGUiLCJsb2ciLCJwYXJzZSIsInZhbGlkYXRlRGF0YSIsImNsZWFuSnNvbiIsImNsZWFuRmlsZVBhdGgiLCJlbnN1cmVEaXJTeW5jIiwiZGlybmFtZSIsIndyaXRlRmlsZVN5bmMiLCJjbGVhblJlb3JnYW5pemVkRGF0YSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJ0cmltIiwicmVwbGFjZSIsImVuYWJsZWREYXRhc2V0cyIsImNhdGVnb3JpZXMiLCJjaG9zZW5EYXRhc2V0cyIsImxlZ2lzbGF0dXJlIiwiQWN0ZXVyc0V0T3JnYW5lcyIsImRhdGFzZXQiLCJhY3RldXJzRXRPcmdhbmVzIiwiYmFzZW5hbWUiLCJwdWxsIiwicmVzZXRBbmRQdWxsIiwiYW5hbHl6ZUFuZFJlbW92ZSIsInRvQWN0ZXVyIiwiYWN0ZXVyVG9Kc29uIiwidG9PcmdhbmUiLCJvcmdhbmVUb0pzb24iLCJBZ2VuZGFzIiwiYWdlbmRhcyIsInRvUmV1bmlvbiIsInJldW5pb25Ub0pzb24iLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwidG9BbWVuZGVtZW50IiwiYW1lbmRlbWVudFRvSnNvbiIsIkRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc0xlZ2lzbGF0aWZzIiwidG9Eb2N1bWVudCIsImRvY3VtZW50VG9Kc29uIiwidG9Eb3NzaWVyUGFybGVtZW50YWlyZSIsImRvc3NpZXJQYXJsZW1lbnRhaXJlVG9Kc29uIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbiIsInNjcnV0aW5Ub0pzb24iLCJRdWVzdGlvbnMiLCJxdWVzdGlvbnMiLCJ0b1F1ZXN0aW9uIiwicXVlc3Rpb25Ub0pzb24iLCJDb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwidG9Db21wdGVSZW5kdSIsImNvbXB0ZVJlbmR1VG9Kc29uIiwic2lsZW50IiwicmVhZGRpclN5bmMiLCJwYXRobmFtZSIsInJlbW92ZVN5bmMiLCJyZXBvc2l0b3J5RGlyIiwiZXJyb3IiLCJ1aWRCcmFuY2hVcGRhdGUiLCJydW4iLCJjaGlsZFByb2Nlc3MiLCJtYWluIiwicHJvY2VzcyIsInRoZW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7XG4gIGNsZWFuQWN0ZXVyLFxuICBjbGVhbkFtZW5kZW1lbnQsXG4gIGNsZWFuRG9jdW1lbnRPckRpdmlzaW9uLFxuICBjbGVhbkRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBjbGVhbk9yZ2FuZSxcbiAgY2xlYW5SZXVuaW9uLFxuICBjbGVhblNjcnV0aW4sXG4gIGNsZWFuUXVlc3Rpb24sXG4gIGNsZWFuQ29tcHRlUmVuZHUsXG59IGZyb20gXCIuLi9jbGVhbmVyc1wiXG5pbXBvcnQge1xuICBkYXRhc2V0cyxcbiAgRW5hYmxlZERhdGFzZXRzLFxuICBnZXRFbmFibGVkRGF0YXNldHMsXG4gIGZpbHRlckJ5TGVnaXNsYXR1cmUsXG59IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyBkb3dubG9hZEFuZFBhcnNlIH0gZnJvbSBcIi4vcmV0cmlldmVfZG9jdW1lbnRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHtcbiAgQWN0ZXVyLFxuICBDb252ZXJ0IGFzIEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LFxuICBPcmdhbmUsXG59IGZyb20gXCIuLi90eXBlcy9hY3RldXJzX2V0X29yZ2FuZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBBZ2VuZGFzQ29udmVydCwgUmV1bmlvbiB9IGZyb20gXCIuLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQsIENvbnZlcnQgYXMgQW1lbmRlbWVudHNDb252ZXJ0IH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4uL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgU2NydXRpbnNDb252ZXJ0LCBTY3J1dGluIH0gZnJvbSBcIi4uL3R5cGVzL3NjcnV0aW5zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgUXVlc3Rpb25zQ29udmVydCwgUXVlc3Rpb24gfSBmcm9tIFwiLi4vdHlwZXMvcXVlc3Rpb25zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQ29tcHRlc1JlbmR1c0NvbnZlcnQsIENvbXB0ZVJlbmR1IH0gZnJvbSBcIi4uL3R5cGVzL2RlYmF0c1wiXG5pbXBvcnQge1xuICBjbG9uZU9wdGlvbixcbiAgY29tbWl0T3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBjYXRlZ29yaWVzT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICBmZXRjaERvY3VtZW50c09wdGlvbixcbiAgcGFyc2VEb2N1bWVudHNPcHRpb24sXG4gIGRvY3VtZW50Rm9ybWF0T3B0aW9uLFxufSBmcm9tIFwiLi9zaGFyZWQvY2xpX2hlbHBlcnNcIlxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiBhbnkge1xuICBjb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gICAgY2xvbmVPcHRpb24sXG4gICAgY29tbWl0T3B0aW9uLFxuICAgIHJlbW90ZU9wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICBjYXRlZ29yaWVzT3B0aW9uLFxuICAgIHNpbGVudE9wdGlvbixcbiAgICB2ZXJib3NlT3B0aW9uLFxuICAgIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICAgIHB1bGxPcHRpb24sXG4gICAgZmV0Y2hEb2N1bWVudHNPcHRpb24sXG4gICAgcGFyc2VEb2N1bWVudHNPcHRpb24sXG4gICAgZG9jdW1lbnRGb3JtYXRPcHRpb24sXG4gICAge1xuICAgICAgYWxpYXM6IFwiZFwiLFxuICAgICAgaGVscDogXCJzaW5nbGUgZGF0YXNldCB0byByZW9yZ2FuaXplXCIsXG4gICAgICBuYW1lOiBcImRhdGFzZXRcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHA6IFwiZG8gbm90IHJlc2V0IC0taGFyZCBhZnRlciBjb21taXQgdG8gc2F2ZSBJL08gaWYgdGhlIHdvcmtpbmcgdHJlZSBpcyB0byBiZSBkaXNjYXJkZWRcIixcbiAgICAgIG5hbWU6IFwibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiVlwiLFxuICAgICAgaGVscDogXCJkb24ndCB2YWxpZGF0ZSBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gIF1cbiAgY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMsIHtcbiAgICBhcmd2OiBhcmd2LFxuICB9KVxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBjbG9uZUdpdChcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZGF0YXNldE5hbWU6IHN0cmluZyxcbiAgZGF0YURpcjogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGdpdC5jbG9uZShnaXRHcm91cFVybCwgYCR7ZGF0YXNldE5hbWV9X25ldHRveWVgLCBkYXRhRGlyKVxufVxuXG5mdW5jdGlvbiBjb21taXRHaXQoXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICBvcHRpb25zOiBhbnksXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4pOiBudW1iZXIge1xuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgKVxuICAgIGlmIChcbiAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgfVxuICB9XG4gIGlmIChcbiAgICBjb21taXRBbmRQdXNoVWlkKGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgc3ViZGlyZWN0b3JpZXMpICYmXG4gICAgKGV4aXRDb2RlID09PSAwIHx8IGV4aXRDb2RlID09PSAxMClcbiAgKSB7XG4gICAgZXhpdENvZGUgPSAxXG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICBkYXRhOiBhbnksXG4gIGNsZWFuZXI6IChkYXRhOiBUKSA9PiB2b2lkLFxuICBmcm9tSnNvbjogKGpzb246IHN0cmluZykgPT4gVCxcbiAgdG9Kc29uOiAoZGF0YTogVCkgPT4gc3RyaW5nLFxuICBub1ZhbGlkYXRlOiBCb29sZWFuLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNsZWFuZXIoZGF0YSlcbiAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIEJ5IGNvbnZlbnRpb246IGFuIGVtcHR5IG9iamVjdCBtdXN0IGJlIGRlbGV0ZWQuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBjb25zdCBqc29uRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXG4gIGlmICghbm9WYWxpZGF0ZSkge1xuICAgIHJldHVybiBqc29uRGF0YVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZhbGlkYXRlZERhdGE6IFQgPSBmcm9tSnNvbihqc29uRGF0YSlcbiAgICByZXR1cm4gdG9Kc29uKHZhbGlkYXRlZERhdGEpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzPFQ+KFxuICBkYXRhc2V0UmF3RGlyOiBzdHJpbmcsXG4gIGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nLFxuICB3YWxrRGlyUGFyYW1zOiBhbnlbXSxcbiAgY2xlYW5lcjogYW55LFxuICBkYXRhQ29udmVydGVyOiB7IGZyb21Kc29uOiBhbnk7IHRvSnNvbjogYW55IH0sXG4gIG9wdGlvbnM6IGFueSxcbiAgcG9zdFByb2Nlc3Nvcj86IGFueSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoQXJyYXkgb2Ygd2Fsa0RpcihkYXRhc2V0UmF3RGlyLCB3YWxrRGlyUGFyYW1zKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZmlsZVBhdGhBcnJheVtmaWxlUGF0aEFycmF5Lmxlbmd0aCAtIDFdXG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhd0ZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXRSYXdEaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgY29uc3QgcmF3SnNvbiA9IGZzLnJlYWRGaWxlU3luYyhyYXdGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSBjb25zb2xlLmxvZyhgQ2xlYW5pbmcgZmlsZTogJHtyYXdGaWxlUGF0aH0uLi5gKVxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0pzb24pXG4gICAgY29uc3QgdmFsaWRhdGVEYXRhID0gIW9wdGlvbnNbXCJuby12YWxpZGF0ZVwiXVxuICAgIGNvbnN0IGNsZWFuSnNvbiA9IGNsZWFuQW5kVmFsaWRhdGVEYXRhPFQ+KFxuICAgICAgZGF0YSxcbiAgICAgIGNsZWFuZXIsXG4gICAgICBkYXRhQ29udmVydGVyLmZyb21Kc29uLFxuICAgICAgZGF0YUNvbnZlcnRlci50b0pzb24sXG4gICAgICB2YWxpZGF0ZURhdGEsXG4gICAgKVxuXG4gICAgaWYgKGNsZWFuSnNvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2xlYW5GaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0Q2xlYW5EaXIsIC4uLmZpbGVQYXRoQXJyYXkpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShjbGVhbkZpbGVQYXRoKSlcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoY2xlYW5GaWxlUGF0aCwgY2xlYW5Kc29uLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuXG4gICAgICBpZiAocG9zdFByb2Nlc3Nvcikge1xuICAgICAgICBhd2FpdCBwb3N0UHJvY2Vzc29yKGRhdGEsIGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9uczogYW55KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgZGF0YURpcjogc3RyaW5nID0gb3B0aW9ucy5kYXRhRGlyXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IHBhdGNoZWREYXRlVG9Kc29uXG4gIGxldCBleGl0Q29kZSA9IG9wdGlvbnMuY29tbWl0ID8gMTAgOiAwXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZT8udHJpbSgpLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgY29uc3QgZW5hYmxlZERhdGFzZXRzID0gZ2V0RW5hYmxlZERhdGFzZXRzKG9wdGlvbnMuY2F0ZWdvcmllcylcbiAgbGV0IGNob3NlbkRhdGFzZXRzID0gZmlsdGVyQnlMZWdpc2xhdHVyZShkYXRhc2V0cywgb3B0aW9ucy5sZWdpc2xhdHVyZSlcblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcbiAgICAgIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICAgICAgZ2l0LnJlc2V0QW5kUHVsbChkYXRhc2V0Q2xlYW5EaXIpXG4gICAgICB9XG5cbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8QWN0ZXVyPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJhY3RldXJzXCJdLFxuICAgICAgICBjbGVhbkFjdGV1cixcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cixcbiAgICAgICAgICB0b0pzb246IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LmFjdGV1clRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICAgIGF3YWl0IHByb2Nlc3NGaWxlczxPcmdhbmU+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtcIm9yZ2FuZXNcIl0sXG4gICAgICAgIGNsZWFuT3JnYW5lLFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IEFjdGV1cnNFdE9yZ2FuZXNDb252ZXJ0LnRvT3JnYW5lLFxuICAgICAgICAgIHRvSnNvbjogQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQub3JnYW5lVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXG4gICAgICAgIFwiYWN0ZXVyc1wiLFxuICAgICAgICBcIm9yZ2FuZXNcIixcbiAgICAgIF0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFnZW5kYXMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8UmV1bmlvbj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuUmV1bmlvbixcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBZ2VuZGFzQ29udmVydC50b1JldW5pb24sXG4gICAgICAgICAgdG9Kc29uOiBBZ2VuZGFzQ29udmVydC5yZXVuaW9uVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXCIuXCJdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8QW1lbmRlbWVudD4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuQW1lbmRlbWVudCxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50LFxuICAgICAgICAgIHRvSnNvbjogQW1lbmRlbWVudHNDb252ZXJ0LmFtZW5kZW1lbnRUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcIi5cIl0pXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShkYXRhc2V0LmZpbGVuYW1lLCBcIi5qc29uXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8RG9jdW1lbnQ+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtcImRvY3VtZW50c1wiXSxcbiAgICAgICAgY2xlYW5Eb2N1bWVudE9yRGl2aXNpb24sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb2N1bWVudCxcbiAgICAgICAgICB0b0pzb246IERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LmRvY3VtZW50VG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBkb3dubG9hZEFuZFBhcnNlLFxuICAgICAgKVxuICAgICAgYXdhaXQgcHJvY2Vzc0ZpbGVzPERvc3NpZXJQYXJsZW1lbnRhaXJlPihcbiAgICAgICAgZGF0YXNldFJhd0RpcixcbiAgICAgICAgZGF0YXNldENsZWFuRGlyLFxuICAgICAgICBbXCJkb3NzaWVyc1wiXSxcbiAgICAgICAgY2xlYW5Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAge1xuICAgICAgICAgIGZyb21Kc29uOiBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgIHRvSnNvbjogRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQuZG9zc2llclBhcmxlbWVudGFpcmVUb0pzb24sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApXG5cbiAgICAgIGV4aXRDb2RlID0gY29tbWl0R2l0KGRhdGFzZXRDbGVhbkRpciwgb3B0aW9ucywgZXhpdENvZGUsIFtcbiAgICAgICAgXCJkb2N1bWVudHNcIixcbiAgICAgICAgXCJkb3NzaWVyc1wiLFxuICAgICAgXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIuanNvblwiKVxuICAgICAgaWYgKG9wdGlvbnMuZGF0YXNldCAmJiBkYXRhc2V0TmFtZSAhPT0gb3B0aW9ucy5kYXRhc2V0KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcbiAgICAgIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWUsIG9wdGlvbnMpXG4gICAgICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjb25zdCBkYXRhc2V0Q2xlYW5EaXI6IHN0cmluZyA9IGRhdGFzZXRSYXdEaXIgKyBcIl9uZXR0b3llXCJcblxuICAgICAgYXdhaXQgcHJvY2Vzc0ZpbGVzPFNjcnV0aW4+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhblNjcnV0aW4sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbixcbiAgICAgICAgICB0b0pzb246IFNjcnV0aW5zQ29udmVydC5zY3J1dGluVG9Kc29uLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuXG4gICAgICBleGl0Q29kZSA9IGNvbW1pdEdpdChkYXRhc2V0Q2xlYW5EaXIsIG9wdGlvbnMsIGV4aXRDb2RlLCBbXCIuXCJdKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUXVlc3Rpb25zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKGRhdGFzZXQuZmlsZW5hbWUsIFwiLmpzb25cIilcbiAgICAgIGlmIChvcHRpb25zLmRhdGFzZXQgJiYgZGF0YXNldE5hbWUgIT09IG9wdGlvbnMuZGF0YXNldCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG4gICAgICBhbmFseXplQW5kUmVtb3ZlKGRhdGFzZXROYW1lLCBvcHRpb25zKVxuICAgICAgY29uc3QgZGF0YXNldFJhd0Rpcjogc3RyaW5nID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY29uc3QgZGF0YXNldENsZWFuRGlyOiBzdHJpbmcgPSBkYXRhc2V0UmF3RGlyICsgXCJfbmV0dG95ZVwiXG5cbiAgICAgIGF3YWl0IHByb2Nlc3NGaWxlczxRdWVzdGlvbj4oXG4gICAgICAgIGRhdGFzZXRSYXdEaXIsXG4gICAgICAgIGRhdGFzZXRDbGVhbkRpcixcbiAgICAgICAgW10sXG4gICAgICAgIGNsZWFuUXVlc3Rpb24sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tSnNvbjogUXVlc3Rpb25zQ29udmVydC50b1F1ZXN0aW9uLFxuICAgICAgICAgIHRvSnNvbjogUXVlc3Rpb25zQ29udmVydC5xdWVzdGlvblRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmNvbXB0ZXNSZW5kdXNTZWFuY2VzKSB7XG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoZGF0YXNldC5maWxlbmFtZSwgXCIueG1sXCIpXG4gICAgICBpZiAob3B0aW9ucy5kYXRhc2V0ICYmIGRhdGFzZXROYW1lICE9PSBvcHRpb25zLmRhdGFzZXQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuICAgICAgYW5hbHl6ZUFuZFJlbW92ZShkYXRhc2V0TmFtZSwgb3B0aW9ucylcbiAgICAgIGNvbnN0IGRhdGFzZXRSYXdEaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuXG4gICAgICBhd2FpdCBwcm9jZXNzRmlsZXM8Q29tcHRlUmVuZHU+KFxuICAgICAgICBkYXRhc2V0UmF3RGlyLFxuICAgICAgICBkYXRhc2V0Q2xlYW5EaXIsXG4gICAgICAgIFtdLFxuICAgICAgICBjbGVhbkNvbXB0ZVJlbmR1LFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbUpzb246IENvbXB0ZXNSZW5kdXNDb252ZXJ0LnRvQ29tcHRlUmVuZHUsXG4gICAgICAgICAgdG9Kc29uOiBDb21wdGVzUmVuZHVzQ29udmVydC5jb21wdGVSZW5kdVRvSnNvbixcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcblxuICAgICAgZXhpdENvZGUgPSBjb21taXRHaXQoZGF0YXNldENsZWFuRGlyLCBvcHRpb25zLCBleGl0Q29kZSwgW1wiLlwiXSlcbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIGFuYWx5emVBbmRSZW1vdmUoZGF0YXNldE5hbWU6IHN0cmluZywgb3B0aW9uczogYW55KTogYW55IHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBjb25zdCBkYXRhc2V0UmF3RGlyOiBzdHJpbmcgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gIGNvbnN0IGRhdGFzZXRDbGVhbkRpcjogc3RyaW5nID0gZGF0YXNldFJhd0RpciArIFwiX25ldHRveWVcIlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYENsZWFuaW5nIGRpcmVjdG9yeTogJHtkYXRhc2V0Q2xlYW5EaXJ94oCmYClcbiAgfVxuICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRDbGVhbkRpcilcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0Q2xlYW5EaXIpKSB7XG4gICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGF0aG5hbWUgPSBwYXRoLmpvaW4oZGF0YXNldENsZWFuRGlyLCBmaWxlbmFtZSlcbiAgICBmcy5yZW1vdmVTeW5jKHBhdGhuYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEFuZFB1c2hVaWQoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgb3B0aW9uczogYW55LFxuICBzdWJkaXJlY3RvcmllczogYW55LFxuKTogYm9vbGVhbiB7XG4gIGxldCBlcnJvciA9IGZhbHNlXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIGdpdC51aWRCcmFuY2hVcGRhdGUoXG4gICAgICByZXBvc2l0b3J5RGlyLFxuICAgICAgc3ViZGlyZWN0b3JpZXMsXG4gICAgICBvcHRpb25zW1wibm8tcmVzZXQtYWZ0ZXItY29tbWl0XCJdLFxuICAgIClcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiBvcHRpb25zLnJlbW90ZSB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2l0LnJ1bihyZXBvc2l0b3J5RGlyLCBgcHVzaCAtLXF1aWV0ICR7cmVtb3RlfSB1aWQ6dWlkYClcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICBlcnJvciA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVycm9yXG59XG5cbmZ1bmN0aW9uIG1haW4oYXJndjogYW55KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlQXJncyhhcmd2KVxuICByZXR1cm4gY2xlYW5SZW9yZ2FuaXplZERhdGEob3B0aW9ucylcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5pZiAocHJvY2Vzcy5hcmd2WzFdLmVuZHNXaXRoKFwiY2xlYW5fcmVvcmdhbml6ZWRfZGF0YS50c1wiKSkge1xuICBtYWluKHByb2Nlc3MuYXJndikudGhlbihwcm9jZXNzLmV4aXQpXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsT0FBT0MsRUFBRSxNQUFNLFVBQVU7QUFDekIsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUVyQkMsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLHVCQUF1QixFQUN2QkMseUJBQXlCLEVBQ3pCQyxXQUFXLEVBQ1hDLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLGdCQUFnQjtBQUFBLFNBR2hCQyxRQUFRLEVBQ1JDLGVBQWUsRUFDZkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUI7QUFBQSxTQUVaQyxnQkFBZ0I7QUFBQSxTQUNoQkMsa0JBQWtCLEVBQUVDLGlCQUFpQjtBQUFBLFNBQ3JDQyxPQUFPO0FBQUEsT0FDVCxLQUFLQyxHQUFHO0FBQUEsU0FHYkMsT0FBTyxJQUFJQyx1QkFBdUI7QUFBQSxTQUczQkQsT0FBTyxJQUFJRSxjQUFjO0FBQUEsU0FDYkYsT0FBTyxJQUFJRyxrQkFBa0I7QUFBQSxTQUVoREgsT0FBTyxJQUFJSSwwQkFBMEI7QUFBQSxTQUk5QkosT0FBTyxJQUFJSyxlQUFlO0FBQUEsU0FDMUJMLE9BQU8sSUFBSU0sZ0JBQWdCO0FBQUEsU0FDM0JOLE9BQU8sSUFBSU8sb0JBQW9CO0FBQUEsU0FFdENDLFdBQVcsRUFDWEMsWUFBWSxFQUNaQyxZQUFZLEVBQ1pDLGlCQUFpQixFQUNqQkMsZ0JBQWdCLEVBQ2hCQyxvQkFBb0IsRUFDcEJDLFlBQVksRUFDWkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLG9CQUFvQixFQUNwQkMsb0JBQW9CLEVBQ3BCQyxvQkFB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
@@ -1,249 +0,0 @@
1
- "use strict";
2
-
3
- require("core-js/modules/es.symbol.js");
4
- require("core-js/modules/es.symbol.description.js");
5
- require("core-js/modules/es.symbol.iterator.js");
6
- require("core-js/modules/es.array.from.js");
7
- require("core-js/modules/es.array.is-array.js");
8
- require("core-js/modules/es.array.iterator.js");
9
- require("core-js/modules/es.array.slice.js");
10
- require("core-js/modules/es.date.to-string.js");
11
- require("core-js/modules/es.function.name.js");
12
- require("core-js/modules/es.regexp.to-string.js");
13
- require("core-js/modules/es.string.iterator.js");
14
- require("core-js/modules/web.dom-collections.iterator.js");
15
- require("core-js/modules/es.array.for-each.js");
16
- require("core-js/modules/es.array.join.js");
17
- require("core-js/modules/es.date.to-json.js");
18
- require("core-js/modules/es.object.keys.js");
19
- require("core-js/modules/es.object.to-string.js");
20
- require("core-js/modules/es.regexp.exec.js");
21
- require("core-js/modules/es.string.replace.js");
22
- var _commandLineArgs = _interopRequireDefault(require("command-line-args"));
23
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
24
- var _path = _interopRequireDefault(require("path"));
25
- var _deepObjectDiff = require("deep-object-diff");
26
- var _datasets = require("../datasets");
27
- var _file_systems = require("../file_systems");
28
- var _cli_helpers = require("./shared/cli_helpers");
29
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
30
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
31
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
32
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
33
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
34
- 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; } } }; }
35
- 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; } }
36
- 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; }
37
- var diffedAmendments = [];
38
- var newAmendments = [];
39
- var optionsDefinitions = [_cli_helpers.silentOption, _cli_helpers.verboseOption, _cli_helpers.dataDirDefaultOption, {
40
- alias: "m",
41
- help: "Diff modes.",
42
- name: "mode",
43
- defaultValue: "merged",
44
- type: String
45
- }, {
46
- alias: "p",
47
- help: "Directory containing the previous dump of amendments",
48
- name: "previous",
49
- type: String
50
- }, {
51
- alias: "o",
52
- help: "Output directory for diff files",
53
- name: "output",
54
- defaultValue: "./diff_outputs/",
55
- type: String
56
- }];
57
- var options = (0, _commandLineArgs["default"])(optionsDefinitions);
58
- function diffAmendements(dataDir) {
59
- if (!options.previous) {
60
- console.error("No previous data folder specified. You must provide one with the -p or --previous option. Exiting...");
61
- process.exit();
62
- }
63
- if (!_fsExtra["default"].existsSync(options.output)) {
64
- console.error("The output dir does not exists. You must provide an existing directory. Default directory is ./diff_outputs/");
65
- process.exit();
66
- }
67
- var _iterator = _createForOfIteratorHelper(_datasets.datasets.amendements),
68
- _step;
69
- try {
70
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
71
- var dataset = _step.value;
72
- switch (dataset.structure) {
73
- case _datasets.DatasetStructure.SegmentedFiles:
74
- {
75
- var originalJsonDir = _path["default"].join(dataDir, dataset.filename);
76
- if (!options.silent) {
77
- console.log("Diffing ".concat(originalJsonDir, " folder..."));
78
- }
79
- var _iterator2 = _createForOfIteratorHelper((0, _file_systems.walkDir)(originalJsonDir)),
80
- _step2;
81
- try {
82
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
83
- var amendementSplitPath = _step2.value;
84
- var newFilePath = originalJsonDir + "/" + amendementSplitPath.join("/");
85
- var newFile = JSON.parse(_fsExtra["default"].readFileSync(newFilePath).toLocaleString());
86
- var oldFilePath = options.previous + dataset.filename + "/" + amendementSplitPath.join("/");
87
- var oldFileExists = _fsExtra["default"].existsSync(oldFilePath);
88
- if (!oldFileExists) {
89
- // If file found does not exist in the previous dump
90
- if (!options.silent) {
91
- console.log("File did not exists previously. Guessing it's a new amendment. Adding to the diff list for new objects");
92
- }
93
- addToQueueForNewAmendments(newFile, amendementSplitPath);
94
- continue;
95
- }
96
-
97
- // File already existed in previous dump
98
- var oldFile = JSON.parse("{}");
99
- try {
100
- // Gather data of the file and retranscript as a Json object
101
- oldFile = JSON.parse(_fsExtra["default"].readFileSync(oldFilePath).toLocaleString());
102
- } catch (e) {
103
- // Skip the process to the next iteration in case of corrupt JSON data
104
- continue;
105
- }
106
-
107
- // Generate the diff beetween the two JSON objects (old & new dump)
108
- var diff = (0, _deepObjectDiff.detailedDiff)(oldFile, newFile);
109
-
110
- // If no changes beetween the two dumps
111
- if (Object.keys(diff.added).length === 0 && Object.keys(diff.updated).length === 0 && Object.keys(diff.deleted).length === 0) {
112
- // Skip to next iteration as there is no need to generate a file
113
- continue;
114
- } else {
115
- if (!options.silent) {
116
- console.log("Changes found !");
117
- }
118
- addToQueueForDiffedAmendments(diff, amendementSplitPath);
119
- }
120
- break;
121
- }
122
- } catch (err) {
123
- _iterator2.e(err);
124
- } finally {
125
- _iterator2.f();
126
- }
127
- }
128
- }
129
- if (!options.silent) {
130
- console.log("Generating output(s)");
131
- }
132
- generateDiffFiles();
133
- }
134
- } catch (err) {
135
- _iterator.e(err);
136
- } finally {
137
- _iterator.f();
138
- }
139
- }
140
-
141
- /**
142
- * General process for output of diffs.
143
- * The script handles two different modes :
144
- * - merged : Will output a single file for new amendements and a single file
145
- * for updated amendements
146
- * - splitted : Will output a single file for each amendments, either its new or updated.
147
- *
148
- */
149
- function generateDiffFiles() {
150
- // Handles merged mode
151
- if (options.mode === "merged") {
152
- if (!options.silent) {
153
- console.log("Generating merged files");
154
- }
155
- if (diffedAmendments.length > 0) {
156
- if (!options.silent) {
157
- console.log("Generating diffed amendments files");
158
- }
159
- _fsExtra["default"].writeFileSync(options.output + "amendements_XV_diffed.json", JSON.stringify(diffedAmendments), {
160
- encoding: "utf8",
161
- flag: "w"
162
- });
163
- } else {
164
- if (!options.silent) {
165
- console.log("No diff in the already existing amendments");
166
- }
167
- }
168
- if (newAmendments.length > 0) {
169
- if (!options.silent) {
170
- console.log("Generating new amendments file");
171
- }
172
- _fsExtra["default"].writeFileSync(options.output + "amendements_XV_new.json", JSON.stringify(newAmendments), {
173
- encoding: "utf8",
174
- flag: "w"
175
- });
176
- } else {
177
- if (!options.silent) {
178
- console.log("No new amendement. Skipping file generation");
179
- }
180
- }
181
- } else if (options.mode === "splitted") {
182
- // Handles splitted mode
183
- if (!options.silent) {
184
- console.log("Generating separated files");
185
- }
186
-
187
- /**
188
- * Process the copy action of the new and diffed amendments
189
- */
190
-
191
- diffedAmendments.forEach(function (diffedAmendment) {
192
- generateSingleDiffedAmendment(diffedAmendment);
193
- });
194
- newAmendments.forEach(function (newAmendment) {
195
- generateSingleNewAmendment(newAmendment);
196
- });
197
- } else {
198
- console.error("Unknown output mode. Aborting...");
199
- process.exit();
200
- }
201
- }
202
-
203
- // Pushes an amendment to the queue that will be processed to copy new amendments files
204
- function addToQueueForNewAmendments(file, path) {
205
- var amendment = {
206
- path: path,
207
- data: file
208
- };
209
- newAmendments.push(amendment);
210
- }
211
- // Pushes an amendment to the queue that will be processed to copy updated amendments files
212
- function addToQueueForDiffedAmendments(diffedData, path) {
213
- var amendment = {
214
- path: path,
215
- data: diffedData
216
- };
217
- diffedAmendments.push(amendment);
218
- }
219
-
220
- // generates a file with a copy of the new amendement
221
- function generateSingleNewAmendment(newAmendment) {
222
- newAmendment.path.shift();
223
- var shortDir = _toConsumableArray(newAmendment.path);
224
- shortDir.pop();
225
- console.log(options.output + shortDir.join("/"));
226
- _fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
227
- recursive: true
228
- });
229
- _fsExtra["default"].writeFileSync(options.output + newAmendment.path.join("/").replace(/(\.json)/, ".new$1"), JSON.stringify(newAmendment.data), {
230
- encoding: "utf8",
231
- flag: "w"
232
- });
233
- }
234
-
235
- // generates a file with a copy of the modified data of the previously existing amendment;
236
- function generateSingleDiffedAmendment(diffedAmendment) {
237
- diffedAmendment.path.shift();
238
- var shortDir = _toConsumableArray(diffedAmendment.path);
239
- shortDir.pop();
240
- _fsExtra["default"].mkdirSync(options.output + shortDir.join("/"), {
241
- recursive: true
242
- });
243
- _fsExtra["default"].writeFileSync(options.output + diffedAmendment.path.join("/").replace(/(\.json)/, ".diff$1"), JSON.stringify(diffedAmendment.data), {
244
- encoding: "utf8",
245
- flag: "w"
246
- });
247
- }
248
- diffAmendements(options.dataDir);
249
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbWFuZExpbmVBcmdzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZnNFeHRyYSIsIl9wYXRoIiwiX2RlZXBPYmplY3REaWZmIiwiX2RhdGFzZXRzIiwiX2ZpbGVfc3lzdGVtcyIsIl9jbGlfaGVscGVycyIsImUiLCJfX2VzTW9kdWxlIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiciIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJUeXBlRXJyb3IiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiZnJvbSIsImlzQXJyYXkiLCJfYXJyYXlMaWtlVG9BcnJheSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwidCIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInRlc3QiLCJkaWZmZWRBbWVuZG1lbnRzIiwibmV3QW1lbmRtZW50cyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImFsaWFzIiwiaGVscCIsImRlZmF1bHRWYWx1ZSIsInR5cGUiLCJTdHJpbmciLCJvcHRpb25zIiwiY29tbWFuZExpbmVBcmdzIiwiZGlmZkFtZW5kZW1lbnRzIiwiZGF0YURpciIsInByZXZpb3VzIiwiY29uc29sZSIsImVycm9yIiwicHJvY2VzcyIsImV4aXQiLCJmcyIsImV4aXN0c1N5bmMiLCJvdXRwdXQiLCJfaXRlcmF0b3IiLCJkYXRhc2V0cyIsImFtZW5kZW1lbnRzIiwiX3N0ZXAiLCJkYXRhc2V0Iiwic3RydWN0dXJlIiwiRGF0YXNldFN0cnVjdHVyZSIsIlNlZ21lbnRlZEZpbGVzIiwib3JpZ2luYWxKc29uRGlyIiwicGF0aCIsImpvaW4iLCJmaWxlbmFtZSIsInNpbGVudCIsImxvZyIsImNvbmNhdCIsIl9pdGVyYXRvcjIiLCJ3YWxrRGlyIiwiX3N0ZXAyIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsIm5ld0ZpbGVQYXRoIiwibmV3RmlsZSIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsInRvTG9jYWxlU3RyaW5nIiwib2xkRmlsZVBhdGgiLCJvbGRGaWxlRXhpc3RzIiwiYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMiLCJvbGRGaWxlIiwiZGlmZiIsImRldGFpbGVkRGlmZiIsIk9iamVjdCIsImtleXMiLCJhZGRlZCIsInVwZGF0ZWQiLCJkZWxldGVkIiwiYWRkVG9RdWV1ZUZvckRpZmZlZEFtZW5kbWVudHMiLCJlcnIiLCJnZW5lcmF0ZURpZmZGaWxlcyIsIm1vZGUiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5IiwiZW5jb2RpbmciLCJmbGFnIiwiZm9yRWFjaCIsImRpZmZlZEFtZW5kbWVudCIsImdlbmVyYXRlU2luZ2xlRGlmZmVkQW1lbmRtZW50IiwibmV3QW1lbmRtZW50IiwiZ2VuZXJhdGVTaW5nbGVOZXdBbWVuZG1lbnQiLCJmaWxlIiwiYW1lbmRtZW50IiwiZGF0YSIsInB1c2giLCJkaWZmZWREYXRhIiwic2hpZnQiLCJzaG9ydERpciIsInBvcCIsIm1rZGlyU3luYyIsInJlY3Vyc2l2ZSIsInJlcGxhY2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9kaWZmX2FtZW5kZW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZGV0YWlsZWREaWZmIH0gZnJvbSBcImRlZXAtb2JqZWN0LWRpZmZcIlxuaW1wb3J0IHsgZGF0YXNldHMsIERhdGFzZXRTdHJ1Y3R1cmUgfSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbn0gZnJvbSBcIi4vc2hhcmVkL2NsaV9oZWxwZXJzXCJcbmNvbnN0IGRpZmZlZEFtZW5kbWVudHM6IEFycmF5PGFueT4gPSBbXVxuY29uc3QgbmV3QW1lbmRtZW50czogQXJyYXk8YW55PiA9IFtdXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgc2lsZW50T3B0aW9uLFxuICB2ZXJib3NlT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAge1xuICAgIGFsaWFzOiBcIm1cIixcbiAgICBoZWxwOiBcIkRpZmYgbW9kZXMuXCIsXG4gICAgbmFtZTogXCJtb2RlXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIm1lcmdlZFwiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcInBcIixcbiAgICBoZWxwOiBcIkRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcmV2aW91cyBkdW1wIG9mIGFtZW5kbWVudHNcIixcbiAgICBuYW1lOiBcInByZXZpb3VzXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwib1wiLFxuICAgIGhlbHA6IFwiT3V0cHV0IGRpcmVjdG9yeSBmb3IgZGlmZiBmaWxlc1wiLFxuICAgIG5hbWU6IFwib3V0cHV0XCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIi4vZGlmZl9vdXRwdXRzL1wiLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgfSxcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuXG5mdW5jdGlvbiBkaWZmQW1lbmRlbWVudHMoZGF0YURpcjogc3RyaW5nKSB7XG4gIGlmICghb3B0aW9ucy5wcmV2aW91cykge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIk5vIHByZXZpb3VzIGRhdGEgZm9sZGVyIHNwZWNpZmllZC4gWW91IG11c3QgcHJvdmlkZSBvbmUgd2l0aCB0aGUgLXAgb3IgLS1wcmV2aW91cyBvcHRpb24uIEV4aXRpbmcuLi5cIixcbiAgICApXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxuXG4gIGlmICghZnMuZXhpc3RzU3luYyhvcHRpb25zLm91dHB1dCkpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJUaGUgb3V0cHV0IGRpciBkb2VzIG5vdCBleGlzdHMuIFlvdSBtdXN0IHByb3ZpZGUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiBEZWZhdWx0IGRpcmVjdG9yeSBpcyAuL2RpZmZfb3V0cHV0cy9cIixcbiAgICApXG4gICAgcHJvY2Vzcy5leGl0KClcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczoge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXI6IHN0cmluZyA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0LmZpbGVuYW1lKVxuICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYERpZmZpbmcgJHtvcmlnaW5hbEpzb25EaXJ9IGZvbGRlci4uLmApXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihvcmlnaW5hbEpzb25EaXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3RmlsZVBhdGggPVxuICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyICsgXCIvXCIgKyBhbWVuZGVtZW50U3BsaXRQYXRoLmpvaW4oXCIvXCIpXG4gICAgICAgICAgY29uc3QgbmV3RmlsZSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMobmV3RmlsZVBhdGgpLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3Qgb2xkRmlsZVBhdGggPVxuICAgICAgICAgICAgb3B0aW9ucy5wcmV2aW91cyArXG4gICAgICAgICAgICBkYXRhc2V0LmZpbGVuYW1lICtcbiAgICAgICAgICAgIFwiL1wiICtcbiAgICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGguam9pbihcIi9cIilcbiAgICAgICAgICBjb25zdCBvbGRGaWxlRXhpc3RzID0gZnMuZXhpc3RzU3luYyhvbGRGaWxlUGF0aClcbiAgICAgICAgICBpZiAoIW9sZEZpbGVFeGlzdHMpIHtcbiAgICAgICAgICAgIC8vIElmIGZpbGUgZm91bmQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHByZXZpb3VzIGR1bXBcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJGaWxlIGRpZCBub3QgZXhpc3RzIHByZXZpb3VzbHkuIEd1ZXNzaW5nIGl0J3MgYSBuZXcgYW1lbmRtZW50LiBBZGRpbmcgdG8gdGhlIGRpZmYgbGlzdCBmb3IgbmV3IG9iamVjdHNcIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMobmV3RmlsZSwgYW1lbmRlbWVudFNwbGl0UGF0aClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmlsZSBhbHJlYWR5IGV4aXN0ZWQgaW4gcHJldmlvdXMgZHVtcFxuICAgICAgICAgIGxldCBvbGRGaWxlOiBKU09OID0gSlNPTi5wYXJzZShcInt9XCIpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdhdGhlciBkYXRhIG9mIHRoZSBmaWxlIGFuZCByZXRyYW5zY3JpcHQgYXMgYSBKc29uIG9iamVjdFxuICAgICAgICAgICAgb2xkRmlsZSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG9sZEZpbGVQYXRoKS50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHByb2Nlc3MgdG8gdGhlIG5leHQgaXRlcmF0aW9uIGluIGNhc2Ugb2YgY29ycnVwdCBKU09OIGRhdGFcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGRpZmYgYmVldHdlZW4gdGhlIHR3byBKU09OIG9iamVjdHMgKG9sZCAmIG5ldyBkdW1wKVxuICAgICAgICAgIGNvbnN0IGRpZmY6IGFueSA9IGRldGFpbGVkRGlmZihvbGRGaWxlLCBuZXdGaWxlKVxuXG4gICAgICAgICAgLy8gSWYgbm8gY2hhbmdlcyBiZWV0d2VlbiB0aGUgdHdvIGR1bXBzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5hZGRlZCkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkaWZmLnVwZGF0ZWQpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZi5kZWxldGVkKS5sZW5ndGggPT09IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFNraXAgdG8gbmV4dCBpdGVyYXRpb24gYXMgdGhlcmUgaXMgbm8gbmVlZCB0byBnZW5lcmF0ZSBhIGZpbGVcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJDaGFuZ2VzIGZvdW5kICFcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZFRvUXVldWVGb3JEaWZmZWRBbWVuZG1lbnRzKGRpZmYsIGFtZW5kZW1lbnRTcGxpdFBhdGgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgb3V0cHV0KHMpXCIpXG4gICAgfVxuXG4gICAgZ2VuZXJhdGVEaWZmRmlsZXMoKVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhbCBwcm9jZXNzIGZvciBvdXRwdXQgb2YgZGlmZnMuXG4gKiBUaGUgc2NyaXB0IGhhbmRsZXMgdHdvIGRpZmZlcmVudCBtb2RlcyA6XG4gKiAtIG1lcmdlZCA6IFdpbGwgb3V0cHV0IGEgc2luZ2xlIGZpbGUgZm9yIG5ldyBhbWVuZGVtZW50cyBhbmQgYSBzaW5nbGUgZmlsZVxuICogICAgICAgICAgICBmb3IgdXBkYXRlZCBhbWVuZGVtZW50c1xuICogLSBzcGxpdHRlZCA6IFdpbGwgb3V0cHV0IGEgc2luZ2xlIGZpbGUgZm9yIGVhY2ggYW1lbmRtZW50cywgZWl0aGVyIGl0cyBuZXcgb3IgdXBkYXRlZC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRGlmZkZpbGVzKCkge1xuICAvLyBIYW5kbGVzIG1lcmdlZCBtb2RlXG4gIGlmIChvcHRpb25zLm1vZGUgPT09IFwibWVyZ2VkXCIpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgbWVyZ2VkIGZpbGVzXCIpXG4gICAgfVxuXG4gICAgaWYgKGRpZmZlZEFtZW5kbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdlbmVyYXRpbmcgZGlmZmVkIGFtZW5kbWVudHMgZmlsZXNcIilcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIG9wdGlvbnMub3V0cHV0ICsgXCJhbWVuZGVtZW50c19YVl9kaWZmZWQuanNvblwiLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShkaWZmZWRBbWVuZG1lbnRzKSxcbiAgICAgICAgeyBlbmNvZGluZzogXCJ1dGY4XCIsIGZsYWc6IFwid1wiIH0sXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBkaWZmIGluIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFtZW5kbWVudHNcIilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3QW1lbmRtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBuZXcgYW1lbmRtZW50cyBmaWxlXCIpXG4gICAgICB9XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBvcHRpb25zLm91dHB1dCArIFwiYW1lbmRlbWVudHNfWFZfbmV3Lmpzb25cIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV3QW1lbmRtZW50cyksXG4gICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gbmV3IGFtZW5kZW1lbnQuIFNraXBwaW5nIGZpbGUgZ2VuZXJhdGlvblwiKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLm1vZGUgPT09IFwic3BsaXR0ZWRcIikge1xuICAgIC8vIEhhbmRsZXMgc3BsaXR0ZWQgbW9kZVxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiR2VuZXJhdGluZyBzZXBhcmF0ZWQgZmlsZXNcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBjb3B5IGFjdGlvbiBvZiB0aGUgbmV3IGFuZCBkaWZmZWQgYW1lbmRtZW50c1xuICAgICAqL1xuXG4gICAgZGlmZmVkQW1lbmRtZW50cy5mb3JFYWNoKChkaWZmZWRBbWVuZG1lbnQ6IGFueSkgPT4ge1xuICAgICAgZ2VuZXJhdGVTaW5nbGVEaWZmZWRBbWVuZG1lbnQoZGlmZmVkQW1lbmRtZW50KVxuICAgIH0pXG5cbiAgICBuZXdBbWVuZG1lbnRzLmZvckVhY2goKG5ld0FtZW5kbWVudDogYW55KSA9PiB7XG4gICAgICBnZW5lcmF0ZVNpbmdsZU5ld0FtZW5kbWVudChuZXdBbWVuZG1lbnQpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5rbm93biBvdXRwdXQgbW9kZS4gQWJvcnRpbmcuLi5cIilcbiAgICBwcm9jZXNzLmV4aXQoKVxuICB9XG59XG5cbi8vIFB1c2hlcyBhbiBhbWVuZG1lbnQgdG8gdGhlIHF1ZXVlIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgdG8gY29weSBuZXcgYW1lbmRtZW50cyBmaWxlc1xuZnVuY3Rpb24gYWRkVG9RdWV1ZUZvck5ld0FtZW5kbWVudHMoZmlsZTogYW55LCBwYXRoOiBhbnkpOiB2b2lkIHtcbiAgY29uc3QgYW1lbmRtZW50OiBhbnkgPSB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBkYXRhOiBmaWxlLFxuICB9XG4gIG5ld0FtZW5kbWVudHMucHVzaChhbWVuZG1lbnQpXG59XG4vLyBQdXNoZXMgYW4gYW1lbmRtZW50IHRvIHRoZSBxdWV1ZSB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIHRvIGNvcHkgdXBkYXRlZCBhbWVuZG1lbnRzIGZpbGVzXG5mdW5jdGlvbiBhZGRUb1F1ZXVlRm9yRGlmZmVkQW1lbmRtZW50cyhkaWZmZWREYXRhOiBhbnksIHBhdGg6IGFueSk6IHZvaWQge1xuICBjb25zdCBhbWVuZG1lbnQ6IGFueSA9IHtcbiAgICBwYXRoOiBwYXRoLFxuICAgIGRhdGE6IGRpZmZlZERhdGEsXG4gIH1cbiAgZGlmZmVkQW1lbmRtZW50cy5wdXNoKGFtZW5kbWVudClcbn1cblxuLy8gZ2VuZXJhdGVzIGEgZmlsZSB3aXRoIGEgY29weSBvZiB0aGUgbmV3IGFtZW5kZW1lbnRcbmZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlTmV3QW1lbmRtZW50KG5ld0FtZW5kbWVudDoge1xuICBwYXRoOiBBcnJheTxzdHJpbmc+XG4gIGRhdGE6IGFueVxufSkge1xuICBuZXdBbWVuZG1lbnQucGF0aC5zaGlmdCgpXG5cbiAgY29uc3Qgc2hvcnREaXI6IEFycmF5PGFueT4gPSBbLi4ubmV3QW1lbmRtZW50LnBhdGhdXG4gIHNob3J0RGlyLnBvcCgpXG4gIGNvbnNvbGUubG9nKG9wdGlvbnMub3V0cHV0ICsgc2hvcnREaXIuam9pbihcIi9cIikpXG4gIGZzLm1rZGlyU3luYyhvcHRpb25zLm91dHB1dCArIHNob3J0RGlyLmpvaW4oXCIvXCIpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIG9wdGlvbnMub3V0cHV0ICsgbmV3QW1lbmRtZW50LnBhdGguam9pbihcIi9cIikucmVwbGFjZSgvKFxcLmpzb24pLywgXCIubmV3JDFcIiksXG4gICAgSlNPTi5zdHJpbmdpZnkobmV3QW1lbmRtZW50LmRhdGEpLFxuICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICApXG59XG5cbi8vIGdlbmVyYXRlcyBhIGZpbGUgd2l0aCBhIGNvcHkgb2YgdGhlIG1vZGlmaWVkIGRhdGEgb2YgdGhlIHByZXZpb3VzbHkgZXhpc3RpbmcgYW1lbmRtZW50O1xuZnVuY3Rpb24gZ2VuZXJhdGVTaW5nbGVEaWZmZWRBbWVuZG1lbnQoZGlmZmVkQW1lbmRtZW50OiB7XG4gIHBhdGg6IEFycmF5PHN0cmluZz5cbiAgZGF0YTogYW55XG59KSB7XG4gIGRpZmZlZEFtZW5kbWVudC5wYXRoLnNoaWZ0KClcblxuICBjb25zdCBzaG9ydERpcjogQXJyYXk8YW55PiA9IFsuLi5kaWZmZWRBbWVuZG1lbnQucGF0aF1cbiAgc2hvcnREaXIucG9wKClcbiAgZnMubWtkaXJTeW5jKG9wdGlvbnMub3V0cHV0ICsgc2hvcnREaXIuam9pbihcIi9cIiksIHtcbiAgICByZWN1cnNpdmU6IHRydWUsXG4gIH0pXG5cbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICBvcHRpb25zLm91dHB1dCArXG4gICAgICBkaWZmZWRBbWVuZG1lbnQucGF0aC5qb2luKFwiL1wiKS5yZXBsYWNlKC8oXFwuanNvbikvLCBcIi5kaWZmJDFcIiksXG4gICAgSlNPTi5zdHJpbmdpZnkoZGlmZmVkQW1lbmRtZW50LmRhdGEpLFxuICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcIndcIiB9LFxuICApXG59XG5cbmRpZmZBbWVuZGVtZW50cyhvcHRpb25zLmRhdGFEaXIpXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLGdCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxlQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxZQUFBLEdBQUFOLE9BQUE7QUFJNkIsU0FBQUQsdUJBQUFRLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxnQkFBQUEsQ0FBQTtBQUFBLFNBQUFFLG1CQUFBQyxDQUFBLFdBQUFDLGtCQUFBLENBQUFELENBQUEsS0FBQUUsZ0JBQUEsQ0FBQUYsQ0FBQSxLQUFBRywyQkFBQSxDQUFBSCxDQUFBLEtBQUFJLGtCQUFBO0FBQUEsU0FBQUEsbUJBQUEsY0FBQUMsU0FBQTtBQUFBLFNBQUFILGlCQUFBRixDQUFBLDhCQUFBTSxNQUFBLFlBQUFOLENBQUEsQ0FBQU0sTUFBQSxDQUFBQyxRQUFBLGFB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