@tricoteuses/assemblee 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +9 -27
  2. package/lib/bugs/acteur-00010/plugin.test.js +4 -4
  3. package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
  4. package/lib/bugs/acteur-00010.js +15 -16
  5. package/lib/bugs/acteur-00010.mjs +1 -1
  6. package/lib/bugs/agenda-00002/plugin.test.js +4 -4
  7. package/lib/bugs/agenda-00002/plugin.test.mjs +1 -1
  8. package/lib/bugs/agenda-00002.js +27 -28
  9. package/lib/bugs/agenda-00002.mjs +3 -3
  10. package/lib/bugs/agenda-00008/plugin.test.js +4 -4
  11. package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
  12. package/lib/bugs/agenda-00008.js +15 -16
  13. package/lib/bugs/agenda-00008.mjs +1 -1
  14. package/lib/bugs/agenda-00011/plugin.test.js +5 -5
  15. package/lib/bugs/agenda-00011/plugin.test.mjs +1 -1
  16. package/lib/bugs/agenda-00011.js +21 -22
  17. package/lib/bugs/agenda-00011.mjs +3 -3
  18. package/lib/bugs.js +17 -19
  19. package/lib/bugs.mjs +3 -3
  20. package/lib/cleaners/actes_legislatifs.js +5 -5
  21. package/lib/cleaners/acteurs.js +5 -5
  22. package/lib/cleaners/acteurs.mjs +1 -1
  23. package/lib/cleaners/amendements.js +5 -5
  24. package/lib/cleaners/documents.js +5 -5
  25. package/lib/cleaners/dossiers_legislatifs.js +5 -5
  26. package/lib/cleaners/organes.js +2 -2
  27. package/lib/cleaners/reunions.js +5 -5
  28. package/lib/cleaners/scrutins.js +23 -10
  29. package/lib/cleaners/scrutins.mjs +16 -3
  30. package/lib/cleaners/xml.js +8 -8
  31. package/lib/cleaners/xml.mjs +1 -1
  32. package/lib/datasets.d.ts +2 -2
  33. package/lib/datasets.js +53 -132
  34. package/lib/datasets.mjs +40 -118
  35. package/lib/dates.js +1 -2
  36. package/lib/dossiers_legislatifs.js +8 -8
  37. package/lib/file_systems.js +15 -14
  38. package/lib/file_systems.mjs +3 -3
  39. package/lib/git.d.ts +1 -0
  40. package/lib/git.js +21 -5
  41. package/lib/git.mjs +16 -1
  42. package/lib/inserters.js +3 -3
  43. package/lib/loaders.d.ts +14 -40
  44. package/lib/loaders.js +586 -1091
  45. package/lib/loaders.mjs +115 -357
  46. package/lib/parsers/documents.js +10 -10
  47. package/lib/parsers/documents.mjs +1 -1
  48. package/lib/parsers/recherche_amendements.js +17 -15
  49. package/lib/parsers/recherche_amendements.mjs +1 -1
  50. package/lib/raw_types/acteurs_et_organes.js +9 -9
  51. package/lib/raw_types/acteurs_et_organes.mjs +1 -1
  52. package/lib/raw_types/agendas.js +9 -9
  53. package/lib/raw_types/agendas.mjs +1 -1
  54. package/lib/raw_types/amendements.js +9 -9
  55. package/lib/raw_types/amendements.mjs +1 -1
  56. package/lib/raw_types/debats.d.ts +26 -78
  57. package/lib/raw_types/debats.js +49 -242
  58. package/lib/raw_types/debats.mjs +41 -234
  59. package/lib/raw_types/dossiers_legislatifs.js +9 -9
  60. package/lib/raw_types/dossiers_legislatifs.mjs +1 -1
  61. package/lib/raw_types/questions.js +9 -9
  62. package/lib/raw_types/questions.mjs +1 -1
  63. package/lib/raw_types/scrutins.d.ts +21 -9
  64. package/lib/raw_types/scrutins.js +46 -20
  65. package/lib/raw_types/scrutins.mjs +37 -11
  66. package/lib/scripts/bugs_helper.js +17 -18
  67. package/lib/scripts/bugs_helper.mjs +3 -3
  68. package/lib/scripts/clean_reorganized_data.js +183 -561
  69. package/lib/scripts/clean_reorganized_data.mjs +111 -410
  70. package/lib/scripts/diff_amendements.js +11 -24
  71. package/lib/scripts/diff_amendements.mjs +3 -17
  72. package/lib/scripts/document_dossiers_legislatifs.js +24 -27
  73. package/lib/scripts/document_dossiers_legislatifs.mjs +3 -3
  74. package/lib/scripts/get_today_reunions.js +5 -8
  75. package/lib/scripts/get_today_reunions.mjs +3 -7
  76. package/lib/scripts/merge_scrutins.js +11 -24
  77. package/lib/scripts/merge_scrutins.mjs +3 -17
  78. package/lib/scripts/parse_textes_lois.js +8 -38
  79. package/lib/scripts/parse_textes_lois.mjs +3 -33
  80. package/lib/scripts/raw_types_from_amendements.js +14 -27
  81. package/lib/scripts/raw_types_from_amendements.mjs +3 -17
  82. package/lib/scripts/reorganize_data.js +204 -456
  83. package/lib/scripts/reorganize_data.mjs +68 -260
  84. package/lib/scripts/retrieve_deputes_photos.d.ts +3 -1
  85. package/lib/scripts/retrieve_deputes_photos.js +146 -172
  86. package/lib/scripts/retrieve_deputes_photos.mjs +74 -98
  87. package/lib/scripts/retrieve_documents.js +207 -156
  88. package/lib/scripts/retrieve_documents.mjs +116 -128
  89. package/lib/scripts/retrieve_open_data.js +272 -249
  90. package/lib/scripts/retrieve_open_data.mjs +109 -123
  91. package/lib/scripts/retrieve_pending_amendments.js +16 -67
  92. package/lib/scripts/retrieve_pending_amendments.mjs +4 -55
  93. package/lib/scripts/retrieve_senateurs_photos.js +20 -77
  94. package/lib/scripts/retrieve_senateurs_photos.mjs +5 -61
  95. package/lib/scripts/retrieve_textes_lois.js +18 -46
  96. package/lib/scripts/retrieve_textes_lois.mjs +3 -33
  97. package/lib/scripts/shared/cli_helpers.d.ts +66 -0
  98. package/lib/scripts/shared/cli_helpers.js +90 -0
  99. package/lib/scripts/shared/cli_helpers.mjs +72 -0
  100. package/lib/scripts/test_iter_load.d.ts +1 -0
  101. package/lib/scripts/test_iter_load.js +154 -0
  102. package/lib/scripts/test_iter_load.mjs +71 -0
  103. package/lib/scripts/test_load.js +4 -15
  104. package/lib/scripts/test_load.mjs +3 -14
  105. package/lib/scripts/test_load_big_files.js +4 -15
  106. package/lib/scripts/test_load_big_files.mjs +3 -14
  107. package/lib/scripts/validate_json.js +15 -16
  108. package/lib/scripts/validate_json.mjs +3 -3
  109. package/lib/types/acteurs_et_organes.js +9 -9
  110. package/lib/types/acteurs_et_organes.mjs +1 -1
  111. package/lib/types/agendas.js +9 -9
  112. package/lib/types/agendas.mjs +1 -1
  113. package/lib/types/amendements.js +9 -9
  114. package/lib/types/amendements.mjs +1 -1
  115. package/lib/types/debats.d.ts +27 -79
  116. package/lib/types/debats.js +48 -241
  117. package/lib/types/debats.mjs +40 -233
  118. package/lib/types/dossiers_legislatifs.js +9 -9
  119. package/lib/types/dossiers_legislatifs.mjs +1 -1
  120. package/lib/types/legislatures.d.ts +4 -4
  121. package/lib/types/legislatures.js +5 -5
  122. package/lib/types/legislatures.mjs +5 -5
  123. package/lib/types/questions.js +9 -9
  124. package/lib/types/questions.mjs +1 -1
  125. package/lib/types/scrutins.d.ts +13 -4
  126. package/lib/types/scrutins.js +29 -15
  127. package/lib/types/scrutins.mjs +20 -6
  128. package/lib/urls.js +2 -2
  129. package/lib/urls.mjs +1 -1
  130. package/package.json +9 -7
@@ -1,156 +1,142 @@
1
- import assert from "assert";
2
1
  import commandLineArgs from "command-line-args";
3
2
  import fs from "fs-extra";
4
3
  import path from "path";
5
4
  import stream from "stream";
6
5
  import StreamZip from "node-stream-zip";
7
6
  import util from "util";
8
- import { datasets, EnabledDatasets } from "../datasets.mjs";
7
+ import { datasets, EnabledDatasets, getEnabledDatasets } from "../datasets.mjs";
9
8
  import { walkDir } from "../file_systems.mjs";
10
9
  import { Legislature } from "../types/legislatures.mjs";
11
- let xml2js = require("xml2js");
12
- const optionsDefinitions = [{
13
- alias: "f",
14
- help: "fetch datasets instead of retrieving them from files",
15
- name: "fetch",
16
- type: Boolean
17
- }, {
18
- alias: "k",
19
- defaultValue: ["All"],
20
- help: "categories of datasets to retrieve",
21
- multiple: true,
22
- name: "categories",
23
- type: String
24
- }, {
25
- alias: "l",
26
- help: "legislatures of categories of datasets to retrieve; leave empty or use 0 for all",
27
- multiple: true,
28
- name: "legislature",
29
- type: Number
30
- }, {
31
- alias: "s",
32
- help: "don't log anything",
33
- name: "silent",
34
- type: Boolean
35
- }, {
36
- defaultOption: true,
37
- help: "directory containing Assemblée open data files",
38
- name: "dataDir",
39
- type: String
40
- }];
10
+ import { categoriesOption, dataDirDefaultOption, fetchOption, legislatureOption, silentOption } from "./shared/cli_helpers.mjs";
11
+ const {
12
+ XMLParser
13
+ } = require("fast-xml-parser");
14
+ const optionsDefinitions = [categoriesOption, legislatureOption, silentOption, dataDirDefaultOption, fetchOption];
41
15
  const options = commandLineArgs(optionsDefinitions);
42
16
  const pipeline = util.promisify(stream.pipeline);
43
- async function retrieveOpenData(dataDir) {
44
- options.categories.map(datasetName => assert.notStrictEqual(EnabledDatasets[datasetName], undefined, `Unknown name of dataset: ${datasetName}`));
45
- const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
46
- let chosenDatasets = [...(enabledDatasets & EnabledDatasets.ActeursEtOrganes ? datasets.acteursEtOrganes : []), ...(enabledDatasets & EnabledDatasets.Agendas ? datasets.agendas : []), ...(enabledDatasets & EnabledDatasets.Amendements ? datasets.amendements : []), ...(enabledDatasets & EnabledDatasets.DossiersLegislatifs ? datasets.dossiersLegislatifs : []), ...(enabledDatasets & EnabledDatasets.Scrutins ? datasets.scrutins : []), ...(enabledDatasets & EnabledDatasets.Questions ? datasets.questions : []), ...(enabledDatasets & EnabledDatasets.ComptesRendusSeances ? datasets.comptesRendusSeances : [])];
47
17
 
48
- // When a given legislature is 0, it is the same as giving no legislature:
49
- // It means "every legislatures".
50
- const legislatures = options.legislature?.some(legislature => legislature === 0) ? undefined : options.legislature;
51
- if (legislatures !== undefined) {
52
- const enabledLegislatures = legislatures.map(legislature => legislature.toString());
53
- chosenDatasets = chosenDatasets.filter(dataset => dataset.legislature === Legislature.All || enabledLegislatures.includes(dataset.legislature));
54
- }
55
- for (const dataset of chosenDatasets) {
56
- const zipFilePath = path.join(dataDir, `${dataset.filename}.zip`);
57
- if (options.fetch) {
58
- // Fetch & save ZIP file.
59
- if (!options.silent) {
60
- console.log(`Loading ${dataset.title}: ${dataset.filename}.zip`);
61
- }
62
- const response = await fetch(dataset.url);
63
- if (!response.ok) {
64
- console.error(response.status, response.statusText);
65
- console.error(await response.text());
66
- throw new Error(`Fetch failed: ${dataset.url}`);
67
- }
18
+ // Function to fetch zip files with retry mechanism
19
+ async function fetchZipFile(url, zipFilePath, retries = 3) {
20
+ for (let attempt = 0; attempt < retries; attempt++) {
21
+ const response = await fetch(url);
22
+ if (response.ok) {
68
23
  await pipeline(response.body, fs.createWriteStream(zipFilePath));
24
+ return;
25
+ } else if (attempt < retries - 1) {
26
+ console.warn(`Retrying fetch for ${url}: ${response.statusText}`);
27
+ } else {
28
+ console.error(`Failed to fetch ${url} after ${retries} attempts`);
29
+ throw new Error(`Fetch failed: ${url}`);
69
30
  }
70
- if (!options.silent) {
71
- console.log(`Unzipping ${dataset.title}: ${dataset.filename}.zip`);
72
- }
73
- const dataDirOrFilePath = path.join(dataDir, dataset.filename);
74
- fs.removeSync(dataDirOrFilePath);
31
+ }
32
+ }
33
+ async function extractZip(zipFilePath, outputDir) {
34
+ return new Promise((resolve, reject) => {
75
35
  const zip = new StreamZip({
76
36
  file: zipFilePath,
77
37
  storeEntries: true
78
38
  });
79
- await new Promise((resolve, reject) => {
80
- zip.on("ready", () => {
81
- // Patch following line, because of wrong TypeScript definition for zip.extract.
82
- // zip.extract(null, dataDir, (err: any, _count: number) => {
83
- zip.extract(null, dataDir, err => {
84
- zip.close();
85
- if (err) {
86
- reject(err);
87
- } else {
88
- resolve(null);
89
- }
90
- });
39
+ zip.on("ready", () => {
40
+ zip.extract(null, outputDir, err => {
41
+ zip.close();
42
+ if (err) {
43
+ reject(err);
44
+ } else {
45
+ resolve();
46
+ }
91
47
  });
92
48
  });
93
- if (dataset.repairZip !== undefined) {
94
- if (!options.silent) {
95
- console.log(`Repairing ${dataset.title}: ${dataset.filename}`);
49
+ });
50
+ }
51
+ function reindentJsonFiles(dataDirOrFilePath) {
52
+ if (fs.statSync(dataDirOrFilePath).isDirectory()) {
53
+ for (const dataFileSplitPath of walkDir(dataDirOrFilePath)) {
54
+ const dataFilePath = path.join(dataDirOrFilePath, ...dataFileSplitPath);
55
+ if (dataFilePath.endsWith(".json")) {
56
+ const data = JSON.parse(fs.readFileSync(dataFilePath, {
57
+ encoding: "utf-8"
58
+ }));
59
+ fs.writeFileSync(dataFilePath, JSON.stringify(data, null, 2));
96
60
  }
97
- dataset.repairZip(dataset, dataDir);
98
61
  }
62
+ } else {
63
+ const data = JSON.parse(fs.readFileSync(dataDirOrFilePath, {
64
+ encoding: "utf-8"
65
+ }));
66
+ fs.writeFileSync(dataDirOrFilePath, JSON.stringify(data, null, 2));
67
+ }
68
+ }
69
+ async function processDataset(dataset, dataDir, parser, options) {
70
+ const zipFilePath = path.join(dataDir, `${dataset.filename}.zip`);
71
+ const dataDirOrFilePath = path.join(dataDir, dataset.filename);
72
+ fs.removeSync(dataDirOrFilePath);
73
+ if (options.fetch) {
74
+ // Fetch & save ZIP file.
75
+ if (!options.silent) {
76
+ console.log(`Loading ${dataset.title}: ${dataset.filename}.zip`);
77
+ }
78
+ await fetchZipFile(dataset.url, zipFilePath);
79
+ }
80
+ if (!options.silent) {
81
+ console.log(`Unzipping ${dataset.title}: ${dataset.filename}.zip`);
82
+ }
83
+ await extractZip(zipFilePath, dataDir);
84
+ if (dataset.repairZip !== undefined) {
85
+ if (!options.silent) {
86
+ console.log(`Repairing ${dataset.title}: ${dataset.filename}`);
87
+ }
88
+ dataset.repairZip(dataset, dataDir);
89
+ }
99
90
 
100
- // Convert xml to JSON.
101
- if (dataset.filename.endsWith(".xml")) {
102
- for (const dataFileSplitPath of walkDir(dataDirOrFilePath)) {
103
- const dataFilePath = path.join(dataDirOrFilePath, ...dataFileSplitPath);
104
- if (dataFilePath.endsWith(".xml")) {
105
- function format(key, value) {
106
- if (key === "br" || key === "italique" || key === "exposant") {
107
- return undefined;
108
- }
109
- return value;
110
- }
111
- let parser = new xml2js.Parser({
112
- mergeAttrs: true,
113
- explicitArray: false
114
- });
115
- fs.readFile(dataFilePath, function (err, data) {
91
+ // Convert xml to JSON.
92
+ if (dataset.filename.endsWith(".xml")) {
93
+ for (const dataFileSplitPath of walkDir(dataDirOrFilePath)) {
94
+ const dataFilePath = path.join(dataDirOrFilePath, ...dataFileSplitPath);
95
+ if (dataFilePath.endsWith(".xml")) {
96
+ fs.readFile(dataFilePath, function (err, data) {
97
+ if (err) return console.error(err);
98
+ let result = parser.parse(data);
99
+ const newDataFilePath = dataFilePath.replace(/\.[^.]+$/, ".json");
100
+ fs.copy(dataFilePath, newDataFilePath, err => {
101
+ fs.writeFileSync(newDataFilePath, JSON.stringify(result, null, 2));
116
102
  if (err) return console.error(err);
117
- parser.parseString(data, function (err, result) {
118
- const newDataFilePath = dataFilePath.replace(/\.[^.]+$/, ".json");
119
- if (err) return console.error(err);
120
- fs.copy(dataFilePath, newDataFilePath, err => {
121
- fs.writeFileSync(newDataFilePath, JSON.stringify(result, format, 2));
122
- if (err) return console.error(err);
123
- });
124
- });
125
103
  });
126
- }
104
+ });
127
105
  }
128
106
  }
107
+ }
129
108
 
130
- // Reindent JSON file.
131
- if (!options.silent) {
132
- console.log(`Reidenting ${dataset.title}: ${dataset.filename}`);
133
- }
134
- if (fs.statSync(dataDirOrFilePath).isDirectory()) {
135
- for (const dataFileSplitPath of walkDir(dataDirOrFilePath)) {
136
- const dataFilePath = path.join(dataDirOrFilePath, ...dataFileSplitPath);
137
- if (dataFilePath.endsWith(".json")) {
138
- const data = JSON.parse(fs.readFileSync(dataFilePath, {
139
- encoding: "utf-8"
140
- }));
141
- fs.writeFileSync(dataFilePath, JSON.stringify(data, null, 2));
142
- }
143
- }
144
- } else {
145
- const data = JSON.parse(fs.readFileSync(dataDirOrFilePath, {
146
- encoding: "utf-8"
147
- }));
148
- fs.writeFileSync(dataDirOrFilePath, JSON.stringify(data, null, 2));
149
- }
109
+ // Reindent JSON file.
110
+ if (!options.silent) {
111
+ console.log(`Reidenting ${dataset.title}: ${dataset.filename}`);
112
+ }
113
+ reindentJsonFiles(dataDirOrFilePath);
114
+ }
115
+ async function retrieveOpenData(dataDir) {
116
+ const enabledDatasets = getEnabledDatasets(options.categories);
117
+ let chosenDatasets = [...(enabledDatasets & EnabledDatasets.ActeursEtOrganes ? datasets.acteursEtOrganes : []), ...(enabledDatasets & EnabledDatasets.Agendas ? datasets.agendas : []), ...(enabledDatasets & EnabledDatasets.Amendements ? datasets.amendements : []), ...(enabledDatasets & EnabledDatasets.DossiersLegislatifs ? datasets.dossiersLegislatifs : []), ...(enabledDatasets & EnabledDatasets.Scrutins ? datasets.scrutins : []), ...(enabledDatasets & EnabledDatasets.Questions ? datasets.questions : []), ...(enabledDatasets & EnabledDatasets.ComptesRendusSeances ? datasets.comptesRendusSeances : [])];
118
+ if (options.legislature !== 0 && options.legislature !== undefined) {
119
+ chosenDatasets = chosenDatasets.filter(dataset => dataset.legislature === Legislature.All || options.legislature === dataset.legislature);
120
+ }
121
+ const parser = new XMLParser({
122
+ ignoreDeclaration: true,
123
+ ignoreAttributes: false,
124
+ ignorePiTags: true,
125
+ attributeNamePrefix: "",
126
+ textNodeName: "_",
127
+ processEntities: false,
128
+ trimValues: true,
129
+ stopNodes: ["*.texte", "*.intitule"],
130
+ parseTagValue: false,
131
+ parseAttributeValue: false,
132
+ transformTagName: tagName => tagName === "Para" ? "para" : tagName
133
+ });
134
+ for (const dataset of chosenDatasets) {
135
+ await processDataset(dataset, dataDir, parser, options);
150
136
  }
151
137
  }
152
138
  retrieveOpenData(options.dataDir).catch(error => {
153
139
  console.log(error);
154
140
  process.exit(1);
155
141
  });
156
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJzdHJlYW0iLCJTdHJlYW1aaXAiLCJ1dGlsIiwiZGF0YXNldHMiLCJFbmFibGVkRGF0YXNldHMiLCJ3YWxrRGlyIiwiTGVnaXNsYXR1cmUiLCJ4bWwyanMiLCJyZXF1aXJlIiwib3B0aW9uc0RlZmluaXRpb25zIiwiYWxpYXMiLCJoZWxwIiwibmFtZSIsInR5cGUiLCJCb29sZWFuIiwiZGVmYXVsdFZhbHVlIiwibXVsdGlwbGUiLCJTdHJpbmciLCJOdW1iZXIiLCJkZWZhdWx0T3B0aW9uIiwib3B0aW9ucyIsInBpcGVsaW5lIiwicHJvbWlzaWZ5IiwicmV0cmlldmVPcGVuRGF0YSIsImRhdGFEaXIiLCJjYXRlZ29yaWVzIiwibWFwIiwiZGF0YXNldE5hbWUiLCJub3RTdHJpY3RFcXVhbCIsInVuZGVmaW5lZCIsImVuYWJsZWREYXRhc2V0cyIsInJlZHVjZSIsIk5vbmUiLCJjaG9zZW5EYXRhc2V0cyIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJzRXRPcmdhbmVzIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwiUXVlc3Rpb25zIiwicXVlc3Rpb25zIiwiQ29tcHRlc1JlbmR1c1NlYW5jZXMiLCJjb21wdGVzUmVuZHVzU2VhbmNlcyIsImxlZ2lzbGF0dXJlcyIsImxlZ2lzbGF0dXJlIiwic29tZSIsImVuYWJsZWRMZWdpc2xhdHVyZXMiLCJ0b1N0cmluZyIsImZpbHRlciIsImRhdGFzZXQiLCJBbGwiLCJpbmNsdWRlcyIsInppcEZpbGVQYXRoIiwiam9pbiIsImZpbGVuYW1lIiwiZmV0Y2giLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwidGl0bGUiLCJyZXNwb25zZSIsInVybCIsIm9rIiwiZXJyb3IiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidGV4dCIsIkVycm9yIiwiYm9keSIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZGF0YURpck9yRmlsZVBhdGgiLCJyZW1vdmVTeW5jIiwiemlwIiwiZmlsZSIsInN0b3JlRW50cmllcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJleHRyYWN0IiwiZXJyIiwiY2xvc2UiLCJyZXBhaXJaaXAiLCJlbmRzV2l0aCIsImRhdGFGaWxlU3BsaXRQYXRoIiwiZGF0YUZpbGVQYXRoIiwiZm9ybWF0Iiwia2V5IiwidmFsdWUiLCJwYXJzZXIiLCJQYXJzZXIiLCJtZXJnZUF0dHJzIiwiZXhwbGljaXRBcnJheSIsInJlYWRGaWxlIiwiZGF0YSIsInBhcnNlU3RyaW5nIiwicmVzdWx0IiwibmV3RGF0YUZpbGVQYXRoIiwicmVwbGFjZSIsImNvcHkiLCJ3cml0ZUZpbGVTeW5jIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXRTeW5jIiwiaXNEaXJlY3RvcnkiLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiY2F0Y2giLCJwcm9jZXNzIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX29wZW5fZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgc3RyZWFtIGZyb20gXCJzdHJlYW1cIlxuaW1wb3J0IFN0cmVhbVppcCBmcm9tIFwibm9kZS1zdHJlYW0temlwXCJcbmltcG9ydCB1dGlsIGZyb20gXCJ1dGlsXCJcblxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuLi9kYXRhc2V0c1wiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQgeyBMZWdpc2xhdHVyZSB9IGZyb20gXCIuLi90eXBlcy9sZWdpc2xhdHVyZXNcIlxuXG5sZXQgeG1sMmpzID0gcmVxdWlyZShcInhtbDJqc1wiKVxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIHtcbiAgICBhbGlhczogXCJmXCIsXG4gICAgaGVscDogXCJmZXRjaCBkYXRhc2V0cyBpbnN0ZWFkIG9mIHJldHJpZXZpbmcgdGhlbSBmcm9tIGZpbGVzXCIsXG4gICAgbmFtZTogXCJmZXRjaFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJrXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgaGVscDogXCJjYXRlZ29yaWVzIG9mIGRhdGFzZXRzIHRvIHJldHJpZXZlXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJjYXRlZ29yaWVzXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwibFwiLFxuICAgIGhlbHA6IFwibGVnaXNsYXR1cmVzIG9mIGNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmV0cmlldmU7IGxlYXZlIGVtcHR5IG9yIHVzZSAwIGZvciBhbGxcIixcbiAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICBuYW1lOiBcImxlZ2lzbGF0dXJlXCIsXG4gICAgdHlwZTogTnVtYmVyLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwic1wiLFxuICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgbmFtZTogXCJzaWxlbnRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbmNvbnN0IHBpcGVsaW5lID0gdXRpbC5wcm9taXNpZnkoc3RyZWFtLnBpcGVsaW5lKVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZU9wZW5EYXRhKGRhdGFEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBvcHRpb25zLmNhdGVnb3JpZXMubWFwKChkYXRhc2V0TmFtZTogc3RyaW5nKSA9PlxuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgVW5rbm93biBuYW1lIG9mIGRhdGFzZXQ6ICR7ZGF0YXNldE5hbWV9YCxcbiAgICApLFxuICApXG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IG9wdGlvbnMuY2F0ZWdvcmllcy5yZWR1Y2UoXG4gICAgKGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLCBkYXRhc2V0TmFtZTogc3RyaW5nKTogRW5hYmxlZERhdGFzZXRzID0+XG4gICAgICBlbmFibGVkRGF0YXNldHMgfFxuICAgICAgKEVuYWJsZWREYXRhc2V0cyBhcyBhbnkgYXMgeyBbbmFtZTogc3RyaW5nXTogRW5hYmxlZERhdGFzZXRzIH0pW1xuICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgXSxcbiAgICBFbmFibGVkRGF0YXNldHMuTm9uZSxcbiAgKVxuXG4gIGxldCBjaG9zZW5EYXRhc2V0cyA9IFtcbiAgICAuLi4oZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXNcbiAgICAgID8gZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lc1xuICAgICAgOiBbXSksXG4gICAgLi4uKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BZ2VuZGFzID8gZGF0YXNldHMuYWdlbmRhcyA6IFtdKSxcbiAgICAuLi4oZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzXG4gICAgICA/IGRhdGFzZXRzLmFtZW5kZW1lbnRzXG4gICAgICA6IFtdKSxcbiAgICAuLi4oZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkRvc3NpZXJzTGVnaXNsYXRpZnNcbiAgICAgID8gZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmc1xuICAgICAgOiBbXSksXG4gICAgLi4uKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucyA/IGRhdGFzZXRzLnNjcnV0aW5zIDogW10pLFxuICAgIC4uLihlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUXVlc3Rpb25zID8gZGF0YXNldHMucXVlc3Rpb25zIDogW10pLFxuICAgIC4uLihlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQ29tcHRlc1JlbmR1c1NlYW5jZXNcbiAgICAgID8gZGF0YXNldHMuY29tcHRlc1JlbmR1c1NlYW5jZXNcbiAgICAgIDogW10pLFxuICBdXG5cbiAgLy8gV2hlbiBhIGdpdmVuIGxlZ2lzbGF0dXJlIGlzIDAsIGl0IGlzIHRoZSBzYW1lIGFzIGdpdmluZyBubyBsZWdpc2xhdHVyZTpcbiAgLy8gSXQgbWVhbnMgXCJldmVyeSBsZWdpc2xhdHVyZXNcIi5cbiAgY29uc3QgbGVnaXNsYXR1cmVzID0gb3B0aW9ucy5sZWdpc2xhdHVyZT8uc29tZShcbiAgICAobGVnaXNsYXR1cmU6IG51bWJlcikgPT4gbGVnaXNsYXR1cmUgPT09IDAsXG4gIClcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogb3B0aW9ucy5sZWdpc2xhdHVyZVxuICBpZiAobGVnaXNsYXR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbmFibGVkTGVnaXNsYXR1cmVzID0gbGVnaXNsYXR1cmVzLm1hcCgobGVnaXNsYXR1cmU6IG51bWJlcikgPT5cbiAgICAgIGxlZ2lzbGF0dXJlLnRvU3RyaW5nKCksXG4gICAgKVxuICAgIGNob3NlbkRhdGFzZXRzID0gY2hvc2VuRGF0YXNldHMuZmlsdGVyKFxuICAgICAgKGRhdGFzZXQpID0+XG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCB8fFxuICAgICAgICBlbmFibGVkTGVnaXNsYXR1cmVzLmluY2x1ZGVzKGRhdGFzZXQubGVnaXNsYXR1cmUpLFxuICAgIClcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cykge1xuICAgIGNvbnN0IHppcEZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFEaXIsIGAke2RhdGFzZXQuZmlsZW5hbWV9LnppcGApXG4gICAgaWYgKG9wdGlvbnMuZmV0Y2gpIHtcbiAgICAgIC8vIEZldGNoICYgc2F2ZSBaSVAgZmlsZS5cbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgJHtkYXRhc2V0LnRpdGxlfTogJHtkYXRhc2V0LmZpbGVuYW1lfS56aXBgKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChkYXRhc2V0LnVybClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYXdhaXQgcmVzcG9uc2UudGV4dCgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZldGNoIGZhaWxlZDogJHtkYXRhc2V0LnVybH1gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGlwZWxpbmUoXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBOb2RlSlMuUmVhZGFibGVTdHJlYW0sXG4gICAgICAgIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKSxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgY29uc29sZS5sb2coYFVuemlwcGluZyAke2RhdGFzZXQudGl0bGV9OiAke2RhdGFzZXQuZmlsZW5hbWV9LnppcGApXG4gICAgfVxuICAgIGNvbnN0IGRhdGFEaXJPckZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXQuZmlsZW5hbWUpXG4gICAgZnMucmVtb3ZlU3luYyhkYXRhRGlyT3JGaWxlUGF0aClcbiAgICBjb25zdCB6aXAgPSBuZXcgU3RyZWFtWmlwKHtcbiAgICAgIGZpbGU6IHppcEZpbGVQYXRoLFxuICAgICAgc3RvcmVFbnRyaWVzOiB0cnVlLFxuICAgIH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgemlwLm9uKFwicmVhZHlcIiwgKCkgPT4ge1xuICAgICAgICAvLyBQYXRjaCBmb2xsb3dpbmcgbGluZSwgYmVjYXVzZSBvZiB3cm9uZyBUeXBlU2NyaXB0IGRlZmluaXRpb24gZm9yIHppcC5leHRyYWN0LlxuICAgICAgICAvLyB6aXAuZXh0cmFjdChudWxsLCBkYXRhRGlyLCAoZXJyOiBhbnksIF9jb3VudDogbnVtYmVyKSA9PiB7XG4gICAgICAgIHppcC5leHRyYWN0KG51bGwhLCBkYXRhRGlyLCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB6aXAuY2xvc2UoKVxuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpZiAoZGF0YXNldC5yZXBhaXJaaXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVwYWlyaW5nICR7ZGF0YXNldC50aXRsZX06ICR7ZGF0YXNldC5maWxlbmFtZX1gKVxuICAgICAgfVxuICAgICAgZGF0YXNldC5yZXBhaXJaaXAoZGF0YXNldCwgZGF0YURpcilcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHhtbCB0byBKU09OLlxuICAgIGlmIChkYXRhc2V0LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnhtbFwiKSkge1xuICAgICAgZm9yIChjb25zdCBkYXRhRmlsZVNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFEaXJPckZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBkYXRhRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YURpck9yRmlsZVBhdGgsIC4uLmRhdGFGaWxlU3BsaXRQYXRoKVxuICAgICAgICBpZiAoZGF0YUZpbGVQYXRoLmVuZHNXaXRoKFwiLnhtbFwiKSkge1xuICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdChrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCJiclwiIHx8IGtleSA9PT0gXCJpdGFsaXF1ZVwiIHx8IGtleSA9PT0gXCJleHBvc2FudFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG4gICAgICAgICAgICBtZXJnZUF0dHJzOiB0cnVlLFxuICAgICAgICAgICAgZXhwbGljaXRBcnJheTogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBmcy5yZWFkRmlsZShkYXRhRmlsZVBhdGgsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIHBhcnNlci5wYXJzZVN0cmluZyhkYXRhLCBmdW5jdGlvbiAoZXJyOiBhbnksIHJlc3VsdDogYW55KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGFGaWxlUGF0aCA9IGRhdGFGaWxlUGF0aC5yZXBsYWNlKC9cXC5bXi5dKyQvLCBcIi5qc29uXCIpXG4gICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgICAgZnMuY29weShkYXRhRmlsZVBhdGgsIG5ld0RhdGFGaWxlUGF0aCwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgICBuZXdEYXRhRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZXN1bHQsIGZvcm1hdCwgMiksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlaW5kZW50IEpTT04gZmlsZS5cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhgUmVpZGVudGluZyAke2RhdGFzZXQudGl0bGV9OiAke2RhdGFzZXQuZmlsZW5hbWV9YClcbiAgICB9XG4gICAgaWYgKGZzLnN0YXRTeW5jKGRhdGFEaXJPckZpbGVQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGFGaWxlU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YURpck9yRmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGRhdGFGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhRGlyT3JGaWxlUGF0aCwgLi4uZGF0YUZpbGVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChkYXRhRmlsZVBhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKGRhdGFGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRhdGFGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoXG4gICAgICAgIGZzLnJlYWRGaWxlU3luYyhkYXRhRGlyT3JGaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pLFxuICAgICAgKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhkYXRhRGlyT3JGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpXG4gICAgfVxuICB9XG59XG5cbnJldHJpZXZlT3BlbkRhdGEob3B0aW9ucy5kYXRhRGlyKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgY29uc29sZS5sb2coZXJyb3IpXG4gIHByb2Nlc3MuZXhpdCgxKVxufSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUN2QixPQUFPQyxNQUFNLE1BQU0sUUFBUTtBQUMzQixPQUFPQyxTQUFTLE1BQU0saUJBQWlCO0FBQ3ZDLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQUEsU0FFZEMsUUFBUSxFQUFFQyxlQUFlO0FBQUEsU0FDekJDLE9BQU87QUFBQSxTQUNQQyxXQUFXO0FBRXBCLElBQUlDLE1BQU0sR0FBR0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUU5QixNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QjtFQUNFQyxLQUFLLEVBQUUsR0FBRztFQUNWQyxJQUFJLEVBQUUsc0RBQXNEO0VBQzVEQyxJQUFJLEVBQUUsT0FBTztF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
142
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kTGluZUFyZ3MiLCJmcyIsInBhdGgiLCJzdHJlYW0iLCJTdHJlYW1aaXAiLCJ1dGlsIiwiZGF0YXNldHMiLCJFbmFibGVkRGF0YXNldHMiLCJnZXRFbmFibGVkRGF0YXNldHMiLCJ3YWxrRGlyIiwiTGVnaXNsYXR1cmUiLCJjYXRlZ29yaWVzT3B0aW9uIiwiZGF0YURpckRlZmF1bHRPcHRpb24iLCJmZXRjaE9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwic2lsZW50T3B0aW9uIiwiWE1MUGFyc2VyIiwicmVxdWlyZSIsIm9wdGlvbnNEZWZpbml0aW9ucyIsIm9wdGlvbnMiLCJwaXBlbGluZSIsInByb21pc2lmeSIsImZldGNoWmlwRmlsZSIsInVybCIsInppcEZpbGVQYXRoIiwicmV0cmllcyIsImF0dGVtcHQiLCJyZXNwb25zZSIsImZldGNoIiwib2siLCJib2R5IiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJjb25zb2xlIiwid2FybiIsInN0YXR1c1RleHQiLCJlcnJvciIsIkVycm9yIiwiZXh0cmFjdFppcCIsIm91dHB1dERpciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiemlwIiwiZmlsZSIsInN0b3JlRW50cmllcyIsIm9uIiwiZXh0cmFjdCIsImVyciIsImNsb3NlIiwicmVpbmRlbnRKc29uRmlsZXMiLCJkYXRhRGlyT3JGaWxlUGF0aCIsInN0YXRTeW5jIiwiaXNEaXJlY3RvcnkiLCJkYXRhRmlsZVNwbGl0UGF0aCIsImRhdGFGaWxlUGF0aCIsImpvaW4iLCJlbmRzV2l0aCIsImRhdGEiLCJKU09OIiwicGFyc2UiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsIndyaXRlRmlsZVN5bmMiLCJzdHJpbmdpZnkiLCJwcm9jZXNzRGF0YXNldCIsImRhdGFzZXQiLCJkYXRhRGlyIiwicGFyc2VyIiwiZmlsZW5hbWUiLCJyZW1vdmVTeW5jIiwic2lsZW50IiwibG9nIiwidGl0bGUiLCJyZXBhaXJaaXAiLCJ1bmRlZmluZWQiLCJyZWFkRmlsZSIsInJlc3VsdCIsIm5ld0RhdGFGaWxlUGF0aCIsInJlcGxhY2UiLCJjb3B5IiwicmV0cmlldmVPcGVuRGF0YSIsImVuYWJsZWREYXRhc2V0cyIsImNhdGVnb3JpZXMiLCJjaG9zZW5EYXRhc2V0cyIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJzRXRPcmdhbmVzIiwiQWdlbmRhcyIsImFnZW5kYXMiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRzIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJTY3J1dGlucyIsInNjcnV0aW5zIiwiUXVlc3Rpb25zIiwicXVlc3Rpb25zIiwiQ29tcHRlc1JlbmR1c1NlYW5jZXMiLCJjb21wdGVzUmVuZHVzU2VhbmNlcyIsImxlZ2lzbGF0dXJlIiwiZmlsdGVyIiwiQWxsIiwiaWdub3JlRGVjbGFyYXRpb24iLCJpZ25vcmVBdHRyaWJ1dGVzIiwiaWdub3JlUGlUYWdzIiwiYXR0cmlidXRlTmFtZVByZWZpeCIsInRleHROb2RlTmFtZSIsInByb2Nlc3NFbnRpdGllcyIsInRyaW1WYWx1ZXMiLCJzdG9wTm9kZXMiLCJwYXJzZVRhZ1ZhbHVlIiwicGFyc2VBdHRyaWJ1dGVWYWx1ZSIsInRyYW5zZm9ybVRhZ05hbWUiLCJ0YWdOYW1lIiwiY2F0Y2giLCJwcm9jZXNzIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX29wZW5fZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBzdHJlYW0gZnJvbSBcInN0cmVhbVwiXG5pbXBvcnQgU3RyZWFtWmlwIGZyb20gXCJub2RlLXN0cmVhbS16aXBcIlxuaW1wb3J0IHV0aWwgZnJvbSBcInV0aWxcIlxuaW1wb3J0IHsgZGF0YXNldHMsIEVuYWJsZWREYXRhc2V0cywgZ2V0RW5hYmxlZERhdGFzZXRzIH0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IExlZ2lzbGF0dXJlIH0gZnJvbSBcIi4uL3R5cGVzL2xlZ2lzbGF0dXJlc1wiXG5pbXBvcnQge1xuICBjYXRlZ29yaWVzT3B0aW9uLFxuICBkYXRhRGlyRGVmYXVsdE9wdGlvbixcbiAgZmV0Y2hPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5jb25zdCB7IFhNTFBhcnNlciB9ID0gcmVxdWlyZShcImZhc3QteG1sLXBhcnNlclwiKVxuXG5jb25zdCBvcHRpb25zRGVmaW5pdGlvbnMgPSBbXG4gIGNhdGVnb3JpZXNPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBmZXRjaE9wdGlvbixcbl1cbmNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zKVxuY29uc3QgcGlwZWxpbmUgPSB1dGlsLnByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpXG5cbi8vIEZ1bmN0aW9uIHRvIGZldGNoIHppcCBmaWxlcyB3aXRoIHJldHJ5IG1lY2hhbmlzbVxuYXN5bmMgZnVuY3Rpb24gZmV0Y2haaXBGaWxlKFxuICB1cmw6IHN0cmluZyxcbiAgemlwRmlsZVBhdGg6IHN0cmluZyxcbiAgcmV0cmllcyA9IDMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCByZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybClcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIGF3YWl0IHBpcGVsaW5lKFxuICAgICAgICByZXNwb25zZS5ib2R5IGFzIHVua25vd24gYXMgTm9kZUpTLlJlYWRhYmxlU3RyZWFtLFxuICAgICAgICBmcy5jcmVhdGVXcml0ZVN0cmVhbSh6aXBGaWxlUGF0aCksXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKGF0dGVtcHQgPCByZXRyaWVzIC0gMSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXRyeWluZyBmZXRjaCBmb3IgJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfSBhZnRlciAke3JldHJpZXN9IGF0dGVtcHRzYClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmV0Y2ggZmFpbGVkOiAke3VybH1gKVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0WmlwKFxuICB6aXBGaWxlUGF0aDogc3RyaW5nLFxuICBvdXRwdXREaXI6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHppcCA9IG5ldyBTdHJlYW1aaXAoe1xuICAgICAgZmlsZTogemlwRmlsZVBhdGgsXG4gICAgICBzdG9yZUVudHJpZXM6IHRydWUsXG4gICAgfSlcblxuICAgIHppcC5vbihcInJlYWR5XCIsICgpID0+IHtcbiAgICAgIHppcC5leHRyYWN0KG51bGwhLCBvdXRwdXREaXIsIChlcnIpID0+IHtcbiAgICAgICAgemlwLmNsb3NlKClcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVpbmRlbnRKc29uRmlsZXMoZGF0YURpck9yRmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZnMuc3RhdFN5bmMoZGF0YURpck9yRmlsZVBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFGaWxlU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YURpck9yRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBkYXRhRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YURpck9yRmlsZVBhdGgsIC4uLmRhdGFGaWxlU3BsaXRQYXRoKVxuICAgICAgaWYgKGRhdGFGaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhkYXRhRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KSxcbiAgICAgICAgKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGRhdGFGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKGRhdGFEaXJPckZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSksXG4gICAgKVxuICAgIGZzLndyaXRlRmlsZVN5bmMoZGF0YURpck9yRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NEYXRhc2V0KFxuICBkYXRhc2V0OiBhbnksXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgcGFyc2VyOiBhbnksXG4gIG9wdGlvbnM6IGFueSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB6aXBGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhRGlyLCBgJHtkYXRhc2V0LmZpbGVuYW1lfS56aXBgKVxuICBjb25zdCBkYXRhRGlyT3JGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0LmZpbGVuYW1lKVxuICBmcy5yZW1vdmVTeW5jKGRhdGFEaXJPckZpbGVQYXRoKVxuXG4gIGlmIChvcHRpb25zLmZldGNoKSB7XG4gICAgLy8gRmV0Y2ggJiBzYXZlIFpJUCBmaWxlLlxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nICR7ZGF0YXNldC50aXRsZX06ICR7ZGF0YXNldC5maWxlbmFtZX0uemlwYClcbiAgICB9XG4gICAgYXdhaXQgZmV0Y2haaXBGaWxlKGRhdGFzZXQudXJsLCB6aXBGaWxlUGF0aClcbiAgfVxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYFVuemlwcGluZyAke2RhdGFzZXQudGl0bGV9OiAke2RhdGFzZXQuZmlsZW5hbWV9LnppcGApXG4gIH1cbiAgYXdhaXQgZXh0cmFjdFppcCh6aXBGaWxlUGF0aCwgZGF0YURpcilcblxuICBpZiAoZGF0YXNldC5yZXBhaXJaaXAgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBSZXBhaXJpbmcgJHtkYXRhc2V0LnRpdGxlfTogJHtkYXRhc2V0LmZpbGVuYW1lfWApXG4gICAgfVxuICAgIGRhdGFzZXQucmVwYWlyWmlwKGRhdGFzZXQsIGRhdGFEaXIpXG4gIH1cblxuICAvLyBDb252ZXJ0IHhtbCB0byBKU09OLlxuICBpZiAoZGF0YXNldC5maWxlbmFtZS5lbmRzV2l0aChcIi54bWxcIikpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFGaWxlU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YURpck9yRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBkYXRhRmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YURpck9yRmlsZVBhdGgsIC4uLmRhdGFGaWxlU3BsaXRQYXRoKVxuICAgICAgaWYgKGRhdGFGaWxlUGF0aC5lbmRzV2l0aChcIi54bWxcIikpIHtcbiAgICAgICAgZnMucmVhZEZpbGUoZGF0YUZpbGVQYXRoLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgIGxldCByZXN1bHQgPSBwYXJzZXIucGFyc2UoZGF0YSlcbiAgICAgICAgICBjb25zdCBuZXdEYXRhRmlsZVBhdGggPSBkYXRhRmlsZVBhdGgucmVwbGFjZSgvXFwuW14uXSskLywgXCIuanNvblwiKVxuICAgICAgICAgIGZzLmNvcHkoZGF0YUZpbGVQYXRoLCBuZXdEYXRhRmlsZVBhdGgsIChlcnIpID0+IHtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMobmV3RGF0YUZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKVxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVpbmRlbnQgSlNPTiBmaWxlLlxuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5sb2coYFJlaWRlbnRpbmcgJHtkYXRhc2V0LnRpdGxlfTogJHtkYXRhc2V0LmZpbGVuYW1lfWApXG4gIH1cbiAgcmVpbmRlbnRKc29uRmlsZXMoZGF0YURpck9yRmlsZVBhdGgpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlT3BlbkRhdGEoZGF0YURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVuYWJsZWREYXRhc2V0cyA9IGdldEVuYWJsZWREYXRhc2V0cyhvcHRpb25zLmNhdGVnb3JpZXMpXG5cbiAgbGV0IGNob3NlbkRhdGFzZXRzID0gW1xuICAgIC4uLihlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lc1xuICAgICAgPyBkYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzXG4gICAgICA6IFtdKSxcbiAgICAuLi4oZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMgPyBkYXRhc2V0cy5hZ2VuZGFzIDogW10pLFxuICAgIC4uLihlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHNcbiAgICAgID8gZGF0YXNldHMuYW1lbmRlbWVudHNcbiAgICAgIDogW10pLFxuICAgIC4uLihlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmc1xuICAgICAgPyBkYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzXG4gICAgICA6IFtdKSxcbiAgICAuLi4oZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlNjcnV0aW5zID8gZGF0YXNldHMuc2NydXRpbnMgOiBbXSksXG4gICAgLi4uKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5RdWVzdGlvbnMgPyBkYXRhc2V0cy5xdWVzdGlvbnMgOiBbXSksXG4gICAgLi4uKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlc1xuICAgICAgPyBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlc1xuICAgICAgOiBbXSksXG4gIF1cblxuICBpZiAob3B0aW9ucy5sZWdpc2xhdHVyZSAhPT0gMCAmJiBvcHRpb25zLmxlZ2lzbGF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjaG9zZW5EYXRhc2V0cyA9IGNob3NlbkRhdGFzZXRzLmZpbHRlcihcbiAgICAgIChkYXRhc2V0KSA9PlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlID09PSBMZWdpc2xhdHVyZS5BbGwgfHxcbiAgICAgICAgb3B0aW9ucy5sZWdpc2xhdHVyZSA9PT0gZGF0YXNldC5sZWdpc2xhdHVyZSxcbiAgICApXG4gIH1cblxuICBjb25zdCBwYXJzZXIgPSBuZXcgWE1MUGFyc2VyKHtcbiAgICBpZ25vcmVEZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBpZ25vcmVBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICBpZ25vcmVQaVRhZ3M6IHRydWUsXG4gICAgYXR0cmlidXRlTmFtZVByZWZpeDogXCJcIixcbiAgICB0ZXh0Tm9kZU5hbWU6IFwiX1wiLFxuICAgIHByb2Nlc3NFbnRpdGllczogZmFsc2UsXG4gICAgdHJpbVZhbHVlczogdHJ1ZSxcbiAgICBzdG9wTm9kZXM6IFtcIioudGV4dGVcIiwgXCIqLmludGl0dWxlXCJdLFxuICAgIHBhcnNlVGFnVmFsdWU6IGZhbHNlLFxuICAgIHBhcnNlQXR0cmlidXRlVmFsdWU6IGZhbHNlLFxuICAgIHRyYW5zZm9ybVRhZ05hbWU6ICh0YWdOYW1lOiBzdHJpbmcpID0+XG4gICAgICB0YWdOYW1lID09PSBcIlBhcmFcIiA/IFwicGFyYVwiIDogdGFnTmFtZSxcbiAgfSlcblxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMpIHtcbiAgICBhd2FpdCBwcm9jZXNzRGF0YXNldChkYXRhc2V0LCBkYXRhRGlyLCBwYXJzZXIsIG9wdGlvbnMpXG4gIH1cbn1cblxucmV0cmlldmVPcGVuRGF0YShvcHRpb25zLmRhdGFEaXIpLmNhdGNoKChlcnJvcikgPT4ge1xuICBjb25zb2xlLmxvZyhlcnJvcilcbiAgcHJvY2Vzcy5leGl0KDEpXG59KVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxlQUFlLE1BQU0sbUJBQW1CO0FBQy9DLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQ3ZCLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLE9BQU9DLFNBQVMsTUFBTSxpQkFBaUI7QUFDdkMsT0FBT0MsSUFBSSxNQUFNLE1BQU07QUFBQSxTQUNkQyxRQUFRLEVBQUVDLGVBQWUsRUFBRUMsa0JBQWtCO0FBQUEsU0FDN0NDLE9BQU87QUFBQSxTQUNQQyxXQUFXO0FBQUEsU0FFbEJDLGdCQUFnQixFQUNoQkMsb0JBQW9CLEVBQ3BCQyxXQUFXLEVBQ1hDLGlCQUFpQixFQUNqQkMsWUFBWTtBQUVkLE1BQU07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