PluginProbe ʕ •ᴥ•ʔ
JetFormBuilder — Dynamic Blocks Form Builder / 3.6.2
JetFormBuilder — Dynamic Blocks Form Builder v3.6.2
3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.10 2.1.11 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.0 3.0.0.1 3.0.0.2 3.0.0.3 3.0.1 3.0.1.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.0.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.3.1 3.3.4 3.3.4.1 3.3.4.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.5.1 3.4.5.2 3.4.6 3.4.7 3.4.7.1 3.5.0 3.5.1 3.5.1.1 3.5.1.2 3.5.2 3.5.2.1 3.5.3 3.5.4 3.5.5 3.5.6 3.5.6.1 3.5.6.2 3.5.6.3 3.6.0
jetformbuilder / assets / build / frontend / advanced.reporting.js
jetformbuilder / assets / build / frontend Last commit date
advanced.reporting.asset.php 1 month ago advanced.reporting.js 1 month ago calculated.field.asset.php 1 month ago calculated.field.js 1 month ago conditional.block.asset.php 1 month ago conditional.block.js 1 month ago dynamic.value.asset.php 1 month ago dynamic.value.js 1 month ago main.asset.php 1 month ago main.css 1 month ago main.js 1 month ago media.field.asset.php 1 month ago media.field.js 1 month ago media.field.restrictions.asset.php 1 month ago media.field.restrictions.js 1 month ago multi.step.asset.php 1 month ago multi.step.js 1 month ago
advanced.reporting.js
1485 lines
1 /******/ (() => { // webpackBootstrap
2 /******/ "use strict";
3 /******/ var __webpack_modules__ = ({
4
5 /***/ "./frontend/advanced.reporting/AdvancedReporting.js"
6 /*!**********************************************************!*\
7 !*** ./frontend/advanced.reporting/AdvancedReporting.js ***!
8 \**********************************************************/
9 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
10
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 /* harmony export */ });
15 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/advanced.reporting/functions.js");
16
17 const {
18 ReportingInterface
19 } = JetFormBuilderAbstract;
20 const {
21 allRejected
22 } = JetFormBuilderFunctions;
23
24 /**
25 * @property {AdvancedRestriction} restrictions List of advanced restrictions
26 *
27 * @this {ReportingInterface}
28 * @class
29 */
30 function AdvancedReporting() {
31 ReportingInterface.call(this);
32 this.type = 'inherit';
33 this.messages = {};
34 this.skipServerSide = true;
35
36 /**
37 * Computed property which contain all attrs
38 * for all supported restrictions
39 *
40 * @see AdvancedRestriction.onReady
41 *
42 * @type {string[]}
43 */
44 this.watchAttrs = [];
45 this.queue = [];
46 }
47 AdvancedReporting.prototype = Object.create(ReportingInterface.prototype);
48 AdvancedReporting.prototype.skipServerSide = true;
49 AdvancedReporting.prototype.hasServerSide = false;
50 AdvancedReporting.prototype.isProcess = null;
51 AdvancedReporting.prototype.queue = [];
52 AdvancedReporting.prototype.setRestrictions = function () {
53 (0,_functions__WEBPACK_IMPORTED_MODULE_0__.setRestrictions)(this);
54 };
55 AdvancedReporting.prototype.isSupported = function (node, input) {
56 this.type = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getNodeValidationType)(node);
57 const inherit = 'inherit' === this.type ? (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getInheritValidationType)(input) : this.type;
58 return !!inherit?.length;
59 };
60 AdvancedReporting.prototype.getErrorsRaw = async function (promises, signal = null) {
61 if (this.hasServerSide) {
62 this.input.loading.start();
63 }
64 let errors = await allRejected(promises);
65 this.valuePrev = this.input.getValue();
66 if (this.hasServerSide) {
67 this.input.loading.end();
68 }
69 if (signal?.aborted) {
70 errors = [];
71 }
72 return errors;
73 };
74
75 /**
76 * @param validationErrors {AdvancedRestriction[]|Restriction[]}
77 */
78 AdvancedReporting.prototype.reportRaw = function (validationErrors) {
79 let message = '';
80 for (const validationError of validationErrors) {
81 message = validationError.getMessage();
82 if (message?.length) {
83 break;
84 }
85 }
86 if (!message) {
87 this.clearReport();
88 return;
89 }
90 this.insertError(message);
91 };
92 AdvancedReporting.prototype.setInput = function (input) {
93 this.messages = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getValidationMessages)(input.nodes[0]);
94 ReportingInterface.prototype.setInput.call(this, input);
95 };
96 /**
97 * @since 3.0.5 Introduced
98 */
99 AdvancedReporting.prototype.observeAttrs = function () {
100 for (const watchAttr of this.watchAttrs) {
101 if (!this.input.attrs.hasOwnProperty(watchAttr)) {
102 continue;
103 }
104 /**
105 * @type {BaseHtmlAttr}
106 */
107 const attr = this.input.attrs[watchAttr];
108 attr.value.watch(() => {
109 this.valuePrev = null;
110 this.validateOnBlur();
111 });
112 }
113 };
114 AdvancedReporting.prototype.clearReport = function () {
115 const inner = () => {
116 const node = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getWrapper)(this.getNode());
117 if (!node) {
118 return;
119 }
120 node.classList.remove('field-has-error');
121 const error = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getErrorNode)(node);
122 if (!error) {
123 return;
124 }
125 error.remove();
126 };
127 inner();
128 this.makeValid();
129 };
130 AdvancedReporting.prototype.insertError = function (message) {
131 const inner = () => {
132 const node = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getWrapper)(this.getNode());
133 const error = this.createError(node, message);
134 node.classList.add('field-has-error');
135 if (error.isConnected) {
136 return;
137 }
138
139 // it can be on fields_layout === 'row'
140 const colEnd = node.querySelector('.jet-form-builder-col__end');
141 if (colEnd) {
142 colEnd.appendChild(error);
143 } else {
144 node.appendChild(error);
145 }
146 };
147 inner();
148 this.makeInvalid();
149 };
150 AdvancedReporting.prototype.createError = function (node, message) {
151 const error = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getErrorNode)(node);
152 if (error) {
153 error.innerHTML = message;
154 return error;
155 }
156 const inputNode = this.getNode();
157 const div = document.createElement('div');
158 div.classList.add('error-message');
159 div.innerHTML = message;
160 div.id = inputNode.id + '__error';
161 return div;
162 };
163 AdvancedReporting.prototype.makeInvalid = function () {
164 var _errorNode$id;
165 const wrapper = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getWrapper)(this.getNode());
166 const errorNode = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getErrorNode)(wrapper);
167 this.getNode().setAttribute('aria-invalid', 'true');
168 this.getNode().setAttribute('aria-describedby', (_errorNode$id = errorNode?.id) !== null && _errorNode$id !== void 0 ? _errorNode$id : false);
169 };
170 AdvancedReporting.prototype.makeValid = function () {
171 this.getNode().removeAttribute('aria-invalid');
172 this.getNode().removeAttribute('aria-describedby');
173 };
174 AdvancedReporting.prototype.validateOnChange = function (addToQueue = false) {
175 // Don't validate on initial load if field is empty
176 const currentValue = this.input.getValue();
177 if (!currentValue || currentValue === '') {
178 // Only skip validation if this is the initial load (valuePrev is null)
179 // and the field is empty AND we're in silence mode (not form submission)
180 if (this.valuePrev === null && this.input.getContext().silence) {
181 return;
182 }
183 }
184 this.switchButtonsState(true);
185 const callback = () => {
186 this.input.getContext().setSilence(false);
187 this.validate().then(() => {}).catch(() => {}).finally(() => {
188 this.isProcess = null;
189 const queue = [...this.queue];
190 this.queue = [];
191 if (!queue.length) {
192 this.switchButtonsState();
193 return;
194 }
195 this.valuePrev = null;
196 queue.forEach(current => current());
197 this.switchButtonsState();
198 });
199 };
200
201 /**
202 * @see https://github.com/Crocoblock/issues-tracker/issues/1766
203 */
204 if (addToQueue && this.isProcess) {
205 this.queue = [callback];
206 }
207 if (this.isProcess) {
208 return;
209 }
210 this.isProcess = true;
211 callback();
212 };
213 AdvancedReporting.prototype.validateOnBlur = function (signal = null) {
214 /**
215 * @see https://github.com/Crocoblock/issues-tracker/issues/1766
216 */
217 if (this.isProcess) {
218 return;
219 }
220
221 // Don't validate on initial load if field is empty
222 const currentValue = this.input.getValue();
223 if (!currentValue || currentValue === '') {
224 // Only skip validation if this is the initial load (valuePrev is null)
225 // and the field is empty AND we're in silence mode (not form submission)
226 if (this.valuePrev === null && this.input.getContext().silence) {
227 return;
228 }
229 }
230 this.isProcess = true;
231 this.skipServerSide = false;
232 this.switchButtonsState(true);
233 this.canSubmitForm(false);
234 this.canTriggerEnterSubmit(false);
235 this.input.getContext().setSilence(false);
236 this.validate(signal).then(() => {}).catch(() => {}).finally(() => {
237 this.skipServerSide = true;
238 this.hasServerSide = false;
239 this.isProcess = null;
240 this.input.nodes[0].readOnly = false;
241 if (!signal?.aborted) {
242 this.switchButtonsState();
243 this.canSubmitForm();
244 if (this.validityState.current) {
245 this.canTriggerEnterSubmit();
246 }
247 }
248 });
249 };
250 AdvancedReporting.prototype.switchButtonsState = function (force = false) {
251 const parentPage = this.input.nodes[0].closest('.jet-form-builder-page');
252 if (parentPage && !this.input.getContext().silence) {
253 const switchButtons = parentPage.querySelectorAll('.jet-form-builder__next-page, .jet-form-builder__prev-page, .jet-form-builder__action-button');
254 for (const switchButton of switchButtons) {
255 if (!switchButton.classList.contains('jet-form-builder__submit') && !this.isNodeBelongThis(switchButton)) {
256 continue;
257 }
258 if (!switchButton.classList.contains('jet-form-builder__prev-page')) {
259 switchButton.disabled = force === true || !this.validityState.current;
260 } else {
261 switchButton.disabled = force;
262 }
263 }
264 }
265 };
266 AdvancedReporting.prototype.canTriggerEnterSubmit = function (canTrigger = true) {
267 const form = this.input.root.form;
268 if (form) {
269 form.canTriggerEnterSubmit = canTrigger;
270 }
271 };
272 AdvancedReporting.prototype.canSubmitForm = function (canSubmit = true) {
273 const form = this.input.root.form;
274 if (form) {
275 form.canSubmitForm = canSubmit;
276 }
277 };
278 AdvancedReporting.prototype.isNodeBelongThis = function (node) {
279 const parentPage = node.closest('.jet-form-builder-page');
280 return parentPage ? !parentPage.classList.contains('jet-form-builder-page--hidden') : false;
281 };
282 AdvancedReporting.prototype.validateOnChangeState = function () {
283 if (this.isProcess) {
284 return Promise.resolve();
285 }
286
287 // Don't validate on initial load if field is empty
288 const currentValue = this.input.getValue();
289 if (!currentValue || currentValue === '') {
290 // Only skip validation if this is the initial load (valuePrev is null)
291 // and the field is empty AND we're in silence mode (not form submission)
292 if (this.valuePrev === null && this.input.getContext().silence) {
293 return Promise.resolve();
294 }
295 }
296 this.switchButtonsState(true);
297 this.canTriggerEnterSubmit(false);
298 if (this.input.maskValidation) {
299 this.input.changeStateMaskValidation();
300 }
301 this.isProcess = true;
302 this.skipServerSide = false;
303 return new Promise((resolve, reject) => {
304 this.validate().then(resolve).catch(reject).finally(() => {
305 this.skipServerSide = true;
306 this.hasServerSide = false;
307 this.isProcess = null;
308 this.input.nodes[0].readOnly = false;
309 this.switchButtonsState();
310 this.canTriggerEnterSubmit();
311 });
312 });
313 };
314
315 /**
316 * @param restriction {AdvancedRestriction|Restriction}
317 * @return {boolean}
318 */
319 AdvancedReporting.prototype.canProcessRestriction = function (restriction) {
320 return (
321 // allow all
322 !this.skipServerSide ||
323 // or only not-ServerSide
324 !restriction.isServerSide()
325 );
326 };
327
328 /**
329 * @param restriction {AdvancedRestriction|Restriction}
330 */
331 AdvancedReporting.prototype.beforeProcessRestriction = function (restriction) {
332 this.hasServerSide = restriction.isServerSide() ? true : this.hasServerSide;
333 };
334 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AdvancedReporting);
335
336 /***/ },
337
338 /***/ "./frontend/advanced.reporting/functions.js"
339 /*!**************************************************!*\
340 !*** ./frontend/advanced.reporting/functions.js ***!
341 \**************************************************/
342 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
343
344 __webpack_require__.r(__webpack_exports__);
345 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
346 /* harmony export */ getErrorNode: () => (/* binding */ getErrorNode),
347 /* harmony export */ getInheritValidationType: () => (/* binding */ getInheritValidationType),
348 /* harmony export */ getMessageBySlug: () => (/* binding */ getMessageBySlug),
349 /* harmony export */ getNodeValidationType: () => (/* binding */ getNodeValidationType),
350 /* harmony export */ getPreparedRules: () => (/* binding */ getPreparedRules),
351 /* harmony export */ getValidationMessages: () => (/* binding */ getValidationMessages),
352 /* harmony export */ getWrapper: () => (/* binding */ getWrapper),
353 /* harmony export */ observeFieldRestriction: () => (/* binding */ observeFieldRestriction),
354 /* harmony export */ setRestrictions: () => (/* binding */ setRestrictions)
355 /* harmony export */ });
356 /* harmony import */ var _restrictions_ReachLimitNumbers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./restrictions/ReachLimitNumbers */ "./frontend/advanced.reporting/restrictions/ReachLimitNumbers.js");
357 /* harmony import */ var _restrictions_NotEnoughNumbers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./restrictions/NotEnoughNumbers */ "./frontend/advanced.reporting/restrictions/NotEnoughNumbers.js");
358 /* harmony import */ var _restrictions_NotUrl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./restrictions/NotUrl */ "./frontend/advanced.reporting/restrictions/NotUrl.js");
359 /* harmony import */ var _restrictions_NotEmail__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./restrictions/NotEmail */ "./frontend/advanced.reporting/restrictions/NotEmail.js");
360 /* harmony import */ var _restrictions_NotEnoughChars__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./restrictions/NotEnoughChars */ "./frontend/advanced.reporting/restrictions/NotEnoughChars.js");
361 /* harmony import */ var _restrictions_ReachLimitChars__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./restrictions/ReachLimitChars */ "./frontend/advanced.reporting/restrictions/ReachLimitChars.js");
362 /* harmony import */ var _restrictions_NotEmptyRestriction__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./restrictions/NotEmptyRestriction */ "./frontend/advanced.reporting/restrictions/NotEmptyRestriction.js");
363 /* harmony import */ var _restrictions_NotCompleteInputmask__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./restrictions/NotCompleteInputmask */ "./frontend/advanced.reporting/restrictions/NotCompleteInputmask.js");
364 /* harmony import */ var _restrictions_CustomRulesRestriction__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./restrictions/CustomRulesRestriction */ "./frontend/advanced.reporting/restrictions/CustomRulesRestriction.js");
365 /* harmony import */ var _restrictions_MustContainCharacters__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./restrictions/MustContainCharacters */ "./frontend/advanced.reporting/restrictions/MustContainCharacters.js");
366 /* harmony import */ var _restrictions_MustNotContainCharacters__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./restrictions/MustNotContainCharacters */ "./frontend/advanced.reporting/restrictions/MustNotContainCharacters.js");
367 /* harmony import */ var _restrictions_MatchRegexp__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./restrictions/MatchRegexp */ "./frontend/advanced.reporting/restrictions/MatchRegexp.js");
368 /* harmony import */ var _restrictions_NotMatchRegexp__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./restrictions/NotMatchRegexp */ "./frontend/advanced.reporting/restrictions/NotMatchRegexp.js");
369 /* harmony import */ var _restrictions_ServerSideCallback__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./restrictions/ServerSideCallback */ "./frontend/advanced.reporting/restrictions/ServerSideCallback.js");
370 /* harmony import */ var _restrictions_MustEqual__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./restrictions/MustEqual */ "./frontend/advanced.reporting/restrictions/MustEqual.js");
371 /* harmony import */ var _restrictions_TooEarlyTimestamp__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./restrictions/TooEarlyTimestamp */ "./frontend/advanced.reporting/restrictions/TooEarlyTimestamp.js");
372 /* harmony import */ var _restrictions_TooLateTimestamp__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./restrictions/TooLateTimestamp */ "./frontend/advanced.reporting/restrictions/TooLateTimestamp.js");
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390 const {
391 applyFilters
392 } = JetPlugins.hooks;
393 const {
394 isEmpty
395 } = JetFormBuilderFunctions;
396 const getAdvancedRules = () => applyFilters('jet.fb.advanced.rules', [_restrictions_MustContainCharacters__WEBPACK_IMPORTED_MODULE_9__["default"], _restrictions_MustNotContainCharacters__WEBPACK_IMPORTED_MODULE_10__["default"], _restrictions_MatchRegexp__WEBPACK_IMPORTED_MODULE_11__["default"], _restrictions_NotMatchRegexp__WEBPACK_IMPORTED_MODULE_12__["default"], _restrictions_ServerSideCallback__WEBPACK_IMPORTED_MODULE_13__["default"], _restrictions_MustEqual__WEBPACK_IMPORTED_MODULE_14__["default"]]);
397
398 /**
399 * @type {Array<CustomBaseRestriction>}
400 */
401 let advancedRules = [];
402 const getRestrictions = () => applyFilters('jet.fb.restrictions', [_restrictions_TooEarlyTimestamp__WEBPACK_IMPORTED_MODULE_15__["default"], _restrictions_TooLateTimestamp__WEBPACK_IMPORTED_MODULE_16__["default"], _restrictions_ReachLimitNumbers__WEBPACK_IMPORTED_MODULE_0__["default"], _restrictions_NotEnoughNumbers__WEBPACK_IMPORTED_MODULE_1__["default"], _restrictions_NotUrl__WEBPACK_IMPORTED_MODULE_2__["default"], _restrictions_NotEmail__WEBPACK_IMPORTED_MODULE_3__["default"], _restrictions_NotCompleteInputmask__WEBPACK_IMPORTED_MODULE_7__["default"], _restrictions_NotEnoughChars__WEBPACK_IMPORTED_MODULE_4__["default"], _restrictions_ReachLimitChars__WEBPACK_IMPORTED_MODULE_5__["default"], _restrictions_NotEmptyRestriction__WEBPACK_IMPORTED_MODULE_6__["default"], _restrictions_CustomRulesRestriction__WEBPACK_IMPORTED_MODULE_8__["default"]]);
403
404 /**
405 * @type {Restriction[]}
406 */
407 let restrictions = [];
408 function getPreparedRules(rules, reporting) {
409 const response = [];
410 if (!advancedRules.length) {
411 advancedRules = getAdvancedRules();
412 }
413 for (const [index, rule] of Object.entries(rules)) {
414 for (const advancedRule of advancedRules) {
415 const current = new advancedRule();
416
417 // eslint-disable-next-line max-depth
418 if (rule.type !== current.getSlug()) {
419 continue;
420 }
421 delete rule.type;
422 current.setReporting(reporting);
423 current.setAttrs({
424 ...rule,
425 index
426 });
427 current.onReady();
428 response.push(current);
429 break;
430 }
431 }
432 return response;
433 }
434
435 /**
436 * @param node {HTMLElement}
437 */
438 function getWrapper(node) {
439 return node.closest('.jet-form-builder-row');
440 }
441
442 /**
443 * @param node {HTMLElement}
444 */
445 function getNodeValidationType(node) {
446 var _wrapper$dataset;
447 const wrapper = getWrapper(node);
448 const {
449 validationType = ''
450 } = (_wrapper$dataset = wrapper?.dataset) !== null && _wrapper$dataset !== void 0 ? _wrapper$dataset : {};
451 return validationType;
452 }
453
454 /**
455 * @param input {InputData}
456 */
457 function getInheritValidationType(input) {
458 var _window$JetFormsValid, _allForms$formId;
459 const allForms = (_window$JetFormsValid = window?.JetFormsValidation) !== null && _window$JetFormsValid !== void 0 ? _window$JetFormsValid : false;
460 if (false === allForms) {
461 return '';
462 }
463 const formId = input.getSubmit().getFormId();
464 const {
465 type = ''
466 } = (_allForms$formId = allForms[formId]) !== null && _allForms$formId !== void 0 ? _allForms$formId : {};
467 return type;
468 }
469 function getValidationMessages(node) {
470 var _wrapper$dataset2;
471 const wrapper = getWrapper(node);
472 const {
473 validationMessages = '{}'
474 } = (_wrapper$dataset2 = wrapper?.dataset) !== null && _wrapper$dataset2 !== void 0 ? _wrapper$dataset2 : {};
475 return JSON.parse(validationMessages);
476 }
477
478 /**
479 * @param restriction {Restriction}
480 * @param slug {string}
481 * @return {string}
482 */
483 function getMessageBySlug(restriction, slug) {
484 var _reporting$messages$s, _window$JetFormsValid2, _allMessages$form$get, _messages$slug;
485 const {
486 reporting
487 } = restriction;
488 const message = (_reporting$messages$s = reporting.messages[slug]) !== null && _reporting$messages$s !== void 0 ? _reporting$messages$s : '';
489 if (message) {
490 return message;
491 }
492 const allMessages = (_window$JetFormsValid2 = window?.JetFormsValidation) !== null && _window$JetFormsValid2 !== void 0 ? _window$JetFormsValid2 : false;
493 if (false === allMessages) {
494 return '';
495 }
496 const form = reporting.input.getSubmit();
497 const {
498 messages
499 } = (_allMessages$form$get = allMessages[form.getFormId()]) !== null && _allMessages$form$get !== void 0 ? _allMessages$form$get : {};
500 return (_messages$slug = messages[slug]) !== null && _messages$slug !== void 0 ? _messages$slug : '';
501 }
502
503 /**
504 * @this {CustomBaseRestriction}
505 */
506 function observeFieldRestriction() {
507 if (!this.attrs?.field) {
508 return;
509 }
510 const {
511 root
512 } = this.reporting.input;
513 const input = root.getInput(this.attrs.field);
514 input.watch(() => {
515 this.attrs.value = input.value.current;
516
517 /**
518 * Here we need to reset the `valuePrev` property,
519 * because reporting logic remember previous value, which it check.
520 *
521 * And if .valuePrev === .current.value -> reporting will be skipped
522 *
523 * @see AdvancedReporting.getErrors
524 * @see ReportingInterface.hasChangedValue
525 * @type {null}
526 */
527 this.reporting.valuePrev = null;
528 this.reporting.validateOnChange();
529 });
530 if (!isEmpty(input.value.current)) {
531 this.attrs.value = input.value.current;
532 }
533 }
534
535 /**
536 * @param reporting {ReportingInterface}
537 */
538 function setRestrictions(reporting) {
539 if (!restrictions.length) {
540 restrictions = getRestrictions();
541 }
542 for (const restriction of restrictions) {
543 const current = new restriction();
544 if (!current.isSupported(reporting.getNode(), reporting)) {
545 continue;
546 }
547 current.setReporting(reporting);
548 current.onReady();
549 reporting.restrictions.push(current);
550 }
551 }
552
553 /**
554 * You cannot use node.querySelector in this function,
555 * because the Repeater Field validation will return
556 * an error element from the internal field.
557 *
558 * @param wrapper {Element}
559 * @return {boolean|Element}
560 */
561 function getErrorNode(wrapper) {
562 for (const child of wrapper.children) {
563 if (!child.classList.contains('error-message')) {
564 continue;
565 }
566 return child;
567 }
568 const colEndNode = wrapper.querySelector('.jet-form-builder-col__end');
569 if (!colEndNode) {
570 return false;
571 }
572 return getErrorNode(colEndNode);
573 }
574
575
576 /***/ },
577
578 /***/ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js"
579 /*!*************************************************************************!*\
580 !*** ./frontend/advanced.reporting/restrictions/AdvancedRestriction.js ***!
581 \*************************************************************************/
582 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
583
584 __webpack_require__.r(__webpack_exports__);
585 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
586 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
587 /* harmony export */ });
588 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions */ "./frontend/advanced.reporting/functions.js");
589
590 const {
591 Restriction,
592 CalculatedFormula
593 } = window.JetFormBuilderAbstract;
594 function AdvancedRestriction() {
595 Restriction.call(this);
596 this.message = '';
597 this.formula = null;
598 this.watchedAttrs = [];
599 }
600 AdvancedRestriction.prototype = Object.create(Restriction.prototype);
601 AdvancedRestriction.prototype.message = '';
602 /**
603 * @type {CalculatedFormula}
604 */
605 AdvancedRestriction.prototype.formula = null;
606 /**
607 * @type {Array}
608 */
609 AdvancedRestriction.prototype.watchedAttrs = [];
610
611 /**
612 * If returns true -> validation will be
613 * started with 1000 ms delay
614 *
615 * @return {boolean}
616 */
617 AdvancedRestriction.prototype.isServerSide = function () {
618 return false;
619 };
620 AdvancedRestriction.prototype.getMessage = function () {
621 return this.message;
622 };
623 /**
624 * Here you need to return a prepared message,
625 * with processed macros
626 *
627 * @return {string}
628 */
629 AdvancedRestriction.prototype.getRawMessage = function () {
630 return 'Error';
631 };
632 AdvancedRestriction.prototype.getMessageBySlug = function (slug) {
633 return (0,_functions__WEBPACK_IMPORTED_MODULE_0__.getMessageBySlug)(this, slug);
634 };
635 AdvancedRestriction.prototype.onReady = function () {
636 this.formula = new CalculatedFormula(this.reporting.input);
637 this.formula.observe(this.getRawMessage());
638 this.formula.setResult = () => {
639 this.message = this.formula.calculateString();
640 };
641 this.formula.setResult();
642 if (!this.watchedAttrs.length) {
643 return;
644 }
645 this.reporting.watchAttrs = [...new Set([...this.reporting.watchAttrs, ...this.watchedAttrs])];
646 };
647 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (AdvancedRestriction);
648
649 /***/ },
650
651 /***/ "./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js"
652 /*!***************************************************************************!*\
653 !*** ./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js ***!
654 \***************************************************************************/
655 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
656
657 __webpack_require__.r(__webpack_exports__);
658 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
659 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
660 /* harmony export */ });
661 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
662
663 function CustomBaseRestriction() {
664 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
665 this.attrs = {};
666 }
667 CustomBaseRestriction.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
668 CustomBaseRestriction.prototype.attrs = {};
669 CustomBaseRestriction.prototype.setAttrs = function (attrs) {
670 this.attrs = attrs;
671 };
672 CustomBaseRestriction.prototype.getSlug = function () {
673 throw new Error('you need to return slug of rule');
674 };
675 CustomBaseRestriction.prototype.getRawMessage = function () {
676 var _this$attrs$message;
677 return (_this$attrs$message = this.attrs?.message) !== null && _this$attrs$message !== void 0 ? _this$attrs$message : '';
678 };
679 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomBaseRestriction);
680
681 /***/ },
682
683 /***/ "./frontend/advanced.reporting/restrictions/CustomRulesRestriction.js"
684 /*!****************************************************************************!*\
685 !*** ./frontend/advanced.reporting/restrictions/CustomRulesRestriction.js ***!
686 \****************************************************************************/
687 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
688
689 __webpack_require__.r(__webpack_exports__);
690 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
691 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
692 /* harmony export */ });
693 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
694 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functions */ "./frontend/advanced.reporting/functions.js");
695
696
697 function CustomRulesRestriction() {
698 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
699 this.isSupported = function (node, reporting) {
700 var _root$dataset$validat;
701 const root = node.closest('.jet-form-builder-row');
702 const rules = JSON.parse((_root$dataset$validat = root.dataset?.validationRules) !== null && _root$dataset$validat !== void 0 ? _root$dataset$validat : '[]');
703 if (!Boolean(rules.length)) {
704 return false;
705 }
706 reporting.restrictions = [...reporting.restrictions, ...(0,_functions__WEBPACK_IMPORTED_MODULE_1__.getPreparedRules)(rules, reporting)];
707 return false;
708 };
709 }
710 CustomRulesRestriction.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
711 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomRulesRestriction);
712
713 /***/ },
714
715 /***/ "./frontend/advanced.reporting/restrictions/MatchRegexp.js"
716 /*!*****************************************************************!*\
717 !*** ./frontend/advanced.reporting/restrictions/MatchRegexp.js ***!
718 \*****************************************************************/
719 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
720
721 __webpack_require__.r(__webpack_exports__);
722 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
723 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
724 /* harmony export */ });
725 /* harmony import */ var _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomBaseRestriction */ "./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js");
726 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functions */ "./frontend/advanced.reporting/functions.js");
727
728
729 function MatchRegexp() {
730 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
731 this.getSlug = function () {
732 return 'regexp';
733 };
734 }
735 MatchRegexp.prototype = Object.create(_CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
736 MatchRegexp.prototype.setAttrs = function (attrs) {
737 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.setAttrs.call(this, attrs);
738 _functions__WEBPACK_IMPORTED_MODULE_1__.observeFieldRestriction.call(this);
739 };
740 MatchRegexp.prototype.validate = function () {
741 const value = this.getValue();
742 if (!value) {
743 return true;
744 }
745 const regexp = new RegExp(this.attrs.value, 'g');
746 return regexp.test(value);
747 };
748 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MatchRegexp);
749
750 /***/ },
751
752 /***/ "./frontend/advanced.reporting/restrictions/MustContainCharacters.js"
753 /*!***************************************************************************!*\
754 !*** ./frontend/advanced.reporting/restrictions/MustContainCharacters.js ***!
755 \***************************************************************************/
756 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
757
758 __webpack_require__.r(__webpack_exports__);
759 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
760 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
761 /* harmony export */ });
762 /* harmony import */ var _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomBaseRestriction */ "./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js");
763 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functions */ "./frontend/advanced.reporting/functions.js");
764
765
766 function MustContainCharacters() {
767 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
768 this.getSlug = function () {
769 return 'contain';
770 };
771 }
772 MustContainCharacters.prototype = Object.create(_CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
773 MustContainCharacters.prototype.setAttrs = function (attrs) {
774 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.setAttrs.call(this, attrs);
775 _functions__WEBPACK_IMPORTED_MODULE_1__.observeFieldRestriction.call(this);
776 };
777 MustContainCharacters.prototype.validate = function () {
778 const value = this.getValue();
779 return !value || value.includes(this.attrs.value);
780 };
781 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MustContainCharacters);
782
783 /***/ },
784
785 /***/ "./frontend/advanced.reporting/restrictions/MustEqual.js"
786 /*!***************************************************************!*\
787 !*** ./frontend/advanced.reporting/restrictions/MustEqual.js ***!
788 \***************************************************************/
789 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
790
791 __webpack_require__.r(__webpack_exports__);
792 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
793 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
794 /* harmony export */ });
795 /* harmony import */ var _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomBaseRestriction */ "./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js");
796 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functions */ "./frontend/advanced.reporting/functions.js");
797
798
799 function MustEqual() {
800 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
801 this.getSlug = function () {
802 return 'equal';
803 };
804 this.validate = function () {
805 const value = this.getValue();
806 return !value || value === this.attrs.value;
807 };
808 }
809 MustEqual.prototype = Object.create(_CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
810 MustEqual.prototype.setAttrs = function (attrs) {
811 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.setAttrs.call(this, attrs);
812 _functions__WEBPACK_IMPORTED_MODULE_1__.observeFieldRestriction.call(this);
813 };
814 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MustEqual);
815
816 /***/ },
817
818 /***/ "./frontend/advanced.reporting/restrictions/MustNotContainCharacters.js"
819 /*!******************************************************************************!*\
820 !*** ./frontend/advanced.reporting/restrictions/MustNotContainCharacters.js ***!
821 \******************************************************************************/
822 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
823
824 __webpack_require__.r(__webpack_exports__);
825 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
826 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
827 /* harmony export */ });
828 /* harmony import */ var _MustContainCharacters__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MustContainCharacters */ "./frontend/advanced.reporting/restrictions/MustContainCharacters.js");
829
830 function MustNotContainCharacters() {
831 _MustContainCharacters__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
832 this.getSlug = function () {
833 return 'contain_not';
834 };
835 this.validate = function () {
836 const value = this.getValue();
837 return !value || !_MustContainCharacters__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.validate.call(this);
838 };
839 }
840 MustNotContainCharacters.prototype = Object.create(_MustContainCharacters__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
841 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MustNotContainCharacters);
842
843 /***/ },
844
845 /***/ "./frontend/advanced.reporting/restrictions/NotCompleteInputmask.js"
846 /*!**************************************************************************!*\
847 !*** ./frontend/advanced.reporting/restrictions/NotCompleteInputmask.js ***!
848 \**************************************************************************/
849 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
850
851 __webpack_require__.r(__webpack_exports__);
852 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
853 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
854 /* harmony export */ });
855 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
856
857 function NotCompleteInputmask() {
858 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
859 this.isSupported = function (node) {
860 return node.classList.contains('jet-form-builder__masked-field') && jQuery.fn.inputmask;
861 };
862 this.validate = function () {
863 const value = this.getValue();
864 const node = this.reporting.getNode();
865 return !value || node.inputmask.isComplete();
866 };
867 this.getRawMessage = function () {
868 return this.getMessageBySlug('inputmask');
869 };
870 }
871 NotCompleteInputmask.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
872 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotCompleteInputmask);
873
874 /***/ },
875
876 /***/ "./frontend/advanced.reporting/restrictions/NotEmail.js"
877 /*!**************************************************************!*\
878 !*** ./frontend/advanced.reporting/restrictions/NotEmail.js ***!
879 \**************************************************************/
880 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
881
882 __webpack_require__.r(__webpack_exports__);
883 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
884 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
885 /* harmony export */ });
886 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
887
888 function NotEmail() {
889 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
890 this.isSupported = function (node) {
891 return 'email' === node.type;
892 };
893 this.validate = function () {
894 const value = this.getValue();
895 return !value || /^[\w-\.\+]+@([\w-]+\.)+[\w-]{1,6}$/.test(value);
896 };
897 this.getRawMessage = function () {
898 return this.getMessageBySlug('email');
899 };
900 }
901 NotEmail.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
902 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotEmail);
903
904 /***/ },
905
906 /***/ "./frontend/advanced.reporting/restrictions/NotEmptyRestriction.js"
907 /*!*************************************************************************!*\
908 !*** ./frontend/advanced.reporting/restrictions/NotEmptyRestriction.js ***!
909 \*************************************************************************/
910 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
911
912 __webpack_require__.r(__webpack_exports__);
913 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
914 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
915 /* harmony export */ });
916 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
917
918 const {
919 isEmpty
920 } = JetFormBuilderFunctions;
921 function NotEmptyRestriction() {
922 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
923 this.type = 'required';
924 }
925 NotEmptyRestriction.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
926 NotEmptyRestriction.prototype.isSupported = function (node, reporting) {
927 return reporting.input.isRequired;
928 };
929 NotEmptyRestriction.prototype.validate = function () {
930 const value = this.getValue();
931 return !isEmpty(value);
932 };
933 NotEmptyRestriction.prototype.getRawMessage = function () {
934 return this.getMessageBySlug('empty');
935 };
936 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotEmptyRestriction);
937
938 /***/ },
939
940 /***/ "./frontend/advanced.reporting/restrictions/NotEnoughChars.js"
941 /*!********************************************************************!*\
942 !*** ./frontend/advanced.reporting/restrictions/NotEnoughChars.js ***!
943 \********************************************************************/
944 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
945
946 __webpack_require__.r(__webpack_exports__);
947 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
948 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
949 /* harmony export */ });
950 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
951
952 function NotEnoughChars() {
953 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
954 this.watchedAttrs.push('minLength');
955 this.isSupported = function (node, reporting) {
956 const {
957 minLength = false
958 } = reporting.input.attrs;
959 return false !== minLength;
960 };
961 this.validate = function () {
962 const length = this.getValue()?.length;
963 const {
964 minLength
965 } = this.reporting.input.attrs;
966 return !length || length >= +minLength.value.current;
967 };
968 this.getRawMessage = function () {
969 return this.getMessageBySlug('char_min');
970 };
971 }
972 NotEnoughChars.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
973 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotEnoughChars);
974
975 /***/ },
976
977 /***/ "./frontend/advanced.reporting/restrictions/NotEnoughNumbers.js"
978 /*!**********************************************************************!*\
979 !*** ./frontend/advanced.reporting/restrictions/NotEnoughNumbers.js ***!
980 \**********************************************************************/
981 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
982
983 __webpack_require__.r(__webpack_exports__);
984 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
985 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
986 /* harmony export */ });
987 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
988
989 function NotEnoughNumbers() {
990 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
991 this.watchedAttrs.push('min');
992 this.isSupported = function (node, reporting) {
993 const {
994 min = false
995 } = reporting.input.attrs;
996 return false !== min && ['number', 'range'].includes(node.type);
997 };
998 this.validate = function () {
999 const value = this.getValue();
1000 const {
1001 min
1002 } = this.reporting.input.attrs;
1003 return !value || +value >= +min.value.current;
1004 };
1005 this.getRawMessage = function () {
1006 return this.getMessageBySlug('number_min');
1007 };
1008 }
1009 NotEnoughNumbers.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1010 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotEnoughNumbers);
1011
1012 /***/ },
1013
1014 /***/ "./frontend/advanced.reporting/restrictions/NotMatchRegexp.js"
1015 /*!********************************************************************!*\
1016 !*** ./frontend/advanced.reporting/restrictions/NotMatchRegexp.js ***!
1017 \********************************************************************/
1018 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1019
1020 __webpack_require__.r(__webpack_exports__);
1021 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1022 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1023 /* harmony export */ });
1024 /* harmony import */ var _MatchRegexp__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MatchRegexp */ "./frontend/advanced.reporting/restrictions/MatchRegexp.js");
1025
1026 function NotMatchRegexp() {
1027 _MatchRegexp__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1028 this.getSlug = function () {
1029 return 'regexp_not';
1030 };
1031 this.validate = function () {
1032 const value = this.getValue();
1033 return !value || !_MatchRegexp__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.validate.call(this);
1034 };
1035 }
1036 NotMatchRegexp.prototype = Object.create(_MatchRegexp__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1037 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotMatchRegexp);
1038
1039 /***/ },
1040
1041 /***/ "./frontend/advanced.reporting/restrictions/NotUrl.js"
1042 /*!************************************************************!*\
1043 !*** ./frontend/advanced.reporting/restrictions/NotUrl.js ***!
1044 \************************************************************/
1045 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1046
1047 __webpack_require__.r(__webpack_exports__);
1048 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1049 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1050 /* harmony export */ });
1051 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1052
1053 function NotUrl() {
1054 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1055 this.isSupported = function (node) {
1056 return 'url' === node.type;
1057 };
1058 this.validate = function () {
1059 const value = this.getValue();
1060 return !value || /((mailto\:|(news|(ht|f)tp(s?))\:\/\/)\S+)/.test(value);
1061 };
1062 this.getRawMessage = function () {
1063 return this.getMessageBySlug('url');
1064 };
1065 }
1066 NotUrl.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1067 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (NotUrl);
1068
1069 /***/ },
1070
1071 /***/ "./frontend/advanced.reporting/restrictions/ReachLimitChars.js"
1072 /*!*********************************************************************!*\
1073 !*** ./frontend/advanced.reporting/restrictions/ReachLimitChars.js ***!
1074 \*********************************************************************/
1075 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1076
1077 __webpack_require__.r(__webpack_exports__);
1078 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1079 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1080 /* harmony export */ });
1081 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1082
1083 function ReachLimitChars() {
1084 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1085 this.watchedAttrs.push('maxLength');
1086 this.isSupported = function (node, reporting) {
1087 const {
1088 maxLength = false
1089 } = reporting.input.attrs;
1090 return false !== maxLength;
1091 };
1092 this.validate = function () {
1093 const value = this.getValue()?.length;
1094 const {
1095 maxLength
1096 } = this.reporting.input.attrs;
1097 return !value || value <= +maxLength.value.current;
1098 };
1099 this.getRawMessage = function () {
1100 return this.getMessageBySlug('char_max');
1101 };
1102 }
1103 ReachLimitChars.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1104 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ReachLimitChars);
1105
1106 /***/ },
1107
1108 /***/ "./frontend/advanced.reporting/restrictions/ReachLimitNumbers.js"
1109 /*!***********************************************************************!*\
1110 !*** ./frontend/advanced.reporting/restrictions/ReachLimitNumbers.js ***!
1111 \***********************************************************************/
1112 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1113
1114 __webpack_require__.r(__webpack_exports__);
1115 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1116 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1117 /* harmony export */ });
1118 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1119
1120 function ReachLimitNumbers() {
1121 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1122 this.watchedAttrs.push('max');
1123 this.isSupported = function (node, reporting) {
1124 const {
1125 max = false
1126 } = reporting.input.attrs;
1127 return false !== max && ['number', 'range'].includes(node.type);
1128 };
1129 this.validate = function () {
1130 const value = this.getValue();
1131 const {
1132 max
1133 } = this.reporting.input.attrs;
1134 return !value || +value <= +max.value.current;
1135 };
1136 this.getRawMessage = function () {
1137 return this.getMessageBySlug('number_max');
1138 };
1139 }
1140 ReachLimitNumbers.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1141 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ReachLimitNumbers);
1142
1143 /***/ },
1144
1145 /***/ "./frontend/advanced.reporting/restrictions/ServerSideCallback.js"
1146 /*!************************************************************************!*\
1147 !*** ./frontend/advanced.reporting/restrictions/ServerSideCallback.js ***!
1148 \************************************************************************/
1149 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1150
1151 __webpack_require__.r(__webpack_exports__);
1152 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1153 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1154 /* harmony export */ });
1155 /* harmony import */ var _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CustomBaseRestriction */ "./frontend/advanced.reporting/restrictions/CustomBaseRestriction.js");
1156 /* harmony import */ var _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/api-fetch */ "@wordpress/api-fetch");
1157 /* harmony import */ var _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1__);
1158
1159
1160 function ServerSideCallback() {
1161 _CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1162 this.getSlug = function () {
1163 return 'ssr';
1164 };
1165 this.isServerSide = function () {
1166 return true;
1167 };
1168 this.validatePromise = async function (signal = null) {
1169 const current = this.getValue();
1170 if (!current) {
1171 return Promise.resolve();
1172 }
1173 const body = this.getFormData();
1174 const {
1175 rootNode
1176 } = this.reporting.input.getRoot();
1177 const ssrValidationMethod = rootNode.getAttribute('ssr_validation_method') || 'rest';
1178 switch (ssrValidationMethod) {
1179 case 'admin_ajax':
1180 return this.validateViaAdminAjax(body, signal);
1181 case 'self':
1182 return this.validateViaSelfRequest(body, signal);
1183 default:
1184 return this.validateViaRest(body, signal);
1185 }
1186 };
1187 this.validateViaRest = async function (body, signal) {
1188 try {
1189 const response = await _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default()({
1190 path: '/jet-form-builder/v1/validate-field',
1191 method: 'POST',
1192 body,
1193 signal
1194 });
1195 return response?.result ? Promise.resolve() : Promise.reject();
1196 } catch (error) {
1197 throw error;
1198 }
1199 };
1200 this.validateViaAdminAjax = async function (body, signal) {
1201 try {
1202 const response = await fetch(window.JetFormBuilderSettings.adminajaxurl, {
1203 method: 'POST',
1204 headers: {
1205 'Content-Type': 'application/x-www-form-urlencoded'
1206 },
1207 body: new URLSearchParams({
1208 action: 'jet_fb_ssr_validation_ajax',
1209 data: JSON.stringify(Object.fromEntries(body))
1210 }),
1211 signal
1212 }).then(res => res.json());
1213 return response?.result ? Promise.resolve() : Promise.reject();
1214 } catch (error) {
1215 throw error;
1216 }
1217 };
1218 this.validateViaSelfRequest = async function (body, signal) {
1219 try {
1220 const url = new URL(window.location.href);
1221 url.searchParams.set('jet_fb_ssr_self_validation', '1');
1222 for (const [key, value] of body.entries()) {
1223 url.searchParams.append(key, value);
1224 }
1225 const response = await fetch(url.toString(), {
1226 method: 'GET',
1227 signal
1228 }).then(res => res.json());
1229 return response?.result ? Promise.resolve() : Promise.reject();
1230 } catch (error) {
1231 throw error;
1232 }
1233 };
1234 this.getFormData = function () {
1235 const {
1236 input
1237 } = this.reporting;
1238 const {
1239 rootNode
1240 } = input.getRoot();
1241 const formData = new FormData(rootNode);
1242 formData.delete('_wpnonce');
1243 formData.set('_jfb_validation_rule_index', this.attrs.index);
1244 for (const pathElement of input.path) {
1245 formData.append('_jfb_validation_path[]', pathElement);
1246 }
1247
1248 // Security: Include signature for SSR validation
1249 if (this.attrs._sig) {
1250 formData.set('_jfb_validation_sig', this.attrs._sig);
1251 }
1252 return formData;
1253 };
1254 }
1255 ServerSideCallback.prototype = Object.create(_CustomBaseRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1256 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ServerSideCallback);
1257
1258 /***/ },
1259
1260 /***/ "./frontend/advanced.reporting/restrictions/TooEarlyTimestamp.js"
1261 /*!***********************************************************************!*\
1262 !*** ./frontend/advanced.reporting/restrictions/TooEarlyTimestamp.js ***!
1263 \***********************************************************************/
1264 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1265
1266 __webpack_require__.r(__webpack_exports__);
1267 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1268 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1269 /* harmony export */ });
1270 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1271
1272 const {
1273 getTimestamp
1274 } = JetFormBuilderFunctions;
1275 function TooEarlyTimestamp() {
1276 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1277 this.watchedAttrs.push('min');
1278 this.isSupported = function (node, reporting) {
1279 const {
1280 min = false
1281 } = reporting.input.attrs;
1282 return false !== min && ['time', 'date', 'datetime-local'].includes(node.type);
1283 };
1284 this.validate = function () {
1285 const value = this.getValue();
1286 if (!value) {
1287 return true;
1288 }
1289 const {
1290 min
1291 } = this.reporting.input.attrs;
1292 const {
1293 time
1294 } = getTimestamp(value);
1295 const {
1296 time: minTime
1297 } = getTimestamp(min.value.current);
1298 return time >= minTime;
1299 };
1300 this.getRawMessage = function () {
1301 return this.getMessageBySlug('date_min');
1302 };
1303 }
1304 TooEarlyTimestamp.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1305 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TooEarlyTimestamp);
1306
1307 /***/ },
1308
1309 /***/ "./frontend/advanced.reporting/restrictions/TooLateTimestamp.js"
1310 /*!**********************************************************************!*\
1311 !*** ./frontend/advanced.reporting/restrictions/TooLateTimestamp.js ***!
1312 \**********************************************************************/
1313 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1314
1315 __webpack_require__.r(__webpack_exports__);
1316 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1317 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1318 /* harmony export */ });
1319 /* harmony import */ var _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1320
1321 const {
1322 getTimestamp
1323 } = JetFormBuilderFunctions;
1324 function TooLateTimestamp() {
1325 _AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].call(this);
1326 this.watchedAttrs.push('max');
1327 this.isSupported = function (node, reporting) {
1328 const {
1329 max = false
1330 } = reporting.input.attrs;
1331 return false !== max && ['time', 'date', 'datetime-local'].includes(node.type);
1332 };
1333 this.validate = function () {
1334 const value = this.getValue();
1335 if (!value) {
1336 return true;
1337 }
1338 const {
1339 max
1340 } = this.reporting.input.attrs;
1341 const {
1342 time
1343 } = getTimestamp(value);
1344 const {
1345 time: maxTime
1346 } = getTimestamp(max.value.current);
1347 return time <= maxTime;
1348 };
1349 this.getRawMessage = function () {
1350 return this.getMessageBySlug('date_max');
1351 };
1352 }
1353 TooLateTimestamp.prototype = Object.create(_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
1354 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TooLateTimestamp);
1355
1356 /***/ },
1357
1358 /***/ "@wordpress/api-fetch"
1359 /*!**********************************!*\
1360 !*** external ["wp","apiFetch"] ***!
1361 \**********************************/
1362 (module) {
1363
1364 module.exports = window["wp"]["apiFetch"];
1365
1366 /***/ }
1367
1368 /******/ });
1369 /************************************************************************/
1370 /******/ // The module cache
1371 /******/ var __webpack_module_cache__ = {};
1372 /******/
1373 /******/ // The require function
1374 /******/ function __webpack_require__(moduleId) {
1375 /******/ // Check if module is in cache
1376 /******/ var cachedModule = __webpack_module_cache__[moduleId];
1377 /******/ if (cachedModule !== undefined) {
1378 /******/ return cachedModule.exports;
1379 /******/ }
1380 /******/ // Create a new module (and put it into the cache)
1381 /******/ var module = __webpack_module_cache__[moduleId] = {
1382 /******/ // no module.id needed
1383 /******/ // no module.loaded needed
1384 /******/ exports: {}
1385 /******/ };
1386 /******/
1387 /******/ // Execute the module function
1388 /******/ if (!(moduleId in __webpack_modules__)) {
1389 /******/ delete __webpack_module_cache__[moduleId];
1390 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
1391 /******/ e.code = 'MODULE_NOT_FOUND';
1392 /******/ throw e;
1393 /******/ }
1394 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
1395 /******/
1396 /******/ // Return the exports of the module
1397 /******/ return module.exports;
1398 /******/ }
1399 /******/
1400 /************************************************************************/
1401 /******/ /* webpack/runtime/compat get default export */
1402 /******/ (() => {
1403 /******/ // getDefaultExport function for compatibility with non-harmony modules
1404 /******/ __webpack_require__.n = (module) => {
1405 /******/ var getter = module && module.__esModule ?
1406 /******/ () => (module['default']) :
1407 /******/ () => (module);
1408 /******/ __webpack_require__.d(getter, { a: getter });
1409 /******/ return getter;
1410 /******/ };
1411 /******/ })();
1412 /******/
1413 /******/ /* webpack/runtime/define property getters */
1414 /******/ (() => {
1415 /******/ // define getter functions for harmony exports
1416 /******/ __webpack_require__.d = (exports, definition) => {
1417 /******/ for(var key in definition) {
1418 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
1419 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1420 /******/ }
1421 /******/ }
1422 /******/ };
1423 /******/ })();
1424 /******/
1425 /******/ /* webpack/runtime/hasOwnProperty shorthand */
1426 /******/ (() => {
1427 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1428 /******/ })();
1429 /******/
1430 /******/ /* webpack/runtime/make namespace object */
1431 /******/ (() => {
1432 /******/ // define __esModule on exports
1433 /******/ __webpack_require__.r = (exports) => {
1434 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1435 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1436 /******/ }
1437 /******/ Object.defineProperty(exports, '__esModule', { value: true });
1438 /******/ };
1439 /******/ })();
1440 /******/
1441 /************************************************************************/
1442 var __webpack_exports__ = {};
1443 // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
1444 (() => {
1445 /*!*********************************************!*\
1446 !*** ./frontend/advanced.reporting/main.js ***!
1447 \*********************************************/
1448 __webpack_require__.r(__webpack_exports__);
1449 /* harmony import */ var _AdvancedReporting__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AdvancedReporting */ "./frontend/advanced.reporting/AdvancedReporting.js");
1450 /* harmony import */ var _restrictions_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./restrictions/AdvancedRestriction */ "./frontend/advanced.reporting/restrictions/AdvancedRestriction.js");
1451 /* harmony import */ var _restrictions_NotEmptyRestriction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./restrictions/NotEmptyRestriction */ "./frontend/advanced.reporting/restrictions/NotEmptyRestriction.js");
1452 var _window$JetFormBuilde;
1453
1454
1455
1456 const {
1457 addFilter,
1458 addAction
1459 } = JetPlugins.hooks;
1460 addAction('jet.fb.observe.after', 'jet-form-builder/observe-dynamic-attrs',
1461 /**
1462 * @param observable {Observable}
1463 */
1464 function (observable) {
1465 observable.getInputs().forEach(input => {
1466 if (!(input.reporting instanceof _AdvancedReporting__WEBPACK_IMPORTED_MODULE_0__["default"])) {
1467 return;
1468 }
1469 input.reporting.observeAttrs();
1470 });
1471 }, 11);
1472 addFilter('jet.fb.reporting', 'jet-form-builder/advanced-reporting', function (reporting) {
1473 reporting = [_AdvancedReporting__WEBPACK_IMPORTED_MODULE_0__["default"], ...reporting];
1474 return reporting;
1475 });
1476 window.JetFormBuilderAbstract = {
1477 ...((_window$JetFormBuilde = window.JetFormBuilderAbstract) !== null && _window$JetFormBuilde !== void 0 ? _window$JetFormBuilde : {}),
1478 AdvancedRestriction: _restrictions_AdvancedRestriction__WEBPACK_IMPORTED_MODULE_1__["default"],
1479 NotEmptyRestriction: _restrictions_NotEmptyRestriction__WEBPACK_IMPORTED_MODULE_2__["default"]
1480 };
1481 })();
1482
1483 /******/ })()
1484 ;
1485 //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBaUJBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFNQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUMxRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDdkJBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QkE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDeEJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUlBOzs7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDeEJBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUNwQkE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDMUJBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQzNCQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUN6QkE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDdEJBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQzFCQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFJQTs7Ozs7Ozs7Ozs7Ozs7O0FDbEhBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7O0FDdkNBOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9BZHZhbmNlZFJlcG9ydGluZy5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvZnVuY3Rpb25zLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9yZXN0cmljdGlvbnMvQWR2YW5jZWRSZXN0cmljdGlvbi5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL0N1c3RvbUJhc2VSZXN0cmljdGlvbi5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL0N1c3RvbVJ1bGVzUmVzdHJpY3Rpb24uanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9NYXRjaFJlZ2V4cC5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL011c3RDb250YWluQ2hhcmFjdGVycy5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL011c3RFcXVhbC5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL011c3ROb3RDb250YWluQ2hhcmFjdGVycy5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL05vdENvbXBsZXRlSW5wdXRtYXNrLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9yZXN0cmljdGlvbnMvTm90RW1haWwuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9Ob3RFbXB0eVJlc3RyaWN0aW9uLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9yZXN0cmljdGlvbnMvTm90RW5vdWdoQ2hhcnMuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9Ob3RFbm91Z2hOdW1iZXJzLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9yZXN0cmljdGlvbnMvTm90TWF0Y2hSZWdleHAuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9Ob3RVcmwuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9SZWFjaExpbWl0Q2hhcnMuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL3Jlc3RyaWN0aW9ucy9SZWFjaExpbWl0TnVtYmVycy5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL1NlcnZlclNpZGVDYWxsYmFjay5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9hZHZhbmNlZC5yZXBvcnRpbmcvcmVzdHJpY3Rpb25zL1Rvb0Vhcmx5VGltZXN0YW1wLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2FkdmFuY2VkLnJlcG9ydGluZy9yZXN0cmljdGlvbnMvVG9vTGF0ZVRpbWVzdGFtcC5qcyIsIndlYnBhY2s6Ly9qZmIvZXh0ZXJuYWwgd2luZG93IFtcIndwXCIsXCJhcGlGZXRjaFwiXSIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2pmYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvYWR2YW5jZWQucmVwb3J0aW5nL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Z2V0RXJyb3JOb2RlLFxuXHRnZXRJbmhlcml0VmFsaWRhdGlvblR5cGUsXG5cdGdldE5vZGVWYWxpZGF0aW9uVHlwZSxcblx0Z2V0VmFsaWRhdGlvbk1lc3NhZ2VzLFxuXHRnZXRXcmFwcGVyLFxuXHRzZXRSZXN0cmljdGlvbnMsXG59IGZyb20gJy4vZnVuY3Rpb25zJztcblxuY29uc3Qge1xuXHQgICAgICBSZXBvcnRpbmdJbnRlcmZhY2UsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdDtcblxuY29uc3Qge1xuXHQgICAgICBhbGxSZWplY3RlZCxcbiAgICAgIH0gPSBKZXRGb3JtQnVpbGRlckZ1bmN0aW9ucztcblxuLyoqXG4gKiBAcHJvcGVydHkge0FkdmFuY2VkUmVzdHJpY3Rpb259IHJlc3RyaWN0aW9ucyBMaXN0IG9mIGFkdmFuY2VkIHJlc3RyaWN0aW9uc1xuICpcbiAqIEB0aGlzIHtSZXBvcnRpbmdJbnRlcmZhY2V9XG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gQWR2YW5jZWRSZXBvcnRpbmcoKSB7XG5cdFJlcG9ydGluZ0ludGVyZmFjZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlICAgICAgICAgICA9ICdpbmhlcml0Jztcblx0dGhpcy5tZXNzYWdlcyAgICAgICA9IHt9O1xuXHR0aGlzLnNraXBTZXJ2ZXJTaWRlID0gdHJ1ZTtcblxuXHQvKipcblx0ICogQ29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggY29udGFpbiBhbGwgYXR0cnNcblx0ICogZm9yIGFsbCBzdXBwb3J0ZWQgcmVzdHJpY3Rpb25zXG5cdCAqXG5cdCAqIEBzZWUgQWR2YW5jZWRSZXN0cmljdGlvbi5vblJlYWR5XG5cdCAqXG5cdCAqIEB0eXBlIHtzdHJpbmdbXX1cblx0ICovXG5cdHRoaXMud2F0Y2hBdHRycyA9IFtdO1xuXG5cdHRoaXMucXVldWUgPSBbXTtcbn1cblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUmVwb3J0aW5nSW50ZXJmYWNlLnByb3RvdHlwZSApO1xuXG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUuc2tpcFNlcnZlclNpZGUgPSB0cnVlO1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmhhc1NlcnZlclNpZGUgID0gZmFsc2U7XG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUuaXNQcm9jZXNzICAgICAgPSBudWxsO1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLnF1ZXVlICAgICAgICAgID0gW107XG5cbkFkdmFuY2VkUmVwb3J0aW5nLnByb3RvdHlwZS5zZXRSZXN0cmljdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG5cdHNldFJlc3RyaWN0aW9ucyggdGhpcyApO1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBub2RlLCBpbnB1dCApIHtcblx0dGhpcy50eXBlID0gZ2V0Tm9kZVZhbGlkYXRpb25UeXBlKCBub2RlICk7XG5cblx0Y29uc3QgaW5oZXJpdCA9ICdpbmhlcml0JyA9PT0gdGhpcy50eXBlXG5cdCAgICAgICAgICAgICAgICA/IGdldEluaGVyaXRWYWxpZGF0aW9uVHlwZSggaW5wdXQgKVxuXHQgICAgICAgICAgICAgICAgOiB0aGlzLnR5cGU7XG5cblx0cmV0dXJuICEhaW5oZXJpdD8ubGVuZ3RoO1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmdldEVycm9yc1JhdyA9IGFzeW5jIGZ1bmN0aW9uICggcHJvbWlzZXMsIHNpZ25hbCA9IG51bGwgKSB7XG5cdGlmICggdGhpcy5oYXNTZXJ2ZXJTaWRlICkge1xuXHRcdHRoaXMuaW5wdXQubG9hZGluZy5zdGFydCgpO1xuXHR9XG5cblx0bGV0IGVycm9ycyA9IGF3YWl0IGFsbFJlamVjdGVkKCBwcm9taXNlcyApO1xuXG5cdHRoaXMudmFsdWVQcmV2ID0gdGhpcy5pbnB1dC5nZXRWYWx1ZSgpO1xuXG5cdGlmICggdGhpcy5oYXNTZXJ2ZXJTaWRlICkge1xuXHRcdHRoaXMuaW5wdXQubG9hZGluZy5lbmQoKTtcblx0fVxuXG5cdGlmICggc2lnbmFsPy5hYm9ydGVkICkge1xuXHRcdGVycm9ycyA9IFtdO1xuXHR9XG5cblx0cmV0dXJuIGVycm9ycztcbn07XG5cbi8qKlxuICogQHBhcmFtIHZhbGlkYXRpb25FcnJvcnMge0FkdmFuY2VkUmVzdHJpY3Rpb25bXXxSZXN0cmljdGlvbltdfVxuICovXG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUucmVwb3J0UmF3ID0gZnVuY3Rpb24gKCB2YWxpZGF0aW9uRXJyb3JzICkge1xuXHRsZXQgbWVzc2FnZSA9ICcnO1xuXG5cdGZvciAoIGNvbnN0IHZhbGlkYXRpb25FcnJvciBvZiB2YWxpZGF0aW9uRXJyb3JzICkge1xuXHRcdG1lc3NhZ2UgPSB2YWxpZGF0aW9uRXJyb3IuZ2V0TWVzc2FnZSgpO1xuXG5cdFx0aWYgKCBtZXNzYWdlPy5sZW5ndGggKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRpZiAoICFtZXNzYWdlICkge1xuXHRcdHRoaXMuY2xlYXJSZXBvcnQoKTtcblxuXHRcdHJldHVybjtcblx0fVxuXG5cdHRoaXMuaW5zZXJ0RXJyb3IoIG1lc3NhZ2UgKTtcbn07XG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUuc2V0SW5wdXQgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHR0aGlzLm1lc3NhZ2VzID0gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCBpbnB1dC5ub2Rlc1sgMCBdICk7XG5cblx0UmVwb3J0aW5nSW50ZXJmYWNlLnByb3RvdHlwZS5zZXRJbnB1dC5jYWxsKCB0aGlzLCBpbnB1dCApO1xufTtcbi8qKlxuICogQHNpbmNlIDMuMC41IEludHJvZHVjZWRcbiAqL1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLm9ic2VydmVBdHRycyA9IGZ1bmN0aW9uICgpIHtcblx0Zm9yICggY29uc3Qgd2F0Y2hBdHRyIG9mIHRoaXMud2F0Y2hBdHRycyApIHtcblx0XHRpZiAoICF0aGlzLmlucHV0LmF0dHJzLmhhc093blByb3BlcnR5KCB3YXRjaEF0dHIgKSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHQvKipcblx0XHQgKiBAdHlwZSB7QmFzZUh0bWxBdHRyfVxuXHRcdCAqL1xuXHRcdGNvbnN0IGF0dHIgPSB0aGlzLmlucHV0LmF0dHJzWyB3YXRjaEF0dHIgXTtcblxuXHRcdGF0dHIudmFsdWUud2F0Y2goICgpID0+IHtcblx0XHRcdHRoaXMudmFsdWVQcmV2ID0gbnVsbDtcblx0XHRcdHRoaXMudmFsaWRhdGVPbkJsdXIoKTtcblx0XHR9ICk7XG5cdH1cbn07XG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUuY2xlYXJSZXBvcnQgPSBmdW5jdGlvbiAoKSB7XG5cdGNvbnN0IGlubmVyID0gKCkgPT4ge1xuXHRcdGNvbnN0IG5vZGUgPSBnZXRXcmFwcGVyKCB0aGlzLmdldE5vZGUoKSApO1xuXG5cdFx0aWYgKCAhbm9kZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoICdmaWVsZC1oYXMtZXJyb3InICk7XG5cblx0XHRjb25zdCBlcnJvciA9IGdldEVycm9yTm9kZSggbm9kZSApO1xuXG5cdFx0aWYgKCAhZXJyb3IgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZXJyb3IucmVtb3ZlKCk7XG5cdH07XG5cdGlubmVyKCk7XG5cdHRoaXMubWFrZVZhbGlkKCk7XG59O1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmluc2VydEVycm9yID0gZnVuY3Rpb24gKCBtZXNzYWdlICkge1xuXHRjb25zdCBpbm5lciA9ICgpID0+IHtcblx0XHRjb25zdCBub2RlICA9IGdldFdyYXBwZXIoIHRoaXMuZ2V0Tm9kZSgpICk7XG5cdFx0Y29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKCBub2RlLCBtZXNzYWdlICk7XG5cblx0XHRub2RlLmNsYXNzTGlzdC5hZGQoICdmaWVsZC1oYXMtZXJyb3InICk7XG5cblx0XHRpZiAoIGVycm9yLmlzQ29ubmVjdGVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGl0IGNhbiBiZSBvbiBmaWVsZHNfbGF5b3V0ID09PSAncm93J1xuXHRcdGNvbnN0IGNvbEVuZCA9IG5vZGUucXVlcnlTZWxlY3RvciggJy5qZXQtZm9ybS1idWlsZGVyLWNvbF9fZW5kJyApO1xuXG5cdFx0aWYgKCBjb2xFbmQgKSB7XG5cdFx0XHRjb2xFbmQuYXBwZW5kQ2hpbGQoIGVycm9yICk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bm9kZS5hcHBlbmRDaGlsZCggZXJyb3IgKTtcblx0XHR9XG5cdH07XG5cdGlubmVyKCk7XG5cdHRoaXMubWFrZUludmFsaWQoKTtcbn07XG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoXG5cdG5vZGUsIG1lc3NhZ2UgKSB7XG5cdGNvbnN0IGVycm9yID0gZ2V0RXJyb3JOb2RlKCBub2RlICk7XG5cblx0aWYgKCBlcnJvciApIHtcblx0XHRlcnJvci5pbm5lckhUTUwgPSBtZXNzYWdlO1xuXG5cdFx0cmV0dXJuIGVycm9yO1xuXHR9XG5cblx0Y29uc3QgaW5wdXROb2RlID0gdGhpcy5nZXROb2RlKCk7XG5cdGNvbnN0IGRpdiAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cblx0ZGl2LmNsYXNzTGlzdC5hZGQoICdlcnJvci1tZXNzYWdlJyApO1xuXHRkaXYuaW5uZXJIVE1MID0gbWVzc2FnZTtcblx0ZGl2LmlkICAgICAgICA9IGlucHV0Tm9kZS5pZCArICdfX2Vycm9yJztcblxuXHRyZXR1cm4gZGl2O1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLm1ha2VJbnZhbGlkID0gZnVuY3Rpb24gKCkge1xuXHRjb25zdCB3cmFwcGVyICAgPSBnZXRXcmFwcGVyKCB0aGlzLmdldE5vZGUoKSApO1xuXHRjb25zdCBlcnJvck5vZGUgPSBnZXRFcnJvck5vZGUoIHdyYXBwZXIgKTtcblxuXHR0aGlzLmdldE5vZGUoKS5zZXRBdHRyaWJ1dGUoICdhcmlhLWludmFsaWQnLCAndHJ1ZScgKTtcblx0dGhpcy5nZXROb2RlKCkuc2V0QXR0cmlidXRlKFxuXHRcdCdhcmlhLWRlc2NyaWJlZGJ5Jyxcblx0XHRlcnJvck5vZGU/LmlkID8/IGZhbHNlLFxuXHQpO1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLm1ha2VWYWxpZCA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5nZXROb2RlKCkucmVtb3ZlQXR0cmlidXRlKCAnYXJpYS1pbnZhbGlkJyApO1xuXHR0aGlzLmdldE5vZGUoKS5yZW1vdmVBdHRyaWJ1dGUoICdhcmlhLWRlc2NyaWJlZGJ5JyApO1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLnZhbGlkYXRlT25DaGFuZ2UgPSBmdW5jdGlvbiAoIGFkZFRvUXVldWUgPSBmYWxzZSApIHtcblx0Ly8gRG9uJ3QgdmFsaWRhdGUgb24gaW5pdGlhbCBsb2FkIGlmIGZpZWxkIGlzIGVtcHR5XG5cdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuaW5wdXQuZ2V0VmFsdWUoKTtcblx0XG5cdGlmICggIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgPT09ICcnICkge1xuXHRcdC8vIE9ubHkgc2tpcCB2YWxpZGF0aW9uIGlmIHRoaXMgaXMgdGhlIGluaXRpYWwgbG9hZCAodmFsdWVQcmV2IGlzIG51bGwpXG5cdFx0Ly8gYW5kIHRoZSBmaWVsZCBpcyBlbXB0eSBBTkQgd2UncmUgaW4gc2lsZW5jZSBtb2RlIChub3QgZm9ybSBzdWJtaXNzaW9uKVxuXHRcdGlmICggdGhpcy52YWx1ZVByZXYgPT09IG51bGwgJiYgdGhpcy5pbnB1dC5nZXRDb250ZXh0KCkuc2lsZW5jZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHR0aGlzLnN3aXRjaEJ1dHRvbnNTdGF0ZSggdHJ1ZSApO1xuXG5cdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuXHRcdHRoaXMuaW5wdXQuZ2V0Q29udGV4dCgpLnNldFNpbGVuY2UoIGZhbHNlICk7XG5cblx0XHR0aGlzLnZhbGlkYXRlKCkuXG5cdFx0XHR0aGVuKCAoKSA9PiB7fSApLlxuXHRcdFx0Y2F0Y2goICgpID0+IHt9ICkuXG5cdFx0XHRmaW5hbGx5KCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaXNQcm9jZXNzID0gbnVsbDtcblxuXHRcdFx0XHRjb25zdCBxdWV1ZSA9IFsgLi4udGhpcy5xdWV1ZSBdO1xuXHRcdFx0XHR0aGlzLnF1ZXVlICA9IFtdO1xuXG5cdFx0XHRcdGlmICggIXF1ZXVlLmxlbmd0aCApIHtcblx0XHRcdFx0XHR0aGlzLnN3aXRjaEJ1dHRvbnNTdGF0ZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudmFsdWVQcmV2ID0gbnVsbDtcblx0XHRcdFx0cXVldWUuZm9yRWFjaCggY3VycmVudCA9PiBjdXJyZW50KCkgKTtcblxuXHRcdFx0XHR0aGlzLnN3aXRjaEJ1dHRvbnNTdGF0ZSgpO1xuXHRcdFx0fSApO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Dcm9jb2Jsb2NrL2lzc3Vlcy10cmFja2VyL2lzc3Vlcy8xNzY2XG5cdCAqL1xuXHRpZiAoIGFkZFRvUXVldWUgJiYgdGhpcy5pc1Byb2Nlc3MgKSB7XG5cdFx0dGhpcy5xdWV1ZSA9IFsgY2FsbGJhY2sgXTtcblx0fVxuXG5cdGlmICggdGhpcy5pc1Byb2Nlc3MgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpcy5pc1Byb2Nlc3MgPSB0cnVlO1xuXG5cdGNhbGxiYWNrKCk7XG59O1xuXG5BZHZhbmNlZFJlcG9ydGluZy5wcm90b3R5cGUudmFsaWRhdGVPbkJsdXIgPSBmdW5jdGlvbiAoIHNpZ25hbCA9IG51bGwgKSB7XG5cdC8qKlxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Dcm9jb2Jsb2NrL2lzc3Vlcy10cmFja2VyL2lzc3Vlcy8xNzY2XG5cdCAqL1xuXHRpZiAoIHRoaXMuaXNQcm9jZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIERvbid0IHZhbGlkYXRlIG9uIGluaXRpYWwgbG9hZCBpZiBmaWVsZCBpcyBlbXB0eVxuXHRjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmlucHV0LmdldFZhbHVlKCk7XG5cdFxuXHRpZiAoICFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlID09PSAnJyApIHtcblx0XHQvLyBPbmx5IHNraXAgdmFsaWRhdGlvbiBpZiB0aGlzIGlzIHRoZSBpbml0aWFsIGxvYWQgKHZhbHVlUHJldiBpcyBudWxsKVxuXHRcdC8vIGFuZCB0aGUgZmllbGQgaXMgZW1wdHkgQU5EIHdlJ3JlIGluIHNpbGVuY2UgbW9kZSAobm90IGZvcm0gc3VibWlzc2lvbilcblx0XHRpZiAoIHRoaXMudmFsdWVQcmV2ID09PSBudWxsICYmIHRoaXMuaW5wdXQuZ2V0Q29udGV4dCgpLnNpbGVuY2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5pc1Byb2Nlc3MgICAgICA9IHRydWU7XG5cdHRoaXMuc2tpcFNlcnZlclNpZGUgPSBmYWxzZTtcblxuXHR0aGlzLnN3aXRjaEJ1dHRvbnNTdGF0ZSggdHJ1ZSApO1xuXHR0aGlzLmNhblN1Ym1pdEZvcm0oIGZhbHNlICk7XG5cdHRoaXMuY2FuVHJpZ2dlckVudGVyU3VibWl0KCBmYWxzZSApO1xuXG5cdHRoaXMuaW5wdXQuZ2V0Q29udGV4dCgpLnNldFNpbGVuY2UoIGZhbHNlICk7XG5cblx0dGhpcy52YWxpZGF0ZSggc2lnbmFsICkuXG5cdFx0dGhlbiggKCkgPT4ge30gKS5cblx0XHRjYXRjaCggKCkgPT4ge30gKS5cblx0XHRmaW5hbGx5KCAoKSA9PiB7XG5cdFx0XHR0aGlzLnNraXBTZXJ2ZXJTaWRlID0gdHJ1ZTtcblx0XHRcdHRoaXMuaGFzU2VydmVyU2lkZSAgPSBmYWxzZTtcblx0XHRcdHRoaXMuaXNQcm9jZXNzICAgICAgPSBudWxsO1xuXG5cdFx0XHR0aGlzLmlucHV0Lm5vZGVzWzBdLnJlYWRPbmx5ID0gZmFsc2U7XG5cblx0XHRcdGlmICggIXNpZ25hbD8uYWJvcnRlZCApIHtcblx0XHRcdFx0dGhpcy5zd2l0Y2hCdXR0b25zU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5jYW5TdWJtaXRGb3JtKCk7XG5cblx0XHRcdFx0aWYgKCB0aGlzLnZhbGlkaXR5U3RhdGUuY3VycmVudCApIHtcblx0XHRcdFx0XHR0aGlzLmNhblRyaWdnZXJFbnRlclN1Ym1pdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xufTtcblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLnN3aXRjaEJ1dHRvbnNTdGF0ZSA9IGZ1bmN0aW9uKCBmb3JjZSA9IGZhbHNlICkge1xuXHRjb25zdCBwYXJlbnRQYWdlID0gdGhpcy5pbnB1dC5ub2Rlc1swXS5jbG9zZXN0KCAnLmpldC1mb3JtLWJ1aWxkZXItcGFnZScgKTtcblxuXHRpZiAoIHBhcmVudFBhZ2UgJiYgIXRoaXMuaW5wdXQuZ2V0Q29udGV4dCgpLnNpbGVuY2UgKSB7XG5cdFx0Y29uc3Qgc3dpdGNoQnV0dG9ucyA9IHBhcmVudFBhZ2UucXVlcnlTZWxlY3RvckFsbChcblx0XHRcdCcuamV0LWZvcm0tYnVpbGRlcl9fbmV4dC1wYWdlLCAuamV0LWZvcm0tYnVpbGRlcl9fcHJldi1wYWdlLCAuamV0LWZvcm0tYnVpbGRlcl9fYWN0aW9uLWJ1dHRvbidcblx0XHQpO1xuXG5cdFx0Zm9yICggY29uc3Qgc3dpdGNoQnV0dG9uIG9mIHN3aXRjaEJ1dHRvbnMgKSB7XG5cblx0XHRcdGlmICggIXN3aXRjaEJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoICdqZXQtZm9ybS1idWlsZGVyX19zdWJtaXQnICkgJiYgIXRoaXMuaXNOb2RlQmVsb25nVGhpcyggc3dpdGNoQnV0dG9uICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICFzd2l0Y2hCdXR0b24uY2xhc3NMaXN0LmNvbnRhaW5zKCdqZXQtZm9ybS1idWlsZGVyX19wcmV2LXBhZ2UnKSApIHtcblx0XHRcdFx0c3dpdGNoQnV0dG9uLmRpc2FibGVkID0gZm9yY2UgPT09IHRydWUgfHwgIXRoaXMudmFsaWRpdHlTdGF0ZS5jdXJyZW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3dpdGNoQnV0dG9uLmRpc2FibGVkID0gZm9yY2U7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbkFkdmFuY2VkUmVwb3J0aW5nLnByb3RvdHlwZS5jYW5UcmlnZ2VyRW50ZXJTdWJtaXQgPSBmdW5jdGlvbiggY2FuVHJpZ2dlciA9IHRydWUgKSB7XG5cdGNvbnN0IGZvcm0gPSB0aGlzLmlucHV0LnJvb3QuZm9ybTtcblxuXHRpZiAoIGZvcm0gKSB7XG5cdFx0Zm9ybS5jYW5UcmlnZ2VyRW50ZXJTdWJtaXQgPSBjYW5UcmlnZ2VyO1xuXHR9XG59XG5cbkFkdmFuY2VkUmVwb3J0aW5nLnByb3RvdHlwZS5jYW5TdWJtaXRGb3JtID0gZnVuY3Rpb24oIGNhblN1Ym1pdCA9IHRydWUgKSB7XG5cdGNvbnN0IGZvcm0gPSB0aGlzLmlucHV0LnJvb3QuZm9ybTtcblxuXHRpZiAoIGZvcm0gKSB7XG5cdFx0Zm9ybS5jYW5TdWJtaXRGb3JtID0gY2FuU3VibWl0O1xuXHR9XG59XG5cbkFkdmFuY2VkUmVwb3J0aW5nLnByb3RvdHlwZS5pc05vZGVCZWxvbmdUaGlzID0gZnVuY3Rpb24oIG5vZGUgKSB7XG5cdGNvbnN0IHBhcmVudFBhZ2UgPSBub2RlLmNsb3Nlc3QoICcuamV0LWZvcm0tYnVpbGRlci1wYWdlJyApO1xuXG5cdHJldHVybiBwYXJlbnRQYWdlID8gIXBhcmVudFBhZ2UuY2xhc3NMaXN0LmNvbnRhaW5zKCAnamV0LWZvcm0tYnVpbGRlci1wYWdlLS1oaWRkZW4nICkgOiBmYWxzZTtcbn1cblxuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLnZhbGlkYXRlT25DaGFuZ2VTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCB0aGlzLmlzUHJvY2VzcyApIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvLyBEb24ndCB2YWxpZGF0ZSBvbiBpbml0aWFsIGxvYWQgaWYgZmllbGQgaXMgZW1wdHlcblx0Y29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5pbnB1dC5nZXRWYWx1ZSgpO1xuXHRcblx0aWYgKCAhY3VycmVudFZhbHVlIHx8IGN1cnJlbnRWYWx1ZSA9PT0gJycgKSB7XG5cdFx0Ly8gT25seSBza2lwIHZhbGlkYXRpb24gaWYgdGhpcyBpcyB0aGUgaW5pdGlhbCBsb2FkICh2YWx1ZVByZXYgaXMgbnVsbClcblx0XHQvLyBhbmQgdGhlIGZpZWxkIGlzIGVtcHR5IEFORCB3ZSdyZSBpbiBzaWxlbmNlIG1vZGUgKG5vdCBmb3JtIHN1Ym1pc3Npb24pXG5cdFx0aWYgKCB0aGlzLnZhbHVlUHJldiA9PT0gbnVsbCAmJiB0aGlzLmlucHV0LmdldENvbnRleHQoKS5zaWxlbmNlICkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuc3dpdGNoQnV0dG9uc1N0YXRlKCB0cnVlICk7XG5cdHRoaXMuY2FuVHJpZ2dlckVudGVyU3VibWl0KCBmYWxzZSApO1xuXG5cdGlmICggdGhpcy5pbnB1dC5tYXNrVmFsaWRhdGlvbiApIHtcblx0XHR0aGlzLmlucHV0LmNoYW5nZVN0YXRlTWFza1ZhbGlkYXRpb24oKTtcblx0fVxuXG5cdHRoaXMuaXNQcm9jZXNzICAgICAgPSB0cnVlO1xuXHR0aGlzLnNraXBTZXJ2ZXJTaWRlID0gZmFsc2U7XG5cblx0cmV0dXJuIG5ldyBQcm9taXNlKCAoIHJlc29sdmUsIHJlamVjdCApID0+IHtcblx0XHR0aGlzLnZhbGlkYXRlKCkudGhlbiggcmVzb2x2ZSApLmNhdGNoKCByZWplY3QgKS5maW5hbGx5KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNraXBTZXJ2ZXJTaWRlID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5oYXNTZXJ2ZXJTaWRlICA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLmlzUHJvY2VzcyAgICAgID0gbnVsbDtcblxuXHRcdFx0XHR0aGlzLmlucHV0Lm5vZGVzWzBdLnJlYWRPbmx5ID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5zd2l0Y2hCdXR0b25zU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5jYW5UcmlnZ2VyRW50ZXJTdWJtaXQoKTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fSApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHJlc3RyaWN0aW9uIHtBZHZhbmNlZFJlc3RyaWN0aW9ufFJlc3RyaWN0aW9ufVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmNhblByb2Nlc3NSZXN0cmljdGlvbiA9IGZ1bmN0aW9uICggcmVzdHJpY3Rpb24gKSB7XG5cdHJldHVybiAoXG5cdFx0Ly8gYWxsb3cgYWxsXG5cdFx0IXRoaXMuc2tpcFNlcnZlclNpZGUgfHxcblx0XHQvLyBvciBvbmx5IG5vdC1TZXJ2ZXJTaWRlXG5cdFx0IXJlc3RyaWN0aW9uLmlzU2VydmVyU2lkZSgpXG5cdCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSByZXN0cmljdGlvbiB7QWR2YW5jZWRSZXN0cmljdGlvbnxSZXN0cmljdGlvbn1cbiAqL1xuQWR2YW5jZWRSZXBvcnRpbmcucHJvdG90eXBlLmJlZm9yZVByb2Nlc3NSZXN0cmljdGlvbiA9IGZ1bmN0aW9uICggcmVzdHJpY3Rpb24gKSB7XG5cdHRoaXMuaGFzU2VydmVyU2lkZSA9IHJlc3RyaWN0aW9uLmlzU2VydmVyU2lkZSgpID8gdHJ1ZSA6IHRoaXMuaGFzU2VydmVyU2lkZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFkdmFuY2VkUmVwb3J0aW5nO1xuIiwiaW1wb3J0IFJlYWNoTGltaXROdW1iZXJzIGZyb20gJy4vcmVzdHJpY3Rpb25zL1JlYWNoTGltaXROdW1iZXJzJztcbmltcG9ydCBOb3RFbm91Z2hOdW1iZXJzIGZyb20gJy4vcmVzdHJpY3Rpb25zL05vdEVub3VnaE51bWJlcnMnO1xuaW1wb3J0IE5vdFVybCBmcm9tICcuL3Jlc3RyaWN0aW9ucy9Ob3RVcmwnO1xuaW1wb3J0IE5vdEVtYWlsIGZyb20gJy4vcmVzdHJpY3Rpb25zL05vdEVtYWlsJztcbmltcG9ydCBOb3RFbm91Z2hDaGFycyBmcm9tICcuL3Jlc3RyaWN0aW9ucy9Ob3RFbm91Z2hDaGFycyc7XG5pbXBvcnQgUmVhY2hMaW1pdENoYXJzIGZyb20gJy4vcmVzdHJpY3Rpb25zL1JlYWNoTGltaXRDaGFycyc7XG5pbXBvcnQgTm90RW1wdHlSZXN0cmljdGlvbiBmcm9tICcuL3Jlc3RyaWN0aW9ucy9Ob3RFbXB0eVJlc3RyaWN0aW9uJztcbmltcG9ydCBOb3RDb21wbGV0ZUlucHV0bWFzayBmcm9tICcuL3Jlc3RyaWN0aW9ucy9Ob3RDb21wbGV0ZUlucHV0bWFzayc7XG5pbXBvcnQgQ3VzdG9tUnVsZXNSZXN0cmljdGlvbiBmcm9tICcuL3Jlc3RyaWN0aW9ucy9DdXN0b21SdWxlc1Jlc3RyaWN0aW9uJztcbmltcG9ydCBNdXN0Q29udGFpbkNoYXJhY3RlcnMgZnJvbSAnLi9yZXN0cmljdGlvbnMvTXVzdENvbnRhaW5DaGFyYWN0ZXJzJztcbmltcG9ydCBNdXN0Tm90Q29udGFpbkNoYXJhY3RlcnMgZnJvbSAnLi9yZXN0cmljdGlvbnMvTXVzdE5vdENvbnRhaW5DaGFyYWN0ZXJzJztcbmltcG9ydCBNYXRjaFJlZ2V4cCBmcm9tICcuL3Jlc3RyaWN0aW9ucy9NYXRjaFJlZ2V4cCc7XG5pbXBvcnQgTm90TWF0Y2hSZWdleHAgZnJvbSAnLi9yZXN0cmljdGlvbnMvTm90TWF0Y2hSZWdleHAnO1xuaW1wb3J0IFNlcnZlclNpZGVDYWxsYmFjayBmcm9tICcuL3Jlc3RyaWN0aW9ucy9TZXJ2ZXJTaWRlQ2FsbGJhY2snO1xuaW1wb3J0IE11c3RFcXVhbCBmcm9tICcuL3Jlc3RyaWN0aW9ucy9NdXN0RXF1YWwnO1xuaW1wb3J0IFRvb0Vhcmx5VGltZXN0YW1wIGZyb20gJy4vcmVzdHJpY3Rpb25zL1Rvb0Vhcmx5VGltZXN0YW1wJztcbmltcG9ydCBUb29MYXRlVGltZXN0YW1wIGZyb20gJy4vcmVzdHJpY3Rpb25zL1Rvb0xhdGVUaW1lc3RhbXAnO1xuXG5jb25zdCB7XG5cdCAgICAgIGFwcGx5RmlsdGVycyxcbiAgICAgIH0gPSBKZXRQbHVnaW5zLmhvb2tzO1xuXG5jb25zdCB7XG5cdCAgICAgIGlzRW1wdHksXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJGdW5jdGlvbnM7XG5cbmNvbnN0IGdldEFkdmFuY2VkUnVsZXMgPSAoKSA9PiBhcHBseUZpbHRlcnMoXG5cdCdqZXQuZmIuYWR2YW5jZWQucnVsZXMnLFxuXHRbXG5cdFx0TXVzdENvbnRhaW5DaGFyYWN0ZXJzLFxuXHRcdE11c3ROb3RDb250YWluQ2hhcmFjdGVycyxcblx0XHRNYXRjaFJlZ2V4cCxcblx0XHROb3RNYXRjaFJlZ2V4cCxcblx0XHRTZXJ2ZXJTaWRlQ2FsbGJhY2ssXG5cdFx0TXVzdEVxdWFsLFxuXHRdLFxuKTtcblxuLyoqXG4gKiBAdHlwZSB7QXJyYXk8Q3VzdG9tQmFzZVJlc3RyaWN0aW9uPn1cbiAqL1xubGV0IGFkdmFuY2VkUnVsZXMgPSBbXTtcblxuY29uc3QgZ2V0UmVzdHJpY3Rpb25zID0gKCkgPT4gYXBwbHlGaWx0ZXJzKFxuXHQnamV0LmZiLnJlc3RyaWN0aW9ucycsXG5cdFtcblx0XHRUb29FYXJseVRpbWVzdGFtcCxcblx0XHRUb29MYXRlVGltZXN0YW1wLFxuXHRcdFJlYWNoTGltaXROdW1iZXJzLFxuXHRcdE5vdEVub3VnaE51bWJlcnMsXG5cdFx0Tm90VXJsLFxuXHRcdE5vdEVtYWlsLFxuXHRcdE5vdENvbXBsZXRlSW5wdXRtYXNrLFxuXHRcdE5vdEVub3VnaENoYXJzLFxuXHRcdFJlYWNoTGltaXRDaGFycyxcblx0XHROb3RFbXB0eVJlc3RyaWN0aW9uLFxuXHRcdEN1c3RvbVJ1bGVzUmVzdHJpY3Rpb24sXG5cdF0sXG4pO1xuXG4vKipcbiAqIEB0eXBlIHtSZXN0cmljdGlvbltdfVxuICovXG5sZXQgcmVzdHJpY3Rpb25zID0gW107XG5cbmZ1bmN0aW9uIGdldFByZXBhcmVkUnVsZXMoIHJ1bGVzLCByZXBvcnRpbmcgKSB7XG5cdGNvbnN0IHJlc3BvbnNlID0gW107XG5cblx0aWYgKCAhYWR2YW5jZWRSdWxlcy5sZW5ndGggKSB7XG5cdFx0YWR2YW5jZWRSdWxlcyA9IGdldEFkdmFuY2VkUnVsZXMoKTtcblx0fVxuXG5cdGZvciAoIGNvbnN0IFsgaW5kZXgsIHJ1bGUgXSBvZiBPYmplY3QuZW50cmllcyggcnVsZXMgKSApIHtcblx0XHRmb3IgKCBjb25zdCBhZHZhbmNlZFJ1bGUgb2YgYWR2YW5jZWRSdWxlcyApIHtcblx0XHRcdGNvbnN0IGN1cnJlbnQgPSBuZXcgYWR2YW5jZWRSdWxlKCk7XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtZGVwdGhcblx0XHRcdGlmICggcnVsZS50eXBlICE9PSBjdXJyZW50LmdldFNsdWcoKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgcnVsZS50eXBlO1xuXG5cdFx0XHRjdXJyZW50LnNldFJlcG9ydGluZyggcmVwb3J0aW5nICk7XG5cdFx0XHRjdXJyZW50LnNldEF0dHJzKCB7IC4uLnJ1bGUsIGluZGV4IH0gKTtcblx0XHRcdGN1cnJlbnQub25SZWFkeSgpO1xuXG5cdFx0XHRyZXNwb25zZS5wdXNoKCBjdXJyZW50ICk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8qKlxuICogQHBhcmFtIG5vZGUge0hUTUxFbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXRXcmFwcGVyKCBub2RlICkge1xuXHRyZXR1cm4gbm9kZS5jbG9zZXN0KCAnLmpldC1mb3JtLWJ1aWxkZXItcm93JyApO1xufVxuXG4vKipcbiAqIEBwYXJhbSBub2RlIHtIVE1MRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVZhbGlkYXRpb25UeXBlKCBub2RlICkge1xuXHRjb25zdCB3cmFwcGVyICAgICAgICAgICAgICAgICA9IGdldFdyYXBwZXIoIG5vZGUgKTtcblx0Y29uc3QgeyB2YWxpZGF0aW9uVHlwZSA9ICcnIH0gPSB3cmFwcGVyPy5kYXRhc2V0ID8/IHt9O1xuXG5cdHJldHVybiB2YWxpZGF0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5wdXQge0lucHV0RGF0YX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW5oZXJpdFZhbGlkYXRpb25UeXBlKCBpbnB1dCApIHtcblx0Y29uc3QgYWxsRm9ybXMgPSB3aW5kb3c/LkpldEZvcm1zVmFsaWRhdGlvbiA/PyBmYWxzZTtcblxuXHRpZiAoIGZhbHNlID09PSBhbGxGb3JtcyApIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblxuXHRjb25zdCBmb3JtSWQgICAgICAgID0gaW5wdXQuZ2V0U3VibWl0KCkuZ2V0Rm9ybUlkKCk7XG5cdGNvbnN0IHsgdHlwZSA9ICcnIH0gPSBhbGxGb3Jtc1sgZm9ybUlkIF0gPz8ge307XG5cblx0cmV0dXJuIHR5cGU7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25NZXNzYWdlcyggbm9kZSApIHtcblx0Y29uc3Qgd3JhcHBlciAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRXcmFwcGVyKCBub2RlICk7XG5cdGNvbnN0IHsgdmFsaWRhdGlvbk1lc3NhZ2VzID0gJ3t9JyB9ID0gd3JhcHBlcj8uZGF0YXNldCA/PyB7fTtcblxuXHRyZXR1cm4gSlNPTi5wYXJzZSggdmFsaWRhdGlvbk1lc3NhZ2VzICk7XG59XG5cbi8qKlxuICogQHBhcmFtICByZXN0cmljdGlvbiB7UmVzdHJpY3Rpb259XG4gKiBAcGFyYW0gIHNsdWcgICAgICAgIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VCeVNsdWcoIHJlc3RyaWN0aW9uLCBzbHVnICkge1xuXHRjb25zdCB7IHJlcG9ydGluZyB9ID0gcmVzdHJpY3Rpb247XG5cdGNvbnN0IG1lc3NhZ2UgICAgICAgPSByZXBvcnRpbmcubWVzc2FnZXNbIHNsdWcgXSA/PyAnJztcblxuXHRpZiAoIG1lc3NhZ2UgKSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdH1cblxuXHRjb25zdCBhbGxNZXNzYWdlcyA9IHdpbmRvdz8uSmV0Rm9ybXNWYWxpZGF0aW9uID8/IGZhbHNlO1xuXG5cdGlmICggZmFsc2UgPT09IGFsbE1lc3NhZ2VzICkge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGNvbnN0IGZvcm0gICAgICAgICA9IHJlcG9ydGluZy5pbnB1dC5nZXRTdWJtaXQoKTtcblx0Y29uc3QgeyBtZXNzYWdlcyB9ID0gYWxsTWVzc2FnZXNbIGZvcm0uZ2V0Rm9ybUlkKCkgXSA/PyB7fTtcblxuXHRyZXR1cm4gbWVzc2FnZXNbIHNsdWcgXSA/PyAnJztcbn1cblxuLyoqXG4gKiBAdGhpcyB7Q3VzdG9tQmFzZVJlc3RyaWN0aW9ufVxuICovXG5mdW5jdGlvbiBvYnNlcnZlRmllbGRSZXN0cmljdGlvbigpIHtcblx0aWYgKCAhdGhpcy5hdHRycz8uZmllbGQgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHsgcm9vdCB9ID0gdGhpcy5yZXBvcnRpbmcuaW5wdXQ7XG5cdGNvbnN0IGlucHV0ICAgID0gcm9vdC5nZXRJbnB1dCggdGhpcy5hdHRycy5maWVsZCApO1xuXG5cdGlucHV0LndhdGNoKCAoKSA9PiB7XG5cdFx0dGhpcy5hdHRycy52YWx1ZSA9IGlucHV0LnZhbHVlLmN1cnJlbnQ7XG5cblx0XHQvKipcblx0XHQgKiBIZXJlIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGB2YWx1ZVByZXZgIHByb3BlcnR5LFxuXHRcdCAqIGJlY2F1c2UgcmVwb3J0aW5nIGxvZ2ljIHJlbWVtYmVyIHByZXZpb3VzIHZhbHVlLCB3aGljaCBpdCBjaGVjay5cblx0XHQgKlxuXHRcdCAqIEFuZCBpZiAudmFsdWVQcmV2ID09PSAuY3VycmVudC52YWx1ZSAtPiByZXBvcnRpbmcgd2lsbCBiZSBza2lwcGVkXG5cdFx0ICpcblx0XHQgKiBAc2VlIEFkdmFuY2VkUmVwb3J0aW5nLmdldEVycm9yc1xuXHRcdCAqIEBzZWUgUmVwb3J0aW5nSW50ZXJmYWNlLmhhc0NoYW5nZWRWYWx1ZVxuXHRcdCAqIEB0eXBlIHtudWxsfVxuXHRcdCAqL1xuXHRcdHRoaXMucmVwb3J0aW5nLnZhbHVlUHJldiA9IG51bGw7XG5cdFx0dGhpcy5yZXBvcnRpbmcudmFsaWRhdGVPbkNoYW5nZSgpO1xuXHR9ICk7XG5cblx0aWYgKCAhaXNFbXB0eSggaW5wdXQudmFsdWUuY3VycmVudCApICkge1xuXHRcdHRoaXMuYXR0cnMudmFsdWUgPSBpbnB1dC52YWx1ZS5jdXJyZW50O1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHJlcG9ydGluZyB7UmVwb3J0aW5nSW50ZXJmYWNlfVxuICovXG5mdW5jdGlvbiBzZXRSZXN0cmljdGlvbnMoIHJlcG9ydGluZyApIHtcblx0aWYgKCAhcmVzdHJpY3Rpb25zLmxlbmd0aCApIHtcblx0XHRyZXN0cmljdGlvbnMgPSBnZXRSZXN0cmljdGlvbnMoKTtcblx0fVxuXG5cdGZvciAoIGNvbnN0IHJlc3RyaWN0aW9uIG9mIHJlc3RyaWN0aW9ucyApIHtcblx0XHRjb25zdCBjdXJyZW50ID0gbmV3IHJlc3RyaWN0aW9uKCk7XG5cblx0XHRpZiAoXG5cdFx0XHQhY3VycmVudC5pc1N1cHBvcnRlZCggcmVwb3J0aW5nLmdldE5vZGUoKSwgcmVwb3J0aW5nIClcblx0XHQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjdXJyZW50LnNldFJlcG9ydGluZyggcmVwb3J0aW5nICk7XG5cdFx0Y3VycmVudC5vblJlYWR5KCk7XG5cblx0XHRyZXBvcnRpbmcucmVzdHJpY3Rpb25zLnB1c2goIGN1cnJlbnQgKTtcblx0fVxufVxuXG4vKipcbiAqIFlvdSBjYW5ub3QgdXNlIG5vZGUucXVlcnlTZWxlY3RvciBpbiB0aGlzIGZ1bmN0aW9uLFxuICogYmVjYXVzZSB0aGUgUmVwZWF0ZXIgRmllbGQgdmFsaWRhdGlvbiB3aWxsIHJldHVyblxuICogYW4gZXJyb3IgZWxlbWVudCBmcm9tIHRoZSBpbnRlcm5hbCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gIHdyYXBwZXIge0VsZW1lbnR9XG4gKiBAcmV0dXJuIHtib29sZWFufEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGdldEVycm9yTm9kZSggd3JhcHBlciApIHtcblx0Zm9yICggY29uc3QgY2hpbGQgb2Ygd3JhcHBlci5jaGlsZHJlbiApIHtcblx0XHRpZiAoICFjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoICdlcnJvci1tZXNzYWdlJyApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdHJldHVybiBjaGlsZDtcblx0fVxuXG5cdGNvbnN0IGNvbEVuZE5vZGUgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoXG5cdFx0Jy5qZXQtZm9ybS1idWlsZGVyLWNvbF9fZW5kJyxcblx0KTtcblxuXHRpZiAoICFjb2xFbmROb2RlICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBnZXRFcnJvck5vZGUoIGNvbEVuZE5vZGUgKTtcbn1cblxuZXhwb3J0IHtcblx0Z2V0Tm9kZVZhbGlkYXRpb25UeXBlLFxuXHRnZXRJbmhlcml0VmFsaWRhdGlvblR5cGUsXG5cdGdldE1lc3NhZ2VCeVNsdWcsXG5cdGdldFZhbGlkYXRpb25NZXNzYWdlcyxcblx0Z2V0UHJlcGFyZWRSdWxlcyxcblx0c2V0UmVzdHJpY3Rpb25zLFxuXHRvYnNlcnZlRmllbGRSZXN0cmljdGlvbixcblx0Z2V0V3JhcHBlcixcblx0Z2V0RXJyb3JOb2RlLFxufTsiLCJpbXBvcnQgeyBnZXRNZXNzYWdlQnlTbHVnIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcblxuY29uc3Qge1xuXHQgICAgICBSZXN0cmljdGlvbixcblx0ICAgICAgQ2FsY3VsYXRlZEZvcm11bGEsXG4gICAgICB9ID0gd2luZG93LkpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIEFkdmFuY2VkUmVzdHJpY3Rpb24oKSB7XG5cdFJlc3RyaWN0aW9uLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLm1lc3NhZ2UgICAgICA9ICcnO1xuXHR0aGlzLmZvcm11bGEgICAgICA9IG51bGw7XG5cdHRoaXMud2F0Y2hlZEF0dHJzID0gW107XG59XG5cbkFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUmVzdHJpY3Rpb24ucHJvdG90eXBlICk7XG5cbkFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlLm1lc3NhZ2UgPSAnJztcbi8qKlxuICogQHR5cGUge0NhbGN1bGF0ZWRGb3JtdWxhfVxuICovXG5BZHZhbmNlZFJlc3RyaWN0aW9uLnByb3RvdHlwZS5mb3JtdWxhID0gbnVsbDtcbi8qKlxuICogQHR5cGUge0FycmF5fVxuICovXG5BZHZhbmNlZFJlc3RyaWN0aW9uLnByb3RvdHlwZS53YXRjaGVkQXR0cnMgPSBbXTtcblxuLyoqXG4gKiBJZiByZXR1cm5zIHRydWUgLT4gdmFsaWRhdGlvbiB3aWxsIGJlXG4gKiBzdGFydGVkIHdpdGggMTAwMCBtcyBkZWxheVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbkFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlLmlzU2VydmVyU2lkZSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGZhbHNlO1xufTtcblxuQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMubWVzc2FnZTtcbn07XG4vKipcbiAqIEhlcmUgeW91IG5lZWQgdG8gcmV0dXJuIGEgcHJlcGFyZWQgbWVzc2FnZSxcbiAqIHdpdGggcHJvY2Vzc2VkIG1hY3Jvc1xuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuICdFcnJvcic7XG59O1xuQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUuZ2V0TWVzc2FnZUJ5U2x1ZyA9IGZ1bmN0aW9uICggc2x1ZyApIHtcblx0cmV0dXJuIGdldE1lc3NhZ2VCeVNsdWcoIHRoaXMsIHNsdWcgKTtcbn07XG5cbkFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlLm9uUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggdGhpcy5yZXBvcnRpbmcuaW5wdXQgKTtcblxuXHR0aGlzLmZvcm11bGEub2JzZXJ2ZSggdGhpcy5nZXRSYXdNZXNzYWdlKCkgKTtcblx0dGhpcy5mb3JtdWxhLnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHR0aGlzLm1lc3NhZ2UgPSB0aGlzLmZvcm11bGEuY2FsY3VsYXRlU3RyaW5nKCk7XG5cdH07XG5cdHRoaXMuZm9ybXVsYS5zZXRSZXN1bHQoKTtcblxuXHRpZiAoICF0aGlzLndhdGNoZWRBdHRycy5sZW5ndGggKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpcy5yZXBvcnRpbmcud2F0Y2hBdHRycyA9IFtcblx0XHQuLi5uZXcgU2V0KCBbXG5cdFx0XHQuLi50aGlzLnJlcG9ydGluZy53YXRjaEF0dHJzLFxuXHRcdFx0Li4udGhpcy53YXRjaGVkQXR0cnMsXG5cdFx0XSApLFxuXHRdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQWR2YW5jZWRSZXN0cmljdGlvbjtcblxuXG4iLCJpbXBvcnQgQWR2YW5jZWRSZXN0cmljdGlvbiBmcm9tICcuL0FkdmFuY2VkUmVzdHJpY3Rpb24nO1xuXG5mdW5jdGlvbiBDdXN0b21CYXNlUmVzdHJpY3Rpb24oKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuYXR0cnMgPSB7fTtcbn1cblxuQ3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlLFxuKTtcblxuQ3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZS5hdHRycyAgICAgICAgID0ge307XG5DdXN0b21CYXNlUmVzdHJpY3Rpb24ucHJvdG90eXBlLnNldEF0dHJzICAgICAgPSBmdW5jdGlvbiAoIGF0dHJzICkge1xuXHR0aGlzLmF0dHJzID0gYXR0cnM7XG59O1xuQ3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZS5nZXRTbHVnICAgICAgID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgRXJyb3IoICd5b3UgbmVlZCB0byByZXR1cm4gc2x1ZyBvZiBydWxlJyApO1xufTtcbkN1c3RvbUJhc2VSZXN0cmljdGlvbi5wcm90b3R5cGUuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuYXR0cnM/Lm1lc3NhZ2UgPz8gJyc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21CYXNlUmVzdHJpY3Rpb247IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuaW1wb3J0IHsgZ2V0UHJlcGFyZWRSdWxlcyB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmZ1bmN0aW9uIEN1c3RvbVJ1bGVzUmVzdHJpY3Rpb24oKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoIG5vZGUsIHJlcG9ydGluZyApIHtcblx0XHRjb25zdCByb290ICA9IG5vZGUuY2xvc2VzdCggJy5qZXQtZm9ybS1idWlsZGVyLXJvdycgKTtcblx0XHRjb25zdCBydWxlcyA9IEpTT04ucGFyc2UoIHJvb3QuZGF0YXNldD8udmFsaWRhdGlvblJ1bGVzID8/ICdbXScgKTtcblxuXHRcdGlmICggIUJvb2xlYW4oIHJ1bGVzLmxlbmd0aCApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJlcG9ydGluZy5yZXN0cmljdGlvbnMgPSBbXG5cdFx0XHQuLi5yZXBvcnRpbmcucmVzdHJpY3Rpb25zLFxuXHRcdFx0Li4uZ2V0UHJlcGFyZWRSdWxlcyggcnVsZXMsIHJlcG9ydGluZyApLFxuXHRcdF07XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbkN1c3RvbVJ1bGVzUmVzdHJpY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcblx0QWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21SdWxlc1Jlc3RyaWN0aW9uOyIsImltcG9ydCBDdXN0b21CYXNlUmVzdHJpY3Rpb24gZnJvbSAnLi9DdXN0b21CYXNlUmVzdHJpY3Rpb24nO1xuaW1wb3J0IHsgb2JzZXJ2ZUZpZWxkUmVzdHJpY3Rpb24gfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuXG5mdW5jdGlvbiBNYXRjaFJlZ2V4cCgpIHtcblx0Q3VzdG9tQmFzZVJlc3RyaWN0aW9uLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmdldFNsdWcgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICdyZWdleHAnO1xuXHR9O1xuXG59XG5cbk1hdGNoUmVnZXhwLnByb3RvdHlwZSAgICAgICAgICA9IE9iamVjdC5jcmVhdGUoXG5cdEN1c3RvbUJhc2VSZXN0cmljdGlvbi5wcm90b3R5cGUsXG4pO1xuTWF0Y2hSZWdleHAucHJvdG90eXBlLnNldEF0dHJzID0gZnVuY3Rpb24gKCBhdHRycyApIHtcblx0Q3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZS5zZXRBdHRycy5jYWxsKCB0aGlzLCBhdHRycyApO1xuXHRvYnNlcnZlRmllbGRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG59O1xuTWF0Y2hSZWdleHAucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuXHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcblxuXHRpZiAoICF2YWx1ZSApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKCB0aGlzLmF0dHJzLnZhbHVlLCAnZycgKTtcblxuXHRyZXR1cm4gcmVnZXhwLnRlc3QoIHZhbHVlICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNYXRjaFJlZ2V4cDsiLCJpbXBvcnQgQ3VzdG9tQmFzZVJlc3RyaWN0aW9uIGZyb20gJy4vQ3VzdG9tQmFzZVJlc3RyaWN0aW9uJztcbmltcG9ydCB7IG9ic2VydmVGaWVsZFJlc3RyaWN0aW9uIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcblxuZnVuY3Rpb24gTXVzdENvbnRhaW5DaGFyYWN0ZXJzKCkge1xuXHRDdXN0b21CYXNlUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZ2V0U2x1ZyAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICdjb250YWluJztcblx0fTtcblxufVxuXG5NdXN0Q29udGFpbkNoYXJhY3RlcnMucHJvdG90eXBlICAgICAgICAgID0gT2JqZWN0LmNyZWF0ZShcblx0Q3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZSxcbik7XG5NdXN0Q29udGFpbkNoYXJhY3RlcnMucHJvdG90eXBlLnNldEF0dHJzID0gZnVuY3Rpb24gKCBhdHRycyApIHtcblx0Q3VzdG9tQmFzZVJlc3RyaWN0aW9uLnByb3RvdHlwZS5zZXRBdHRycy5jYWxsKCB0aGlzLCBhdHRycyApO1xuXHRvYnNlcnZlRmllbGRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG59O1xuXG5NdXN0Q29udGFpbkNoYXJhY3RlcnMucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuXHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcblxuXHRyZXR1cm4gIXZhbHVlIHx8IHZhbHVlLmluY2x1ZGVzKCB0aGlzLmF0dHJzLnZhbHVlICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNdXN0Q29udGFpbkNoYXJhY3RlcnM7IiwiaW1wb3J0IEN1c3RvbUJhc2VSZXN0cmljdGlvbiBmcm9tICcuL0N1c3RvbUJhc2VSZXN0cmljdGlvbic7XG5pbXBvcnQgeyBvYnNlcnZlRmllbGRSZXN0cmljdGlvbiB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmZ1bmN0aW9uIE11c3RFcXVhbCgpIHtcblx0Q3VzdG9tQmFzZVJlc3RyaWN0aW9uLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmdldFNsdWcgID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAnZXF1YWwnO1xuXHR9O1xuXHR0aGlzLnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuXG5cdFx0cmV0dXJuICF2YWx1ZSB8fCB2YWx1ZSA9PT0gdGhpcy5hdHRycy52YWx1ZTtcblx0fTtcbn1cblxuTXVzdEVxdWFsLnByb3RvdHlwZSAgICAgICAgICA9IE9iamVjdC5jcmVhdGUoXG5cdEN1c3RvbUJhc2VSZXN0cmljdGlvbi5wcm90b3R5cGUsXG4pO1xuTXVzdEVxdWFsLnByb3RvdHlwZS5zZXRBdHRycyA9IGZ1bmN0aW9uICggYXR0cnMgKSB7XG5cdEN1c3RvbUJhc2VSZXN0cmljdGlvbi5wcm90b3R5cGUuc2V0QXR0cnMuY2FsbCggdGhpcywgYXR0cnMgKTtcblx0b2JzZXJ2ZUZpZWxkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTXVzdEVxdWFsOyIsImltcG9ydCBNdXN0Q29udGFpbkNoYXJhY3RlcnMgZnJvbSAnLi9NdXN0Q29udGFpbkNoYXJhY3RlcnMnO1xuXG5mdW5jdGlvbiBNdXN0Tm90Q29udGFpbkNoYXJhY3RlcnMoKSB7XG5cdE11c3RDb250YWluQ2hhcmFjdGVycy5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5nZXRTbHVnICA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gJ2NvbnRhaW5fbm90Jztcblx0fTtcblx0dGhpcy52YWxpZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcblxuXHRcdHJldHVybiAhdmFsdWUgfHwgIU11c3RDb250YWluQ2hhcmFjdGVycy5wcm90b3R5cGUudmFsaWRhdGUuY2FsbCggdGhpcyApO1xuXHR9O1xufVxuXG5NdXN0Tm90Q29udGFpbkNoYXJhY3RlcnMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcblx0TXVzdENvbnRhaW5DaGFyYWN0ZXJzLnByb3RvdHlwZSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IE11c3ROb3RDb250YWluQ2hhcmFjdGVyczsiLCJpbXBvcnQgQWR2YW5jZWRSZXN0cmljdGlvbiBmcm9tICcuL0FkdmFuY2VkUmVzdHJpY3Rpb24nO1xuXG5mdW5jdGlvbiBOb3RDb21wbGV0ZUlucHV0bWFzaygpIHtcblx0QWR2YW5jZWRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCAgID0gZnVuY3Rpb24gKCBub2RlICkge1xuXHRcdHJldHVybiAoXG5cdFx0XHRub2RlLmNsYXNzTGlzdC5jb250YWlucyggJ2pldC1mb3JtLWJ1aWxkZXJfX21hc2tlZC1maWVsZCcgKSAmJlxuXHRcdFx0alF1ZXJ5LmZuLmlucHV0bWFza1xuXHRcdCk7XG5cdH07XG5cdHRoaXMudmFsaWRhdGUgICAgICA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcblx0XHRjb25zdCBub2RlICA9IHRoaXMucmVwb3J0aW5nLmdldE5vZGUoKTtcblxuXHRcdHJldHVybiAhdmFsdWUgfHwgbm9kZS5pbnB1dG1hc2suaXNDb21wbGV0ZSgpO1xuXHR9O1xuXHR0aGlzLmdldFJhd01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVzc2FnZUJ5U2x1ZyggJ2lucHV0bWFzaycgKTtcblx0fTtcbn1cblxuTm90Q29tcGxldGVJbnB1dG1hc2sucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUgKTtcblxuZXhwb3J0IGRlZmF1bHQgTm90Q29tcGxldGVJbnB1dG1hc2s7IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuZnVuY3Rpb24gTm90RW1haWwoKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgICA9IGZ1bmN0aW9uICggbm9kZSApIHtcblx0XHRyZXR1cm4gJ2VtYWlsJyA9PT0gbm9kZS50eXBlO1xuXHR9O1xuXHR0aGlzLnZhbGlkYXRlICAgICAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0XHRyZXR1cm4gIXZhbHVlIHx8IC9eW1xcdy1cXC5cXCtdK0AoW1xcdy1dK1xcLikrW1xcdy1dezEsNn0kLy50ZXN0KCB2YWx1ZSApO1xuXHR9O1xuXHR0aGlzLmdldFJhd01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVzc2FnZUJ5U2x1ZyggJ2VtYWlsJyApO1xuXHR9O1xufVxuXG5Ob3RFbWFpbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBZHZhbmNlZFJlc3RyaWN0aW9uLnByb3RvdHlwZSApO1xuXG5leHBvcnQgZGVmYXVsdCBOb3RFbWFpbDsiLCJpbXBvcnQgQWR2YW5jZWRSZXN0cmljdGlvbiBmcm9tICcuL0FkdmFuY2VkUmVzdHJpY3Rpb24nO1xuXG5jb25zdCB7XG5cdCAgICAgIGlzRW1wdHksXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJGdW5jdGlvbnM7XG5cbmZ1bmN0aW9uIE5vdEVtcHR5UmVzdHJpY3Rpb24oKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdyZXF1aXJlZCc7XG59XG5cbk5vdEVtcHR5UmVzdHJpY3Rpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUgKTtcblxuTm90RW1wdHlSZXN0cmljdGlvbi5wcm90b3R5cGUuaXNTdXBwb3J0ZWQgICA9IGZ1bmN0aW9uICggbm9kZSwgcmVwb3J0aW5nICkge1xuXHRyZXR1cm4gcmVwb3J0aW5nLmlucHV0LmlzUmVxdWlyZWQ7XG59O1xuTm90RW1wdHlSZXN0cmljdGlvbi5wcm90b3R5cGUudmFsaWRhdGUgICAgICA9IGZ1bmN0aW9uICgpIHtcblx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0cmV0dXJuICFpc0VtcHR5KCB2YWx1ZSApO1xufTtcbk5vdEVtcHR5UmVzdHJpY3Rpb24ucHJvdG90eXBlLmdldFJhd01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiB0aGlzLmdldE1lc3NhZ2VCeVNsdWcoICdlbXB0eScgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5vdEVtcHR5UmVzdHJpY3Rpb247IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuZnVuY3Rpb24gTm90RW5vdWdoQ2hhcnMoKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMud2F0Y2hlZEF0dHJzLnB1c2goICdtaW5MZW5ndGgnICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICggbm9kZSwgcmVwb3J0aW5nICkge1xuXHRcdGNvbnN0IHsgbWluTGVuZ3RoID0gZmFsc2UgfSA9IHJlcG9ydGluZy5pbnB1dC5hdHRycztcblxuXHRcdHJldHVybiBmYWxzZSAhPT0gbWluTGVuZ3RoO1xuXHR9O1xuXG5cdHRoaXMudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgbGVuZ3RoICAgICAgICA9IHRoaXMuZ2V0VmFsdWUoKT8ubGVuZ3RoO1xuXHRcdGNvbnN0IHsgbWluTGVuZ3RoIH0gPSB0aGlzLnJlcG9ydGluZy5pbnB1dC5hdHRycztcblxuXHRcdHJldHVybiAhbGVuZ3RoIHx8IGxlbmd0aCA+PSArbWluTGVuZ3RoLnZhbHVlLmN1cnJlbnQ7XG5cdH07XG5cblx0dGhpcy5nZXRSYXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmdldE1lc3NhZ2VCeVNsdWcoICdjaGFyX21pbicgKTtcblx0fTtcbn1cblxuTm90RW5vdWdoQ2hhcnMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUgKTtcblxuZXhwb3J0IGRlZmF1bHQgTm90RW5vdWdoQ2hhcnM7IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuZnVuY3Rpb24gTm90RW5vdWdoTnVtYmVycygpIHtcblx0QWR2YW5jZWRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy53YXRjaGVkQXR0cnMucHVzaCggJ21pbicgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkICAgPSBmdW5jdGlvbiAoIG5vZGUsIHJlcG9ydGluZyApIHtcblx0XHRjb25zdCB7IG1pbiA9IGZhbHNlIH0gPSByZXBvcnRpbmcuaW5wdXQuYXR0cnM7XG5cblx0XHRyZXR1cm4gZmFsc2UgIT09IG1pbiAmJiBbICdudW1iZXInLCAncmFuZ2UnIF0uaW5jbHVkZXMoIG5vZGUudHlwZSApO1xuXHR9O1xuXHR0aGlzLnZhbGlkYXRlICAgICAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgdmFsdWUgICA9IHRoaXMuZ2V0VmFsdWUoKTtcblx0XHRjb25zdCB7IG1pbiB9ID0gdGhpcy5yZXBvcnRpbmcuaW5wdXQuYXR0cnM7XG5cblx0XHRyZXR1cm4gIXZhbHVlIHx8ICt2YWx1ZSA+PSArbWluLnZhbHVlLmN1cnJlbnQ7XG5cdH07XG5cdHRoaXMuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXNzYWdlQnlTbHVnKCAnbnVtYmVyX21pbicgKTtcblx0fTtcbn1cblxuTm90RW5vdWdoTnVtYmVycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBZHZhbmNlZFJlc3RyaWN0aW9uLnByb3RvdHlwZSApO1xuXG5leHBvcnQgZGVmYXVsdCBOb3RFbm91Z2hOdW1iZXJzOyIsImltcG9ydCBNYXRjaFJlZ2V4cCBmcm9tICcuL01hdGNoUmVnZXhwJztcblxuZnVuY3Rpb24gTm90TWF0Y2hSZWdleHAoKSB7XG5cdE1hdGNoUmVnZXhwLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmdldFNsdWcgID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAncmVnZXhwX25vdCc7XG5cdH07XG5cdHRoaXMudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0XHRyZXR1cm4gIXZhbHVlIHx8ICFNYXRjaFJlZ2V4cC5wcm90b3R5cGUudmFsaWRhdGUuY2FsbCggdGhpcyApO1xuXHR9O1xufVxuXG5Ob3RNYXRjaFJlZ2V4cC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRjaFJlZ2V4cC5wcm90b3R5cGUgKTtcblxuZXhwb3J0IGRlZmF1bHQgTm90TWF0Y2hSZWdleHA7IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuZnVuY3Rpb24gTm90VXJsKCkge1xuXHRBZHZhbmNlZFJlc3RyaWN0aW9uLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkICAgPSBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cdFx0cmV0dXJuICd1cmwnID09PSBub2RlLnR5cGU7XG5cdH07XG5cdHRoaXMudmFsaWRhdGUgICAgICA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHQhdmFsdWUgfHwgLygobWFpbHRvXFw6fChuZXdzfChodHxmKXRwKHM/KSlcXDpcXC9cXC8pXFxTKykvLnRlc3QoIHZhbHVlIClcblx0XHQpO1xuXHR9O1xuXHR0aGlzLmdldFJhd01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVzc2FnZUJ5U2x1ZyggJ3VybCcgKTtcblx0fTtcbn1cblxuTm90VXJsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IE5vdFVybDsiLCJpbXBvcnQgQWR2YW5jZWRSZXN0cmljdGlvbiBmcm9tICcuL0FkdmFuY2VkUmVzdHJpY3Rpb24nO1xuXG5mdW5jdGlvbiBSZWFjaExpbWl0Q2hhcnMoKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMud2F0Y2hlZEF0dHJzLnB1c2goICdtYXhMZW5ndGgnICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICggbm9kZSwgcmVwb3J0aW5nICkge1xuXHRcdGNvbnN0IHsgbWF4TGVuZ3RoID0gZmFsc2UgfSA9IHJlcG9ydGluZy5pbnB1dC5hdHRycztcblxuXHRcdHJldHVybiBmYWxzZSAhPT0gbWF4TGVuZ3RoO1xuXHR9O1xuXG5cdHRoaXMudmFsaWRhdGUgICAgICA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCB2YWx1ZSAgICAgICAgID0gdGhpcy5nZXRWYWx1ZSgpPy5sZW5ndGg7XG5cdFx0Y29uc3QgeyBtYXhMZW5ndGggfSA9IHRoaXMucmVwb3J0aW5nLmlucHV0LmF0dHJzO1xuXG5cdFx0cmV0dXJuICF2YWx1ZSB8fCB2YWx1ZSA8PSArbWF4TGVuZ3RoLnZhbHVlLmN1cnJlbnQ7XG5cdH07XG5cdHRoaXMuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXNzYWdlQnlTbHVnKCAnY2hhcl9tYXgnICk7XG5cdH07XG59XG5cblJlYWNoTGltaXRDaGFycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBBZHZhbmNlZFJlc3RyaWN0aW9uLnByb3RvdHlwZSApO1xuXG5leHBvcnQgZGVmYXVsdCBSZWFjaExpbWl0Q2hhcnM7IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuZnVuY3Rpb24gUmVhY2hMaW1pdE51bWJlcnMoKSB7XG5cdEFkdmFuY2VkUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMud2F0Y2hlZEF0dHJzLnB1c2goICdtYXgnICk7XG5cblx0dGhpcy5pc1N1cHBvcnRlZCAgID0gZnVuY3Rpb24gKCBub2RlLCByZXBvcnRpbmcgKSB7XG5cdFx0Y29uc3QgeyBtYXggPSBmYWxzZSB9ID0gcmVwb3J0aW5nLmlucHV0LmF0dHJzO1xuXG5cdFx0cmV0dXJuIGZhbHNlICE9PSBtYXggJiYgWyAnbnVtYmVyJywgJ3JhbmdlJyBdLmluY2x1ZGVzKCBub2RlLnR5cGUgKTtcblx0fTtcblx0dGhpcy52YWxpZGF0ZSAgICAgID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IHZhbHVlICAgPSB0aGlzLmdldFZhbHVlKCk7XG5cdFx0Y29uc3QgeyBtYXggfSA9IHRoaXMucmVwb3J0aW5nLmlucHV0LmF0dHJzO1xuXG5cdFx0cmV0dXJuICF2YWx1ZSB8fCArdmFsdWUgPD0gK21heC52YWx1ZS5jdXJyZW50O1xuXHR9O1xuXHR0aGlzLmdldFJhd01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVzc2FnZUJ5U2x1ZyggJ251bWJlcl9tYXgnICk7XG5cdH07XG59XG5cblJlYWNoTGltaXROdW1iZXJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWNoTGltaXROdW1iZXJzOyIsImltcG9ydCBDdXN0b21CYXNlUmVzdHJpY3Rpb24gZnJvbSAnLi9DdXN0b21CYXNlUmVzdHJpY3Rpb24nO1xuaW1wb3J0IGFwaUZldGNoIGZyb20gJ0B3b3JkcHJlc3MvYXBpLWZldGNoJztcblxuZnVuY3Rpb24gU2VydmVyU2lkZUNhbGxiYWNrKCkge1xuXHRDdXN0b21CYXNlUmVzdHJpY3Rpb24uY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZ2V0U2x1ZyAgICAgICAgID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAnc3NyJztcblx0fTtcblx0dGhpcy5pc1NlcnZlclNpZGUgICAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdHRoaXMudmFsaWRhdGVQcm9taXNlID0gYXN5bmMgZnVuY3Rpb24gKCBzaWduYWwgPSBudWxsICkge1xuXHRcdGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0XHRpZiAoICFjdXJyZW50ICkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJvZHkgPSB0aGlzLmdldEZvcm1EYXRhKCk7XG5cdFx0Y29uc3QgeyByb290Tm9kZSB9ID0gdGhpcy5yZXBvcnRpbmcuaW5wdXQuZ2V0Um9vdCgpO1xuXHRcdGNvbnN0IHNzclZhbGlkYXRpb25NZXRob2QgPSByb290Tm9kZS5nZXRBdHRyaWJ1dGUoJ3Nzcl92YWxpZGF0aW9uX21ldGhvZCcpIHx8ICdyZXN0JztcblxuXHRcdHN3aXRjaCAoc3NyVmFsaWRhdGlvbk1ldGhvZCkge1xuXHRcdFx0Y2FzZSAnYWRtaW5fYWpheCc6XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlVmlhQWRtaW5BamF4KGJvZHksIHNpZ25hbCk7XG5cblx0XHRcdGNhc2UgJ3NlbGYnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZGF0ZVZpYVNlbGZSZXF1ZXN0KGJvZHksIHNpZ25hbCk7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlVmlhUmVzdChib2R5LCBzaWduYWwpO1xuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMudmFsaWRhdGVWaWFSZXN0ID0gYXN5bmMgZnVuY3Rpb24gKGJvZHksIHNpZ25hbCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUZldGNoKHtcblx0XHRcdFx0cGF0aDogJy9qZXQtZm9ybS1idWlsZGVyL3YxL3ZhbGlkYXRlLWZpZWxkJyxcblx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRcdGJvZHksXG5cdFx0XHRcdHNpZ25hbFxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiByZXNwb25zZT8ucmVzdWx0ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH07XG5cblx0dGhpcy52YWxpZGF0ZVZpYUFkbWluQWpheCA9IGFzeW5jIGZ1bmN0aW9uIChib2R5LCBzaWduYWwpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh3aW5kb3cuSmV0Rm9ybUJ1aWxkZXJTZXR0aW5ncy5hZG1pbmFqYXh1cmwsIHtcblx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRcdGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIH0sXG5cdFx0XHRcdGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuXHRcdFx0XHRcdGFjdGlvbjogJ2pldF9mYl9zc3JfdmFsaWRhdGlvbl9hamF4Jyxcblx0XHRcdFx0XHRkYXRhOiBKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoYm9keSkpLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0c2lnbmFsLFxuXHRcdFx0fSkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG5cblx0XHRcdHJldHVybiByZXNwb25zZT8ucmVzdWx0ID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH07XG5cblx0dGhpcy52YWxpZGF0ZVZpYVNlbGZSZXF1ZXN0ID0gYXN5bmMgZnVuY3Rpb24gKGJvZHksIHNpZ25hbCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblx0XHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KCdqZXRfZmJfc3NyX3NlbGZfdmFsaWRhdGlvbicsICcxJyk7XG5cblx0XHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGJvZHkuZW50cmllcygpKSB7XG5cdFx0XHRcdHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpLCB7XG5cdFx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRcdHNpZ25hbCxcblx0XHRcdH0pLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpO1xuXG5cdFx0XHRyZXR1cm4gcmVzcG9uc2U/LnJlc3VsdCA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZWplY3QoKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9O1xuXG5cdHRoaXMuZ2V0Rm9ybURhdGEgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgeyBpbnB1dCB9ICAgID0gdGhpcy5yZXBvcnRpbmc7XG5cdFx0Y29uc3QgeyByb290Tm9kZSB9ID0gaW5wdXQuZ2V0Um9vdCgpO1xuXG5cdFx0Y29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoIHJvb3ROb2RlICk7XG5cdFx0Zm9ybURhdGEuZGVsZXRlKCAnX3dwbm9uY2UnICk7XG5cdFx0Zm9ybURhdGEuc2V0KCAnX2pmYl92YWxpZGF0aW9uX3J1bGVfaW5kZXgnLCB0aGlzLmF0dHJzLmluZGV4ICk7XG5cdFx0Zm9yICggY29uc3QgcGF0aEVsZW1lbnQgb2YgaW5wdXQucGF0aCApIHtcblx0XHRcdGZvcm1EYXRhLmFwcGVuZCggJ19qZmJfdmFsaWRhdGlvbl9wYXRoW10nLCBwYXRoRWxlbWVudCApO1xuXHRcdH1cblxuXHRcdC8vIFNlY3VyaXR5OiBJbmNsdWRlIHNpZ25hdHVyZSBmb3IgU1NSIHZhbGlkYXRpb25cblx0XHRpZiAoIHRoaXMuYXR0cnMuX3NpZyApIHtcblx0XHRcdGZvcm1EYXRhLnNldCggJ19qZmJfdmFsaWRhdGlvbl9zaWcnLCB0aGlzLmF0dHJzLl9zaWcgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9ybURhdGE7XG5cdH07XG5cbn1cblxuU2VydmVyU2lkZUNhbGxiYWNrLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXG5cdEN1c3RvbUJhc2VSZXN0cmljdGlvbi5wcm90b3R5cGUsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBTZXJ2ZXJTaWRlQ2FsbGJhY2s7IiwiaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9BZHZhbmNlZFJlc3RyaWN0aW9uJztcblxuY29uc3QgeyBnZXRUaW1lc3RhbXAgfSA9IEpldEZvcm1CdWlsZGVyRnVuY3Rpb25zO1xuXG5mdW5jdGlvbiBUb29FYXJseVRpbWVzdGFtcCgpIHtcblx0QWR2YW5jZWRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy53YXRjaGVkQXR0cnMucHVzaCggJ21pbicgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBub2RlLCByZXBvcnRpbmcgKSB7XG5cdFx0Y29uc3QgeyBtaW4gPSBmYWxzZSB9ID0gcmVwb3J0aW5nLmlucHV0LmF0dHJzO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZhbHNlICE9PSBtaW4gJiZcblx0XHRcdFsgJ3RpbWUnLCAnZGF0ZScsICdkYXRldGltZS1sb2NhbCcgXS5pbmNsdWRlcyggbm9kZS50eXBlIClcblx0XHQpO1xuXHR9O1xuXG5cdHRoaXMudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgbWluIH0gICAgICAgICAgID0gdGhpcy5yZXBvcnRpbmcuaW5wdXQuYXR0cnM7XG5cdFx0Y29uc3QgeyB0aW1lIH0gICAgICAgICAgPSBnZXRUaW1lc3RhbXAoIHZhbHVlICk7XG5cdFx0Y29uc3QgeyB0aW1lOiBtaW5UaW1lIH0gPSBnZXRUaW1lc3RhbXAoIG1pbi52YWx1ZS5jdXJyZW50ICk7XG5cblx0XHRyZXR1cm4gdGltZSA+PSBtaW5UaW1lO1xuXHR9O1xuXG5cdHRoaXMuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXNzYWdlQnlTbHVnKCAnZGF0ZV9taW4nICk7XG5cdH07XG59XG5cblRvb0Vhcmx5VGltZXN0YW1wLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEFkdmFuY2VkUmVzdHJpY3Rpb24ucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IFRvb0Vhcmx5VGltZXN0YW1wOyIsImltcG9ydCBBZHZhbmNlZFJlc3RyaWN0aW9uIGZyb20gJy4vQWR2YW5jZWRSZXN0cmljdGlvbic7XG5cbmNvbnN0IHsgZ2V0VGltZXN0YW1wIH0gPSBKZXRGb3JtQnVpbGRlckZ1bmN0aW9ucztcblxuZnVuY3Rpb24gVG9vTGF0ZVRpbWVzdGFtcCgpIHtcblx0QWR2YW5jZWRSZXN0cmljdGlvbi5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy53YXRjaGVkQXR0cnMucHVzaCggJ21heCcgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBub2RlLCByZXBvcnRpbmcgKSB7XG5cdFx0Y29uc3QgeyBtYXggPSBmYWxzZSB9ID0gcmVwb3J0aW5nLmlucHV0LmF0dHJzO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGZhbHNlICE9PSBtYXggJiZcblx0XHRcdFsgJ3RpbWUnLCAnZGF0ZScsICdkYXRldGltZS1sb2NhbCcgXS5pbmNsdWRlcyggbm9kZS50eXBlIClcblx0XHQpO1xuXHR9O1xuXG5cdHRoaXMudmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG5cblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgbWF4IH0gICAgICAgICAgID0gdGhpcy5yZXBvcnRpbmcuaW5wdXQuYXR0cnM7XG5cdFx0Y29uc3QgeyB0aW1lIH0gICAgICAgICAgPSBnZXRUaW1lc3RhbXAoIHZhbHVlICk7XG5cdFx0Y29uc3QgeyB0aW1lOiBtYXhUaW1lIH0gPSBnZXRUaW1lc3RhbXAoIG1heC52YWx1ZS5jdXJyZW50ICk7XG5cblx0XHRyZXR1cm4gdGltZSA8PSBtYXhUaW1lO1xuXHR9O1xuXG5cdHRoaXMuZ2V0UmF3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXNzYWdlQnlTbHVnKCAnZGF0ZV9tYXgnICk7XG5cdH07XG59XG5cblRvb0xhdGVUaW1lc3RhbXAucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQWR2YW5jZWRSZXN0cmljdGlvbi5wcm90b3R5cGUgKTtcblxuZXhwb3J0IGRlZmF1bHQgVG9vTGF0ZVRpbWVzdGFtcDsiLCJtb2R1bGUuZXhwb3J0cyA9IHdpbmRvd1tcIndwXCJdW1wiYXBpRmV0Y2hcIl07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IEFkdmFuY2VkUmVwb3J0aW5nIGZyb20gJy4vQWR2YW5jZWRSZXBvcnRpbmcnO1xuaW1wb3J0IEFkdmFuY2VkUmVzdHJpY3Rpb24gZnJvbSAnLi9yZXN0cmljdGlvbnMvQWR2YW5jZWRSZXN0cmljdGlvbic7XG5pbXBvcnQgTm90RW1wdHlSZXN0cmljdGlvbiBmcm9tICcuL3Jlc3RyaWN0aW9ucy9Ob3RFbXB0eVJlc3RyaWN0aW9uJztcblxuY29uc3Qge1xuXHQgICAgICBhZGRGaWx0ZXIsXG5cdCAgICAgIGFkZEFjdGlvbixcbiAgICAgIH0gPSBKZXRQbHVnaW5zLmhvb2tzO1xuXG5hZGRBY3Rpb24oXG5cdCdqZXQuZmIub2JzZXJ2ZS5hZnRlcicsXG5cdCdqZXQtZm9ybS1idWlsZGVyL29ic2VydmUtZHluYW1pYy1hdHRycycsXG5cdC8qKlxuXHQgKiBAcGFyYW0gb2JzZXJ2YWJsZSB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRvYnNlcnZhYmxlLmdldElucHV0cygpLmZvckVhY2goIGlucHV0ID0+IHtcblx0XHRcdGlmICggIShcblx0XHRcdFx0aW5wdXQucmVwb3J0aW5nIGluc3RhbmNlb2YgQWR2YW5jZWRSZXBvcnRpbmdcblx0XHRcdCkgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlucHV0LnJlcG9ydGluZy5vYnNlcnZlQXR0cnMoKTtcblx0XHR9ICk7XG5cdH0sXG5cdDExLFxuKTtcblxuYWRkRmlsdGVyKFxuXHQnamV0LmZiLnJlcG9ydGluZycsXG5cdCdqZXQtZm9ybS1idWlsZGVyL2FkdmFuY2VkLXJlcG9ydGluZycsXG5cdGZ1bmN0aW9uICggcmVwb3J0aW5nICkge1xuXHRcdHJlcG9ydGluZyA9IFsgQWR2YW5jZWRSZXBvcnRpbmcsIC4uLnJlcG9ydGluZyBdO1xuXG5cdFx0cmV0dXJuIHJlcG9ydGluZztcblx0fSxcbik7XG5cbndpbmRvdy5KZXRGb3JtQnVpbGRlckFic3RyYWN0ID0ge1xuXHQuLi4oXG5cdFx0d2luZG93LkpldEZvcm1CdWlsZGVyQWJzdHJhY3QgPz8ge31cblx0KSxcblx0QWR2YW5jZWRSZXN0cmljdGlvbixcblx0Tm90RW1wdHlSZXN0cmljdGlvbixcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9