@datagrok/helm 2.1.5 → 2.1.7

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.
@@ -1,735 +1,2 @@
1
- var helm_test;
2
- /******/ (() => { // webpackBootstrap
3
- /******/ "use strict";
4
- /******/ var __webpack_modules__ = ({
5
-
6
- /***/ "./node_modules/@datagrok-libraries/utils/src/test.js":
7
- /*!************************************************************!*\
8
- !*** ./node_modules/@datagrok-libraries/utils/src/test.js ***!
9
- \************************************************************/
10
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
11
-
12
- __webpack_require__.r(__webpack_exports__);
13
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14
- /* harmony export */ "Test": () => (/* binding */ Test),
15
- /* harmony export */ "TestContext": () => (/* binding */ TestContext),
16
- /* harmony export */ "after": () => (/* binding */ after),
17
- /* harmony export */ "assure": () => (/* binding */ assure),
18
- /* harmony export */ "awaitCheck": () => (/* binding */ awaitCheck),
19
- /* harmony export */ "before": () => (/* binding */ before),
20
- /* harmony export */ "category": () => (/* binding */ category),
21
- /* harmony export */ "currentCategory": () => (/* binding */ currentCategory),
22
- /* harmony export */ "delay": () => (/* binding */ delay),
23
- /* harmony export */ "expect": () => (/* binding */ expect),
24
- /* harmony export */ "expectArray": () => (/* binding */ expectArray),
25
- /* harmony export */ "expectFloat": () => (/* binding */ expectFloat),
26
- /* harmony export */ "expectObject": () => (/* binding */ expectObject),
27
- /* harmony export */ "isDialogPresent": () => (/* binding */ isDialogPresent),
28
- /* harmony export */ "runTests": () => (/* binding */ runTests),
29
- /* harmony export */ "test": () => (/* binding */ test),
30
- /* harmony export */ "testEvent": () => (/* binding */ testEvent),
31
- /* harmony export */ "testViewer": () => (/* binding */ testViewer),
32
- /* harmony export */ "tests": () => (/* binding */ tests)
33
- /* harmony export */ });
34
- /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
35
- /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
36
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
37
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__);
38
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
39
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
40
- return new (P || (P = Promise))(function (resolve, reject) {
41
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
42
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
43
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
44
- step((generator = generator.apply(thisArg, _arguments || [])).next());
45
- });
46
- };
47
-
48
-
49
- const tests = {};
50
- let currentCategory;
51
- var assure;
52
- (function (assure) {
53
- function notNull(value, name) {
54
- if (value == null)
55
- throw new Error(`${name == null ? 'Value' : name} not defined`);
56
- }
57
- assure.notNull = notNull;
58
- })(assure || (assure = {}));
59
- class TestContext {
60
- constructor(catchUnhandled, report) {
61
- this.catchUnhandled = true;
62
- this.report = false;
63
- if (catchUnhandled !== undefined)
64
- this.catchUnhandled = catchUnhandled;
65
- if (report !== undefined)
66
- this.report = report;
67
- }
68
- ;
69
- }
70
- class Test {
71
- constructor(category, name, test, options) {
72
- var _a;
73
- this.category = category;
74
- this.name = name;
75
- options !== null && options !== void 0 ? options : (options = {});
76
- (_a = options.timeout) !== null && _a !== void 0 ? _a : (options.timeout = 30000);
77
- this.options = options;
78
- this.test = () => __awaiter(this, void 0, void 0, function* () {
79
- return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
80
- let result = '';
81
- try {
82
- result = yield test();
83
- }
84
- catch (e) {
85
- reject(e);
86
- }
87
- resolve(result);
88
- }));
89
- });
90
- }
91
- }
92
- function testEvent(event, handler, trigger, ms = 0) {
93
- return __awaiter(this, void 0, void 0, function* () {
94
- let sub;
95
- return new Promise((resolve, reject) => {
96
- sub = event.subscribe((args) => {
97
- try {
98
- handler(args);
99
- }
100
- catch (e) {
101
- reject(e);
102
- }
103
- sub.unsubscribe();
104
- resolve('OK');
105
- });
106
- setTimeout(() => {
107
- sub.unsubscribe();
108
- // eslint-disable-next-line prefer-promise-reject-errors
109
- reject('timeout');
110
- }, ms);
111
- trigger();
112
- });
113
- });
114
- }
115
- function test(name, test, options) {
116
- if (tests[currentCategory] == undefined)
117
- tests[currentCategory] = {};
118
- if (tests[currentCategory].tests == undefined)
119
- tests[currentCategory].tests = [];
120
- tests[currentCategory].tests.push(new Test(currentCategory, name, test, options));
121
- }
122
- /* Tests two objects for equality, throws an exception if they are not equal. */
123
- function expect(actual, expected) {
124
- if (actual !== expected)
125
- throw new Error(`Expected "${expected}", got "${actual}"`);
126
- }
127
- function expectFloat(actual, expected, tolerance = 0.001) {
128
- const areEqual = Math.abs(actual - expected) < tolerance;
129
- if (!areEqual)
130
- throw new Error(`Expected ${expected}, got ${actual} (tolerance = ${tolerance})`);
131
- }
132
- function expectObject(actual, expected) {
133
- for (const [expectedKey, expectedValue] of Object.entries(expected)) {
134
- if (!actual.hasOwnProperty(expectedKey))
135
- throw new Error(`Expected property "${expectedKey}" not found`);
136
- const actualValue = actual[expectedKey];
137
- if (actualValue instanceof Array && expectedValue instanceof Array)
138
- expectArray(actualValue, expectedValue);
139
- else if (actualValue instanceof Object && expectedValue instanceof Object)
140
- expectObject(actualValue, expectedValue);
141
- else if (Number.isFinite(actualValue) && Number.isFinite(expectedValue))
142
- expectFloat(actualValue, expectedValue);
143
- else if (actualValue != expectedValue)
144
- throw new Error(`Expected (${expectedValue}) for key '${expectedKey}', got (${actualValue})`);
145
- }
146
- }
147
- function expectArray(actual, expected) {
148
- const actualLength = actual.length;
149
- const expectedLength = expected.length;
150
- if (actualLength != expectedLength) {
151
- throw new Error(`Arrays are of different length: actual array length is ${actualLength} ` +
152
- `and expected array length is ${expectedLength}`);
153
- }
154
- for (let i = 0; i < actualLength; i++) {
155
- if (actual[i] instanceof Array && expected[i] instanceof Array)
156
- expectArray(actual[i], expected[i]);
157
- else if (actual[i] instanceof Object && expected[i] instanceof Object)
158
- expectObject(actual[i], expected[i]);
159
- else if (actual[i] != expected[i])
160
- throw new Error(`Expected ${expected[i]} at position ${i}, got ${actual[i]}`);
161
- }
162
- }
163
- /* Defines a test suite. */
164
- function category(category, tests) {
165
- currentCategory = category;
166
- tests();
167
- }
168
- /* Defines a function to be executed before the tests in this category are executed. */
169
- function before(before) {
170
- if (tests[currentCategory] == undefined)
171
- tests[currentCategory] = {};
172
- tests[currentCategory].before = before;
173
- }
174
- /* Defines a function to be executed after the tests in this category are executed. */
175
- function after(after) {
176
- if (tests[currentCategory] == undefined)
177
- tests[currentCategory] = {};
178
- tests[currentCategory].after = after;
179
- }
180
- function runTests(options) {
181
- var _a, _b, _c, _d;
182
- var _e;
183
- return __awaiter(this, void 0, void 0, function* () {
184
- const results = [];
185
- const packageName = (_b = (_a = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.functions.getCurrentCall()) === null || _a === void 0 ? void 0 : _a.func) === null || _b === void 0 ? void 0 : _b.package;
186
- console.log(`Running tests`);
187
- options !== null && options !== void 0 ? options : (options = {});
188
- (_c = (_e = options).testContext) !== null && _c !== void 0 ? _c : (_e.testContext = new TestContext());
189
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError = '';
190
- for (const [key, value] of Object.entries(tests)) {
191
- if ((options === null || options === void 0 ? void 0 : options.category) != undefined) {
192
- if (!key.toLowerCase().startsWith(options === null || options === void 0 ? void 0 : options.category.toLowerCase()))
193
- continue;
194
- }
195
- console.log(`Started ${key} category`);
196
- try {
197
- if (value.before)
198
- yield value.before();
199
- }
200
- catch (x) {
201
- value.beforeStatus = x.toString();
202
- }
203
- const t = (_d = value.tests) !== null && _d !== void 0 ? _d : [];
204
- const res = [];
205
- for (let i = 0; i < t.length; i++)
206
- res.push(yield execTest(t[i], options === null || options === void 0 ? void 0 : options.test));
207
- const data = (yield Promise.all(res)).filter((d) => d.result != 'skipped');
208
- try {
209
- if (value.after)
210
- yield value.after();
211
- }
212
- catch (x) {
213
- value.afterStatus = x.toString();
214
- }
215
- if (value.afterStatus)
216
- data.push({ category: key, name: 'init', result: value.afterStatus, success: false, ms: 0, skipped: false });
217
- if (value.beforeStatus)
218
- data.push({ category: key, name: 'init', result: value.beforeStatus, success: false, ms: 0, skipped: false });
219
- results.push(...data);
220
- }
221
- if (options.testContext.catchUnhandled) {
222
- yield delay(1000);
223
- if (datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError.length > 0) {
224
- results.push({
225
- category: 'Unhandled exceptions',
226
- name: 'exceptions',
227
- result: datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.lastError, success: false, ms: 0, skipped: false
228
- });
229
- }
230
- }
231
- if (options.testContext.report) {
232
- const logger = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Logger();
233
- const successful = results.filter((r) => r.success).length;
234
- const skipped = results.filter((r) => r.skipped).length;
235
- const failed = results.filter((r) => !r.success);
236
- const description = 'Package @package tested: @successful successful, @skipped skipped, @failed failed tests';
237
- const params = {
238
- successful: successful,
239
- skipped: skipped,
240
- failed: failed.length,
241
- package: packageName
242
- };
243
- for (const r of failed)
244
- Object.assign(params, { [`${r.category} | ${r.name}`]: r.result });
245
- logger.log(description, params, 'package-tested');
246
- }
247
- return results;
248
- });
249
- }
250
- function execTest(t, predicate) {
251
- var _a, _b, _c;
252
- return __awaiter(this, void 0, void 0, function* () {
253
- let r;
254
- const filter = predicate != undefined && (!t.name.toLowerCase().startsWith(predicate.toLowerCase()));
255
- const skip = ((_a = t.options) === null || _a === void 0 ? void 0 : _a.skipReason) || filter;
256
- const skipReason = filter ? 'skipped' : (_b = t.options) === null || _b === void 0 ? void 0 : _b.skipReason;
257
- if (!skip)
258
- console.log(`Started ${t.category} ${t.name}`);
259
- const start = new Date();
260
- try {
261
- if (skip)
262
- r = { success: true, result: skipReason, ms: 0, skipped: true };
263
- else
264
- r = { success: true, result: (_c = yield t.test()) !== null && _c !== void 0 ? _c : 'OK', ms: 0, skipped: false };
265
- }
266
- catch (x) {
267
- r = { success: false, result: x.toString(), ms: 0, skipped: false };
268
- }
269
- const stop = new Date();
270
- // @ts-ignore
271
- r.ms = stop - start;
272
- if (!skip)
273
- console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`);
274
- r.category = t.category;
275
- r.name = t.name;
276
- return r;
277
- });
278
- }
279
- /* Waits [ms] milliseconds */
280
- function delay(ms) {
281
- return __awaiter(this, void 0, void 0, function* () {
282
- yield new Promise((r) => setTimeout(r, ms));
283
- });
284
- }
285
- function awaitCheck(checkHandler, error = 'Timeout exceeded', wait = 500) {
286
- return __awaiter(this, void 0, void 0, function* () {
287
- return new Promise((resolve, reject) => {
288
- setTimeout(() => {
289
- clearInterval(interval);
290
- reject(new Error(error));
291
- }, wait);
292
- // @ts-ignore
293
- const interval = setInterval(() => {
294
- if (checkHandler()) {
295
- clearInterval(interval);
296
- resolve();
297
- }
298
- }, 50);
299
- });
300
- });
301
- }
302
- function isDialogPresent(dialogTitle) {
303
- for (let i = 0; i < datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Dialog.getOpenDialogs().length; i++) {
304
- if (datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.Dialog.getOpenDialogs()[i].title == dialogTitle)
305
- return true;
306
- }
307
- return false;
308
- }
309
- function testViewer(v, df, detectSemanticTypes = false) {
310
- return __awaiter(this, void 0, void 0, function* () {
311
- if (detectSemanticTypes)
312
- yield datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.data.detectSemanticTypes(df);
313
- const tv = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.addTableView(df);
314
- const viewerName = `[name=viewer-${v.replace(/\s+/g, '-')} i]`;
315
- const selector = `${viewerName} canvas,${viewerName} svg,${viewerName} img,
316
- ${viewerName} input,${viewerName} h1,${viewerName} a`;
317
- const res = [];
318
- try {
319
- let viewer = tv.addViewer(v);
320
- yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer', 3000);
321
- res.push(Array.from(tv.viewers).length);
322
- Array.from(df.row(0).cells).forEach((c) => c.value = null);
323
- df.rows.select((row) => row.idx > 1 && row.idx < 7);
324
- for (let i = 7; i < 12; i++)
325
- df.filter.set(i, false);
326
- df.currentRowIdx = 1;
327
- const props = viewer.getOptions(true).look;
328
- const newProps = {};
329
- Object.keys(props).filter((k) => typeof props[k] === 'boolean').forEach((k) => newProps[k] = !props[k]);
330
- viewer.setOptions(newProps);
331
- yield delay(250);
332
- const layout = tv.saveLayout();
333
- const oldProps = viewer.getOptions().look;
334
- tv.resetLayout();
335
- res.push(Array.from(tv.viewers).length);
336
- tv.loadLayout(layout);
337
- yield awaitCheck(() => document.querySelector(selector) !== null, 'cannot load viewer from layout', 3000);
338
- yield delay(250);
339
- res.push(Array.from(tv.viewers).length);
340
- viewer = Array.from(tv.viewers).find((v) => v.type !== 'Grid');
341
- expectArray(res, [2, 1, 2]);
342
- expect(JSON.stringify(viewer.getOptions().look), JSON.stringify(oldProps));
343
- }
344
- finally {
345
- tv.close();
346
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.closeTable(df);
347
- }
348
- });
349
- }
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FLZCxFQUFFLENBQUM7QUFFUCxNQUFNLENBQUMsSUFBSSxlQUF1QixDQUFDO0FBRW5DLE1BQU0sS0FBVyxNQUFNLENBTXRCO0FBTkQsV0FBaUIsTUFBTTtJQUVyQixTQUFnQixPQUFPLENBQUMsS0FBVSxFQUFFLElBQWE7UUFDL0MsSUFBSSxLQUFLLElBQUksSUFBSTtZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUhlLGNBQU8sVUFHdEIsQ0FBQTtBQUNILENBQUMsRUFOZ0IsTUFBTSxLQUFOLE1BQU0sUUFNdEI7QUFRRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFZLGNBQXdCLEVBQUUsTUFBZ0I7UUFIdEQsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdiLElBQUksY0FBYyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUFBLENBQUM7Q0FDSDtBQUVELE1BQU0sT0FBTyxJQUFJO0lBTWYsWUFBWSxRQUFnQixFQUFFLElBQVksRUFBRSxJQUF3QixFQUFFLE9BQXFCOztRQUN6RixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFH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SyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUUsQ0FBQztZQUNoRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDNUU7Z0JBQVM7WUFDUixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbmV4cG9ydCBjb25zdCB0ZXN0czoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgdGVzdHM/OiBUZXN0W10sIGJlZm9yZT86ICgpID0+IFByb21pc2U8dm9pZD4sIGFmdGVyPzogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBiZWZvcmVTdGF0dXM/OiBzdHJpbmcsIGFmdGVyU3RhdHVzPzogc3RyaW5nXG4gIH1cbn0gPSB7fTtcblxuZXhwb3J0IGxldCBjdXJyZW50Q2F0ZWdvcnk6IHN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBhc3N1cmUge1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBub3ROdWxsKHZhbHVlOiBhbnksIG5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lID09IG51bGwgPyAnVmFsdWUnIDogbmFtZX0gbm90IGRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RPcHRpb25zIHtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdW5oYW5kbGVkRXhjZXB0aW9uVGltZW91dD86IG51bWJlcjtcbiAgc2tpcFJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RDb250ZXh0IHtcbiAgY2F0Y2hVbmhhbmRsZWQgPSB0cnVlO1xuICByZXBvcnQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihjYXRjaFVuaGFuZGxlZD86IGJvb2xlYW4sIHJlcG9ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2F0Y2hVbmhhbmRsZWQgIT09IHVuZGVmaW5lZCkgdGhpcy5jYXRjaFVuaGFuZGxlZCA9IGNhdGNoVW5oYW5kbGVkO1xuICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZCkgdGhpcy5yZXBvcnQgPSByZXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0IHtcbiAgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBUZXN0T3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihjYXRlZ29yeTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8YW55Piwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSB7XG4gICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgb3B0aW9ucy50aW1lb3V0ID8/PSAzMDAwMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMudGVzdCA9IGFzeW5jICgpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRlc3QoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFdmVudDxUPihldmVudDogT2JzZXJ2YWJsZTxUPixcbiAgaGFuZGxlcjogKGFyZ3M6IFQpID0+IHZvaWQsIHRyaWdnZXI6ICgpID0+IHZvaWQsIG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN1YjogU3Vic2NyaXB0aW9uO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHN1YiA9IGV2ZW50LnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcihhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZXNvbHZlKCdPSycpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgfSwgbXMpO1xuICAgIHRyaWdnZXIoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTxhbnk+LCBvcHRpb25zPzogVGVzdE9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMgPSBbXTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyEucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cblxuLyogVGVzdHMgdHdvIG9iamVjdHMgZm9yIGVxdWFsaXR5LCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBlcXVhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3QoYWN0dWFsOiBhbnksIGV4cGVjdGVkOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RGbG9hdChhY3R1YWw6IG51bWJlciwgZXhwZWN0ZWQ6IG51bWJlciwgdG9sZXJhbmNlID0gMC4wMDEpOiB2b2lkIHtcbiAgY29uc3QgYXJlRXF1YWwgPSBNYXRoLmFicyhhY3R1YWwgLSBleHBlY3RlZCkgPCB0b2xlcmFuY2U7XG4gIGlmICghYXJlRXF1YWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfSAodG9sZXJhbmNlID0gJHt0b2xlcmFuY2V9KWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZXhwZWN0ZWQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgZm9yIChjb25zdCBbZXhwZWN0ZWRLZXksIGV4cGVjdGVkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxbZXhwZWN0ZWRLZXldO1xuICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChOdW1iZXIuaXNGaW5pdGUoYWN0dWFsVmFsdWUpICYmIE51bWJlci5pc0Zpbml0ZShleHBlY3RlZFZhbHVlKSlcbiAgICAgIGV4cGVjdEZsb2F0KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWw6IEFycmF5TGlrZTxhbnk+LCBleHBlY3RlZDogQXJyYXlMaWtlPGFueT4pIHtcbiAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgY29uc3QgZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZC5sZW5ndGg7XG5cbiAgaWYgKGFjdHVhbExlbmd0aCAhPSBleHBlY3RlZExlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICBlbHNlIGlmIChhY3R1YWxbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRbaV0gaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICBleHBlY3RPYmplY3QoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSk7XG4gICAgZWxzZSBpZiAoYWN0dWFsW2ldICE9IGV4cGVjdGVkW2ldKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2V4cGVjdGVkW2ldfSBhdCBwb3NpdGlvbiAke2l9LCBnb3QgJHthY3R1YWxbaV19YCk7XG4gIH1cbn1cblxuLyogRGVmaW5lcyBhIHRlc3Qgc3VpdGUuICovXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZywgdGVzdHM6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRlc3RzKCk7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIHRlc3RzIGluIHRoaXMgY2F0ZWdvcnkgYXJlIGV4ZWN1dGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZShiZWZvcmU6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5iZWZvcmUgPSBiZWZvcmU7XG59XG5cbi8qIERlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYWZ0ZXIoYWZ0ZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgaWYgKHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPT0gdW5kZWZpbmVkKVxuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0gPSB7fTtcbiAgdGVzdHNbY3VycmVudENhdGVnb3J5XS5hZnRlciA9IGFmdGVyO1xufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zPzogeyBjYXRlZ29yeT86IHN0cmluZywgdGVzdD86IHN0cmluZywgdGVzdENvbnRleHQ/OiBUZXN0Q29udGV4dCB9KSB7XG4gIGNvbnN0IHJlc3VsdHM6IHsgY2F0ZWdvcnk/OiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfVtdID0gW107XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKT8uZnVuYz8ucGFja2FnZTtcbiAgY29uc29sZS5sb2coYFJ1bm5pbmcgdGVzdHNgKTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIG9wdGlvbnMhLnRlc3RDb250ZXh0ID8/PSBuZXcgVGVzdENvbnRleHQoKTtcbiAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgaWYgKG9wdGlvbnM/LmNhdGVnb3J5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnM/LmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtrZXl9IGNhdGVnb3J5YCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5iZWZvcmUpXG4gICAgICAgIGF3YWl0IHZhbHVlLmJlZm9yZSgpO1xuICAgIH0gY2F0Y2ggKHg6IGFueSkge1xuICAgICAgdmFsdWUuYmVmb3JlU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdmFsdWUudGVzdHMgPz8gW107XG4gICAgY29uc3QgcmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKVxuICAgICAgcmVzLnB1c2goYXdhaXQgZXhlY1Rlc3QodFtpXSwgb3B0aW9ucz8udGVzdCkpO1xuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgYXdhaXQgdmFsdWUuYWZ0ZXIoKTtcbiAgICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICAgIHZhbHVlLmFmdGVyU3RhdHVzID0geC50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5hZnRlclN0YXR1cywgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZX0pO1xuICAgIGlmICh2YWx1ZS5iZWZvcmVTdGF0dXMpXG4gICAgICBkYXRhLnB1c2goe2NhdGVnb3J5OiBrZXksIG5hbWU6ICdpbml0JywgcmVzdWx0OiB2YWx1ZS5iZWZvcmVTdGF0dXMsIHN1Y2Nlc3M6IGZhbHNlLCBtczogMCwgc2tpcHBlZDogZmFsc2V9KTtcbiAgICByZXN1bHRzLnB1c2goLi4uZGF0YSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMudGVzdENvbnRleHQuY2F0Y2hVbmhhbmRsZWQpIHtcbiAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICBpZiAoZ3Jvay5zaGVsbC5sYXN0RXJyb3IubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBERy5Mb2dnZXIoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIuc3VjY2VzcykubGVuZ3RoO1xuICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+ICFyLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJ1BhY2thZ2UgQHBhY2thZ2UgdGVzdGVkOiBAc3VjY2Vzc2Z1bCBzdWNjZXNzZnVsLCBAc2tpcHBlZCBza2lwcGVkLCBAZmFpbGVkIGZhaWxlZCB0ZXN0cyc7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgc3VjY2Vzc2Z1bDogc3VjY2Vzc2Z1bCxcbiAgICAgIHNraXBwZWQ6IHNraXBwZWQsXG4gICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICBwYWNrYWdlOiBwYWNrYWdlTmFtZVxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIGZhaWxlZCkgT2JqZWN0LmFzc2lnbihwYXJhbXMsIHtbYCR7ci5jYXRlZ29yeX0gfCAke3IubmFtZX1gXTogci5yZXN1bHR9KTtcbiAgICBsb2dnZXIubG9nKGRlc2NyaXB0aW9uLCBwYXJhbXMsICdwYWNrYWdlLXRlc3RlZCcpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjVGVzdCh0OiBUZXN0LCBwcmVkaWNhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBsZXQgcjogeyBjYXRlZ29yeT86IHN0cmluZywgbmFtZT86IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIG1zOiBudW1iZXIsIHNraXBwZWQ6IGJvb2xlYW4gfTtcbiAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc2tpcCA9IHQub3B0aW9ucz8uc2tpcFJlYXNvbiB8fCBmaWx0ZXI7XG4gIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiB0Lm9wdGlvbnM/LnNraXBSZWFzb247XG4gIGlmICghc2tpcClcbiAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc2tpcClcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBza2lwUmVhc29uISwgbXM6IDAsIHNraXBwZWQ6IHRydWV9O1xuICAgIGVsc2VcbiAgICAgIHIgPSB7c3VjY2VzczogdHJ1ZSwgcmVzdWx0OiBhd2FpdCB0LnRlc3QoKSA/PyAnT0snLCBtczogMCwgc2tpcHBlZDogZmFsc2V9O1xuICB9IGNhdGNoICh4OiBhbnkpIHtcbiAgICByID0ge3N1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlfTtcbiAgfVxuICBjb25zdCBzdG9wID0gbmV3IERhdGUoKTtcbiAgLy8gQHRzLWlnbm9yZVxuICByLm1zID0gc3RvcCAtIHN0YXJ0O1xuICBpZiAoIXNraXApXG4gICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG5cbiAgci5jYXRlZ29yeSA9IHQuY2F0ZWdvcnk7XG4gIHIubmFtZSA9IHQubmFtZTtcbiAgcmV0dXJuIHI7XG59XG5cbi8qIFdhaXRzIFttc10gbWlsbGlzZWNvbmRzICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcikge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXI6ICgpID0+IGJvb2xlYW4sXG4gIGVycm9yOiBzdHJpbmcgPSAnVGltZW91dCBleGNlZWRlZCcsIHdhaXQ6IG51bWJlciA9IDUwMCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGVycm9yKSk7XG4gICAgfSwgd2FpdCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsOiBUaW1lb3V0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSwgNTApO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlhbG9nUHJlc2VudChkaWFsb2dUaXRsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKCkubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoREcuRGlhbG9nLmdldE9wZW5EaWFsb2dzKClbaV0udGl0bGUgPT0gZGlhbG9nVGl0bGUpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Vmlld2VyKHY6IHN0cmluZywgZGY6IERHLkRhdGFGcmFtZSwgZGV0ZWN0U2VtYW50aWNUeXBlczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkZXRlY3RTZW1hbnRpY1R5cGVzKSBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICBjb25zdCByZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBsZXQgdmlld2VyID0gdHYuYWRkVmlld2VyKHYpO1xuICAgIGF3YWl0IGF3YWl0Q2hlY2soKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgIT09IG51bGwsXG4gICAgICAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIEFycmF5LmZyb20oZGYucm93KDApLmNlbGxzKS5mb3JFYWNoKChjKSA9PiBjLnZhbHVlID0gbnVsbCk7XG4gICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgIGZvciAobGV0IGkgPSA3OyBpIDwgMTI7IGkrKykgZGYuZmlsdGVyLnNldChpLCBmYWxzZSk7XG4gICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgY29uc3QgcHJvcHMgPSB2aWV3ZXIuZ2V0T3B0aW9ucyh0cnVlKS5sb29rO1xuICAgIGNvbnN0IG5ld1Byb3BzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoKGspID0+IHR5cGVvZiBwcm9wc1trXSA9PT0gJ2Jvb2xlYW4nKS5mb3JFYWNoKChrKSA9PiBuZXdQcm9wc1trXSA9ICFwcm9wc1trXSk7XG4gICAgdmlld2VyLnNldE9wdGlvbnMobmV3UHJvcHMpO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgY29uc3QgbGF5b3V0ID0gdHYuc2F2ZUxheW91dCgpO1xuICAgIGNvbnN0IG9sZFByb3BzID0gdmlld2VyLmdldE9wdGlvbnMoKS5sb29rO1xuICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHR2LmxvYWRMYXlvdXQobGF5b3V0KTtcbiAgICBhd2FpdCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLFxuICAgICAgJ2Nhbm5vdCBsb2FkIHZpZXdlciBmcm9tIGxheW91dCcsIDMwMDApO1xuICAgIGF3YWl0IGRlbGF5KDI1MCk7XG4gICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgIHZpZXdlciA9IEFycmF5LmZyb20odHYudmlld2VycykuZmluZCgodikgPT4gdi50eXBlICE9PSAnR3JpZCcpITtcbiAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHZpZXdlci5nZXRPcHRpb25zKCkubG9vayksIEpTT04uc3RyaW5naWZ5KG9sZFByb3BzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgdHYuY2xvc2UoKTtcbiAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICB9XG59XG4iXX0=
351
-
352
- /***/ }),
353
-
354
- /***/ "./src/tests/helm-tests.ts":
355
- /*!*********************************!*\
356
- !*** ./src/tests/helm-tests.ts ***!
357
- \*********************************/
358
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
359
-
360
- __webpack_require__.r(__webpack_exports__);
361
- /* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
362
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ "./src/utils.ts");
363
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
364
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
365
- return new (P || (P = Promise))(function (resolve, reject) {
366
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
367
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
368
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
369
- step((generator = generator.apply(thisArg, _arguments || [])).next());
370
- });
371
- };
372
-
373
-
374
- (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.category)('Helm', () => {
375
- //These tests require webservice that is not present on test stand
376
- // test('helmToFasta', async () => {
377
- // expect(await helmToFasta('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), '>RNA1UTGCA');
378
- // expect(await helmToFasta('RNA1{P.R(U).P.R(T)}$$$$'), '>RNA1UT');
379
- // expect(await helmToFasta('PEPTIDE1{A.G}$$$$V2.0'), '>PEPTIDE1AG');
380
- // });
381
- //
382
- // test('helmToRNA', async () => {
383
- // expect(await helmToRNA('RNA1{R(U)P.R(T)P.R(G)P.R(C)P.R(A)}$$$$'), 'UTGCA');
384
- // expect(await helmToRNA('RNA1{P.R(U).P.R(T)}$$$$'), 'UT');
385
- // // eslint-disable-next-line max-len
386
- // expect(await helmToRNA('RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$'), 'UT AA');
387
- // });
388
- //
389
- // test('helmToPeptide', async () => {
390
- // expect(await helmToPeptide('PEPTIDE1{A.G}$$$$V2.0'), 'AG');
391
- // expect(await helmToPeptide('PEPTIDE1{L.V.A}|PEPTIDE2{L.V.A}$$$$'), 'LVA LVA');
392
- // // eslint-disable-next-line max-len
393
- // expect(await helmToPeptide('PEPTIDE1{A.R.C.A.A.K.T.C.D.A}$PEPTIDE1,PEPTIDE1,8:R3-3:R3$$$'), 'ARCAAKTCDA');
394
- // });
395
- // detectMacromolecule is a function of Bio package
396
- // test('detectMacromolecule', async () => {
397
- // const file = await _package.files.readAsText('tests/test.csv');
398
- // const df = DG.DataFrame.fromCsv(file);
399
- // const col = df.columns.byName('HELM string');
400
- // await grok.data.detectSemanticTypes(df);
401
- // expect(col.semType, DG.SEMTYPE.MACROMOLECULE);
402
- // });
403
- // semType and units tags are detecting by Bio package function detectMacromolecule
404
- // test('detectHelm', async () => {
405
- // const file = await _package.files.readAsText('tests/test.csv');
406
- // const df = DG.DataFrame.fromCsv(file);
407
- // const col = df.columns.byName('HELM string');
408
- // await grok.data.detectSemanticTypes(df);
409
- // expect(col.tags[DG.TAGS.UNITS], 'HELM');
410
- // });
411
- (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.test)('parseHelm', () => __awaiter(void 0, void 0, void 0, function* () {
412
- const expectedResults = [
413
- ['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],
414
- ['A', 'C', 'T', 'G', 'W', 'E', 'Q'],
415
- ['R', 'U', 'P', 'T', 'A'],
416
- ['A', '*', 'G', 'C']
417
- ];
418
- const helmStrings = [
419
- 'PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$',
420
- 'PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$',
421
- 'RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$',
422
- 'PEPTIDE1{A.*.G.C}$$$$V2.0'
423
- ];
424
- for (let idx = 0; idx < helmStrings.length; ++idx) {
425
- let monomerSet = new Set((0,_utils__WEBPACK_IMPORTED_MODULE_1__.parseHelm)(helmStrings[idx]));
426
- let monomerArray = Array.from(monomerSet);
427
- (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_0__.expect)(JSON.stringify(monomerArray), JSON.stringify(expectedResults[idx]));
428
- }
429
- }));
430
- });
431
-
432
-
433
- /***/ }),
434
-
435
- /***/ "./src/utils.ts":
436
- /*!**********************!*\
437
- !*** ./src/utils.ts ***!
438
- \**********************/
439
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
440
-
441
- __webpack_require__.r(__webpack_exports__);
442
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
443
- /* harmony export */ "findMonomers": () => (/* binding */ findMonomers),
444
- /* harmony export */ "getParts": () => (/* binding */ getParts),
445
- /* harmony export */ "parseHelm": () => (/* binding */ parseHelm)
446
- /* harmony export */ });
447
- function getParts(subParts, s) {
448
- let j = 0;
449
- let allParts = [];
450
- for (let k = 0; k < subParts.length; ++k) {
451
- let indexOfMonomer = s.indexOf(subParts[k]);
452
- let helmBeforeMonomer = s.slice(j, indexOfMonomer);
453
- allParts.push(helmBeforeMonomer);
454
- allParts.push(subParts[k]);
455
- s = s.substring(indexOfMonomer + subParts[k].length);
456
- }
457
- allParts.push(s);
458
- return allParts;
459
- }
460
- function parseHelm(s) {
461
- var sections = split(s, '$');
462
- s = sections[0];
463
- var monomers = [];
464
- //@ts-ignore
465
- if (!scil.Utils.isNullOrEmpty(s)) {
466
- var seqs = split(s, '|');
467
- for (var i = 0; i < seqs.length; ++i) {
468
- var e = detachAnnotation(seqs[i]);
469
- s = e.str;
470
- var p = s.indexOf('{');
471
- s = s.substring(p + 1);
472
- p = s.indexOf('}');
473
- s = s.substring(0, p);
474
- var ss = split(s, '.');
475
- for (var monomer of ss) {
476
- if (monomer.includes('(') && monomer.includes(')')) {
477
- var elements = monomer.replace(/[()]/g, '').split('');
478
- for (var el of elements) {
479
- monomers.push(el);
480
- }
481
- }
482
- else if (monomer.includes('[') && monomer.includes(']')) {
483
- var element = monomer.match(/(?<=\[).*?(?=\])/g, '');
484
- monomers.push(element[0]);
485
- }
486
- else {
487
- monomers.push(monomer);
488
- }
489
- }
490
- }
491
- }
492
- return monomers;
493
- }
494
- function findMonomers(helmString) {
495
- //@ts-ignore
496
- const types = Object.keys(org.helm.webeditor.monomerTypeList());
497
- const monomers = [];
498
- const monomer_names = [];
499
- for (var i = 0; i < types.length; i++) {
500
- //@ts-ignore
501
- monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));
502
- Object.keys(monomers[i]).forEach(k => {
503
- monomer_names.push(monomers[i][k].id);
504
- });
505
- }
506
- const split_string = parseHelm(helmString);
507
- return new Set(split_string.filter(val => !monomer_names.includes(val)));
508
- }
509
- function split(s, sep) {
510
- var ret = [];
511
- var frag = '';
512
- var parentheses = 0;
513
- var bracket = 0;
514
- var braces = 0;
515
- var quote = 0;
516
- for (var i = 0; i < s.length; ++i) {
517
- var c = s.substring(i, i + 1);
518
- if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {
519
- ret.push(frag);
520
- frag = '';
521
- }
522
- else {
523
- frag += c;
524
- if (quote > 0) {
525
- if (c == '\\' && i + 1 < s.length) {
526
- ++i;
527
- var c2 = s.substring(i, i + 1);
528
- frag += c2;
529
- c += c2;
530
- }
531
- }
532
- if (c == '\"') {
533
- if (!(i > 0 && s.substring(i - 1, i) == '\\'))
534
- quote = quote == 0 ? 1 : 0;
535
- }
536
- else if (c == '[')
537
- ++bracket;
538
- else if (c == ']')
539
- --bracket;
540
- else if (c == '(')
541
- ++parentheses;
542
- else if (c == ')')
543
- --parentheses;
544
- else if (c == '{')
545
- ++braces;
546
- else if (c == '}')
547
- --braces;
548
- }
549
- }
550
- ret.push(frag);
551
- return ret;
552
- }
553
- function detachAnnotation(s) {
554
- var ret = _detachAppendix(s, '\"');
555
- if (ret.tag != null)
556
- return ret;
557
- var r = _detachAppendix(s, '\'');
558
- return { tag: ret.tag, repeat: r.tag, str: r.str };
559
- }
560
- function _detachAppendix(s, c) {
561
- var tag = null;
562
- //@ts-ignore
563
- if (scil.Utils.endswith(s, c)) {
564
- var p = s.length - 1;
565
- while (p > 0) {
566
- p = s.lastIndexOf(c, p - 1);
567
- if (p <= 0 || s.substring(p - 1, p) != '\\')
568
- break;
569
- }
570
- if (p > 0 && p < s.length - 1) {
571
- tag = s.substring(p + 1, s.length - 1);
572
- s = s.substring(0, p);
573
- }
574
- }
575
- if (tag != null)
576
- tag = tag.replace(new RegExp('\\' + c, 'g'), c);
577
- return { tag: unescape(tag), str: s };
578
- }
579
- function unescape(s) {
580
- //@ts-ignore
581
- if (scil.Utils.isNullOrEmpty(s))
582
- return s;
583
- return s.replace(/[\\]./g, function (m) {
584
- switch (m) {
585
- case '\\r':
586
- return '\r';
587
- case '\\n':
588
- return '\n';
589
- case '\\t':
590
- return '\t';
591
- default:
592
- return m.substring(1);
593
- }
594
- });
595
- }
596
-
597
-
598
- /***/ }),
599
-
600
- /***/ "datagrok-api/dg":
601
- /*!*********************!*\
602
- !*** external "DG" ***!
603
- \*********************/
604
- /***/ ((module) => {
605
-
606
- module.exports = DG;
607
-
608
- /***/ }),
609
-
610
- /***/ "datagrok-api/grok":
611
- /*!***********************!*\
612
- !*** external "grok" ***!
613
- \***********************/
614
- /***/ ((module) => {
615
-
616
- module.exports = grok;
617
-
618
- /***/ })
619
-
620
- /******/ });
621
- /************************************************************************/
622
- /******/ // The module cache
623
- /******/ var __webpack_module_cache__ = {};
624
- /******/
625
- /******/ // The require function
626
- /******/ function __webpack_require__(moduleId) {
627
- /******/ // Check if module is in cache
628
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
629
- /******/ if (cachedModule !== undefined) {
630
- /******/ return cachedModule.exports;
631
- /******/ }
632
- /******/ // Create a new module (and put it into the cache)
633
- /******/ var module = __webpack_module_cache__[moduleId] = {
634
- /******/ // no module.id needed
635
- /******/ // no module.loaded needed
636
- /******/ exports: {}
637
- /******/ };
638
- /******/
639
- /******/ // Execute the module function
640
- /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
641
- /******/
642
- /******/ // Return the exports of the module
643
- /******/ return module.exports;
644
- /******/ }
645
- /******/
646
- /************************************************************************/
647
- /******/ /* webpack/runtime/compat get default export */
648
- /******/ (() => {
649
- /******/ // getDefaultExport function for compatibility with non-harmony modules
650
- /******/ __webpack_require__.n = (module) => {
651
- /******/ var getter = module && module.__esModule ?
652
- /******/ () => (module['default']) :
653
- /******/ () => (module);
654
- /******/ __webpack_require__.d(getter, { a: getter });
655
- /******/ return getter;
656
- /******/ };
657
- /******/ })();
658
- /******/
659
- /******/ /* webpack/runtime/define property getters */
660
- /******/ (() => {
661
- /******/ // define getter functions for harmony exports
662
- /******/ __webpack_require__.d = (exports, definition) => {
663
- /******/ for(var key in definition) {
664
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
665
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
666
- /******/ }
667
- /******/ }
668
- /******/ };
669
- /******/ })();
670
- /******/
671
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
672
- /******/ (() => {
673
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
674
- /******/ })();
675
- /******/
676
- /******/ /* webpack/runtime/make namespace object */
677
- /******/ (() => {
678
- /******/ // define __esModule on exports
679
- /******/ __webpack_require__.r = (exports) => {
680
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
681
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
682
- /******/ }
683
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
684
- /******/ };
685
- /******/ })();
686
- /******/
687
- /************************************************************************/
688
- var __webpack_exports__ = {};
689
- // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
690
- (() => {
691
- /*!*****************************!*\
692
- !*** ./src/package-test.ts ***!
693
- \*****************************/
694
- __webpack_require__.r(__webpack_exports__);
695
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
696
- /* harmony export */ "_package": () => (/* binding */ _package),
697
- /* harmony export */ "test": () => (/* binding */ test),
698
- /* harmony export */ "tests": () => (/* reexport safe */ _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.tests)
699
- /* harmony export */ });
700
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
701
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
702
- /* harmony import */ var _datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @datagrok-libraries/utils/src/test */ "./node_modules/@datagrok-libraries/utils/src/test.js");
703
- /* harmony import */ var _tests_helm_tests_ts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tests/helm-tests.ts */ "./src/tests/helm-tests.ts");
704
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
705
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
706
- return new (P || (P = Promise))(function (resolve, reject) {
707
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
708
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
709
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
710
- step((generator = generator.apply(thisArg, _arguments || [])).next());
711
- });
712
- };
713
-
714
-
715
-
716
- const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Package();
717
-
718
- //name: test
719
- //input: string category {optional: true}
720
- //input: string test {optional: true}
721
- //input: object testContext {optional: true}
722
- //output: dataframe result
723
- function test(category, test, testContext) {
724
- return __awaiter(this, void 0, void 0, function* () {
725
- const data = yield (0,_datagrok_libraries_utils_src_test__WEBPACK_IMPORTED_MODULE_1__.runTests)({ category, test, testContext });
726
- return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.DataFrame.fromObjects(data);
727
- });
728
- }
729
-
730
- })();
731
-
732
- helm_test = __webpack_exports__;
733
- /******/ })()
734
- ;
735
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFJLFNBQUk7QUFDN0IsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDc0M7QUFDK0I7QUFDdEM7QUFDeEIscUJBQXFCLG9EQUFVO0FBQ3JCO0FBQ2pCO0FBQ0EsMEJBQTBCO0FBQzFCLHNCQUFzQjtBQUN0Qiw2QkFBNkI7QUFDN0I7QUFDTztBQUNQO0FBQ0EsMkJBQTJCLDRFQUFRLEdBQUcsNkJBQTZCO0FBQ25FLGVBQWUsa0VBQXdCO0FBQ3ZDLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdC5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL3Rlc3RzL2hlbG0tdGVzdHMudHMiLCJ3ZWJwYWNrOi8vaGVsbS8uL3NyYy91dGlscy50cyIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcIkRHXCIiLCJ3ZWJwYWNrOi8vaGVsbS9leHRlcm5hbCB2YXIgXCJncm9rXCIiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2hlbG0vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2hlbG0vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vaGVsbS8uL3NyYy9wYWNrYWdlLXRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5leHBvcnQgY29uc3QgdGVzdHMgPSB7fTtcbmV4cG9ydCBsZXQgY3VycmVudENhdGVnb3J5O1xuZXhwb3J0IHZhciBhc3N1cmU7XG4oZnVuY3Rpb24gKGFzc3VyZSkge1xuICAgIGZ1bmN0aW9uIG5vdE51bGwodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZSA9PSBudWxsID8gJ1ZhbHVlJyA6IG5hbWV9IG5vdCBkZWZpbmVkYCk7XG4gICAgfVxuICAgIGFzc3VyZS5ub3ROdWxsID0gbm90TnVsbDtcbn0pKGFzc3VyZSB8fCAoYXNzdXJlID0ge30pKTtcbmV4cG9ydCBjbGFzcyBUZXN0Q29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoY2F0Y2hVbmhhbmRsZWQsIHJlcG9ydCkge1xuICAgICAgICB0aGlzLmNhdGNoVW5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZXBvcnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGNhdGNoVW5oYW5kbGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLmNhdGNoVW5oYW5kbGVkID0gY2F0Y2hVbmhhbmRsZWQ7XG4gICAgICAgIGlmIChyZXBvcnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMucmVwb3J0ID0gcmVwb3J0O1xuICAgIH1cbiAgICA7XG59XG5leHBvcnQgY2xhc3MgVGVzdCB7XG4gICAgY29uc3RydWN0b3IoY2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IChvcHRpb25zID0ge30pO1xuICAgICAgICAoX2EgPSBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChvcHRpb25zLnRpbWVvdXQgPSAzMDAwMCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudGVzdCA9ICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIHRlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RXZlbnQoZXZlbnQsIGhhbmRsZXIsIHRyaWdnZXIsIG1zID0gMCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBzdWI7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdWIgPSBldmVudC5zdWJzY3JpYmUoKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoJ09LJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICB9LCBtcyk7XG4gICAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QobmFtZSwgdGVzdCwgb3B0aW9ucykge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldLnRlc3RzID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XS50ZXN0cyA9IFtdO1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0udGVzdHMucHVzaChuZXcgVGVzdChjdXJyZW50Q2F0ZWdvcnksIG5hbWUsIHRlc3QsIG9wdGlvbnMpKTtcbn1cbi8qIFRlc3RzIHR3byBvYmplY3RzIGZvciBlcXVhbGl0eSwgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBub3QgZXF1YWwuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0KGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBcIiR7ZXhwZWN0ZWR9XCIsIGdvdCBcIiR7YWN0dWFsfVwiYCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0RmxvYXQoYWN0dWFsLCBleHBlY3RlZCwgdG9sZXJhbmNlID0gMC4wMDEpIHtcbiAgICBjb25zdCBhcmVFcXVhbCA9IE1hdGguYWJzKGFjdHVhbCAtIGV4cGVjdGVkKSA8IHRvbGVyYW5jZTtcbiAgICBpZiAoIWFyZUVxdWFsKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWR9LCBnb3QgJHthY3R1YWx9ICh0b2xlcmFuY2UgPSAke3RvbGVyYW5jZX0pYCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwZWN0T2JqZWN0KGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICBmb3IgKGNvbnN0IFtleHBlY3RlZEtleSwgZXhwZWN0ZWRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgICAgIGlmICghYWN0dWFsLmhhc093blByb3BlcnR5KGV4cGVjdGVkS2V5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcHJvcGVydHkgXCIke2V4cGVjdGVkS2V5fVwiIG5vdCBmb3VuZGApO1xuICAgICAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGFjdHVhbFtleHBlY3RlZEtleV07XG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgIGV4cGVjdEFycmF5KGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAoYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgICAgIGV4cGVjdE9iamVjdChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7XG4gICAgICAgIGVsc2UgaWYgKE51bWJlci5pc0Zpbml0ZShhY3R1YWxWYWx1ZSkgJiYgTnVtYmVyLmlzRmluaXRlKGV4cGVjdGVkVmFsdWUpKVxuICAgICAgICAgICAgZXhwZWN0RmxvYXQoYWN0dWFsVmFsdWUsIGV4cGVjdGVkVmFsdWUpO1xuICAgICAgICBlbHNlIGlmIChhY3R1YWxWYWx1ZSAhPSBleHBlY3RlZFZhbHVlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAoJHtleHBlY3RlZFZhbHVlfSkgZm9yIGtleSAnJHtleHBlY3RlZEtleX0nLCBnb3QgKCR7YWN0dWFsVmFsdWV9KWApO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBlY3RBcnJheShhY3R1YWwsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgYWN0dWFsTGVuZ3RoID0gYWN0dWFsLmxlbmd0aDtcbiAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICBpZiAoYWN0dWFsTGVuZ3RoICE9IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXJyYXlzIGFyZSBvZiBkaWZmZXJlbnQgbGVuZ3RoOiBhY3R1YWwgYXJyYXkgbGVuZ3RoIGlzICR7YWN0dWFsTGVuZ3RofSBgICtcbiAgICAgICAgICAgIGBhbmQgZXhwZWN0ZWQgYXJyYXkgbGVuZ3RoIGlzICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFjdHVhbFtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgQXJyYXkpXG4gICAgICAgICAgICBleHBlY3RBcnJheShhY3R1YWxbaV0sIGV4cGVjdGVkW2ldKTtcbiAgICAgICAgZWxzZSBpZiAoYWN0dWFsW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGV4cGVjdGVkW2ldIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICAgICAgZXhwZWN0T2JqZWN0KGFjdHVhbFtpXSwgZXhwZWN0ZWRbaV0pO1xuICAgICAgICBlbHNlIGlmIChhY3R1YWxbaV0gIT0gZXhwZWN0ZWRbaV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZXhwZWN0ZWRbaV19IGF0IHBvc2l0aW9uICR7aX0sIGdvdCAke2FjdHVhbFtpXX1gKTtcbiAgICB9XG59XG4vKiBEZWZpbmVzIGEgdGVzdCBzdWl0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yeShjYXRlZ29yeSwgdGVzdHMpIHtcbiAgICBjdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTtcbiAgICB0ZXN0cygpO1xufVxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgdGVzdHMgaW4gdGhpcyBjYXRlZ29yeSBhcmUgZXhlY3V0ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlKGJlZm9yZSkge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYmVmb3JlID0gYmVmb3JlO1xufVxuLyogRGVmaW5lcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0ZXN0cyBpbiB0aGlzIGNhdGVnb3J5IGFyZSBleGVjdXRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZnRlcihhZnRlcikge1xuICAgIGlmICh0ZXN0c1tjdXJyZW50Q2F0ZWdvcnldID09IHVuZGVmaW5lZClcbiAgICAgICAgdGVzdHNbY3VycmVudENhdGVnb3J5XSA9IHt9O1xuICAgIHRlc3RzW2N1cnJlbnRDYXRlZ29yeV0uYWZ0ZXIgPSBhZnRlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBydW5UZXN0cyhvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIHZhciBfZTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gKF9iID0gKF9hID0gZ3Jvay5mdW5jdGlvbnMuZ2V0Q3VycmVudENhbGwoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZ1bmMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYWNrYWdlO1xuICAgICAgICBjb25zb2xlLmxvZyhgUnVubmluZyB0ZXN0c2ApO1xuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiAob3B0aW9ucyA9IHt9KTtcbiAgICAgICAgKF9jID0gKF9lID0gb3B0aW9ucykudGVzdENvbnRleHQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IChfZS50ZXN0Q29udGV4dCA9IG5ldyBUZXN0Q29udGV4dCgpKTtcbiAgICAgICAgZ3Jvay5zaGVsbC5sYXN0RXJyb3IgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGVzdHMpKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeSkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke2tleX0gY2F0ZWdvcnlgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYmVmb3JlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmJlZm9yZVN0YXR1cyA9IHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHQgPSAoX2QgPSB2YWx1ZS50ZXN0cykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW107XG4gICAgICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICByZXMucHVzaCh5aWVsZCBleGVjVGVzdCh0W2ldLCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGVzdCkpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9ICh5aWVsZCBQcm9taXNlLmFsbChyZXMpKS5maWx0ZXIoKGQpID0+IGQucmVzdWx0ICE9ICdza2lwcGVkJyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5hZnRlcilcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWUuYWZ0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuYWZ0ZXJTdGF0dXMgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuYWZ0ZXJTdGF0dXMpXG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKHsgY2F0ZWdvcnk6IGtleSwgbmFtZTogJ2luaXQnLCByZXN1bHQ6IHZhbHVlLmFmdGVyU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmJlZm9yZVN0YXR1cylcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goeyBjYXRlZ29yeToga2V5LCBuYW1lOiAnaW5pdCcsIHJlc3VsdDogdmFsdWUuYmVmb3JlU3RhdHVzLCBzdWNjZXNzOiBmYWxzZSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LmNhdGNoVW5oYW5kbGVkKSB7XG4gICAgICAgICAgICB5aWVsZCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgIGlmIChncm9rLnNoZWxsLmxhc3RFcnJvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdVbmhhbmRsZWQgZXhjZXB0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdleGNlcHRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBncm9rLnNoZWxsLmxhc3RFcnJvciwgc3VjY2VzczogZmFsc2UsIG1zOiAwLCBza2lwcGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnRlc3RDb250ZXh0LnJlcG9ydCkge1xuICAgICAgICAgICAgY29uc3QgbG9nZ2VyID0gbmV3IERHLkxvZ2dlcigpO1xuICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLnN1Y2Nlc3MpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5za2lwcGVkKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBmYWlsZWQgPSByZXN1bHRzLmZpbHRlcigocikgPT4gIXIuc3VjY2Vzcyk7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICdQYWNrYWdlIEBwYWNrYWdlIHRlc3RlZDogQHN1Y2Nlc3NmdWwgc3VjY2Vzc2Z1bCwgQHNraXBwZWQgc2tpcHBlZCwgQGZhaWxlZCBmYWlsZWQgdGVzdHMnO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWw6IHN1Y2Nlc3NmdWwsXG4gICAgICAgICAgICAgICAgc2tpcHBlZDogc2tpcHBlZCxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IGZhaWxlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcGFja2FnZTogcGFja2FnZU5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgZmFpbGVkKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IFtgJHtyLmNhdGVnb3J5fSB8ICR7ci5uYW1lfWBdOiByLnJlc3VsdCB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5sb2coZGVzY3JpcHRpb24sIHBhcmFtcywgJ3BhY2thZ2UtdGVzdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBleGVjVGVzdCh0LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcjtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcHJlZGljYXRlICE9IHVuZGVmaW5lZCAmJiAoIXQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgocHJlZGljYXRlLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgY29uc3Qgc2tpcCA9ICgoX2EgPSB0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5za2lwUmVhc29uKSB8fCBmaWx0ZXI7XG4gICAgICAgIGNvbnN0IHNraXBSZWFzb24gPSBmaWx0ZXIgPyAnc2tpcHBlZCcgOiAoX2IgPSB0Lm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5za2lwUmVhc29uO1xuICAgICAgICBpZiAoIXNraXApXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRlZCAke3QuY2F0ZWdvcnl9ICR7dC5uYW1lfWApO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2tpcClcbiAgICAgICAgICAgICAgICByID0geyBzdWNjZXNzOiB0cnVlLCByZXN1bHQ6IHNraXBSZWFzb24sIG1zOiAwLCBza2lwcGVkOiB0cnVlIH07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgciA9IHsgc3VjY2VzczogdHJ1ZSwgcmVzdWx0OiAoX2MgPSB5aWVsZCB0LnRlc3QoKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJ09LJywgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHIgPSB7IHN1Y2Nlc3M6IGZhbHNlLCByZXN1bHQ6IHgudG9TdHJpbmcoKSwgbXM6IDAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RvcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgci5tcyA9IHN0b3AgLSBzdGFydDtcbiAgICAgICAgaWYgKCFza2lwKVxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkICR7dC5jYXRlZ29yeX0gJHt0Lm5hbWV9IGZvciAke3IubXN9IG1zYCk7XG4gICAgICAgIHIuY2F0ZWdvcnkgPSB0LmNhdGVnb3J5O1xuICAgICAgICByLm5hbWUgPSB0Lm5hbWU7XG4gICAgICAgIHJldHVybiByO1xuICAgIH0pO1xufVxuLyogV2FpdHMgW21zXSBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxheShtcykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXdhaXRDaGVjayhjaGVja0hhbmRsZXIsIGVycm9yID0gJ1RpbWVvdXQgZXhjZWVkZWQnLCB3YWl0ID0gNTAwKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgIH0sIHdhaXQpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrSGFuZGxlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RpYWxvZ1ByZXNlbnQoZGlhbG9nVGl0bGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERHLkRpYWxvZy5nZXRPcGVuRGlhbG9ncygpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChERy5EaWFsb2cuZ2V0T3BlbkRpYWxvZ3MoKVtpXS50aXRsZSA9PSBkaWFsb2dUaXRsZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gdGVzdFZpZXdlcih2LCBkZiwgZGV0ZWN0U2VtYW50aWNUeXBlcyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGRldGVjdFNlbWFudGljVHlwZXMpXG4gICAgICAgICAgICB5aWVsZCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgICAgIGNvbnN0IHR2ID0gZ3Jvay5zaGVsbC5hZGRUYWJsZVZpZXcoZGYpO1xuICAgICAgICBjb25zdCB2aWV3ZXJOYW1lID0gYFtuYW1lPXZpZXdlci0ke3YucmVwbGFjZSgvXFxzKy9nLCAnLScpfSBpXWA7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYCR7dmlld2VyTmFtZX0gY2FudmFzLCR7dmlld2VyTmFtZX0gc3ZnLCR7dmlld2VyTmFtZX0gaW1nLFxuICAgICR7dmlld2VyTmFtZX0gaW5wdXQsJHt2aWV3ZXJOYW1lfSBoMSwke3ZpZXdlck5hbWV9IGFgO1xuICAgICAgICBjb25zdCByZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCB2aWV3ZXIgPSB0di5hZGRWaWV3ZXIodik7XG4gICAgICAgICAgICB5aWVsZCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLCAnY2Fubm90IGxvYWQgdmlld2VyJywgMzAwMCk7XG4gICAgICAgICAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGRmLnJvdygwKS5jZWxscykuZm9yRWFjaCgoYykgPT4gYy52YWx1ZSA9IG51bGwpO1xuICAgICAgICAgICAgZGYucm93cy5zZWxlY3QoKHJvdykgPT4gcm93LmlkeCA+IDEgJiYgcm93LmlkeCA8IDcpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDc7IGkgPCAxMjsgaSsrKVxuICAgICAgICAgICAgICAgIGRmLmZpbHRlci5zZXQoaSwgZmFsc2UpO1xuICAgICAgICAgICAgZGYuY3VycmVudFJvd0lkeCA9IDE7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKHRydWUpLmxvb2s7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm9wcyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoaykgPT4gdHlwZW9mIHByb3BzW2tdID09PSAnYm9vbGVhbicpLmZvckVhY2goKGspID0+IG5ld1Byb3BzW2tdID0gIXByb3BzW2tdKTtcbiAgICAgICAgICAgIHZpZXdlci5zZXRPcHRpb25zKG5ld1Byb3BzKTtcbiAgICAgICAgICAgIHlpZWxkIGRlbGF5KDI1MCk7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0di5zYXZlTGF5b3V0KCk7XG4gICAgICAgICAgICBjb25zdCBvbGRQcm9wcyA9IHZpZXdlci5nZXRPcHRpb25zKCkubG9vaztcbiAgICAgICAgICAgIHR2LnJlc2V0TGF5b3V0KCk7XG4gICAgICAgICAgICByZXMucHVzaChBcnJheS5mcm9tKHR2LnZpZXdlcnMpLmxlbmd0aCk7XG4gICAgICAgICAgICB0di5sb2FkTGF5b3V0KGxheW91dCk7XG4gICAgICAgICAgICB5aWVsZCBhd2FpdENoZWNrKCgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9PSBudWxsLCAnY2Fubm90IGxvYWQgdmlld2VyIGZyb20gbGF5b3V0JywgMzAwMCk7XG4gICAgICAgICAgICB5aWVsZCBkZWxheSgyNTApO1xuICAgICAgICAgICAgcmVzLnB1c2goQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5sZW5ndGgpO1xuICAgICAgICAgICAgdmlld2VyID0gQXJyYXkuZnJvbSh0di52aWV3ZXJzKS5maW5kKCh2KSA9PiB2LnR5cGUgIT09ICdHcmlkJyk7XG4gICAgICAgICAgICBleHBlY3RBcnJheShyZXMsIFsyLCAxLCAyXSk7XG4gICAgICAgICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkodmlld2VyLmdldE9wdGlvbnMoKS5sb29rKSwgSlNPTi5zdHJpbmdpZnkob2xkUHJvcHMpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHR2LmNsb3NlKCk7XG4gICAgICAgICAgICBncm9rLnNoZWxsLmNsb3NlVGFibGUoZGYpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkR1Z6ZEM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblJsYzNRdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08wRkJRVUVzVDBGQlR5eExRVUZMTEVsQlFVa3NUVUZCVFN4dFFrRkJiVUlzUTBGQlF6dEJRVU14UXl4UFFVRlBMRXRCUVVzc1JVRkJSU3hOUVVGTkxHbENRVUZwUWl4RFFVRkRPMEZCU1hSRExFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NSMEZMWkN4RlFVRkZMRU5CUVVNN1FVRkZVQ3hOUVVGTkxFTkJRVU1zU1VGQlNTeGxRVUYxUWl4RFFVRkRPMEZCUlc1RExFMUJRVTBzUzBGQlZ5eE5RVUZOTEVOQlRYUkNPMEZCVGtRc1YwRkJhVUlzVFVGQlRUdEpRVVZ5UWl4VFFVRm5RaXhQUVVGUExFTkJRVU1zUzBGQlZTeEZRVUZGTEVsQlFXRTdVVUZETDBNc1NVRkJTU3hMUVVGTExFbEJRVWtzU1VGQlNUdFpRVU5tTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc1IwRkJSeXhKUVVGSkxFbEJRVWtzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzWTBGQll5eERRVUZETEVOQlFVTTdTVUZEY0VVc1EwRkJRenRKUVVobExHTkJRVThzVlVGSGRFSXNRMEZCUVR0QlFVTklMRU5CUVVNc1JVRk9aMElzVFVGQlRTeExRVUZPTEUxQlFVMHNVVUZOZEVJN1FVRlJSQ3hOUVVGTkxFOUJRVThzVjBGQlZ6dEpRVWwwUWl4WlFVRlpMR05CUVhkQ0xFVkJRVVVzVFVGQlowSTdVVUZJZEVRc2JVSkJRV01zUjBGQlJ5eEpRVUZKTEVOQlFVTTdVVUZEZEVJc1YwRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF6dFJRVWRpTEVsQlFVa3NZMEZCWXl4TFFVRkxMRk5CUVZNN1dVRkJSU3hKUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEdOQlFXTXNRMEZCUXp0UlFVTjJSU3hKUVVGSkxFMUJRVTBzUzBGQlN5eFRRVUZUTzFsQlFVVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03U1VGRGFrUXNRMEZCUXp0SlFVRkJMRU5CUVVNN1EwRkRTRHRCUVVWRUxFMUJRVTBzVDBGQlR5eEpRVUZKTzBsQlRXWXNXVUZCV1N4UlFVRm5RaXhGUVVGRkxFbEJRVmtzUlVGQlJTeEpRVUYzUWl4RlFVRkZMRTlCUVhGQ096dFJRVU42Uml4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF6dFJRVU42UWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF6dFJRVU5xUWl4UFFVRlBMR0ZCUVZBc1QwRkJUeXhqUVVGUUxFOUJRVThzU1VGQlVDeFBRVUZQTEVkQlFVc3NSVUZCUlN4RlFVRkRPMUZCUTJZc1RVRkJRU3hQUVVGUExFTkJRVU1zVDBGQlR5eHZRMEZCWml4UFFVRlBMRU5CUVVNc1QwRkJUeXhIUVVGTExFdEJRVXNzUlVGQlF6dFJRVU14UWl4SlFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF6dFJRVU4yUWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFZEJRWFZDTEVWQlFVVTdXVUZEYmtNc1QwRkJUeXhKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZQTEU5QlFVOHNSVUZCUlN4TlFVRk5MRVZCUVVVc1JVRkJSVHRuUWtGRE0wTXNTVUZCU1N4TlFVRk5MRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU5vUWl4SlFVRkpPMjlDUVVOR0xFMUJRVTBzUjBGQlJ5eE5RVUZOTEVsQlFVa3NSVUZCUlN4RFFVRkRPMmxDUVVOMlFqdG5Ra0ZCUXl4UFFVRlBMRU5CUVUwc1JVRkJSVHR2UWtGRFppeE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2FVSkJRMWc3WjBKQlEwUXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xbEJRMnhDTEVOQlFVTXNRMEZCUVN4RFFVRkRMRU5CUVVNN1VVRkRUQ3hEUVVGRExFTkJRVUVzUTBGQlF6dEpRVU5LTEVOQlFVTTdRMEZEUmp0QlFVVkVMRTFCUVUwc1ZVRkJaMElzVTBGQlV5eERRVUZKTEV0QlFXOUNMRVZCUTNKRUxFOUJRVEJDTEVWQlFVVXNUMEZCYlVJc1JVRkJSU3hMUVVGaExFTkJRVU03TzFGQlF5OUVMRWxCUVVrc1IwRkJhVUlzUTBGQlF6dFJRVU4wUWl4UFFVRlBMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zVDBGQlR5eEZRVUZGTEUxQlFVMHNSVUZCUlN4RlFVRkZPMWxCUTNKRExFZEJRVWNzUjBGQlJ5eExRVUZMTEVOQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFVkJRVVU3WjBKQlF6ZENMRWxCUVVrN2IwSkJRMFlzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMmxDUVVObU8yZENRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZPMjlDUVVOV0xFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0cFFrRkRXRHRuUWtGRFJDeEhRVUZITEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNN1owSkJRMnhDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRaUVVOb1FpeERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTklMRlZCUVZVc1EwRkJReXhIUVVGSExFVkJRVVU3WjBKQlEyUXNSMEZCUnl4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8yZENRVU5zUWl4M1JFRkJkMFE3WjBKQlEzaEVMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFpRVU53UWl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03V1VGRFVDeFBRVUZQTEVWQlFVVXNRMEZCUXp0UlFVTmFMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRMHdzUTBGQlF6dERRVUZCTzBGQlJVUXNUVUZCVFN4VlFVRlZMRWxCUVVrc1EwRkJReXhKUVVGWkxFVkJRVVVzU1VGQmQwSXNSVUZCUlN4UFFVRnhRanRKUVVOb1JpeEpRVUZKTEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1NVRkJTU3hUUVVGVE8xRkJRM0pETEV0QlFVc3NRMEZCUXl4bFFVRmxMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRE9VSXNTVUZCU1N4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUzBGQlN5eEpRVUZKTEZOQlFWTTdVVUZETTBNc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETEV0QlFVc3NSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRjRU1zUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRXRCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRWxCUVVrc1JVRkJSU3hKUVVGSkxFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnlSaXhEUVVGRE8wRkJSVVFzWjBaQlFXZEdPMEZCUTJoR0xFMUJRVTBzVlVGQlZTeE5RVUZOTEVOQlFVTXNUVUZCVnl4RlFVRkZMRkZCUVdFN1NVRkRMME1zU1VGQlNTeE5RVUZOTEV0QlFVc3NVVUZCVVR0UlFVTnlRaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEdGQlFXRXNVVUZCVVN4WFFVRlhMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGREwwUXNRMEZCUXp0QlFVVkVMRTFCUVUwc1ZVRkJWU3hYUVVGWExFTkJRVU1zVFVGQll5eEZRVUZGTEZGQlFXZENMRVZCUVVVc1UwRkJVeXhIUVVGSExFdEJRVXM3U1VGRE4wVXNUVUZCVFN4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eE5RVUZOTEVkQlFVY3NVVUZCVVN4RFFVRkRMRWRCUVVjc1UwRkJVeXhEUVVGRE8wbEJRM3BFTEVsQlFVa3NRMEZCUXl4UlFVRlJPMUZCUTFnc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTEZGQlFWRXNVMEZCVXl4TlFVRk5MR2xDUVVGcFFpeFRRVUZUTEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTNSR0xFTkJRVU03UVVGRlJDeE5RVUZOTEZWQlFWVXNXVUZCV1N4RFFVRkRMRTFCUVRoQ0xFVkJRVVVzVVVGQlowTTdTVUZETTBZc1MwRkJTeXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEdGQlFXRXNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVVVGQlVTeERRVUZETEVWQlFVVTdVVUZEYmtVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eGpRVUZqTEVOQlFVTXNWMEZCVnl4RFFVRkRPMWxCUTNKRExFMUJRVTBzU1VGQlNTeExRVUZMTEVOQlFVTXNjMEpCUVhOQ0xGZEJRVmNzWVVGQllTeERRVUZETEVOQlFVTTdVVUZGYkVVc1RVRkJUU3hYUVVGWExFZEJRVWNzVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMUZCUTNoRExFbEJRVWtzVjBGQlZ5eFpRVUZaTEV0QlFVc3NTVUZCU1N4aFFVRmhMRmxCUVZrc1MwRkJTenRaUVVOb1JTeFhRVUZYTEVOQlFVTXNWMEZCVnl4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRE8yRkJRM0pETEVsQlFVa3NWMEZCVnl4WlFVRlpMRTFCUVUwc1NVRkJTU3hoUVVGaExGbEJRVmtzVFVGQlRUdFpRVU4yUlN4WlFVRlpMRU5CUVVNc1YwRkJWeXhGUVVGRkxHRkJRV0VzUTBGQlF5eERRVUZETzJGQlEzUkRMRWxCUVVrc1RVRkJUU3hEUVVGRExGRkJRVkVzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF6dFpRVU55UlN4WFFVRlhMRU5CUVVNc1YwRkJWeXhGUVVGRkxHRkJRV0VzUTBGQlF5eERRVUZETzJGQlEzSkRMRWxCUVVrc1YwRkJWeXhKUVVGSkxHRkJRV0U3V1VGRGJrTXNUVUZCVFN4SlFVRkpMRXRCUVVzc1EwRkJReXhoUVVGaExHRkJRV0VzWTBGQll5eFhRVUZYTEZkQlFWY3NWMEZCVnl4SFFVRkhMRU5CUVVNc1EwRkJRenRMUVVOcVJ6dEJRVU5JTEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1YwRkJWeXhEUVVGRExFMUJRWE5DTEVWQlFVVXNVVUZCZDBJN1NVRkRNVVVzVFVGQlRTeFpRVUZaTEVkQlFVY3NUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJRenRKUVVOdVF5eE5RVUZOTEdOQlFXTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRE8wbEJSWFpETEVsQlFVa3NXVUZCV1N4SlFVRkpMR05CUVdNc1JVRkJSVHRSUVVOc1F5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMREJFUVVFd1JDeFpRVUZaTEVkQlFVYzdXVUZEZGtZc1owTkJRV2RETEdOQlFXTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1MwRkRja1E3U1VGRlJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzV1VGQldTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUTNKRExFbEJRVWtzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRXRCUVVzc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NTMEZCU3p0WlFVTTFSQ3hYUVVGWExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJGQlEycERMRWxCUVVrc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEUxQlFVMHNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExGbEJRVmtzVFVGQlRUdFpRVU51UlN4WlFVRlpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yRkJRMnhETEVsQlFVa3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdXVUZETDBJc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNVMEZCVXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzB0QlEycEdPMEZCUTBnc1EwRkJRenRCUVVWRUxESkNRVUV5UWp0QlFVTXpRaXhOUVVGTkxGVkJRVlVzVVVGQlVTeERRVUZETEZGQlFXZENMRVZCUVVVc1MwRkJhVUk3U1VGRE1VUXNaVUZCWlN4SFFVRkhMRkZCUVZFc1EwRkJRenRKUVVNelFpeExRVUZMTEVWQlFVVXNRMEZCUXp0QlFVTldMRU5CUVVNN1FVRkZSQ3gxUmtGQmRVWTdRVUZEZGtZc1RVRkJUU3hWUVVGVkxFMUJRVTBzUTBGQlF5eE5RVUV5UWp0SlFVTm9SQ3hKUVVGSkxFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNTVUZCU1N4VFFVRlRPMUZCUTNKRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRPVUlzUzBGQlN5eERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGVrTXNRMEZCUXp0QlFVVkVMSE5HUVVGelJqdEJRVU4wUml4TlFVRk5MRlZCUVZVc1MwRkJTeXhEUVVGRExFdEJRVEJDTzBsQlF6bERMRWxCUVVrc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eEpRVUZKTEZOQlFWTTdVVUZEY2tNc1MwRkJTeXhEUVVGRExHVkJRV1VzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTTVRaXhMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVOMlF5eERRVUZETzBGQlIwUXNUVUZCVFN4VlFVRm5RaXhSUVVGUkxFTkJRVU1zVDBGQmVVVTdPenM3VVVGRGRFY3NUVUZCVFN4UFFVRlBMRWRCUTNWRUxFVkJRVVVzUTBGQlF6dFJRVU4yUlN4TlFVRk5MRmRCUVZjc1IwRkJSeXhOUVVGQkxFMUJRVUVzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4alFVRmpMRVZCUVVVc01FTkJRVVVzU1VGQlNTd3dRMEZCUlN4UFFVRlBMRU5CUVVNN1VVRkRia1VzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJRenRSUVVNM1FpeFBRVUZQTEdGQlFWQXNUMEZCVHl4alFVRlFMRTlCUVU4c1NVRkJVQ3hQUVVGUExFZEJRVXNzUlVGQlJTeEZRVUZETzFGQlEyWXNXVUZCUVN4UFFVRlJMRVZCUVVNc1YwRkJWeXgxUTBGQldDeFhRVUZYTEVkQlFVc3NTVUZCU1N4WFFVRlhMRVZCUVVVc1JVRkJRenRSUVVNelF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRk5CUVZNc1IwRkJSeXhGUVVGRkxFTkJRVU03VVVGRE1VSXNTMEZCU3l4TlFVRk5MRU5CUVVNc1IwRkJSeXhGUVVGRkxFdEJRVXNzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3V1VGRGFFUXNTVUZCU1N4RFFVRkJMRTlCUVU4c1lVRkJVQ3hQUVVGUExIVkNRVUZRTEU5QlFVOHNRMEZCUlN4UlFVRlJMRXRCUVVrc1UwRkJVeXhGUVVGRk8yZENRVU5zUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEZWQlFWVXNRMEZCUXl4UFFVRlBMR0ZCUVZBc1QwRkJUeXgxUWtGQlVDeFBRVUZQTEVOQlFVVXNVVUZCVVN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRE8yOUNRVU5vUlN4VFFVRlRPMkZCUTFvN1dVRkRSQ3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEZkQlFWY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1EwRkJRenRaUVVOMlF5eEpRVUZKTzJkQ1FVTkdMRWxCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTA3YjBKQlEyUXNUVUZCVFN4TFFVRkxMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03WVVGRGVFSTdXVUZCUXl4UFFVRlBMRU5CUVUwc1JVRkJSVHRuUWtGRFppeExRVUZMTEVOQlFVTXNXVUZCV1N4SFFVRkhMRU5CUVVNc1EwRkJReXhSUVVGUkxFVkJRVVVzUTBGQlF6dGhRVU51UXp0WlFVTkVMRTFCUVUwc1EwRkJReXhIUVVGSExFMUJRVUVzUzBGQlN5eERRVUZETEV0QlFVc3NiVU5CUVVrc1JVRkJSU3hEUVVGRE8xbEJRelZDTEUxQlFVMHNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVObUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlR0blFrRkRMMElzUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNUMEZCVHl4aFFVRlFMRTlCUVU4c2RVSkJRVkFzVDBGQlR5eERRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkZhRVFzVFVGQlRTeEpRVUZKTEVkQlFVY3NRMEZCUXl4TlFVRk5MRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWxCUVVrc1UwRkJVeXhEUVVGRExFTkJRVU03V1VGRE0wVXNTVUZCU1R0blFrRkRSaXhKUVVGSkxFdEJRVXNzUTBGQlF5eExRVUZMTzI5Q1FVTmlMRTFCUVUwc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETzJGQlEzWkNPMWxCUVVNc1QwRkJUeXhEUVVGTkxFVkJRVVU3WjBKQlEyWXNTMEZCU3l4RFFVRkRMRmRCUVZjc1IwRkJSeXhEUVVGRExFTkJRVU1zVVVGQlVTeEZRVUZGTEVOQlFVTTdZVUZEYkVNN1dVRkRSQ3hKUVVGSkxFdEJRVXNzUTBGQlF5eFhRVUZYTzJkQ1FVTnVRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVTXNVVUZCVVN4RlFVRkZMRWRCUVVjc1JVRkJSU3hKUVVGSkxFVkJRVVVzVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4TFFVRkxMRU5CUVVNc1YwRkJWeXhGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZETEVOQlFVTXNRMEZCUXp0WlFVTTNSeXhKUVVGSkxFdEJRVXNzUTBGQlF5eFpRVUZaTzJkQ1FVTndRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVTXNVVUZCVVN4RlFVRkZMRWRCUVVjc1JVRkJSU3hKUVVGSkxFVkJRVVVzVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4TFFVRkxMRU5CUVVNc1dVRkJXU3hGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZETEVOQlFVTXNRMEZCUXp0WlFVTTVSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRU5CUVVNN1UwRkRka0k3VVVGRFJDeEpRVUZKTEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1kwRkJZeXhGUVVGRk8xbEJRM1JETEUxQlFVMHNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xbEJRMnhDTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0blFrRkRia01zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXp0dlFrRkRXQ3hSUVVGUkxFVkJRVVVzYzBKQlFYTkNPMjlDUVVOb1F5eEpRVUZKTEVWQlFVVXNXVUZCV1R0dlFrRkRiRUlzVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJVeXhGUVVGRkxFOUJRVThzUlVGQlJTeExRVUZMTEVWQlFVVXNSVUZCUlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hQUVVGUExFVkJRVVVzUzBGQlN6dHBRa0ZEY0VVc1EwRkJReXhEUVVGRE8yRkJRMG83VTBGRFJqdFJRVU5FTEVsQlFVa3NUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhOUVVGTkxFVkJRVVU3V1VGRE9VSXNUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hGUVVGRkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdXVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJRenRaUVVNelJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETzFsQlEzaEVMRTFCUVUwc1RVRkJUU3hIUVVGSExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMWxCUTJwRUxFMUJRVTBzVjBGQlZ5eEhRVUZITEhsR1FVRjVSaXhEUVVGRE8xbEJRemxITEUxQlFVMHNUVUZCVFN4SFFVRkhPMmRDUVVOaUxGVkJRVlVzUlVGQlJTeFZRVUZWTzJkQ1FVTjBRaXhQUVVGUExFVkJRVVVzVDBGQlR6dG5Ra0ZEYUVJc1RVRkJUU3hGUVVGRkxFMUJRVTBzUTBGQlF5eE5RVUZOTzJkQ1FVTnlRaXhQUVVGUExFVkJRVVVzVjBGQlZ6dGhRVU55UWl4RFFVRkRPMWxCUTBZc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTzJkQ1FVRkZMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVWQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhSUVVGUkxFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVOQlFVTTdXVUZEZWtZc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eFhRVUZYTEVWQlFVVXNUVUZCVFN4RlFVRkZMR2RDUVVGblFpeERRVUZETEVOQlFVTTdVMEZEYmtRN1VVRkRSQ3hQUVVGUExFOUJRVThzUTBGQlF6czdRMEZEYUVJN1FVRkZSQ3hUUVVGbExGRkJRVkVzUTBGQlF5eERRVUZQTEVWQlFVVXNVMEZCTmtJN096dFJRVU0xUkN4SlFVRkpMRU5CUVhWSExFTkJRVU03VVVGRE5VY3NUVUZCVFN4TlFVRk5MRWRCUVVjc1UwRkJVeXhKUVVGSkxGTkJRVk1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eFZRVUZWTEVOQlFVTXNVMEZCVXl4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU55Unl4TlFVRk5MRWxCUVVrc1IwRkJSeXhEUVVGQkxFMUJRVUVzUTBGQlF5eERRVUZETEU5QlFVOHNNRU5CUVVVc1ZVRkJWU3hMUVVGSkxFMUJRVTBzUTBGQlF6dFJRVU0zUXl4TlFVRk5MRlZCUVZVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJRU3hEUVVGRExFTkJRVU1zVDBGQlR5d3dRMEZCUlN4VlFVRlZMRU5CUVVNN1VVRkRPVVFzU1VGQlNTeERRVUZETEVsQlFVazdXVUZEVUN4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU5xUkN4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFGQlJYcENMRWxCUVVrN1dVRkRSaXhKUVVGSkxFbEJRVWs3WjBKQlEwNHNRMEZCUXl4SFFVRkhMRVZCUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVnl4RlFVRkZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVVzVDBGQlR5eEZRVUZGTEVsQlFVa3NSVUZCUXl4RFFVRkRPenRuUWtGRkwwUXNRMEZCUXl4SFFVRkhMRVZCUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeE5RVUZOTEVWQlFVVXNUVUZCUVN4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzYlVOQlFVa3NTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVVzVDBGQlR5eEZRVUZGTEV0QlFVc3NSVUZCUXl4RFFVRkRPMU5CUXpsRk8xRkJRVU1zVDBGQlR5eERRVUZOTEVWQlFVVTdXVUZEWml4RFFVRkRMRWRCUVVjc1JVRkJReXhQUVVGUExFVkJRVVVzUzBGQlN5eEZRVUZGTEUxQlFVMHNSVUZCUlN4RFFVRkRMRU5CUVVNc1VVRkJVU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVOQlFVTXNSVUZCUlN4UFFVRlBMRVZCUVVVc1MwRkJTeXhGUVVGRExFTkJRVU03VTBGRGJrVTdVVUZEUkN4TlFVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFbEJRVWtzUlVGQlJTeERRVUZETzFGQlEzaENMR0ZCUVdFN1VVRkRZaXhEUVVGRExFTkJRVU1zUlVGQlJTeEhRVUZITEVsQlFVa3NSMEZCUnl4TFFVRkxMRU5CUVVNN1VVRkRjRUlzU1VGQlNTeERRVUZETEVsQlFVazdXVUZEVUN4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUldwRkxFTkJRVU1zUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4RFFVRkRMRkZCUVZFc1EwRkJRenRSUVVONFFpeERRVUZETEVOQlFVTXNTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU03VVVGRGFFSXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wTkJRMVk3UVVGRlJDdzJRa0ZCTmtJN1FVRkROMElzVFVGQlRTeFZRVUZuUWl4TFFVRkxMRU5CUVVNc1JVRkJWVHM3VVVGRGNFTXNUVUZCVFN4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6bERMRU5CUVVNN1EwRkJRVHRCUVVWRUxFMUJRVTBzVlVGQlowSXNWVUZCVlN4RFFVRkRMRmxCUVRKQ0xFVkJRekZFTEZGQlFXZENMR3RDUVVGclFpeEZRVUZGTEU5QlFXVXNSMEZCUnpzN1VVRkRkRVFzVDBGQlR5eEpRVUZKTEU5QlFVOHNRMEZCUXl4RFFVRkRMRTlCUVU4c1JVRkJSU3hOUVVGTkxFVkJRVVVzUlVGQlJUdFpRVU55UXl4VlFVRlZMRU5CUVVNc1IwRkJSeXhGUVVGRk8yZENRVU5rTEdGQlFXRXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRuUWtGRGVFSXNUVUZCVFN4RFFVRkRMRWxCUVVrc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTTdXVUZETTBJc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETzFsQlExUXNZVUZCWVR0WlFVTmlMRTFCUVUwc1VVRkJVU3hIUVVGWkxGZEJRVmNzUTBGQlF5eEhRVUZITEVWQlFVVTdaMEpCUTNwRExFbEJRVWtzV1VGQldTeEZRVUZGTEVWQlFVVTdiMEpCUTJ4Q0xHRkJRV0VzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0dlFrRkRlRUlzVDBGQlR5eEZRVUZGTEVOQlFVTTdhVUpCUTFnN1dVRkRTQ3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTTdVVUZEVkN4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOTUxFTkJRVU03UTBGQlFUdEJRVVZFTEUxQlFVMHNWVUZCVlN4bFFVRmxMRU5CUVVNc1YwRkJiVUk3U1VGRGFrUXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUXpGRUxFbEJRVWtzUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4alFVRmpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NWMEZCVnp0WlFVTndSQ3hQUVVGUExFbEJRVWtzUTBGQlF6dExRVU5tTzBsQlEwUXNUMEZCVHl4TFFVRkxMRU5CUVVNN1FVRkRaaXhEUVVGRE8wRkJSVVFzVFVGQlRTeFZRVUZuUWl4VlFVRlZMRU5CUVVNc1EwRkJVeXhGUVVGRkxFVkJRV2RDTEVWQlFVVXNjMEpCUVN0Q0xFdEJRVXM3TzFGQlEyaEhMRWxCUVVrc2JVSkJRVzFDTzFsQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8xRkJRMnBGTEUxQlFVMHNSVUZCUlN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMUZCUTNaRExFMUJRVTBzVlVGQlZTeEhRVUZITEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4SFFVRkhMRU5CUVVNc1MwRkJTeXhEUVVGRE8xRkJReTlFTEUxQlFVMHNVVUZCVVN4SFFVRkhMRWRCUVVjc1ZVRkJWU3hYUVVGWExGVkJRVlVzVVVGQlVTeFZRVUZWTzAxQlEycEZMRlZCUVZVc1ZVRkJWU3hWUVVGVkxFOUJRVThzVlVGQlZTeEpRVUZKTEVOQlFVTTdVVUZEZUVRc1RVRkJUU3hIUVVGSExFZEJRVWNzUlVGQlJTeERRVUZETzFGQlEyWXNTVUZCU1R0WlFVTkdMRWxCUVVrc1RVRkJUU3hIUVVGSExFVkJRVVVzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkROMElzVFVGQlRTeFZRVUZWTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4SlFVRkpMRVZCUXpsRUxHOUNRVUZ2UWl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8xbEJRemxDTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03V1VGRGVFTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNRMEZCUXp0WlFVTXpSQ3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRWxCUVVrc1IwRkJSeXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTndSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdG5Ra0ZCUlN4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRja1FzUlVGQlJTeERRVUZETEdGQlFXRXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRja0lzVFVGQlRTeExRVUZMTEVkQlFVY3NUVUZCVFN4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdXVUZETTBNc1RVRkJUU3hSUVVGUkxFZEJRVFJDTEVWQlFVVXNRMEZCUXp0WlFVTTNReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNUMEZCVHl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTjRSeXhOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMWxCUXpWQ0xFMUJRVTBzUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJwQ0xFMUJRVTBzVFVGQlRTeEhRVUZITEVWQlFVVXNRMEZCUXl4VlFVRlZMRVZCUVVVc1EwRkJRenRaUVVNdlFpeE5RVUZOTEZGQlFWRXNSMEZCUnl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETzFsQlF6RkRMRVZCUVVVc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF6dFpRVU5xUWl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFsQlEzaERMRVZCUVVVc1EwRkJReXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdXVUZEZEVJc1RVRkJUU3hWUVVGVkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eEpRVUZKTEVWQlF6bEVMR2REUVVGblF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUXpGRExFMUJRVTBzUzBGQlN5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJwQ0xFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1dVRkRlRU1zVFVGQlRTeEhRVUZITEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NTMEZCU3l4TlFVRk5MRU5CUVVVc1EwRkJRenRaUVVOb1JTeFhRVUZYTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUXpWQ0xFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdVMEZETlVVN1owSkJRVk03V1VGRFVpeEZRVUZGTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNN1dVRkRXQ3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZWQlFWVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRUUVVNelFqdEpRVU5JTEVOQlFVTTdRMEZCUVNJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENBcUlHRnpJR2R5YjJzZ1puSnZiU0FuWkdGMFlXZHliMnN0WVhCcEwyZHliMnNuTzF4dWFXMXdiM0owSUNvZ1lYTWdSRWNnWm5KdmJTQW5aR0YwWVdkeWIyc3RZWEJwTDJSbkp6dGNibWx0Y0c5eWRDQjdUMkp6WlhKMllXSnNaU3dnVTNWaWMyTnlhWEIwYVc5dWZTQm1jbTl0SUNkeWVHcHpKenRjYm1sdGNHOXlkQ0JVYVcxbGIzVjBJRDBnVG05a1pVcFRMbFJwYldWdmRYUTdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQjBaWE4wY3pvZ2UxeHVJQ0JiYTJWNU9pQnpkSEpwYm1kZE9pQjdYRzRnSUNBZ2RHVnpkSE0vT2lCVVpYTjBXMTBzSUdKbFptOXlaVDg2SUNncElEMCtJRkJ5YjIxcGMyVThkbTlwWkQ0c0lHRm1kR1Z5UHpvZ0tDa2dQVDRnVUhKdmJXbHpaVHgyYjJsa1BpeGNiaUFnSUNCaVpXWnZjbVZUZEdGMGRYTS9PaUJ6ZEhKcGJtY3NJR0ZtZEdWeVUzUmhkSFZ6UHpvZ2MzUnlhVzVuWEc0Z0lIMWNibjBnUFNCN2ZUdGNibHh1Wlhod2IzSjBJR3hsZENCamRYSnlaVzUwUTJGMFpXZHZjbms2SUhOMGNtbHVaenRjYmx4dVpYaHdiM0owSUc1aGJXVnpjR0ZqWlNCaGMzTjFjbVVnZTF4dVhHNGdJR1Y0Y0c5eWRDQm1kVzVqZEdsdmJpQnViM1JPZFd4c0tIWmhiSFZsT2lCaGJua3NJRzVoYldVL09pQnpkSEpwYm1jcElIdGNiaUFnSUNCcFppQW9kbUZzZFdVZ1BUMGdiblZzYkNsY2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnSkh0dVlXMWxJRDA5SUc1MWJHd2dQeUFuVm1Gc2RXVW5JRG9nYm1GdFpYMGdibTkwSUdSbFptbHVaV1JnS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ2FXNTBaWEptWVdObElGUmxjM1JQY0hScGIyNXpJSHRjYmlBZ2RHbHRaVzkxZEQ4NklHNTFiV0psY2p0Y2JpQWdkVzVvWVc1a2JHVmtSWGhqWlhCMGFXOXVWR2x0Wlc5MWREODZJRzUxYldKbGNqdGNiaUFnYzJ0cGNGSmxZWE52Ymo4NklITjBjbWx1Wnp0Y2JuMWNibHh1Wlhod2IzSjBJR05zWVhOeklGUmxjM1JEYjI1MFpYaDBJSHRjYmlBZ1kyRjBZMmhWYm1oaGJtUnNaV1FnUFNCMGNuVmxPMXh1SUNCeVpYQnZjblFnUFNCbVlXeHpaVHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWhqWVhSamFGVnVhR0Z1Wkd4bFpEODZJR0p2YjJ4bFlXNHNJSEpsY0c5eWREODZJR0p2YjJ4bFlXNHBJSHRjYmlBZ0lDQnBaaUFvWTJGMFkyaFZibWhoYm1Sc1pXUWdJVDA5SUhWdVpHVm1hVzVsWkNrZ2RHaHBjeTVqWVhSamFGVnVhR0Z1Wkd4bFpDQTlJR05oZEdOb1ZXNW9ZVzVrYkdWa08xeHVJQ0FnSUdsbUlDaHlaWEJ2Y25RZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZEdocGN5NXlaWEJ2Y25RZ1BTQnlaWEJ2Y25RN1hHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCVVpYTjBJSHRjYmlBZ2RHVnpkRG9nS0NrZ1BUNGdVSEp2YldselpUeGhibmsrTzF4dUlDQnVZVzFsT2lCemRISnBibWM3WEc0Z0lHTmhkR1ZuYjNKNU9pQnpkSEpwYm1jN1hHNGdJRzl3ZEdsdmJuTS9PaUJVWlhOMFQzQjBhVzl1Y3p0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loallYUmxaMjl5ZVRvZ2MzUnlhVzVuTENCdVlXMWxPaUJ6ZEhKcGJtY3NJSFJsYzNRNklDZ3BJRDArSUZCeWIyMXBjMlU4WVc1NVBpd2diM0IwYVc5dWN6ODZJRlJsYzNSUGNIUnBiMjV6S1NCN1hHNGdJQ0FnZEdocGN5NWpZWFJsWjI5eWVTQTlJR05oZEdWbmIzSjVPMXh1SUNBZ0lIUm9hWE11Ym1GdFpTQTlJRzVoYldVN1hHNGdJQ0FnYjNCMGFXOXVjeUEvUHowZ2UzMDdYRzRnSUNBZ2IzQjBhVzl1Y3k1MGFXMWxiM1YwSUQ4L1BTQXpNREF3TUR0Y2JpQWdJQ0IwYUdsekxtOXdkR2x2Ym5NZ1BTQnZjSFJwYjI1ek8xeHVJQ0FnSUhSb2FYTXVkR1Z6ZENBOUlHRnplVzVqSUNncE9pQlFjbTl0YVhObFBHRnVlVDRnUFQ0Z2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNiaUFnSUNBZ0lDQWdiR1YwSUhKbGMzVnNkQ0E5SUNjbk8xeHVJQ0FnSUNBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnSUNBZ0lISmxjM1ZzZENBOUlHRjNZV2wwSUhSbGMzUW9LVHRjYmlBZ0lDQWdJQ0FnZlNCallYUmphQ0FvWlRvZ1lXNTVLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2NtVnFaV04wS0dVcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSEpsYzI5c2RtVW9jbVZ6ZFd4MEtUdGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMDdYRzRnSUgxY2JuMWNibHh1Wlhod2IzSjBJR0Z6ZVc1aklHWjFibU4wYVc5dUlIUmxjM1JGZG1WdWREeFVQaWhsZG1WdWREb2dUMkp6WlhKMllXSnNaVHhVUGl4Y2JpQWdhR0Z1Wkd4bGNqb2dLR0Z5WjNNNklGUXBJRDArSUhadmFXUXNJSFJ5YVdkblpYSTZJQ2dwSUQwK0lIWnZhV1FzSUcxek9pQnVkVzFpWlhJZ1BTQXdLVG9nVUhKdmJXbHpaVHh6ZEhKcGJtYytJSHRjYmlBZ2JHVjBJSE4xWWpvZ1UzVmljMk55YVhCMGFXOXVPMXh1SUNCeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb0tISmxjMjlzZG1Vc0lISmxhbVZqZENrZ1BUNGdlMXh1SUNBZ0lITjFZaUE5SUdWMlpXNTBMbk4xWW5OamNtbGlaU2dvWVhKbmN5a2dQVDRnZTF4dUlDQWdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdhR0Z1Wkd4bGNpaGhjbWR6S1R0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lDQWdjbVZxWldOMEtHVXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjM1ZpTG5WdWMzVmljMk55YVdKbEtDazdYRzRnSUNBZ0lDQnlaWE52YkhabEtDZFBTeWNwTzF4dUlDQWdJSDBwTzF4dUlDQWdJSE5sZEZScGJXVnZkWFFvS0NrZ1BUNGdlMXh1SUNBZ0lDQWdjM1ZpTG5WdWMzVmljMk55YVdKbEtDazdYRzRnSUNBZ0lDQXZMeUJsYzJ4cGJuUXRaR2x6WVdKc1pTMXVaWGgwTFd4cGJtVWdjSEpsWm1WeUxYQnliMjFwYzJVdGNtVnFaV04wTFdWeWNtOXljMXh1SUNBZ0lDQWdjbVZxWldOMEtDZDBhVzFsYjNWMEp5azdYRzRnSUNBZ2ZTd2diWE1wTzF4dUlDQWdJSFJ5YVdkblpYSW9LVHRjYmlBZ2ZTazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCMFpYTjBLRzVoYldVNklITjBjbWx1Wnl3Z2RHVnpkRG9nS0NrZ1BUNGdVSEp2YldselpUeGhibmsrTENCdmNIUnBiMjV6UHpvZ1ZHVnpkRTl3ZEdsdmJuTXBPaUIyYjJsa0lIdGNiaUFnYVdZZ0tIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUhSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMGdQU0I3ZlR0Y2JpQWdhV1lnS0hSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMHVkR1Z6ZEhNZ1BUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjB1ZEdWemRITWdQU0JiWFR0Y2JpQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1MFpYTjBjeUV1Y0hWemFDaHVaWGNnVkdWemRDaGpkWEp5Wlc1MFEyRjBaV2R2Y25rc0lHNWhiV1VzSUhSbGMzUXNJRzl3ZEdsdmJuTXBLVHRjYm4xY2JseHVMeW9nVkdWemRITWdkSGR2SUc5aWFtVmpkSE1nWm05eUlHVnhkV0ZzYVhSNUxDQjBhSEp2ZDNNZ1lXNGdaWGhqWlhCMGFXOXVJR2xtSUhSb1pYa2dZWEpsSUc1dmRDQmxjWFZoYkM0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNRb1lXTjBkV0ZzT2lCaGJua3NJR1Y0Y0dWamRHVmtPaUJoYm5rcE9pQjJiMmxrSUh0Y2JpQWdhV1lnS0dGamRIVmhiQ0FoUFQwZ1pYaHdaV04wWldRcFhHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0JjSWlSN1pYaHdaV04wWldSOVhDSXNJR2R2ZENCY0lpUjdZV04wZFdGc2ZWd2lZQ2s3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNSR2JHOWhkQ2hoWTNSMVlXdzZJRzUxYldKbGNpd2daWGh3WldOMFpXUTZJRzUxYldKbGNpd2dkRzlzWlhKaGJtTmxJRDBnTUM0d01ERXBPaUIyYjJsa0lIdGNiaUFnWTI5dWMzUWdZWEpsUlhGMVlXd2dQU0JOWVhSb0xtRmljeWhoWTNSMVlXd2dMU0JsZUhCbFkzUmxaQ2tnUENCMGIyeGxjbUZ1WTJVN1hHNGdJR2xtSUNnaFlYSmxSWEYxWVd3cFhHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0FrZTJWNGNHVmpkR1ZrZlN3Z1oyOTBJQ1I3WVdOMGRXRnNmU0FvZEc5c1pYSmhibU5sSUQwZ0pIdDBiMnhsY21GdVkyVjlLV0FwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaWGh3WldOMFQySnFaV04wS0dGamRIVmhiRG9nZXlCYmEyVjVPaUJ6ZEhKcGJtZGRPaUJoYm5rZ2ZTd2daWGh3WldOMFpXUTZJSHNnVzJ0bGVUb2djM1J5YVc1blhUb2dZVzU1SUgwcElIdGNiaUFnWm05eUlDaGpiMjV6ZENCYlpYaHdaV04wWldSTFpYa3NJR1Y0Y0dWamRHVmtWbUZzZFdWZElHOW1JRTlpYW1WamRDNWxiblJ5YVdWektHVjRjR1ZqZEdWa0tTa2dlMXh1SUNBZ0lHbG1JQ2doWVdOMGRXRnNMbWhoYzA5M2JsQnliM0JsY25SNUtHVjRjR1ZqZEdWa1MyVjVLU2xjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdSWGh3WldOMFpXUWdjSEp2Y0dWeWRIa2dYQ0lrZTJWNGNHVmpkR1ZrUzJWNWZWd2lJRzV2ZENCbWIzVnVaR0FwTzF4dVhHNGdJQ0FnWTI5dWMzUWdZV04wZFdGc1ZtRnNkV1VnUFNCaFkzUjFZV3hiWlhod1pXTjBaV1JMWlhsZE8xeHVJQ0FnSUdsbUlDaGhZM1IxWVd4V1lXeDFaU0JwYm5OMFlXNWpaVzltSUVGeWNtRjVJQ1ltSUdWNGNHVmpkR1ZrVm1Gc2RXVWdhVzV6ZEdGdVkyVnZaaUJCY25KaGVTbGNiaUFnSUNBZ0lHVjRjR1ZqZEVGeWNtRjVLR0ZqZEhWaGJGWmhiSFZsTENCbGVIQmxZM1JsWkZaaGJIVmxLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDaGhZM1IxWVd4V1lXeDFaU0JwYm5OMFlXNWpaVzltSUU5aWFtVmpkQ0FtSmlCbGVIQmxZM1JsWkZaaGJIVmxJR2x1YzNSaGJtTmxiMllnVDJKcVpXTjBLVnh1SUNBZ0lDQWdaWGh3WldOMFQySnFaV04wS0dGamRIVmhiRlpoYkhWbExDQmxlSEJsWTNSbFpGWmhiSFZsS1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2hPZFcxaVpYSXVhWE5HYVc1cGRHVW9ZV04wZFdGc1ZtRnNkV1VwSUNZbUlFNTFiV0psY2k1cGMwWnBibWwwWlNobGVIQmxZM1JsWkZaaGJIVmxLU2xjYmlBZ0lDQWdJR1Y0Y0dWamRFWnNiMkYwS0dGamRIVmhiRlpoYkhWbExDQmxlSEJsWTNSbFpGWmhiSFZsS1R0Y2JpQWdJQ0JsYkhObElHbG1JQ2hoWTNSMVlXeFdZV3gxWlNBaFBTQmxlSEJsWTNSbFpGWmhiSFZsS1Z4dUlDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JGZUhCbFkzUmxaQ0FvSkh0bGVIQmxZM1JsWkZaaGJIVmxmU2tnWm05eUlHdGxlU0FuSkh0bGVIQmxZM1JsWkV0bGVYMG5MQ0JuYjNRZ0tDUjdZV04wZFdGc1ZtRnNkV1Y5S1dBcE8xeHVJQ0I5WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmxlSEJsWTNSQmNuSmhlU2hoWTNSMVlXdzZJRUZ5Y21GNVRHbHJaVHhoYm5rK0xDQmxlSEJsWTNSbFpEb2dRWEp5WVhsTWFXdGxQR0Z1ZVQ0cElIdGNiaUFnWTI5dWMzUWdZV04wZFdGc1RHVnVaM1JvSUQwZ1lXTjBkV0ZzTG14bGJtZDBhRHRjYmlBZ1kyOXVjM1FnWlhod1pXTjBaV1JNWlc1bmRHZ2dQU0JsZUhCbFkzUmxaQzVzWlc1bmRHZzdYRzVjYmlBZ2FXWWdLR0ZqZEhWaGJFeGxibWQwYUNBaFBTQmxlSEJsWTNSbFpFeGxibWQwYUNrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUVhKeVlYbHpJR0Z5WlNCdlppQmthV1ptWlhKbGJuUWdiR1Z1WjNSb09pQmhZM1IxWVd3Z1lYSnlZWGtnYkdWdVozUm9JR2x6SUNSN1lXTjBkV0ZzVEdWdVozUm9mU0JnSUN0Y2JpQWdJQ0FnSUdCaGJtUWdaWGh3WldOMFpXUWdZWEp5WVhrZ2JHVnVaM1JvSUdseklDUjdaWGh3WldOMFpXUk1aVzVuZEdoOVlDazdYRzRnSUgxY2JseHVJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdGamRIVmhiRXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnYVdZZ0tHRmpkSFZoYkZ0cFhTQnBibk4wWVc1alpXOW1JRUZ5Y21GNUlDWW1JR1Y0Y0dWamRHVmtXMmxkSUdsdWMzUmhibU5sYjJZZ1FYSnlZWGtwWEc0Z0lDQWdJQ0JsZUhCbFkzUkJjbkpoZVNoaFkzUjFZV3hiYVYwc0lHVjRjR1ZqZEdWa1cybGRLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDaGhZM1IxWVd4YmFWMGdhVzV6ZEdGdVkyVnZaaUJQWW1wbFkzUWdKaVlnWlhod1pXTjBaV1JiYVYwZ2FXNXpkR0Z1WTJWdlppQlBZbXBsWTNRcFhHNGdJQ0FnSUNCbGVIQmxZM1JQWW1wbFkzUW9ZV04wZFdGc1cybGRMQ0JsZUhCbFkzUmxaRnRwWFNrN1hHNGdJQ0FnWld4elpTQnBaaUFvWVdOMGRXRnNXMmxkSUNFOUlHVjRjR1ZqZEdWa1cybGRLVnh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQkZlSEJsWTNSbFpDQWtlMlY0Y0dWamRHVmtXMmxkZlNCaGRDQndiM05wZEdsdmJpQWtlMmw5TENCbmIzUWdKSHRoWTNSMVlXeGJhVjE5WUNrN1hHNGdJSDFjYm4xY2JseHVMeW9nUkdWbWFXNWxjeUJoSUhSbGMzUWdjM1ZwZEdVdUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkYwWldkdmNua29ZMkYwWldkdmNuazZJSE4wY21sdVp5d2dkR1Z6ZEhNNklDZ3BJRDArSUhadmFXUXBPaUIyYjJsa0lIdGNiaUFnWTNWeWNtVnVkRU5oZEdWbmIzSjVJRDBnWTJGMFpXZHZjbms3WEc0Z0lIUmxjM1J6S0NrN1hHNTlYRzVjYmk4cUlFUmxabWx1WlhNZ1lTQm1kVzVqZEdsdmJpQjBieUJpWlNCbGVHVmpkWFJsWkNCaVpXWnZjbVVnZEdobElIUmxjM1J6SUdsdUlIUm9hWE1nWTJGMFpXZHZjbmtnWVhKbElHVjRaV04xZEdWa0xpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR0psWm05eVpTaGlaV1p2Y21VNklDZ3BJRDArSUZCeWIyMXBjMlU4ZG05cFpENHBPaUIyYjJsa0lIdGNiaUFnYVdZZ0tIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFQwZ2RXNWtaV1pwYm1Wa0tWeHVJQ0FnSUhSbGMzUnpXMk4xY25KbGJuUkRZWFJsWjI5eWVWMGdQU0I3ZlR0Y2JpQWdkR1Z6ZEhOYlkzVnljbVZ1ZEVOaGRHVm5iM0o1WFM1aVpXWnZjbVVnUFNCaVpXWnZjbVU3WEc1OVhHNWNiaThxSUVSbFptbHVaWE1nWVNCbWRXNWpkR2x2YmlCMGJ5QmlaU0JsZUdWamRYUmxaQ0JoWm5SbGNpQjBhR1VnZEdWemRITWdhVzRnZEdocGN5QmpZWFJsWjI5eWVTQmhjbVVnWlhobFkzVjBaV1F1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1lXWjBaWElvWVdaMFpYSTZJQ2dwSUQwK0lGQnliMjFwYzJVOGRtOXBaRDRwT2lCMmIybGtJSHRjYmlBZ2FXWWdLSFJsYzNSelcyTjFjbkpsYm5SRFlYUmxaMjl5ZVYwZ1BUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lIUmxjM1J6VzJOMWNuSmxiblJEWVhSbFoyOXllVjBnUFNCN2ZUdGNiaUFnZEdWemRITmJZM1Z5Y21WdWRFTmhkR1ZuYjNKNVhTNWhablJsY2lBOUlHRm1kR1Z5TzF4dWZWeHVYRzVjYm1WNGNHOXlkQ0JoYzNsdVl5Qm1kVzVqZEdsdmJpQnlkVzVVWlhOMGN5aHZjSFJwYjI1elB6b2dleUJqWVhSbFoyOXllVDg2SUhOMGNtbHVaeXdnZEdWemREODZJSE4wY21sdVp5d2dkR1Z6ZEVOdmJuUmxlSFEvT2lCVVpYTjBRMjl1ZEdWNGRDQjlLU0I3WEc0Z0lHTnZibk4wSUhKbGMzVnNkSE02SUhzZ1kyRjBaV2R2Y25rL09pQnpkSEpwYm1jc0lHNWhiV1UvT2lCemRISnBibWNzSUhOMVkyTmxjM002SUdKdmIyeGxZVzRzWEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpkV3gwT2lCemRISnBibWNzSUcxek9pQnVkVzFpWlhJc0lITnJhWEJ3WldRNklHSnZiMnhsWVc0Z2ZWdGRJRDBnVzEwN1hHNGdJR052Ym5OMElIQmhZMnRoWjJWT1lXMWxJRDBnWjNKdmF5NW1kVzVqZEdsdmJuTXVaMlYwUTNWeWNtVnVkRU5oYkd3b0tUOHVablZ1WXo4dWNHRmphMkZuWlR0Y2JpQWdZMjl1YzI5c1pTNXNiMmNvWUZKMWJtNXBibWNnZEdWemRITmdLVHRjYmlBZ2IzQjBhVzl1Y3lBL1B6MGdlMzA3WEc0Z0lHOXdkR2x2Ym5NaExuUmxjM1JEYjI1MFpYaDBJRDgvUFNCdVpYY2dWR1Z6ZEVOdmJuUmxlSFFvS1R0Y2JpQWdaM0p2YXk1emFHVnNiQzVzWVhOMFJYSnliM0lnUFNBbkp6dGNiaUFnWm05eUlDaGpiMjV6ZENCYmEyVjVMQ0IyWVd4MVpWMGdiMllnVDJKcVpXTjBMbVZ1ZEhKcFpYTW9kR1Z6ZEhNcEtTQjdYRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTS9MbU5oZEdWbmIzSjVJQ0U5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0ZyWlhrdWRHOU1iM2RsY2tOaGMyVW9LUzV6ZEdGeWRITlhhWFJvS0c5d2RHbHZibk0vTG1OaGRHVm5iM0o1TG5SdlRHOTNaWEpEWVhObEtDa3BLVnh1SUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjMjlzWlM1c2IyY29ZRk4wWVhKMFpXUWdKSHRyWlhsOUlHTmhkR1ZuYjNKNVlDazdYRzRnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJR2xtSUNoMllXeDFaUzVpWldadmNtVXBYRzRnSUNBZ0lDQWdJR0YzWVdsMElIWmhiSFZsTG1KbFptOXlaU2dwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLSGc2SUdGdWVTa2dlMXh1SUNBZ0lDQWdkbUZzZFdVdVltVm1iM0psVTNSaGRIVnpJRDBnZUM1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUgxY2JpQWdJQ0JqYjI1emRDQjBJRDBnZG1Gc2RXVXVkR1Z6ZEhNZ1B6OGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2NtVnpJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCMExteGxibWQwYURzZ2FTc3JLVnh1SUNBZ0lDQWdjbVZ6TG5CMWMyZ29ZWGRoYVhRZ1pYaGxZMVJsYzNRb2RGdHBYU3dnYjNCMGFXOXVjejh1ZEdWemRDa3BPMXh1WEc0Z0lDQWdZMjl1YzNRZ1pHRjBZU0E5SUNoaGQyRnBkQ0JRY205dGFYTmxMbUZzYkNoeVpYTXBLUzVtYVd4MFpYSW9LR1FwSUQwK0lHUXVjbVZ6ZFd4MElDRTlJQ2R6YTJsd2NHVmtKeWs3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUdsbUlDaDJZV3gxWlM1aFpuUmxjaWxjYmlBZ0lDQWdJQ0FnWVhkaGFYUWdkbUZzZFdVdVlXWjBaWElvS1R0Y2JpQWdJQ0I5SUdOaGRHTm9JQ2g0T2lCaGJua3BJSHRjYmlBZ0lDQWdJSFpoYkhWbExtRm1kR1Z5VTNSaGRIVnpJRDBnZUM1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2RtRnNkV1V1WVdaMFpYSlRkR0YwZFhNcFhHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2UyTmhkR1ZuYjNKNU9pQnJaWGtzSUc1aGJXVTZJQ2RwYm1sMEp5d2djbVZ6ZFd4ME9pQjJZV3gxWlM1aFpuUmxjbE4wWVhSMWN5d2djM1ZqWTJWemN6b2dabUZzYzJVc0lHMXpPaUF3TENCemEybHdjR1ZrT2lCbVlXeHpaWDBwTzF4dUlDQWdJR2xtSUNoMllXeDFaUzVpWldadmNtVlRkR0YwZFhNcFhHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2UyTmhkR1ZuYjNKNU9pQnJaWGtzSUc1aGJXVTZJQ2RwYm1sMEp5d2djbVZ6ZFd4ME9pQjJZV3gxWlM1aVpXWnZjbVZUZEdGMGRYTXNJSE4xWTJObGMzTTZJR1poYkhObExDQnRjem9nTUN3Z2MydHBjSEJsWkRvZ1ptRnNjMlY5S1R0Y2JpQWdJQ0J5WlhOMWJIUnpMbkIxYzJnb0xpNHVaR0YwWVNrN1hHNGdJSDFjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVkR1Z6ZEVOdmJuUmxlSFF1WTJGMFkyaFZibWhoYm1Sc1pXUXBJSHRjYmlBZ0lDQmhkMkZwZENCa1pXeGhlU2d4TURBd0tUdGNiaUFnSUNCcFppQW9aM0p2YXk1emFHVnNiQzVzWVhOMFJYSnliM0l1YkdWdVozUm9JRDRnTUNrZ2UxeHVJQ0FnSUNBZ2NtVnpkV3gwY3k1d2RYTm9LSHRjYmlBZ0lDQWdJQ0FnWTJGMFpXZHZjbms2SUNkVmJtaGhibVJzWldRZ1pYaGpaWEIwYVc5dWN5Y3NYRzRnSUNBZ0lDQWdJRzVoYldVNklDZGxlR05sY0hScGIyNXpKeXhjYmlBZ0lDQWdJQ0FnY21WemRXeDBPaUJuY205ckxuTm9aV3hzTG14aGMzUkZjbkp2Y2l3Z2MzVmpZMlZ6Y3pvZ1ptRnNjMlVzSUcxek9pQXdMQ0J6YTJsd2NHVmtPaUJtWVd4elpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lHbG1JQ2h2Y0hScGIyNXpMblJsYzNSRGIyNTBaWGgwTG5KbGNHOXlkQ2tnZTF4dUlDQWdJR052Ym5OMElHeHZaMmRsY2lBOUlHNWxkeUJFUnk1TWIyZG5aWElvS1R0Y2JpQWdJQ0JqYjI1emRDQnpkV05qWlhOelpuVnNJRDBnY21WemRXeDBjeTVtYVd4MFpYSW9LSElwSUQwK0lISXVjM1ZqWTJWemN5a3ViR1Z1WjNSb08xeHVJQ0FnSUdOdmJuTjBJSE5yYVhCd1pXUWdQU0J5WlhOMWJIUnpMbVpwYkhSbGNpZ29jaWtnUFQ0Z2NpNXphMmx3Y0dWa0tTNXNaVzVuZEdnN1hHNGdJQ0FnWTI5dWMzUWdabUZwYkdWa0lEMGdjbVZ6ZFd4MGN5NW1hV3gwWlhJb0tISXBJRDArSUNGeUxuTjFZMk5sYzNNcE8xeHVJQ0FnSUdOdmJuTjBJR1JsYzJOeWFYQjBhVzl1SUQwZ0oxQmhZMnRoWjJVZ1FIQmhZMnRoWjJVZ2RHVnpkR1ZrT2lCQWMzVmpZMlZ6YzJaMWJDQnpkV05qWlhOelpuVnNMQ0JBYzJ0cGNIQmxaQ0J6YTJsd2NHVmtMQ0JBWm1GcGJHVmtJR1poYVd4bFpDQjBaWE4wY3ljN1hHNGdJQ0FnWTI5dWMzUWdjR0Z5WVcxeklEMGdlMXh1SUNBZ0lDQWdjM1ZqWTJWemMyWjFiRG9nYzNWalkyVnpjMloxYkN4Y2JpQWdJQ0FnSUhOcmFYQndaV1E2SUhOcmFYQndaV1FzWEc0Z0lDQWdJQ0JtWVdsc1pXUTZJR1poYVd4bFpDNXNaVzVuZEdnc1hHNGdJQ0FnSUNCd1lXTnJZV2RsT2lCd1lXTnJZV2RsVG1GdFpWeHVJQ0FnSUgwN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCeUlHOW1JR1poYVd4bFpDa2dUMkpxWldOMExtRnpjMmxuYmlod1lYSmhiWE1zSUh0YllDUjdjaTVqWVhSbFoyOXllWDBnZkNBa2UzSXVibUZ0WlgxZ1hUb2djaTV5WlhOMWJIUjlLVHRjYmlBZ0lDQnNiMmRuWlhJdWJHOW5LR1JsYzJOeWFYQjBhVzl1TENCd1lYSmhiWE1zSUNkd1lXTnJZV2RsTFhSbGMzUmxaQ2NwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ5WlhOMWJIUnpPMXh1ZlZ4dVhHNWhjM2x1WXlCbWRXNWpkR2x2YmlCbGVHVmpWR1Z6ZENoME9pQlVaWE4wTENCd2NtVmthV05oZEdVNklITjBjbWx1WnlCOElIVnVaR1ZtYVc1bFpDa2dlMXh1SUNCc1pYUWdjam9nZXlCallYUmxaMjl5ZVQ4NklITjBjbWx1Wnl3Z2JtRnRaVDg2SUhOMGNtbHVaeXdnYzNWalkyVnpjem9nWW05dmJHVmhiaXdnY21WemRXeDBPaUJ6ZEhKcGJtY3NJRzF6T2lCdWRXMWlaWElzSUhOcmFYQndaV1E2SUdKdmIyeGxZVzRnZlR0Y2JpQWdZMjl1YzNRZ1ptbHNkR1Z5SUQwZ2NISmxaR2xqWVhSbElDRTlJSFZ1WkdWbWFXNWxaQ0FtSmlBb0lYUXVibUZ0WlM1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvY0hKbFpHbGpZWFJsTG5SdlRHOTNaWEpEWVhObEtDa3BLVHRjYmlBZ1kyOXVjM1FnYzJ0cGNDQTlJSFF1YjNCMGFXOXVjejh1YzJ0cGNGSmxZWE52YmlCOGZDQm1hV3gwWlhJN1hHNGdJR052Ym5OMElITnJhWEJTWldGemIyNGdQU0JtYVd4MFpYSWdQeUFuYzJ0cGNIQmxaQ2NnT2lCMExtOXdkR2x2Ym5NL0xuTnJhWEJTWldGemIyNDdYRzRnSUdsbUlDZ2hjMnRwY0NsY2JpQWdJQ0JqYjI1emIyeGxMbXh2WnloZ1UzUmhjblJsWkNBa2UzUXVZMkYwWldkdmNubDlJQ1I3ZEM1dVlXMWxmV0FwTzF4dUlDQmpiMjV6ZENCemRHRnlkQ0E5SUc1bGR5QkVZWFJsS0NrN1hHNWNiaUFnZEhKNUlIdGNiaUFnSUNCcFppQW9jMnRwY0NsY2JpQWdJQ0FnSUhJZ1BTQjdjM1ZqWTJWemN6b2dkSEoxWlN3Z2NtVnpkV3gwT2lCemEybHdVbVZoYzI5dUlTd2diWE02SURBc0lITnJhWEJ3WldRNklIUnlkV1Y5TzF4dUlDQWdJR1ZzYzJWY2JpQWdJQ0FnSUhJZ1BTQjdjM1ZqWTJWemN6b2dkSEoxWlN3Z2NtVnpkV3gwT2lCaGQyRnBkQ0IwTG5SbGMzUW9LU0EvUHlBblQwc25MQ0J0Y3pvZ01Dd2djMnRwY0hCbFpEb2dabUZzYzJWOU8xeHVJQ0I5SUdOaGRHTm9JQ2g0T2lCaGJua3BJSHRjYmlBZ0lDQnlJRDBnZTNOMVkyTmxjM002SUdaaGJITmxMQ0J5WlhOMWJIUTZJSGd1ZEc5VGRISnBibWNvS1N3Z2JYTTZJREFzSUhOcmFYQndaV1E2SUdaaGJITmxmVHRjYmlBZ2ZWeHVJQ0JqYjI1emRDQnpkRzl3SUQwZ2JtVjNJRVJoZEdVb0tUdGNiaUFnTHk4Z1FIUnpMV2xuYm05eVpWeHVJQ0J5TG0xeklEMGdjM1J2Y0NBdElITjBZWEowTzF4dUlDQnBaaUFvSVhOcmFYQXBYRzRnSUNBZ1kyOXVjMjlzWlM1c2IyY29ZRVpwYm1semFHVmtJQ1I3ZEM1allYUmxaMjl5ZVgwZ0pIdDBMbTVoYldWOUlHWnZjaUFrZTNJdWJYTjlJRzF6WUNrN1hHNWNiaUFnY2k1allYUmxaMjl5ZVNBOUlIUXVZMkYwWldkdmNuazdYRzRnSUhJdWJtRnRaU0E5SUhRdWJtRnRaVHRjYmlBZ2NtVjBkWEp1SUhJN1hHNTlYRzVjYmk4cUlGZGhhWFJ6SUZ0dGMxMGdiV2xzYkdselpXTnZibVJ6SUNvdlhHNWxlSEJ2Y25RZ1lYTjVibU1nWm5WdVkzUnBiMjRnWkdWc1lYa29iWE02SUc1MWJXSmxjaWtnZTF4dUlDQmhkMkZwZENCdVpYY2dVSEp2YldselpTZ29jaWtnUFQ0Z2MyVjBWR2x0Wlc5MWRDaHlMQ0J0Y3lrcE8xeHVmVnh1WEc1bGVIQnZjblFnWVhONWJtTWdablZ1WTNScGIyNGdZWGRoYVhSRGFHVmpheWhqYUdWamEwaGhibVJzWlhJNklDZ3BJRDArSUdKdmIyeGxZVzRzWEc0Z0lHVnljbTl5T2lCemRISnBibWNnUFNBblZHbHRaVzkxZENCbGVHTmxaV1JsWkNjc0lIZGhhWFE2SUc1MWJXSmxjaUE5SURVd01DazZJRkJ5YjIxcGMyVThkbTlwWkQ0Z2UxeHVJQ0J5WlhSMWNtNGdibVYzSUZCeWIyMXBjMlVvS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVJQ0FnSUhObGRGUnBiV1Z2ZFhRb0tDa2dQVDRnZTF4dUlDQWdJQ0FnWTJ4bFlYSkpiblJsY25aaGJDaHBiblJsY25aaGJDazdYRzRnSUNBZ0lDQnlaV3BsWTNRb2JtVjNJRVZ5Y205eUtHVnljbTl5S1NrN1hHNGdJQ0FnZlN3Z2QyRnBkQ2s3WEc0Z0lDQWdMeThnUUhSekxXbG5ibTl5WlZ4dUlDQWdJR052Ym5OMElHbHVkR1Z5ZG1Gc09pQlVhVzFsYjNWMElEMGdjMlYwU1c1MFpYSjJZV3dvS0NrZ1BUNGdlMXh1SUNBZ0lDQWdhV1lnS0dOb1pXTnJTR0Z1Wkd4bGNpZ3BLU0I3WEc0Z0lDQWdJQ0FnSUdOc1pXRnlTVzUwWlhKMllXd29hVzUwWlhKMllXd3BPMXh1SUNBZ0lDQWdJQ0J5WlhOdmJIWmxLQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmU3dnTlRBcE8xeHVJQ0I5S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x6UkdsaGJHOW5VSEpsYzJWdWRDaGthV0ZzYjJkVWFYUnNaVG9nYzNSeWFXNW5LVG9nWW05dmJHVmhiaUI3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dSRWN1UkdsaGJHOW5MbWRsZEU5d1pXNUVhV0ZzYjJkektDa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0JwWmlBb1JFY3VSR2xoYkc5bkxtZGxkRTl3Wlc1RWFXRnNiMmR6S0NsYmFWMHVkR2wwYkdVZ1BUMGdaR2xoYkc5blZHbDBiR1VwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkSEoxWlR0Y2JpQWdmVnh1SUNCeVpYUjFjbTRnWm1Gc2MyVTdYRzU5WEc1Y2JtVjRjRzl5ZENCaGMzbHVZeUJtZFc1amRHbHZiaUIwWlhOMFZtbGxkMlZ5S0hZNklITjBjbWx1Wnl3Z1pHWTZJRVJITGtSaGRHRkdjbUZ0WlN3Z1pHVjBaV04wVTJWdFlXNTBhV05VZVhCbGN6b2dZbTl2YkdWaGJpQTlJR1poYkhObEtUb2dVSEp2YldselpUeDJiMmxrUGlCN1hHNGdJR2xtSUNoa1pYUmxZM1JUWlcxaGJuUnBZMVI1Y0dWektTQmhkMkZwZENCbmNtOXJMbVJoZEdFdVpHVjBaV04wVTJWdFlXNTBhV05VZVhCbGN5aGtaaWs3WEc0Z0lHTnZibk4wSUhSMklEMGdaM0p2YXk1emFHVnNiQzVoWkdSVVlXSnNaVlpwWlhjb1pHWXBPMXh1SUNCamIyNXpkQ0IyYVdWM1pYSk9ZVzFsSUQwZ1lGdHVZVzFsUFhacFpYZGxjaTBrZTNZdWNtVndiR0ZqWlNndlhGeHpLeTluTENBbkxTY3BmU0JwWFdBN1hHNGdJR052Ym5OMElITmxiR1ZqZEc5eUlEMGdZQ1I3ZG1sbGQyVnlUbUZ0WlgwZ1kyRnVkbUZ6TENSN2RtbGxkMlZ5VG1GdFpYMGdjM1puTENSN2RtbGxkMlZ5VG1GdFpYMGdhVzFuTEZ4dUlDQWdJQ1I3ZG1sbGQyVnlUbUZ0WlgwZ2FXNXdkWFFzSkh0MmFXVjNaWEpPWVcxbGZTQm9NU3drZTNacFpYZGxjazVoYldWOUlHRmdPMXh1SUNCamIyNXpkQ0J5WlhNZ1BTQmJYVHRjYmlBZ2RISjVJSHRjYmlBZ0lDQnNaWFFnZG1sbGQyVnlJRDBnZEhZdVlXUmtWbWxsZDJWeUtIWXBPMXh1SUNBZ0lHRjNZV2wwSUdGM1lXbDBRMmhsWTJzb0tDa2dQVDRnWkc5amRXMWxiblF1Y1hWbGNubFRaV3hsWTNSdmNpaHpaV3hsWTNSdmNpa2dJVDA5SUc1MWJHd3NYRzRnSUNBZ0lDQW5ZMkZ1Ym05MElHeHZZV1FnZG1sbGQyVnlKeXdnTXpBd01DazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lFRnljbUY1TG1aeWIyMG9aR1l1Y205M0tEQXBMbU5sYkd4ektTNW1iM0pGWVdOb0tDaGpLU0E5UGlCakxuWmhiSFZsSUQwZ2JuVnNiQ2s3WEc0Z0lDQWdaR1l1Y205M2N5NXpaV3hsWTNRb0tISnZkeWtnUFQ0Z2NtOTNMbWxrZUNBK0lERWdKaVlnY205M0xtbGtlQ0E4SURjcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQTNPeUJwSUR3Z01USTdJR2tyS3lrZ1pHWXVabWxzZEdWeUxuTmxkQ2hwTENCbVlXeHpaU2s3WEc0Z0lDQWdaR1l1WTNWeWNtVnVkRkp2ZDBsa2VDQTlJREU3WEc0Z0lDQWdZMjl1YzNRZ2NISnZjSE1nUFNCMmFXVjNaWEl1WjJWMFQzQjBhVzl1Y3loMGNuVmxLUzVzYjI5ck8xeHVJQ0FnSUdOdmJuTjBJRzVsZDFCeWIzQnpPaUJTWldOdmNtUThjM1J5YVc1bkxDQmliMjlzWldGdVBpQTlJSHQ5TzF4dUlDQWdJRTlpYW1WamRDNXJaWGx6S0hCeWIzQnpLUzVtYVd4MFpYSW9LR3NwSUQwK0lIUjVjR1Z2WmlCd2NtOXdjMXRyWFNBOVBUMGdKMkp2YjJ4bFlXNG5LUzVtYjNKRllXTm9LQ2hyS1NBOVBpQnVaWGRRY205d2MxdHJYU0E5SUNGd2NtOXdjMXRyWFNrN1hHNGdJQ0FnZG1sbGQyVnlMbk5sZEU5d2RHbHZibk1vYm1WM1VISnZjSE1wTzF4dUlDQWdJR0YzWVdsMElHUmxiR0Y1S0RJMU1DazdYRzRnSUNBZ1kyOXVjM1FnYkdGNWIzVjBJRDBnZEhZdWMyRjJaVXhoZVc5MWRDZ3BPMXh1SUNBZ0lHTnZibk4wSUc5c1pGQnliM0J6SUQwZ2RtbGxkMlZ5TG1kbGRFOXdkR2x2Ym5Nb0tTNXNiMjlyTzF4dUlDQWdJSFIyTG5KbGMyVjBUR0Y1YjNWMEtDazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lIUjJMbXh2WVdSTVlYbHZkWFFvYkdGNWIzVjBLVHRjYmlBZ0lDQmhkMkZwZENCaGQyRnBkRU5vWldOcktDZ3BJRDArSUdSdlkzVnRaVzUwTG5GMVpYSjVVMlZzWldOMGIzSW9jMlZzWldOMGIzSXBJQ0U5UFNCdWRXeHNMRnh1SUNBZ0lDQWdKMk5oYm01dmRDQnNiMkZrSUhacFpYZGxjaUJtY205dElHeGhlVzkxZENjc0lETXdNREFwTzF4dUlDQWdJR0YzWVdsMElHUmxiR0Y1S0RJMU1DazdYRzRnSUNBZ2NtVnpMbkIxYzJnb1FYSnlZWGt1Wm5KdmJTaDBkaTUyYVdWM1pYSnpLUzVzWlc1bmRHZ3BPMXh1SUNBZ0lIWnBaWGRsY2lBOUlFRnljbUY1TG1aeWIyMG9kSFl1ZG1sbGQyVnljeWt1Wm1sdVpDZ29kaWtnUFQ0Z2RpNTBlWEJsSUNFOVBTQW5SM0pwWkNjcElUdGNiaUFnSUNCbGVIQmxZM1JCY25KaGVTaHlaWE1zSUZzeUxDQXhMQ0F5WFNrN1hHNGdJQ0FnWlhod1pXTjBLRXBUVDA0dWMzUnlhVzVuYVdaNUtIWnBaWGRsY2k1blpYUlBjSFJwYjI1ektDa3ViRzl2YXlrc0lFcFRUMDR1YzNSeWFXNW5hV1o1S0c5c1pGQnliM0J6S1NrN1hHNGdJSDBnWm1sdVlXeHNlU0I3WEc0Z0lDQWdkSFl1WTJ4dmMyVW9LVHRjYmlBZ0lDQm5jbTlyTG5Ob1pXeHNMbU5zYjNObFZHRmliR1VvWkdZcE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBjYXRlZ29yeSwgZXhwZWN0LCB0ZXN0IH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdGVzdCc7XG5pbXBvcnQgeyBwYXJzZUhlbG0gfSBmcm9tICcuLi91dGlscyc7XG5jYXRlZ29yeSgnSGVsbScsICgpID0+IHtcbiAgICAvL1RoZXNlIHRlc3RzIHJlcXVpcmUgd2Vic2VydmljZSB0aGF0IGlzIG5vdCBwcmVzZW50IG9uIHRlc3Qgc3RhbmRcbiAgICAvLyB0ZXN0KCdoZWxtVG9GYXN0YScsIGFzeW5jICgpID0+IHtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUk5BMXtSKFUpUC5SKFQpUC5SKEcpUC5SKEMpUC5SKEEpfSQkJCQnKSwgJz5STkExVVRHQ0EnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUk5BMXtQLlIoVSkuUC5SKFQpfSQkJCQnKSwgJz5STkExVVQnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9GYXN0YSgnUEVQVElERTF7QS5HfSQkJCRWMi4wJyksICc+UEVQVElERTFBRycpO1xuICAgIC8vIH0pO1xuICAgIC8vXG4gICAgLy8gdGVzdCgnaGVsbVRvUk5BJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgZXhwZWN0KGF3YWl0IGhlbG1Ub1JOQSgnUk5BMXtSKFUpUC5SKFQpUC5SKEcpUC5SKEMpUC5SKEEpfSQkJCQnKSwgJ1VUR0NBJyk7XG4gICAgLy8gICBleHBlY3QoYXdhaXQgaGVsbVRvUk5BKCdSTkExe1AuUihVKS5QLlIoVCl9JCQkJCcpLCAnVVQnKTtcbiAgICAvLyAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgLy8gICBleHBlY3QoYXdhaXQgaGVsbVRvUk5BKCdSTkExe1IoVSlQLlIoVClQfXxSTkEye1AuUihBKVAuUihBKX0kUk5BMSxSTkEyLDI6cGFpci02OnBhaXJ8Uk5BMSxSTkEyLDU6cGFpci0zOnBhaXIkJCQnKSwgJ1VUIEFBJyk7XG4gICAgLy8gfSk7XG4gICAgLy9cbiAgICAvLyB0ZXN0KCdoZWxtVG9QZXB0aWRlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgZXhwZWN0KGF3YWl0IGhlbG1Ub1BlcHRpZGUoJ1BFUFRJREUxe0EuR30kJCQkVjIuMCcpLCAnQUcnKTtcbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9QZXB0aWRlKCdQRVBUSURFMXtMLlYuQX18UEVQVElERTJ7TC5WLkF9JCQkJCcpLCAnTFZBIExWQScpO1xuICAgIC8vICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAvLyAgIGV4cGVjdChhd2FpdCBoZWxtVG9QZXB0aWRlKCdQRVBUSURFMXtBLlIuQy5BLkEuSy5ULkMuRC5BfSRQRVBUSURFMSxQRVBUSURFMSw4OlIzLTM6UjMkJCQnKSwgJ0FSQ0FBS1RDREEnKTtcbiAgICAvLyB9KTtcbiAgICAvLyBkZXRlY3RNYWNyb21vbGVjdWxlIGlzIGEgZnVuY3Rpb24gb2YgQmlvIHBhY2thZ2VcbiAgICAvLyB0ZXN0KCdkZXRlY3RNYWNyb21vbGVjdWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZmlsZSA9IGF3YWl0IF9wYWNrYWdlLmZpbGVzLnJlYWRBc1RleHQoJ3Rlc3RzL3Rlc3QuY3N2Jyk7XG4gICAgLy8gICBjb25zdCBkZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGZpbGUpO1xuICAgIC8vICAgY29uc3QgY29sID0gZGYuY29sdW1ucy5ieU5hbWUoJ0hFTE0gc3RyaW5nJyk7XG4gICAgLy8gICBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgLy8gICBleHBlY3QoY29sLnNlbVR5cGUsIERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gICAgLy8gfSk7XG4gICAgLy8gc2VtVHlwZSBhbmQgdW5pdHMgdGFncyBhcmUgZGV0ZWN0aW5nIGJ5IEJpbyBwYWNrYWdlIGZ1bmN0aW9uIGRldGVjdE1hY3JvbW9sZWN1bGVcbiAgICAvLyB0ZXN0KCdkZXRlY3RIZWxtJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgY29uc3QgZmlsZSA9IGF3YWl0IF9wYWNrYWdlLmZpbGVzLnJlYWRBc1RleHQoJ3Rlc3RzL3Rlc3QuY3N2Jyk7XG4gICAgLy8gICBjb25zdCBkZiA9IERHLkRhdGFGcmFtZS5mcm9tQ3N2KGZpbGUpO1xuICAgIC8vICAgY29uc3QgY29sID0gZGYuY29sdW1ucy5ieU5hbWUoJ0hFTE0gc3RyaW5nJyk7XG4gICAgLy8gICBhd2FpdCBncm9rLmRhdGEuZGV0ZWN0U2VtYW50aWNUeXBlcyhkZik7XG4gICAgLy8gICBleHBlY3QoY29sLnRhZ3NbREcuVEFHUy5VTklUU10sICdIRUxNJyk7XG4gICAgLy8gfSk7XG4gICAgdGVzdCgncGFyc2VIZWxtJywgKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdWx0cyA9IFtcbiAgICAgICAgICAgIFsnbWVJJywgJ2hIaXMnLCAnQWNhJywgJ04nLCAnVCcsICdkSycsICdUaHJfUE8zSDInLCAnRC1UeXJfRXQnLCAnQXplJywgJ2RWJywgJ0UnLCAnUGhlXzRNZSddLFxuICAgICAgICAgICAgWydBJywgJ0MnLCAnVCcsICdHJywgJ1cnLCAnRScsICdRJ10sXG4gICAgICAgICAgICBbJ1InLCAnVScsICdQJywgJ1QnLCAnQSddLFxuICAgICAgICAgICAgWydBJywgJyonLCAnRycsICdDJ11cbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaGVsbVN0cmluZ3MgPSBbXG4gICAgICAgICAgICAnUEVQVElERTF7bWVJLmhIaXMuQWNhLk4uVC5kSy5UaHJfUE8zSDIuQWNhLkQtVHlyX0V0LkF6ZS5kVi5FLk4uZFYuUGhlXzRNZX0kJCQnLFxuICAgICAgICAgICAgJ1BFUFRJREUxe0EuQy5ULkcuQy5ULlcuRy5ULlcuRS5DLlcuQy5RLld9fFBFUFRJREUye0EuQy5ULkcuQy5ULlcuRy5ULlcuRS5RfSRQRVBUSURFMSxQRVBUSURFMSw1OlIzLTE0OlIzfFBFUFRJREUyLFBFUFRJREUxLDI6UjMtMTI6UjMkJCQnLFxuICAgICAgICAgICAgJ1JOQTF7UihVKVAuUihUKVB9fFJOQTJ7UC5SKEEpUC5SKEEpfSRSTkExLFJOQTIsMjpwYWlyLTY6cGFpcnxSTkExLFJOQTIsNTpwYWlyLTM6cGFpciQkJCcsXG4gICAgICAgICAgICAnUEVQVElERTF7QS4qLkcuQ30kJCQkVjIuMCdcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgaGVsbVN0cmluZ3MubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgbGV0IG1vbm9tZXJTZXQgPSBuZXcgU2V0KHBhcnNlSGVsbShoZWxtU3RyaW5nc1tpZHhdKSk7XG4gICAgICAgICAgICBsZXQgbW9ub21lckFycmF5ID0gQXJyYXkuZnJvbShtb25vbWVyU2V0KTtcbiAgICAgICAgICAgIGV4cGVjdChKU09OLnN0cmluZ2lmeShtb25vbWVyQXJyYXkpLCBKU09OLnN0cmluZ2lmeShleHBlY3RlZFJlc3VsdHNbaWR4XSkpO1xuICAgICAgICB9XG4gICAgfSkpO1xufSk7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0UGFydHMoc3ViUGFydHMsIHMpIHtcbiAgICBsZXQgaiA9IDA7XG4gICAgbGV0IGFsbFBhcnRzID0gW107XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzdWJQYXJ0cy5sZW5ndGg7ICsraykge1xuICAgICAgICBsZXQgaW5kZXhPZk1vbm9tZXIgPSBzLmluZGV4T2Yoc3ViUGFydHNba10pO1xuICAgICAgICBsZXQgaGVsbUJlZm9yZU1vbm9tZXIgPSBzLnNsaWNlKGosIGluZGV4T2ZNb25vbWVyKTtcbiAgICAgICAgYWxsUGFydHMucHVzaChoZWxtQmVmb3JlTW9ub21lcik7XG4gICAgICAgIGFsbFBhcnRzLnB1c2goc3ViUGFydHNba10pO1xuICAgICAgICBzID0gcy5zdWJzdHJpbmcoaW5kZXhPZk1vbm9tZXIgKyBzdWJQYXJ0c1trXS5sZW5ndGgpO1xuICAgIH1cbiAgICBhbGxQYXJ0cy5wdXNoKHMpO1xuICAgIHJldHVybiBhbGxQYXJ0cztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhlbG0ocykge1xuICAgIHZhciBzZWN0aW9ucyA9IHNwbGl0KHMsICckJyk7XG4gICAgcyA9IHNlY3Rpb25zWzBdO1xuICAgIHZhciBtb25vbWVycyA9IFtdO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmICghc2NpbC5VdGlscy5pc051bGxPckVtcHR5KHMpKSB7XG4gICAgICAgIHZhciBzZXFzID0gc3BsaXQocywgJ3wnKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXFzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGRldGFjaEFubm90YXRpb24oc2Vxc1tpXSk7XG4gICAgICAgICAgICBzID0gZS5zdHI7XG4gICAgICAgICAgICB2YXIgcCA9IHMuaW5kZXhPZigneycpO1xuICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKHAgKyAxKTtcbiAgICAgICAgICAgIHAgPSBzLmluZGV4T2YoJ30nKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBwKTtcbiAgICAgICAgICAgIHZhciBzcyA9IHNwbGl0KHMsICcuJyk7XG4gICAgICAgICAgICBmb3IgKHZhciBtb25vbWVyIG9mIHNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vbm9tZXIuaW5jbHVkZXMoJygnKSAmJiBtb25vbWVyLmluY2x1ZGVzKCcpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gbW9ub21lci5yZXBsYWNlKC9bKCldL2csICcnKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb25vbWVycy5wdXNoKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb25vbWVyLmluY2x1ZGVzKCdbJykgJiYgbW9ub21lci5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbW9ub21lci5tYXRjaCgvKD88PVxcWykuKj8oPz1cXF0pL2csICcnKTtcbiAgICAgICAgICAgICAgICAgICAgbW9ub21lcnMucHVzaChlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbm9tZXJzLnB1c2gobW9ub21lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb25vbWVycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTW9ub21lcnMoaGVsbVN0cmluZykge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LmtleXMob3JnLmhlbG0ud2ViZWRpdG9yLm1vbm9tZXJUeXBlTGlzdCgpKTtcbiAgICBjb25zdCBtb25vbWVycyA9IFtdO1xuICAgIGNvbnN0IG1vbm9tZXJfbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBtb25vbWVycy5wdXNoKG5ldyBzY2lsLmhlbG0uTW9ub21lcnMuZ2V0TW9ub21lclNldCh0eXBlc1tpXSkpO1xuICAgICAgICBPYmplY3Qua2V5cyhtb25vbWVyc1tpXSkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIG1vbm9tZXJfbmFtZXMucHVzaChtb25vbWVyc1tpXVtrXS5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdF9zdHJpbmcgPSBwYXJzZUhlbG0oaGVsbVN0cmluZyk7XG4gICAgcmV0dXJuIG5ldyBTZXQoc3BsaXRfc3RyaW5nLmZpbHRlcih2YWwgPT4gIW1vbm9tZXJfbmFtZXMuaW5jbHVkZXModmFsKSkpO1xufVxuZnVuY3Rpb24gc3BsaXQocywgc2VwKSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBmcmFnID0gJyc7XG4gICAgdmFyIHBhcmVudGhlc2VzID0gMDtcbiAgICB2YXIgYnJhY2tldCA9IDA7XG4gICAgdmFyIGJyYWNlcyA9IDA7XG4gICAgdmFyIHF1b3RlID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7XG4gICAgICAgIGlmIChjID09IHNlcCAmJiBicmFja2V0ID09IDAgJiYgcGFyZW50aGVzZXMgPT0gMCAmJiBicmFjZXMgPT0gMCAmJiBxdW90ZSA9PSAwKSB7XG4gICAgICAgICAgICByZXQucHVzaChmcmFnKTtcbiAgICAgICAgICAgIGZyYWcgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZyYWcgKz0gYztcbiAgICAgICAgICAgIGlmIChxdW90ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFxcXCcgJiYgaSArIDEgPCBzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjMiA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgZnJhZyArPSBjMjtcbiAgICAgICAgICAgICAgICAgICAgYyArPSBjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PSAnXFxcIicpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShpID4gMCAmJiBzLnN1YnN0cmluZyhpIC0gMSwgaSkgPT0gJ1xcXFwnKSlcbiAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBxdW90ZSA9PSAwID8gMSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICdbJylcbiAgICAgICAgICAgICAgICArK2JyYWNrZXQ7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICddJylcbiAgICAgICAgICAgICAgICAtLWJyYWNrZXQ7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICcoJylcbiAgICAgICAgICAgICAgICArK3BhcmVudGhlc2VzO1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnKScpXG4gICAgICAgICAgICAgICAgLS1wYXJlbnRoZXNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ3snKVxuICAgICAgICAgICAgICAgICsrYnJhY2VzO1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnfScpXG4gICAgICAgICAgICAgICAgLS1icmFjZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0LnB1c2goZnJhZyk7XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGRldGFjaEFubm90YXRpb24ocykge1xuICAgIHZhciByZXQgPSBfZGV0YWNoQXBwZW5kaXgocywgJ1xcXCInKTtcbiAgICBpZiAocmV0LnRhZyAhPSBudWxsKVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIHZhciByID0gX2RldGFjaEFwcGVuZGl4KHMsICdcXCcnKTtcbiAgICByZXR1cm4geyB0YWc6IHJldC50YWcsIHJlcGVhdDogci50YWcsIHN0cjogci5zdHIgfTtcbn1cbmZ1bmN0aW9uIF9kZXRhY2hBcHBlbmRpeChzLCBjKSB7XG4gICAgdmFyIHRhZyA9IG51bGw7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYgKHNjaWwuVXRpbHMuZW5kc3dpdGgocywgYykpIHtcbiAgICAgICAgdmFyIHAgPSBzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChwID4gMCkge1xuICAgICAgICAgICAgcCA9IHMubGFzdEluZGV4T2YoYywgcCAtIDEpO1xuICAgICAgICAgICAgaWYgKHAgPD0gMCB8fCBzLnN1YnN0cmluZyhwIC0gMSwgcCkgIT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID4gMCAmJiBwIDwgcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0YWcgPSBzLnN1YnN0cmluZyhwICsgMSwgcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygwLCBwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFnICE9IG51bGwpXG4gICAgICAgIHRhZyA9IHRhZy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwnICsgYywgJ2cnKSwgYyk7XG4gICAgcmV0dXJuIHsgdGFnOiB1bmVzY2FwZSh0YWcpLCBzdHI6IHMgfTtcbn1cbmZ1bmN0aW9uIHVuZXNjYXBlKHMpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBpZiAoc2NpbC5VdGlscy5pc051bGxPckVtcHR5KHMpKVxuICAgICAgICByZXR1cm4gcztcbiAgICByZXR1cm4gcy5yZXBsYWNlKC9bXFxcXF0uL2csIGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHN3aXRjaCAobSkge1xuICAgICAgICAgICAgY2FzZSAnXFxcXHInOlxuICAgICAgICAgICAgICAgIHJldHVybiAnXFxyJztcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1xcbic7XG4gICAgICAgICAgICBjYXNlICdcXFxcdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdcXHQnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gREc7IiwibW9kdWxlLmV4cG9ydHMgPSBncm9rOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBydW5UZXN0cywgdGVzdHMgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90ZXN0JztcbmltcG9ydCAnLi90ZXN0cy9oZWxtLXRlc3RzLnRzJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5leHBvcnQgeyB0ZXN0cyB9O1xuLy9uYW1lOiB0ZXN0XG4vL2lucHV0OiBzdHJpbmcgY2F0ZWdvcnkge29wdGlvbmFsOiB0cnVlfVxuLy9pbnB1dDogc3RyaW5nIHRlc3Qge29wdGlvbmFsOiB0cnVlfVxuLy9pbnB1dDogb2JqZWN0IHRlc3RDb250ZXh0IHtvcHRpb25hbDogdHJ1ZX1cbi8vb3V0cHV0OiBkYXRhZnJhbWUgcmVzdWx0XG5leHBvcnQgZnVuY3Rpb24gdGVzdChjYXRlZ29yeSwgdGVzdCwgdGVzdENvbnRleHQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkYXRhID0geWllbGQgcnVuVGVzdHMoeyBjYXRlZ29yeSwgdGVzdCwgdGVzdENvbnRleHQgfSk7XG4gICAgICAgIHJldHVybiBERy5EYXRhRnJhbWUuZnJvbU9iamVjdHMoZGF0YSk7XG4gICAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
1
+ var helm_test;(()=>{"use strict";var t={d:(e,n)=>{for(var s in n)t.o(n,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:n[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>y,test:()=>m,tests:()=>o});const n=DG,s=grok;var r=function(t,e,n,s){return new(n||(n=Promise))((function(r,o){function i(t){try{c(s.next(t))}catch(t){o(t)}}function l(t){try{c(s.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}c((s=s.apply(t,e||[])).next())}))};const o={};let i;var l;!function(t){t.notNull=function(t,e){if(null==t)throw new Error(`${null==e?"Value":e} not defined`)}}(l||(l={}));class c{constructor(t,e){this.catchUnhandled=!0,this.report=!1,void 0!==t&&(this.catchUnhandled=t),void 0!==e&&(this.report=e)}}class a{constructor(t,e,n,s){var o;this.category=t,this.name=e,null!=s||(s={}),null!==(o=s.timeout)&&void 0!==o||(s.timeout=3e4),this.options=s,this.test=()=>r(this,void 0,void 0,(function*(){return new Promise(((t,e)=>r(this,void 0,void 0,(function*(){let s="";try{s=yield n()}catch(t){e(t)}t(s)}))))}))}}function u(t,e){if(t!==e)throw new Error(`Expected "${e}", got "${t}"`)}function f(t,e){var n,s,o;return r(this,void 0,void 0,(function*(){let r;const i=null!=e&&!t.name.toLowerCase().startsWith(e.toLowerCase()),l=(null===(n=t.options)||void 0===n?void 0:n.skipReason)||i,c=i?"skipped":null===(s=t.options)||void 0===s?void 0:s.skipReason;l||console.log(`Started ${t.category} ${t.name}`);const a=new Date;try{r=l?{success:!0,result:c,ms:0,skipped:!0}:{success:!0,result:null!==(o=yield t.test())&&void 0!==o?o:"OK",ms:0,skipped:!1}}catch(t){r={success:!1,result:t.toString(),ms:0,skipped:!1}}const u=new Date;return r.ms=u-a,l||console.log(`Finished ${t.category} ${t.name} for ${r.ms} ms`),r.category=t.category,r.name=t.name,r}))}function d(t){t=h(t,"$")[0];var e=[];if(!scil.Utils.isNullOrEmpty(t))for(var n=h(t,"|"),s=0;s<n.length;++s){var r=(t=p(n[s]).str).indexOf("{");r=(t=t.substring(r+1)).indexOf("}");var o=h(t=t.substring(0,r),".");for(var i of o)if(i.includes("(")&&i.includes(")")){var l=i.replace(/[()]/g,"").split("");for(var c of l)e.push(c)}else if(i.includes("[")&&i.includes("]")){var a=i.match(/(?<=\[).*?(?=\])/g,"");e.push(a[0])}else e.push(i)}return e}function h(t,e){for(var n=[],s="",r=0,o=0,i=0,l=0,c=0;c<t.length;++c){var a=t.substring(c,c+1);if(a==e&&0==o&&0==r&&0==i&&0==l)n.push(s),s="";else{if(s+=a,l>0&&"\\"==a&&c+1<t.length){++c;var u=t.substring(c,c+1);s+=u,a+=u}'"'==a?c>0&&"\\"==t.substring(c-1,c)||(l=0==l?1:0):"["==a?++o:"]"==a?--o:"("==a?++r:")"==a?--r:"{"==a?++i:"}"==a&&--i}}return n.push(s),n}function p(t){var e=g(t,'"');if(null!=e.tag)return e;var n=g(t,"'");return{tag:e.tag,repeat:n.tag,str:n.str}}function g(t,e){var n=null;if(scil.Utils.endswith(t,e)){for(var s=t.length-1;s>0&&!((s=t.lastIndexOf(e,s-1))<=0||"\\"!=t.substring(s-1,s)););s>0&&s<t.length-1&&(n=t.substring(s+1,t.length-1),t=t.substring(0,s))}return null!=n&&(n=n.replace(new RegExp("\\"+e,"g"),e)),{tag:v(n),str:t}}function v(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}!function(t,e){i="Helm",e()}(0,(()=>{null==o[i]&&(o[i]={}),null==o[i].tests&&(o[i].tests=[]),o[i].tests.push(new a(i,"parseHelm",(()=>{return t=void 0,e=void 0,s=function*(){const t=[["meI","hHis","Aca","N","T","dK","Thr_PO3H2","D-Tyr_Et","Aze","dV","E","Phe_4Me"],["A","C","T","G","W","E","Q"],["R","U","P","T","A"],["A","*","G","C"]],e=["PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$","PEPTIDE1{A.C.T.G.C.T.W.G.T.W.E.C.W.C.Q.W}|PEPTIDE2{A.C.T.G.C.T.W.G.T.W.E.Q}$PEPTIDE1,PEPTIDE1,5:R3-14:R3|PEPTIDE2,PEPTIDE1,2:R3-12:R3$$$","RNA1{R(U)P.R(T)P}|RNA2{P.R(A)P.R(A)}$RNA1,RNA2,2:pair-6:pair|RNA1,RNA2,5:pair-3:pair$$$","PEPTIDE1{A.*.G.C}$$$$V2.0"];for(let n=0;n<e.length;++n){let s=new Set(d(e[n])),r=Array.from(s);u(JSON.stringify(r),JSON.stringify(t[n]))}},new((n=void 0)||(n=Promise))((function(r,o){function i(t){try{c(s.next(t))}catch(t){o(t)}}function l(t){try{c(s.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(i,l)}c((s=s.apply(t,e||[])).next())}));var t,e,n,s}),void 0))}));const y=new n.Package;function m(t,e,i){return l=this,a=void 0,d=function*(){const l=yield function(t){var e,i,l,a,u;return r(this,void 0,void 0,(function*(){const d=[],h=null===(i=null===(e=s.functions.getCurrentCall())||void 0===e?void 0:e.func)||void 0===i?void 0:i.package;console.log("Running tests"),null!=t||(t={}),null!==(l=(u=t).testContext)&&void 0!==l||(u.testContext=new c),s.shell.lastError="";for(const[e,n]of Object.entries(o)){if(null!=(null==t?void 0:t.category)&&!e.toLowerCase().startsWith(null==t?void 0:t.category.toLowerCase()))continue;console.log(`Started ${e} category`);try{n.before&&(yield n.before())}catch(t){n.beforeStatus=t.toString()}const s=null!==(a=n.tests)&&void 0!==a?a:[],r=[];for(let e=0;e<s.length;e++)r.push(yield f(s[e],null==t?void 0:t.test));const o=(yield Promise.all(r)).filter((t=>"skipped"!=t.result));try{n.after&&(yield n.after())}catch(t){n.afterStatus=t.toString()}n.afterStatus&&o.push({category:e,name:"init",result:n.afterStatus,success:!1,ms:0,skipped:!1}),n.beforeStatus&&o.push({category:e,name:"init",result:n.beforeStatus,success:!1,ms:0,skipped:!1}),d.push(...o)}if(t.testContext.catchUnhandled&&(yield function(t){return r(this,void 0,void 0,(function*(){yield new Promise((e=>setTimeout(e,t)))}))}(1e3),s.shell.lastError.length>0&&d.push({category:"Unhandled exceptions",name:"exceptions",result:s.shell.lastError,success:!1,ms:0,skipped:!1})),t.testContext.report){const t=new n.Logger,e=d.filter((t=>t.success)).length,s=d.filter((t=>t.skipped)).length,r=d.filter((t=>!t.success)),o="Package @package tested: @successful successful, @skipped skipped, @failed failed tests",i={successful:e,skipped:s,failed:r.length,package:h};for(const t of r)Object.assign(i,{[`${t.category} | ${t.name}`]:t.result});t.log(o,i,"package-tested")}return d}))}({category:t,test:e,testContext:i});return n.DataFrame.fromObjects(l)},new((u=void 0)||(u=Promise))((function(t,e){function n(t){try{r(d.next(t))}catch(t){e(t)}}function s(t){try{r(d.throw(t))}catch(t){e(t)}}function r(e){var r;e.done?t(e.value):(r=e.value,r instanceof u?r:new u((function(t){t(r)}))).then(n,s)}r((d=d.apply(l,a||[])).next())}));var l,a,u,d}helm_test=e})();
2
+ //# sourceMappingURL=package-test.js.map