@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,5 +1,4 @@
1
1
  import assert from "assert";
2
- import { execSync } from "child_process";
3
2
  import commandLineArgs from "command-line-args";
4
3
  import { createHash } from "crypto";
5
4
  import { differenceInDays } from "date-fns";
@@ -9,78 +8,57 @@ import { walkDocumentAndDivisions } from "../dossiers_legislatifs.mjs";
9
8
  import * as git from "../git.mjs";
10
9
  import { iterLoadAssembleeDocuments, pathFromDocumentUid } from "../loaders.mjs";
11
10
  import { DocumentUrlFormat, iterDocumentOrDivisionUrls } from "../urls.mjs";
12
- const optionsDefinitions = [{
13
- alias: "c",
14
- help: "commit documents",
15
- name: "commit",
16
- type: Boolean
17
- }, {
11
+ import { commitOption, dataDirDefaultOption, legislatureOption, pullOption, remoteOption, silentOption, verboseOption } from "./shared/cli_helpers.mjs";
12
+ const optionsDefinitions = [commitOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, {
18
13
  alias: "f",
19
14
  help: "retrieve all documents, even already retrieved ones",
20
15
  name: "full",
21
16
  type: Boolean
22
- }, {
23
- alias: "l",
24
- defaultValue: "16",
25
- help: 'legislatures to retrieve, "*" for all',
26
- name: "legislature",
27
- type: String
28
17
  }, {
29
18
  alias: "n",
30
19
  help: "try to also retrieve documents that were previously not found",
31
20
  name: "not-found",
32
21
  type: Boolean
33
- }, {
34
- alias: "p",
35
- help: "pull repositories before proceeding",
36
- name: "pull",
37
- type: Boolean
38
- }, {
39
- alias: "r",
40
- help: "push commit to given remote",
41
- multiple: true,
42
- name: "remote",
43
- type: String
44
- }, {
45
- alias: "s",
46
- help: "don't log anything",
47
- name: "silent",
48
- type: Boolean
49
22
  }, {
50
23
  alias: "u",
51
24
  help: "UID of first Assemblée's document or division to retrieve",
52
25
  name: "uid",
53
26
  type: String
54
27
  }, {
55
- alias: "v",
56
- help: "verbose logs",
57
- name: "verbose",
58
- type: Boolean
28
+ alias: "F",
29
+ help: "format of documents to retrieve",
30
+ name: "format",
31
+ type: String
59
32
  }, {
60
- defaultOption: true,
61
- help: "directory containing Assemblée open data files",
62
- name: "dataDir",
33
+ alias: "T",
34
+ help: "type of documents to retrieve (for example: PION)",
35
+ multiple: true,
36
+ name: "document-type",
63
37
  type: String
64
38
  }];
65
39
  const options = commandLineArgs(optionsDefinitions);
66
40
  const today = new Date();
41
+ async function fetchWithRetry(url, retries = 3, backoff = 300) {
42
+ for (let attempt = 0; attempt < retries; attempt++) {
43
+ try {
44
+ return await fetch(url);
45
+ } catch (error) {
46
+ if (attempt === retries - 1) {
47
+ throw error;
48
+ }
49
+ console.warn(`Fetch attempt ${attempt + 1} for ${url} failed. Retrying in ${backoff}ms...`);
50
+ await new Promise(resolve => setTimeout(resolve, backoff));
51
+ backoff *= 2;
52
+ }
53
+ }
54
+ throw new Error(`Failed to fetch ${url} after ${retries} attempts`);
55
+ }
67
56
  async function retrieveDocuments() {
68
57
  assert(!options.commit || !options.uid, 'Options "commit" & "uid" are incompatible');
69
58
  const dataDir = options.dataDir;
70
59
  const documentsDir = path.join(dataDir, "Documents");
71
60
  if (options.pull) {
72
- execSync(`git reset --hard origin/master`, {
73
- cwd: documentsDir,
74
- env: process.env,
75
- encoding: "utf-8",
76
- stdio: ["ignore", "ignore", "pipe"]
77
- });
78
- execSync(`git pull --rebase`, {
79
- cwd: documentsDir,
80
- env: process.env,
81
- encoding: "utf-8",
82
- stdio: ["ignore", "ignore", "pipe"]
83
- });
61
+ git.resetAndPull(documentsDir);
84
62
  }
85
63
  fs.ensureDirSync(documentsDir);
86
64
  if (options.full && !options.uid) {
@@ -108,95 +86,105 @@ async function retrieveDocuments() {
108
86
  continue;
109
87
  }
110
88
  }
111
- const documentDir = pathFromDocumentUid(documentsDir, documentOrDivision.uid);
112
- fs.ensureDirSync(documentDir);
113
- const filenameBySha256 = {};
114
- const indexPath = path.join(documentDir, "index.json");
115
- const index = fs.pathExistsSync(indexPath) ? fs.readJsonSync(indexPath) : {};
116
- for (const {
117
- format,
118
- type,
119
- url
120
- } of iterDocumentOrDivisionUrls(documentOrDivision)) {
121
- let formatFilesInfos = index[format];
122
- if (formatFilesInfos === undefined) {
123
- formatFilesInfos = index[format] = [];
124
- }
125
- let fileInfos = formatFilesInfos.find(fileInfos => fileInfos.url === url);
126
- if (fileInfos === undefined) {
127
- fileInfos = {};
128
- formatFilesInfos.push(fileInfos);
129
- }
130
- fileInfos.url = url;
131
- const filename = `${type}.${format === DocumentUrlFormat.Pdf ? "pdf" : "html"}`;
132
- if (fileInfos.status === 200 && !options.full) {
133
- filenameBySha256[fileInfos.sha256] = filename;
134
- continue;
135
- }
136
- if (fileInfos.status === 404 && !options["not-found"] && differenceInDays(today, documentOrDivision.cycleDeVie.chrono.dateCreation ?? documentOrDivision.cycleDeVie.chrono.dateDepot) > 10) {
137
- continue;
138
- }
89
+ await processDocumentOrDivision(documentOrDivision, documentsDir, options);
90
+ }
91
+ }
92
+ if (options.commit) {
93
+ return git.commitAndPush(documentsDir, "Nouvelle moisson", options.remote);
94
+ }
95
+ return 0;
96
+ }
97
+ async function processDocumentOrDivision(documentOrDivision, documentsDir, options) {
98
+ const documentDir = pathFromDocumentUid(documentsDir, documentOrDivision.uid);
99
+ fs.ensureDirSync(documentDir);
100
+ const filenameBySha256 = {};
101
+ const indexPath = path.join(documentDir, "index.json");
102
+ const index = fs.pathExistsSync(indexPath) ? fs.readJsonSync(indexPath) : {};
103
+ for (const {
104
+ format,
105
+ type,
106
+ url
107
+ } of iterDocumentOrDivisionUrls(documentOrDivision)) {
108
+ const filename = `${type}.${format === DocumentUrlFormat.Pdf ? "pdf" : "html"}`;
109
+
110
+ // Filter by format if option is passed
111
+ if (options.format && options.format !== format) {
112
+ continue;
113
+ }
114
+
115
+ // Filter by document type if option is passed
116
+ const documentType = documentOrDivision.classification?.type?.code;
117
+ if (options["document-type"] !== undefined && !options["document-type"].includes(documentType)) {
118
+ continue;
119
+ }
120
+ let formatFilesInfos = index[format] ?? (index[format] = []);
121
+ let fileInfos = formatFilesInfos.find(file => file.url === url) ?? {};
122
+ if (!formatFilesInfos.includes(fileInfos)) {
123
+ formatFilesInfos.push(fileInfos);
124
+ }
125
+ fileInfos.url = url;
126
+ if (fileInfos.status === 200 && !options.full) {
127
+ filenameBySha256[fileInfos.sha256] = filename;
128
+ continue;
129
+ }
130
+ if (fileInfos.status === 404 && !options["not-found"] && differenceInDays(today, documentOrDivision.cycleDeVie.chrono.dateCreation ?? documentOrDivision.cycleDeVie.chrono.dateDepot) > 10) {
131
+ continue;
132
+ }
133
+ if (!options.silent) {
134
+ console.log(`Retrieving document or division ${documentOrDivision.uid} at ${url}…`);
135
+ }
136
+ const response = await fetchWithRetry(url);
137
+ const filePath = path.join(documentDir, filename);
138
+ if (response.ok) {
139
+ const arrayBuffer = await response.arrayBuffer();
140
+ const buffer = Buffer.from(arrayBuffer);
141
+ if (format === DocumentUrlFormat.Pdf && !buffer.subarray(0, 4).toString().startsWith("%PDF")) {
142
+ // Instead of a PDF, the received data may be an HTML page with a message like
143
+ // "Document non encore publié".
139
144
  if (!options.silent) {
140
- console.log(`Retrieving document or division ${documentOrDivision.uid} at ${url}…`);
145
+ console.warn(` PDF "${url}" not found.`);
141
146
  }
142
- const response = await fetch(url);
143
- const filePath = path.join(documentDir, filename);
144
- if (response.ok) {
145
- const arrayBuffer = await response.arrayBuffer();
146
- const buffer = Buffer.from(arrayBuffer);
147
- if (format === DocumentUrlFormat.Pdf && !buffer.subarray(0, 4).toString().startsWith("%PDF")) {
148
- // Instead of a PDF, the received data may be an HTML page with a message like
149
- // "Document non encore publié".
150
- if (!options.silent) {
151
- console.warn(` PDF "${url}" not found.`);
152
- }
153
- fs.removeSync(filePath);
154
- delete fileInfos.filename;
155
- delete fileInfos.sha256;
156
- fileInfos.status = 404;
157
- } else {
158
- const sha256 = createHash("sha256").update(buffer).digest("hex");
159
- const existingFilename = filenameBySha256[sha256];
160
- if (existingFilename === undefined) {
161
- fs.createWriteStream(filePath).write(buffer);
162
- fileInfos.filename = filename;
163
- filenameBySha256[sha256] = filename;
164
- } else {
165
- fileInfos.filename = existingFilename;
166
- }
167
- fileInfos.sha256 = sha256;
168
- fileInfos.status = response.status;
169
- }
147
+ fs.removeSync(filePath);
148
+ delete fileInfos.filename;
149
+ delete fileInfos.sha256;
150
+ fileInfos.status = 404;
151
+ } else {
152
+ const sha256 = createHash("sha256").update(buffer).digest("hex");
153
+ const existingFilename = filenameBySha256[sha256];
154
+ if (existingFilename === undefined) {
155
+ fs.createWriteStream(filePath).write(buffer);
156
+ fileInfos.filename = filename;
157
+ filenameBySha256[sha256] = filename;
170
158
  } else {
171
- if (response.status === 404) {
172
- if (!options.silent) {
173
- console.warn(` Page "${url}" not found.`);
174
- }
175
- } else {
176
- console.error(` Error:\n${JSON.stringify({
177
- code: response.status,
178
- message: response.statusText
179
- }, null, 2)}`);
180
- }
181
- fs.removeSync(filePath);
182
- delete fileInfos.filename;
183
- delete fileInfos.sha256;
184
- fileInfos.status = response.status;
159
+ fileInfos.filename = existingFilename;
185
160
  }
161
+ fileInfos.sha256 = sha256;
162
+ fileInfos.status = response.status;
186
163
  }
187
- fs.writeJsonSync(indexPath, index, {
188
- encoding: "utf-8",
189
- spaces: 2
190
- });
164
+ } else {
165
+ if (response.status === 404) {
166
+ if (!options.silent) {
167
+ console.warn(` Page "${url}" not found.`);
168
+ }
169
+ } else {
170
+ console.error(` Error:\n${JSON.stringify({
171
+ code: response.status,
172
+ message: response.statusText
173
+ }, null, 2)}`);
174
+ }
175
+ fs.removeSync(filePath);
176
+ delete fileInfos.filename;
177
+ delete fileInfos.sha256;
178
+ fileInfos.status = response.status;
191
179
  }
192
180
  }
193
- if (options.commit) {
194
- return git.commitAndPush(documentsDir, "Nouvelle moisson", options.remote);
195
- }
196
- return 0;
181
+ fs.writeJsonSync(indexPath, index, {
182
+ encoding: "utf-8",
183
+ spaces: 2
184
+ });
197
185
  }
198
186
  retrieveDocuments().then(exitCode => process.exit(exitCode)).catch(error => {
199
187
  console.log(error);
200
188
  process.exit(1);
201
189
  });
202
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImNyZWF0ZUhhc2giLCJkaWZmZXJlbmNlSW5EYXlzIiwiZnMiLCJwYXRoIiwid2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zIiwiZ2l0IiwiaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwiRG9jdW1lbnRVcmxGb3JtYXQiLCJpdGVyRG9jdW1lbnRPckRpdmlzaW9uVXJscyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIlN0cmluZyIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsIm9wdGlvbnMiLCJ0b2RheSIsIkRhdGUiLCJyZXRyaWV2ZURvY3VtZW50cyIsImNvbW1pdCIsInVpZCIsImRhdGFEaXIiLCJkb2N1bWVudHNEaXIiLCJqb2luIiwicHVsbCIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiZW5zdXJlRGlyU3luYyIsImZ1bGwiLCJmaWxlbmFtZSIsInJlYWRkaXJTeW5jIiwicmVtb3ZlU3luYyIsImZpcnN0VWlkIiwic2tpcCIsImRvY3VtZW50IiwibGVnaXNsYXR1cmUiLCJkb2N1bWVudE9yRGl2aXNpb24iLCJzdWJzdHJpbmciLCJkb2N1bWVudERpciIsImZpbGVuYW1lQnlTaGEyNTYiLCJpbmRleFBhdGgiLCJpbmRleCIsInBhdGhFeGlzdHNTeW5jIiwicmVhZEpzb25TeW5jIiwiZm9ybWF0IiwidXJsIiwiZm9ybWF0RmlsZXNJbmZvcyIsInVuZGVmaW5lZCIsImZpbGVJbmZvcyIsImZpbmQiLCJwdXNoIiwiUGRmIiwic3RhdHVzIiwic2hhMjU2IiwiY3ljbGVEZVZpZSIsImNocm9ubyIsImRhdGVDcmVhdGlvbiIsImRhdGVEZXBvdCIsInNpbGVudCIsImNvbnNvbGUiLCJsb2ciLCJyZXNwb25zZSIsImZldGNoIiwiZmlsZVBhdGgiLCJvayIsImFycmF5QnVmZmVyIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsInN1YmFycmF5IiwidG9TdHJpbmciLCJzdGFydHNXaXRoIiwid2FybiIsInVwZGF0ZSIsImRpZ2VzdCIsImV4aXN0aW5nRmlsZW5hbWUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIndyaXRlIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiY29kZSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwid3JpdGVKc29uU3luYyIsInNwYWNlcyIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJ0aGVuIiwiZXhpdENvZGUiLCJleGl0IiwiY2F0Y2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9kb2N1bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IHsgZGlmZmVyZW5jZUluRGF5cyB9IGZyb20gXCJkYXRlLWZuc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgRG9jdW1lbnRGaWxlSW5mb3MsXG4gIERvY3VtZW50RmlsZXNJbmRleCxcbiAgd2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zLFxufSBmcm9tIFwiLi4vZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMsIHBhdGhGcm9tRG9jdW1lbnRVaWQgfSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMgfSBmcm9tIFwiLi4vdXJsc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcImNcIixcbiAgICBoZWxwOiBcImNvbW1pdCBkb2N1bWVudHNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJmXCIsXG4gICAgaGVscDogXCJyZXRyaWV2ZSBhbGwgZG9jdW1lbnRzLCBldmVuIGFscmVhZHkgcmV0cmlldmVkIG9uZXNcIixcbiAgICBuYW1lOiBcImZ1bGxcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwibFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIxNlwiLFxuICAgIGhlbHA6ICdsZWdpc2xhdHVyZXMgdG8gcmV0cmlldmUsIFwiKlwiIGZvciBhbGwnLFxuICAgIG5hbWU6IFwibGVnaXNsYXR1cmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJuXCIsXG4gICAgaGVscDogXCJ0cnkgdG8gYWxzbyByZXRyaWV2ZSBkb2N1bWVudHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90IGZvdW5kXCIsXG4gICAgbmFtZTogXCJub3QtZm91bmRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwicFwiLFxuICAgIGhlbHA6IFwicHVsbCByZXBvc2l0b3JpZXMgYmVmb3JlIHByb2NlZWRpbmdcIixcbiAgICBuYW1lOiBcInB1bGxcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiclwiLFxuICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJzXCIsXG4gICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ1XCIsXG4gICAgaGVscDogXCJVSUQgb2YgZmlyc3QgQXNzZW1ibMOpZSdzIGRvY3VtZW50IG9yIGRpdmlzaW9uIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJ1aWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ2XCIsXG4gICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbmNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURvY3VtZW50cygpOiBQcm9taXNlPG51bWJlcj4ge1xuICBhc3NlcnQoXG4gICAgIW9wdGlvbnMuY29tbWl0IHx8ICFvcHRpb25zLnVpZCxcbiAgICAnT3B0aW9ucyBcImNvbW1pdFwiICYgXCJ1aWRcIiBhcmUgaW5jb21wYXRpYmxlJyxcbiAgKVxuXG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZG9jdW1lbnRzRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIFwiRG9jdW1lbnRzXCIpXG4gIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICBleGVjU3luYyhgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFzdGVyYCwge1xuICAgICAgY3dkOiBkb2N1bWVudHNEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gICAgZXhlY1N5bmMoYGdpdCBwdWxsIC0tcmViYXNlYCwge1xuICAgICAgY3dkOiBkb2N1bWVudHNEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cblxuICBmcy5lbnN1cmVEaXJTeW5jKGRvY3VtZW50c0RpcilcbiAgaWYgKG9wdGlvbnMuZnVsbCAmJiAhb3B0aW9ucy51aWQpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRvY3VtZW50c0RpcikpIHtcbiAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRvY3VtZW50c0RpciwgZmlsZW5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpcnN0VWlkID0gb3B0aW9ucy51aWRcbiAgbGV0IHNraXAgPSBCb29sZWFuKGZpcnN0VWlkKVxuICBmb3IgKGNvbnN0IHsgZG9jdW1lbnQgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZURvY3VtZW50cyhcbiAgICBkYXRhRGlyLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gICkpIHtcbiAgICBmb3IgKGNvbnN0IGRvY3VtZW50T3JEaXZpc2lvbiBvZiB3YWxrRG9jdW1lbnRBbmREaXZpc2lvbnMoZG9jdW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgZG9jdW1lbnRzIGZyb20gU8OpbmF0LlxuICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQuc3Vic3RyaW5nKDQsIDYpID09PSBcIlNOXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQgPT09IGZpcnN0VWlkKSB7XG4gICAgICAgICAgc2tpcCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkb2N1bWVudERpciA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoXG4gICAgICAgIGRvY3VtZW50c0RpcixcbiAgICAgICAgZG9jdW1lbnRPckRpdmlzaW9uLnVpZCxcbiAgICAgIClcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZG9jdW1lbnREaXIpXG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lQnlTaGEyNTY6IHsgW2RpZ2VzdDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKGRvY3VtZW50RGlyLCBcImluZGV4Lmpzb25cIilcbiAgICAgIGNvbnN0IGluZGV4ID0gKFxuICAgICAgICBmcy5wYXRoRXhpc3RzU3luYyhpbmRleFBhdGgpID8gZnMucmVhZEpzb25TeW5jKGluZGV4UGF0aCkgOiB7fVxuICAgICAgKSBhcyBEb2N1bWVudEZpbGVzSW5kZXhcbiAgICAgIGZvciAoY29uc3QgeyBmb3JtYXQsIHR5cGUsIHVybCB9IG9mIGl0ZXJEb2N1bWVudE9yRGl2aXNpb25VcmxzKFxuICAgICAgICBkb2N1bWVudE9yRGl2aXNpb24sXG4gICAgICApKSB7XG4gICAgICAgIGxldCBmb3JtYXRGaWxlc0luZm9zID0gaW5kZXhbZm9ybWF0XVxuICAgICAgICBpZiAoZm9ybWF0RmlsZXNJbmZvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9ybWF0RmlsZXNJbmZvcyA9IGluZGV4W2Zvcm1hdF0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlSW5mb3MgPSBmb3JtYXRGaWxlc0luZm9zLmZpbmQoXG4gICAgICAgICAgKGZpbGVJbmZvcykgPT4gZmlsZUluZm9zLnVybCA9PT0gdXJsLFxuICAgICAgICApXG4gICAgICAgIGlmIChmaWxlSW5mb3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZpbGVJbmZvcyA9IHt9IGFzIERvY3VtZW50RmlsZUluZm9zXG4gICAgICAgICAgZm9ybWF0RmlsZXNJbmZvcy5wdXNoKGZpbGVJbmZvcylcbiAgICAgICAgfVxuICAgICAgICBmaWxlSW5mb3MudXJsID0gdXJsXG5cbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHt0eXBlfS4ke1xuICAgICAgICAgIGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUGRmID8gXCJwZGZcIiA6IFwiaHRtbFwiXG4gICAgICAgIH1gXG4gICAgICAgIGlmIChmaWxlSW5mb3Muc3RhdHVzID09PSAyMDAgJiYgIW9wdGlvbnMuZnVsbCkge1xuICAgICAgICAgIGZpbGVuYW1lQnlTaGEyNTZbZmlsZUluZm9zLnNoYTI1NiBhcyBzdHJpbmddID0gZmlsZW5hbWVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlSW5mb3Muc3RhdHVzID09PSA0MDQgJiZcbiAgICAgICAgICAhb3B0aW9uc1tcIm5vdC1mb3VuZFwiXSAmJlxuICAgICAgICAgIGRpZmZlcmVuY2VJbkRheXMoXG4gICAgICAgICAgICB0b2RheSxcbiAgICAgICAgICAgIGRvY3VtZW50T3JEaXZpc2lvbi5jeWNsZURlVmllLmNocm9uby5kYXRlQ3JlYXRpb24gPz9cbiAgICAgICAgICAgICAgKGRvY3VtZW50T3JEaXZpc2lvbi5jeWNsZURlVmllLmNocm9uby5kYXRlRGVwb3QgYXMgRGF0ZSB8IHN0cmluZyksXG4gICAgICAgICAgKSA+IDEwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgUmV0cmlldmluZyBkb2N1bWVudCBvciBkaXZpc2lvbiAke2RvY3VtZW50T3JEaXZpc2lvbi51aWR9IGF0ICR7dXJsfeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRvY3VtZW50RGlyLCBmaWxlbmFtZSlcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZm9ybWF0ID09PSBEb2N1bWVudFVybEZvcm1hdC5QZGYgJiZcbiAgICAgICAgICAgICFidWZmZXIuc3ViYXJyYXkoMCwgNCkudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiJVBERlwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBhIFBERiwgdGhlIHJlY2VpdmVkIGRhdGEgbWF5IGJlIGFuIEhUTUwgcGFnZSB3aXRoIGEgbWVzc2FnZSBsaWtlXG4gICAgICAgICAgICAvLyBcIkRvY3VtZW50IG5vbiBlbmNvcmUgcHVibGnDqVwiLlxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCAgUERGIFwiJHt1cmx9XCIgbm90IGZvdW5kLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5maWxlbmFtZVxuICAgICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSA0MDRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2hhMjU2ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoYnVmZmVyKS5kaWdlc3QoXCJoZXhcIilcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZW5hbWUgPSBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl1cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0ZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnMuY3JlYXRlV3JpdGVTdHJlYW0oZmlsZVBhdGgpLndyaXRlKGJ1ZmZlcilcbiAgICAgICAgICAgICAgZmlsZUluZm9zLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICAgICAgZmlsZW5hbWVCeVNoYTI1NltzaGEyNTZdID0gZmlsZW5hbWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpbGVJbmZvcy5maWxlbmFtZSA9IGV4aXN0aW5nRmlsZW5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVJbmZvcy5zaGEyNTYgPSBzaGEyNTZcbiAgICAgICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgICBQYWdlIFwiJHt1cmx9XCIgbm90IGZvdW5kLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGAgIEVycm9yOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgeyBjb2RlOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgZnMucmVtb3ZlU3luYyhmaWxlUGF0aClcbiAgICAgICAgICBkZWxldGUgZmlsZUluZm9zLmZpbGVuYW1lXG4gICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgICAgICBmaWxlSW5mb3Muc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZzLndyaXRlSnNvblN5bmMoaW5kZXhQYXRoLCBpbmRleCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiLCBzcGFjZXM6IDIgfSlcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICByZXR1cm4gZ2l0LmNvbW1pdEFuZFB1c2goZG9jdW1lbnRzRGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIiwgb3B0aW9ucy5yZW1vdGUpXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxucmV0cmlldmVEb2N1bWVudHMoKVxuICAudGhlbigoZXhpdENvZGUpID0+IHByb2Nlc3MuZXhpdChleGl0Q29kZSkpXG4gIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxTQUFTQyxVQUFVLFFBQVEsUUFBUTtBQUNuQyxTQUFTQyxnQkFBZ0IsUUFBUSxVQUFVO0FBQzNDLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxN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
190
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJjcmVhdGVIYXNoIiwiZGlmZmVyZW5jZUluRGF5cyIsImZzIiwicGF0aCIsIndhbGtEb2N1bWVudEFuZERpdmlzaW9ucyIsImdpdCIsIml0ZXJMb2FkQXNzZW1ibGVlRG9jdW1lbnRzIiwicGF0aEZyb21Eb2N1bWVudFVpZCIsIkRvY3VtZW50VXJsRm9ybWF0IiwiaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMiLCJjb21taXRPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwicHVsbE9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIkJvb2xlYW4iLCJTdHJpbmciLCJtdWx0aXBsZSIsIm9wdGlvbnMiLCJ0b2RheSIsIkRhdGUiLCJmZXRjaFdpdGhSZXRyeSIsInVybCIsInJldHJpZXMiLCJiYWNrb2ZmIiwiYXR0ZW1wdCIsImZldGNoIiwiZXJyb3IiLCJjb25zb2xlIiwid2FybiIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsIkVycm9yIiwicmV0cmlldmVEb2N1bWVudHMiLCJjb21taXQiLCJ1aWQiLCJkYXRhRGlyIiwiZG9jdW1lbnRzRGlyIiwiam9pbiIsInB1bGwiLCJyZXNldEFuZFB1bGwiLCJlbnN1cmVEaXJTeW5jIiwiZnVsbCIsImZpbGVuYW1lIiwicmVhZGRpclN5bmMiLCJyZW1vdmVTeW5jIiwiZmlyc3RVaWQiLCJza2lwIiwiZG9jdW1lbnQiLCJsZWdpc2xhdHVyZSIsImRvY3VtZW50T3JEaXZpc2lvbiIsInN1YnN0cmluZyIsInByb2Nlc3NEb2N1bWVudE9yRGl2aXNpb24iLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiZG9jdW1lbnREaXIiLCJmaWxlbmFtZUJ5U2hhMjU2IiwiaW5kZXhQYXRoIiwiaW5kZXgiLCJwYXRoRXhpc3RzU3luYyIsInJlYWRKc29uU3luYyIsImZvcm1hdCIsIlBkZiIsImRvY3VtZW50VHlwZSIsImNsYXNzaWZpY2F0aW9uIiwiY29kZSIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZm9ybWF0RmlsZXNJbmZvcyIsImZpbGVJbmZvcyIsImZpbmQiLCJmaWxlIiwicHVzaCIsInN0YXR1cyIsInNoYTI1NiIsImN5Y2xlRGVWaWUiLCJjaHJvbm8iLCJkYXRlQ3JlYXRpb24iLCJkYXRlRGVwb3QiLCJzaWxlbnQiLCJsb2ciLCJyZXNwb25zZSIsImZpbGVQYXRoIiwib2siLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJzdWJhcnJheSIsInRvU3RyaW5nIiwic3RhcnRzV2l0aCIsInVwZGF0ZSIsImRpZ2VzdCIsImV4aXN0aW5nRmlsZW5hbWUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIndyaXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwid3JpdGVKc29uU3luYyIsImVuY29kaW5nIiwic3BhY2VzIiwidGhlbiIsImV4aXRDb2RlIiwicHJvY2VzcyIsImV4aXQiLCJjYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX2RvY3VtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IHsgZGlmZmVyZW5jZUluRGF5cyB9IGZyb20gXCJkYXRlLWZuc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgRG9jdW1lbnRGaWxlSW5mb3MsXG4gIERvY3VtZW50RmlsZXNJbmRleCxcbiAgd2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zLFxufSBmcm9tIFwiLi4vZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMsIHBhdGhGcm9tRG9jdW1lbnRVaWQgfSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMgfSBmcm9tIFwiLi4vdXJsc1wiXG5pbXBvcnQge1xuICBjb21taXRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcHVsbE9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgY29tbWl0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICB7XG4gICAgYWxpYXM6IFwiZlwiLFxuICAgIGhlbHA6IFwicmV0cmlldmUgYWxsIGRvY3VtZW50cywgZXZlbiBhbHJlYWR5IHJldHJpZXZlZCBvbmVzXCIsXG4gICAgbmFtZTogXCJmdWxsXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm5cIixcbiAgICBoZWxwOiBcInRyeSB0byBhbHNvIHJldHJpZXZlIGRvY3VtZW50cyB0aGF0IHdlcmUgcHJldmlvdXNseSBub3QgZm91bmRcIixcbiAgICBuYW1lOiBcIm5vdC1mb3VuZFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ1XCIsXG4gICAgaGVscDogXCJVSUQgb2YgZmlyc3QgQXNzZW1ibMOpZSdzIGRvY3VtZW50IG9yIGRpdmlzaW9uIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJ1aWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJGXCIsXG4gICAgaGVscDogXCJmb3JtYXQgb2YgZG9jdW1lbnRzIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJmb3JtYXRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJUXCIsXG4gICAgaGVscDogXCJ0eXBlIG9mIGRvY3VtZW50cyB0byByZXRyaWV2ZSAoZm9yIGV4YW1wbGU6IFBJT04pXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJkb2N1bWVudC10eXBlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5jb25zdCB0b2RheSA9IG5ldyBEYXRlKClcblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICByZXRyaWVzOiBudW1iZXIgPSAzLFxuICBiYWNrb2ZmOiBudW1iZXIgPSAzMDAsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaCh1cmwpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzIC0gMSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmV0Y2ggYXR0ZW1wdCAke2F0dGVtcHQgKyAxfSBmb3IgJHt1cmx9IGZhaWxlZC4gUmV0cnlpbmcgaW4gJHtiYWNrb2ZmfW1zLi4uYCxcbiAgICAgIClcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGJhY2tvZmYpKVxuICAgICAgYmFja29mZiAqPSAyXG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfSBhZnRlciAke3JldHJpZXN9IGF0dGVtcHRzYClcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVEb2N1bWVudHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgYXNzZXJ0KFxuICAgICFvcHRpb25zLmNvbW1pdCB8fCAhb3B0aW9ucy51aWQsXG4gICAgJ09wdGlvbnMgXCJjb21taXRcIiAmIFwidWlkXCIgYXJlIGluY29tcGF0aWJsZScsXG4gIClcblxuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIGNvbnN0IGRvY3VtZW50c0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBcIkRvY3VtZW50c1wiKVxuICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgZ2l0LnJlc2V0QW5kUHVsbChkb2N1bWVudHNEaXIpXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkb2N1bWVudHNEaXIpXG5cbiAgaWYgKG9wdGlvbnMuZnVsbCAmJiAhb3B0aW9ucy51aWQpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRvY3VtZW50c0RpcikpIHtcbiAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRvY3VtZW50c0RpciwgZmlsZW5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpcnN0VWlkID0gb3B0aW9ucy51aWRcbiAgbGV0IHNraXAgPSBCb29sZWFuKGZpcnN0VWlkKVxuICBmb3IgKGNvbnN0IHsgZG9jdW1lbnQgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZURvY3VtZW50cyhcbiAgICBkYXRhRGlyLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gICkpIHtcbiAgICBmb3IgKGNvbnN0IGRvY3VtZW50T3JEaXZpc2lvbiBvZiB3YWxrRG9jdW1lbnRBbmREaXZpc2lvbnMoZG9jdW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgZG9jdW1lbnRzIGZyb20gU8OpbmF0LlxuICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQuc3Vic3RyaW5nKDQsIDYpID09PSBcIlNOXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQgPT09IGZpcnN0VWlkKSB7XG4gICAgICAgICAgc2tpcCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBwcm9jZXNzRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50T3JEaXZpc2lvbiwgZG9jdW1lbnRzRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIHJldHVybiBnaXQuY29tbWl0QW5kUHVzaChkb2N1bWVudHNEaXIsIFwiTm91dmVsbGUgbW9pc3NvblwiLCBvcHRpb25zLnJlbW90ZSlcbiAgfVxuICByZXR1cm4gMFxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRG9jdW1lbnRPckRpdmlzaW9uKFxuICBkb2N1bWVudE9yRGl2aXNpb246IGFueSxcbiAgZG9jdW1lbnRzRGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkb2N1bWVudERpciA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoZG9jdW1lbnRzRGlyLCBkb2N1bWVudE9yRGl2aXNpb24udWlkKVxuICBmcy5lbnN1cmVEaXJTeW5jKGRvY3VtZW50RGlyKVxuXG4gIGNvbnN0IGZpbGVuYW1lQnlTaGEyNTY6IHsgW2RpZ2VzdDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4oZG9jdW1lbnREaXIsIFwiaW5kZXguanNvblwiKVxuICBjb25zdCBpbmRleCA9IChcbiAgICBmcy5wYXRoRXhpc3RzU3luYyhpbmRleFBhdGgpID8gZnMucmVhZEpzb25TeW5jKGluZGV4UGF0aCkgOiB7fVxuICApIGFzIERvY3VtZW50RmlsZXNJbmRleFxuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIHR5cGUsIHVybCB9IG9mIGl0ZXJEb2N1bWVudE9yRGl2aXNpb25VcmxzKFxuICAgIGRvY3VtZW50T3JEaXZpc2lvbixcbiAgKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7dHlwZX0uJHtcbiAgICAgIGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUGRmID8gXCJwZGZcIiA6IFwiaHRtbFwiXG4gICAgfWBcblxuICAgIC8vIEZpbHRlciBieSBmb3JtYXQgaWYgb3B0aW9uIGlzIHBhc3NlZFxuICAgIGlmIChvcHRpb25zLmZvcm1hdCAmJiBvcHRpb25zLmZvcm1hdCAhPT0gZm9ybWF0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBieSBkb2N1bWVudCB0eXBlIGlmIG9wdGlvbiBpcyBwYXNzZWRcbiAgICBjb25zdCBkb2N1bWVudFR5cGUgPSBkb2N1bWVudE9yRGl2aXNpb24uY2xhc3NpZmljYXRpb24/LnR5cGU/LmNvZGVcbiAgICBpZiAoXG4gICAgICBvcHRpb25zW1wiZG9jdW1lbnQtdHlwZVwiXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhb3B0aW9uc1tcImRvY3VtZW50LXR5cGVcIl0uaW5jbHVkZXMoZG9jdW1lbnRUeXBlKVxuICAgICkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0RmlsZXNJbmZvcyA9IGluZGV4W2Zvcm1hdF0gPz8gKGluZGV4W2Zvcm1hdF0gPSBbXSlcbiAgICBsZXQgZmlsZUluZm9zID1cbiAgICAgIGZvcm1hdEZpbGVzSW5mb3MuZmluZCgoZmlsZSkgPT4gZmlsZS51cmwgPT09IHVybCkgPz9cbiAgICAgICh7fSBhcyBEb2N1bWVudEZpbGVJbmZvcylcbiAgICBpZiAoIWZvcm1hdEZpbGVzSW5mb3MuaW5jbHVkZXMoZmlsZUluZm9zKSkge1xuICAgICAgZm9ybWF0RmlsZXNJbmZvcy5wdXNoKGZpbGVJbmZvcylcbiAgICB9XG4gICAgZmlsZUluZm9zLnVybCA9IHVybFxuXG4gICAgaWYgKGZpbGVJbmZvcy5zdGF0dXMgPT09IDIwMCAmJiAhb3B0aW9ucy5mdWxsKSB7XG4gICAgICBmaWxlbmFtZUJ5U2hhMjU2W2ZpbGVJbmZvcy5zaGEyNTYgYXMgc3RyaW5nXSA9IGZpbGVuYW1lXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWxlSW5mb3Muc3RhdHVzID09PSA0MDQgJiZcbiAgICAgICFvcHRpb25zW1wibm90LWZvdW5kXCJdICYmXG4gICAgICBkaWZmZXJlbmNlSW5EYXlzKFxuICAgICAgICB0b2RheSxcbiAgICAgICAgZG9jdW1lbnRPckRpdmlzaW9uLmN5Y2xlRGVWaWUuY2hyb25vLmRhdGVDcmVhdGlvbiA/P1xuICAgICAgICAgIChkb2N1bWVudE9yRGl2aXNpb24uY3ljbGVEZVZpZS5jaHJvbm8uZGF0ZURlcG90IGFzIERhdGUgfCBzdHJpbmcpLFxuICAgICAgKSA+IDEwXG4gICAgKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgUmV0cmlldmluZyBkb2N1bWVudCBvciBkaXZpc2lvbiAke2RvY3VtZW50T3JEaXZpc2lvbi51aWR9IGF0ICR7dXJsfeKApmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwpXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZG9jdW1lbnREaXIsIGZpbGVuYW1lKVxuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKVxuICAgICAgaWYgKFxuICAgICAgICBmb3JtYXQgPT09IERvY3VtZW50VXJsRm9ybWF0LlBkZiAmJlxuICAgICAgICAhYnVmZmVyLnN1YmFycmF5KDAsIDQpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIiVQREZcIilcbiAgICAgICkge1xuICAgICAgICAvLyBJbnN0ZWFkIG9mIGEgUERGLCB0aGUgcmVjZWl2ZWQgZGF0YSBtYXkgYmUgYW4gSFRNTCBwYWdlIHdpdGggYSBtZXNzYWdlIGxpa2VcbiAgICAgICAgLy8gXCJEb2N1bWVudCBub24gZW5jb3JlIHB1Ymxpw6lcIi5cbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgICBQREYgXCIke3VybH1cIiBub3QgZm91bmQuYClcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgICBkZWxldGUgZmlsZUluZm9zLmZpbGVuYW1lXG4gICAgICAgIGRlbGV0ZSBmaWxlSW5mb3Muc2hhMjU2XG4gICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSA0MDRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYTI1NiA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KFwiaGV4XCIpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZW5hbWUgPSBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl1cbiAgICAgICAgaWYgKGV4aXN0aW5nRmlsZW5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGVQYXRoKS53cml0ZShidWZmZXIpXG4gICAgICAgICAgZmlsZUluZm9zLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl0gPSBmaWxlbmFtZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVJbmZvcy5maWxlbmFtZSA9IGV4aXN0aW5nRmlsZW5hbWVcbiAgICAgICAgfVxuICAgICAgICBmaWxlSW5mb3Muc2hhMjU2ID0gc2hhMjU2XG4gICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYCAgUGFnZSBcIiR7dXJsfVwiIG5vdCBmb3VuZC5gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGAgIEVycm9yOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7IGNvZGU6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgZGVsZXRlIGZpbGVJbmZvcy5maWxlbmFtZVxuICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUpzb25TeW5jKGluZGV4UGF0aCwgaW5kZXgsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiwgc3BhY2VzOiAyIH0pXG59XG5cbnJldHJpZXZlRG9jdW1lbnRzKClcbiAgLnRoZW4oKGV4aXRDb2RlKSA9PiBwcm9jZXNzLmV4aXQoZXhpdENvZGUpKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxRQUFRO0FBQzNCLE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsU0FBU0MsVUFBVSxRQUFRLFFBQVE7QUFDbkMsU0FBU0MsZ0JBQWdCLFFBQVEsVUFBVTtBQUMzQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBS3JCQyx3QkFBd0I7QUFBQSxPQUVuQixLQUFLQyxHQUFHO0FBQUEsU0FDTkMsMEJBQTBCLEVBQUVDLG1CQUFtQjtBQUFBLFNBQy9DQyxpQkFBaUIsRUFBRUMsMEJBQTBCO0FBQUEsU0FFcERDLFlBQVksRUFDWkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsRUFDakJDLFVBQVUsRUFDVkMsWUFBWSxFQUNaQyxZQUFZLEVBQ1pDLGFBQWE7QUFHZixNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QlAsWUFBWSxFQUNaRSxpQkFBaUIsRUFDakJFLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JMLG9CQUFvQixFQUNwQkUsVUFBVSxFQUNWO0VBQ0VLLEtBQUssRUFBRSxHQUFHO0VBQ1ZDLElBQUksRUFBRSxxREFBcUQ7RUFDM0RDLElBQUksRUFBRSxNQUFNO0VBQ1pDLElBQUksRUFBRUM7QUFDUixDQUFDLEVBQ0Q7RUFDRUosS0FBSyxFQUFFLEdBQUc7RUFDVkMsSUFBSSxFQUFFLCtEQUErRDtFQUNyRUMsSUFBSSxFQUFFLFdBQVc7RUFDakJDLElBQUksRUFBRUM7QUFDUixDQUFDLEVBQ0Q7RUFDRUosS0FBSyxFQUFFLEdBQUc7RUFDVkMsSUFBSSxFQUFFLDJEQUEyRDtFQUNqRUMsSUFBSSxFQUFFLEtBQUs7RUFDWEMsSUFBSSxFQUFFRTtBQUNSLENBQUMsRUFD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